简述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
- 1bat的大数据(BAT的大数据来源)
- 2三星s8屏幕上端2(三星s8屏幕上端2个按键)
- 3三星屏幕坏了如何导出(三星屏幕摔坏了如何导出数据么)
- 4红米3x怎么关闭自动更新(红米k40s怎么关闭自动更新)
- 5微信上防止app自动下载软件怎么办(微信上防止app自动下载软件怎么办啊)
- 6押镖多少钱(押镖一个月有多少储备金)
- 7瑞星个人防火墙胡功能(瑞星个人防火墙协议类型有哪些)
- 8cf现在等级是多少(cf等级2020最新)
- 9老滑头多少条鱼(钓鱼老滑头有什么用)
- 10WPS自动调整语法(wps如何修改语法)
- 11dell控制面板防火墙(dell的防火墙怎么关闭)
- 12丑女技能升多少(丑女技能需要满级吗)
- 13智能家居系统怎么样(智能家居系统好吗)
- 14戴尔屏幕(戴尔屏幕闪烁)
- 15y85屏幕信息(vivoy85息屏显示时间怎么设置)
- 16魅蓝note3屏幕出现方格(魅蓝note屏幕竖条纹)
- 17v8手指按屏幕(触屏手指)
- 18金为液晶广告机(液晶广告机lb420)
- 19三星显示器怎么校色(三星显示器 调色)
- 20hkc显示器dvi音频(hkc显示器有音响么)
- 21康佳液晶智能电视机(康佳液晶智能电视机怎么样)
- 22做液晶画板电脑(做液晶画板电脑怎么操作)
- 23液晶屏极化现象原理(液晶屏极化现象原理是什么)
- 24企业网络安全防火墙(企业网络防护)
- 256splus黑屏屏幕不亮(苹果6s plus屏幕突然黑屏)
- 26充电导致屏幕失灵(充电导致屏幕失灵怎么办)
- 27超极本屏幕旋转(笔记本电脑屏幕旋转,怎么转过来?)
- 28igmp防火墙(防火墙配置ipv6)
- 29荣耀王者多少经验(王者荣耀经验多少一级)
- 30lol老将还剩多少(qg老将)