固定端口前后置:
在Android的系统会有前置摄像头和后置摄像头的定义,摄像头分为SOC类型的摄像头和USB这一类的摄像头,接下要分析就是USB摄像头这一类 。一般在android或者linux系统中分析一个模块,先从总体的框架上有一个认识,然后在局部细细的研究。
一、Android 摄像头总体架构

上面的框架,分析的比较粗糙,主要是一些自己看代码后总结下来的东西。以USB摄像为例,在插入的USB摄像头后,会生成/dev/video0这样的设备节点,而在硬件抽象层中,会去判断是否存在该设备节点,以提供给android系统层使用。再往上分析就是android部分的了,先暂时不分析。
二、Linux层中UVC摄像头注册流程

在USB子系统判断有UVC设备接入后,会去调用uvc_probe(代码位置:/driver/media/uvc/uvc_driver.c)来完成USB摄像头的创建,通过一步一步的分析,最终会走到v4L2框架中,创建摄像头的设备节点。
三、固定USB摄像头硬件端口
前面分析了这么多,都是为了接下来的做准备。
现在客户那么使用我们的主板机器,其中会使用两个USB摄像头,一个作为前置摄像头用于人脸识别,一个用于后置摄像头,由于在安装时并不知道那个端口的摄像头先插入,那个后插入(设备节点中先接入的就会分配video0,而在android中一般定义video0为后置摄像头,video1为前置摄像头),就导致android系统层前后置摄像头混乱。
为了解决该问题,就需要在驱动中,将前后置摄像头和USB的硬件端口做一个绑定。
具体改法如下:
(1)在/include/media/v4l2-dev.h的video_device结构体中添加变量portnum

struct video_devicestruct list_head    fh_list; /* List of struct v4l2_fh */int debug;            /* Activates debug level*/
+    int portnum;        /*usb hw port*/

(2)在/drivers/media/usb/uvc/uvc_driver.c的uvc_register_video函数中添加vdev->portnum = dev->udev->portnum;
static int uvc_register_video(struct uvc_device *dev,

...stream->vdev = vdev;video_set_drvdata(vdev, stream);
+    vdev->portnum = dev->udev->portnum;ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1);这里先将USB的portnum存下来,在创建设备节点的是否,就会根据该变量来区分硬件的上哪个USB是前置,哪个USB是后置了
(3)在/drivers/media/v4l2-core/v4l2-dev.c的__video_register_device函数中,修改。
int __video_register_device(struct video_device *vdev, int type, int nr,.../* Pick a device node number */mutex_lock(&videodev_lock);+    if(vdev->vfl_type == VFL_TYPE_GRABBER) {+        if(4 == vdev->portnum) {+            nr = 1;
+        }else {+            nr = 0;
+        }
+    }else {+        nr = devnode_find(vdev, nr == -1 ? 0 : nr, minor_cnt);
+    }
+if (nr == minor_cnt)nr = devnode_find(vdev, 0, minor_cnt);

注意:这里的“4 == vdev->portnum”是根据时机板子的端口上的,在调试的时候,可以先将portnum变量的值打印出来,就知道如何区分了。

Platform: RK3368
OS: Android 6.0
Kernel: 3.10.0

UVC摄像头方向调试
方法1修改CameraHal:
———————————————————————————————————————
修改代码位置hardware/rockchip/camera/CameraHal直接在CameraHal中修改facing_info.
———————————————————————————————————————

diff --git a/CameraHal/CameraHal_Module.cpp b/CameraHal/CameraHal_Module.cpp
index ec56a08..78500e3 100755
--- a/CameraHal/CameraHal_Module.cpp
+++ b/CameraHal/CameraHal_Module.cpp
@@ -771,14 +771,14 @@ int camera_get_number_of_cameras(void)if (strstr((char*)&capability.card[0], "front") != NULL) {camInfoTmp[cam_cnt&0x01].facing_info.facing = CAMERA_FACING_FRONT;} else {-                    camInfoTmp[cam_cnt&0x01].facing_info.facing = CAMERA_FACING_BACK;
+                    camInfoTmp[cam_cnt&0x01].facing_info.facing = CAMERA_FACING_FRONT;}  ptr = strstr((char*)&capability.card[0],"-");if (ptr != NULL) {ptr++;camInfoTmp[cam_cnt&0x01].facing_info.orientation = atoi(ptr);} else {-                    camInfoTmp[cam_cnt&0x01].facing_info.orientation = 0;
+                    camInfoTmp[cam_cnt&0x01].facing_info.orientation = 180;}memset(version,0x00,sizeof(version));

方法2修改驱动:
———————————————————————————————————————
将capability card改为"facing-orientation".
例如facing(1), orientation(180)就是"front-180",android的CameraHal会根据命名规则来解析是前置摄像头还是后置摄像头,以及摄像头的方向.如果要做多个摄像头兼容可以加上VID与PID匹配.
———————————————————————————————————————

diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c
index 196198f..d81586f 100644
--- a/drivers/media/usb/uvc/uvc_v4l2.c
+++ b/drivers/media/usb/uvc/uvc_v4l2.c
@@ -564,6 +564,14 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)memset(cap, 0, sizeof *cap);strlcpy(cap->driver, "uvcvideo", sizeof cap->driver);strlcpy(cap->card, vdev->name, sizeof cap->card);
+
+               if(le16_to_cpu(stream->dev->udev->descriptor.idVendor)==0x058f &&
+                       le16_to_cpu(stream->dev->udev->descriptor.idProduct)==0x3841){//058f:3841
+                       pr_info("uvc vendor product matched\n");
+                       memset(cap->card, 0, sizeof cap->card);
+                       strlcpy(cap->card, "front-180", sizeof cap->card);
+               }
+usb_make_path(stream->dev->udev,cap->bus_info, sizeof(cap->bus_info));cap->version = LINUX_VERSION_CODE;

