移植Linux 5.5.3 到 TI AM4372平台
前言
瘟疫期间,闲着无聊移植了从www.kernel.org上下载的linux 5.5.3到st的stm32f429-discovery和大升电气的am4372平台上。
大部分时间是在修改dts和menuconfig的配置,可见主线内核代码对大部分的开发平台已经做到了完美的支持,不久的未来应该可以绕过原厂,直接拿主线代码来商用了。
硬件平台介绍
大升的板子是以前为他们做bsp维护时遗留下来的,核心板链接见https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-17385140682.20.2fa11151Revp1b&id=566304029954,底板目前应该是不再生产了。底板具体资源有800×480的dpi接口的lcd,触摸屏,sd卡,ov2659/ov5640接口,usb host,usb device(用来做dfu升级很方便),调试串口uart0,千兆网口,485,can各一个,rtc锂电池电源。
由于没有核心板的原理图,核心板上本有一个led灯用heart功能的,暂时没有用起来。核心板的资源是800Mhz的am4372,512M的ddr内存两颗,4GB的emmc。ar8035 phy芯片。
TODO:
移植最新的u-boot,使用Buildroot工具制作ubifs的filesystem替换原有argo的文件系统,通过video来的数据做一些人脸识别,跟踪等。跑一些常用的gstreamer方面的远程监控的脚本。
修改细节
编译工具 www.linaro.org上下载https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
编译内核
制作its文件用于打包zImage和dtb到am4372.itb
/** Simple U-Boot uImage source file containing a single kernel and FDT blob*//dts-v1/;/ {
description = "Simple image with single Linux kernel and FDT blob";
#address-cells = <1>;images {
kernel {
description = "Vanilla Linux kernel";
data = /incbin/("./kernel-am4372/arch/arm/boot/zImage");
type = "kernel";
arch = "arm";
os = "linux";
compression = "none";
load = <0x80008000>;
entry = <0x80008000>;
hash-1 {
algo = "crc32";
};
hash-2 {
algo = "sha1";
};
};
fdt-1 {
description = "Flattened Device Tree blob";
data = /incbin/("./kernel-am4372/arch/arm/boot/dts/am437x-gp-evm.dtb");
type = "flat_dt";
arch = "arm";
compression = "none";
hash-1 {
algo = "crc32";
};
hash-2 {
algo = "sha1";
};
};
};configurations {
default = "conf-1";
conf-1 {
description = "Boot Linux kernel with FDT blob";
kernel = "kernel";
fdt = "fdt-1";
};
};
};
安装dfu工具用于通过usb device下载am4372.itb到0x82000000调试内核
dts修改点
diff --git a/arch/arm/boot/dts/am437x-gp-evm.dts b/arch/arm/boot/dts/am437x-gp-evm.dts
index 811c8ca..15d34c7 100644
--- a/arch/arm/boot/dts/am437x-gp-evm.dts
+++ b/arch/arm/boot/dts/am437x-gp-evm.dts
@@ -16,9 +16,9 @@model = "TI AM437x GP EVM";compatible = "ti,am437x-gp-evm","ti,am4372","ti,am43";- aliases {
+ /*aliases {display0 = &lcd0;
- };
+ };*/chosen {stdout-path = &uart0;
@@ -52,14 +52,16 @@enable-active-high;};- lcd_bl: backlight {
+ backlight {compatible = "pwm-backlight";pwms = <&ecap0 0 50000 PWM_POLARITY_INVERTED>;brightness-levels = <0 51 53 56 62 75 101 152 255>;
- default-brightness-level = <8>;
+ default-brightness-level = <7>;};
+ matrix_keypad: matrix_keypad0 {
+ status = "disabled";compatible = "gpio-matrix-keypad";debounce-delay-ms = <5>;col-scan-delay-us = <2>;
@@ -85,35 +87,14 @@0x0201006c>; /* DOWN */};- lcd0: display {
- compatible = "osddisplays,osd070t1718-19ts", "panel-dpi";
- label = "lcd";
-
- backlight = <&lcd_bl>;
-
- panel-timing {
- clock-frequency = <33000000>;
- hactive = <800>;
- vactive = <480>;
- hfront-porch = <210>;
- hback-porch = <16>;
- hsync-len = <30>;
- vback-porch = <10>;
- vfront-porch = <22>;
- vsync-len = <13>;
- hsync-active = <0>;
- vsync-active = <0>;
- de-active = <1>;
- pixelclk-active = <1>;
- };
-
+ panel {
+ compatible = "osddisplays,osd057T0559-34ts";port {
- lcd_in: endpoint {
+ panel_in: endpoint {remote-endpoint = <&dpi_out>;};};};
-/* fixed 12MHz oscillator */refclk: oscillator {#clock-cells = <0>;
@@ -162,13 +143,24 @@pinctrl-1 = <&beeper_pins_sleep>;gpios = <&gpio4 12 GPIO_ACTIVE_HIGH>;};
+
+ audio_mstrclk: mclk_osc {
+ compatible = "fixed-clock";
+ #clock-cells = <0>;
+ clock-frequency = <12000000>;
+ };};&am43xx_pinmux {pinctrl-names = "default", "sleep";
- pinctrl-0 = <&wlan_pins_default &ddr3_vtt_toggle_default &unused_pins &debugss_pins>;
+ pinctrl-0 = <&wlan_pins_default &ddr3_vtt_toggle_default &unused_pins &debugss_pins &clkout2_pin>;pinctrl-1 = <&wlan_pins_sleep>;
-
+
+ clkout2_pin: clkout2_pin {
+ pinctrl-single,pins = <
+ 0x274 (PIN_OUTPUT_PULLUP | MUX_MODE3)
+ >;
+ };ddr3_vtt_toggle_default: ddr_vtt_toggle_default {pinctrl-single,pins = <0x25C (DS0_PULL_UP_DOWN_EN | PIN_OUTPUT_PULLUP | DS0_FORCE_OFF_MODE | MUX_MODE7) /* spi0_cs0.gpio5_7 */
@@ -178,7 +170,7 @@i2c0_pins: i2c0_pins {pinctrl-single,pins = <AM4372_IOPAD(0x988, PIN_INPUT_PULLUP | SLEWCTRL_FAST | MUX_MODE0) /* i2c0_sda.i2c0_sda */
- AM4372_IOPAD(0x98c, PIN_INPUT_PULLUP | SLEWCTRL_FAST | MUX_MODE0) /* i2c0_scl.i2c0_scl */
+ AM4372_IOPAD(0x98c, PIN_INPUT_PULLUP | SLEWCTRL_FAST | MUX_MODE0) /*i2c0_scl.i2c0_scl */>;};@@ -281,14 +273,6 @@dss_pins: dss_pins {pinctrl-single,pins = <
- AM4372_IOPAD(0x820, PIN_OUTPUT_PULLUP | MUX_MODE1) /*gpmc ad 8 -> DSS DATA 23 */
- AM4372_IOPAD(0x824, PIN_OUTPUT_PULLUP | MUX_MODE1)
- AM4372_IOPAD(0x828, PIN_OUTPUT_PULLUP | MUX_MODE1)
- AM4372_IOPAD(0x82c, PIN_OUTPUT_PULLUP | MUX_MODE1)
- AM4372_IOPAD(0x830, PIN_OUTPUT_PULLUP | MUX_MODE1)
- AM4372_IOPAD(0x834, PIN_OUTPUT_PULLUP | MUX_MODE1)
- AM4372_IOPAD(0x838, PIN_OUTPUT_PULLUP | MUX_MODE1)
- AM4372_IOPAD(0x83c, PIN_OUTPUT_PULLUP | MUX_MODE1) /*gpmc ad 15 -> DSS DATA 16 */AM4372_IOPAD(0x8a0, PIN_OUTPUT_PULLUP | MUX_MODE0) /* DSS DATA 0 */AM4372_IOPAD(0x8a4, PIN_OUTPUT_PULLUP | MUX_MODE0)AM4372_IOPAD(0x8a8, PIN_OUTPUT_PULLUP | MUX_MODE0)
@@ -493,14 +477,14 @@emmc_pins_default: emmc_pins_default {pinctrl-single,pins = <
- AM4372_IOPAD(0x800, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad0.mmc1_dat0 */
- AM4372_IOPAD(0x804, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad1.mmc1_dat1 */
- AM4372_IOPAD(0x808, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad2.mmc1_dat2 */
- AM4372_IOPAD(0x80c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad3.mmc1_dat3 */
- AM4372_IOPAD(0x810, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad4.mmc1_dat4 */
- AM4372_IOPAD(0x814, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad5.mmc1_dat5 */
- AM4372_IOPAD(0x818, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad6.mmc1_dat6 */
- AM4372_IOPAD(0x81c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad7.mmc1_dat7 */
+ AM4372_IOPAD(0x820, PIN_INPUT_PULLUP | MUX_MODE2) /* gpmc_ad0.mmc1_dat0 */
+ AM4372_IOPAD(0x824, PIN_INPUT_PULLUP | MUX_MODE2) /* gpmc_ad1.mmc1_dat1 */
+ AM4372_IOPAD(0x828, PIN_INPUT_PULLUP | MUX_MODE2) /* gpmc_ad2.mmc1_dat2 */
+ AM4372_IOPAD(0x82c, PIN_INPUT_PULLUP | MUX_MODE2) /* gpmc_ad3.mmc1_dat3 */
+ AM4372_IOPAD(0x830, PIN_INPUT_PULLUP | MUX_MODE2) /* gpmc_ad4.mmc1_dat4 */
+ AM4372_IOPAD(0x834, PIN_INPUT_PULLUP | MUX_MODE2) /* gpmc_ad5.mmc1_dat5 */
+ AM4372_IOPAD(0x838, PIN_INPUT_PULLUP | MUX_MODE2) /* gpmc_ad6.mmc1_dat6 */
+ AM4372_IOPAD(0x83c, PIN_INPUT_PULLUP | MUX_MODE2) /* gpmc_ad7.mmc1_dat7 */AM4372_IOPAD(0x880, PIN_INPUT_PULLUP | MUX_MODE2) /* gpmc_csn1.mmc1_clk */AM4372_IOPAD(0x884, PIN_INPUT_PULLUP | MUX_MODE2) /* gpmc_csn2.mmc1_cmd */>;
@@ -508,14 +492,14 @@emmc_pins_sleep: emmc_pins_sleep {pinctrl-single,pins = <
- AM4372_IOPAD(0x800, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad0.gpio1_0 */
- AM4372_IOPAD(0x804, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad1.gpio1_1 */
- AM4372_IOPAD(0x808, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad2.gpio1_2 */
- AM4372_IOPAD(0x80c, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad3.gpio1_3 */
- AM4372_IOPAD(0x810, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad4.gpio1_4 */
- AM4372_IOPAD(0x814, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad5.gpio1_5 */
- AM4372_IOPAD(0x818, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad6.gpio1_6 */
- AM4372_IOPAD(0x81c, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad7.gpio1_7 */
+ AM4372_IOPAD(0x820, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad0.gpio1_0 */
+ AM4372_IOPAD(0x824, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad1.gpio1_1 */
+ AM4372_IOPAD(0x828, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad2.gpio1_2 */
+ AM4372_IOPAD(0x82c, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad3.gpio1_3 */
+ AM4372_IOPAD(0x830, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad4.gpio1_4 */
+ AM4372_IOPAD(0x834, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad5.gpio1_5 */
+ AM4372_IOPAD(0x838, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad6.gpio1_6 */
+ AM4372_IOPAD(0x83c, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad7.gpio1_7 */AM4372_IOPAD(0x880, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_csn1.gpio1_30 */AM4372_IOPAD(0x884, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_csn2.gpio1_31 */>;
@@ -712,13 +696,13 @@ov2659@30 {compatible = "ovti,ov2659";reg = <0x30>;
-
- clocks = <&refclk 0>;
+ status = "okay";
+ clocks = <&clkout2_ck>;clock-names = "xvclk";ov2659/ov5640使用am4372出来的clkout2作为主时钟port {
- ov2659_0: endpoint {
- remote-endpoint = <&vpfe1_ep>;
+ ov2659_1: endpoint {
+ remote-endpoint = <&vpfe0_ep>;link-frequencies = /bits/ 64 <70000000>;};};
@@ -726,7 +710,7 @@};&i2c1 {
- status = "okay";
+ status = "disabled";pinctrl-names = "default";pinctrl-0 = <&i2c1_pins>;pixcir_ts@5c {
@@ -754,12 +738,12 @@compatible = "ovti,ov2659";reg = <0x30>;- clocks = <&refclk 0>;
+ clocks = <&audio_mstrclk>;clock-names = "xvclk";port {
- ov2659_1: endpoint {
- remote-endpoint = <&vpfe0_ep>;
+ ov2659_0: endpoint {
+ remote-endpoint = <&vpfe1_ep>;link-frequencies = /bits/ 64 <70000000>;};};
@@ -800,8 +784,7 @@&gpio0 {pinctrl-names = "default";pinctrl-0 = <&gpio0_pins>;
- status = "okay";
-
+ status = "disabled";p23 {gpio-hog;gpios = <23 GPIO_ACTIVE_HIGH>;
@@ -821,10 +804,6 @@status = "okay";};-&gpio3 {
- status = "okay";
-};
-&gpio4 {status = "okay";};
@@ -863,7 +842,7 @@* When enabling eMMC, disable GPMC/NAND and set* SelEMMCorNAND to output-high*/
- status = "disabled";
+ status = "okay";vmmc-supply = <&evm_v3_3d>;bus-width = <8>;pinctrl-names = "default", "sleep";
@@ -873,7 +852,7 @@};&mmc3 {
- status = "okay";
+ status = "disabled";/* these are on the crossbar and are outlined in thexbar-event-map element */dmas = <&edma_xbar 30 0 1>,
@@ -937,7 +916,7 @@status = "okay";ethphy0: ethernet-phy@0 {
- reg = <0>;
+ reg = <4>;};};@@ -955,7 +934,7 @@* When enabling GPMC, disable eMMC and set* SelEMMCorNAND to output-low*/
- status = "okay";
+ status = "disabled";pinctrl-names = "default";pinctrl-0 = <&nand_flash_x8>;ranges = <0 0 0x08000000 0x01000000>; /* CS0 space. Min partition = 16MB */
@@ -1047,8 +1026,8 @@port {dpi_out: endpoint {
- remote-endpoint = <&lcd_in>;
- data-lines = <24>;
+ remote-endpoint = <&panel_in>;
+ data-lines = <16>;};};};@@ -915,14 +921,14 @@pinctrl-1 = <&davinci_mdio_sleep>;status = "okay";- ethphy0: ethernet-phy@0 {
+ ethphy0: ethernet-phy@4 {reg = <4>;};};&cpsw_emac0 {phy-handle = <?phy0>;
- phy-mode = "rgmii";
+ phy-mode = "rgmii-id";};
添加clkout2的dts配置和ov的驱动中对clk的使用
diff --git a/arch/arm/boot/dts/am43xx-clocks.dtsi b/arch/arm/boot/dts/am43xx-clocks.dtsi
index 091356f..31760ef 100644
--- a/arch/arm/boot/dts/am43xx-clocks.dtsi
+++ b/arch/arm/boot/dts/am43xx-clocks.dtsi
@@ -704,6 +704,42 @@ti,bit-shift = <8>;reg = <0x2a48>;};
+
+ clkout2_src_mux_ck: clkout2_src_mux_ck {
+ #clock-cells = <0>;
+ compatible = "ti,mux-clock";
+ clocks = <&clk_rc32k_ck>, <&sysclk_div>, <&dpll_ddr_m2_ck>,
+ <&dpll_per_m2_ck>, <&dpll_disp_m2_ck>,
+ <&dpll_mpu_m2_ck>, <&dpll_extdev_ck>;
+ reg = <0x4108>;
+ };
+
+ clkout2_pre_div_ck: clkout2_pre_div_ck {
+ #clock-cells = <0>;
+ compatible = "ti,divider-clock";
+ clocks = <&clkout2_src_mux_ck>;
+ ti,bit-shift = <4>;
+ ti,max-div = <8>;
+ reg = <0x4108>;
+ };
+
+ clkout2_post_div_ck: clkout2_post_div_ck {
+ #clock-cells = <0>;
+ compatible = "ti,divider-clock";
+ clocks = <&clkout2_pre_div_ck>;
+ ti,bit-shift = <8>;
+ ti,max-div = <32>;
+ ti,index-power-of-two;
+ reg = <0x4108>;
+ };
+
+ clkout2_ck: clkout2_ck {
+ #clock-cells = <0>;
+ compatible = "ti,gate-clock";
+ clocks = <&clkout2_post_div_ck>;
+ ti,bit-shift = <16>;
+ reg = <0x4108>;
+ };};&prcm {diff --git a/drivers/media/i2c/ov2659.c b/drivers/media/i2c/ov2659.c
index 42f6417..e1bcf20 100644
--- a/drivers/media/i2c/ov2659.c
+++ b/drivers/media/i2c/ov2659.c
@@ -1420,6 +1420,46 @@ static int ov2659_detect(struct v4l2_subdev *sd)return pdata;}+void set_clk_24m(struct i2c_client *client, struct clk *clk)
+{
+ struct clk *clkout2_src_mux_ck;
+ struct clk *clkout2_pre_div_ck;
+ struct clk *dpll_per_m2_ck;
+ struct clk *clkout2_post_div_ck;
+
+ clkout2_src_mux_ck = devm_clk_get(&client->dev, "clkout2_src_mux_ck");
+ if (IS_ERR(clkout2_src_mux_ck)) {
+ dev_err(&client->dev, "Could not get clkout2_src_mux_ck clock\n");
+ return;
+ }
+
+ dpll_per_m2_ck = devm_clk_get(&client->dev, "dpll_per_m2_ck");
+ if (IS_ERR(dpll_per_m2_ck)) {
+ dev_err(&client->dev, "Could not get dpll_per_m2_ck clock\n");
+ devm_clk_put(&client->dev, clkout2_src_mux_ck);
+ return;
+ }
+ clk_set_parent(clkout2_src_mux_ck, dpll_per_m2_ck);
+ devm_clk_put(&client->dev, dpll_per_m2_ck);
+ devm_clk_put(&client->dev, clkout2_src_mux_ck);
+
+ clkout2_pre_div_ck = clk_get(&client->dev, "clkout2_pre_div_ck");
+ if (IS_ERR(clkout2_pre_div_ck)) {
+ dev_err(&client->dev, "Could not get clkout2_pre_div_ck\n");
+ return;
+ }
+
+ clkout2_post_div_ck = clk_get(&client->dev, "clkout2_post_div_ck");
+ if (IS_ERR(clkout2_post_div_ck)) {
+ dev_err(&client->dev, "Could not get clkout2_post_div_ck\n");
+ clk_put(clkout2_pre_div_ck);
+ return;
+ }
+
+ clk_set_rate(clkout2_pre_div_ck, 96000000);
+ clk_set_rate(clkout2_post_div_ck, 24000000);
+ clk_prepare_enable(clk);
+}static int ov2659_probe(struct i2c_client *client){const struct ov2659_platform_data *pdata = ov2659_get_pdata(client);
@@ -1444,6 +1484,7 @@ static int ov2659_probe(struct i2c_client *client)if (IS_ERR(clk))return PTR_ERR(clk);+ set_clk_24m(client, clk);ov2659->xvclk_frequency = clk_get_rate(clk);if (ov2659->xvclk_frequency < 6000000 ||ov2659->xvclk_frequency > 27000000)
添加lcd
diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c
index 5d48768..2b24aa1 100644
--- a/drivers/gpu/drm/panel/panel-simple.c
+++ b/drivers/gpu/drm/panel/panel-simple.c
@@ -2728,6 +2728,32 @@ static void panel_simple_shutdown(struct device *dev)| DRM_BUS_FLAG_SHARP_SIGNALS,};+static const struct display_timing osddisplays_osd057T0559_34ts_timing = {
+ .pixelclock = { 36000000, 36000000, 36000000 },
+ .hactive = { 800, 800, 800 },
+ .hfront_porch = { 20, 20, 20 },
+ .hback_porch = { 40, 40, 40 },
+ .hsync_len = { 2, 2, 2 },
+ .vactive = { 480, 480, 480 },
+ .vfront_porch = { 11, 11, 11 },
+ .vback_porch = { 32, 32, 32 },
+ .vsync_len = { 17, 17, 17 },
+ .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW,
+};
+
+static const struct panel_desc osddisplays_osd057T0559_34ts = {
+ .timings = &osddisplays_osd057T0559_34ts_timing,
+ .num_timings = 1,
+ .bpc = 6,
+ .size = {
+ .width = 42,
+ .height = 28,
+ },
+ .bus_format = MEDIA_BUS_FMT_RGB565_1X16,
+ .bus_flags = DRM_BUS_FLAG_DE_HIGH
+ | DRM_BUS_FLAG_PIXDATA_POSEDGE,
+};
+static const struct drm_display_mode shelly_sca07010_bfn_lnn_mode = {.clock = 33300,.hdisplay = 800,
@@ -3369,6 +3395,9 @@ static void panel_simple_shutdown(struct device *dev).compatible = "sharp,ls020b1dd01d",.data = &sharp_ls020b1dd01d,}, {
+ .compatible = "osddisplays,osd057T0559-34ts",
+ .data = &osddisplays_osd057T0559_34ts,
+ }, {.compatible = "shelly,sca07010-bfn-lnn",.data = &shelly_sca07010_bfn_lnn,}, {
添加触摸屏
diff --git a/arch/arm/boot/dts/am437x-gp-evm.dts b/arch/arm/boot/dts/am437x-gp-evm.dts
index 15d34c7..540de09 100644
--- a/arch/arm/boot/dts/am437x-gp-evm.dts
+++ b/arch/arm/boot/dts/am437x-gp-evm.dts
@@ -769,9 +769,15 @@&tscadc {status = "okay";
+ tsc {
+ ti,wires = <4>;
+ ti,x-plate-resistance = <200>;
+ ti,coordiante-readouts = <5>;
+ ti,wire-config = <0x00 0x11 0x22 0x33>;
+ };adc {
- ti,adc-channels = <0 1 2 3 4 5 6 7>;
+ ti,adc-channels = <4 5 6 7>;};};
添加can的支持
正常来讲can是不需要作额外改动来支持的,只需要dts中加入dcan的okay配置和kernel 的config中加入以下内容即可,但是做am4372平台的仁兄似乎忘记了将am335x-l4.dtsi里关于dcan时钟的配置移植到am437x-l4.dtsi中,导致驱动加载时挂在clk的enable上面。
[*] Networking support -><*|M> CAN bus subsystem support -><*|M> Raw CAN Protocol (raw access with CAN-ID filtering)<*|M> Broadcast Manager CAN Protocol (with content filtering)<*|M> CAN Gateway/Router (with netlink configuration)CAN Device Drivers -><*|M> Platform CAN drivers with Netlink support[*] CAN bit-timing calculation<*|M> Bosch C_CAN/D_CAN devices -><M> Generic Platform Bus based C_CAN/D_CAN driver
diff --git a/arch/arm/boot/dts/am437x-l4.dtsi b/arch/arm/boot/dts/am437x-l4.dtsi
index 0dd59ee..f23eee2 100644
--- a/arch/arm/boot/dts/am437x-l4.dtsi
+++ b/arch/arm/boot/dts/am437x-l4.dtsi
@@ -1558,8 +1558,9 @@reg-names = "rev";ti,hwmods = "d_can0";/* Domains (P, C): per_pwrdm, l4ls_clkdm */
- clocks = <&l4ls_clkctrl AM4_L4LS_D_CAN0_CLKCTRL 0>;
- clock-names = "fck";
+ clocks = <&l4ls_clkctrl AM4_L4LS_D_CAN0_CLKCTRL 0>,
+ <&dcan0_fck>;
+ clock-names = "fck","osc";#address-cells = <1>;#size-cells = <1>;ranges = <0x0 0xcc000 0x2000>;
@@ -1567,6 +1568,8 @@dcan0: can@0 {compatible = "ti,am4372-d_can", "ti,am3352-d_can";reg = <0x0 0x2000>;
+ clocks = <&dcan0_fck>;
+ clock-names = "fck";syscon-raminit = <&scm_conf 0x644 0>;interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>;status = "disabled";
@@ -1579,8 +1582,9 @@reg-names = "rev";ti,hwmods = "d_can1";/* Domains (P, C): per_pwrdm, l4ls_clkdm */
- clocks = <&l4ls_clkctrl AM4_L4LS_D_CAN1_CLKCTRL 0>;
- clock-names = "fck";
+ clocks = <&l4ls_clkctrl AM4_L4LS_D_CAN1_CLKCTRL 0>,
+ <&dcan1_fck>;
+ clock-names = "fck","osc";#address-cells = <1>;#size-cells = <1>;ranges = <0x0 0xd0000 0x2000>;
@@ -1588,6 +1592,8 @@dcan1: can@0 {compatible = "ti,am4372-d_can", "ti,am3352-d_can";reg = <0x0 0x2000>;
+ clocks = <&dcan1_fck>;
+ clock-name = "fck";syscon-raminit = <&scm_conf 0x644 1>;interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>;status = "disabled";
简单验证
iperf test network bandwidth performance
Host$ iperf -s 192.168.1.102 -w 163840
Client# iperf -c 192.168.1.102
Client connecting to 192.168.1.102, TCP port 5001
TCP window size: 43.8 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.1.105 port 58480 connected with 192.168.1.102 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 113 MBytes 94.4 Mbits/seccan test
root@am437x-evm:~# ifconfig -a
can0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 NOARP MTU:16 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:10 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)Interrupt:79 can1 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 NOARP MTU:16 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:10 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)Interrupt:80 eth0 Link encap:Ethernet HWaddr A8:1B:6A:CF:7D:94 inet addr:192.168.1.105 Bcast:192.168.1.255 Mask:255.255.255.0inet6 addr: fe80::aa1b:6aff:fecf:7d94%763612/64 Scope:LinkUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:994461 errors:0 dropped:0 overruns:0 frame:0TX packets:681796 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:1068184453 (1018.6 MiB) TX bytes:762418962 (727.0 MiB)lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0inet6 addr: ::1%763612/128 Scope:HostUP LOOPBACK RUNNING MTU:65536 Metric:1RX packets:181 errors:0 dropped:0 overruns:0 frame:0TX packets:181 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:13828 (13.5 KiB) TX bytes:13828 (13.5 KiB)sit0 Link encap:IPv6-in-IPv4 NOARP MTU:1480 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
移植Linux 5.5.3 到 TI AM4372平台相关推荐
- 在mtk移植个linux内核,移植 Linux Kernel 造成無法開機之解決方案以及除錯工具
一般在以下情況, 我們會進行移植 Linux Kernel 的動作. 1. 將新版 Linux Kernel 移植到全新 SoC 上 開發人員為 SoC 廠商(e.g. MTK, TI, Allwin ...
- 为AM335x移植Linux内核主线代码——了解dts
问题一:以前的Linux Kernel如何描述硬件,现在又如何描述呢? 在以前的内核版本中: 1)内核包含了对硬件的全部描述: 2)bootloader会加载一个二进制的内核镜像,并执行它,比如uIm ...
- ZYNQ跑系统 系列(一) 传统方式移植linux
移植linux之传统方式 在ZYNQ开发时,有些情况下,为了降低开发的复杂性,或是提升系统运行的性能,在ARM上跑一个linux系统往往是一个不错的选择,而且linux系统一般集成了一些常用的成熟驱动 ...
- 挑战 Linux 之父认为的“不可能”:向 M1 Mac 移植 Linux
整理 | 郑丽媛 头图 | CSDN下载自东方 IC 上个月苹果发布会推出的首款自研芯片 M1 ,不仅吸引了国内外评测技术网站对其性能的关注,更是在开发者的圈子内引起了轩然大波--换芯导致的生态迁移问 ...
- jquery程序 windows移植到linux显示不了,windows程序移植linux
1,路径名统一用正斜杠"/".(windows下正反斜杠都识别,linux只认正斜杠.) 2,统一使用UTF-8格式编码. vim中无法保存汉字时,可输入下列命令: :set fi ...
- 【ARM】一步一步移植Linux Kernel 2.6.13到板子
1环境搭建所需材料 2环境搭建所需材料之间的关系 3所使用的开发板 4译内核 1修改makefile 2拷贝配置文件 3编译得到zImage 4把zImage转成uImage 5开发板串口连接 6ub ...
- AT91RM9200Linux移植笔记(三)-移植Linux kernel 2.6.17
AT91RM9200Linux移植笔记(三)-移植Linux kernel 2.6.17 手上板子原来自带的是2.4.19的内核, 打算移植新的2.6的内核,从网上下了2.6.17的kernel,下载 ...
- 【移植Linux 3.4.2内核第二步】之修改系统分区
今天接着移植Linux 3.4.2内核,接着上一篇文章(点击查看:上一篇文章)我们完成了内核的串口启动打印输出,但是无法挂载根文件系统,我们看看启动后显示的是什么: 从打印结构可以看出,我们的分区不对 ...
- 【移植Linux 3.4.2内核第一步】之简单修改
前一阵子已经将U-boot移植好了,从今天开始,我们开始移植linux内核.移植的内核为3.4.2,移植的开发板为:jz2440开发板. 想看之前移植U-boot的记录,可以查看我的博客专栏,点击链接 ...
最新文章
- Twitter 禁止未经用户同意分享照片和视频
- Linux 数据同步方案
- sublime编辑器中文乱码的问题
- 两个onCreate方法?你真的了解onCreate()么?
- Python入门100题 | 第005题
- 如何在ubuntu下安装detectron2_Anaconda中安装Cascade RCNN(Detectron)的若干问题
- boost::fibers::buffered_channel< std::string >用法的测试程序
- axios获取header中的信息_Axios请求头中常见的Content-Type及其使用
- java 序列化 protobuf_java序列化机制之protobuf(快速高效跨语言)
- mac 显示隐藏文件_MacOS如何隐藏、加密文件或文件夹
- Cilium创建pod network源码解析
- GB28181流媒体服务LiveGBS启动报错 HTTP Port[10000] In Use
- 0004-程序流程2之ui-router大意
- Chain of Responsibility(责任链)
- 计算机组成原理第六版课后题答案pdf,数据库第五版课后答案pdf
- 电影院售票系统,电影院订票系统,电影院购票管理系统计算机毕业设计
- 第八课 实战重启验证注册机制
- 架构之美:教你如何分析一个接口?
- TuGraph安装与简单使用
- 瑞尔森大学计算机网络专业怎么样,瑞尔森大学怎么样?
热门文章
- 「传统的互联网模式」与「互联网」,其实是有着本质的区别的
- Java中final、static关键字的作用
- 《微信小程序-进阶篇》package.json版本说明及各类版本符号详解(一)
- [转]2013年海康威视校园招聘笔试题
- 骁龙778g+怎么样 骁龙778g+处理器跑分多少
- Android Studio设置HTTP代理(可用)
- java发送get请求参数_HttpClient发送带参数的Get请求
- 网付资讯:刷脸支付代理是正规的吗?
- 个人微信营销第一大误区
- python excel格式刷_cad必学的快捷方式,让你作图飞起