Linux设备驱动模型(sysfs)
<总线模型概述>
随着技术的发展,系统的拓扑结构也越来越复杂,对热插拔。跨平台移植性的要求越来越高,从Linux2.6内核开始提供全新的设备模型。将所有的驱动挂载到计算机的总线上(比如USB总线),当有设备连接到总线上的时候,总线能够感知到,这时系统就会把挂载到总线上是所有驱动和设备匹配。通过不同的识别方式,知道找到相应的驱动。
<总线设备驱动>
定义并描述总线设备:
struct bus_type{
const char //总线名称
int(*match)(struct device *dev,struct device_driver *drv); //驱动和设备的匹配函数
}
向linux系统注册总线:
bus_register(struct bus_type *bus)
如果注册成功,新总线将被添加进系统,并在/sys/bus下看到相应的目录。
向Linux系统注销总线:
void bus_unregister(struct bus_type *bus)
定义并描述Linux总线驱动:
struct device_driver{
const char ;//驱动名称
struct bus_type *bus;//驱动程序所在总线
int (*probe)(struct device *dev);
}
向Linux系统注册总线驱动:
int driver_register(struct device_driver *drv)
向Linux系统注销总线驱动:
void driver_unregister(struct device_driver*drv)
<设备>
描述设备:
struct device
{
const char *name ; //设备的名称
struct bus_type *bus;//设备所在的总线
}
注册:
int device_register(struct device *dev)
注销:
void device_unregister(struct device *dev)
在总线上挂载一个设备:
平台总线对总线驱动模型做详细的讲解:
<平台总线设备设计>
1)平台总线概述
平台总线(platform bus)是Linux2.6内核中加入的一种虚拟总线,其优势在于采用了总线模型对驱动和设备进行管理,这样提高了程序的可移植性。也就是说内核中已经给我们创建好了这种总线,只需要将设备和驱动挂在到总线上就行了。
平台总线开发流程:
平台总线设备和驱动的匹配机制:
(1)如果驱动中有id_table ,这就用设备号进行匹配
(2)但是大多是用设备名和驱动名进行匹配
2)平台设备
描述平台设备:
struct platform_device{
const char *name;//设备名
int id;//设备编号,配合设备名使用
struct device dev;
u32 num_resources;
struct resource *resource ; //设备资源
};
注意:设备资源,主要是指设备中的寄存器,中断号等。
struct resource {
resource_size_t start;
resource_size_t end;
const char *name;
unsigned long flags;//资源类型,内核已经用宏定义好了
struct resource *parent,*sibling,*child;
};
注册平台设备:
int platform_device_register(struct platform _device *pdev)
3)平台驱动
描述平台结构:
struct platform_driver{
int (*probe)(struct platform_device *);
int(*remove)(struct platform_device *);
...............
}
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">