基于RK3576开发板的USB摄像头使用

1. USB简介

       USB:Universal Serial Bus(通用串行总线)。是一种常用于电子设备间通讯的通用标准接口。USB 总线作为一种高速串行总线,其极高的传输速度可以满足高速数据传输的应用环境要求。

       具有供电简单(可总线供电)、安装配置便捷(支持即插即用和热插拔)、 扩展端口简易(通过集线器最多可扩展127 个外设)、传输方式多样化(4 种传输模式),以及兼容良好(产品升级后向下兼容)等优点。

1.1  EASY EAI Orin-Nano USB资源介绍

       EASY EAI Orin-Nano有一路直出的USB3.0 HOST接口,还有一路直出的OTG接口。

       若不了解【USB HOST】、【USB Device】以及【OTG】的含义,又或者有【必须使下层USB作为HOST】的需求,可参考《USB_HOST与USB_Device》一文。

1.2  USB摄像头接入方案

       注意:虽然USB支持热插拔,但在没给底板加装外壳保护的情况下,很容易触碰到底板上的器件,甚至板卡附近有金属零件很容易造成板卡短路。因此也建议在插拔外设时,最好确保电源已经完全切断。

       【建议】USB摄像头【直接】接入到底板的【上层】USB接口上。

       虽然采用多路扩展方案,理论上可扩展127个设备,但在实际接入多个USB摄像头时需要考虑USB通道的带宽,USB集线层数,以及要解决设备ID相同的问题,因此非必要【不建议】这么接。

USB的理论最大层数为7层(含RootHub)。

1.3  USB设备的接入管理介绍

       在USB摄像头或者USB Hub进行物理连接后,我们需要知道这些USB设备是否被系统识别出来,则需要通过lsusb命令查看。

lsusb

       另外,在文件系统中,USB Device管理目录为/sys/bus/usb/devices,可在此处查看到从root_hub开始挂载的USB设备以及Hub设备的拓扑关系

       USB设备的设备命名方式规则如下:

设备对象的命名规则
设备命名规则描述
总线对象usb1、usb2处理器自带的USB硬件,0号hub设备,所以其接口对象是由0开始计算。
直连的USB设备

root_hub-hub_port

注:以“-”段横杠分割

root_hub为所在的总线号码;

hub_port为处于该总线的第几个设备,0号设备总线本身,新接入的设备从1开始。
连在外扩hub的设备

root_hub-hub_port.device

注:以“.”句号分割
新接入的设备作为hub的子设备,编号从1开始
设备对象的接口命名规则
设备命名规则描述
设备对象的接口对象

device_object:config.interface

注:以“:”冒号分割设备对象和后续元素。后续元素有配置和接口,二者以“.”句号分割
device_object:设备对象,上面总线对象、质量设备、经过hub的设备统称为设备对象
config:USB设备的配置描述符,一个USB设备可在不同系统、不同架构下运行的前提就是使用了不同的配置描述符
interfece:USB设备的接口描述符,例如一个USB对讲机,有负责处理播音的接口以及负责录音的接口。

1.4  寻找可用的设备节点

       rockchip平台,一个MIPI-CSI接口会对应20多个video节点(设备树定了就会生成这么多个),如下图所示。

       而且MIPI-CSI camera对应的节点,会在修改内核设备树的时候固定下来(即:内核配好了MIPI-CSI Camera个数,无论MIPI-CSI摄像头是否有接上,它的video节点情况都是不会根据MIPI-CSI Camera的接入情况而【动态】改变)。

       而一个USB camera会对应2个video节点,【一般会】排列在MIPI-CSI camera的后面。举个例子:内核配置了1路MIPI-CSI camera,那USB camera的节点就是/dev/video25和/dev/video26;内核配置了2路MIPI-CSI camera,那USB camera的节点就是/dev/video49和/dev/video50。以此类推。

       但是【最准确】的方法,还是要看一下这个video节点的【描述信息】。Linux的v4l2框架会把这些节点的描述信息统一放在/sys/class/video4linux/目录下,如下图所示。

       随便进入一个描述,如video22。

       通过cat命令,可以用查看这个name的内容是什么。

cat /sys/class/video4linux/video22/name

       那么,我们则需要使用以下命令,对【所有video节点】进行扫描与【筛选】。

