摄像头camera驱动开发基础-USB和UVC

从独立件来看,包括传感器模组和核心板两部分;所以驱动软件的核心就是保证两者之间的连接,硬件接口常见两种MIPI和USB,MIPI接口调试中重点关注PHY层;软件驱动框架常见的V4L2和UVC。

本章主要介绍另一种摄像头驱动USB和UVC,是上一章的补充:摄像头camera驱动开发基础-MIPI和V4L2

1. 摄像头USB接口协议

USB ISO协议适用于实时性要求高的流数据传输;而Bulk协议则适用于大量数据的非实时传输。

两种协议在UVC中都可以使用,需要根据具体的使用场景进行适配切换。

在软件实现上,两者都依赖于相应的USB库函数和API,同时也保留差异。

在Linux系统中,可以使用libusb库来实现ISO传输。

libusb提供了如libusb_fill_iso_transfer()libusb_submit_transfer()等函数来设置和提交ISO传输请求。

在Android开发中,可以使用Android的USB Host API来实现Bulk传输。提供了如UsbDeviceConnection.bulkTransfer()等函数来发送和接收Bulk数据包。

协议 ISO协议 Bulk协议
实时性 提供了确定的带宽和间隔时间,具有较强容错性的流数据传输。 没有严格的要求
带宽 要求恒定的数据传输率,包丢失也不会中断 会等到所有其他类型的数据传输完成之后再进行带宽分配
数据完整性 即时的数据传递更重要 要求保证传输的完整性和正确性

2. USB硬件接口

Android系统Linux内核中,USB控制器支持USB3.0 OTG功能,并向下兼容USB2.0。USB子系统即可以支持USB口作为peripheral功能。

当USB作为USB主模式Hostmode使用,软件中可以把USB作为OTG使用。

当用作USB ADB调试,其中D+/D-引脚用在USB2.0时,提供信号通道;同时TX1/2和RX1/2提供最多双通道的20Gbps带宽的超速数据链路。
[图片上传失败...(image-800565-1736093200341)]

3. 驱动软件框架UVC

UVC(USB Video Class)框架专为USB视频捕获设备定义的协议标准,整个UVC还是基于USB框架的,它定义了设备如何与主机通信,包括视频流的传输、控制命令的发送等,应用于外接USB摄像头。

配置USB模式,确保Android设备支持USB主机模式,并配置相应的USB接口和驱动。

驱动开发涉及到底层Linux内核的修改和编译,将UVC驱动集成到Android系统的Linux内核中,并验证正确识别和管理USB视频设备。

UVC设备的接入,在上层编写代码枚举和初始化USB摄像头设备,通过API实现视频流的捕获和显示功能。

当USB设备插入系统时,首先由USB总线驱动进行初步识别,确认是一个USB设备后,读取配置描述符进一步确认设备类型;

当确认是UVC设备,则调用对应的USB接口驱动uvcvideo进行匹配和注册。

微信图片_20241230232312.jpg

总结

当你了解了基本的硬件驱动接口,就能更加容易的理解软件的相关接口设置。

具备以上知识之后,实际的工作重点除了bringup驱动时进行一些设备树以及接口的调试,重点就是基于使用驱动框架,提供相关接口给到上层的操作系统HAL层。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容