一、概述
- 平台总线是一个虚拟总线,抽象层面上外设可以通过平台总线与CPU相连
- 平台设备和平台驱动就像一个人字一样挂在平台总线两侧,当一个新的平台设备或平台驱动被注册进系统,会在另一条枝干上搜索对应的平台驱动或设备,完成初始化
- 平台设备在
/sys/bus/platform/devices下会有相应的文件对应
- 平台驱动在
/sys/bus/platform/drivers下会有相应的文件对应
二、平台设备关键API和结构体
// 注册一个平台设备
int platform_device_register(struct platform_device *pdev);
// 注销一个平台设备
void platform_device_unregister(struct platform_device *pdev);
// platform_device结构体
struct platform_device {const char *name; // 名字int id; // IDstruct device dev; // 继承的deviceu32 num_resources; // 资源数量struct resource *resource; // 资源结构体指针const struct platform_device_id *id_entry; // 设备ID表指针...
};
// 资源结构体
struct resource {resource_size_t start; // 资源起始地址resource_size_t end; // 资源结束地址const char *name; // 名称unsigned long flags; // 标志位unsigned long desc; // 描述信息struct resource *parent, *sibling, *child; // 父资源、兄弟资源、子资源
};
// 资源标志位
#define IORESOURCE_IO 0x00000100 /* PCI/ISA I/O ports */
#define IORESOURCE_MEM 0x00000200
#define IORESOURCE_REG 0x00000300 /* Register offsets */
#define IORESOURCE_IRQ 0x00000400
#define IORESOURCE_DMA 0x00000800
#define IORESOURCE_BUS 0x00001000
三、平台驱动相关API与结构体
// 注册平台驱动
int platform_driver_register(struct platform_driver *driver);
// 注销平台驱动
void platform_device_unregister(struct platform_device *pdev);
// platform_driver结构体
struct platform_driver {int (*probe)(struct platform_device *); // 函数指针int (*remove)(struct platform_device *);void (*shutdown)(struct platform_device *);int (*suspend)(struct platform_device *, pm_message_t state);int (*resume)(struct platform_device *);struct device_driver driver; // 结构体内有name成员,成员与platform_device的name成员匹配后进入probe函数const struct platform_device_id *id_table; // 用于driver和device的匹配,优先级高于name
};
四、其他API与结构体
// 从platform_device结构体中遍历寻找type匹配的第num个资源,返回resource结构体的指针
struct resource *platform_get_resource(struct platform_device *dev, unsigned int type, unsigned int num);