调整real6410的FIMC驱动

来源:互联网 发布:网络漫画怎么画 编辑:程序博客网 时间:2024/05/22 14:40

real6410 发布的2.6.28内核 编译出的zImage,在我的板子上跑起来,是这样的效果:


这个个是我在华天正论坛发的帖子,描述了这一现象。

http://www.realarm.cn/bbs/viewthread.php?tid=847

figo说新内核没有这个bug,但是在我板子上还是有这个bug。figo给了我他用的zImage,可用了。但在我板子上存在左右翻转的问题。


在网上搜索了很多帖子,多是板子客服回答问题的,只是并无是实质性指导而且问题并不相同。只好自己再想他法。


决定自己阅读驱动代码

ok6410说ov9650的摄像头驱动在video目录下,用的是通用的gspca的m5602驱动。(参看ok6410的用户手册)

但从menuconfig 和config配置文件来看,实际上不是。这个驱动并没被激活。

实际上各大开发板28内核camera驱动用的是三星公司的多媒体驱动。而且修改的很少。


对比发现:

MINI6410和ok6410的media驱动几乎就是完全一样的。

ldd和real的media驱动,也差不多,但与mini/ok略有不同。ldd在virtualbox和google code上的FIMC代码中并无ov9650驱动。


1.real6410 FIMC替换为min6410的驱动、

全部替换并修改config文件之后,make zImage 。



figo给我的zImage 以及完全采用mini的FIMC驱动,cam2fb测试程序得到的bmp图片。



这个翻转的问题,camera的零售商,gooogleman说修改镜像。real的售后没有回复,呵呵。


2 。 更改寄存器 

什么是镜像寄存器呢?

在向在做i2c驱动的小红同学请教之后,在有寄存器详细说明的ov9650的datasheet上,找到了mirror的寄存器MVFP。感谢小红的无私帮助。




把ox1e的这个寄存器由34更改为14之后,就是使用normal image,使用VFlip(应该是垂直翻转的意思)。


运行 ./cam2fb_0910 /dev/video0得到这样的bmp图像:




LCD屏幕上是这么显示的:


就是这样的照镜子的效果。看文字“为了下一代”。




但是bmp图片是完全正确的。


正对着摄像头的话,

可以看到连续视频在framebuffer上显示出来:






再来一张:







LCD上是“照镜子的效果”,但是感觉摄像头如果用于视频聊天的话,就应该是这样的类似照镜子的效果。

但仍旧存在这样的一个问题:

   屏幕是倒立的,就是说左上角是(0,0),现在变成了右下角是(0,0)了。

这挺适合对着摄像头进行视频聊天的情形。



BMP图片并无差错:






当然,这个写bmp图片的工作是V4L程序在做的,不是ov9650的事情。


=========================================================================

v4l的程序v4lgrab 运行不下去:


[root@Zhangbin6410 /zhangbin]# ./v4l2grab -d /dev/video0 -o 1e.jpg -W 480 -H 272

mmap error 22, Invalid argument  


直接替换FIMC驱动是不行的:




Select number --> 7
====== Camera Preview & Decode Test ======


Unable to handle kernel NULL pointer dereference at virtual address 00000012

