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 设备。

 

posted @ 2022-07-27 00:01  JwChu  阅读(427)  评论(0编辑  收藏  举报