- 博客(171)
- 收藏
- 关注
原创 从用户空间open()到驱动open()的完整调用链深度解析
本文详细剖析了Linux系统中从用户空间调用open()函数到设备驱动层open()方法的完整调用链。以ARM64架构为例,整个过程分为四个关键阶段:1)用户空间通过glibc库将open()转换为openat系统调用并触发svc异常;2)内核异常处理机制识别系统调用并保存上下文;3)通过系统调用表分发到sys_openat处理;4)VFS层解析路径、分配文件描述符并最终调用设备驱动。该流程横跨用户态与内核态,涉及异常处理、系统调用分发和虚拟文件系统等核心机制,展现了Linux内核精密的层次化设计。
2026-01-08 10:19:33
1246
原创 智能家居项目
整体:通过手机或语音输入,对外设的控制1. 对灯开关控制:支持回家模式,离家模式2. 人脸识别开锁3. 火灾报警,蜂鸣器响4. 本地oled屏,显示语音播报信息5. app端显示监控画面+火灾报警+cpu温度+灯和锁状态6. app端除视频监控外,可实现远程操作(内网穿透)7. app端可控制摄像头功能(录像或监控画面显示)8. 守护进程,保证不退出
2023-05-03 14:54:29
1514
1
原创 光伏电子工程的设计与实施2022——单片机力控部分实现思路
主控IAP15W4K61S4,外设有串口屏,8010,485,WiFi,都是通过串口实现通讯。EEPROM实现断电数据保护。
2022-08-23 12:59:17
3876
2
原创 2021电赛国一——K题照度稳定可调LED台灯
当赛题下来后,我看了高职组和本科组的控制类赛题,IJ题因为材料短缺所以果断放弃。只剩下F和K题可以做,因为我软件控制类题目比较拿手,所以我当时是有想过做F题来挑战一些自己,但是最终还是在队友的劝说下放弃了F题,做了K题。(因为如果做了F题,首先硬件上面跟不上,而且做了F题是要和本科组比的,可能就拿不到比较好的名词。。。。。)使用2块MSP430作为主控,其他部分我们采用手机APP控制台灯的亮灭调光,因为我主要负责软件,所以下面只说一下软件实现的思路。整体效果图一、数字显示照度表1.1、效
2021-12-31 19:24:33
6734
2
原创 STM32F103点亮LED,3种方式
目录1、寄存器1.1、开启GPIOE对应时钟1.1.1、找到GPIOE对应时钟1.1.2、找到对应基地址1.1.3、找到APB2的偏移地址1.1.4、编写程序开启PE5时钟1.2、配置PE5对应寄存器1.2.1、找到对应基地址1.2.2、找到配置寄存器IOPE的所有偏移地址1.2.3、配置CRL寄存器1.3、控制ODR或BSRR和BRR寄存器点亮LED1.3.1、控制ODR寄存器亮灭1.3.2、控制BSRR和BRR寄存器亮灭2、库函数3、位操作4、总结1、寄存器1.1、开启GPIOE对应时钟1.1.1
2020-11-20 20:44:12
3016
1
原创 3588平台AMP相关知识
在 RPMsg 中,主-从核心通过中断和共享内存的方式进行通信,内存的管理由主核负责,在每个通信方向上都有 USED 和 AVAIL 两个缓冲区,这两个缓冲区可以按照 RPMsg 的消息格式分成一块一块,由这些内存块可以链接成一个环。,由于 RPMsg还带有16 Bytes的数据头,因此一次性传输的最大数据量为 496 Bytes,详细可以参考drivers/rpmsg/virtio_rpmsg_bus.c。CPU0 上,先加载到 U-Boot。MCU 中,所有的地址信息,都是以自生加载地址为偏移的。
2026-07-30 09:00:25
159
原创 内核写硬盘驱动代码
原来,open打开文件write写入保存为raw格式(142)写硬盘,open打开sda写(112)上面是内存到内存的dma驱动程序。内核中dma写硬盘(400)
2026-07-29 08:29:31
205
原创 更改xdma驱动性能提升44%
从应用层获取虚拟地址,然后使用 scatterlist 分页(因为应用层申请的内存是不连续的,必须要分页,让dma看起来是连续的内存)在xdma_xfer_submit_xw 里面的 xdma_init_request_xw 函数申请连续物理地址。char_sgdma_read_write 里面,把长度和地址传到xdma_xfer_submit。使用dma_alloc_coherent申请内存,直接使用80000000是一样的速度。上面的计算,只是计算了搬运的过程时间(所以应用层计算800,内核988)
2026-07-28 08:34:22
237
原创 uboot相关知识及裁剪
3588使用的是v2017(next-dev)内核版本:v2017要求RK内核版本 >= 4.4支持功能有⽀持 RK Android 固件启动;⽀持 Android AOSP 固件启动;⽀持 Linux Distro 固件启动;⽀持 Rockchip miniloader 和 SPL/TPL两种 Pre-loader 引导;⽀持 LVDS、EDP、MIPI、HDMI、CVBS、RGB 等显⽰设备;
2026-07-27 08:37:39
250
原创 网卡驱动相关知识及移植
在 10M/100M/1000M 下时钟分别是2.5M, 25M 和 125M。MII 接口的传输速率为10Mbps 或 100Mbps, 在 100Mbps 下时钟为 25M, 在 10Mbps 下钟为 2.5M。,导致数据和时钟 “不同步”(比如数据到了,时钟还没到,或反之),最终引发数据包丢包、CRC 错误。的,属于 “推挽输出”,外部上下拉会干扰时钟信号的完整性(比如导致时钟边沿变缓、幅值异常),所以必须配置为无上下拉。10M/100M/1000M 下时钟分别是 2.5M, 25M 和 125M。
2026-07-24 08:39:13
228
原创 isp基础知识
要拍多个标准光源,例如 HZ、A、CWF、TL84、D50、D65、D75。理想情况下 Gr 和 Gb 应该一致,但由于 Sensor 行列结构、读出电路、镜头入射角、噪声等因素,两者可能存在差异。RAW 域降噪主要处理插值前噪声,但经过 Demosaic、CCM、Gamma 后,YUV 域仍然会有亮度噪声和色度噪声。LSC 会把画面划分成网格,为 R、Gr、Gb、B 四个通道分别生成增益表。AE 的目标不是简单“让画面变亮”,而是在不同场景下选择合适曝光,让画面亮度、运动清晰度、噪声、动态范围达到平衡。
2026-07-23 09:42:23
229
原创 CSI-2 详解
物理层(PHY Layer)PHY层指定了传输媒介,在电气层面从串行bit流中捕捉“0”与“1”,同时生成SoT与EoT等信号。该层主要用于不同场景对数据的处理过程,对于发送方,多为camera生成数据,对于接收方,多为SOC对数据进行处理。一帧必须以FS包开始,以FE包结束,中间为帧高度个数的LP包,每个包含一行图像数据。RAW需要转RGB,所以cif拿到的图像,一般都是不能直接使用的(需要isp处理),无论何种类型的包,均由SoT信号开始,EoT信号结束。WC=2400,打包规则相关,下面详细说明。
2026-07-22 08:32:04
175
原创 D-PHY 详解
基于4.0 Gbps比较,C-PHY 的导线更少(减少多达 40%)、更低的切换速率/通道(降低 12.5%)、更低的功耗(降低 ~20-50%)、更少的通道数量,因此相同 Gbps 的面积更小。注册回调函数rockchip_csi2_dphy_notifier_bound,会进行第一次设置通道数等。硬件可以根据需求在两种模式间切换,兼顾C-PHY的高带宽和D-PHY的广泛兼容性。开启流 csi2_dphy_s_stream ,会更新前面回调函数设置的东西。C-PHY 是一种更新、更复杂的 PHY。
2026-07-21 08:42:35
181
原创 RGB 和 RAW(RG10) 详解
研究发现,人眼对绿色比较敏感,所以增强对绿色的采样,每种格式种存在两个G分量。其中每个分量代表一个piexl,所以GR/BG代表4个piexl,就表示sensor上面的4个晶体管,每个晶体管只采集一个颜色分量,然后通过插值计算出每个piexl的其他分量。RGBA(ARGB)中的一种,一位用于表示透明度。0完全透明,1完全不透明。每个像素用16比特位表示,占2个字节,RGB分量都使用5位(最高位不用)RGGB、BGGR、GRBG、GBRG(取决于 Sensor 物理设计)
2026-07-20 10:58:49
218
原创 YUV图像格式汇总
Y明亮度,UV彩色信息显示器上的一个像素点对应图像里的一个像素每个像素的色彩由红、绿、蓝三原色混合实现YUV444YUV422YUV422pYV16: YYYYYYYY VVVV UUUU (V前U后)YUV422p或I422或YU16: YYYYYYYY UUUU VVVV (U前V后)YUV422spNV61:YYYYYYYY VUVUVUVU (V前U后)NV16:YYYYYYYY UVUVUVUV (U前V后)
2026-07-17 09:54:34
186
原创 v4l2驱动框架——图像是如何从内核流向应用层
在cif里面,由cif去确定是直出还是isp经过裁剪cif这里是直接硬件丢弃不需要的数据减少带宽,isp是裁剪不一样csi接口这个 31.42ms 是一帧的总时间,包含了:传感器曝光(可能 5-10ms)MIPI 传输(1080p@30fps 约 8-10ms),分辨率?传输大小?DMA 传输(与 MIPI 并行,约 8-10ms)下面计算其实是4800 × 1664大小数据,因为HTS = 0x12c0 = 4800(每行总像素数)VTS = 0x0680 = 1664(总行数)MIPI ID是
2026-07-16 08:32:47
190
原创 v4l2驱动框架——应用层to内核
ioctl位置 rkisp_register_stream_vdev 函数注册查找流程申请缓存执行cif的后,去执行vb2_queue的申请流程,下面是cif里面的,isp也差不多申请的大小限制了64个缓冲区缓冲区结构体开启流VIDIOC_STREAMONv4l_vb2q_enable_media_sourcerkisp_start_streamingrkisp_alloc_common_dummy_buf
2026-07-14 15:38:34
199
原创 v4l2驱动框架——isp驱动
ISP核心子设备),这个有v4l-subdev4// 这是最核心的图像信号处理器// 功能:去马赛克、颜色校正、噪声抑制、锐化等// 设备节点:/dev/v4l-subdevX (通常为subdev0)// 包含:输入pad(接收CSI数据)、输出pad(输出到stream)CSI子设备),不注册节点,(3588是V3.1)// MIPI CSI-2接收器// 功能:接收传感器通过MIPI接口发送的图像数据// 设备节点:/dev/v4l-subdevX (通常为subdev1)
2026-07-13 08:51:06
217
原创 v4l2驱动框架——cif驱动
dev设备文件 4+4+3MIPI接口:初始化4个MIPI流通道默认是nv12,但是13850输出只支持:SBGGR10 (10位Bayer格式)所以要使用,只能先设置格式初始化4个缩放通道工具视频设备初始化3┌─→ video0 (主通道0) [ENABLED]├─→ video1 (主通道1) [ENABLED]├─→ video2 (主通道2) [ENABLED]├─→ video3 (主通道3) [ENABLED]├─→ video4 (缩放0) [ENABLED]
2026-07-10 10:13:26
188
原创 v4l2驱动框架——csi2驱动
csi2[CSI 控制器] 职责:1. 协议解析:解包 MIPI CSI-2 数据包(长包/短包)2. 虚拟通道:支持最多 4 个虚拟通道(VC0-VC3)3. 数据类型识别:RAW8/RAW10/YUV422/RGB888 等4. 数据重组:将 Lane 交错的数,据重组成完整的图像帧5. ECC/CRC 校验:检测传输错误6. 帧/行同步:识别帧起始(FS)、帧结束(FE)、行起始(LS)、行结束(LE)提供opt寄存器一些操作功能函数初始化media。
2026-07-09 16:06:09
26
原创 v4l2驱动框架——dphy驱动
D-PHY是物理层,不处理图像内容[MIPI PHY] 职责:1. 信号转换:将传感器发来的差分电信号(D-PHY/C-PHY)转换为数字信号2. 时钟管理:提取并恢复数据时钟3. 信号调理:阻抗匹配、信号均衡、去抖4. 电气特性:处理低压差分信号(LVDS),电压通常 200mV-300mV5. 高速传输:支持 1.5Gbps - 2.5Gbps 每通道提供opt寄存器一些操作功能函数初始化media1个entity(dphy),1个pads输出类型,1个pads输入类型。
2026-07-08 08:28:42
29
原创 v4l2驱动框架——ov13850驱动
还有一个vm149c.c ,是sd子设备,负责对焦提供opt寄存器一些操作功能函数初始化ctrl_handler,media4个操作ctrl_handler1个entity(ov13850),1个pads输出类型ctrl_handler 都有自己的操作函数media 有自己的操作函数(默认的)解析注册asd,后续match匹配,解析出来的就是vm149c对焦异步注册框架初始化,有2个全局链表最后把每一个asd放入到自己notifier的waiting把自己的notifier放入。
2026-07-07 11:06:51
151
原创 v4l2驱动框架——videobuf2
定义并初始化 vb2_mem_ops 结构体,这是 videobuf2 框架的内存操作接口。的核心组件,它为视频设备驱动提供了一套完整的内存管理和流式 I/O 实现。是 Linux V4L2 框架中负责。
2026-07-06 08:41:32
206
原创 v4l2驱动框架——media
用于运行时数据流的管理,一个 V4L2 device 下属可能有非常多同类型的子设备subdev(dphy,csi,isp这些),那么在设备运行的时候我怎么知道我的数据流需要用到哪一个类型的哪一个子设备呢。这个时候就轮到 media_device 出手了,它为这一坨的子设备建立一条虚拟的连线,建立起来一个运行时的 pipeline(管道),并且可以在运行时动态改变、管理接入的设备。media_link:link在两个pad之间定向连接,数据由source pad 流向 sink pad。
2026-07-04 16:56:22
207
原创 v4l2驱动框架——设备树及源码查找
是在 Kernel/arch/arm64/boot/dts/rockchip/rk3588s.dtsi:1590行。注册过程可以从上到下去理解,通过async_notifier异步子设备注册。查找关键字 rockchip,rk3588-csi2-dphy。创龙的ov13850,imx219。可以看到源码文件位置。
2026-07-02 08:25:50
189
原创 从glibc的open()到驱动open的完整调用链(源码解析)
open到驱动的完整流程链函数 / 节点名称所属阶段核心功能(通俗解释)open应用层(EL0)应用程序调用的标准文件打开 API,是整个调用链的入口,用户层最直观的操作接口。__libc_open应用层(EL0)C 标准库对 open 系统调用的封装函数,处理用户态的参数校验、封装,向下对接系统调用触发逻辑。SYSCALL_CANCEL应用层(EL0)系统调用的 “取消点” 封装,主要处理线程取消相关逻辑,最终仍会触发系统调用指令。svc #0硬
2026-05-20 09:31:08
275
原创 execve() 系统调用深度解析:从用户空间到内核的完整加载过程
本文详细解析了Linux系统中程序加载的全过程,从应用层的execveat()函数开始,深入追踪到内核的start_thread()。首先介绍了execveat()的优势和libc实现,然后分析系统调用入口的双版本支持机制。核心处理函数do_execveat_common()负责分配加载上下文和参数处理,bprm_execve()进行执行前准备和文件打开。二进制格式识别通过遍历注册的格式处理器完成,其中ELF文件的加载过程包括验证魔数、解析程序头表等步骤。整个过程展示了Linux程序加载的精细设计,涉及系统
2026-01-08 15:44:36
828
原创 rtp传输推流h265
实时传输协议,由IETF的多媒体传输工作小组发布的网络传输协议,标准为RFC3550/3551。RTP协议支持TCP和UDP两种传输方式,RTP协议负责对流媒体数据进行封包并实现媒体流的实时传输,但并不能为按顺序传送的数据包提供可靠的传送机制,也不提供流量和拥塞控制,这些是依靠RTCP协议来完成的,两者配合使用。原文链接:https://blog.csdn.net/m0_60259116/article/details/124889465。RTP头部前12个字节的含义是固定的,具体的含义如下所示。
2025-07-17 14:03:19
961
5
原创 h264编码总结
防竞争字节,就是在给 NALU 添加起始码之前,先对码流进行一次遍历,查找码流里面的存在的 0x00 00 00,0x00 00 01,0x00 00 02,0x00 00 03 的字节,在 00 00 之后,插入一个字节,内容是 03。视频在编码的时候,会将一比特一比特的数据写入到码流里面,而在写完之后,就有可能发生一种情况,就是写入的数据数量不满一个字节,补齐的规则是先写入 1 bit 数据,数据内容是 1,然后开始补齐 0,直到补齐到一整个字节。用于表示当前NALU的重要性,值越大,越重要。
2025-07-17 14:02:15
663
原创 rk3588—mpp编码h265
MpiEncTestArgs* cmd = mpi_enc_test_cmd_get(); 分配空间,设置线程1个mpi_enc_test_cmd_update_by_argscmd->rc_mode = MPP_ENC_RC_MODE_BUTT; 设置码率为默认枚举结束标记mpp_opt_parse(opts, argc, argv); 解析命令行h264默认设置码率控制模式, MPP_ENC_RC_MODE_VBR, // 可变码率模式 (Variable Bitrate)水
2025-07-17 09:32:45
2485
5
原创 Linux rpmsg源码分析
RPMsg是利用通道进行数据通信,先用 /dev/rpmsg_ctrl0 设备通过ioctrl生成端点,然后使用生成的端点进行通讯名称服务,VIRTIO_RPMSG_F_NS 宏,不开启就不使用名称服务,使用就需要m核心先发送信息才可以注册设备m核心LinuxRPMsg内核驱动框架涉及到RPMsg框架、virtio框架、remoteproc子系统和mailbox子系统mailbox,驱动开发者可自我注册client生成设备提供APP层直接进行核间通信分析物理层,创建virtio dev。
2025-05-18 17:02:43
1508
原创 DMA映射
dmesg | grep -i dma 命令可以查看内核中可以申请的一致性内存大小空间,这个大小和系统平台有关,下面是64位系统。一般支持多种类型的缓冲区,常见的有。存在内存的一致性问题。是使用专门的接口分配一块。对内存进行访问的,所以。
2025-04-20 11:32:09
1032
1
原创 xdma 驱动分析
xlx_wait_event_interruptible_timeout 等待中断唤醒。初始化DMA请求 xdma_init_request(sgt, ep_addr);处理描述符使用情况达到或超过引擎最大描述符数量的情况。
2025-04-20 10:04:28
2442
原创 创龙3588——debian根文件系统制作
开始构建,最终进入run_build_hooks 传入参数 build debian。make-targets | make-usage 参数的执行分支。run_build_hooks 函数。创建输出目录,软连接redme等。设置环境变量,处理特殊命令等。输出显示最终配置信息。
2025-01-02 16:37:19
1738
原创 of操作函数——获取中断资源
文章目录irq_of_parse_and_mapirqd_get_trigger_typeirq_get_irq_datagpio_to_irqof_irq_getplatform_get_irqirq_of_parse_and_mapunsigned int irq_of_parse_and_map(struct device_node *dev, int index);从设备节点的"interrupts"属性中解析和映射对应的中断号说明:dev: 设备节点, 表示要解析的设备节点。ind
2024-11-12 10:45:20
755
光伏电子工程的设计与实施2022 赛题2单片机代码
2023-03-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