本帖最后由 robe.zhang 于 2021-7-27 20:48 编辑
【ALINX AXU2CGB试用】从 linux 驱动模型的角度看 iic 总线框架
Linux 驱动模型中有 bus,device,driver 三部分,这个是软件的抽象,软件中的概念,看很多地方喜欢拿这个概念和实体总线对比,个人感觉不能比较,为什么这么说,先看iic驱动吧:
Iic 主机使用的 platform driver,platform 平台驱动
Iic eeprom 从机使用的module,基础的模块去初始化驱动。 结果也看到了, eeprom 能工作,而且工作的好好的。
是不是有一大堆疑问: 1, iic 主机为什么不在 iic 总线上?可是偏偏还能工作? 2,iic 主机为什么在 platform 平台总线上? 3,iic 设备又为什么使用基础的模块去初始化驱动?
Linux 驱动模型中的 bus devicedriver ,看作是软件中实现设备支持的一种组织方式,本文叫它组织形式,这种形式分为 bus,device,driver,如果你自己写一个内核,你可以把这种形式分为狗窝,小狗,狗食,同样也可以。
Iic 主机设备被解析为platform 设备,与此匹配的驱动,也需要注册为 platform 驱动,因为都是 platform 平台,才是一个组织,才能适配。 所以iic主机的驱动,也必须注册为 platform驱动,不然不在一个组织形式中,找不到无法适配,驱动就不会工作,硬件也就不能工作。 现在Iic 主机驱动搞定了。 iic 从机设备被iic主机驱动解析为 iic 总线设备, eeprom 驱动也要注册为 iic 驱动,所以 eeprom 驱动要注册为 iic 驱动才可以工作。Module_init 仅仅是模块初始化接口,at24_init 初始化函数中注册了 iic 总线驱动,现在Iic 从机驱动也搞定了。
问题又来了: 1, iic 总线从哪来 2, iic 主机在哪里注册的 3, Iic 从机在软件层面怎么挂在 iic 主机上?
Iic 总线从哪来,系统初始化创建起来的。如笔者往期文章中有详细分析 【ALINXAXU2CGB试用】IIC 核心驱动框架源码分析 https://www.cirmall.com/bbs/thread-206787-1-1.html
iic 主机是在 platform driver驱动中又重新注册为 iic 主机的。Iic 主机有了 Iic 从机在软件层面上挂载到总线上,主要依赖设备树中的树形结构,同时也是iic 主机驱动解析过程实现的,在核心层实现。Iic 从机也挂在iic主机上了,此处也仅仅是组织形式,软件上并不像硬件总线需要两根线路实现连接。
说了这么多驱动模型,设备树结构,等等,都是抽象的概念,最好自己详细透彻的分析一下驱动,本文所有概念都会有自己独特的认知。
电路板上的Iic总线是实体总线,iic实体总线上挂着主机和从机,iic 实体总线是用来传输信号,实现主从机通信的。
然而驱动层面的总线也有 iic 总线, platform 总线,SPI总线等等,驱动的总线挂着device,还挂着 driver,是便于实现 device 和 driver 适配的一种组织形式。
所以驱动中总线的概念,和实体总线,不同类不要比较,这也是笔者不建议把这两类东西放一起比较的原因。
Linux 驱动中的《iic总线》,和硬件电路板中的《iic总线》,不是一个东西,不是一个概念,仅仅名字相同而已。
|