目录
平台总线模型也叫platform总线模型,是linux内核虚拟出来的一条总线,不是真实的导线
平台总线是以名字来匹配的,实际上就是字符串比较,
主要就是把原来的驱动.c文件分为两个c文件,一个驱动,c,一个设备,c
- 把稳定不变的放到驱动,c
- 需要变得放在设备.c
- 一个是 device.c,一个是 driver.c,然后分别注册 device.c和 driver.c
- device是设备,主要处理与具体设备相关的配置和操作。这个文件通常包含平台设备的定义、资源分配、设备初始化以及设备注册等操作
- 定义设备的硬件资源,如 I/O 端口、内存区域、中断号等
- 设备初始化和退出函数。这些函数负责在设备加载和卸载时,进行硬件初始化和资源释放
- 通过
platform_device_register
函数将设备注册到内核中,使得设备可以被相应的驱动程序识别并操作
- driver是驱动,处理驱动程序的实现,负责与设备进行交互,管理设备的生命周期(例如初始化和清理),并提供设备与操作系统之间的接口
- 定义驱动程序的
probe
和remove
回调函数,这些函数在设备被检测到和移除时被调用 - 处理设备的注册和注销。通过
platform_driver_register
和platform_driver_unregister
函数将驱动程序注册到内核中 - 实现设备的操作逻辑,如打开、关闭、读写操作等
- 定义驱动程序的
- device是设备,主要处理与具体设备相关的配置和操作。这个文件通常包含平台设备的定义、资源分配、设备初始化以及设备注册等操作
作用
- 可以提高代码的重用性
- 减少重复性代码
优点
- 驱动和设备代码分开
- 都挂在总线上,方便管理
注册platform设备
平台总线注册一个 device.c
device.c里面写的是硬件资源,这里的硬件资源是指寄存器的地址,中断号,时钟等硬件
资源。
在linux中是用一个结构体来描述硬件资源,定义在linux/include/platform_device.h中
struct platform_device{
const char *name;
int id;
bool id_auto;
struct device dev;
u32 num_resources;
struct resource *resource;
const struct platform_device_id *id_entry;
char *driver_override;
struct mfd_cell *mfd_cell;
struct pdev_archdata archdata;
};
- 主要参数
- name:平台总线进行匹配的时候用到的name,并且在sys/bus/platform.devices/目录下会生成一个name文件
- id:设备id,一般为1,相同name的设备编号
- dev:设备通用储存的部分,内嵌的device机构提
- numresources:资源的个数
- resources:硬件资源
struct resource{ resource_size_t start; resource_size_t end; const char *name; unsigned long flags; struct resource *parent,*sibling,*child; };
- start:资源的起始
- end:资源的结束
- name:资源的名字
- flags:资源的类型
- IORESOURCE_IO