版权声明:本文为博主原创文章,转载请注明出处:https://blog.csdn.net/huang_165/article/details/83420450
这是“分析并改良rockchip sensor core框架”的第二篇,这篇程序框架图形式描述sensor core。
这里是源码地址:https://github.com/Mr-jinfa/rk3399-project
人体中的手脚躯干是通过筋骨联通的,而操作系统里的链表就好比人的筋骨,内核通过这些筋骨来枚举、操作一个个设备。
所以,我们看内核源码是会发现各种链表。有些链表用来存放数据、有些链表来描述设备信息的关系。
像我们熟知的Linux设备模型的基本数据结构kset、kobject他们就内嵌一个list_head来描述若干kobject和kset之间的关系,而kobject由内嵌到struct device结构体中来描述一个设备和另一个设备的关系。如device_b的父亲是device_a那么体现在kobject中就是device_b->parent = device_a;
所以说,学习Linux设备驱动框架很重要,了解并维护设备驱动的基本模型更重要。因为,我们驱动开发人员都是在用各种模型来构建我们的驱动,这里的驱动更多是client 驱动。也就是利用内核一些资源来工作的驱动。
接下来,我们谈下如何分析一个子系统。分析子系统分3个步骤。
- 入口:子系统中地表面上的东西,就是展示最直观的,能一眼看到的。
- 活动:各个组件是如何活动的,即如何响应来自于用户的、内核(管理者)的请求。
- 出口:找到某一组件的出口,就是那个组件退出时所走的内核控制路径。 找到子系统的出口,就是子系统退出时所走的内核控制路径。
那么,直接上图。
整个sensor core及其周边框架
上图展开了driver list、device list 、sensor core这三个重要组件。从易到难开始我们的分析。
1.device list:
这是一个由设备树展开的list,它在boot时通过uboot将设备树所在的flash地址传给内核,由内核负责展开出一颗树。
设备树源码文件位于:arch/arm64/boot/dts/rockchip/下。
它的一般写法为:
akm8963: [email protected]{
status = "okay";
compatible = "akm8963"; //属性-用来匹配driver
reg = <0x0c>; //ak8963在i2c4 bus下的地址
dady-gpio = <&gpio1 4 GPIO_ACTIVE_LOW>; //器件准备脚
type = <3>; //电子罗盘compass在rk sensors core层的类型编号(dt-bindings/sensor-dev.h)
};
设备树节点位于板端的:/sys/firmware/devicetree/base/ (rockchip平台)
我们看看上面的akm8963在板端展开的样子:
/sys/firmware/devicetree/base/[email protected]/[email protected]/
目录下有:
-r--r--r-- 1 root root 8 Oct 26 06:21 compatible
-r--r--r-- 1 root root 12 Oct 26 06:21 dady-gpio
-r--r--r-- 1 root root 8 Oct 26 06:21 name
-r--r--r-- 1 root root 4 Oct 26 06:21 phandle
-r--r--r-- 1 root root 4 Oct 26 06:21 reg
-r--r--r-- 1 root root 5 Oct 26 06:21 status
-r--r--r-- 1 root root 4 Oct 26 06:21 type
其中[email protected]/目录和设备树的节点[email protected]对应起来,compatible、dady-gpio也是能对应起来的。这些文件构成sensor core的device部分,也就是sensor这种硬件的设备信息。
2.driver list: 原生代码是没有这个list概念的.
driver list它是一个静态链表,存在于sensor core中。上图表示在driver处只是为了方便说明问题而已(具体看下面源码分析)。
在《分析并改良rockchip sensor core框架之一》博文中介绍rockchip在driver/input/sensors/目录下根据sensor类型建立不同目录。这些目录里的.c构成sensor core的driver部分,也就是sensor这种硬件的灵魂。
我们随意地选一个来分析:选akm8963.c吧。注意了,akm8963.c是一个sensor driver但是我更愿意叫client deiver
client driver向sensor core申请资源
看到了probe,我们开始分析sensor core。
3.sensor core:它包含sensor-i2c.c sensor-dev.c文件。
先说下它实现的功能:不知道读者有没有看过我那篇《allwinner sensor子系统架构介绍》全志也实现了一个sensor core层。不过它只提取了sensor申请、注册接口,真正的和上层交互还是以client sensor drv来实现。
而瑞芯微(rockchip)提供的功能:
1.为client drv层提供申请、注册接口.
2.将所有注册到sensor core的sensor以driver list连接起来.
3.为client sensor driver层提供统一设备管理机制:注册、卸载、开关设备、申请中断、起delay work.
4.为上层提供统一访问sensor dev接口(主要是ioctl接口).
sensor core driver
好了,我们指定i2c bus match成功后会调用sensor core 注册进系统的probe。
sensor core注册到i2c bus的probe函数
那么,最后我们看下sensor是如何为上层提供服务的。
sensor core ioctl
总结一下,全场最重要的数据结构是:head_sensor list。