当前位置: 首页 > news >正文

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
http://www.lryc.cn/news/323258.html

相关文章:

  • Oracle函数6—递归查询(start with...connect by、sys_connect_by_path、level)
  • 人机交互三原则,网络7层和对应的设备、公钥私钥
  • vue2源码学习01配置rollup打包环境
  • DP:斐波那契数列模型
  • JavaScript高级(十四)----prmise
  • 28 OpenCV 轮廓周围绘制图形
  • 校企合作,助力人才培养——黄冈师范学院-唯众 “实习实训基地”揭牌仪式顺利举行
  • npm audit fix --force
  • 递增四元组
  • 蓝桥杯每日一题——棋盘
  • QT6实现创建与操作sqlite数据库及读取实例(一)
  • 第十四届蓝桥杯JavaB组省赛真题 - 阶乘求和
  • Java毕业设计 基于springboot医院挂号系统 医院管理系统
  • 【MySQL】基本查询(1)
  • 一文讲清!进销存管理系统如何实现锁库及库存冻结?计算月加权平均成本?
  • 将本地项目上传至码云
  • 虚拟化技术
  • 鸿蒙一次开发,多端部署(一)简介
  • 数据结构——单向链表(C语言版)
  • ideaSSM 工厂效能管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目
  • Java反射机制的讲解及其示例说明
  • 20240309web前端_第二周作业_完成游戏导航栏
  • 五、大模型-Prompt
  • 【网络安全】 MSF提权
  • iPHoP:病毒宿主预测
  • 网工内推 | 数通工程师,IE认证优先,五险一金,绩效奖
  • 2024 年 AI 辅助研发趋势将更加强调智能化、自动化和个性化
  • Jackson 2.x 系列【1】概述
  • 深入理解并优化Android中的文件描述符(FD)
  • 「JS 基础」异步解决方案入门