首页 > 技术知识 > 正文

1. 前言

JETSON NX开发板上配置CAN- bus与一个CAN收发器SN65HVD230。

要求是改变设备树中的CAN时钟速率,让CAN时钟率到40MHZ

2. 如何设置准确的40MHz

要实现40MHz,首先需要设置CAN父时钟为pllaon。 适用于:Jetson Xavier NX和Jetson AGX Xavier

默认情况下,PLLAON在T194 L4T平台上禁用以节省电力。 在CAN和PWM等特定用例中,可能希望让PLLAON实现更高的时钟速率或更高的精度。 可以先将PLLAON添加为时钟的可能父节点,然后将时钟的父节点设置为PLLAON。

通过修改BPMPFW DTB和内核DTB文件来进行这些更改。 BPMPFW DTB保存时钟配置;内核DTB包含启用和禁用PLLAON的设置。 以CAN用例为例,按照以下步骤添加PLLAON作为可能的父组件:

(1)使用dtc工具将BPMPFW DTB(例如tegra194-a02-bpmp-p2888-a04.dtb)转换为DTS。 (2)编辑DTS文件,将PLLAON时钟ID添加到可能的父节点列表中。 PLLAON的时钟ID可以从头文件tegra194-clock.h中获取。在本例中,时钟ID为94: TEGRA194_CLK_PLLAON = 94 在DTS文件中,将时钟ID添加到allowed-parents列表中:

clocks { clock@can1 { clk-id = <9>; /* confirming TEGRA194_CLK_CAN1*/ allowed-parents <nn,nn,nn,…,94>; /*TEGRA194_CLK_PLLAON*/ }; … };

这允许将PLLAON设置为CAN1的父节点。

(3)将DTS文件转换回DTB。 (4)使用dtc工具将内核DTB(例如tegra194-p2888-0001-p2822-0000.dtb)转换为DTS文件,或者获取内核的源DTS文件。 (5)编辑内核DTS文件,使CAN使用PLLAON为父,并将PLLAON从被禁用的时钟列表中删除:

clocks-init{ compatible = “nvidia,clocks-config”; disable { /* Edit clocks property to remove clock provider + clock id pair for PLLAON. */ }; };

(6)将mtcan节点改为选择PLLAON为父节点:

mttcan@c310000 { pll_source = “pllaon”; clocks = <…>, <&bpmp_clks TEGRA194_CLK_PLLAON>; /*New entry*/ clock-names = <name>, <name>, <name>, …, “pllaon”; };

(7)将DTS文件转换为DTB,如果编辑了源文件,则构建内核DTB。 (8)刷写DTB文件。

以下时钟可以配置为PLLAON为父时钟: • TEGRA194_CLK_CAN1 • TEGRA194_CLK_CAN2 • TEGRA194_CLK_DMIC5 • TEGRA194_CLK_I2C2 • TEGRA194_CLK_I2C8 • TEGRA194_CLK_PWM4 • TEGRA194_CLK_SPI2 • TEGRA194_CLK_UARTG、

另外,默认情况下,从MTTCAN内核驱动程序请求的CAN时钟速率是50MHz。 所以要使用40MHz,在驱动程序中做以下更改:

mtcan内核驱动程序设置CAN时钟速率。 按照内核定制指导,使用Git获取内核源代码,然后更新mtcan驱动中的时钟速率,如下代码片段所示:

.set_can_core_clk = true, .can_core_clk_rate = 50000000, ////修改这里(以Hz),因此它应该是4000万 .can_clk_rate = 200000000, ////核心CLK率的4倍

使用新的内核映像构建内核和flash。 您也可以直接复制mtcan。 Ko在目标目录/lib/…

3. 调试记录

(1)我对clock -init部分的编辑有疑问,

Edit the kernel DTS file to make CAN use PLLAON as parent and remove PLLAON from list of clocks to be disabled: clocks-init{ compatible = “nvidia,clocks-config”; disable { /* Edit clocks property to remove clock provider + clock id pair for PLLAON. */ }; };

从禁用部分中移除0x5e。 如下所示:

clocks = <0x15f 0x5e 0x4 0x9 0x4 0xb>; change it to: clocks = <0x15f 0x4 0x9 0x4 0xb>;

(2)转换dtb失败 在mttcan0部分中,进行了如下编辑。 但当我试图把它转换回dtb它显示以下给出的错误。

edit: pll_source = “pllaon”; clocks = <0x4 0x11c 0x4 0xa 0x4 0x9 0x4 0x5b>,<&bpmp_clks, TEGRA194_CLK_PLLAON>; clock-names = “can_core”, “can_host”, “can”, “pllaon”; error: dtc -I dts -O dtb tegra194-p2888-0001-p2822-0000.dts > tegra194-p2888-0001-p2822-0000.dtb Error: tegra194-p2888-0001-p2822-0000.dts:5297.66-67 syntax error FATAL ERROR: Unable to parse input tree 显示错误的行是, clocks = <0x4 0x11c 0x4 0xa 0x4 0x9 0x4 0x5b>,<&bpmp_clks, TEGRA194_CLK_PLLAON>;

(3)禁用部分 下面给出的是删除0x5e后的禁用部分。

clocks-init { compatible = “nvidia,clocks-config”; status = “okay”; disable { clocks = <0x14d 0x4 0x9 0x4 0xb>; }; };

但是这个错误发生在前面消息中提到的MTTCAN部分

