总线,设备,驱动之间关系

总线,设备,驱动之间关系

再看I2C驱动迷茫时候看到《 从需求的角度去理解Linux系列:总线、设备和驱动 》,感觉豁然开朗,根据博客内容简单总结一下。

1、总线

总线代表同类设备需要共同遵守的时序,不同总线硬件的通信时序也是不同的,如I2c总线、USB总线、PCI总线……

2、设备

设备代表真实存在的物理器件,每个器件有自己不同的通信时序,I2C、USB这些都代表不同的时序,这就与总线挂钩了

3、驱动

驱动代表操作设备的方式和流程,以应用来说,在程序open设备时,接着read这个这个设备,驱动就是实现应用访问的具体过程。驱动就是一个通信官和翻译官,一是通过对soc的控制寄存器编程,按总线要求输出相应时序的命令,与设备交互,一是对得到数据进行处理,给上层提供特定格式数据。

  • 不同总线的设备驱动过程不同
  • 同一总线的不同类型设备驱动不同,光感和加速度
  • 同一总线的同类设备驱动不同,多点触控和单点触控

驱动重点关注操作的流程和方法,如果在驱动中直接针对具体的引脚来编程,其驱动的平台可移植性就比较差,为了提高驱动的可移植性,Linux把驱动要用到的GPIO和中断等资源剥离给设备去管理。即在设备里面包含其自己的设备属性,还包括了其连接到SOC所用到的资源。

1.1、总线-2

软件层面总线职责,负责管理设备和驱动

  • 设备和驱动要让系统感知自己,需要向总线注册自己,并且明确自己所属的总线
  • 总线上的设备和驱动匹配,总线充当红娘角色,设备提自己对驱动条件(名字),驱动告知总线自己支持设备条件(型号ID、名字),那设备在注册的时候,总线就会遍历注册在它上面的驱动,找到最适合这个设备的驱动,然后填入设备的结构成员中;驱动注册的时候,总线也会遍历注册在其之上的设备,找到其支持的设备(可以是多个,驱动和设备的关系是1:N),并将设备填入驱动的支持列表中。即总线中match干的事情。
  • 总线匹配后还不知道设备是否正常,这个时候驱动就需要探测一下,即驱动里probe干的事情,他负责与具体设备交互`if(match(device, driver) == OK); driver->probe();

1.2、驱动-2

在设备探测成功后,驱动就开始工作了

  • 探测成功,这个时候就可供应用层使用,但是设备文件,so……在probe成功之后,正好可以创建设备文件。通过sysfs文件系统、uevent事件通知机制和后台应用服务mdev程序配合能够成功地在/dev目录创建对应的设备文件
  • 建立VFS和设备文件之间联系,需要open、read、write、ioctl,即要建立和驱动file_operation的结构体关系,这就是cdev_add要干的事情,这样就建立起应用层操作->虚拟文件系统操作->具体文件系统操作->具体设备驱动的操作
    • 在驱动的构体中probe要完成工作就很明朗了,Driver->probe()
      1. 探测设备是否正常
      2. cdev_add(struct file_operations)注册操作接口
      3. device_create()创建设备文件

4、再来理解IIC设备

总线上先添加好IIC驱动,i2c.c遍历i2c_boardinfo链表,依次建立i2c_client,并对每一个i2c_client与所有在在这个线上的驱动匹配match,匹配上就调用该驱动的probe函数完成设备文件创建,操作接口注册。

你可能感兴趣的:(Linux)