Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14220
  • 博文数量: 5
  • 博客积分: 200
  • 博客等级: 二等列兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-01 21:55
文章分类
文章存档

2010年(5)

我的朋友

分类: LINUX

2010-06-01 22:01:40

最近一直忙着作些小实验,头些天做的一些笔记没有来得及整理。先放在word里了,这会实在不 是特别想看书,把没有来得及写上的东西补一下。

spcaview简单介绍

Linux内核中集成了对0V511系列摄像头的支持,但没有包含对我的摄像头的支持,本文选用了开源驱动spca5xx,这个驱动提供了对大部分主流 摄像头的支持。 gspcaspca5xx是一个系列的,它用于2.6.17以上的内核版本,以前的版本使用spca5xx驱动程序。spca5xxLinux下常用的摄像头驱动, 这是一个通用驱动,可以在google里搜索并下载这个驱动程序。 这个网站上有这个程序支持的摄像头和图像传感器信息。 这个驱动程序也是基于上面的video4linux的。关于这个驱动的 安装以及驱动要求的版本和支持的摄像头驱动等更详细的信息可以在你下载的安装包里找。

spcaview是一个我非常喜欢的应用程序,可以作为浏览采集到的图像接口。当然它更强大的不是这一点,spcaview Linux网络客户端 监控工具,当然也能用于本地测试摄像头用。如果用于网络监控的摄像头,还必须要有spcaserv,本文只用它来监视本地摄像头。通过spcaview 可以进行数据流的采集,可 以实现单帧采集,连续帧采集。对于数据流的采集,可以在服务器端,也可以在客户端。当然服务器端和客户端都得有桌面环境。 spcaview 工具可以过 -o 参数把数据流传到一个文件中。也可以采用压缩数据流的办法,要用到-z参数。程序源码中有详 细的使用说明。

spcaviewX86 机器上的编译使用

编译环境仍然是在VMware虚拟机的客户操作系统Redhat9.0下面。下面列出详细的编译和安装步骤。

n     下载源代 码,不论安装什么软件,这个总是必须的。我下载的软件版本分别为:spca5xx-20051212.tar.gzspcaview-20051127.tar.gz,也有更新一些的版本,这里我用的是这个。还有一个用到的压缩包

gspcav1-20071224.tar.gz, 这个是为了修改某些结构体而使用的。

n     解压缩上 面两个压缩包,这里假设这两个文件都在/root/tmp目录下面。可以执行命令如下进行解压缩,为了方便,我以root帐户登录:

[root@localhost tmp]# tar zxvf spca5xx-20051212.tar.gz

[root@localhost tmp]# tar zxvf spcaview-20051227.tar.gz

执行完这两个命令后将在/root/tmp目录下面产生两个目录,spca5xx-20051212spcaview-20051227

n     编译spcaview编译这个程序不会出现问题,可以直接通过,方法是先进到文件夹spcaview-20051227下面,执行终端命令make,

[root@localhost spcaview-20051227]# make

[root@localhost spcaview-20051227]# make install

执行完这两个步骤,就已经把spcaview安装到系统中了,可以在终端执行命令spcaview,将会弹出一个窗口,如果摄 像头驱动Ok,应该就可以成功看到采集到的图像了。如果要安装成网络服务器的形式,可以参考README文件。本文 只是安装成本地监控来使用

n     编译spca5xx,这个是图像采集设备的驱动程序,也就是摄像头的驱动。编译这个程序的过程中,遇到了不少问题,不过最后都解决了。 这里先说明一下编译的整个过程,稍后说明安装过程中出现的问题。

这个驱动程序已经可以在Redhat9.0的原装内核2.4.20-8下成功编译并运行。要在这个内核下成功编 译需要修改一些文件。首先修改一下/root/tmp/spca5xx-20051212/drivers/usb/spca5xx.c文件,终端下利用VI编辑器,在这个文件把84程序行 //#define RH9_REMAP 1前面的//去掉,也就是把语句 行的注释去掉,让其有效。

另外还要修改所有的判断Linux版本行的条件编译语句中的

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,22),修改为

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20)

      要让中星微的厂商ID和产品ID (0x0ac80x305b) 的摄像头工作还必须修改文件/root/tmp/spca5xx-20051212/drivers/usb/tas5130c.h,如果是其他的摄像头有可能需要更改这个文件,有可能不需要,要看你的厂商ID和产品ID对应的数据是否正 确。我的摄像头刚好就是上面的中星微的一款产品,结果不能正常驱动。这里我并不是特别理解,这些数据的含义,只是以结构体的形式定义了一些16进制数据。我列出其 中一个结构体的一部分如下:

static __u16 tas5130cxx_start_data[][3] = {

    {0xa0, 0x0001, 0x0000},           //00,00,01,cc,

{0xa0, 0x0002, 0x0008},           //00,08,02,cc,

。。。。。。。。。。。。。。。。。。。。。。//省略的数据部分。

    {0xa0, 0x0008, 0x0250},           //02,50,08,cc,

    {0xa0, 0x0008, 0x0301},           //03,01,08,cc,

    {0xa0, 0x0060, 0x01a8},           //01,a8,60,cc,

    {0xa0, 0x0061, 0x0116},           //01,16,61,cc,

    {0xa0, 0x0065, 0x0118},           //01,18,65,cc 

 /********************/

    {0, 0, 0}

};,既然不知道这些数据什么意思怎么修改呢,这个我当时也很无奈。后来想到可以借助于gspca驱动,在现在 的linux发行版中好多都有。ubuntu linux就集成了这个驱动程序。经过验证,在ubuntu下面是可以 支持我的摄像头的,所以我就把gspca的源代码下载下来,把其中相应的代码拷贝了一份,然后替换掉相应的结构体里的数据就可以了。

3   实 验过程中出现的问题

    这里列出的问题并不是每个人都一样。因为我的 摄像头不一定和你的一样。我的摄像头,奥尼产的。

    问 题一:spcaview窗口没有显示,是黑屏的。

    通过检测USB接口发现用的是中星微的DSP控制器,传感器芯片型号开始没有办法 获得,当我把程序编译好,驱动装上以后,可以看到USB摄像头有反应了,找到了视频设备,但显示框是黑色的。也就是没有图像。去google了一下,有些人也碰到了相似问 题。因为这种现象跟摄像头的控制器和传感器芯片有关,所以这样的帖子不是特别多。只好自己想办法了。因为我装了个Ubuntu的虚拟机,所以我想应该在比较高 一点的版本上进行测试,经过实验结果发现自己的Ubuntu系统是可以捕获到自己的zc305b摄像头图像的。这就给了我希 望。我把gspca(Ubuntu上用的是这个)spca5xx的源代码进行比较。当然不是胡乱进行比较了。因为我用了一个sonix的摄像头在Redhat9上成功抓取了图像,所以我想 一定是传感器的问题,有可能是对zc30b内部这个传感器没有搞对。发现把spca5xx.cspca5xx.h中原来的SENSOR_TAS5130C改为SENSOR_TAS5130C_VF0250,并且把头文件的数据结果一个tas3150c开头的数组也都改成tas5130c_vf0250开头的。另外为了编译通过,还需要改sonix.het61x511.h,主要是这两个文件里都用到了tas3150c.h这个头文件的这些数据结构。结果真的成功了,已经可以成功用我的摄像头抓取图像了。当然这里的方法 是我刚开始编译成功时使用的,实际上不用这么麻烦。可以按照第2部分的方法,复制一份结构体数据就可以了,这样就用不着麻烦的去改那么多地方了。这里我写 下来,部分出于自己笔记的习惯。

问题二:如何解决Redhat9.0自带内核2.4.20-8编译失 败和spcaview打不开v4l设备的问题。

     刚开始把代码下载下来的 时候兴致冲冲的编译一下,发现编译都通不过,只好又去网上google一下。发现有几个兄弟是通过升级内核版本来实现的。都是通过看Readme文件,觉 得不一定支持这个内核版本号。还有些同僚说可能是Redhat公司对内核打了自己的补丁。这些话有对有错。下面解释一下。

    查看源代码发现有//#define RH9_REMAP 1 这句话说明是可以Redhat9下面编译的,先把这句代码的注释去掉,编译一下,发现可以通过了。可是把摄像头 插上,还是打不开设备。解决了编译的问题还得解决摄像头的其他问题。我们要让自己的摄像头正常显示图像才好。我开始的想法就是把编译时出现的一些警告去 掉。这里要说明一下,通过升级内核的方法是比较简单的。我是升级到2.4.26,升级并编译完之后,对于许多摄像头来说都是可以直接用的。如果出现黑屏就 要考虑上面提到的解决办法。这部分主要是讲不升级内核,如何在Redhat9自带内核下面的编译。仔细读一下代码,发现里面好多版本判断的语句根本没有包 括2.4.20,这也就难怪我们没有办法打开摄像头设备了。后来经过实验,把所有的2.4.22的内核版本判断该成2.4.20就OK了。注意一 处:spca5xx.c文件的8548行开始。

  1.                                                                                 
  2. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22)
  3. static struct usb_driver spca5xx_driver = {
  4.   .owner = THIS_MODULE,
  5.   .name = "spca5xx",
  6.   .id_table = device_table,
  7.   .probe = spca5xx_probe,
  8.   .disconnect = spca5xx_disconnect
  9. };
  10. #else
  11. static struct usb_driver spca5xx_driver = {
  12. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,20)
  13.           THIS_MODULE,
  14. #endif
  15.         "spca5xx",
  16.         spca5xx_probe,
  17.         spca5xx_disconnect,
  18.         {NULL,NULL}
  19. };
  20. #endif

这里显然把22改为20后就不合适了。那么如何把想要的版本包含进来呢。我把这里的22 没有改,把20改成18就可以了。读代码可能感觉第二个地方不改好象也包括2.4.20-8了。但经过实验是不行的。我也有点糊涂。不过关键是自己的目的 达到了,很开心。

 通过这个实验,学习的自己一些知识和方法:

n     要学会做 对比,这次对UbuntuRedhat的对比起了关键作用。这也是一个很好的方法,因为现在用的一些系统肯 定都是升级过的,如果在新环境下能成功,这样就可以给个很好的借鉴。

n     要有耐 心,其实这个东西我开始没有头绪,google.不到内容,很郁闷。但坚持就对了。

n     对于驱动 有了更好的理解。在开发领域自己还是个生手,对好多东西的理解都很抽象,通过这次学习,包括对代码的一些分析,学到了很多东西,特别是USB接口摄像头驱动的层次。


转自:http://blog.csdn.net/yanglijing/archive/2008/10/19/3081158.aspx

阅读(842) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:Linux下摄像头支持大全

给主人留下些什么吧!~~