linux驱动---视频播放采集架构介绍
lcd驱动框架(图像显示)
图像显示基础
1. 核心组件架构
用户空间
------------------------------------------
| X11/Wayland | FBDEV应用 | DRM/KMS应用 |
------------------------------------------
内核空间
------------------------------------------
| DRM/KMS 框架 |
| (Direct Rendering Manager) |
------------------------------------------
| Framebuffer (FBDEV) |
------------------------------------------
| LCD控制器驱动 |
| (各厂商的控制驱动) |
------------------------------------------
硬件层
------------------------------------------
| LCD面板 + 控制器硬件 |
------------------------------------------
2. 主要驱动框架
(1)Framebuffer (FBDEV) 框架
传统显示框架,较简单但功能有限
设备节点:/dev/fbX
struct fb_info {struct fb_var_screeninfo var; // 可变参数(分辨率、像素格式等)struct fb_fix_screeninfo fix; // 固定参数struct fb_ops *fbops; // 操作函数集void *screen_base; // 显存基地址
};
(2)DRM/KMS 框架
现代标准显示框架,支持硬件加速、多图层合成等
核心组件:
- KMS (Kernel Mode Setting): 负责显示模式设置
CRTC (扫描时序控制器)
–代表显示控制器,负责生成时序信号
–管理扫描输出和帧缓冲切换
–一个CRTC可以驱动一个或多个显示器
Encoder (输出编码器)
–将数字信号转换为特定接口信号(如HDMI, LVDS等)
–连接CRTC和Connector
Connector (物理连接器)
–代表物理显示接口(HDMI, DisplayPort等)
–检测显示器连接状态和EDID信息
Plane (图像层)
支持多层合成,通常包括:Primary Plane (主显示层)、Overlay Plane (叠加层)、Cursor Plane (光标层)
DRM (Direct Rendering Manage):提供核心基础设施和IOCTL接口
drm_device – 代表整个DRM设备,包含设备特定的操作函数集
drm_file – 代表一个用户空间打开的文件实例,跟踪每个进程的DRM状态
drm_mode – 管理显示模式和相关属性
- GEM (Graphics Execution Manager): 内存管理
- Display Pipeline: 由多个组件组成:
CRTC (扫描时序控制器)
Encoder (输出编码器)
Connector (物理连接器)
Plane (图像层)
3. LCD 控制器驱动开发
(1)基于 FBDEV 的实现
static int lcd_fb_probe(struct platform_device *pdev)
{// 1. 分配fb_infostruct fb_info *info = framebuffer_alloc(sizeof(struct lcd_data), &pdev->dev);// 2. 设置操作函数集static struct fb_ops lcd_fb_ops = {.owner = THIS_MODULE,.fb_set_par = lcd_set_par,.fb_setcolreg = lcd_setcolreg,.fb_fillrect = cfb_fillrect, // 使用软件实现.fb_imageblit = cfb_imageblit,};info->fbops = &lcd_fb_ops;// 3. 配置显示参数info->var.xres = 800;info->var.yres = 480;info->var.bits_per_pixel = 32;// 4. 分配显存info->screen_base = dma_alloc_wc(&pdev->dev, size, &dma_handle, GFP_KERNEL);info->fix.smem_start = dma_handle;info->fix.smem_len = size;// 5. 注册framebufferregister_framebuffer(info);
}
(2)基于 DRM/KMS 的实现
static const struct drm_driver lcd_drm_driver = {.driver_features = DRIVER_MODESET | DRIVER_GEM,.gem_free_object_unlocked = lcd_gem_free_object,.prime_handle_to_fd = drm_gem_prime_handle_to_fd,.prime_fd_to_handle = drm_gem_prime_fd_to_handle,.gem_prime_import = drm_gem_prime_import,
};static int lcd_drm_probe(struct platform_device *pdev)
{// 1. 创建DRM设备drm_dev = drm_dev_alloc(&lcd_drm_driver, &pdev->dev);// 2. 初始化硬件lcd_hw_init(drm_dev);// 3. 设置显示管道ret = lcd_create_pipe(drm_dev, &pipe);// 4. 注册DRM设备drm_dev_register(drm_dev, 0);
}
static const struct drm_crtc_funcs my_crtc_funcs = {.destroy = drm_crtc_cleanup,.set_config = drm_atomic_helper_set_config,.page_flip = drm_atomic_helper_page_flip,.reset = drm_atomic_helper_crtc_reset,.atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,.atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
};static const struct drm_crtc_helper_funcs my_crtc_helper_funcs = {.atomic_check = my_crtc_atomic_check,.atomic_begin = drm_atomic_helper_crtc_begin,.atomic_flush = drm_atomic_helper_crtc_flush,.atomic_enable = my_crtc_atomic_enable,.atomic_disable = my_crtc_atomic_disable,
};static int my_kms_init(struct drm_device *ddev)
{struct my_drm_device *priv = ddev->dev_private;struct drm_plane *primary;struct drm_crtc *crtc;struct drm_encoder *encoder;struct drm_connector *connector;int ret;/* 创建主平面 */ret = drm_plane_helper_add(&priv->primary,&my_primary_helper_funcs);/* 创建CRTC */ret = drm_crtc_init_with_planes(ddev, &priv->crtc,&priv->primary, NULL, &my_crtc_funcs, NULL);drm_crtc_helper_add(&priv->crtc, &my_crtc_helper_funcs);/* 创建Encoder */ret = drm_encoder_init(ddev, &priv->encoder,&my_encoder_funcs, DRM_MODE_ENCODER_TMDS, NULL);/* 创建Connector */ret = drm_connector_init(ddev, &priv->connector,&my_connector_funcs, DRM_MODE_CONNECTOR_HDMIA);drm_connector_helper_add(&priv->connector,&my_connector_helper_funcs);/* 连接Encoder和Connector */drm_connector_attach_encoder(&priv->connector,&priv->encoder);/* 连接CRTC和Encoder */drm_mode_config_reset(ddev);return 0;
}
显存管理 (GEM)
static const struct drm_gem_object_funcs my_gem_funcs = {.free = my_gem_free_object,.print_info = my_gem_print_info,.get_sg_table = my_gem_get_sg_table,.vmap = my_gem_vmap,.vunmap = my_gem_vunmap,
};static int my_gem_create(struct drm_device *ddev,size_t size, struct drm_gem_object **obj)
{struct my_gem_object *my_obj;my_obj = kzalloc(sizeof(*my_obj), GFP_KERNEL);if (!my_obj)return -ENOMEM;drm_gem_private_object_init(ddev, &my_obj->base, size);my_obj->base.funcs = &my_gem_funcs;*obj = &my_obj->base;return 0;
}
4. 设备树配置
典型 LCD 控制器设备树节点:
lcdc: lcd-controller@01c0c000 {compatible = "allwinner,sun8i-a33-tcon";reg = <0x01c0c000 0x1000>;interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;clocks = <&ccu CLK_BUS_TCON0>, <&ccu CLK_TCON0>;clock-names = "ahb", "tcon-ch0";resets = <&ccu RST_BUS_TCON0>;ports {#address-cells = <1>;#size-cells = <0>;tcon0_in: port@0 {reg = <0>;tcon0_in_drc0: endpoint {remote-endpoint = <&drc0_out_tcon0>;};};tcon0_out: port@1 {reg = <1>;tcon0_out_hdmi: endpoint {remote-endpoint = <&hdmi_in_tcon0>;};};};
};
5. 调试方法
常用调试工具和技巧:
# 查看FBDEV信息
cat /proc/fb
fbset -i# DRM调试
cat /sys/kernel/debug/dri/0/state# 内核日志过滤
dmesg | grep -E "drm|fb|lcd"# 显示当前显示模式
modetest -M <driver_name>
5. 性能优化方向
- 异步页面翻转:减少显示延迟
- DMA传输:降低CPU占用
- 硬件加速:利用显示控制器的旋转、缩放功能
- 显存压缩:使用AFBC等压缩技术
- 自适应刷新率:如支持VRR/FreeSync
- 多平面合成:利用硬件叠加层
camera驱动框架(图像采集)
1. 整体架构
用户空间
------------------------------------------
| 应用层 (GStreamer, OpenCV, 自定义应用) |
------------------------------------------
| V4L2 用户空间 API |
| (libv4l2, v4l-utils, media-ctl) |
------------------------------------------
内核空间
------------------------------------------
| V4L2 子系统框架 |
| (Video for Linux 2) |
------------------------------------------
| Media Controller API |
| (管理复杂的多媒体设备拓扑) |
------------------------------------------
| Camera 传感器驱动 |
| (如 ov5640, imx219, 等) |
------------------------------------------
| ISP 图像处理驱动 |
| (可选,用于高端摄像头处理) |
------------------------------------------
硬件层
------------------------------------------
| Camera 传感器 + 接口硬件 |
| (MIPI CSI-2, Parallel, USB 等) |
------------------------------------------
相关文章:
linux驱动---视频播放采集架构介绍
lcd驱动框架(图像显示) 图像显示基础 1. 核心组件架构 用户空间 ------------------------------------------ | X11/Wayland | FBDEV应用 | DRM/KMS应用 | ------------------------------------------ 内核空间 --------------------------------…...
【MATLAB第117期】#源码分享 | 基于MATLAB的SSM状态空间模型多元时间序列预测方法(多输入单输出)
【MATLAB第117期】#源码分享 | 基于MATLAB的SSM状态空间模型多元时间序列预测方法(多输入单输出) 引言 本文使用状态空间模型实现失业率递归预测,状态空间模型(State Space Model, SSM)是一种用于描述动态系统行为的…...
状态管理最佳实践:Riverpod响应式编程
状态管理最佳实践:Riverpod响应式编程 引言 Riverpod是Flutter生态系统中一个强大的状态管理解决方案,它通过响应式编程的方式提供了更加灵活和可维护的状态管理机制。本文将深入探讨Riverpod的核心概念、实践应用以及性能优化技巧。 核心概念 Provi…...
【Linux】线程ID、线程管理、与线程互斥
📚 博主的专栏 🐧 Linux | 🖥️ C | 📊 数据结构 | 💡C 算法 | 🌐 C 语言 上篇文章: 【Linux】线程:从原理到实战,全面掌握多线程编程!-CSDN博客 下…...
python包管理器,conda和uv 的区别
python包管理器,conda和uv 的区别 以下是 conda 和 uv 在 Python 包管理中的深度对比,结合知识库内容进行分析: 1. 核心设计理念 conda 以“环境为中心”,强调跨语言支持(如 Python、R、Julia)和严格的依赖…...
逻辑回归:损失和正则化技术的深入研究
逻辑回归:损失和正则化技术的深入研究 引言 逻辑回归是一种广泛应用于分类问题的统计模型,尤其在机器学习领域中占据着重要的地位。尽管其名称中包含"回归",但逻辑回归本质上是一种分类算法。它的核心思想是在线性回归的基础上添…...
【锂电池SOH估计】RF随机森林锂电池健康状态估计,锂电池SOH估计(Matlab完整源码和数据)
目录 效果一览程序获取程序内容代码分享研究内容基于随机森林(RF)的锂电池健康状态(SOH)估计算法研究摘要1. 引言2. 锂电池SOH评估框架3. 实验与结果分析4. 未来研究方向6. 结论效果一览 程序获取 获取方式一:文章顶部资源处直接下载:【锂电池SOH估计】RF随机森林锂电池…...
【Pytorch 中的扩散模型】去噪扩散概率模型(DDPM)的实现
介绍 广义上讲,扩散模型是一种生成式深度学习模型,它通过学习到的去噪过程来创建数据。扩散模型有很多变体,其中最流行的通常是文本条件模型,它可以根据提示生成特定的图像。一些扩散模型(例如 Control-Net࿰…...
121.在 Vue3 中使用 OpenLayers 实现去掉鼠标右键默认菜单并显示 Feature 信息
🎯 实现效果 👇 本文最终实现的效果如下: ✅ 地图初始化时绘制一个多边形; ✅ 鼠标 右键点击地图任意位置; ✅ 若命中 Feature,则弹出该图形的详细信息; ✅ 移除浏览器默认的右键菜单,保留地图交互的完整控制。 💡 整个功能基于 Vue3 + OpenLayers 完成,采用 Com…...
仓颉造字,亦可造AI代理
CangjieMagic入门教程 本文将为您提供一份关于CangjieMagic代码库的详细入门教程,CangjieMagic托管于GitCode - 全球开发者的开源社区,开源代码托管平台。这是一个基于仓颉编程语言的LLM(大语言模型)Agent开发平台,具有独特的Age…...
进阶篇 第 6 篇:时间序列遇见机器学习与深度学习
进阶篇 第 6 篇:时间序列遇见机器学习与深度学习 (图片来源: Tara Winstead on Pexels) 在上一篇中,我们探讨了如何通过精心的特征工程,将时间序列预测问题转化为机器学习可以处理的监督学习任务。我们学习了如何创建滞后特征、滚动统计特征…...
【音视频】音频解码实战
音频解码过程 ⾳频解码过程如下图所示: FFmpeg流程 关键函数 关键函数说明: avcodec_find_decoder:根据指定的AVCodecID查找注册的解码器。av_parser_init:初始化AVCodecParserContext。avcodec_alloc_context3:为…...
DOCA介绍
本文分为两个部分: DOCA及BlueField介绍如何运行DOCA应用,这里以DNS_Filter为例子做大致介绍。 DOCA及BlueField介绍: 现代企业数据中心是软件定义的、完全可编程的基础设施,旨在服务于跨云、核心和边缘环境的高度分布式应用工作…...
# 利用迁移学习优化食物分类模型:基于ResNet18的实践
利用迁移学习优化食物分类模型:基于ResNet18的实践 在深度学习的众多应用中,图像分类一直是一个热门且具有挑战性的领域。随着研究的深入,我们发现利用预训练模型进行迁移学习是一种非常有效的策略,可以显著提高模型的性能&#…...
洗车小程序系统前端uniapp 后台thinkphp
洗车小程序系统 前端uniapp 后台thinkphp 支持多门店 分销 在线预约 套餐卡等...
HCIP(综合实验2)
1.实验拓补图 2.实验要求 1.根据提供材料划分VLAN以及IP地址,PC1/PC2属于生产一部员工划分VLAN10,PC3属于生产二部划分VLAN20 2.HJ-1HJ-2交换机需要配置链路聚合以保证业务数据访问的高带宽需求 3.VLAN的放通遵循最小VLAN透传原则 4.配置MSTP生成树解决二层环路问题…...
Linux mmp文件映射补充(自用)
addr一般为NULL由OS指明,length所需长度(4kb对齐),prot(权限,一般O_RDWR以读写), flag(MAP_SHARED(不刷新到磁盘上,此进程独有)和MAP_PRIVATE(刷新…...
单元测试学习笔记(一)
自动化测试 通过测试工具/编程模拟手动测试步骤,全自动半自动执行测试用例,对比预期输出和实际输出,记录并统计测试结果,减少重复的工作量。 单元测试 针对最小的单元测试,Java中就是一个一个的方法就是一个一个的单…...
【深度学习新浪潮】新视角生成的研究进展调研报告(2025年4月)
新视角生成(Novel View Synthesis)是计算机视觉与图形学领域的核心技术,旨在从单张或稀疏图像中生成任意视角的高保真图像,突破传统多视角数据的限制,实现对三维场景的自由探索。作为计算机视觉与图形学的交叉领域,近新视角生成年来在算法创新、应用落地和工具生态上均取…...
OpenHarmony OS 5.0与Android 13显示框架对比
1. 架构概述 1.1 OpenHarmony OS 5.0架构 OpenHarmony OS 5.0采用分层架构设计,图形显示系统从底层到顶层包括: 应用层:ArkUI应用和第三方应用框架层:ArkUI框架、窗口管理API系统服务层:图形合成服务、窗口管理服务…...
[Java] 泛型
目录 1、初识泛型 1.1、泛型类的使用 1.2、泛型如何编译的 2、泛型的上界 3、通配符 4、通配符上界 5、通配符下界 1、初识泛型 泛型:就是将类型进行了传递。从代码上讲,就是对类型实现了参数化。 泛型的主要目的:就是指定当前的容器…...
Vue3 项目中零成本接入 AI 能力(以图搜图、知识问答、文本匹配)...
以下是在 Vue3 项目中零成本接入 AI 能力(以图搜图、知识问答、文本匹配)的完整解决方案,结合免费 API 和开源工具实现,无需服务器或付费服务: 一、以图搜图(基于 Hugging Face CLIP 模型) 核心思路 通过 Hugging Face Inference API 调用 CLIP 模型,将图片转换为向…...
Spark–steaming
实验项目: 找出所有有效数据,要求电话号码为11位,但只要列中没有空值就算有效数据。 按地址分类,输出条数最多的前20个地址及其数据。 代码讲解: 导包和声明对象,设置Spark配置对象和SparkContext对象。 使用Spark S…...
【目标检测】对YOLO系列发展的简单理解
目录 1.YOLOv12.YOLOv23.YOLOv34.YOLOv45.YOLOv66.YOLOv77.YOLOv9 YOLO系列文章汇总: 【论文#目标检测】You Only Look Once: Unified, Real-Time Object Detection 【论文#目标检测】YOLO9000: Better, Faster, Stronger 【论文#目标检测】YOLOv3: An Incremental …...
前端框架的“快闪“时代:我们该如何应对技术迭代的洪流?
引言:前端开发者的"框架疲劳" “上周刚学完Vue 3的组合式API,这周SolidJS又火了?”——这恐怕是许多前端开发者2023年的真实心声。前端框架的迭代速度已经达到了令人目眩的程度,GitHub每日都有新框架诞生,n…...
深度学习训练中的显存溢出问题分析与优化:以UNet图像去噪为例
最近在训练一个基于 Tiny-UNet 的图像去噪模型时,我遇到了经典但棘手的错误: RuntimeError: CUDA out of memory。本文记录了我如何从复现、分析,到逐步优化并成功解决该问题的全过程,希望对深度学习开发者有所借鉴。 训练数据&am…...
Python爬虫实战:获取优志愿专业数据
一、引言 在信息爆炸的当下,数据成为推动各领域发展的关键因素。优志愿网站汇聚了丰富的专业数据,对于教育研究、职业规划等领域具有重要价值。然而,为保护自身数据和资源,许多网站设置了各类反爬机制。因此,如何高效、稳定地从优志愿网站获取计算机专业数据成为一个具有…...
2025.4.22学习日记 JavaScript的常用事件
在 JavaScript 里,事件是在文档或者浏览器窗口中发生的特定交互瞬间,例如点击按钮、页面加载完成等等。下面是一些常用的事件以及案例: 1. click 事件 当用户点击元素时触发 const button document.createElement(button); button.textCo…...
如何修复WordPress中“您所关注的链接已过期”的错误
几乎每个管理WordPress网站的人都可能遇到过“您关注的链接已过期”的错误,尤其是在上传插件或者主题的时候。本文将详细解释该错误出现的原因以及如何修复,帮助您更好地管理WordPress网站。 为什么会出现“您关注的链接已过期”的错误 为了防止资源被滥…...
从零开始搭建Django博客①--正式开始前的准备工作
本文主要在Ubuntu环境上搭建,为便于研究理解,采用SSH连接在虚拟机里的ubuntu-24.04.2-desktop系统搭建的可视化桌面,涉及一些文件操作部分便于通过桌面化进行理解,最后的目标是在本地搭建好系统后,迁移至云服务器并通过…...
