在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_device     struct 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);     if (nr == minor_cnt) {

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

 

更多相关文章

  1. android调用摄像头拍照,从相册中选择照片并裁剪
  2. Android打造一个高性能无限层级显示的树形控件(Android树形控件)
  3. android v4l2 摄像头 ,不基于camera框架
  4. 从 0 开始,搭建一个完整的 Android(安卓)音视频通信系统
  5. 如何在Android中整合立体声音效处理库|OpenCORE|组件间隧道通信
  6. 【usb存储挂载】android6.0固定usb存储挂载路径
  7. android的UI中include、merge和viewstub用法
  8. Android(安卓)设备上使得google play store 应用市场中不能搜索
  9. android解析xml文件的方式之DOM解析

随机推荐

  1. Android中常用的位图操作(View与Bitmap转
  2. 【Android 开发】:UI控件之 Menu 菜单的的
  3. Android各版本查询和开启悬浮窗权限
  4. Google发布Android,Sun何去何从?
  5. 让你的代码量减少3倍!使用kotlin开发Andro
  6. 转android 模拟器中做端口重定向
  7. Android Activity& service&Broadcast re
  8. CTS概述
  9. 保护你的隐私,五种控制Android应用的权限
  10. Android中的智能指针