在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, -);

这里先将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( == vdev->portnum) {
+ nr = ;
+ }else {
+ nr = ;
+ }
+ }else {
+ nr = devnode_find(vdev, nr == - ? : nr, minor_cnt);
+ }
+
if (nr == minor_cnt)
nr = devnode_find(vdev, , minor_cnt);
if (nr == minor_cnt) {

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

Linux笔记(固定USB摄像头硬件端口,绑定前后置摄像头)的更多相关文章

  1. Android切换前后置摄像头并录制视频

    项目需要对微信的视频模块也看了一下,在此就对这块进行了一个开发.首先给出效果图 首先给出java代码 /** * RecordActivity.java * 版权所有(C) 2013 * 创建:cui ...

  2. linux笔记-硬件命令【2】

    1- 磁盘 1.1- 查看电脑磁盘类型 cat /sys/block/sda/queue/rotational 0 #固态盘 cat /sys/block/sdb/queue/rotational 1 ...

  3. Linux驱动之USB(个人)

                              USB概述 <USB简介> a:背景 USB是Universal Serial Bus的缩写,是一种全新的,双向同步传输的,支持热插拔的 ...

  4. ROS vpn (pptp) 配置及端口绑定配置

    网络搜集 一. 按VPN的协议分类 VPN的隧道协议主要有三种,PPTP,L2TP和IPSec,其中PPTP和L2TP协议工作在OSI模型的第二层,又称为二层隧道协议:IPSec是第三层隧道协议,是最 ...

  5. 【Linux笔记】Linux目录结构

    [Linux笔记]Linux目录结构   本文内容整理自网络,以作参考. /:根目录,位于linux文件系统目录结构的顶层,一般根目录下只存放目录,不要存放文件,/etc./bin./dev./lib ...

  6. 嵌入式Linux设备驱动程序:发现硬件配置

    嵌入式Linux设备驱动程序:发现硬件配置 Embedded Linux device drivers: Discovering the hardware configuration Interfac ...

  7. 基于Linux 3.0.8 Samsung FIMC(S5PV210) 的摄像头驱动框架解读(一)

    作者:咕唧咕唧liukun321 来自:http://blog.csdn.net/liukun321 FIMC这个名字应该是从S5PC1x0開始出现的.在s5pv210里面的定义是摄像头接口.可是它相 ...

  8. Linux 笔记 #03# 在 Debian远程服务器上运行 Java socket程序

    我试图做什么:把我的破代码放到服务器上运行,并成功与客户端进行 socket通信. 预备环境:刚安装好 MySQL 和 JVM 的 Linux远程服务器(Debian 8)一台. 主要有如下几个步骤: ...

  9. Linux驱动之USB总线驱动程序框架简析

    通用串行总线(USB)是主机和外围设备之间的一种连接.USB总线规范有1.1版和2.0版,当然现在已经有了3.0版本.USB1.1支持两种传输速度:低速为1.5Mbps,高速为12Mbps.USB2. ...

随机推荐

  1. YYHS-手机信号

    题目描述 输入 输出 样例输入 11 10000 query 5 construct 5 500 100 query 500 query 1000 construct 10 90 5 query 44 ...

  2. Python数据分析(二): Pandas技巧 (1)

    第一部分: ipython http://www.cnblogs.com/cgzl/p/7623347.html 第二部分: numpy http://www.cnblogs.com/cgzl/p/7 ...

  3. 59、jQuery初识

    jQuery是由原生js写的所以说所有jQuery制作出来的效果都可以使用js做出来,jQuery出现的目的是为了优化代码,提高码代码的效率它将很多功能封装. 一.jQuery的认识 1.何为jque ...

  4. UVa816,Ordering Tasks,WA

    #include <iostream> #include <cstdio> #include <string> #include <cstring> # ...

  5. Python程序练习4--模拟员工信息数据库操作

    1.功能简介 此程序模拟员工信息数据库操作,按照语法输入指令即能实现员工信息的增.删.改.查功能.   2.实现方法 架构: 本程序采用python语言编写,关键在于指令的解析和执行:其中指令解析主要 ...

  6. 【UML 建模】状态图介绍

    1.Statechart Diagram 即状态图,主要用于描述一个对象在其生存期间的动态行为,表现为一个对象所经历的状态序列.引起状态转移的事件(Event).因状态转移而伴随的动作(Action) ...

  7. LeetCode 563. Binary Tree Tilt (二叉树的倾斜度)

    Given a binary tree, return the tilt of the whole tree. The tilt of a tree node is defined as the ab ...

  8. jQrid常用操作(转帖)

    转自: http://blog.csdn.net/zhcj3672/article/details/6944955 JqGrid相关操作备忘 方法列表 1.获得当前列表行数: $("#gri ...

  9. Spring MVC 快捷定义 ViewController

    WHY  :               为什么我们需要快捷定义 ViewController ? 在项目开发过程中,经常会涉及页面跳转问题,而且这个页面跳转没有任何业务逻辑过程,只是单纯的路由过程 ...

  10. Java基础笔记8

    Object类 Object类是所有类的父类. 如果某个类没有显示的继承某个父类,那么该类则继承Object. 类 Object 是类层次结构的根类.每个类都使用 Object 作为超类. 所有对象( ...