05 字符设备驱动框架
字符设备驱动框架简介Linux的字符设备驱动框架是以struct cdev为核心的一套API,通过向内核注册cdev,从而向用户空间提供对设备进行IO操作的接口 注意:Linux字符设备驱动框架主要用于封装设备的IO操作,有别于Linux的设备驱动模型,并不负责设备与驱动的匹配之类的,所以2者通常同时出现 而且不是所有字符设备的驱动都需要用到这个框架,比如一个用了input子系统的按键,它不需要向用户提供IO操作的接口,所以就不需要(其实这是驱动分层的结果,input子系统的核心层会用到该框架来提供用户对/dev/input/eventXIO操作的能力,但我们自己写的驱动层不需要用) 核心组件 cdev12345678910111213141516struct cdev { struct kobject kobj; struct module *owner; const struct file_operations *ops; struct list_head list; dev_t dev; unsigned int...
08 GPIO子系统
GPIO子系统GPIO子系统是 Linux 内核中用于管理和控制通用输入/输出引脚的核心框架,它为开发者提供了统一的接口来操作硬件上的 GPIO 引脚,使用前需要用pinctrl将该引脚的复用配置成GPIO 驱动架构GPIO子系统的驱动同样遵循着“主机驱动和设备驱动分离”和“驱动分层”的思想,分为主机驱动层、核心层、设备驱动层 主机驱动层主机(GPIO控制器)驱动一般由原厂提供,且也作为设备树中的一个节点 SoC内部对于GPIO一般都有专门的控制器外设,它直接位于SoC的内存空间,通过配置该外设的寄存器,从而控制某个具体的GPIO 12345678910111213141516/{ soc{ aips1{ gpio1: gpio@0209c000 { compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio"; reg = <0x0209c000 0x4000>; interrupts =...
04 设备树
...
16 I2C子系统
...
05 FrameBuffer设备
FrameBuffer设备 帧缓冲设备的应用开发通常是对/dev/fbX这个帧缓冲设备文件进行I/O操作,在注册帧缓存设备时,会在内核中开辟一个缓冲区,可以把它看成指向显存的指针,通过修改这个缓冲区的内存,内核会同步更改显存,进而改变帧缓冲设备实际显示的内容 个人感觉这一章介绍的对于Framebuffer设备的应用开发API过于底层,实际开发应该不会用如此底层的API来开发,而是用Qt或者LVGL那样的框架进行开发,所以==这章学习的意义不是很大== 1.基本步骤对帧缓冲设备的应用开发主要包括以下几步: 1.打开/dev/fbX这个设备文件 2.通过ioctl()系统调用获得帧缓冲设备的一些重要信息:如屏幕的分辨率大小、像素格式,根据屏幕参数计算显示缓冲区的大小 3.通过存储映射 I/O 方式将屏幕的显示缓冲区映射到用户空间(mmap),之后就能像操作数组一样操作显存 4.映射成功后就可以直接读写屏幕的显示缓冲区,进行绘图或图片显示等操作了 5.完成显示后,调用 munmap()取消映射、并调用...
21 Camera驱动开发
Camera驱动开发Camera基础知识CMOS Sensor也常被简称为Sensor,它就是个光电转换器件,把光信号转换成电信号 特点: 只是一个裸芯片(die) 输出通常是 Raw Bayer 数据(RGGB/BGGR 等排列) 不含镜头、ISP、电路板等辅助模块 常见规格:分辨率(MP)、尺寸(1/2.3”)、像素尺寸、bit-depth(10/12-bit) 相机模组将Sensor、镜头、PCB、外壳等封装到一起的摄像头硬件模块,接口可以直接接主控 组成部分: CMOS Sensor → 输出 Raw 或 ISP 后的数据 镜头系统 → 聚焦光线到传感器 PCB 电路板 → 控制信号、时钟、I2C/CSI/USB 接口 ISP(可选)→ 有些模块自带 ISP,输出 NV12 / RGB / MJPEG 封装/外壳 →...
07 V4L2框架
V4L2框架简介V4L2是Linux内核中的一套驱动框架,为视频类设备(USB、CSI摄像头…)的驱动开发和应用层提供了一套统一的接口规范 V4L2将视频设备视为字符设备,例如/dev/videoX,用户可以通过标准的文件系统接口(如ioctl、open、read、write等)与之交互 在音视频开发领域,许多框架比如FFmpeg都是以V4L2作为基础开发的,所以这个框架还是比较重要的 工作流程 从流程图中可以看到,几乎对摄像头的所有操作都是通过 ioctl()来完成,搭配不同的 V4L2 指令请求不同的操作,这些指令定义在头文件 linux/videodev2.h 中 打开设备打开设备其实和别的类型的设备一样,用open()系统调用就行了 1fd = open("/dev/video0", O_RDWR); 查询属性在V4L2中,使用ioctl()封装了一个指令和结构体用于属性的查询 1234567891011ioctl(int fd, VIDIOC_QUERYCAP, struct v4l2_capability *cap);struct...
23 USB
USB概述USB是“Universal Serial Bus”的缩写,中文意思是“通用串行总线”。它是一种广泛使用的接口技术,主要用于连接计算机与各种外部设备,如鼠标、键盘、打印机、摄像头、移动硬盘、手机等。主要特点: 通用性强:USB接口被几乎所有类型的计算机(包括台式机、笔记本电脑、平板电脑等)和大量外部设备所支持,是一种通用的连接标准 即插即用:大多数USB设备在连接到计算机后,操作系统可以自动识别并安装相应的驱动程序,无需用户进行复杂的配置 支持热插拔:用户可以在不关闭计算机电源的情况下插拔USB设备,方便使用 传输速度快:USB技术不断更新,从最早的USB 1.0到现在的USB 3.2和USB4,传输速度大幅提升。例如,USB 3.2的理论传输速度最高可达20Gbps 支持多种设备连接:通过USB集线器,可以连接多个设备,扩展计算机的外设连接能力 USB技术发展 USB 1.x USB 1.0 USB 1.1(即USB 2.0 Full Speed) USB 2.0(即USB 2.0 High Speed) USB 3.x USB 3.0(即USB 3.2...
02 应用层控制GPIO
应用层控制GPIO控制GPIO硬件有以下几种方法: 编写驱动程序,在设备的IO操作里完成对GPIO的任意控制 在应用层依靠GPIO子系统在/sys/class/gpio中为GPIO类设备的属性文件来进行简单控制 基于sysfs进入到/sys/class/gpio 目录下可以看到GPIO控制器包含以下属性: export unexport gpiochipX 在使用一个GPIO前,需要将一个GPIO导出到用户空间,这样才能使用它,通过将要导出的GPIO序号写入到export属性文件即可完成导出,取消导出的话将要取消导出的GPIO序号写入到unexport属性文件即可。 在导出一个GPIO后,在/sys/class/gpio 目录下会新多出一个目录,代表此GPIO设备,该目录包含4个属性文件: 1.active_low:配置GPIO的极性,value的0/1到底代表高还是低电平由此属性决定( ==输入输出均是==) 1234567891011121314//active_low 等于 0 时echo...







