Jetson AGX Xavier 设置 CAN,打开pllaon时钟,jetpack5.1

更新:jetpack5.1,可以直接用官方自带的jeston-io py脚本配置,40pin上的can,spi,i2c等功能。

 sudo /opt/nvidia/jetson-io/jetson-io.py

进入主菜单后,选择下面的“Configure 40-pin expansion header”,就会出现以下选择菜单视窗,透过“上下键”与“空键”选择要设定的组。

参考连接:非常感谢以下总结
https://blog.csdn.net/weifengdq/article/details/124382475?spm=1001.2014.3001.5506
https://blog.csdn.net/qq_41426807/article/details/124669265?spm=1001.2014.3001.5506
Jetson AGX Xavier 使用can的时候修改pinmux后,一直收发失败无法通行,后来看了上面大佬的文章后发现需要修改打开pllaon时钟,jetson默认关闭了can的pllaon时钟(父时钟和节点时钟)。可以执行一下命令检验

sudo cat /sys/kernel/debug/bpmp/debug/clk/can1/parent//父时钟
sudo cat /proc/device-tree/mttcan@c310000/pll_source//节点时钟

输出为osc,需要修改为 pll_aon

一、bpmp里面给can附加pllaon时钟源(parent父时钟)

需要在自己的电脑的Ubuntu系统下,打开最开始刷机时候下载的nvidia_sdk安装包(如图),在这个路径下nvidia/nvidia_sdk/JetPack_4.6.1_Linux_JETSON_AGX_XAVIER_TARGETS/Linux_for_Tegra,需要修改bpmp文件,bootloader/t186ref/下的tegra194-a02-bpmp-p2888-a04.dtb
在这里插入图片描述
1、找到tegra194-a02-bpmp-p2888-a04.dtb文件,打开终端进行反编译,dtb->dts
反编译之前可以先备份.dtb文件

cd Linux_for_Tegra/bootloader/t186ref

# 使用dtc反编译出dts
dtc -I dtb -O dts -o tegra194-a02-bpmp-p2888-a04.dts tegra194-a02-bpmp-p2888-a04.dtb

2、修改.dts 文件,后保存。
反编译完成后可以在Linux_for_Tegra/bootloader/t186ref文件下看到对应的.dts 文件,然后打开.dts 文件,显示默认如下,分别在allowed-parents插入0x5e:

################################################
# 默认的
# clock@can1 {
# 	allow_fractional_divider = <0x01>;
# 	allowed-parents = <0x121 0x5b 0x13a>;
# 	clk-id = <0x09>;
# };
# clock@can2 {
# 	allow_fractional_divider = <0x01>;
# 	allowed-parents = <0x121 0x5b 0x13a>;
# 	clk-id = <0x0b>;
# };
################################################
# 时钟源的解释
# Linux_for_Tegra/source/public/hardware/nvidia/soc/t19x/kernel-include/dt-bindings/clock/tegra194-clock.h
# #define TEGRA194_CLK_CLK_32K	289U   //0x121, 32K input clock provided by PMIC
# #define TEGRA194_CLK_OSC		91U    //0x5b, input from Tegra's XTAL_IN
# #define TEGRA194_CLK_PLLC		314U   //0x13a, PLL controlled by CLK_RST_CONTROLLER_PLLC_BASE
# #define TEGRA194_CLK_PLLAON	94U    //0x5e, PLL controlled by CLK_RST_CONTROLLER_PLLAON_BASE for use by IP blocks in the AON domain
################################################
# 修改为 (参考下图)
# allowed-parents 增加 0x5e, 也就是 PLLAON 时钟
clock@can1 {
	allow_fractional_divider = <0x01>;
	allowed-parents = <0x121 0x5b 0x13a 0x5e>;
	clk-id = <0x09>;
};
clock@can2 {
	allow_fractional_divider = <0x01>;
	allowed-parents = <0x121 0x5b 0x13a 0x5e>;
	clk-id = <0x0b>;
};
################################################

改动如下如图所示:在这里插入图片描述 3、再把dts编译回dtb

dtc -I dts -O dtb -o tegra194-a02-bpmp-p2888-a04.dtb tegra194-a02-bpmp-p2888-a04.dts
# 如果不刷 bpmp-fw-dtb 分区, modprobe 的时候会报下面的错误
# [   32.386287] mttcan c310000.mttcan: unable to set CAN_CLK parent
# [   32.402724] mttcan c310000.mttcan: probe failed
# [   32.425253] mttcan c320000.mttcan: unable to set CAN_CLK parent
# [   32.450769] mttcan c320000.mttcan: probe failed

