日期:2014-05-16  浏览次数:20722 次

曾经的足迹——对Linux CAN驱动的理解(1)

在TiAM335X系列Cortext-A8芯片中,CAN模块采用D_CAN结构,实质即两路CAN接口。

在此分享一下对基于AM335XLinux CAN驱动源码的理解。下面来分析它的驱动源码及其工作方式。

Linux内核源码中,CAN设备驱动文件如下:

drivers/net/can/d_can/d_can_platform.c

drivers/net/can/d_can/d_can.c

drivers/net/can/d_can/d_can.h

 

首先分析d_can_platform.c文件,驱动运行时,也是先从这里开始。首先是驱动入口函数:

module_init(d_can_plat_init);

static int __init d_can_plat_init(void)

{

printk(KERN_INFO D_CAN_DRV_DESC "\n");

return platform_driver_register(&d_can_plat_driver);

}

在驱动入口函数d_can_plat_init()中,使用platform_driver_register(&d_can_plat_driver)将结构体变量d_can_plat_driver注册为平台驱动。

static struct platform_driver d_can_plat_driver = {

.driver = {

.name = D_CAN_DRV_NAME,

.owner = THIS_MODULE,

},

.probe = d_can_plat_probe,

.remove = __devexit_p(d_can_plat_remove),

};

平台驱动中,最重要的是探测函数d_can_plat_probe。探测函数主要的工作是获取平台设备传递过来的资源及初始化硬件。下面来看看d_can_plat_probe()函数都做了些什么工作。

static int __devinit d_can_plat_probe(struct platform_device *pdev)

{

int ret = 0;

void __iomem *addr;

struct