Linux驱动程序的数据封装 您所在的位置:网站首页 linuxmakefile是干嘛的 Linux驱动程序的数据封装

Linux驱动程序的数据封装

2023-01-22 05:49| 来源: 网络整理| 查看: 265

引言

0

基于ARM内核的SoC在引入设备树技术之后,通过设备树文件来描述不同的设备并匹配不同的驱动代码,使得一个kernel镜像文件可以支持多种设备。这种代码可重用的思想不仅体现在设备树文件中,在驱动代码中同样也有所体现。其中之一就是驱动代码中设备描述表-of_device_id。同一个IP集成到不同SoC或者根据应用场景激活不同功能,可以通过of_device_id这个数据结构来实现。

对于同一个IP集成到不同SoC的应用场景而言,其寄存器基地址以及时钟等参数可能不同,但是IP功能基本一样。那么可以通过of_device_id里的不同data条目获取对应的参数信息。例如exynos的dsi IP,在不同版本的SoC中基地址不同,定义了5种SoC类型。在dsi probe时获取其在SoC中的基地址。

Linux驱动程序的数据封装_数据结构

Linux驱动程序的数据封装_python_02

下面驱动代码表示该模块需要支持多种不同时钟频率的初始化,可以定义一个of_device_id表,根据匹配到的设备信息为每一种时钟提供独立的初始化函数。由of_device_id_match_data获取到不同的init_fn,按照不同的dev.of_node,执行return init_fn(np);

Linux驱动程序的数据封装_编程语言_03

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

数据结构of_device_id

1

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

1struct of_device_id {2 char name[32];3 char type[32];4 char compatible[128];5 const void *data;6};

mod_devicetable.h这个文件最初并没有of_device_id这个数据结构,该文件的历史暂时也只能查到2005年的Linux-2.6.12-rc2

Linux驱动程序的数据封装_linux_04

它的功能从最初的文件中也可以看到,主要是为PCI以及USB设备使用的,将设备的vendor ID、subsystem ID、class等信息提供给scripts/table2alias.c,当系统新插入一个PCI或USB设备时,用户空间程序根据对应的vendor ID等信息来加载对应的驱动程序。

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

Linux驱动程序的数据封装_编程语言_05

         of_device_get_match_data()

2

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

1const void *of_device_get_match_data(2 const struct device *dev)3{4 const struct of_device_id *match;56 match = of_match_device(xxx);7 if (!match)8 return NULL;910 return match->data;11}12EXPORT_SYMBOL(of_device_get_match_data);

这个函数的返回值类型可强制转换成任何类型,取决于驱动程序中例化数据结构of_device_id data。当然,由于of_device_get_match_data的函数返回值类型决定了不做强制类型转换,也不会有问题。

代码中增加下面的内容,来追踪of_device_get_match_data执行流程。

#定义of_device_id并完成例化

Linux驱动程序的数据封装_linux_06

#在probe函数中增加获取数据的代码

Linux驱动程序的数据封装_python_07

执行结果显示正确的获取到了of_device_id各个成员例化的value值

Linux驱动程序的数据封装_linux_08

#of_device_get_match_data()代码流程

Linux驱动程序的数据封装_linux_09

有几种情况是无法获取到数据的

##解析dtb之后未创建设备结点

##驱动代码未实现of_device_id设备表

##of_device_id成员compatible、name、type的值和设备树中定义的同

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

查看设备表信息

3

能够查看到设备表信息的一个前置条件是在定义of_device_id的时候,要将该设备表通过MODULE_DEVICE_TABLE来进行声明注册,否则在用户空间是看不到的。其定义在/include/linux/module.h中。type可以是of、usb、pci等,name为设备表的名字。

Linux驱动程序的数据封装_python_10

内核中scripts/mod/file2alias.c,用于将设备表导出到用户空间modules.alias中,所以可以直接查看modules.alias文件。

Linux驱动程序的数据封装_编程语言_11

也可以通过modinfo来查看ko文件符号信息

Linux驱动程序的数据封装_java_12

设备表的定义如下,代码定义了name、type,那么设备树里同样也要定义:

Linux驱动程序的数据封装_编程语言_13

删除MODULE_DEVICE_TABLE,modules.alias里是没有设备表信息的。

Linux驱动程序的数据封装_linux_14

对于of_device_id而言,name、type、compatible添加的方法:

Linux驱动程序的数据封装_数据结构_15

#USB设备表

1struct usb_device_id {2 /* which fields to match against? */3 __u16 match_flags;45 /* Used for product specific matches; range is inclusive */6 __u16 idVendor;7 __u16 idProduct;8 __u16 bcdDevice_lo;9 __u16 bcdDevice_hi;1011 /* Used for device class matches */12 __u8 bDeviceClass;13 __u8 bDeviceSubClass;14 __u8 bDeviceProtocol;1516 /* Used for interface class matches */17 __u8 bInterfaceClass;18 __u8 bInterfaceSubClass;19 __u8 bInterfaceProtocol;2021 /* Used for vendor-specific interface matches */22 __u8 bInterfaceNumber;2324 /* not matched against */25 kernel_ulong_t driver_info26 __attribute__((aligned(sizeof(kernel_ulong_t))));27};

#PCI设备表

1struct pci_device_id {2 __u32 vendor, device; /* Vendor and device ID or PCI_ANY_ID*/3 __u32 subvendor, subdevice; /* Subsystem ID's or PCI_ANY_ID */4 __u32 class, class_mask; /* (class,subclass,prog-if) triplet */5 kernel_ulong_t driver_data; /* Data private to the driver */6};

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

PCI设备导出到用户空间的设备信息:

Linux驱动程序的数据封装_编程语言_16

导出PCI设备信息的代码

Linux驱动程序的数据封装_数据结构_17

USB设备导出到用户空间的设备信息:

Linux驱动程序的数据封装_编程语言_18

导出USB设备信息的代码

Linux驱动程序的数据封装_python_19

除了上面三种设备描述table之外,kernel还提供了很多种其他的设备描述表,定义在include/linux/mod_devicetable.h

Linux驱动程序的数据封装_python_20

mod_devicetable.h的commit log:

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/include/linux/mod_devicetable.h



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有