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