[           移植Linux3.4.2版本内核到mini2440(二)--添加网卡、UVC摄像头、LCD驱动     ]

曾经在全志平台上调试过UVC摄像头,当时调试过程比较流畅,丝毫没有碰上异常情况,这一次在RK上碰到较大的困难,下面介绍一下我的调试过程。

首先,不用说当然在内核配置中配置上UVC摄像头,重新编译内核,烧录。

Device Drivers --->

Multimedia support --->

Video For Linux

[*] Enable Video For Linux API 1 (DEPRECATED)

[*] Video capture adapters --->

[*] V4L USB devices --->

USB Video Class (UVC)

[*] UVC input events device support

[最近在调试Android 2.3.5(基于cm的代码)的前置摄像头,将遇到的问题与解决的方法记录下来,以便回顾。1:)上层应用无法获取前置摄像头的信息?前置摄像头的消息一般回

然后查看内核信息,cat /proc/kmsg    然后接上摄像头,会看到类似的设备信息,说明我们的摄像头已经可以正常使用了。

usb 1-1.1: new full speed USB device using address 3

usb 1-1.1: New USB device found, idVendor=0ac8, idProduct=3450

usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0

usb 1-1.1: Product: Deasy USB2.0 Camera

uvcvideo: Found UVC 1.00 device Deasy USB2.0 Camera (0ac8:3450)

接着我们可以在/dev 目录下看到 videoX 的节点。

然后,尝试一下用系统相机看看是否能点亮摄像头,这里提示我无法连接上摄像头。

E/SensorService( 471): Error activating sensor 0 (Operation not permitted)

V/CAM_PhotoModule( 1041): On resume.

V/CAM_PhotoModule( 1041): Executing onResumeTasks.

V/CAM_PhotoModule( 1041): Open camera device.

V/CameraHolder( 1041): open camera 0

E/CameraService( 163): CameraService::connect X (pid 1041) rejected (invalid cameraId 0).

这里只能看出来 CameraService 连接相机0失败, invalid cameraId 0 除此之外,不太明白为什么会有这样的信息。 抛开系统相机我们先自己写一个小应用来测试一下video是否正常工作。 linux下的摄像头驱动框架是V4L2,只要根据相关的API来写测试程序,然后封装成JNI函数,交给Android层调用即可。 这里我比较懒用了一下一个开源项目的相机demo来验证我的相机在当前环境下是工作正常的。

SimpleWebCam https://bitbucket.org/neuralassembly/simplewebcam/src 附件也会提供这个项目稍微修改过的工程,因为涉及到Jni代码的编译,直接提供的工程就省去很多麻烦。 这里存在一个权限的问题,只是测试用,chmod 777 /dev/video* 防止因为权限打不开相机.

这里用的 640x480 resolution with YUYV format 的可能有些摄像头不支持,就需要研究一下改一下JNI代码了, 然后确认了LINUX驱动层不存在问题,我们就开始考虑一下故障的地方在哪里了。

首先进入

frameworks/av/services/camera/libcameraservice/CameraService.cpp 查看异常的日志是哪里打印出来,很快就发现

if (cameraId < 0 || cameraId >= mNumberOfCameras) {

ALOGE("CameraService::connect X (pid %d) rejected (invalid cameraId %d).",

callingPid, cameraId);

return -ENODEV;

}

然后 我们知道 cameraId==0, 那么 Cameras的数量是0

为了验证相机的数量,我们在上一次启动相机的时候打印确认一下是不是真的是0

然后打印调试信息,发现确实是获取Camera的数量是0,这里相机的数量是直接调用HAL层相机的层层封装函数得到的。 那么很有可能uvc热插拔信息并没有在HAL层更新出来,从而导致并不知道存在这一个相机。 这个推理是通过我反复重启发现有事确实可以打开相机,但是死机了。 packages/apps/LegacyCamera/src/com/android/camera/CameraHolder.java 这个是相机程序的代码,可以看出是直接获取相机数量 。 android.hardware.Camera.getNumberOfCameras();

