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

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驱动框架&#xff08;图像显示&#xff09; 图像显示基础 1. 核心组件架构 用户空间 ------------------------------------------ | X11/Wayland | FBDEV应用 | DRM/KMS应用 | ------------------------------------------ 内核空间 --------------------------------…...

【MATLAB第117期】#源码分享 | 基于MATLAB的SSM状态空间模型多元时间序列预测方法(多输入单输出)

【MATLAB第117期】#源码分享 | 基于MATLAB的SSM状态空间模型多元时间序列预测方法&#xff08;多输入单输出&#xff09; 引言 本文使用状态空间模型实现失业率递归预测&#xff0c;状态空间模型&#xff08;State Space Model, SSM&#xff09;是一种用于描述动态系统行为的…...

状态管理最佳实践:Riverpod响应式编程

状态管理最佳实践&#xff1a;Riverpod响应式编程 引言 Riverpod是Flutter生态系统中一个强大的状态管理解决方案&#xff0c;它通过响应式编程的方式提供了更加灵活和可维护的状态管理机制。本文将深入探讨Riverpod的核心概念、实践应用以及性能优化技巧。 核心概念 Provi…...

【Linux】线程ID、线程管理、与线程互斥

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f310; C 语言 上篇文章&#xff1a; 【Linux】线程&#xff1a;从原理到实战&#xff0c;全面掌握多线程编程&#xff01;-CSDN博客 下…...

python包管理器,conda和uv 的区别

python包管理器&#xff0c;conda和uv 的区别 以下是 conda 和 uv 在 Python 包管理中的深度对比&#xff0c;结合知识库内容进行分析&#xff1a; 1. 核心设计理念 conda 以“环境为中心”&#xff0c;强调跨语言支持&#xff08;如 Python、R、Julia&#xff09;和严格的依赖…...

逻辑回归:损失和正则化技术的深入研究

逻辑回归&#xff1a;损失和正则化技术的深入研究 引言 逻辑回归是一种广泛应用于分类问题的统计模型&#xff0c;尤其在机器学习领域中占据着重要的地位。尽管其名称中包含"回归"&#xff0c;但逻辑回归本质上是一种分类算法。它的核心思想是在线性回归的基础上添…...

【锂电池SOH估计】RF随机森林锂电池健康状态估计,锂电池SOH估计(Matlab完整源码和数据)

目录 效果一览程序获取程序内容代码分享研究内容基于随机森林(RF)的锂电池健康状态(SOH)估计算法研究摘要1. 引言2. 锂电池SOH评估框架3. 实验与结果分析4. 未来研究方向6. 结论效果一览 程序获取 获取方式一:文章顶部资源处直接下载:【锂电池SOH估计】RF随机森林锂电池…...

【Pytorch 中的扩散模型】去噪扩散概率模型(DDPM)的实现

介绍 广义上讲&#xff0c;扩散模型是一种生成式深度学习模型&#xff0c;它通过学习到的去噪过程来创建数据。扩散模型有很多变体&#xff0c;其中最流行的通常是文本条件模型&#xff0c;它可以根据提示生成特定的图像。一些扩散模型&#xff08;例如 Control-Net&#xff0…...

121.在 Vue3 中使用 OpenLayers 实现去掉鼠标右键默认菜单并显示 Feature 信息

🎯 实现效果 👇 本文最终实现的效果如下: ✅ 地图初始化时绘制一个多边形; ✅ 鼠标 右键点击地图任意位置; ✅ 若命中 Feature,则弹出该图形的详细信息; ✅ 移除浏览器默认的右键菜单,保留地图交互的完整控制。 💡 整个功能基于 Vue3 + OpenLayers 完成,采用 Com…...

仓颉造字,亦可造AI代理

CangjieMagic入门教程 本文将为您提供一份关于CangjieMagic代码库的详细入门教程&#xff0c;CangjieMagic托管于GitCode - 全球开发者的开源社区,开源代码托管平台。这是一个基于仓颉编程语言的LLM&#xff08;大语言模型&#xff09;Agent开发平台&#xff0c;具有独特的Age…...