4、单独刷写 bpmp-fw-dtb 分区
上述改动完保存后,用typc将agx和主机连接(agx为关机状态),agx进入Recovery模式(先按Recovery10s不放,再按power键, 进入Recovery模式时agx是不亮屏幕的。)
继续在自己的电脑下,执行以下命令:

#单独刷写 bpmp-fw-dtb 分区
cd Linux_for_Tegra
cp bootloader/t186ref/BCT/tegra194-mb1-bct-ratchet-p2888-0000-p2822-0000.cfg bootloader
sudo ./flash.sh -k bpmp-fw-dtb jetson-xavier mmcblk0p1

最后需要显示 *** The [bpmp-fw-dtb] has been updated successfully. ***即刷写分区成功。此时agx会自动启动,进入开机画面。

二、进入AGX,mttcan节点时钟修改

1、可以在AGX中先查看上述父时钟修改情况,输出pllaon即修改成功!

sudo cat /sys/kernel/debug/bpmp/debug/clk/can1/parent//父时钟

2、在设备树节点 mttcan@c310000, mttcan@c320000 里附上 pllaon 时钟(这里也可以参考最开始链接中的方法)
找到other Locations >computer/boot/kernel_tegra194-p2888-0001-p2822-0000.dtb
在这里插入图片描述

反编译kernel_tegra194-p2888-0001-p2822-0000.dtb(反编译之前可以先备份.dtb文件)

dtc -I dtb -O dts -o kernel_tegra194-p2888-0001-p2822-0000.dts kernel_tegra194-p2888-0001-p2822-0000.dtb

3、打开.dts 文件如下,注释掉clocks-init里面得disable的时钟。(打开文件后ctrl+f可以搜索)
//clocks = <0x2d8 0x5e 0x04 0x09 0x04 0x0b>;
在这里插入图片描述
还是上面这个文件,ctrl+f搜索mttcan@c310000, 修改如下

#原始
#pll_source = "osc";
#		clocks = <0x04 0x11c 0x04 0x0a 0x04 0x09 0x04 0x5b>;
#  	clock-names = "can_core\0can_host\0can\0osc";
#修改
pll_source = "pllaon";
		clocks = <0x04 0x11c 0x04 0x0a 0x04 0x09 0x04 0x5e>;
		clock-names = "can_core\0can_host\0can\0pllaon";

在这里插入图片描述
mttcan@c320000同样修改上面三个参数

osc>pllaon
0x5b>0x5e
osc>pllaon

在这里插入图片描述
4、保存修改后,再把dts编译回dtb

dtc -I dts -O dtb -o kernel_tegra194-p2888-0001-p2822-0000.dtb kernel_tegra194-p2888-0001-p2822-0000.dts

重启agx,查看mttcan节点时钟命令:

cat /proc/device-tree/mttcan@c310000/pll_source

返回pllaon,即成功!至此两个pllao时钟都已经打开! 后面就很简单了!

三、在AGX,pinmux修改

Xavier默认的是GPIO, 要改成CAN功能, 需要修改pinmux,(如果已经修改了可以跳过)
1、使用busybox中的devmem工具配置:

# 安装busybox, 需要里面的devmem工具
sudo apt install busybox
 
# pinmux.0x0c303000 and pinmux.0x0c303008 are for CAN1
# pinmux.0x0c303010 and pinmux.0x0c303018 are for CAN0
# 检查当前的寄存器值
sudo busybox devmem 0x0c303000	# 0x0000C055
sudo busybox devmem 0x0c303008	# 0x0000C055
sudo busybox devmem 0x0c303010	# 0x0000C059
sudo busybox devmem 0x0c303018	# 0x0000C059
 
# 用devmem修改寄存器
sudo busybox devmem 0x0c303000 32 0x0000C400
sudo busybox devmem 0x0c303008 32 0x0000C458
sudo busybox devmem 0x0c303010 32 0x0000C400
sudo busybox devmem 0x0c303018 32 0x0000C458
 
