Linux平台设备驱动
Fang XS. 1452512966@qq.com 如果有错误,希望被指出
平台设备驱动
平台设备驱动是将硬件部分的代码与驱动部分的代码分开,注册到平台设备总线中。
平台设备
平台设备的工作是为驱动程序提供设备信息,设备信息包括硬件信息和软件信息两部分。 硬件部分包括寄存器,中断号,内存资源,IO等。 软件部分包括以太网卡设备中的MAC地址、I2C设备中的设备地址、SPI设备的片选信号线等。
平台设备device.c
device.c
首先实现struct platform_device
结构体,注册平台设备。平台设备用struct platform_device
结构体进行描述。
struct platform_device {
const char * name;
int id;
bool id_auto;
struct device dev;
u32 num_resources;
struct resource * resource;
const struct platform_device_id * id_entry;
char * driver_override;
struct mfd_cell * mfd_cell;
struct pdev_archdata archdata;
} ;
平台设备的硬件资源用struct resource
进行描述。 注册平台设备
int platform_device_register ( struct platform_device * pdev) ;
void platform_device_unregister ( struct platform_device * pdev) ;
设备树
未使用设备树的平台总线驱动是device.c
+driver.c
。 其中device.c
用来描述设备信息,driver.c
用来描述设备的驱动。 而设备树下的平台总线驱动是设备树+driver.c
。 其中原来用于描述设备信息的device.c
,使用设备树语法进行描述。 也就是非设备树平台总线驱动是device.c
+driver.c
。 设备树下的平台总线驱动在设备树里添加相应节点,用driver.c
来写驱动。
平台驱动
平台驱动driver.c
driver.c
首先实现struct platform_driver
结构体,注册平台驱动。内核中使用struct platform_driver
结构体来描述平台驱动。
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;
bool prevent_deferred_probe;
} ;
int platform_driver_register ( struct platform_driver * drv) ;
void platform_driver_unregister ( struct platform_driver * drv) ;
# define module_platform_driver ( __platform_driver) \
module_driver ( __platform_driver, platform_driver_register, \
platform_driver_unregister)
注
在平台设备,平台驱动加载的时候,没有先后顺序。 平台设备与平台驱动匹配条件,满足一条即可
struct platform_driver::driver::name
与struct platform_device::name
相同struct platform_driver::id_table::name
与struct platform_device::name
相同id_table
匹配优先级高于driver::name
,id_table
存在以id_table
为准。
probe
函数
struct platform_driver
中的int (*probe)(struct platform_device *);
函数指针必须实现probe
函数执行的条件是平台设备和平台驱动匹配成功,或者设备树某节点compatible
属性与平台驱动匹配成功当平台驱动与平台设备匹配成功,将自动执行probe
函数,在probe
函数中可以获取平台设备或设备树资源,再创建字符设备、杂项设备等。