所有驱动都在 设备 总线 驱动 三个模型中
遇到一些看门狗等没有对应总线类型的需要使用虚拟总线
/dev,设备文件存储目录,应用程序通过对这些文件的读写和控制,可以访问实际的设备;
/sys/devices 目录,按照设备挂接的总线类型,组织成层次结构,保存了系统所有的设备;是文件系统管理设备的最重要的目录结构;这是内核设备按总线类型分层放置的目录结构, devices 中的所有设备都是连接于某种总线之下,在这里的每一种具体总线之下可以找到每一个具体设备的符号链接,它也是构成 Linux 统一设备模型的一部分;
/sys/dev 下有两个子目录,block和char,存放的是块设备和字符设备的主次号码,形式为(major:minor),它指向 /sys/devices 目录下的设备。
1. sysfs的挂载点是/sys目录, sysfs是一个虚拟的文件系统(还有其它的虚拟文件系统,例如usbfs和procfs),sysfs导出了内核的数据结构。
2. /sys/dev/ 和/sys/devices是sysfs按面向对象管理的思想来组织,sysfs最主要是用来描绘Linux kernel 2.6中的设备驱动模型,用户态的后台程序会动态地周期性的扫描/sys目录中的属性项来自动管理设备文件(也称为设备节点),从而在/dev目录会建立或者删除对应的设备文件。
总线是处理器和设备间的通道,所有设备都通过总线相连。
由bus_type描述,
注册:bus_register,出现在sysfs下的sys/bus目录下面
删除:bus_unregister
当一个新的驱动或者设备添加到总线的时候, match(driver, device)被调用,来比较驱动和设备是否匹配
uevent产生热插拔事件之前,允许总线事件
总线属性:bus_attribute
1.注册总线,bus_register,包括.name和.match
2.创建属性文件,bus_create_file,包含bus_type和属性操作bus_attr_version
BUS_ATTR是个什么东西,可以变出bus_attr_version
设备 struct device
.bus 对应的总线
.parent
.release
注册device_register
注销device_unregister
创建属性文件device_create_file
删除属性文件device_remove_file
1.注册总线,bus_register,包括.name和.match
2.创建属性文件,bus_create_file,包含bus_type和属性操作bus_attr_version
3.注册总线设备
初始化设备 my_dev.bus_id
注册设备 device_register
创建属性文件 device_create_file
驱动 struct device_driver
当找到与之匹配的设备的时候会调用probe函数指针
.name
.bus 指明总线
.probe 找到设备后调用
.remove 删除时调用
1.注册驱动 driver_register
2.创建属性文件 driver_create_file
问题:
1.什么时候去找对应的设备
在driver_register时寻找
2.找到的标准是什么
由总线的match函数来完成,定义了匹配标准,比如my_match(){return !strcmp(dev->busid, driver->name, strlen(driver->name)}