Linux内核之BUS驱动设备模型理解
来源:互联网 发布:centos 安装 分区 编辑:程序博客网 时间:2024/06/06 04:28
声明:也是参考前面两位大神而写出来的。作为学生,如果有不对的,不喜勿喷。进入正题。
1.BUS相关的数据结构
struct bus_type { //bus的名称, const char *name; //bus相关的属性 struct bus_attribute *bus_attrs; //device相关的属性 struct device_attribute *dev_attrs; //驱动相关的属性 struct driver_attribute *drv_attrs; //用来匹配设备和对应的驱动实际调用的函数,1代表匹配成功,0就失败 int (*match)(struct device *dev, struct device_driver *drv); //总线对uevent的环境变量添加,大体我也不明白 int (*uevent)(struct device *dev, struct kobj_uevent_env *env); //在匹配成功时调用的函数,bus->probe和drv->probe中只会有一个起效,同时存在时使用bus->probe。 int (*probe)(struct device *dev); //顾名思义,删除设备和驱动的函数 int (*remove)(struct device *dev); void (*shutdown)(struct device *dev); int (*suspend)(struct device *dev, pm_message_t state); int (*resume)(struct device *dev); const struct dev_pm_ops *pm; struct bus_type_private *p;};
struct bus_type_private { //代表BUS所属类型 struct kset subsys; //代表bus目录下的drivers子目录。 struct kset *drivers_kset; //代表bus目录下的deivce子目录 struct kset *devices_kset; //管理设备的链表 struct klist klist_devices; //管理驱动的链表 struct klist klist_drivers; struct blocking_notifier_head bus_notifier; unsigned int drivers_autoprobe:1; struct bus_type *bus;};
struct bus_attribute { //相关的属性 struct attribute attr; //绑定读的函数 ssize_t (*show)(struct bus_type *bus, char *buf); //绑定写的函数 ssize_t (*store)(struct bus_type *bus, const char *buf, size_t count); };
BUS_ATTR宏就是定义 一个bus_attribute类型的结构体变量并且填充它
#define BUS_ATTR(_name, _mode, _show, _store) \struct bus_attribute bus_attr_##_name = __ATTR(_name, _mode, _show, _store)
这样做 方便设置bus的属性
2.看设备驱动框架的代码,我建议还是从下往上看,因为初始化的代码一般都放在下面。从下网上分析,可以直观的看出它的整体结构逻辑。
int __init buses_init(void){ bus_kset = kset_create_and_add("bus", &bus_uevent_ops, NULL); if (!bus_kset) return -ENOMEM; return 0;}
(1)kset_create_and_add函数,这个函数在device的创建我已经讲过了,这里做个总结:
1.kset_create函数创建一个容器【设置容器里面对象的名字;填充它的uevent_ops(这个不太懂略过)、kobj.parent(对象所属的父类,因为bus没有父类,所以是NULL)、kobj.ktype(对象的属性和读写操作)、kobj.kset(设置所属的容器,BUS就是一个容器,所以等于NULL)】
2.kset_register函数,里面重要的函数就是kobject_add_internal,这个函数对kset里面的kobject设置了正确的所属关系(也就是设置parent和kset),并且创建了kobject为名字的目录(创建这个目录的代码我也看不懂,能力有限)
3.具体的bus目录就建立起来了。从这里看,bus和device的建立过程大体上是相同的。
0 0
- Linux内核之BUS驱动设备模型理解
- linux内核组件分析之--设备驱动模型之bus
- linux内核组件分析之--设备驱动模型之bus
- linux内核组件分析之--设备驱动模型之bus
- Linux内核部件分析--设备驱动模型之bus
- Linux内核部件分析<8> 设备驱动模型之bus
- Linux内核部件分析--设备驱动模型之bus
- Linux内核部件分析 设备驱动模型之bus
- Linux内核部件分析 设备驱动模型之bus
- 嵌入式linux平台设备驱动(设备驱动模型)开发之linux内核中bus总线
- linux设备驱动模型之bus
- Linux设备驱动模型-Bus
- linux内核部件分析(八)——设备驱动模型之bus
- linux内核部件分析(八)——设备驱动模型之bus
- linux内核部件分析(八)——设备驱动模型之bus
- linux内核部件分析(八)——设备驱动模型之bus
- linux内核部件分析(八)——设备驱动模型之bus
- 设备驱动模型之bus
- 图片下拉放大 自定义scrollView
- ubuntu 下su root 失败su: Authentication failure
- 细节记录
- mysql之select 查询表数据(一)
- UIActionSheet/ UIAlaterView/UIAlertController
- Linux内核之BUS驱动设备模型理解
- php中引入facebook的messenger消息接口
- Java 多线程(四) 多线程访问成员变量与局部变量
- c语言的四个标准
- maven项目少lang的包
- 二分法学习总结
- MySql创建表
- 三星遭遇2016
- 面试总结