下面分析mxc_v4l_ioctl函数:
static long mxc_v4l_ioctl(struct file *file, unsigned int cmd,
unsigned long arg)
{
pr_debug("In MVC:mxc_v4l_ioctl
");
return video_usercopy(file, cmd, arg, mxc_v4l_do_ioctl);
}
它通过调用video_usercopy函数,最终就调用到这个mxc_v4l_do_ioctl函数,这个mxc_v4l_do_ioctl函数内部包含一个switch语句,根据传入不同的ioctl宏来选择执行不同的语句。下面就按不同的宏来分析。
我们根据一般摄像头应用程序的执行调用过程来顺序分析。
1.VIDIOC_QUERYCAP宏
case VIDIOC_QUERYCAP: {
struct v4l2_capability *cap = arg;
pr_debug(" case VIDIOC_QUERYCAP
");
strcpy(cap->driver, "mxc_v4l2");
cap->version = KERNEL_VERSION(0, 1, 11);
cap-> = V4L2_CAP_VIDEO_CAPTURE |
V4L2_CAP_VIDEO_OVERLAY |
V4L2_CAP_STREAMING |
V4L2_CAP_READWRITE;
cap->card[0] = '