Linux 常见驱动框架

一、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_algorithmalgorithm是算法的意思,对应的就是如何发送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
相关推荐
赖small强2 小时前
【Linux 驱动开发】Linux PWM (脉冲宽度调制) 全面技术指南
linux·驱动开发·pwm
程序员 _孜然4 小时前
linux调试外部RTC hym8563
linux·驱动开发·嵌入式硬件·ubuntu
金色光环5 小时前
基于STM32F407+dp83848实现ModbusTCP从站移植
驱动开发·stm32·嵌入式硬件
贝塔实验室1 天前
Altium Designer 集成库介绍
arm开发·数据库·驱动开发·硬件工程·射频工程·基带工程·精益工程
请叫我7plus1 天前
用QEMU进行嵌入式Linux开发
linux·驱动开发·嵌入式硬件
乔碧萝成都分萝1 天前
十六、一个基本的GPIO驱动程序
linux·驱动开发·嵌入式
大神的风范1 天前
LINUX 驱动之HSR04超声波模块,设备树配置
linux·驱动开发
DeeplyMind1 天前
第5章:并发与竞态条件-13:Fine- Versus Coarse-Grained Locking
linux·驱动开发·ldd
DeeplyMind1 天前
第5章:并发与竞态条件-12:Locking Traps
linux·驱动开发·ldd
♛识尔如昼♛2 天前
Linux I2C 驱动
linux·驱动开发·i2c 协议