USB摄像头驱动

1、简单字符设备操作流程

在这里插入图片描述

2、复杂字符设备操作流程(LCD)

在这里插入图片描述
如何写分层驱动:

  1. 分配某个结构体
  2. 设置
  3. 注册
  4. 硬件相关操作
3、V4L2字符设备操作流程(复杂字符设备)

V4L2框架: video for linux version 2
在这里插入图片描述

3.1 虚拟视频驱动vivi.c分析:

1.分配video_device
2.设置
3.注册:video_register_device

vivi_init
    vivi_create_instance
        v4l2_device_register   // 不是主要, 只是用于初始化一些东西,比如自旋锁、引用计数
        video_device_alloc
        // 设置
          1. vfd:
            .fops           = &vivi_fops,
            .ioctl_ops 	= &vivi_ioctl_ops,
            .release	= video_device_release,
          2.
            vfd->v4l2_dev = &dev->v4l2_dev;
          3. 设置"ctrl属性"(用于APP的ioctl):
            	v4l2_ctrl_handler_init(hdl, 11);
            	dev->volume = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
            			V4L2_CID_AUDIO_VOLUME, 0, 255, 1, 200);
            	dev->brightness = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
            			V4L2_CID_BRIGHTNESS, 0, 255, 1, 127);
            	dev->contrast = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
            			V4L2_CID_CONTRAST, 0, 255, 1, 16);                        
        video_register_device(video_device, type:VFL_TYPE_GRABBER, nr)
            __video_register_device
                vdev->cdev = cdev_alloc();
                vdev->cdev->ops = &v4l2_fops;
                cdev_add
                
                video_device[vdev->minor] = vdev;//vdev 创建

        		if (vdev->ctrl_handler == NULL)
        			vdev->ctrl_handler = vdev->v4l2_dev->ctrl_handler;

分析vivi.c的open,read,write,ioctl过程

 1. open
app:     open("/dev/video0",....)
---------------------------------------------------
drv:     v4l2_fops.v4l2_open
            vdev = video_devdata(filp);  // 根据次设备号从数组中得到video_device
            ret = vdev->fops->open(filp);
                        vivi_ioctl_ops.open
                            v4l2_fh_open

 2. read
app:    read ....
---------------------------------------------------
drv:    v4l2_fops.v4l2_read
            struct video_device *vdev = video_devdata(filp);
            ret = vdev->fops->read(filp, buf, sz, off);

 3. ioctl
app:   ioctl
----------------------------------------------------
drv:   v4l2_fops.unlocked_ioctl
            v4l2_ioctl
                struct video_device *vdev = video_devdata(filp);
                ret = vdev->fops->unlocked_ioctl(filp, cmd, arg);
                            video_ioctl2
                                video_usercopy(file, cmd, arg, __video_do_ioctl);
                                    __video_do_ioctl
                                        struct video_device *vfd = video_devdata(file);
                                        根据APP传入的cmd来获得、设置"某些属性"

如何写V4L2驱动
在这里插入图片描述
v4l2_ctrl_handler的使用过程:

    __video_do_ioctl
        struct video_device *vfd = video_devdata(file);

    	case VIDIOC_QUERYCTRL:
    	{
    		struct v4l2_queryctrl *p = arg;
    
    		if (vfh && vfh->ctrl_handler)
    			ret = v4l2_queryctrl(vfh->ctrl_handler, p);
    		else if (vfd->ctrl_handler)  // 在哪设置?在video_register_device
    			ret = v4l2_queryctrl(vfd->ctrl_handler, p);
    			            // 根据ID在ctrl_handler里找到v4l2_ctrl,返回它的值
4、测试虚拟驱动vivi
4.1 准备工作:安装xawtv

方法一:

sudo apt-get install xawtv

源码xawtv-3.95.tar.gz

方法二:
在这个网站创建新的sources.list
http://repogen.simplylinux.ch/

  1. 选择国家
  2. 选择相邻的ubuntu版本
  3. 选择"Ubuntu Branches"
  4. 生成sources.list
  5. 把得到内容替换到/etc/apt/sources.list
  6. sudo apt-get update
    sudo apt-get install xawtv
4.2 测试USB摄像头:

1.让VMWAER处于前台,接上USB摄像头,可以看到生成了/dev/video0
2.执行 xawtv 即可看到图像

4.3 测试虚拟摄像头vivi:
  1. 确实ubuntu的内核版本
uname -a
Linux book-desktop 2.6.31-14-generic #48-Ubuntu SMP Fri Oct 16 14:04:26 UTC 2009 i686 GNU/Linux
  1. 去www.kernel.org下载同版本的内核
    解压后把drivers/media/video目录取出
//修改Makefile为
KERN_DIR = /usr/src/linux-headers-2.6.31-14-generic

all:
        make -C $(KERN_DIR) M=`pwd` modules 

clean:
        make -C $(KERN_DIR) M=`pwd` modules clean
        rm -rf modules.order  
obj-m   += vivi.o
obj-m   += videobuf-core.o
obj-m   += videobuf-vmalloc.o
obj-m   += v4l2-common.o
  1. make
   insmod videobuf-core.ko
   insmod videobuf-vmalloc.ko
   insmod v4l2-common.ko
   insmod vivi.ko
  1. ls /dev/video*
  2. xawtv -c /dev/videoX
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Zynq USB摄像头驱动是指在Xilinx公司的Zynq系列芯片上驱动USB摄像头的软件程序。Zynq系列芯片是一种结合了ARM处理器和可编程逻辑部分(FPGA)的SoC(System on Chip)芯片,具备处理器的高性能和FPGA的灵活性。 为了实现Zynq USB摄像头驱动,首先需要了解所使用的摄像头的型号和通信协议。不同型号的摄像头可能采用不同的通信协议,如UVC (USB Video Class)或者是厂商自定义的协议。 在驱动开发过程中,需要使用Linux操作系统的内核源码,并根据摄像头的通信协议进行相应的驱动程序开发。开发过程中可能需要编写各种函数,如初始化函数、帧捕获函数、图像处理函数等。初始化函数主要负责USB摄像头的硬件初始化和系统资源的分配;帧捕获函数负责从USB摄像头中获取图像帧数据;图像处理函数负责对获取到的图像帧数据进行处理、分析和渲染等操作。 在驱动编写完成后,需要将其编译成适配于Zynq系列芯片的可执行文件,并将其加载到Zynq芯片上执行。在加载和运行过程中可能需要进行设备树(DTS)的配置,以确保操作系统能够正确地识别和使用USB摄像头驱动。 总结起来,Zynq USB摄像头驱动的开发过程主要包括摄像头通信协议了解、驱动程序编写、编译和加载等步骤。通过这些步骤,可以使Zynq系列芯片能够与USB摄像头实现通信,并获取到摄像头的图像数据,为后续图像处理和分析等应用提供基础支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值