运行环境是Tiny210 已烧写带有5150驱动的linux2
可以正常运行 CMOS camera 程序
问题
1 如何编译运行例程 camtest
我已直接make,复制到板子上运行没有反应
2 根据例程的思路我自己写了一段代码运行出现问题,下面是主要代码部分
由于初学linux编程,对错误信息不太能理解,帮忙分析一下是我程序的问题,还是驱动的问题呢?
//////////////////////////////////
m_cam_p_fd = open(V4L2_DEV_NODE, O_RDWR); // #define V4L2_DEV_NODE "/dev/video0"
if (m_cam_p_fd < 0)
{
printf(" open V4L2_DEV_NODE ERROR\n");
return;
}
else
{
printf(" open V4L2_DEV_NODE ok m_cam_p_fd =%d\n",m_cam_p_fd );
}
// Get capability
if ((ioctl(m_cam_p_fd , VIDIOC_QUERYCAP, &cap)) < 0)
{
printf("V4L2 : ioctl on VIDIOC_QUERYCAP failled\n");
return ;
}
// Check the type - preview(OVERLAY)
if (!(cap.capabilities & V4L2_CAP_VIDEO_OVERLAY))
{
printf("V4L2 : Can not capture(V4L2_CAP_VIDEO_OVERLAY is false)\n");
//return ;
}
else
{
printf("V4L2 : V4L2_CAP_VIDEO_OVERLAY ok \n" );
}
// Check the type
if (!(cap.capabilities & V4L2_CAP_READWRITE))
{
printf("V4L2 : Can not capture(V4L2_CAP_READWRITE is false)\n");
//return ;
}
else
{
printf("V4L2 : V4L2_CAP_READWRITE ok \n" );
}
// Check the type
if (!(cap.capabilities & V4L2_CAP_STREAMING))
{
printf("V4L2 : Can not capture(V4L2_CAP_STREAMING is false)\n");
//return ;
}
else
{
printf("V4L2 : V4L2_CAP_STREAMING ok \n" );
}
inp.index = 0;
bool found = false;
while (true)
{
ret = ioctl(m_cam_p_fd, VIDIOC_ENUMINPUT, &inp);
printf("\nVIDIOC_ENUMINPUT = %d", ret);
if (ret < 0)
{
printf("V4L2 : ioctl on VIDIOC_ENUMINPUT failled\n");
break;
}
printf("[%d] : Name of this channel is %s\n", inp.index, inp.name);
// Test channel.type
if (inp.type & V4L2_INPUT_TYPE_CAMERA )
{
printf("V4L2 : Camera Input(V4L2_INPUT_TYPE_CAMERA )\n");
found = true;
break;
}
inp.index++;
}
if(!found)
{
printf("NO Camera Input FOUND!\n");
return ;
}
// Settings for input channel 0 which is channel of webcam
inp.type = V4L2_INPUT_TYPE_CAMERA;
if ((ioctl(m_cam_p_fd, VIDIOC_S_INPUT, &inp)) < 0)
{
printf("V4L2 : ioctl on VIDIOC_S_INPUT failed\n");
return ;
}
else
{
printf("V4L2 : ioctl on VIDIOC_S_INPUT ok\n");
}
// Set up for preview
struct v4l2_framebuffer preview2;
ret = ioctl(m_cam_p_fd, VIDIOC_G_FBUF, &preview2); //出错部分
if (ret< 0)
{
printf("V4L2 : ioctl on VIDIOC_G_FBUF failed\n");
return ;
}
else
{
printf("V4L2 : ioctl on VIDIOC_G_FBUF ok\n");
}
============================下面是屏幕显示
==================================================================
###############Before openning FB
open /dev/camera ERROR
open /dev/video0 ok m_cam_p_fd =5
V4L2 : V4L2_CAP_VIDEO_OVERLAY ok
VIDIOC_ENUMINPUT = 0[0] : Name of this channel is tvp5150
V4L2 : Camera Input(V4L2_IN[13944.275920] tvp5150 0-005c: chip found @ 0xb8 (s3c
2410-i2c)
PUT_TYPE_CAMERA )
[13944.345595] tvp5150 0-005c: tvp5150am1 detected.
V4L2 : ioctl on VIDIOC_S_INPUT ok
[13944.607682] Unable to handle kernel NULL pointer dereference at virtual addre
ss 000000fc
[13944.607753] pgd = cfe58000
[13944.607779] [000000fc] *pgd=2fe57031, *pte=00000000, *ppte=00000000
[13944.607841] Internal error: Oops: 17 [#4] PREEMPT
[13944.610033] last sysfs file: /sys/devices/platform/dm9000/net/eth0/address
[13944.616879] Modules linked in: rtl8192cu tvp5150_tiny210 snd_soc_mini210_wm89
60 snd_soc_wm8960
[13944.625462] CPU: 0 Tainted: G D (2.6.35.7-FriendlyARM #1)
[13944.631971] PC is at fimc_g_fbuf+0x40/0xd0
[13944.636040] LR is at __video_do_ioctl+0x146c/0x3df4
[13944.640886] pc : [<c043501c>] lr : [<c0423e1c>] psr: 40000013
[13944.640892] sp : cfe7bd20 ip : cfe7bd40 fp : cfe7bd3c
[13944.652322] r10: cf63d9c0 r9 : cfd75200 r8 : 802c560a
[13944.657522] r7 : c05f30e4 r6 : 00000000 r5 : 00000000 r4 : cfe7be28
[13944.664021] r3 : 00000000 r2 : 00000011 r1 : cfd75200 r0 : cf63d9c0
[13944.670522] Flags: nZcv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
[13944.677627] Control: 10c5387d Table: 2fe58019 DAC: 00000015
[13944.683345]
[13944.683347] PC: 0xc0434f9c:
[13944.687590] 4f9c e5943188 e3130001 0a000002 e59f0028 e5941000 eb06247b e3e0c
00f e1a0000c
[13944.695735] 4fbc e89dadf0 c0781920 c05f3ce4 c078386b c0783895 c05f3cfc c0783
8c0 c078253c
[13944.703881] 4fdc e1a0c00d e92dd878 e24cb004 e5913000 e1a04002 e5932188 e5935
11c e3120c01
[13944.712026] 4ffc e5916004 0a000003 e59f0094 e5931000 e59f2090 eb062463 e3a03
fbf e0235693
[13944.720172] 501c e59320fc e5842000 e3a02000 e5842004 e5932104 e5842008 e5932
108 e584200c
[13944.728318] 503c e593110c e5841010 e5931110 e5841014 e5933110 e59f1050 e1530
001 03a03004
.........................中间还有好多就不复制了
[13945.644621] Backtrace:
[13945.647057] [<c0434fdc>] (fimc_g_fbuf+0x0/0xd0) from [<c0423e1c>] (__video_do
_ioctl+0x146c/0x3df4)
[13945.655974] r6:c080b3f0 r5:bead1aa4 r4:cfe7be28 r3:c0434fdc
[13945.661614] [<c04229b0>] (__video_do_ioctl+0x0/0x3df4) from [<c0426a80>] (vid
eo_ioctl2+0x2dc/0x438)
[13945.670626] [<c04267a4>] (video_ioctl2+0x0/0x438) from [<c0421b8c>] (v4l2_ioc
tl+0x40/0x4c)
[13945.678859] [<c0421b4c>] (v4l2_ioctl+0x0/0x4c) from [<c0206f5c>] (vfs_ioctl+0
x84/0xb4)
[13945.686736] r6:802c560a r5:bead1aa4 r4:cf63d9c0 r3:bead1aa4
[13945.692375] [<c0206ed8>] (vfs_ioctl+0x0/0xb4) from [<c02079dc>] (do_vfs_ioctl
+0x530/0x58c)
[13945.700601] r6:bead1aa4 r5:bead1aa4 r4:cf63d9c0 r3:cf9c38c0
[13945.706240] [<c02074ac>] (do_vfs_ioctl+0x0/0x58c) from [<c0207a78>] (sys_ioct
l+0x40/0x64)
[13945.714379] r9:cfe7a000 r8:c016f168 r7:00000005 r6:802c560a r5:bead1aa4
[13945.720878] r4:cf63d9c0
[13945.723487] [<c0207a38>] (sys_ioctl+0x0/0x64) from [<c016efc0>] (ret_fast_sys
call+0x0/0x30)
[13945.731797] r7:00000036 r6:bead1a54 r5:bead1aa4 r4:00076920
[13945.737435] Code: e59f2090 eb062463 e3a03fbf e0235693 (e59320fc)
[13945.743840] ---[ end trace 6c534a72e730def1 ]---
[13945.753877] tvp5150: power Off
Segmentation fault
[root@FriendlyARM /bin]#