为什么Linux platform驱动的probe函数没有执行到
(2015-01-05 16:54:30)
标签:
it |
分类: Linux驱动 |
Linux 中大部分的设备驱动,都可以使用platform这套机制,设备用 platform_device 表示;驱动用
platform_driver
进行注册。platform机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序中使用这些资源时,通过platform
device提供的标准接口进行申请并使用。
platform是一个虚拟的地址总线,相比 PCI、USB,它主要用于描述SOC上的片上资源。platform
所描述的资源有一个共同点:在CPU
的总线上直接取址。平台设备会分到一个名称(用在驱动绑定中)以及一系列诸如地址和中断请求号(IRQ)之类的资源。
platform驱动的开发步骤是:
1、 设备
需要实现的结构体是:platform_device,定义在include\linux\platform_device.h。
struct platform_device {
const char * name;
int id;
struct device dev;
u32 num_resources;
struct resource * resource;
const struct platform_device_id *id_entry;
struct mfd_cell *mfd_cell;
struct pdev_archdata archdata;
};
然后调用platform_device_register向系统注册设备,这个注册过程一般放在arch\arm\mach-xxx\board-xxx.c的xxx_board_init中。
2、驱动
需要实现的结构体是:platform_driver,定义在include\linux\platform_device.h。
struct platform_driver {
int (*probe)(struct platform_device *);
int (*remove)(struct platform_device *);
void (*shutdown)(struct platform_device *);
int (*suspend)(struct platform_device *, pm_message_t
state);
int (*resume)(struct platform_device *);
struct device_driver driver;
const struct platform_device_id *id_table;
};
在驱动程序的初始化函数中,调用platform_driver_register()注册
platform_driver。
platform_driver和platform_device中的name变量值必须是相同的。在platform_driver_register()注册时,会将当前注册的platform_driver中的name变量值和已注册的所有platform_device中的name变量值进行比较,只有找到具有相同名称的platform_device才能注册成功。当注册成功时,会调用platform_driver结构的probe函数指针。这个过程见函数__driver_attach()(drivers\base\dd.c)。
如果platform_driver和platform_device中的name变量值不同,或platform_device未注册,则platform_driver的probe不会被执行。