USB摄像头前后置调试相关推荐

  1. Python+Opencv读取高帧率USB摄像头问题

    前几次使用Python+Opencv,对网络摄像头,USB摄像头进行数据采集,基本流程已经跑通,没什么大问题.最近项目中使用了一款120fps/s的USB摄像头,但是调试好代码运行后,问题来了. 遇到 ...

  2. Linux(固定USB摄像头硬件端口,绑定前后置摄像头)

    修改点如下,通过节点名称判断usb判断video --- a/kernel/drivers/media/usb/uvc/uvc_driver.c +++ b/kernel/drivers/media/ ...

  3. ROS:使用usb_cam软件包调试usb摄像头

    0x00 usb_cam软件包简介 为了丰富机器人与外界的交互方式,我们已经增加了与机器人的语音交互方式,不仅使机器人能够说话发声,还能听懂我们说的话,但是如果只有语音交互的话机器人就是一个盲人,无法 ...

  4. 自己动手做一个USB摄像头--转载

    手里有一块AT32的开发板和一个OV2640摄像头模块,因为做智能车模型需要一个摄像头,就想能不能废物利用一下,用这俩做一个即插即用的USB摄像头,能够直接用在树莓派的Linux系统上,而不需要在Li ...

  5. 用STM32+OV2560自己做一个USB摄像头

    手里有一块AT32的开发板和一个OV2640摄像头模块,因为做智能车模型需要一个摄像头,就想能不能废物利用一下,用这俩做一个即插即用的USB摄像头,能够直接用在树莓派的Linux系统上,而不需要在Li ...

  6. RK平台USB摄像头FAQ

    (记录android9以后调试所遇到的常见问题,有错请批评指正) UVC全称为USB video(device) class,是微软与另外几家设备厂商联合推出的为usb视频捕获设备定义的协议标准:所以 ...

  7. Vuforia用在安卓设备中外接USB摄像头(一)

    一.介绍 众所周知,vuforia可以用在安卓设备上使用AR,但是开启的都是设备的前置或后置的摄像头,在需要外接USB摄像头这块,vuforia没有给出直接的调用模块,但是官网给出了一个制作调用USB ...

  8. FFmpeg实现获取USB摄像头视频流测试代码

    通过USB摄像头(注:windows7/10下使用内置摄像头,linux下接普通的usb摄像头(Logitech))获取视频流用到的模块包括avformat和avdevice.头文件仅include ...

  9. Python-OpenCV学习 -- 台式机外接USB摄像头的视频读取

    一.网上很多笔记本带有内置摄像头的 代码读取案例.例如:读取内置摄像头的Python- OpenCV代码 import cv2 #引入库 cap = cv2.VideoCapture(0) while ...

最新文章

  1. Environ. Res.:南土所梁玉婷组-低砷稻田土壤微生物抗砷功能基因的分布模式
  2. 有监督、无监督与半监督学习【总结】
  3. 游戏服务器哪个系统困难些,游戏服务器哪个系统困难些
  4. 《守望先锋》中的末日铁拳是怎么摧毁玩家体验的?
  5. 403 forbidden_[SpringSecurity] 自定义403页面
  6. 如何用原型体现你的专业度?
  7. word如何调整字间距离_大篇幅文字如何排版才能赏心悦目?
  8. python36怎么安装_centos 安装 python36
  9. java 内省机制_Java反射与内省机制总结
  10. 关于ionic打包出错:ionic Unable to start the daemon process
  11. P2731 骑马修栅栏 欧拉函数
  12. VMware11.1.2+centOS7.4虚拟机联网问题并设置静态IP
  13. Basic 语言发展史
  14. 操作Windows文件夹时,弹出文件夹正在使用,操作无法完成【解决】
  15. 用计算机制作个人简历图片,计算机应用基础制作个人简历.ppt
  16. 全国大学生信息安全竞赛初赛writeup
  17. android 向上飘的字符,Android如何自定义View实现抖音飘动红心效果
  18. 计算机专业单招考试网上面试范文,2分钟单招面试自我介绍
  19. Google鲜为人知的强大功能!(陆续更新)
  20. linux系统正常的运行状态是,一种用于监控Linux系统运行状态的监控系统及方法...

热门文章

  1. Spring之注解开发
  2. Jmeter导入文件/导出文件接口
  3. 小学生C++画图 Go C 编程 第8课 魔法计时器(魔法学院的奇幻之旅 Go C编程绘图)
  4. HTML在线解析UBB代码小工具:DISCUZ UBB互相转换为HTML
  5. 小学计算机教案六年级冀教版,清华大学出版社版小学六年级下册信息技术全册教案.doc...
  6. UC浏览器怎么将mht转HTML,极速模式下的MHT
  7. android实现调用科大讯飞语音识别功能详细步骤
  8. struts2框架之struts框架介绍
  9. 影视领域解说电影怎样做才会更加出彩?
  10. Java数据类型转换02--强制类型转换