以下为阅读《LINUX设备驱动程序(第三版)》一书第十四章Linux设备模型时的部分内容总结(就是翻译的通俗点,让我自己以后需要复习时能看得容易点),可能有错误或遗漏,请参照原书原文,或留言指正,thanks。
该章先讲解了设备驱动的几个基础概念:kobject、kset、subsystem、sysfs、hotplug、bus、device、device_drive、class。
本文主要总结内核添加设备和删除设备的过程。
//总线结构
struct bus_type{char *name;struct sybsystem subsys;struct kset drivers;struct kset devices;int (*match)(struct device *dev, struct device driver *drv);struct device *(*add)(struct device *parent, char *bus_id);int (*hotplug)(struct device *dev, char **envp, int num_envp, char *buffer, int buffer_size);......
}
//设备结构
struct device{struct device *parent;struct kobject kobj;char bus_id[BUS_ID_SIZE];struct bus_type *bus;struct device_driver *driver;void *driver_data;void (*release)(struct device *dev);......
}
//驱动结构
struct device_driver{char *name;struct bus_type *bus;struct kobject kobj;struct list_head devices;int (*probe)(struct device *dev);int (*remove)(struct device *dev);void (*shutdown)(struct device *dev);......
}
内核中对具体的总线、设备、驱动定义了相应的结构体类型,以 PCI 为例。struct pci_dev 与 struct device 的关系类似于面向对象中的子类与父类的关系。例如,
//总线结构
struct bus_type{char *name;struct sybsystem subsys;struct kset drivers;struct kset devices;int (*match)(struct device *dev, struct device driver *drv);struct device *(*add)(struct device *parent, char *bus_id);int (*hotplug)(struct device *dev, char **envp, int num_envp, char *buffer, int buffer_size);......
}
其中,struct pci_driver 是 struct device_driver 的扩展结构,两者间关系与 pci_dev 与 device 关系类似。
针对 pci 设备,定义 struct pci_bus_type 用于描述 pci 总线结构,它相当于 struct bus_type 的扩展结构。详情参照原书。
为了方便说明,进行以下说明:
驱动程序或设备的初始化时,其结构体 struct device_driver 和 struct device 中的总线类型指针 struct bus_type *bus 需要指向各自挂载的总线结构。
因此,内核添加设备前,需要先注册总线类型,通过调用 bus_register() 可实现。
当内核在某总线上发现新设备时,创建与总线相关的设备结构 struct xxx_dev。
这里主要初始化了 xxx_dev->device 结构。其中:
注册设备设备使用 device_register(&xxx_dev),该函数通过以下操作实现对设备的初始化:
关于bus_type->match()。注册总线前,将bus_type->match()函数指定为 xxx_bus_match()。其实现功能如下:
关于 device_driver->probe()。注册驱动程序前,将 device_driver->probe() 函数值定位 xxx_device_probe()。实现功能如下:
删除设备调用 xxx_remove_bus_device() 函数,该函数进行以下操作:
关于 device_unregister() 。实现功能如下:
关于 kobject_del()。实现功能如下:
添加驱动调用xxx_register_driver()函数,该函数进行以下操作:
关于driver_register()。实现功能如下:
关于 bus_add_driver()。实现功能如下:
删除驱动调用 xxx_unregister_driver() 函数,该函数执行以下操作:
调用 driver_unregister(&xxx_driver->device_driver)
关于 driver_unregister() 函数。实现功能如下:
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态