V4L2 driver(一). 整体框架

本文详细介绍了V4L2驱动的工作原理,从字符设备出发,探讨了v4l2_fops的封装,v4l2_file_operations的分拆,以及soc_camera子系统的衔接。核心内容包括驱动如何实现file_operations接口中的关键函数,并通过v4l2_ioctl_ops分解ioctl命令,提高代码可读性和可维护性。最后,文章概述了soc_camera如何在v4l2-core基础上提供更具体的接口,简化camera host驱动开发。
摘要由CSDN通过智能技术生成

1.1 从字符设备说起

熟悉v4l2用户空间编程的都知道, v4l2编程主要是调用一系列的ioctl函数去对v4l2设备进行打开, 关闭, 查询, 设置等操作. v4l2设备是一个字符设备, 而且其驱动的主要工作就是实现各种各样的ioctl.
v4l2的整体框架如下图所示

V4L2的整体框架图
这里写图片描述

上图中, 淡绿色背景为用户空间, 淡蓝色背景为内核空间. 椭圆表示相关的结构体, 子系统或实例. 方框表示相关的接口. 蓝色的椭圆表示这部分属于v4l2-core的内容. 从图中可以看出用户空间通过file_operations接口与内核空间进行交互, 因此驱动必须实现file_operations中的相关的内容, 其中比较重要的几个函数是open, release, ioctl, mmap, poll. readwrite是可以不需要实现的. 因为为了效率v4l2基本都是使用流io的方式来进行数据传输的. 在v4l2的核心中对这个file_operations的实现如下:

static const struct file_operations v4l2_fops = {
    .owner = THIS_MODULE,
    .read = v4l2_read,
    .write = v4l2_write,
    .open = v4l2_open,
    .get_unmapped_area = v4l2_get_unmapped_area,
    .mmap = v4l2_mmap,
    .unlocked_ioctl = v4l2_ioctl,
#ifdef CONFIG_COMPAT
    .compat_ioctl = v4l2_compat_ioctl32,
#endif
    .release = v4l2_release,
    .poll = v4l2_poll,
    .llseek = no_llseek,
};

这个v4l2_fops函数最终绑定在一个cdev上, 并注册到系统中. 之后对该v4l2设备的调用都是通过这个cdev的设备节点进行调用的. 这个cdev的指针被一个video_device结构体引用, 从而将cdev封装到了v4l2的框架中.

1.2 v4l2_fops的封装

这里以这个fops的mmap为例:

static int v4l2_mmap(struct file *filp, struct vm_area_struct *vm)
{
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值