nvidia xavier nx平台修改CAN时钟调试
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来验证是否加载了设备树。
- 分享
- 举报
-
浏览量:8575次2021-05-14 14:43:43
-
浏览量:6431次2021-04-21 17:42:58
-
浏览量:7400次2021-05-11 17:51:48
-
浏览量:9445次2021-05-26 14:17:15
-
浏览量:10834次2021-05-06 16:22:01
-
2021-05-06 16:03:00
-
浏览量:7071次2021-05-11 17:04:57
-
浏览量:5237次2021-05-10 17:48:42
-
浏览量:7075次2021-05-20 16:37:42
-
浏览量:7889次2021-05-25 15:32:16
-
浏览量:9200次2021-05-19 17:32:00
-
浏览量:9378次2021-05-25 17:31:40
-
浏览量:7456次2021-05-20 17:08:14
-
2021-04-23 15:54:21
-
浏览量:7932次2021-06-04 16:25:58
-
浏览量:7148次2021-07-31 15:26:23
-
浏览量:5880次2021-05-28 13:52:17
-
浏览量:10184次2021-06-08 17:32:00
-
浏览量:7429次2021-06-09 14:29:23
-
178篇
- AI为推荐系统“加料”, 实现个性化消费者服务
- nvidia nx平台使用ptp 同步两台nx设备
- NVIDIA HBAO+解析:打造更逼真的环境光遮盖效果
- GeForce家族最好的GPU!全新GTX 980详尽介绍
- 游戏玩家不容错过!NVIDIA展台人气爆棚
- nvidia xavier nx平台上精确时间协议(PTP)调试记录1
- 新品发布 | NVIDIA AI Enterprise 软件现已全球上市,各行业获取AI变得触手可及
- 专访NVIDIA张建中:将PC级视觉体验带到移动平台
- 1.2万亿市值之后,英伟达还能笑多久?
- nvidia xavier nx平台GStreamer pipeline挂起问题调试1
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
free-jdx
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
1