进阶篇 第 6 篇:时间序列遇见机器学习与深度学习

进阶篇 第 6 篇&#xff1a;时间序列遇见机器学习与深度学习 (图片来源: Tara Winstead on Pexels) 在上一篇中&#xff0c;我们探讨了如何通过精心的特征工程&#xff0c;将时间序列预测问题转化为机器学习可以处理的监督学习任务。我们学习了如何创建滞后特征、滚动统计特征…...

【音视频】音频解码实战

音频解码过程 ⾳频解码过程如下图所示&#xff1a; FFmpeg流程 关键函数 关键函数说明&#xff1a; avcodec_find_decoder&#xff1a;根据指定的AVCodecID查找注册的解码器。av_parser_init&#xff1a;初始化AVCodecParserContext。avcodec_alloc_context3&#xff1a;为…...

DOCA介绍

本文分为两个部分&#xff1a; DOCA及BlueField介绍如何运行DOCA应用&#xff0c;这里以DNS_Filter为例子做大致介绍。 DOCA及BlueField介绍&#xff1a; 现代企业数据中心是软件定义的、完全可编程的基础设施&#xff0c;旨在服务于跨云、核心和边缘环境的高度分布式应用工作…...

# 利用迁移学习优化食物分类模型:基于ResNet18的实践

利用迁移学习优化食物分类模型&#xff1a;基于ResNet18的实践 在深度学习的众多应用中&#xff0c;图像分类一直是一个热门且具有挑战性的领域。随着研究的深入&#xff0c;我们发现利用预训练模型进行迁移学习是一种非常有效的策略&#xff0c;可以显著提高模型的性能&#…...

洗车小程序系统前端uniapp 后台thinkphp

洗车小程序系统 前端uniapp 后台thinkphp 支持多门店 分销 在线预约 套餐卡等...

HCIP(综合实验2)

1.实验拓补图 2.实验要求 1.根据提供材料划分VLAN以及IP地址&#xff0c;PC1/PC2属于生产一部员工划分VLAN10,PC3属于生产二部划分VLAN20 2.HJ-1HJ-2交换机需要配置链路聚合以保证业务数据访问的高带宽需求 3.VLAN的放通遵循最小VLAN透传原则 4.配置MSTP生成树解决二层环路问题…...

Linux mmp文件映射补充(自用)

addr一般为NULL由OS指明&#xff0c;length所需长度&#xff08;4kb对齐&#xff09;&#xff0c;prot&#xff08;权限&#xff0c;一般O_RDWR以读写&#xff09;&#xff0c; flag&#xff08;MAP_SHARED(不刷新到磁盘上&#xff0c;此进程独有)和MAP_PRIVATE&#xff08;刷新…...

单元测试学习笔记(一)

自动化测试 通过测试工具/编程模拟手动测试步骤&#xff0c;全自动半自动执行测试用例&#xff0c;对比预期输出和实际输出&#xff0c;记录并统计测试结果&#xff0c;减少重复的工作量。 单元测试 针对最小的单元测试&#xff0c;Java中就是一个一个的方法就是一个一个的单…...

【深度学习新浪潮】新视角生成的研究进展调研报告(2025年4月)

新视角生成(Novel View Synthesis)是计算机视觉与图形学领域的核心技术,旨在从单张或稀疏图像中生成任意视角的高保真图像,突破传统多视角数据的限制,实现对三维场景的自由探索。作为计算机视觉与图形学的交叉领域,近新视角生成年来在算法创新、应用落地和工具生态上均取…...

OpenHarmony OS 5.0与Android 13显示框架对比

1. 架构概述 1.1 OpenHarmony OS 5.0架构 OpenHarmony OS 5.0采用分层架构设计&#xff0c;图形显示系统从底层到顶层包括&#xff1a; 应用层&#xff1a;ArkUI应用和第三方应用框架层&#xff1a;ArkUI框架、窗口管理API系统服务层&#xff1a;图形合成服务、窗口管理服务…...

[Java] 泛型