grep -i "usb" /sys/class/video4linux/video*/name

2. 快速上手

2.1  例程源码下载

       到【百度网盘】上下载相关的单例程序:

       链接:https://pan.baidu.com/s/1RXHMGpmGSEfFy0rb1VkXSg?pwd=1234

       提取码: 1234

       比如在windows环境中,就把单例程序下载到:此电脑\D:\BaiduNetdisk (无规定,用户可自主选择),如下图所示。

       然后把例程【复制粘贴】到nfs挂载目录中。(不清楚目录如何构建的,可以参考《入门指南/开发环境准备/nfs服务搭建与挂载》

2.2  例程编译&运行

       通过adb shell进入开发板环境,执行下方命令定位到demo目录,并且执行编译操作。

cd /home/orin-nano/Desktop/nfs/02_camera/
./build.sh

       编译成功后,相关的demo会生成在Release目录下。

       执行下方命令以运行demo,如下所示。

sudo ./Release/test-usbCam-single 49  ##需要root权限

       执行效果如下所示。

       然后把/tmp/photo拷贝到当前目录下的Release内

cp /tmp/photo ./Release/

       再通过组合键【Ctrl+Shift+T】创建一个新窗口,定位到nfs服务器的对应位置。

       最后使用mplayer工具播放图片,命令如下所示。

mplayer -demuxer rawvideo -rawvideo w=1280:h=720:format=bgr24 ./Release/photo -loop 0

       例程默认分辨率为1280x720,故w和h的参数对应填入1280和720。当出现图片异常时,说明分辨率等不太对应于手头的摄像头,所以需要调整usbcamera_init()的分辨率,例如640x480。

3. 测试USB摄像头API案例

       示例代码路径为:02_camera/test-usbCam/single-cam.c。USB Camera API的测试案例代码逻辑流程如下所示:

3.1  源码说明

int main()
{
    if(1 == argc){
        printf("\nerr: Missing parameter!\n");
        printf("================= [usage] ==================\n");
        printf("example:\n");
        printf("\t%s <49/50>\n", argv[0]);
        printf("--------------------------------------------\n");
        return 0;
    }
    int cameraIndex = atoi(argv[1]);
    
	char *pbuf = NULL;
	int ret = 0;
	int skip = 0;
	FILE *fp = NULL;

	ret = usbcamera_init(CAMERA_INDEX, CAMERA_WIDTH, CAMERA_HEIGHT, 0);
	if (ret) {
		printf("error: %s, %d\n", __func__, __LINE__);
		goto exit3;
	}

	pbuf = (char *)malloc(IMAGE_SIZE);
	if (!pbuf) {
		printf("error: %s, %d\n", __func__, __LINE__);
		ret = -1;
		goto exit2;
	}

	//跳过前10帧
	skip = 10;
	while(skip--) {
		ret = usbcamera_getframe(CAMERA_INDEX, pbuf);
		if (ret) {
			printf("error: %s, %d\n", __func__, __LINE__);
			goto exit1;
		}
	}

	/* tips: 可以在Ubuntu下用mplayer播放录制图像
	*	mplayer -demuxer rawvideo -rawvideo w=1280:h=720:format=bgr24 photo -loop 0
	*/
	fp = fopen("/tmp/photo", "w");
	if (!fp) {
		printf("error: %s, %d\n", __func__, __LINE__);
		ret = -1;
		goto exit2;
	}
	fwrite(pbuf, 1, IMAGE_SIZE, fp);
	fclose(fp);

exit1:
	free(pbuf);
	pbuf = NULL;
exit2:
	usbcamera_exit(CAMERA_INDEX);
exit3:
    return ret;
}

        其中usbcamera_init(),usbcamera_getframe(),usbcamera_exit()是对v4l2接口调用的易用化封装。具体实现于02_camera/commonApi/usb_camera/usb_camera.c

<think>好的,我现在需要帮助用户查找关于在RK3588芯片平台上配置USB摄像头或安装驱动的指南。首先,我得理解用户的问题到底是什么。他们可能是在使用RK3588开发板,想要连接USB摄像头,但不知道如何进行设置或安装驱动。用户提到的引用内容中,有关于板级配置的build.sh命令、开发板的介绍,以及v4l2_capability结构体的信息。这些线索可能对解决问题有帮助。 首先,我应该回顾用户提供的引用内容。引用[1]提到了如何配置RK3588S EVB1开发板的板级配置,这可能涉及到内核配置,而USB摄像头的驱动通常在内核中配置。引用[3]详细说明了v4l2_capability结构体,这属于Linux的视频设备驱动部分,即V4L2框架。这说明RK3588可能使用V4L2来支持摄像头设备。 接下来,我需要考虑RK3588的Linux系统下USB摄像头的一般配置步骤。通常,USB摄像头在Linux中属于UVC(USB Video Class)设备,如果内核支持UVC,驱动会自动加载。用户可能需要确认内核是否启用了UVC驱动,以及如何检查摄像头是否被识别。 根据引用[3],v4l2的接口用于查询设备信息,因此用户可能需要使用v4l2-utils工具来检查摄像头。例如,使用v4l2-ctl命令列出设备,检查是否检测到摄像头。这可能是一个步骤。 另外,用户可能需要配置内核,确保相关的驱动已经启用。引用[1]中的build.sh命令用于配置板级配置,这可能包括内核的defconfig文件。用户可能需要查看该defconfig是否启用了UVC相关的配置选项,比如CONFIG_USB_VIDEO_CLASS等。 可能的步骤包括: 1. 确认USB摄像头硬件连接正常。 2. 检查内核配置,确保UVC驱动已启用。 3. 使用v4l2-utils工具检测设备。 4. 编写或使用应用程序通过V4L2接口访问摄像头数据。 用户可能需要具体的内核配置步骤,比如如何修改defconfig,重新编译内核等。引用[1]中的命令可能用于生成配置,用户可能需要在此配置中添加相关驱动选项。 此外,引用[2]提到迅为的RK3588开发板,可能他们有特定的文档或教程,用户可能需要参考迅为提供的资料,或者社区讨论中的指南。 可能的问题点包括:摄像头未被识别,驱动未加载,权限问题,或者需要配置应用程序接口。需要逐一排除这些可能性。 总结,回答需要涵盖硬件确认、内核驱动配置、工具使用和权限设置等方面,并结合用户提供的引用内容中的相关信息,如v4l2结构体和配置命令。</think>### RK3588 USB摄像头配置及驱动安装指南 在RK3588平台上配置USB摄像头主要涉及Linux内核驱动支持及V4L2框架的应用。以下是具体步骤: --- #### **一、硬件准备** 1. 确保使用符合UVC协议的USB摄像头(主流摄像头型号大多支持) 2. 通过USB3.0接口连接开发板(推荐使用蓝色接口) --- #### **二、内核驱动配置** 1. 确认内核配置包含UVC驱动: ```bash # 进入内核配置界面 make ARCH=arm64 menuconfig ``` 路径:`Device Drivers -> Multimedia support -> Media USB Adapters -> USB Video Class (UVC)`[^3] 2. 在板级配置中启用相关选项(参考引用[1]的配置方法): ```bash ./build.sh device/rockchip/rk3588/rockchip_rk3588s_evb1_lp4x_v10_defconfig ``` --- #### **三、驱动验证与设备检测** 1. 插入摄像头后执行: ```bash dmesg | grep uvcvideo # 查看驱动加载日志 ls /dev/video* # 查看生成的视频设备节点 ``` 2. 使用`v4l2-ctl`工具检测设备能力(需安装`v4l-utils`): ```bash v4l2-ctl --list-devices # 列出设备 v4l2-ctl --device=/dev/video0 --all # 查看详细信息 ``` 输出将包含类似`struct v4l2_capability`的硬件能力信息[^3] --- #### **四、应用层开发** 1. 通过V4L2接口进行视频采集(示例代码框架): ```c #include <linux/videodev2.h> struct v4l2_capability cap; ioctl(fd, VIDIOC_QUERYCAP, &cap); // 获取设备能力 printf("Driver: %s\n", cap.driver); ``` --- #### **五、常见问题解决** | 现象 | 解决方案 | |------|----------| | 无/dev/video节点 | 检查`dmesg`输出,确认UVC驱动是否加载 | | 图像花屏 | 尝试降低分辨率:`v4l2-ctl --set-fmt-video=width=640,height=480` | | 权限不足 | 添加用户到video组:`sudo usermod -aG video $USER` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值