今天把mcp2515的can总线驱动移植到pxa270上,总体看起来不是很复杂,但也碰到了不少挫折,最终还是解决了,也没算白忙活。
为了能够记住做过的驱动,以及便于日后查看,便记了下来,也方便遇到此类问题的朋友,尽快得到答案。
mcp2515.c文件已经写好了吧,网上可以下载的很多。
可以在各种平台下移植,它是基于平台设备的驱动,基本不用改动,只要根据 原理图 在内核文件下改动一点点即可。
下面说说我的步骤和理解:
1、看原理图,找出spi通道是哪一个,这样在270处理器下面就可以对应相应的bus_num,和chip_select。这里记录下来。在2里可以用的到。
2、这里进入源码打开 vi arch/arm/mach-pxa/mainstone.c ,在这里加一个结构体的定义,如下:
static struct spi_board_info spi_board_info[] __initdata =
{
{
.modalias = "mcp2515_1", //这个名称要也mcp2515_1.c里的.name名字要相同,设备是通过这个名字来找到驱动的。
.chip_select = 0,
.max_speed_hz = 5000*24, /*(4700 * 26)-125000 * 26, (max sample rate @ 3V) * (cmd + data + overhead) */
.bus_num = 1, //这个和spi通道有关,是在原理图里记录下来的。
.platform_data = &mcp251x_info,
.irq = IRQ_MCP2515_1, //对应的中断号
},
// begin: add by dudebing for using two mcp2515 and ad7888
{
.modalias = "mcp2515_2",
.chip_select = 0,
.max_speed_hz = 5000*24, /*(4700 * 26)-125000 * 26, (max sample rate @ 3V) * (cmd + data + overhead) */
.bus_num = 2, //这个和spi通道有关
.platform_data = &mcp251x_info,
.irq = IRQ_MCP2515_2,
},
};
并在下面的初始化函数里加上这么一句话,如果没有的话。
static void __init mainstone_init(void)
{
………………
spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
………………
}
3、仍然在arch/arm/mach-pxa/mainstone.c这个文件里,定义和设置中断号使能,同时设置触发方式, 这相要根据设计图纸来定。配置相应spi管脚功能。在不同的体系下配置函数不同,目的都是一样。
4、这里要改动驱动模块源文件了。也就是前面说的mcp2515.c
这里改动非常少,只需改动下面这个结构体里的 name成员即可。这里的名称一定要和上面的modalias 一致。不然设备找不到驱动。
static struct spi_driver mcp251x_driver = {
.driver = {
.name = DRIVER_NAME,//这里宏定义 #define DRIVER_NAME "mcp2515_1" ,另外一个驱动模块是"mcp2515_2"
.bus = &spi_bus_type,
.owner = THIS_MODULE,
},
.probe = mcp251x_probe,
.remove = __devexit_p(mcp251x_remove),
#ifdef CONFIG_PM
.suspend = mcp251x_suspend,
.resume = mcp251x_resume,
#endif
};
5、编译内核,烧录内核代码。
记得一定要重新烧录内核,因为内核是改动过的。或者直接加载到内存中。
6、编译驱动,insmod 驱动.ko即可。