近期要在板子上要用到SPI接口的mcp2515,hi3521d采用了linux3.18.20的内核,使用了设备树的方式加载驱动。不算复杂,调了2天搞完了。

内核修改

1.注意RESET脚控制,为海思的控制方法

2.注意MCP2515使用的晶振,内核里面配置对应的时序

3.中断方式采用海思的控制方式

4.开启内核can支持及SPI的mcp2515驱动,mcp2515里面本身有个bug也一并修正了

5.修改驱动适配3521D,采用动态加载的方式

其核心初始化代码如下:

static __init int mcp251x_spi_init(void)

{

char spi_name[16];

struct spi_master *master;

struct device* dev;

struct spi_device *spi;

master = spi_busnum_to_master(0);

if (!master) {

printk("spi_busnum_to_master failed\n");

return -ENODEV;

}

snprintf(spi_name, sizeof(spi_name), "%s.%u", dev_name(&master->dev), 1);

dev = bus_find_device_by_name(&spi_bus_type, NULL, spi_name);

if (dev == NULL) {

dev_err(NULL, "chipselect %d has not been used\n", 1);

return -ENXIO;

}

spi = to_spi_device(dev);

if (spi == NULL) {

dev_err(dev, "to_spi_device() error!\n");

return -ENXIO;

}

mcp251x_device = spi;

put_device(dev);

return mcp251x_can_probe(spi);

}

static __exit void mcp251x_spi_exit(void)

{

if(mcp251x_device!=NULL)

mcp251x_can_remove(mcp251x_device);

}

can测试

由于hi3521d内置的busybox里面没有带ip命令,并且config里面也没有配置所以需要移植一个iproute2,我这里选择的版本是3.18.0随后交叉编译一份canutils.

回环测试指令如下:

ip link set can0 down

ip link set can0 type can bitrate 50000 loopback on

ip link set can0 up

candump can0 &

cansend can0 123#11223344556677

正式测试(PC上接个USB的can模拟器)

ip link set can0 down

ip link set can0 type can bitrate 125000

ip link set can0 up

candump can0 &

cansend can0 123#11223344556677

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