(4)修改配置 你可以这样编辑mttcan0

pll_source = “pllaon”; clocks = <0x4 0x11c 0x4 0xa 0x4 0x9 0x4 0x5e>; clock-names = “can_core”, “can_host”, “can”, “pllaon”;

(5)CAN运行 现在CAN运行起来了。 尝试了loop-back收发,工作正常。 但当尝试与主机pc与CAN收发器SN65HVD230连接时 ,第一次通信是发生的,但有时之后CAN会进入CAN BUS_OFF状态。

总线上未连接其他设备,只有主机pc。

CAN是工作的,我可以沟通。但有时CAN会变成BUS off状态。当我们检查CAN状态时,它显示CAN总线断开状态。有时CAN从错误主动状态变为错误被动状态。TX计数器在增加。

这是CAN不能正常工作时的输出:

ip -det link … 10: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 72 qdisc pfifo_fast state UP mode DEFAULT group default qlen 100 link/can promiscuity 0 can <BERR-REPORTING,FD> state ERROR-PASSIVE (berr-counter tx 0 rx 127) restart-ms 0 bitrate 498701 sample-point 0.870 tq 26 prop-seg 33 phase-seg1 33 phase-seg2 10 sjw 1 mttcan: tseg1 2..255 tseg2 0..127 sjw 1..127 brp 1..511 brp-inc 1 dbitrate 2021052 dsample-point 0.736 dtq 26 dprop-seg 6 dphase-seg1 7 dphase-seg2 5 dsjw 1 mttcan: dtseg1 1..31 dtseg2 0..15 dsjw 1..15 dbrp 1..15 dbrp-inc 1 clock 38400000numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 …

我修改引导装载程序/ t186ref / tegra194-a02-bpmp-p2888-a04.dtb:

clock@can1 { allow_fractional_divider = <0x1>; – allowed-parents = <0x121 0x5b 0x13a>; + allowed-parents = <0x121 0x5b 0x5e 0x13a>; clk-id = <0x9>; }; clock@can2 { allow_fractional_divider = <0x1>; – allowed-parents = <0x121 0x5b 0x13a>; + allowed-parents = <0x121 0x5b 0x5e 0x13a>; clk-id = <0xb>; };

使用这个命令来flash这个dtb文件

$ sudo ./flash.sh -r -k bpmp-fw-dtb jetson-agx-xavier-devkit mmcblk0p1 $ sudo ./flash.sh -r -k bpmp-fw-dtb_b jetson-agx-xavier-devkit mmcblk0p1

重启后,通过检查/sys/kernel/debug/bpmp/debug/dt来验证是否加载了正确的dtb。

接下来,我修改了kernel/dtb/tegra194-p2888-0001-p2822-0000.dtb:

— kernel/dtb/tegra194-p2888-0001-p2822-0000.dts.bak 2021-04-19 13:33:34.342762489 +0200 +++ kernel/dtb/tegra194-p2888-0001-p2822-0000.dts 2021-04-19 13:34:32.248801134 +0200 @@ -5293,9 +5293,9 @@ reg = <0x0 0xc310000 0x0 0x400 0x0 0xc311000 0x0 0x32 0x0 0xc312000 0x0 0x1000>; reg-names = “can-regs”, “glue-regs”, “msg-ram”; interrupts = <0x0 0x28 0x4>; – pll_source = “osc”; – clocks = <0x4 0x11c 0x4 0xa 0x4 0x9 0x4 0x5b>; – clock-names = “can_core”, “can_host”, “can”, “osc”; + pll_source = “pllaon”; + clocks = <0x4 0x11c 0x4 0xa 0x4 0x9 0x4 0x5b 0x4 0x5e>; + clock-names = “can_core”, “can_host”, “can”, “osc”, “pllaon”; resets = <0x5 0x4>; reset-names = “can”; mram-params = <0x0 0x10 0x10 0x20 0x0 0x0 0x10 0x10 0x10>; @@ -5311,9 +5311,9 @@ reg = <0x0 0xc320000 0x0 0x400 0x0 0xc321000 0x0 0x32 0x0 0xc322000 0x0 0x1000>; reg-names = “can-regs”, “glue-regs”, “msg-ram”; interrupts = <0x0 0x2a 0x4>; – pll_source = “osc”; – clocks = <0x4 0x11d 0x4 0xc 0x4 0xb 0x4 0x5b>; – clock-names = “can_core”, “can_host”, “can”, “osc”; + pll_source = “pllaon”; + clocks = <0x4 0x11d 0x4 0xc 0x4 0xb 0x4 0x5b 0x4 0x5e>; + clock-names = “can_core”, “can_host”, “can”, “osc”, “pllaon”; resets = <0x5 0x5>; reset-names = “can”; mram-params = <0x0 0x10 0x10 0x20 0x0 0x0 0x10 0x10 0x10>; @@ -13576,7 +13576,7 @@ status = “okay”; disable { – clocks = <0x14d 0x5e 0x4 0x9 0x4 0xb>; + clocks = < 0x4 0x9 0x4 0xb>; }; };
<

同时flash这个设备树:

$ sudo ./flash.sh -r -k kernel-dtb jetson-agx-xavier-devkit mmcblk0p1 $ sudo ./flash.sh -r -k kernel-dtb_b jetson-agx-xavier-devkit mmcblk0p1

通过检查proc文件/proc/device-tree/mttcan@c310000/pll_source来验证是否加载了设备树。

猜你喜欢