1.一个重要思想
分离思想:将设备和驱动进行分离,各自管理。直到一端加入到总线,进行匹配。
2、什么是platform总线?
相对于USB、PCI、I2C、SPI等物理总线来说,platform总线是一种虚拟、抽象出来的总线,实际中并不存在这样的总线。那为什么需要platform总线呢?其实是Linux设备驱动模型为了保持设备驱动的统一性而虚拟出来的总线。因为对于usb设备、i2c设备、pci设备、spi设备等等,他们与cpu的通信都是直接挂在相应的总线下面与我们的cpu进行数据交互的,但是在我们的嵌入式系统当中,并不是所有的设备都能够归属于这些常见的总线,在嵌入式系统里面,SoC系统中集成的独立的外设控制器、挂接在SoC内存空间的外设却不依附与此类总线。所以Linux驱动模型为了保持完整性,将这些设备挂在一条虚拟的总线上(platform总线),而不至于使得有些设备挂在总线上,另一些设备没有挂在总线上。
platform总线相关代码声明:linux/platform_device.h 文件
3、platform总线的两个重点结构体platform_device和platform_driver
对于任何一种Linux设备驱动模型下的总线都由两个部分组成:描述设备相关的结构体和描述驱动相关的结构体在platform总线下就是platform_device和platform_driver,下面是对两个结构体的各个元素进行分析:
(1)platform_device结构体及其中的结构体分析
struct platform_device {
const char * name; //平台设备的名字
int id; //ID区分设备名字,如果一个驱动对应一个设备,传-1
struct device dev; //描述设备信息device结构体
u32 num_resources; //资源结构体数量,资源信息结构体数组的大小
struct resource * resource; //资源结构体,一般定义一个数组
};
struct device {
struct device_driver *driver; //设备驱动的结构体指针
struct device_node *of_node; //设备树节点
u32 id;
void (*release)(struct device *dev); //设备端卸载的时候,须调用的函数
};
struct resource {
resource_size_t start