Loading...
首页专栏正文

nvidia xavier nx平台修改CAN时钟调试

 
1人已赏
free-jdx 发布于 2021-04-28 18:22:42 浏览 3094 点赞 98 收藏 8

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来验证是否加载了设备树。

*本文仅代表作者观点,不代表易百纳技术社区立场。系作者授权易百纳技术社区发表,未经许可不得转载。

精彩评论

  • 空鸣 评论于 2021-04-30 17:22:36

    1

    0
内容存在敏感词
打赏
打赏作者
free-jdx
您的支持将鼓励我继续创作!
金额:
¥1 ¥5 ¥10 ¥50 ¥100
支付方式:
微信支付
支付宝支付
微信支付
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

易百纳技术社区
确定要删除此文章、专栏、评论吗?
确定
取消
易百纳技术社区