platform平台总线是Linux内核中一个重要的概念,主要用于管理那些不通过传统物理总线(如USB、I2C、SPI等)连接的设备,特别是SoC(System on Chip,片上系统)内部集成的外设。以下是对platform平台总线的详细介绍:
一、基本概念
定义:platform平台总线是Linux内核为了保持设备驱动的统一性而虚拟出来的一条总线。它并非物理上存在,而是一种软件抽象,用于连接设备与驱动。
目的:解决嵌入式系统中,部分设备(如SoC内部集成的外设)不依附于传统物理总线的问题,使得所有设备都能通过统一的机制进行管理和注册。
二、主要组成部分
platform_device:表示platform总线下的设备。每个platform_device都包含设备的名称、ID、资源(如内存地址、中断号等)以及设备特定的数据。
platform_driver:表示驱动程序,用于与platform_device进行匹配并控制设备。每个platform_driver都包含探测(probe)函数、移除(remove)函数等,用于设备的初始化和卸载。
三、工作流程
(1)系统启动时注册platform总线:在系统启动过程中,Linux内核会在bus系统中注册platform总线,为其后续的设备和驱动管理提供基础。
bus_type结构体:
(2)注册platform_device:内核移植人员负责将SoC内部集成的外设注册为platform_device,包括设备的名称、ID、资源等信息。
- name:设备的名称,用于与驱动程序进行匹配。
- id:设备的ID号,用于区分相同名称下的不同设备实例。匹配名字,-1时不匹配id_entryid_entry
- dev:一个嵌套的
device
结构体,包含了设备的通用设备信息,如设备在设备模型中的抽象表示。 - num_resources 和 resource:分别表示设备资源的数量和指向资源描述符数组的指针,这些资源包括设备的物理地址、中断号等。
- start:资源的起始地址或编号。对于内存资源,这通常是内存的起始物理地址;对于I/O端口资源,这是端口的起始编号;对于中断资源,这是中断号。
- end:资源的结束地址或编号。这定义了资源范围的上限,确保驱动程序不会超出设备所占用的资源范围。
- name:资源的名称。这是一个字符串,用于标识资源,但通常不直接用于驱动程序的匹配或资源请求。
- flags:资源的类型和属性。这个字段是一个位掩码,用于指示资源的具体类型和可能的其他属性。Linux内核定义了多个宏来表示不同类型的资源,如
IORESOURCE_MEM
(内存资源)、IORESOURCE_IO
(I/O端口资源)、IORESOURCE_IRQ
(中断资源)等。此外,还可以设置其他标志位来表示资源的特定属性,如IORESOURCE_PREFETCH
(可预取的内存资源)等。
- id_entry:用于匹配设备和驱动程序的ID结构体指针。
- pdriver:指向设备对应的平台驱动程序的指针。
(3)注册platform_driver:设备驱动开发人员负责编写并注册platform_driver,包括探测函数、移除函数等。