android绑定usb前后摄像头
在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) {

vdev->portnum代表usb hub的端口号
android绑定usb前后摄像头的更多相关文章
- Xamarin Android 绑定 UVCCamera
这段时间工作上需要在Android设备上读取视频.摄像头用的是奥比中光的3D摄像头.我手上的摄像头的彩色通道使用的的UVC协议的. 在Xamarin上可用的UVC的封装基本上没有,只有一个小伙在Xam ...
- Xamarin.Android绑定库分享
使用Xamarin.Android时,会用到各种第三方库,而这些库基本上是java编写的,要在Xamarin.Android中使用这些库,就需要通过Android Binding Project绑定对 ...
- android 与usb 设备通信(二)
再次遇到android mUsbManager.getDevicelist() 得不到usb 设备的问题.于是深入去探讨android 与usb 外围设备通信的问题.第一篇文章写的有点乱,本质就是需 ...
- 【转】android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF)
关键词:android camera CMM 模组 camera参数 CAMIF平台信息:内核:linux系统:android 平台:S5PV310(samsung exynos 4210) 作者 ...
- Xamarin.Android 绑定友盟社会化分享组件
Xamarin.Android 绑定友盟社会化分享组件 最近在开发博客园Android App的时候需要用到友盟社会化分享组件,在github上搜了一下都没有找到最新版本绑定好的项目,就自己动手来绑定 ...
- Xamarin Android绑定微信SDK
现在几乎所有的APP都集成了向微博,微信等社交平台分享的功能.这些社交平台官方也提供了SDK让开发者使用,对于Android和IOS平台而言,只需要下载官方的SDK,按照官方说明文档进行集成就可以轻松 ...
- xamarin.android 绑定百度地图SDK遇到的问题
在 xamarin.android 绑定项目中,绑定 百度地图的LBS地图SDK,参考 https://developer.xamarin.com/guides/android/advanced_to ...
- [Android相机]通过手机摄像头识别环境亮度(转)
源: [Android相机]通过手机摄像头识别环境亮度 iOS利用摄像头获取环境光感参数
- android的USB MTP && USB CDC/USBnet(ECM, NCM, ACM) && USB gardget
MTP的全称是Media Transfer Protocol(媒体传输协议),它是微软公司提出的一套媒体文件传输协议.早在智能手机普及前,数码相机和MP3播放器等都使用了MTP的前身PTP(Pictu ...
随机推荐
- 如何减少代码中的if-else嵌套
实际项目中,往往有大量的if-else语句进行各种逻辑校验,参数校验等等,大量的if-else,语句使代码变得臃肿且不好维护,本篇文章结合我自己的经验,就减少if-else语句给出以下几种方案,分别适 ...
- Nginx 实现 Rewrite 跳转
文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 上一篇文章对Nginx的Location配置进行了讲解,本篇主要对于Nginx中的Rewrite跳转进行讲解. ...
- go语言从例子开始之Example2.类型
Go 拥有各值类型,包括字符串,整形,浮点型,布尔型等.下面是一些基本的例子. Example: values.go package main import "fmt" func ...
- rabbitmq一个连接多个信道channel
https://www.cnblogs.com/eleven24/p/10326718.html
- BioGRID 互作数据库
01 — BioGRID BioGRID 是 Biological General Repository for Interactionh Datasets 的缩写(网址为 https://thebi ...
- 这样才能正确解锁MaxCompute客户端
大数据计算服务(MaxCompute,原名ODPS)是一种快速.完全托管的TB/PB级数据仓库解决方案.MaxCompute向用户提供了完善的数据导入方案以及多种经典的分布式计算模型,能够更快速的解决 ...
- docker监控方案实践(cadvisor+influxdb+grafana)
一.概要 1.1 背景 虚拟化技术如今已经非常热门,如果你不知道什么是虚拟化,那你应该了解虚拟机.虚拟化技术如同虚拟机一样,用于将某些硬件通过软件方式实现"复制",虚拟出" ...
- Linux运维学习网站收藏
Linux运维之道 1> http://www.linuxidc.com/ //Linux公社,收藏Linux学习的很多知识 2> http://http://www.jb51 ...
- 学习.net的步骤
第一步 学习HTML与CSS 这并不需要去学一大堆的诸如Dreamweaver,Firework之类的各种网页设计工具,关键是理解HTML网页嵌套的block结构与CSS的box模型.许多ASP.NE ...
- jekins—持续集成
json转换为Python的字典形式 Martin fowler:通过自动化的构建,编译-发布-自动化测试,尽早的发现集成的错误 持续集成的要素: 统一的代码库 自动构建编译 自动测试(单元测试) 每 ...