1.概要
linux平台设备总线由两部分构成,一部分表是设置,一部分表示驱动;
为什么这么分呢,其实任何分层的目的都是为了,隔离变化;
这里也不例外,任何设备的主要目的都是为了给客户使用,那么用户使用的是什么,驱动。对于用户,有驱动就够了,但是同类的设备有很多,用户的使用都大致相同,那么就把同类设备统一起来,供用户使用,这就构成了用户和操作系统的接口。
不同的驱动,为操作系统提供相同的接口,内部处理自身的差异,这就是驱动的价值。
同类的设备,驱动也几乎相同的,只是驱动内部处理数据的时候,对应的硬件寄存器的地址有些差异,那么将这部分差异用设备树体现,那么驱动就变得更稳定了,更换不同的硬件,只需要调整设备树的配置就可以了;
2.内容
Linux平台设备总线是Linux内核中一个重要的概念,主要用于管理那些不通过传统物理总线(如USB、I2C、SPI等)连接的设备,特别是SoC(System on Chip,片上系统)内部集成的外设。以下是对Linux平台设备总线的详细介绍:
一、平台设备总线简介
- 定义:平台设备总线是Linux内核为了保持设备驱动的统一性而虚拟出来的一条总线。它并非物理上存在,而是一种软件抽象,用于连接设备与驱动。
- 目的:解决嵌入式系统中,部分设备(如SoC内部集成的外设)不依附于传统物理总线的问题,使得所有设备都能通过统一的机制进行管理和注册。
二、平台设备总线的组成部分
- 平台设备(Platform Device):表示platform总线下的设备。每个platform_device都包含设备的名称、ID、资源(如内存地址、中断号等)以及设备特定的数据。
- 平台驱动(Platform Driver):表示驱动程序,用于与platform_device进行匹配并控制设备。每个platform_driver都包含探测(probe)函数、移除(remove)函数等,用于设备的初始化和卸载。
三、平台设备总线的工作机制
- 注册:设备驱动开发人员负责编写并注册platform_driver,包括探测函数、移除函数等。同时,也需要注册platform_device,包括设备名称、资源等信息。
- 匹配:平台总线的匹配函数会检查已注册的platform_device和platform_driver,当发现匹配的设备和驱动时,会调用驱动的probe函数进行初始化,使设备进入工作状态。
- 统一管理:通过platform总线,Linux内核能够对所有设备(包括传统物理总线设备和SoC内部外设)进行统一管理,提高了系统的整体性和一致性。
四、平台设备总线的优势
- 提高代码可移植性:平台总线使得设备与驱动的注册和匹配过程更加标准化,降低了代码对特定硬件的依赖,提高了代码的可移植性。
- 简化驱动开发:对于SoC内部集成的外设,开发者无需关注复杂的总线通信协议,只需通过platform总线即可实现设备与驱动的连接和控制。
- 抽象化硬件细节:平台设备总线将低层的硬件(如CPU架构、I/O接口等)与驱动程序解耦,驱动程序只需要控制平台设备,而不用关心硬件接口的差异。
- 统一属性管理:平台设备统一了对设备资源的描述方式,如中断、I/O内存、DMA通道等。
五、平台设备总线的应用场景
在嵌入式系统开发中,platform总线被广泛应用于SoC内部外设的管理和驱动开发中。例如,LED灯、看门狗定时器、串口控制器等都可以作为platform_device进行注册和管理,并通过相应的platform_driver进行控制。
六、相关API函数
- 注册平台设备:
int platform_device_register(struct platform_device *pdev)
- 注销平台设备:
void platform_device_unregister(struct platform_device *pdev)
- 注册平台驱动:
int platform_driver_register(struct platform_driver *drv)
- 注销平台驱动:
void platform_driver_unregister(struct platform_driver *drv)
这些API函数提供了在Linux内核中注册和注销平台设备及驱动的能力,是平台设备总线机制实现的关键。
综上所述,Linux平台设备总线是一种虚拟的总线机制,它通过软件抽象的方式解决了嵌入式系统中设备管理和驱动开发的复杂性问题,为开发者提供了更加统一、简化和高效的开发环境。