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

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 等)        |
------------------------------------------

相关文章:

  • 数据结构-树
  • python高级特性01
  • 移动通信运营商对MTU的大小设置需求
  • 【含文档+PPT+源码】基于微信小程序的健康饮食食谱推荐平台的设计与实现
  • VulnHub-DarkHole_1靶机渗透教程
  • C语言教程(十一):C 语言中四种主要作用域及作用域嵌套遮蔽
  • 用户需求报告、系统需求规格说明书、软件需求规格说明的对比分析
  • 【vue】当vant中picker选择器的值为对象数组的解决方法
  • MYSQL之库的操作
  • SQL简介
  • 深度解析MySQL INSERT ... ON DUPLICATE KEY UPDATE语句
  • YOLOv8改进:ShapeIoU与InnerShapeIoU损失函数的理论与实践
  • 10_C++入门案例习题: 结构体案例
  • Java 中 == 和 equals() 的区别
  • C++ 的 输入输出流(I/O Streams)
  • RSGISLib:一款功能强大的GIS与RS数据处理Python工具包
  • 关于大数据的基础知识(三)——数据安全与合规
  • Python量化投资知识体系与学习路径
  • stat判断路径
  • 麒麟系统网络连接问题排查
  • 蚌埠一动物园用染色犬扮熊猫引争议,园方回应:被投诉已撤走
  • 甘肃省政府原副省长赵金云严重职务违法被开除公职
  • 马上评丨超常设置战略急需专业,意味着什么
  • 5旬辅警30余年前被人顶替上中专?河南沁阳:基本属实,将依法处理
  • 依托空域优势,浦江镇将建设上海首个“低空融合飞行示范区”
  • 人民网评“我愿意跟他挨着”热搜第一:充满温暖力量的七个字