# 改完后检查
sudo busybox devmem 0x0c303000	# 0x0000C400
sudo busybox devmem 0x0c303008	# 0x0000C458
sudo busybox devmem 0x0c303010	# 0x0000C400
sudo busybox devmem 0x0c303018	# 0x0000C458

2、挂载CAN控制器
寄存器改好了, 该挂载了, 使用modprobe:

sudo modprobe can
sudo modprobe can_raw
sudo modprobe mttcan 
# 检查挂载
lsmod

检查挂载结果:在这里插入图片描述

3、配置CAN接口
挂载好了, 还需要配置一些波特率之类的参数:
配置为1Mbps的标准CAN

sudo ip link set can0 type can bitrate 1000000
sudo ip link set can1 type can bitrate 1000000

或者配置为仲裁段500k, 数据段1M的的CANFD:

sudo ip link set can0 type can bitrate 500000 dbitrate 2000000 berr-reporting on fd on
sudo ip link set can1 type can bitrate 500000 dbitrate 2000000 berr-reporting on fd on

4、打开或关闭CAN

#打开CAN控制器:
sudo ip link set up can1
# 或者简写版的
ip -s -d link show can0
ip -s -d link show can1
#关闭CAN控制器:
sudo ip link set down can0
sudo ip link set down can1
# 检查
ifconfig	# 关闭的话里面就没有can0, can1了

ifconfig检查:在这里插入图片描述需要说明的是, 上面的配置一断电就没了, 如果想开机直接配好, 就把这些写到脚本里, 开机加载就好了。

#!/bin/sh

sudo busybox devmem 0x0c303000 32 0x0000C400
sudo busybox devmem 0x0c303008 32 0x0000C458
sudo busybox devmem 0x0c303010 32 0x0000C400
sudo busybox devmem 0x0c303018 32 0x0000C458

sudo modprobe can
sudo modprobe can_raw
sudo modprobe can-dev
sudo modprobe mttcan

sudo ip link set down can0
sudo ip link set down can1

sudo ip link set can0 type can bitrate 500000 dbitrate 1000000 berr-reporting on fd on loopback on
sudo ip link set can1 type can bitrate 500000 dbitrate 1000000 berr-reporting on fd on loopback on

sudo ip link set up can0
sudo ip link set up can1

5、CAN收发.
(can的收发,需要有can的收发器,AGX里面没有,这个可以再去查一下,然后外挂。)
可以使用 can-utils 进行简单的收发测试, 先安装:

sudo apt install can-utils

#发送
# 123是十六进制帧ID, #后面是8字节十六进制数, 可以用.相隔也可以不用
cansend can0 123#99.95.42.07.2B.96.66.6E
cansend can1 123#99.95.42.07.2B.96.66.6E
 
# 随机发送
cangen -v can0
cangen -v can1
#接收
candump can0
candump can1

可以进行can的回环测试:

#在一个终端执行cansend
cansend can1 132#4444
cansend can0 132#4444
#打开另一个终端执行candump
candump can1
can1  132   [2]  44 44//接收到can1发送的
candump can0
can1  132   [2]  44 44//接收到can0发送的

在这里插入图片描述安装saleae logic分析仪,可以查看发送的数据波形。

在这里插入图片描述

在这里插入图片描述

四、配置寄存器 TDCR

之前做过 STM32H7 / TC397 的CANFD的, 应该对TDC不陌生, 这个上高速率CANFD必须设置的, 不然会罢工(busoff)

官方说法, Xavier 的 CANFD速率最高能怼到15Mbps, 不过高速率需要设置TDCR (Transmission Delay Compensation Register), modprobe 以后, ip link 之前, 切换到 root, 把这个写进去

echo 0x600 > /sys/devices/c310000.mttcan/net/can0/tdc_offset
echo 0x600 > /sys/devices/c320000.mttcan/net/can1/tdc_offset

如果不设置, CAN没问题, 但是CANFD上到如5Mbps, 并且发送数据时, dmesg里会疯狂打印

[11746.995166] mttcan c310000.mttcan can0: entered error warning state
[11746.995307] mttcan c310000.mttcan can0: entered error passive state
[11746.995451] mttcan c310000.mttcan can0: entered bus off state

设置脚本
板子上贴的CANFD收发器为 TJA1042T/3 , 只能到 5Mbps, 这里就设置成5M.
以 500K@0.8, 5M@0.8 的 CANFD 为例, 设置脚本 5M_canfd.sh :