private CameraHolder() {

HandlerThread ht = new HandlerThread("CameraHolder");

ht.start();

mHandler = new MyHandler(ht.getLooper());

mNumberOfCameras = android.hardware.Camera.getNumberOfCameras();

mInfo = new CameraInfo[mNumberOfCameras];

for (int i = 0; i < mNumberOfCameras; i++) {

mInfo[i] = new CameraInfo();

android.hardware.Camera.getCameraInfo(i, mInfo[i]);

if (mBackCameraId == -1 && mInfo[i].facing == CameraInfo.CAMERA_FACING_BACK) {

mBackCameraId = i;

}

if (mFrontCameraId == -1 && mInfo[i].facing == CameraInfo.CAMERA_FACING_FRONT) {

mFrontCameraId = i;

}

}

}

这里稍微增加cameraopne的时候去读相机的信息。

1.死机后的信息

D/CameraHolder( 1043): CameraHoler().go

D/CameraHolder( 1043): mMockCameraInfo ==null, getNumberOfCameras()

D/CameraHolder( 1043): return number === 1

2.提示打不开的信息

D/CameraHolder( 1043): CameraHoler().go

D/CameraHolder( 1043): mMockCameraInfo ==null, getNumberOfCameras()

D/CameraHolder( 1043): return number === 0

说明了一切问题的根源在于相机打开的过程中获取相机数量是不正确,这里又查看了CameraHal代码被加载的流程分析,发现 uvc摄像头是在 CameraHal代码被加载后才发现的,非常关键的信息是存储在HAL层的一个数组中的。

那么,我们肯定了HAL层不支持热插拔,那么如何要支持热插拔呢,我们需要分析一下cameraService中的流程。 frameworks/av/services/camera/libcameraservice/CameraService.cpp

void CameraService::onFirstRef()

{

BnCameraService::onFirstRef();

if (hw_get_module(CAMERA_HARDWARE_MODULE_ID,//这个定义为"came"

(const hw_module_t **)&mModule)

ALOGE("Could not load camera HAL module");

mNumberOfCameras = 0;

}

else {

mNumberOfCameras = mModule->get_number_of_cameras();

if (mNumberOfCameras > MAX_CAMERAS) {

ALOGE("Number of cameras(%d) > MAX_CAMERAS(%d).",

mNumberOfCameras, MAX_CAMERAS);

mNumberOfCameras = MAX_CAMERAS;

}

for (int i = 0; i

setCameraFree(i);

}

}

} 这个函数非常关键,我们发现这里加载的HAL的初始化代码,我们也通过上面的日志得出hal实际上能获取数量的,只是当时确实是没有相机。所以,我们修改了getNumberOfCameras函数,每次发现没有摄像头说明,就应该重新初始化一次这样就解决了热插拔的问题。 那么问题来了,当我有两个随意的摄像头时,随意热插拔还是有问题,那么改成<2 吧,最大只支持两个相机。

int32_t CameraService::getNumberOfCameras() {

if(mNumberOfCameras == 0) {

ALOGE("no camera found before! check again...");

onFirstRef();

}

return mNumberOfCameras;

}

