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

free-jdx 2021-04-27 17:56:41 9381
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来验证是否加载了设备树。

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
free-jdx
红包 98 9 评论 打赏
评论
1个
内容存在敏感词
手气红包
  • 空鸣 2021-04-30 17:22:36
    回复

    1

相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
free-jdx
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

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

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区