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屏幕没有反应。