USB摄像头驱动思路

简介: USB摄像头驱动思路

出入口函数注册usb_driver结构体,设置probe,disconnect,id_table等参数,其中probe函数用于设置usb控制接口的信息,设置video_device结构体,设置它的release, fops,ioctl_ops函数。并且注册这个结构体


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SRBkKUfZ-1580791207434)(https://i.imgur.com/NO1inqk.jpg)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HHbiRVN4-1580791207435)(https://i.imgur.com/BkfUYVr.jpg)]


1.首先会调用myuvc_open函数,


2.调用querycap表明它是个摄像头,且打开数据流传输,


3.列举支持哪些的数据格式


4.返回当前所使用的格式


5.强制设置该格式,测试驱动是否支持这种格


6.APP调用该ioctl让驱动程序分配若干个缓存(作为整体一次性分配), APP将从这些缓存中读到视频数据。


7.查询缓存状态, 比如地址信息(APP可以用mmap进行映射)


8.把缓冲区放入队列, 底层的硬件操作函数将会把数据放入这个队列的缓存。APP传入的v4l2_buf可能有问题, 要做判断。修改状态 ,放入2个队列


队列1: 供APP使用


  • 当缓冲区没有数据时,放入mainqueue队列
  • 当缓冲区有数据时, APP从mainqueue队列中取出


队列2: 供产生数据的函数使用


  • 当采集到数据时,从irqqueue队列中取出第1个缓冲区,存入数据


9.启动传输


向USB摄像头设置参数: 比如使用哪个format, 使用这个format下的哪个frame(分辨率)


1.1 根据一个结构体uvc_streaming_control设置数据包: 可以手工设置,也可以读出后再修改


1.2 调用usb_control_msg发出数据包


d. 设置VideoStreaming Interface所使用的setting


d.1 从myuvc_params确定带宽


d.2 根据setting的endpoint能传输的wMaxPacketSize


找到能满足该带宽的setting


2. 分配设置URB


3. 提交URB以接收数据


10.APP通过poll/select确定有数据后, 把缓存从队列中取出来


11.之前已经通过mmap映射了缓存, APP可以直接读数据


12.再次调用myuvc_vidioc_qbuf把缓存放入队列


13.持续poll


14.停止,kill URB,free URB,设置VideoStreaming Interface为setting 0关闭USB接口

相关文章
|
3月前
|
Android开发 芯片 SoC
全志H713/H618方案:调焦电机(相励磁法步进电机)的驱动原理、适配方法
本文介绍了全志H713/H618方案中调焦电机(相励磁法步进电机)的驱动原理、适配方法,并通过DTS配置和驱动实现代码,详细说明了如何控制步进电机的正反转和步数,以及如何进行测试。
204 1
全志H713/H618方案:调焦电机(相励磁法步进电机)的驱动原理、适配方法
|
4月前
|
前端开发 安全
stm32f407探索者开发板(十一)——SystemInit时钟系统初始化剖析
stm32f407探索者开发板(十一)——SystemInit时钟系统初始化剖析
164 0
|
6月前
|
Java Linux Android开发
嵌入式Android系统耳机驱动基本知识
嵌入式Android系统耳机驱动基本知识
80 0
|
6月前
|
Unix Linux 编译器
Linux驱动设计(一):驱动是什么?
Linux驱动设计(一):驱动是什么?
55 0
|
11月前
|
芯片
带键扫的LED专用驱动方案
一、基本概述 TM1650 是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路。内部集成有MCU输入输出控制数字接口、数据锁存器、LED 驱动、键盘扫描、辉度调节等电路。TM1650 性能稳定、质量可靠、抗干扰能力强,可适用于24 小时长期连续工作的应用场合。 二、特性说明 两种显示模式:8段×4位和7段×4位 段驱动电流大于25mA,位驱动电流大于150mA 提供8级亮度控制 键盘扫描:7×4bit内部集成三极管驱动 高速两线式串行接口 内置时钟振荡电路 内置上电复位电路 支持2.8V-5.5V电源电压 提供DIP16及SOP16封装 适用领域: 家用
|
Linux API
Linux驱动分析之LCD驱动架构
在Linux设备中,LCD显示采用了帧缓冲(framebuffer)技术,所以LCD驱动也叫Framebuffer驱动,所以LCD驱动框架就是围绕帧缓冲展开工作。帧缓冲(framebuffer)是Linux系统为显示设备提供的一个接口,它将显示缓冲区抽象出来,屏蔽图像硬件的底层差异,允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。对于帧缓冲设备而言,只要在显示缓冲区中与显示点对应的区域写入颜色值,对应的颜色会自动在屏幕上显示。帧缓冲为标准字符设备, 主设备号为29,对应于/dev/fbn。
|
缓存 Linux API
Linux驱动分析之Uart驱动架构
UART设备驱动可以使用tty驱动的框架来实现,但是因为串口之间有共性,所以Linux在tty接口上封装了一层(serial core)。后面我们再拿一篇文章来解释tty驱动,tty其实就是各种终端设备,串口其实也是终端设备。
Linux驱动分析之Uart驱动架构
|
Linux
【Linux系统开发】 x210开发板 虚拟驱动创建流程(驱动编译进内核)
【Linux系统开发】 x210开发板 虚拟驱动创建流程(驱动编译进内核)
144 0
|
Linux
一文搞懂 USB 设备端驱动框架
hello 大家好,今天带领大家学习一下USB 设备端驱动 内核版本:4.4.94
1162 0
|
Linux iOS开发 MacOS
图解固件、驱动、软件的区别
图解固件、驱动、软件的区别
1311 0
图解固件、驱动、软件的区别