#!/bin/sh

# sudo busybox devmem 0x0c303000 32 0x0000C400
# sudo busybox devmem 0x0c303008 32 0x0000C458
# sudo busybox devmem 0x0c303010 32 0x0000C400
# sudo busybox devmem 0x0c303018 32 0x0000C458

sudo modprobe can
sudo modprobe can_raw
sudo modprobe mttcan

sudo sh -c 'echo 0x600 > /sys/devices/c310000.mttcan/net/can0/tdc_offset'
sudo sh -c 'echo 0x600 > /sys/devices/c320000.mttcan/net/can1/tdc_offset'

sudo ip link set down can0
sudo ip link set can0 type can bitrate 500000 sample-point 0.8 dbitrate 5000000 dsample-point 0.8 fd on restart-ms 100
sudo ip link set up can0 mtu 72
sudo ifconfig can0 txqueuelen 1000

sudo ip link set down can1
sudo ip link set can1 type can bitrate 500000 sample-point 0.8 dbitrate 5000000 dsample-point 0.8 fd on restart-ms 100
sudo ip link set up can1 mtu 72
sudo ifconfig can1 txqueuelen 1000

检验 与 CANFD 收发测试
运行完上面的脚本后, 我们先来检验一下配置生效了没有

# 检查CAN的主时钟是否是 pll_aon, 如果是 pll_c 或 osc, 是不对的
# 注意 bpmp 里面编号是 can1 can2
$ sudo cat /sys/kernel/debug/bpmp/debug/clk/can1/parent
pll_aon
$ sudo cat /sys/kernel/debug/bpmp/debug/clk/can2/parent
pll_aon

# sudo cat /sys/kernel/debug/bpmp/debug/clk/can1/pto_counter
# sudo cat /sys/kernel/debug/bpmp/debug/clk/can2/pto_counter
# 199989248

# 检查TDC是否配置成功
# 用户空间里面编号变成了 can0 can1
$ sudo cat /sys/devices/c310000.mttcan/net/can0/tdc_offset
tdc_offset=0x600, DBTP.tdc=1
$ sudo cat /sys/devices/c320000.mttcan/net/can1/tdc_offset
tdc_offset=0x600, DBTP.tdc=1

# 可以看到时钟 50MHz, 500K, 2M, 数据段采样点只能是 0.7, 0.8 这样, 没有0.75, 0.875, 不影响用
$ sudo ip -d -s link show can0
8: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 72 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/can  promiscuity 0 
    can <FD> state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 100 
          bitrate 500000 sample-point 0.800 
          tq 20 prop-seg 39 phase-seg1 40 phase-seg2 20 sjw 1
          mttcan: tseg1 2..255 tseg2 0..127 sjw 1..127 brp 1..511 brp-inc 1
          dbitrate 5000000 dsample-point 0.800 
          dtq 20 dprop-seg 3 dphase-seg1 4 dphase-seg2 2 dsjw 1
          mttcan: dtseg1 1..31 dtseg2 0..15 dsjw 1..15 dbrp 1..15 dbrp-inc 1
          clock 50000000
          re-started bus-errors arbit-lost error-warn error-pass bus-off
          0          0          0          0          0          0         numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 
    RX: bytes  packets  errors  dropped overrun mcast   
    0          0        0       0       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    16         2        0       0       0       0       

连接外部CANFD分析仪:

仲裁域 500Kbps, 80%采样点
数据域 5Mbps, 75% 或 80% 采样点
Xavier 发送测试

cansend can1 123#11.22.33.44.55.66.77.88
cansend can1 12345678#11.22.33.44.55.66.77.99
cansend can1 321##0.11.22.33.44.55.66.77.88
cansend can1 321##0.11.22.33.44.55.66.77.88.99
cansend can1 321##1.11.22.33.44.55.66.77.88.99
cansend can1 321##2.11.22.33.44.55.66.77.88.99
cansend can1 321##3.11.22.33.44.55.66.77.88.99
cansend can1 12345678##3.11.22.33.44.55.66.77.88.\
12.22.33.44.55.66.77.88.\
13.22.33.44.55.66.77.88.\
14.22.33.44.55.66.77.88.\
15.22.33.44.55.66.77.88.\
16.22.33.44.55.66.77.88.\
17.22.33.44.55.66.77.88.\
18.22.33.44.55.66.77.88

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值