- 博客(32)
- 收藏
- 关注
原创 Linux 驱动框架中 Class 机制完整讲解(以 ov13855 摄像头为例)
把功能相同的设备归类管理自动创建统一的 sysfs 目录提供查询接口给上层子系统这个机制就叫做class(类)。// 类名,比如 "video4linux"// 属于这个类的设备链表// ... 其他字段时机:device_add() 之前// 先赋值// 再 add如果 device_add 时 dev->class 为 NULL,不会加入任何 class如果 device_add 时 dev->class 有值,自动加入对应 class答案直接类型:链表节点类型(
2025-12-21 15:11:50
1577
1
原创 U-Boot零基础入门第二篇(如何看懂uboot目录?)
简单认识一下uboot的源码目录,和与编译相关的Kconfig、config.mk、Kbuild、Makefile之间的关系
2025-11-04 21:41:42
1289
原创 芯外拾遗第二篇:编译、工具链、烧录,你真的搞懂了吗?
你每天都在按下“编译”和“烧录”,可当电源一通,程序究竟是怎么真的“跑起来”的,你真的懂吗?
2025-10-30 21:51:58
950
原创 RK3588:MIPI底层驱动学习——入门第六篇(摄像头数据处理全流程、软件\硬件双视角分析)
本文从 软件数据流 与 硬件物理模块 的双重视角,深入解析了在RK3588平台上,一帧图像从传感器输入到ISP(图像信号处理器)处理完成的完整技术链路。
2025-10-08 15:54:50
2688
2
原创 RK3588:MIPI底层驱动学习——入门第五篇(一文梳理media、video、v4l-subdev关系)
每个分组代表一个功能模块,这个模块可能包含:v4l2-ctl --list-devices列出了系统中所有的视频设备分组。每个分组代表一个功能模块,这个模块可能包含:若干个video设备节点(/dev/videoX)若干个media设备节点(/dev/mediaX)为什么要分组显示?因为一个功能模块内部的多个设备节点是配合工作的,分组显示能让你知道哪些节点属于同一个硬件单元。第一组:rkcif-mipi-lvds:表示这是rkcif平台驱动创建的。只有1个设备节点作用。
2025-10-07 21:48:28
1797
原创 RK3588:MIPI底层驱动学习——入门第四篇(驱动精华:OV13855驱动加载时究竟发生了什么?)
这篇文章就带你从 OV13855 驱动的 probe 函数 开始,看看驱动加载时到底发生了什么。我们会一步步拆开它做的三件事——找设备、给电、注册进系统。看完之后,你就能真正理解摄像头驱动是怎么“活过来”的。
2025-10-05 22:14:39
1832
原创 随笔记录:香橙派ov13855摄像头测试脚本test_camera.sh文件分析
【代码】随笔记录:香橙派ov13855摄像头测试脚本test_camera.sh文件分析。
2025-10-04 22:22:11
176
原创 芯外拾遗第一篇:从四个模块到整个“江湖”
他们需要规划整个SoC的功能,选择(或自研)最高效的IP核,并设计好连接这些IP核的内部“通信网络”(总线),确保它们能协同工作。这些RISC核心哲学的更彻底的贯彻。ARM和RISC-V都是RISC的杰出代表,但RISC-V作为后来者,有机会审视包括ARM在内的所有前辈的设计,并基于近几十年的计算机体系结构研究成果,做出了一系列被认为更优越、更“纯粹”的设计抉择。因此,当我们看到不同品牌的手机都能流畅运行相同的App时,其背后深层的原因,就是它们的“大脑”(CPU核)都在说着同一种源自ARM的“语言”。
2025-09-15 21:25:12
1779
1
原创 RK3588:MIPI底层驱动学习——入门第二篇(一文掌握V4L2与硬件设备驱动之间的关系)
V4L2框架通过v4l2_device和v4l2_subdev两个核心概念把复杂的摄像头系统抽象成标准化的接口。每个硬件模块实现为一个subdev,通过ops函数集提供功能。最终通过/dev/video节点向应用程序提供统一的访问接口。理解了V4L2框架,我们就能理解OV13855驱动是如何融入这个框架,以及驱动代码为什么要那样组织。
2025-08-26 14:39:06
1893
原创 RK3588——DMABUF+CMA的完美组合
为了让不同的模块(如V4L2驱动、GPU驱动、显示驱动)和用户空间能安全、统一地共享内存,Linux内核需要一个标准的“中介”或“契约”。通过这一整套DMABUF和CMA的组合拳,数据从始至终都只存在于一块物理内存中,完美地实现了硬件和用户空间的共享,达成了零拷贝的目标。这样,硬件可以直接将数据写入这块内存,而应用程序也能够直接从这块内存中读取数据,从而省去内核到用户的那一次CPU拷贝。:正如前面所说,在系统长时间运行后,物理内存会产生大量碎片,此时再想申请一块大的、连续的物理内存会非常困难,甚至失败。
2025-08-13 15:44:28
1741
原创 【Linux驱动——彻底搞懂】IIC驱动子系统(初步认识)
IIC相比较之前的内容多了一点:他要分层它的本质是:硬件的“翻译官”和“执行者”。它的本质是:I2C子系统的“交通枢纽”和“规则制定者”。它的本质是:特定I2C从设备的“应用专家”和“逻辑封装者”。我们已经理解了三层的功能划分。现在,我们从最贴近硬件的底层开始,看看它们在代码层面是如何通过标准化的数据结构来定义自己,并与相邻层级沟通的。它的本质是:一个物理I2C控制器的软件抽象。 它代表了一条真实存在的、可以收发数据的I2C总线。当一个控制器驱动初始化时,它必须向系统注册一个代表其控制的物理总线的对象。这个
2025-08-03 14:49:24
1973
3
原创 【补充】Linux内核链表机制
一个复杂的设备,例如一个现代WiFi/蓝牙二合一模块,在不同的工作模式下,对引脚的要求是不同的。设备建立一个数据结构,来清晰地管理这四种引脚状态(A, B, C, D)以及它们对应的具体配置。成员(Q)就是这个链表的“头结点”或“锚点”。当内核解析这个设备时,它需要在内存中为。如何通过内核链表,来组织和管理其多个。深入解析Pinctrl子系统中,本身直接串起来,而是通过它们内部的。的状态时,它会遍历这个由。成员(T)来建立连接。
2025-07-21 22:44:13
380
原创 【Linux驱动-快速回顾】一文快速理解GIC内部寄存器对中断的控制
作用: 分发器总开关。把它理解为整个GIC分发器的“总电源开关”就对了。在你把所有中断都精心配置好(设置好优先级、目标CPU、触发方式等)之后,最后一步就是打开这个总开关,GIC才能正式开始工作。位[0]EnableGrp0(使能组0)作用:控制Group 0中断的转发。0关闭。所有属于Group 0的中断,即使已经触发(处于pending状态),也会被GIC分发器拦住,不会被发送给任何CPU接口。就像闸门A关闭了。1打开。
2025-07-15 22:00:01
1910
原创 【Linux驱动-快速回顾】【彻底搞懂】一文快速理清楚Linux内核中断组织方式(新手友好)
CPU 收到中断信号-> 内核需要一个总管来管理所有中断源。引入irq_desc数组:作为中断的总管,以全局irq号为索引。中断控制器是层级化的->irq_desc需要能处理这种分发流程。引入handle_irq函数指针:作为中断流控处理函数,负责从上级中断源找到下级中断源,形成中断处理链。中断线可能被多个设备共享-> 需要一种机制来管理多个中断处理者。引入irqaction链表:挂在irq_desc下。每个设备驱动注册一个irqaction,其中包含真正的中断处理函数handler。
2025-07-09 21:24:35
714
原创 【Linux驱动-快速回顾】【彻底搞懂】一文彻底搞懂Linux中断子系统(绝对清晰)(新手友好)
本文带你快速回顾Linux驱动章节中断部分的内容,由于逻辑层层推进,新手也可以看懂
2025-07-08 22:19:16
3222
原创 【Linux驱动-快速回顾】为什么APP调用open函数,传入的文件设备,驱动层却是接到了inode结构体?
特性(文件的身份证)(文件的会话凭证)代表文件系统中的一个静态文件实体一个进程与文件之间的动态打开会话生命周期与文件在磁盘上的存在时间相同(持久)从open()到最后一个close()(临时)唯一性每个文件只有一个每次open()都会创建一个新的核心数据权限、所有者、类型、设备号当前读写位置、打开模式、私有数据。
2025-06-23 15:08:12
933
原创 【Linux驱动-快速回顾】简单字符设备驱动
这是一个简单的hello的驱动程序,快速回顾之前的知识点我们按照一个驱动程序从诞生到消亡的生命周期来剖析这段代码的结构。这个结构是所有字符设备驱动的标准范式。这是驱动程序最核心的部分。它告诉内核:“当用户空间的程序对我的设备文件进行操作时,你应该调用我这里的这些函数。”为什么这样做:这是一种回调(Callback)机制。驱动程序本身不主动运行,它只是向内核注册了一系列函数指针。当某个事件(如用户调用)发生时,内核会通过这些指针“回头调用”驱动程序提供的函数。 这一行非常重要。它防止在驱动程序被使用
2025-06-22 22:17:13
903
原创 【彻底搞懂】驱动程序编译之前没有注意到的知识点
准备阶段 (Setup)a.获取并配置内核: 在你的Ubuntu工作站上,获取目标开发板对应的Linux内核源码。进入源码目录,使用开发板厂商提供的配置文件(.config),为目标板(比如ARCH=arm64)配置并编译一遍内核。这一步至关重要,它会生成后续编译驱动所需的一切。b.获取交叉编译器: 下载并解压与你的内核和开发板匹配的交叉编译工具链(Toolchain)。c.编写代码: 编写你的驱动源代码和用户空间测试代码。d.编写Makefile: 编写我们上面详细分析的那个。
2025-06-22 21:07:42
1214
原创 【彻底搞懂】Linux 事件、阻塞、非阻塞+轮询、slect、poll、epoll、缓冲io、非缓冲io、同步、异步
想彻底搞懂Linux I/O?本文通过一个开发“智能家居中控”的生动故事,带你亲历从阻塞I/O到epoll的完整演进。你将直观地理解阻塞/非阻塞、同步/异步、select/poll/epoll这些核心概念的本质区别与联系。我们还会将缓冲I/O与异步I/O融入实际场景,让你不再死记硬背!
2025-06-21 17:10:27
1348
原创 Linux伙伴系统——对初学者友好的理解方式
所以,你可以看到,伙伴系统是 Linux 内存管理体系中非常重要的一环,它工作在分页机制的底层,为分页机制以及内核其他部分提供所需的、合适大小的、物理连续的内存块。内核自己需要的小块、大小不一的内存,直接用分页来分配一个完整的页(通常 4KB)会不会有点浪费?有要求的内存请求,既可能造成浪费(比如只需要 100 字节却分配了 4KB),也难以保证分配到的多个页是物理上连续的(分页机制本身不保证这一点,它只保证虚拟地址连续)。“伙伴”指的是满足特定条件的、大小相等且物理地址相邻的两个内存块。
2025-04-15 11:26:09
845
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