您当前的位置:首页 > 美文分享

简述linux(驱动程序的数据封装)

时间:2023-02-10 20:38:15

简述linux(驱动程序的数据封装)

0 .简介

基于ARM内核的SoC在引入设备树技术后,通过设备树文件描述不同的设备,匹配不同的驱动代码,使得一个内核镜像文件可以支持多个设备。这种代码重用的思想不仅体现在设备树文件中,也体现在驱动程序代码中。

其中之一是驱动程序代码中的设备描述表-of_device_id。通过_device_id的数据结构,可以实现将同一个IP集成到不同的SOC中,或者根据应用场景激活不同的功能。

对于同一个IP集成到不同SOC的应用场景,寄存器基址、时钟等参数可能不同,但IP功能基本相同。则可以通过of_device_id中的不同数据条目获得相应的参数信息。比如exynos的dsi IP在不同版本的SoC中有不同的基址,定义了五种SoC类型。dsi探测时获取它在SoC中的基址。

以下驱动程序代码表示模块需要支持各种时钟频率的初始化。可以定义一个of_device_id表,根据匹配的器件信息为每个时钟提供独立的初始化功能。从of_device_id_match_data中获取不同的init_fn,根据不同的dev.of_node执行return init _ fn(NP);

以上应用场景的核心数据结构是of_device_id,关键处理函数是of_device_get_match_data()。当然,关于of_device_id的应用场景不仅限于以上两种。

1.设备标识的数据结构

of_device_id的数据结构如下,在mod_devicetable.h中定义,组成并不复杂。

1设备标识的结构{

2 char name[32];

3 char类型[32];

4 char兼容[128];

5 const void * data

6};

文件mod_devicetable.h一开始没有_device_id的数据结构,这个文件的历史暂时只能追溯到2005年的Linux-2.6.12-rc2。

从原文件中也可以看出它的功能,主要用于PCI和USB设备。它向scripts/table2alias.c提供设备的厂商ID、子系统ID、类等信息,当系统中插入新的PCI或USB设备时,用户空间程序根据相应的厂商ID等信息加载相应的驱动程序。

2005年7月,Linux-2.6.13-rc2中提交了_match_id数据结构的代码。

2.of _设备_获取_匹配_数据()

原型函数位于/device.c的drivers/of中。

1设备获取匹配数据的一致性void *

2构造结构设备*开发)

3{

4 _ device _ id * match的const struct

6 match=of _ match _ device(XXX);

7如果(!匹配)

8返回NULL

10返回匹配-》数据;

11}

12 export _ SYMBOL(of _ device _ get _ match _ data);

根据驱动中_device_id数据的实例化数据结构,该函数的返回值类型可以强制转换为任何类型。当然,因为_device_get_match_data的函数返回值的类型,不需要强制类型转换,所以不会有问题。

在代码中添加以下内容,跟踪of_device_get_match_data的执行过程。

#定义设备id并完成实例化

#添加代码以在探测函数中获取数据

执行结果表明,正确获取了of_device_id的每个实例化成员的value值。

# of _设备_获取_匹配_数据()代码流

有几种情况无法获得数据。

解析dtb后未创建任何设备节点。

驱动程序代码未实现of_device_id设备表。

设备id成员的兼容、名称和类型的值与设备树中定义的值相同。

基于模块加载的热插拔驱动程序,您可以在系统启动后查看设备表信息。以便定位未获得设备表信息的故障原因。

3.查看设备表信息。

查看设备表信息的一个前提条件是,在定义of_device_id时,设备表要通过MODULE_DEVICE_TABLE声明和注册,否则在用户空间看不到。它在/include/linux/module.h中定义,类型可以是of、usb、pci等。name是设备表的名称。

内核中脚本/mod/file2alias.c,用于将设备表导出到用户空间模块。别名中,所以可以直接查看模块。别名文件。

也可以通过摩登信息来查看击倒文件符号信息!

设备表的定义如下,代码定义了名称、类型,那么设备树里同样也要定义:

删除模块_设备_表,模块。别名里是没有设备表信息的。

对于设备身份证明(identification)的而言,名称、类型、兼容添加的方法:

#USB设备表

一构造usb _设备_id {

2

3 __u16匹配标志;

5

6 _ _ u16供应商

7 _ _ u16产品

8 _ _ u16 bcdDevice _ lo

9 _ _ u16 bcdDevice _ hi

10

11

12 _ _ u8 bDeviceClass

13 _ _ u8设备子类

14 _ _ u8设备协议

15

16

17 _ _ u8接口类

18 _ _ u8接口子类

19 _ _ u8接口协议

20

21

22 _ _ u8接口号码

23

24 不匹配

25内核_ulong_t驱动程序_信息

26 _ _ attribute _ _((aligned(sizeof(kernel _ ulong _ t))));

27};

#PCI设备表

一构造pci_device_id {

2 __u32厂商,设备;

3 __u32子供应商、子设备;

4 __u32类,class _ mask

5内核_ulong_t驱动程序_数据;

6};

对于这两种类型的设备,导出的符号信息和普通设备也不一样。

计算机与其外围设备互联标准设备导出到用户空间的设备信息:

导出计算机与其外围设备互联标准设备信息的代码

通用串行总线设备导出到用户空间的设备信息:

导出通用串行总线设备信息的代码

除了上面三种设备描述桌子之外,内核还提供了很多种其他的设备描述表,定义在包含/Linux/mod _ device表。h

mod_devicetable.h的提交日志:

https://git。内核。org/pub/SCM/Linux/kernel/git/Torvalds/Linux。git/log/include/Linux/mod _ device表。h

日本季刊日本季刊

标签:设备deviceID

设备

最新文章