pgd = cf57c000
[00000012] *pgd=5f58d031, *pte=00000000, *ppte=00000000
Internal error: Oops: 17 [#3] PREEMPT
Modules linked in:
CPU: 0    Tainted: G      D     (2.6.28.6 #726)
PC is at s3c_fimc_i2c_write+0x44/0x80
LR is at 0x0
pc : [<c0291b0c>]    lr : [<00000000>]    psr: 80000013
sp : cf523bf8  ip : 00000000  fp : cf523ca4
r10: 00000000  r9 : cf523e30  r8 : c04456ec
r7 : cf523e30  r6 : c05a5138  r5 : cf2f9c00  r4 : cf2f9c00
r3 : 00000000  r2 : 00000080  r1 : 00000012  r0 : cf523bf8
Flags: Nzcv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
Control: 00c5387d  Table: 5f57c008  DAC: 00000015
Process multimedia_test (pid: 1211, stack limit = 0xcf522260)
Stack: (0xcf523bf8 to 0xcf524000)
3be0:                                                       00000030 00000000 
3c00: 00000034 00000000 00000038 00000000 cf523c44 cf523c20 c00dba64 c01ed1e0 
3c20: cf523c44 ce818120 ce804e00 ce818378 cf523ed8 cf522000 cf523d94 cf523c48 
3c40: c014cc70 c00dba34 00000058 18000000 0000005c 00000000 00000068 00000000 
3c60: 0000006c 00000000 00000070 00000000 00000074 00000000 00000078 18000000 
3c80: 0000007c 00000030 cf520080 cf523bf8 c0293664 c05a5042 cf523cc4 cf523ca8 
3ca0: c0294b04 c0291ad4 cf523e30 00000000 c05a51a8 c065d3f4 cf523cd4 cf523cc8 
3cc0: c02911f0 c0294acc cf523cf4 cf523cd8 c0291580 c02911d0 cf523d0c c065d3f4 
3ce0: 00000000 4004560e cf523d0c cf523cf8 c0292444 c0291548 cf523e30 00000004 
3d00: cf523e1c cf523d10 c028b4b4 c0292420 00000000 60000113 c05e17e0 c05e1884 
3d20: 00000000 c05e1870 00000000 0000000a cf523d5c cf523d40 c006a8cc c0067a64 
3d40: 00000000 c0099f34 cea76180 cf2c7c00 cf523d74 4004560e cf579200 c05a4ad8 
3d60: c065d3f4 c05e17e0 cf523d84 cf523d78 c022ea28 0012259c cf523da4 cf523d88 
3d80: c009e1f8 c01f03d4 00000103 0012259c ce81e670 00000040 cf523dc4 cf523da8 
3da0: c009e65c c009e1cc cf522000 0012259c 00000000 c0705220 cf523e14 cf523dc8 
3dc0: c009ee50 c00a75e8 cf522000 cf48e380 cf523df4 cf5733c8 cf579148 ce81e5d0 
3de0: 00000000 00000045 cf523e0c 00000000 c0705220 00000004 00000000 4004560e 
3e00: cf523e30 00000000 00000000 00000000 cf523edc cf523e20 c028d5cc c028a18c 
3e20: 00000000 beb68a44 cf579200 00000001 00000001 00000000 4001f000 00000140 
3e40: 000000f0 50424752 400aa96c 00000001 00008b3c 00000000 400abc40 cf523e68 
3e60: c00af8b4 c00ae644 00000040 00000000 00000000 60000093 00000085 00000000 
3e80: cf463480 00000214 cf57d000 00000001 cf523ebc 00000200 cf05f200 40085000 
3ea0: cf523ebc cf523eb0 c0088278 c01f1fdc cf523f7c cf579200 4004560e beb68a44 
3ec0: cf579200 beb68a44 cf522000 00000000 cf523eec cf523ee0 c028d714 c028d3f0 
3ee0: cf523f0c cf523ef0 c00d8588 c028d704 00000000 00000003 cf579200 4004560e 
3f00: cf523f7c cf523f10 c00d8b2c c00d8518 00000000 ce8186d4 c0216f60 00000002 
3f20: ce804180 ce8185d0 00000001 00000001 cf522000 00000000 cf523f6c cf523f48 
3f40: c00cbc2c c00f8134 00000000 beb1d578 00000000 00000003 beb68a44 4004560e 
3f60: cf579200 c004dfe8 cf522000 00000000 cf523fa4 cf523f80 c00d8bbc c00d86a8 
3f80: ffffffff 00000000 00000001 000231f0 00000000 00000036 00000000 cf523fa8 
3fa0: c004de40 c00d8b88 00000001 000231f0 00000003 4004560e beb68a44 beb687d0 
3fc0: 00000001 000231f0 00000000 00000036 000000f0 00000000 40025000 00000000 
3fe0: 00000140 beb1d7d0 0000d360 40103cac 60000010 00000003 00000000 00000000 
Backtrace: 
[<c0291ac8>] (s3c_fimc_i2c_write+0x0/0x80) from [<c0294b04>] (ov965x_command+0x44/0x8c)
 r4:c05a5042
[<c0294ac0>] (ov965x_command+0x0/0x8c) from [<c02911f0>] (s3c_fimc_i2c_command+0x2c/0x40)
 r6:c065d3f4 r5:c05a51a8 r4:00000000
[<c02911c4>] (s3c_fimc_i2c_command+0x0/0x40) from [<c0291580>] (s3c_fimc_init_camera+0x44/0x5c)
[<c029153c>] (s3c_fimc_init_camera+0x0/0x5c) from [<c0292444>] (s3c_fimc_v4l2_overlay+0x30/0x78)
 r6:4004560e r5:00000000 r4:c065d3f4
[<c0292414>] (s3c_fimc_v4l2_overlay+0x0/0x78) from [<c028b4b4>] (__video_do_ioctl+0x1334/0x3264)
 r4:00000004
[<c028a180>] (__video_do_ioctl+0x0/0x3264) from [<c028d5cc>] (__video_ioctl2+0x1e8/0x314)
[<c028d3e4>] (__video_ioctl2+0x0/0x314) from [<c028d714>] (video_ioctl2+0x1c/0x20)
[<c028d6f8>] (video_ioctl2+0x0/0x20) from [<c00d8588>] (vfs_ioctl+0x7c/0x98)
[<c00d850c>] (vfs_ioctl+0x0/0x98) from [<c00d8b2c>] (do_vfs_ioctl+0x490/0x4e0)
 r6:4004560e r5:cf579200 r4:00000003
[<c00d869c>] (do_vfs_ioctl+0x0/0x4e0) from [<c00d8bbc>] (sys_ioctl+0x40/0x64)
[<c00d8b7c>] (sys_ioctl+0x0/0x64) from [<c004de40>] (ret_fast_syscall+0x0/0x2c)
 r7:00000036 r6:00000000 r5:000231f0 r4:00000001
Code: e14b31be e50bd018 e3a0c000 ea000002 (e7d1300c) 
---[ end trace 494bd4821a69093e ]---
Segmentation fault





[root@Zhangbin6410 /zhangbin]# ./v4l2grab -d /dev/video0 -o 1.jpg
Unable to handle kernel NULL pointer dereference at virtual address 00000012
pgd = cf52c000
[00000012] *pgd=5f50c031, *pte=00000000, *ppte=00000000
Internal error: Oops: 17 [#2] PREEMPT
Modules linked in:
CPU: 0    Tainted: G      D     (2.6.28.6 #726)
PC is at s3c_fimc_i2c_write+0x44/0x80
LR is at 0x0
pc : [<c0291b0c>]    lr : [<00000000>]    psr: 80000013
sp : cf523bf8  ip : 00000000  fp : cf523ca4
r10: 00000000  r9 : cf523e30  r8 : c04456ec
r7 : cf523e30  r6 : c05a5138  r5 : cf2f9c00  r4 : cf2f9c00
r3 : 00000000  r2 : 00000080  r1 : 00000012  r0 : cf523bf8
Flags: Nzcv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
Control: 00c5387d  Table: 5f52c008  DAC: 00000015
Process v4l2grab (pid: 1206, stack limit = 0xcf522260)
Stack: (0xcf523bf8 to 0xcf524000)
3be0:                                                       00000030 00000000 
3c00: 00000034 00000000 00000038 00000000 0000003c 00000000 00000040 00000000 
3c20: 00000044 00000000 00000048 00000000 0000004c 00000000 00000050 00000000 
3c40: 00000054 00000000 00000058 18000000 0000005c 00000000 00000068 00000000 
3c60: 0000006c 00000000 00000070 00000000 00000074 00000000 00000078 18000000 
3c80: 0000007c 00000030 00000080 cf523bf8 00000084 c05a5042 cf523cc4 cf523ca8 
3ca0: c0294b04 c0291ad4 00096000 00000000 c05a51a8 c065d1d8 cf523cd4 cf523cc8 
3cc0: c02911f0 c0294acc cf523cf4 cf523cd8 c0291580 c02911d0 cf523e30 00000001 
3ce0: c065d1d8 40045612 cf523d0c cf523cf8 c02923ec c0291548 00000001 00000000 
3d00: cf523e1c cf523d10 c028b6f0 c02923c8 c00a4318 c00a22c4 00000044 cf523d28 
3d20: c009e65c 00000000 00000000 c05be3dc 00000000 00000001 c05bdae4 00000000 
3d40: c05bdac0 c05bdac0 000000f8 cf05f200 5f02a3a1 40045612 cf53c780 c05a4908 
3d60: c065d1d8 c00a4610 00000044 cf523d78 c00a47a0 00000000 00000000 c05be3dc 
3d80: 00000000 00000001 c05bdae4 00000000 c05bdac0 c05bdac0 cf523dc4 cf58dffc 
3da0: 000084d0 cf463180 c05be3d8 00000000 00000001 cf05f200 cf523e34 cf523dc8 
3dc0: c00a47a0 c00a425c 00000001 00000044 00000400 00000000 cf53c9c8 ce81e5d0 
3de0: cf522000 00000000 000284d0 00000010 c0703d80 00000004 00000000 40045612 
3e00: cf523e30 00000000 00000000 00000000 cf523edc cf523e20 c028d5cc c028a18c 
3e20: 40211000 be85ea50 cf53c780 00000001 00000001 00000001 00000000 00000000 
3e40: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
3e60: 00000001 00000000 00000000 00000000 00000000 ceaae7f0 cf523e9c cf523e88 
3e80: c00b3958 c00ac4d0 cf58f960 cf58f8f0 cf523ec4 cf523ea0 c00b42ec c00b38b4 
3ea0: cf58f960 4033d000 cf53c780 000844ff cf58f8f0 cf53c780 40045612 be85ea50 
3ec0: cf53c780 be85ea50 cf522000 00000000 cf523eec cf523ee0 c028d714 c028d3f0 
3ee0: cf523f0c cf523ef0 c00d8588 c028d704 00000000 00000003 cf53c780 40045612 
3f00: cf523f7c cf523f10 c00d8b2c c00d8518 00000007 cf463180 00000003 00096000 
3f20: cf523f74 cf523f30 c00b5e34 c00b56c0 000000ff 00000003 00000001 cf522000 
3f40: 4033d000 cf53c780 00000000 00096000 cf522000 00000003 be85ea50 40045612 
3f60: cf53c780 c004dfe8 cf522000 00000000 cf523fa4 cf523f80 c00d8bbc c00d86a8 
3f80: 00000003 00000000 0000b910 00000000 00008bf8 00000036 00000000 cf523fa8 
3fa0: c004de40 c00d8b88 0000b910 00000000 00000003 40045612 be85ea50 40045612 
3fc0: 0000b910 00000000 00008bf8 00000036 00000000 00000000 40025000 be85e9bc 
3fe0: 00000000 be85e9a0 000096e8 4010dcac 60000010 00000003 00000000 00000000 
Backtrace: 
[<c0291ac8>] (s3c_fimc_i2c_write+0x0/0x80) from [<c0294b04>] (ov965x_command+0x44/0x8c)
 r4:c05a5042
[<c0294ac0>] (ov965x_command+0x0/0x8c) from [<c02911f0>] (s3c_fimc_i2c_command+0x2c/0x40)
 r6:c065d1d8 r5:c05a51a8 r4:00000000
[<c02911c4>] (s3c_fimc_i2c_command+0x0/0x40) from [<c0291580>] (s3c_fimc_init_camera+0x44/0x5c)
[<c029153c>] (s3c_fimc_init_camera+0x0/0x5c) from [<c02923ec>] (s3c_fimc_v4l2_streamon+0x30/0x58)
 r6:40045612 r5:c065d1d8 r4:00000001
[<c02923bc>] (s3c_fimc_v4l2_streamon+0x0/0x58) from [<c028b6f0>] (__video_do_ioctl+0x1570/0x3264)
 r5:00000000 r4:00000001
[<c028a180>] (__video_do_ioctl+0x0/0x3264) from [<c028d5cc>] (__video_ioctl2+0x1e8/0x314)
[<c028d3e4>] (__video_ioctl2+0x0/0x314) from [<c028d714>] (video_ioctl2+0x1c/0x20)
[<c028d6f8>] (video_ioctl2+0x0/0x20) from [<c00d8588>] (vfs_ioctl+0x7c/0x98)
[<c00d850c>] (vfs_ioctl+0x0/0x98) from [<c00d8b2c>] (do_vfs_ioctl+0x490/0x4e0)
 r6:40045612 r5:cf53c780 r4:00000003
[<c00d869c>] (do_vfs_ioctl+0x0/0x4e0) from [<c00d8bbc>] (sys_ioctl+0x40/0x64)
[<c00d8b7c>] (sys_ioctl+0x0/0x64) from [<c004de40>] (ret_fast_syscall+0x0/0x2c)
 r7:00000036 r6:00008bf8 r5:00000000 r4:0000b910
Code: e14b31be e50bd018 e3a0c000 ea000002 (e7d1300c) 
---[ end trace 494bd4821a69093e ]---
Segmentation fault
[root@Zhangbin6410 /zhangbin]# 




于是,阅读FIMC的驱动。发现ov9650的驱动和v4l的驱动是分开写的。

ov9650驱动,依赖于fimc_core.c,而v4l并不依赖于这个这个文件。

cam2fb依赖于v4l,v4l2grab依赖于s3c_fimc_v4l2.c

而real的s3c_fimc_v4l2.c和mini有不同,但和ldd是相同的,区别就是对jpeg的支持不同。

所以采用real的v4l,mini的ov9650驱动。

real的ov9650驱动 其实是和mini差别不大,figo多维数组的结构,和sumsang的一维数组,在i2c_msg中buf传递中意思是一样的。

但实际效果在我板子上是不行的。好奇怪。



略微修改之后,烧录到板子,运行。。。


测试表明,采用real的v4l,mini的ov9650驱动之后,板子运行良好。ok6410的testcamera无法退出,在一个while(1)中,dnw 对ctrl+c不响应????囧~~


于是从xp 下的dnw切换到 ubuntu上的minicom,

有程序在运行的话,minicom是图片上面那样的:

然后ctrl+c,终端的提示行就出来了,哈哈~~~







==============================================================

另外

去除了开机的cursor,并且开机画面,也成功修改了:






、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

real的板子上还有个bug:


SDL的测试程序,一直跑步起来,但是会显示类似这样的画面。静止不动的,只能通过重启解决。





这个时候,framebuffer可以写入,但不知道是不是真的写入,反正LCD屏幕没有反应。