总线驱动框架的基本实现:
1.设备:
(1)struct device,这个结构体是所以设备的公共部分的一个软件抽象;
(2)struct xxx_device,这个结构体内包含struct device结构体,每一个结构体代表一种硬件设备;
(3)driver_register是内核提供的注册设备结构体的接口函数。
2.驱动:
(1)struct device_driver,是驱动程序在内核中的抽象;
(2)其中的两个元素很重要:name:用于和device结构体进行匹配,实现硬件的驱动;prob:用来检测一个设备是否可以被该驱动所管理。
总结:设备代表硬件,驱动代表软件,当两者相遇时才构成一个完整的驱动。
3.总线:
负责将设备和驱动进行管理,最终完成具体的硬件操作。
注:linux系统中使用多种方式对设备驱动进行管理,其中除了总线类bus外还有类class的方式。
platform平台总线的工作流程:
1.系统负责启动时在bus系统中注册platform;
2.内核移植的人负责提供具体硬件对应的platform_device结构体;
3.写驱动的人负责提供platform_driver,也就是编写驱动实现相关的代码;
4.platform平台总线架构中的match函数发现driver和device匹配后,调用driver的probe函数来完成驱动的初始化和安装,之后设备就可以正常的工作了。
平台总线的分析:
1.设备:结构体platform_device,注册接口:platform_device_register
struct platform_device {
const char * name;
int id;
struct device dev;
u32 num_resources;
struct resource * resource;
const struct platform_device_id *id_entry;
/* arch specific additions */
struct pdev_archdata archdata;
};
name:平台总线下设备的名字;
dev:所有设备通用属性的结构体;
num_resources:设备使用到的resource个数;
resource:设备使用到的资源使用一个数组来管理,这个指针变量指向数组的首地址;
id_entry:平台总线设备id表;
archdata:自留地,开发者自己添加设备特有的内容,用于扩展。
2.驱动:结构体platform_driver,注册接口:platform_driver_register
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;
};
probe函数:驱动探测函数,一般使用对设备进行初始化,检测设备是否通讯正常,是否可用;
remove函数:卸载驱动;
shutdown函数:关闭设备;
resume函数:设备的唤醒,与shutdown函数完成电源管理类似的功能;
suspend函数:挂起一个设备;
struct device_driver driver:驱动所共有的部分;
const struct platform_device_id *id_table:设备id表;
End。。。。。。