导读
本文基于M3568-4GF16GLI-T核心板内核源码,完成CSM431B CANFD拓展芯片的驱动移植,实现SPI拓展2路CANFD接口。梳理设备树配置、内核驱动编译调试要点,验证CAN收发通信稳定,为RK3568平台多路CAN扩展提供实操方案。
CSM431B 产品简介
CSM431B 内部集成有独立的CANFD控制器,支持通过SPI/UART扩展出两路CANFD 收发接口,该接口再配合外置的CANFD收发器即可扩展两路CANFD总线接口。当用户控 制板上的CANFD控制器资源不够时,可以通过SPI或UART接口扩展出更多的CANFD总线接口。
除CSM431B外,ZLG致远电子还有SPI/UART转单路CAN芯片CSM330A(隔离)与CSM331A(非隔离)及SPI/UART转双路CANFD芯片CSM430B(隔离)等产品。CSM系列协议转换芯片相较于传统模块方案,其生产工艺更先进,占板面积更小,同时具备更高的集成度与性能参数,能够为用户提供标准、可靠的CAN或CANFD接口扩展方案。
软硬件准备
1. 软件方面
安装好虚拟机的电脑;
M3568-T对应的sdk(详见光盘资料,找FAE索取);
虚拟机镜像(找FAE索取)。
2. 硬件方面
CSM431B-Eval评估板 1个;
M3568-EV-Board评估底板 1个;
M3568-4GF16GLI-T 核心板 1片;
网线 1根;
USB转TypeC线 1根;
杜邦线 若干。
M3568-T核心板移植CSM431B驱动
备注:CSM431B支持 UART或者SPI 拓展 CANFD,本文只涉及 SPI拓展 2路CANFD 的相关操作。
1. 认识硬件
1.1 M3568-EV-Board评估套件
可以看到M3568-EV-Board上有一个牛角座的IO拓展口,从 IO扩展座子管脚说明表 中,可以看到有一路SPI0,可用来与CSM431B的SPI相连。
同时会将UART4、UART5复用成GPIO,分别用来连接 CSM431B-Eval评估板 的RST、INT、CFG等引脚。
整理M3568-EV-Board 与 CSM431B-Eval 的杜邦线连接关系如下:
2. CSM431B-Eval评估板
评估板上靠近CSM431B这一侧的排针,需要使用杜邦线引出来,接到上述的M3568-EV-Board评估板上的IO拓展座子上。
包括:RST、NSS、INT、SCK、MOSI、MISO、CFG。注意这些引脚要跟M3568-EV-Board评估板上的IO拓展座子引脚一一对应,不要连错了。
整理 CSM431B-Eval 与 M3568-EV-Board 的杜邦线连接关系如下:
因为CSM431B芯片内部是不带CAN收发器的,所以评估板需要独立供电,让底板上的CAN收发器也正常工作。
另外还需要引一根杜邦线,将 CSM431B-Eval评估板的GND 与 M3568-EV-Board评估板上的IO拓展座子的GND连接共地,以及注意跳线帽的连接。
2. 内核修改
内核修改基于我司【光盘资料】M3568-T 在线资料包 中的sdk包。
2.1 设备树
#进入kernel目录之后,执行以下命令vi ./arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi
下列是rk3568-evb1-ddr4-v10.dtsi需要修改的内容:
//屏蔽掉默认的UART4、UART5的功能/*&uart4 {status = "okay";pinctrl-names = "default";pinctrl-0 = <&uart4m1_xfer>;};&uart5 {status = "okay";pinctrl-names = "default";pinctrl-0 = <&uart5m1_xfer>;};*///spi总线添加csm400b_spi设备描述&spi0 {pinctrl-names = "default";pinctrl-0 = <&spi0m1_pins &spi0m1_cs0>; /* only cs0, so reg can only be configured as 0 */status = "okay";csm400b_spi: csm400b-spi@0{pinctrl-names = "default";pinctrl-0 = <&csm431b_gpio>;compatible = "zhiyuan,csm400b-spi";reg = <0>;gpios = <&gpio3 RK_PB2 GPIO_ACTIVE_LOW /* for rst */&gpio3 RK_PC2 GPIO_ACTIVE_LOW>; /* for cfg */interrupt-parent = <&gpio3>;interrupts = <RK_PB1 IRQ_TYPE_LEVEL_LOW>; /* for interrupt GPIO */spi-max-frequency = <3000000>;gid = <0>; /* if gid = <1> , just using can0, else if gid = <0>, using can0 and can1 */status = "okay";};};//将UART4、UART5复用成GPIO&pinctrl {csm431bgpio {csm431b_gpio:csm431b-gpio {rockchip,pins =//RST<3 RK_PB2 RK_FUNC_GPIO &pcfg_pull_down>,//INT<3 RK_PB1 RK_FUNC_GPIO &pcfg_pull_down>,//CFG<3 RK_PC2 RK_FUNC_GPIO &pcfg_pull_down>;};};};
2.2 添加驱动
将csm400b_spi.c、csm400b_spi.h拷贝到kernel/drivers/net/can目录
CSM430B、CSM431B的驱动文件可以在我司官网下载:
https://www.zlg.cn/Power/Down/down/id/351.html
驱动文件路径:CSM430B&CSM431B_driverspi
修改kernel/drivers/net/can/Makefile
+ obj-$(CONFIG_CAN_CSM400B) += csm400b_spi.o
修改kernel/drivers/net/can/Kconfig
config CAN_CSM400Btristate "zlg csm400b to can device"depends on TTY && SERIAL_DEV_CTRL_TTYPORT && SERIAL_DEV_BUShelpSupport for ZLG CSM400B to CAN interfaces.This is a CAN device driver which registers as an serial、spi adapterand gpiochip to expose these functions of the CSM400B.
修改linux内核配置make menuconfig
CONFIG_SERIAL_DEV_BUS=yCONFIG_SERIAL_DEV_CTRL_TTYPORT=yCONFIG_CAN_CSM400B=y
编译内核
./build.sh kernel
3. 编译烧录实测
将上述编译出来的内核烧录到核心板评估板上,在板子上执行以下命令进行测试:
#查看驱动加载情况。正常会出现"spi check ok"dmesg | grep csm400b#因为M3568-EV-Board评估板本身有2路CAN,所以通过拓展出来的2路CANFD就是CAN3、CAN4#配置CAN3、CAN4ip link set can3 downip link set can3 type can bitrate 1000000 dbitrate 5000000 fd onip link set can3 upip link set can4 downip link set can4 type can bitrate 1000000 dbitrate 5000000 fd onip link set can4 up
将CSM431B评估板拓展出来的2路CANFD接口的CANH、CANL,与我司的 USBCANFD-200U USB接口CAN FD卡相连。
在M3568-T板子上执行命令,测试CSM431B评估板拓展出来的CAN3、CAN4与 USBCANFD-200U 的通讯效果。
测试结果截图:拓展出来的2路CANFD通讯均正常。
| CSM系列协议转换芯片 | |
| 元器件100%国产化
7500帧最大帧流量 通信错误反馈机制 |
183
