plateform平台驱动框架
Plateform平台驱动架构
Plateform驱动平台必要性
对于比较简单的设备驱动,对IO进行最简单的读写操作,可以直接编写驱动代码就可以。对于比较复杂外设,考虑到驱动的可重用性,基于分离与分层的思想,抽象平台设备驱动。
驱动分层与分离
对复杂,成熟,庞大的操作系统,需要考虑代码的重用性。否者,由于代码重复增加,存在大量无意义的代码。以MPU6050这个IIC设备为例,如下所示:
如上所示,每种平台都有主机驱动与设备驱动。由于每个平台的IIC的控制器不同,所以IIC驱动必定是不同的。但是设备可以是一致的,IIC设备可能是多样的,
每个设备都写一个驱动是不推荐的,设备推荐只提供一设备驱动(抽象为一个驱动),简化驱动文件。
驱动获取设备信息,初始化设备。驱动只负责驱动,设备只负责设备。需要将两者匹配。总线(bus),驱动(driver),设备(device)。
Plateform平台驱动模型
基于bus,driver,device这种模型,提出plateform这种虚拟总线,plateform_driver,plateform_device。总线的内容如下所示:
图 3 总线结构内容
Match函数,是匹配功能。完成设备和驱动之间匹配。Match函数的两个参数,struct device,struct device_driver类型就是设备与驱动。
图 4 驱动与设备驱动匹配
of_driver_match_device(dev, drv)是设备树匹配方式。Device_driver结构体中有of_match_table成员变量。此变量保存compatible匹配表,
设备树的每个节点compatible与of_match_table中的成员比较。一般匹配成功之后,probe函数调用。
acpi_driver_match_device(dev, drv)是ACPI的匹配方式。
Id_table匹配,plateform_driver结构体id_table,该id与设备id进行匹配,进而判断匹配。
直接进行driver与device的name的匹配比较,如果字符串相等,匹配成功。
Plateform驱动
Plateform_driver的结构体变量:
图 5 plateform_driver结构体内容
probe函数,如果设备与驱动匹配成功,probe函数是自己编写。
Device_driver为驱动结构体,相当于基类,提供最基础的驱动框架。Plateform_driver就是这个device_driver这个类的子类。
id_table表,一般适用于id_table表,驱动与设备匹配。
Device_driver驱动
图 6 device_driver的结构变量
Plateform_driver的注册
注册
int platform_driver_register (struct platform_driver *driver)
driver是注册的plateform的驱动。
卸载
void platform_driver_unregister(struct platform_driver *drv)
drv是待卸载的plateform的驱动。
Plateform设备
如果没有设备树,可以采用plateform_device来描述设备。
图 7 plateform_device设备内容
*name是设备名字,如果和plateform驱动的name字段相同,表示驱动与设备相匹配。
num_resources 表示资源质量。*resource表示资源的大小。
resource的结构:
图 8 resource的资源内容
Start与end是资源的起始与终止信息,表示内核的起始和终止。Name资源名字,flags表示资源类型。
Plateform_device的设备注册
使用接口函数将平台驱动设备注册到Linux内核中,函数原型:
int platform_device_register(struct platform_device *pdev)
pdev:注册的平台设备
如果不在使用平台设备,使用如下函数来卸载平台设备
void platform_device_unregister(struct platform_device *pdev)
pdev:要注销的 platform_device 设备。