海思Hi3519AV100驱动采用设备树方式代替硬件编码,本文主要描述在移植MCP2515时遇到的问题,作为后续移植参考。
一、设备树配置
由于开发板上没有可用的SPI,所以采用GPIO模拟。
Hi3519av100.dtsi中GPIO的设备树配置如下:
相应的产品型号dts配置如下:
要注意的晶振时钟配置要与MCP2515一致,以及复位引脚跟中断引脚的配置,SPI的最大频率根据MCP2515接收端的承受能力来配置,驱动中会默认设置好传输速率。
二、调试MCP2515
当配置好设备树后启动,发现probe失败,然后进行下面排查。
1.经过追踪linux中Mcp251x.c的源码发现mcp251x_hw_probe中会调用mcp251x_hw_reset发送复位命令给MCP251x,编写读写MCP251x寄存器都没反应怀疑reset引脚是否拉高了、信号是否有输出。
2.经过示波器抓取信号,确认reset有拉高并且所有引脚信号都有相应的信号,但是SCLK的引脚电平输出有问题,不能完全拉低,需要配置一下IO驱动输出能力。
3.在Hi3519AV100R001C02SPC010-user\ReleaseDoc\zh\00.hardware\chip中Hi3519AV100_PINOUT_CN.xlsx查找相应的管脚配置寄存器说明,发现目前的驱动能力为0档,经过从0-15档的调整发现只有在15档时SCLK才能拉低至输出180mv左右,经过电路放大后输入到MCP2515在400-450mv之间。
4.配置好驱动后发现一个问题,就可以probe成功了,IO的配置暂时放在Mcp251x.c源码中。
5.但是出现了一个问题就是前天可以probe成功的在隔天就不行了,经过查找MCP2515手册发现SCLK的低电压输入的最高域值是0.4v,我们的SCLK信号超过了MCP2515的信号域值所以会出现MCP2515信号读取错误的情况,经过将电阻加大,使SCLK的拉高拉低输出在MCP2515域值内后可以probe成功。
6.但存在失败的情况,添加超时重传机制后就能每次都probe成功了,修改mcp251x_hw_reset函数内容。
执行ifconfig -a可以看到can0设备。
三、iproute2与canutils移植
3.1 iproute移植
iproute的移植按网上说明就可以,这里我用的版本是iproute2-5.3.0,生成makefile后修改CC改为海思交叉编译器。
这里遇到一个问题,在执行ip link set can0 up type can bitrate 250000会失败,提示中断打不开,定位到驱动源码spi.c以及到irq.c中发现spi.irq申请失败所以导致中断失败,中断的分配自然跟设备树配置有关,将gpio2设置为中断控制器并配置到中断的记录数目后就可以注册成功,具体设备树配置如下:
3.2 canutils移植
移植canutils前需要移植libsocketcan,libsocketcan移植的步骤如下:
Canutils移植步骤如下:
将相应的CC改为海思交叉编译器即可。
这里编译时会提示libsocketcan不是0.9以上版本,将GNUmakefile文件中将相应的处理删除后即可正常编译。
四、运行CAN命令
配置完成后,运行Socket Can调用的命令,能够正常执行,并且数据收发正确。