[转:http://blog.csdn.net/qikaibinglan/article/details/5883346经过4天的调试,摄像头终于可以拍照片保存到电脑上来了,ov9650的调试走了不少弯路,一些教训总结如下: 1

rk3288 调试dvp摄像头_RK3288 uvc摄像头调试相关推荐

  1. rk3288 调试dvp摄像头_RK3288 UVC 摄像头调试

    1#不能打开问题 <6>[ 53.588311] usb 3-1.1: USB disconnect, device number 3 <6>[ 56.084724] usb ...

  2. 如何区分usb摄像头和uvc摄像头

    目录 前言: 插入摄像头,在终端输入 查看摄像头型号,找到摄像头对应的信息 判断:如果支持则是uvc camera,否则是usb camera 前言: ROS中有usb_cam 和uvc_cam,如果 ...

  3. c语言 虚拟摄像头设备_Windows下虚拟UVC摄像头开发演示

    最近在windows10 x64下开发了一个USB虚拟总线驱动,该驱动可接收上位机的指令动态创建或卸载UVC摄像头. UVC摄像头的数据通过上位机下发给驱动,驱动再给视频播放软件,这样就可以实现视频的 ...

  4. Windows下虚拟UVC摄像头开发演示

    最近在windows10 x64下开发了一个USB虚拟总线驱动,该驱动可接收上位机的指令动态创建或卸载UVC摄像头. UVC摄像头的数据通过上位机下发给驱动,驱动再给视频播放软件,这样就可以实现视频的 ...

  5. UVC摄像头嵌入式Linux应用

        由于是第一次接触UVC,所以内容会比较杂.文章内容多为参考整合. 参考链接: [1]添加内核支持部分:https://blog.csdn.net/u010034969/article/deta ...

  6. UVC 摄像头驱动(一)硬件描述

    虚拟摄像头驱动vivi 内核中使用 video_device 结构来描述一个 video 设备,以虚拟摄像头驱动 vivi 为例,整体框架无非是: 分配一个 video_device 设置 video ...

  7. rk3288 调试dvp摄像头_RK3288 - 双路摄像头的硬件外接实现

    背景 人脸识别应用越来越多,无论是基于RBG+IR的双路摄像头人脸识别,还是双摄像头分别做不同的事情,都需要接两路摄像头同时工作. 接口类型 Android手机基本基本上都是使用后置摄像头MIPI,前 ...

  8. Android UVC摄像头方向调试

    Platform: RK3368 OS: Android 6.0 Kernel: 3.10.0 UVC摄像头方向调试 方法1修改CameraHal 修改代码位置hardware/rockchip/ca ...

  9. guvcview调试UVC摄像头

    guvcview是一个开源的uvc webcam调试测试工具,在ubuntu中,可以通过以下命令进行下载: caozilong@caozilong-Vostro-3268:~$ sudo apt in ...

最新文章

  1. 第 138 章 Spark
  2. Git Manual / Git使用手册 / Git, GitLab, Git Bash, TortoiseGit (建议全文复制到Word文档中通过导航窗格查看)...
  3. jQuery源码学习(1)——addClass
  4. Android技术经理+资深工程师+研发工程师-杭州
  5. 基于FFmpeg H264 + G711A 音视频裸流合并 MP4文件 ( G711A 转 AAC)
  6. firewall详解
  7. 您应该知道Python 3.10中的新特性!
  8. Apdex(Application Performance Index)量化应用性能
  9. python 通过ip获取城市_python 根据ip获取地理位置
  10. matlab实验8数据分析与多项式计算,hashidamatlab实验八数据处理与多项式计算.doc
  11. 更快更强,来试试 Mybatis 的增强版——EasyMybatis
  12. Nginx服务的ssl认证和htpasswd认证
  13. 利用H5和ChromiumWebBrowser构建应用
  14. readelf ELF 文件格式分析
  15. 微信小游戏(打飞机1)
  16. 机器人教练SWOT分析_用SWOT方法分析中国智能机器人的发展现状
  17. c51汇编语言位操作,51单片机汇编语言教程之单片机位操作指令的详细资料说明...
  18. 获取华为解锁码的思路
  19. 大学四年软件工程专业的学习经验总结
  20. linux - find查找文件/grep搜索文件内容

热门文章

  1. kafka文档(3)----0.8.2-kafka API(java版本)
  2. 兰道尔原理(Laudauer‘s Principle)
  3. 可以看游资的app_新游资APP:高评分App是如何养成的?
  4. Python按照不同的后缀把文件存入不同的文件夹下面(后缀分类)
  5. 【java集合】ConcurrentHashMap源码分析
  6. 大括号内打两行公式,还附带标号或条件
  7. 有什么软件android跟电脑连接无线,手机电脑连接的软件有哪些(安卓手机连接电脑的方法)...
  8. 【哈工大SCIR笔记】机器阅读理解简述
  9. 顺序图-循环和分支-操作符的使用
  10. eth0: no IPv6 routers present