第17章 I2C、SPI、USB驱动架构类比

17.1 I2C、SPI、USB驱动架构

    

17.1 Linux设备驱动的主机、外设驱动分离

        根据图17.1,Linux倾向于将主机端的驱动与外设端的驱动分离,而通过一个核心层将某种总线的协议进行抽象,外设端的驱动调用核心层API间接过渡到对主机驱动传输函数的调用。对于I2C、SPI(I2C、SPI具备热插拔能力)总线,一般在arch/arm/mach-xxx或者arch/arm/boot/dts中会有相应的板级描述信息,描述外设与主机的连接情况。

    表17.1 I2C、SPI、USB驱动架构的类比


    对于具备热插拔能力的总线,例如:USB、PCI等,不存在类似I2C、SPI这样的板级描述信息。注意到,I2C、SPI、USB控制器虽然给别人提供了总线,但是其实自己也是由其自身依附的总线枚举出来的。比如,对于SoC而言,这些控制器一般是直接集成在芯片内部,通过内存访问指令来访问的,因此I2C、SPI和USB自身是通过platform_driver、platform_device这种模型枚举进来的。

17.2 I2C主机和外设眼里的Linux世界

    I2C控制器所在驱动的platform_driver与arch/arm/mach-xxx中的platform_device(板级信息或者设备树中的节点),通过platform总线的match()函数匹配,导致platform_driver中的探测probe()函数执行,从而完成I2C控制器的注册;而I2C上面挂的触摸屏依附的i2c_driver(I2C外设驱动)与arch/arm/mach-xxx中的i2c_board_info指向的设备(或者设备树中的节点),通过I2C总线的match()函数匹配,导i2c_driver(I2C外设驱动)中的探测probe()函数执行,从而使触摸屏展开。

    图17.2虚线上方部分是i2c_adapater(主机控制器)眼里的Linux世界;下方部分是i2c_client(I2C外设)眼里的Linux世界。其实,Linux中的每一个设备通过自己依附的总线被枚举出来,尽管它自身可能给别人提供总线。


图17.2 I2C主机和外设眼里的Linux世界



猜你喜欢

转载自blog.csdn.net/xiezhi123456/article/details/80605603
今日推荐