linux驱动---视频播放采集架构介绍

news2025/4/23 6:43:25

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_info
    struct 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. 注册framebuffer
    register_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 等)        |
------------------------------------------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2340576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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

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

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

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

【锂电池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…

进阶篇 第 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;就是指定当前的容器…

Spark–steaming

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

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

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

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

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

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

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