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的端口號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM