在基本了解了XILINX的嵌入式开发流程之后,笔者开始着手做在Zedboard上进行视频的采集和图像的处理,参考了下网上的帖子,写了自己的图像采集程序,准备移植到Zedboard上,然后就把USB摄像头连接到USB-OTG上,并将编译好的程序通过FTP协议传递到SD卡上,并执行,竟然发现程序无法执行,但是在PC机上已经调试好的啊,程序应该没有问题,猜想可能是内核的问题吧!经过笔者的仔细分析,最终解决了这个问题,原来是3.6版的内核并没有配置支持V4L2和V4L,所以无法识别到UVC设备!现在将笔者的分析过程详细道来,当然,因为笔者水平有限,难免会有所差错和疏忽,请读者指出,谢谢!联系邮箱:jef199006@gmail.com
分析过程:
在3.6内核中,笔者发现内核并不能识别出Camera,只是能发现USB设备,利用ls命令查看识别的设备,如下所示
zynq> ls /dev
1-1 ram3 tty37
bus ram4 tty38
card0 ram5 tty39
console ram6 tty4
controlC0 ram7 tty40
controlD64 ram8 tty41
cpu_dma_latency ram9 tty42
dri random tty43
fb0 root tty44
full snd tty45
i2c timer tty46
input tty tty47
kmsg tty0 tty48
loop-control tty1 tty49
loop0 tty10 tty5
loop1 tty11 tty50
loop2 tty12 tty51
loop3 tty13 tty52
loop4 tty14 tty53
loop5 tty15 tty54
loop6 tty16 tty55
loop7 tty17 tty56
mem tty18 tty57
mice tty19 tty58
mmcblk0 tty2 tty59
mmcblk0p1 tty20 tty6
mmcblk0p2 tty21 tty60
network_latency tty22 tty61
network_throughput tty23 tty62
null tty24 tty63
pcmC0D0p tty25 tty7
psaux tty26 tty8
ptmx tty27 tty9
pts tty28 ttyPS0
ram0 tty29 urandom
ram1 tty3 vcs
ram10 tty30 vcs1
ram11 tty31 vcsa
ram12 tty32 vcsa1
ram13 tty33 zed_oled
ram14 tty34 zero
ram15 tty35
ram2 tty36
zynq>
查看是否有video字段,无结果
zynq> ls /dev | grep video
zynq>
接着查看USB设备,如下图所示,可以看出,已经识别出了USB摄像头的产品ID号---1e4e:0102
而使用dmesg &可以看出已经识别出了Camera了,但是不知的怎么回事就是没有像通常那样将其识别为video0.具体信息如下图所示。
然后运行发送给ZED的程序zed_cam,出错,具体信息如下图所示:
这是因为默认打开的设备是video0,而在dev中并没有这个设备,所以提示这个错误,那么我就假设其是挂载错误了,将其设备名称改为video0,然后再运行./zed_cam,结果还是出错。具体如下图
真心不懂啊!难道是内核编译的时候配置有问题吗?
然而我使用3.3内核却可以,但3.3支持,3.6不支持明显说不通啊,而且我在自己电脑的linux 3.5也可以支持啊?这是什么情况?求解释啊
另外,3.3内核的情况如下图所示,插上Camera之后,内核就会自动识别
而同3.6内核类似,使用ls /dev | grep video查看是否有这个设备
可以看到,内核已经成功识别设备了,然后我又使用ls /dev查看下是否有3.6内核中的1-1设备。具体如下所示
zynq> uname -r
3.3.0-digilent-12.07-zed-beta
zynq> ls /dev
1-1 ram5 tty4
card0 ram6 tty40
console ram7 tty41
controlC0 ram8 tty42
controlD64 ram9 tty43
cpu_dma_latency random tty44
event0 root tty45
fb0 timer tty46
full tty tty47
i2c tty0 tty48
kmsg tty1 tty49
loop-control tty10 tty5
loop0 tty11 tty50
loop1 tty12 tty51
loop2 tty13 tty52
loop3 tty14 tty53
loop4 tty15 tty54
loop5 tty16 tty55
loop6 tty17 tty56
loop7 tty18 tty57
mem tty19 tty58
mice tty2 tty59
mmcblk0 tty20 tty6
mmcblk0p1 tty21 tty60
mmcblk0p2 tty22 tty61
network_latency tty23 tty62
network_throughput tty24 tty63
null tty25 tty7
pcmC0D0p tty26 tty8
psaux tty27 tty9
ptmx tty28 ttyPS0
pts tty29 urandom
ram0 tty3 usbdev1.1
ram1 tty30 usbdev1.3
ram10 tty31 vcs
ram11 tty32 vcs1
ram12 tty33 vcsa
ram13 tty34 vcsa1
ram14 tty35 video0
ram15 tty36 watchdog
ram2 tty37 zed_oled
ram3 tty38 zero
ram4 tty39
zynq>
看到蓝色部分了吗?这个就是同3.6内核一样识别出来的设备,但是与3.6内核不同的地方是它在识别出1-1设备的同时,又识别出了uvcvideo0,那么它到底能不能正确采集数据呢,带着这个疑问,我使用ftp协议将编译好的elf文件通过网络发送给了zed,并增加了可执行的权限,然后运行,结果如下图所示:
可以看出,已经正确采集了,再将其拷贝的数据发送回主机,查看如下图所示。
到这一步的时候,笔者猜想应该是内核3.6没有开启那个UVC支持吧,那么就先去网站上查找了下该如何配置使内核支持UVC设备,然后将其写入到digilent_zed_config,但是网上也没说,没办法,我就只好自己查看3.3版的digilent_zed_config和3.6版本的digilent_zed_config,对比两者之间具体有什么差别,还真的是给我发现了,3.6版本的digilent_zed_config并没有配置支持V4L、V4L2驱动,然后就按照自己的理解把该设置的参数都设置好了,接着将其拷贝到3.6的源码处,最后make ARCH=arm CROSS-COMPILE=arm-xilinx-gnueabi- digilent_zed_config,接着make,将生成的zImage拷贝到SD卡上测试,打开minicom,然后配置串口参数,接着查看这次是否能够发现video*设备,具体如下图所示:
可以看出现在跟原来的内核比已经能够发现video设备了,另外使用dmesg 查看发现设备信息,如下图所示:
可以看出已经能够发现UVC设备了,好了,现在心里已经有底了,估计会成功的吧,接着下一步,使用ftp将编译好的elf文件发送到zed的SD卡上,并添加执行权限,如下图所示:
完成后,执行该程序,具体执行情况如下图所示:
好了,现在已经知道应该是生成正确的bmp图像了,将其拷贝到U盘上,并在PC机上打开,具体如下图所示。
内核配置成功了!现在就可以继续接着做视频采集和开发了!加油!
另外,笔者将修改后的配置文件上传到百度网盘上了,下面是这个的链接地址,希望对大家有用!解压缩之后,digilent-zed-config_3.6_correct即为正确的默认配置文件。
http://pan.baidu.com/share/link?shareid=482753&uk=438936279