一、设备驱动
1、字符设备驱动(基于文件,以字节单位接受输⼊、返回输出 file_operations)
字符设备驱动最多,例如led、gpio、i2c 、spi等常用的都是字符设备,杂项设备也一种特殊的字符设备
2、块设备驱动(基于文件,块单位接受输⼊、返回输出 block_device_operations)
以存储块为基础的存储设备,如NAND、EMMC 、 SD、U盘等块设备
3、网络设备驱动(基于⽹络套接字 net_device)
有线、无线网络设备均属于网络设备,USB WIFI网卡就属于多种设备驱动(字符+网络设备)
二、devfs 文件系统(2.6内核以前使用)
1、devfs挂载于/dev目录下,提供了⼀种类似于⽂件的⽅法来管理位于/dev⽬录下的所有设备,在/dev目录下每个文件对应一个设备,我们通过对文件的读写、控制以实现设备访问。
缺点:①不确定的设备映射;②没有足够的主、辅设备号;③机制和策略都放到内核空间。
基于上述的缺点,使用用户空间的工具udev实现设备访问(兼容2.6之后引入的工具),其实udev实际使用sysfs提供的信息来实现所有的devfs的功能。
三、sysfs文件系统(2.6内核之后使用)
1、sysfs文件挂载/sys目录下,它把实际连接到系统上的设备和总线组织成⼀个分级的⽂件,它们可以由⽤⼾空间 存取,向⽤⼾空间导出内核数据结构以及它们的属性。
2、sysfs 分离出device_driver 、device,两者通过bus_type进⾏匹配,⼀旦匹配成功,xxx_driver的 probe函数则被执⾏(xxx为总线名,如platform pci i2c spi usb等)。它是通过kobject⼦系统来建⽴这个信息的,当⼀个kobject被创建的时候,对应的⽂件和⽬录也就被 创建了,既然每个设备在sysfs中都有唯⼀对应的⽬录。
3、sysfs通过cdev_init和cdev_add添加字符设备,通过class_create和 device_create函数往sys⽂件系统中添加设备,udev检测到/sys⽬录的变动会根据变化在/dev⽬录 下创建对应的设备节点
四、platform 设备驱动框架(platform 驱动并不是独⽴于字符设备驱动、块设备驱动和⽹络设备驱动之外的其他种类的驱 动。platform 只是为了驱动的分离与分层⽽提出来的⼀种框架,其驱动的具体实现还是需要字符设 备驱动、块设备驱动或⽹络设备驱动)
1、从Linux2.6内核之后,引⼊了⼀套新的驱动管理和注册机制:platform_bus、platform_device和platform_driver。设备使用platform_device(后续开发可用DTS替代), 驱动使用platform_driver表示。
六、用户空间访问驱动程序
1、通过dev设备文件访问,“read/write/ioctl”访问
2、通过procfs接口访问
3、通过sysfs访问
标签:内核,sysfs,platform,devfs,device,驱动,设备 From: https://www.cnblogs.com/zblblog/p/18156856