目录 1、初识泛型 1.1、泛型类的使用 1.2、泛型如何编译的 2、泛型的上界 3、通配符 4、通配符上界 5、通配符下界 1、初识泛型 泛型&#xff1a;就是将类型进行了传递。从代码上讲&#xff0c;就是对类型实现了参数化。 泛型的主要目的&#xff1a;就是指定当前的容器…...

Vue3 项目中零成本接入 AI 能力(以图搜图、知识问答、文本匹配)...

以下是在 Vue3 项目中零成本接入 AI 能力(以图搜图、知识问答、文本匹配)的完整解决方案,结合免费 API 和开源工具实现,无需服务器或付费服务: 一、以图搜图(基于 Hugging Face CLIP 模型) 核心思路 通过 Hugging Face Inference API 调用 CLIP 模型,将图片转换为向…...

Spark–steaming

实验项目: 找出所有有效数据&#xff0c;要求电话号码为11位&#xff0c;但只要列中没有空值就算有效数据。 按地址分类&#xff0c;输出条数最多的前20个地址及其数据。 代码讲解&#xff1a; 导包和声明对象&#xff0c;设置Spark配置对象和SparkContext对象。 使用Spark S…...

【目标检测】对YOLO系列发展的简单理解

目录 1.YOLOv12.YOLOv23.YOLOv34.YOLOv45.YOLOv66.YOLOv77.YOLOv9 YOLO系列文章汇总&#xff1a; 【论文#目标检测】You Only Look Once: Unified, Real-Time Object Detection 【论文#目标检测】YOLO9000: Better, Faster, Stronger 【论文#目标检测】YOLOv3: An Incremental …...

前端框架的“快闪“时代:我们该如何应对技术迭代的洪流?

引言&#xff1a;前端开发者的"框架疲劳" “上周刚学完Vue 3的组合式API&#xff0c;这周SolidJS又火了&#xff1f;”——这恐怕是许多前端开发者2023年的真实心声。前端框架的迭代速度已经达到了令人目眩的程度&#xff0c;GitHub每日都有新框架诞生&#xff0c;n…...

深度学习训练中的显存溢出问题分析与优化:以UNet图像去噪为例

最近在训练一个基于 Tiny-UNet 的图像去噪模型时&#xff0c;我遇到了经典但棘手的错误&#xff1a; RuntimeError: CUDA out of memory。本文记录了我如何从复现、分析&#xff0c;到逐步优化并成功解决该问题的全过程&#xff0c;希望对深度学习开发者有所借鉴。 训练数据&am…...

Python爬虫实战:获取优志愿专业数据

一、引言 在信息爆炸的当下,数据成为推动各领域发展的关键因素。优志愿网站汇聚了丰富的专业数据,对于教育研究、职业规划等领域具有重要价值。然而,为保护自身数据和资源,许多网站设置了各类反爬机制。因此,如何高效、稳定地从优志愿网站获取计算机专业数据成为一个具有…...

2025.4.22学习日记 JavaScript的常用事件

在 JavaScript 里&#xff0c;事件是在文档或者浏览器窗口中发生的特定交互瞬间&#xff0c;例如点击按钮、页面加载完成等等。下面是一些常用的事件以及案例&#xff1a; 1. click 事件 当用户点击元素时触发 const button document.createElement(button); button.textCo…...

如何修复WordPress中“您所关注的链接已过期”的错误

几乎每个管理WordPress网站的人都可能遇到过“您关注的链接已过期”的错误&#xff0c;尤其是在上传插件或者主题的时候。本文将详细解释该错误出现的原因以及如何修复&#xff0c;帮助您更好地管理WordPress网站。 为什么会出现“您关注的链接已过期”的错误 为了防止资源被滥…...

从零开始搭建Django博客①--正式开始前的准备工作

本文主要在Ubuntu环境上搭建&#xff0c;为便于研究理解&#xff0c;采用SSH连接在虚拟机里的ubuntu-24.04.2-desktop系统搭建的可视化桌面&#xff0c;涉及一些文件操作部分便于通过桌面化进行理解&#xff0c;最后的目标是在本地搭建好系统后&#xff0c;迁移至云服务器并通过…...