一、V4L2驱动框架
v4l2驱动框架主要对象:
(1)video_device:
一个字符设备,为用户空间提供设备节点(/dev/videox),提供系统调用的相关操作(open、ioctl...)
(2)v4l2_device:
嵌入到video_device中,表示一个v4l2设备
(3)v4l2_subdev:
表示一个v4l2设备的子设备,一个v4l2_devide下可以有多个sub_device
(4)videobuf:
v4l2驱动的缓存管理
1、核心层负责注册字符设备,然后提供video_device对象和相应的注册接口给硬件相关层使用
2、硬件相关层需要分配一个video_device并设置它,然后向核心层注册,核心层会为其注册字符设备并且创建设备节点(/dev/videox)。同时硬件相关层还需要分配和设置相应的v4l2_device和v4l2_subdev,其中v4l2_device的一个比较重要的意义就是管理v4l2_subdev,当然有一些驱动并不需要实现v4l2_subdev,此时v4l2_device的意义就不是很大了
3、当应用层通过/dev/video来操作设备的时候,首先会来到V4L2的核心层,核心层通过注册进video_device的回调函数调用相应的操作函数,video_device可以直接操作硬件或者是通过v4l2_subdev来操作硬件
三、I2C驱动框架
先了解一下IIC通信协议:
开始信号(S):SCL为高电平时,SDA山高电平向低电平跳变,开始传送数据。
结束信号(P):SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
响应信号(ACK):接收器在接收到8位数据后,在第9个时钟周期,拉低SDA
SDA上传输的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平期间变化
在IIC驱动中有几个比较重要的对象:
1、i2c_adatper :描述一个实际的 IIC 物理硬件,I2C驱动
和I2C设备
,我们需要通过I2C驱动
去和I2C设备
通讯,这其中就需要一个I2C设配器
,I2C设配器
对应的就是SOC上的I2C控制器
2、i2c_algorithm :algorithm
是算法的意思,对应的就是如何发送I2C时序
3、i2c_client :描述一个挂接到 IIC 总线上的具体物理设备
4、i2c_driver:用于描述一个 IIC 设备的驱动
i2c_adapter里面有两个重要的成员,nr表示第几个i2c总线(i2c controller),i2c_algorithm(用来收发I2C数据,里面有master_xfer函数)
三、input子系统框架
输入子系统由Input driver(驱动层)、Input core(输入子系统核心)、Event handler(事件处理层)三部分组成。一个输入事件,如鼠标移动、键盘按下等通过Input driver -> Input core -> Event handler -> userspace的顺序到达用户空间的应用程序。
Input driver :主要实现对硬件设备的读写访问,中断设置,并把硬件产生的事件转换为核心层定义的规范提交给事件处理层。
Input core :承上启下。为设备驱动层提供了规范和接口;通知事件处理层对事件进行处理;
Event handler :提供用户编程的接口(设备节点),并处理驱动层提交的数据处理。
input.c为这个子系统的核心,提供了两个重要的链表:
1、input_handler_list :
是这个input子系统的所有handler的链表2、
input_dev_list
: 是这个子系统的所有device的链表
重要的结构体:
1、内核用input_dev结构体表示一个输入设备(鼠标,键盘,触摸屏).
2、输入设备需要向内核上报一个事件,内核中用input_event表示一个事件
3、其中type表示哪类事件,比如EV_REL表示相对位移(比如鼠标),EV_ABS表示绝对位置(比如触摸屏)
四、USB驱动框架
USB 是一种分层总线结构。USB 设备与主机之间的数据传输由 USB 控制器控制。Linux USB 驱动程序架构如下图所示。Linux USB 主机驱动包括三部分:USB 主机控制器驱动、USB 核心和 USB 设备驱动。
目前的USB驱动都很成熟,很多时候,只需要添加VID,PID等信息即可使用。
1、USB Core
(1)USB Core这个模块是纯软件部分,并不代表一个设备,是独立于硬件的协议栈,它是所有USB设备赖以生存的模块,即USB子系统的核心。代码位于kernel/drivers/usb/core目录下。
(2)USB的初始化函数在kernel/drivers/usb/core/usb.c中定义,主要完成bus_register(USB总线注册)、usb_major_init(注册usb主控器字符设备)、usb_register(注册usbfs驱动)、usb_hub_init(USB Hub初始化,注册hub驱动、创建内核守护线程来监测hub端口的状态变化)等工作
2、USB HCD(Host Controller Driver)
硬件主机控制器Host Controller之上运行的是HCD,是对主机控制器硬件的一个抽象,实现核心层与控制器之间的对话接口,USB HCD包含多种USB接口规范:
(1)UHCI:Intel提供,通用主机控制接口,USB1.0/1.1;
(2)OHCI:微软提供,开放主机控制接口,USB1.0/1.1;
(3)EHCI:增强主机控制接口,USB2.0;
3、USB Device Driver
在Linux内核中,使用 struct usb_driver结构体来描述一个USB驱动,通过usb_register在USB驱动中注册进内核。
因此USB设备驱动开发,主要包含如下两个部分:
- 分配/设置usb_driver结构体,实现并填充结构体内容
- 注册usb_driver