您的位置:首页 > 运维架构

摄像头测试出现Oops 17 [#2]问题最全面解答

2016-10-13 20:11 169 查看
环境:

linux-3.0.1     ok6410开发板   测试程序  test_usb_camera nfs方式   摄像头ZC3XX

./test_usb_camera 

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

v4l2_open  id=2

Unable to handle kernel NULL pointer dereference at virtual address 00000060

pgd = cbc08000

[00000060] *pgd=5c7d6831, *pte=00000000, *ppte=00000000

Internal error: Oops: 17 [#2]

Modules linked in:

CPU: 0    Tainted: G      D W    (3.0.1 #676)

PC is at video_devdata+0x18/0x30

LR is at dev_open+0x28/0x194

pc : [<c0352fbc>]    lr : [<c036359c>]    psr: 60000013

sp : cc7f5d30  ip : cc7f5d40  fp : cc7f5d3c

r10: c081b880  r9 : 00000026  r8 : cc7e78c8

r7 : cc423008  r6 : cc7e78c8  r5 : cc7bc200  r4 : cc423000

r3 : 00000003  r2 : c089e880  r1 : 00000000  r0 : cc7e78c8

Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user

Control: 00c5387d  Table: 5bc08008  DAC: 00000015

Process test_usb_camera (pid: 77, stack limit = 0xcc7f4268)

Stack: (0xcc7f5d30 to 0xcc7f6000)

5d20:     cc7f5d6c cc7f5d40 c036359c c0352fb0

5d40: c0363574 cc423000 cc7bc200 cc7e78c8 cc423008 cc7bc200 00000026 cc127180

5d60: cc7f5d8c cc7f5d70 c035333c c0363580 00000000 00000000 cc721ac0 cc7e78c8

5d80: cc7f5dbc cc7f5d90 c00ef5b0 c0353298 cc7f5e2c cc7f5ed0 00000000 cc7bc200

5da0: 00000000 cc7e78c8 c00ef490 cc127180 cc7f5df4 cc7f5dc0 c00ead14 c00ef49c

5dc0: cc080800 cc40ff00 cc7e78c8 cc7f5ed0 cc7bc200 00000000 cc7bce80 00000802

5de0: 00000026 00000000 cc7f5e1c cc7f5df8 c00eaf50 c00eabb4 cc7bce80 cc7f5e8c

5e00: cc7e78c8 cc7f5ed0 00000000 cc7f5e8c cc7f5e64 cc7f5e20 c00f8488 c00eaef4

5e20: cc7a3005 c088a480 cc7f5e64 cc40ff00 cc080800 cc7e78c8 cc7f5e64 cc7f5ed0

5e40: ffffff9c cc7f5f60 cc7f4000 cc7a3000 cc7f4000 cc7f5e8c cc7f5ec4 cc7f5e68

5e60: c00f992c c00f830c cc7f5e94 00000000 33db2580 00000000 66340397 bee98b70

5e80: 00000068 00000000 00000000 cc40ff00 cc127180 00000000 00000000 00000001

5ea0: cc7f5f60 cc7f5ed0 ffffff9c cc7a3000 cc7f4000 ffffff9c cc7f5f54 cc7f5ec8

5ec0: c00f9d04 c00f9874 00000041 00000000 cc40ff00 cc127180 d9d3cea0 00000006

5ee0: cc7a3005 cc40f820 cc07cc00 cc7e78c8 00000101 00000000 00000000 00000000

5f00: 00000000 00000000 00000004 cc7b50c0 cc7b50c8 cc7b50c4 00000000 cc7f4000

5f20: cc7f5f54 00000803 00000000 00000000 00000001 00000001 00000802 00000000

5f40: 00000004 cc7a3000 cc7f5f94 cc7f5f58 c00eaa78 c00f9cd8 00000000 00000000

5f60: 00000802 00000000 00000026 00000100 00000001 bee98e84 00067ecc 00000005

5f80: c0036ce8 00000000 cc7f5fa4 cc7f5f98 c00eab84 c00ea988 00000000 cc7f5fa8

5fa0: c0036b40 c00eab6c 00000001 bee98e84 000681c8 00000802 00000000 00085c8c

5fc0: 00000001 bee98e84 00067ecc 00000005 bee98d0c 00000000 000874b8 0000000a

5fe0: 00067ed4 bee98be0 000089b4 0001fe4c 40000010 000681c8 00000000 00000000

[<c0352fbc>] (video_devdata+0x18/0x30) from [<c036359c>] (dev_open+0x28/0x194)

[<c036359c>] (dev_open+0x28/0x194) from [<c035333c>] (v4l2_open+0xb0/0xd8)

[<c035333c>] (v4l2_open+0xb0/0xd8) from [<c00ef5b0>] (chrdev_open+0x120/0x1a4)

[<c00ef5b0>] (chrdev_open+0x120/0x1a4) from [<c00ead14>] (__dentry_open+0x16c/0x2c4)

[<c00ead14>] (__dentry_open+0x16c/0x2c4) from [<c00eaf50>] (nameidata_to_filp+0x68/0x70)

[<c00eaf50>] (nameidata_to_filp+0x68/0x70) from [<c00f8488>] (do_last+0x188/0x6b0)

[<c00f8488>] (do_last+0x188/0x6b0) from [<c00f992c>] (path_openat+0xc4/0x3a4)

[<c00f992c>] (path_openat+0xc4/0x3a4) from [<c00f9d04>] (do_filp_open+0x38/0x8c)

[<c00f9d04>] (do_filp_open+0x38/0x8c) from [<c00eaa78>] (do_sys_open+0xfc/0x1d0)

[<c00eaa78>] (do_sys_open+0xfc/0x1d0) from [<c00eab84>] (sys_open+0x24/0x28)

[<c00eab84>] (sys_open+0x24/0x28) from [<c0036b40>] (ret_fast_syscall+0x0/0x30)

Code: e24cb004 e590200c e5921020 e59f2010 (e5913060) 

---[ end trace da227214a82491ba ]---

Segmentation fault

[root@Enjoylinux /]# 

[root@Enjoylinux /]# 

 

一直无法解决,我在网上搜索了好多,也看了好多是空指针问题,需要反汇编然后找到错误的这指针点,比如次段代码的指针在,

PC is at video_devdata+0x18/0x30   //指针地址

LR is at dev_open+0x28/0x194

我由于觉得太麻烦就没用这种方式,但是有一天查到了一位大神的解决方法:

oks3c6410开发板 linux-3.0.1内核 ZC301P摄像头 构成视频监控系统时内核oops解决办法:

最近在做标题所示的视频监控系统时,加载飞凌提供的linux-3.0.1内核后,打开摄像头设备文件时内核报错,搜索了相关问题,果然有人遇到同样问题,可惜时间久远,没有提供详细的解决方案,但是总体方法提供了。

解决方法如下:

问题在于:在linux-3.0.1内核文件/include/mdia/v4l2-dev.h中,struct v4l2_file_operations函数集对open和release函数的定义,与/driver/media/video/gspca/gspca.c中dev_open(struct file *file)和 dev_close(struct file *file)函数定义存在出入。由于打开摄像头设备文件时会调用该函数(dev_open()),因此 需要将两处改成一样的定义。

v4l2-dev.h中struct v4l2_file_operations的定义为:

int (*open) (struct inode *inode,struct file *)

int (*release) (struct inode *inode,struct file *)

gspca.c中定义为:

dev_open(struct file *file)

dev_close(struct file *file)

修改后,gspca.c中定义不变,v4l2-dev.h中struct v4l2_file_operations的定义改为:

int (*open) (struct file *)

int (*release) (struct file *)

由于ZC301P摄像头参照gspca标准,其它摄像头可能参照uvc标准,为今后开发其它摄像头考虑,还需要修改/driver/media/video/uvc/uvc_v4l2.c中uvc_v4l2_open(struct inode *inode,struct file *file)函数和uvc_v4l2_release(struct inode *inode,struct file *file)函数,改后为:

uvc_v4l2_open(struct file *file)

uvc_v4l2_release(struct file *file)

最后,修改/driver/media/video/v4l2-dev.c文件中修改:

v4l2_open()函数下打开文件一行修改为ret = vdev->fops->open(filp)

v4l2_release()函数下释放文件一行修改为vdev->fops->release(filp);

至此完成。

 

根据大神的方法,修改以下几个地方,编译之后运行正常:

1./include/v4l2-dev.h 中struct v4l2_file_operations  修改为

int (*open) (struct file *)

int (*release) (struct file *)

2./driver/media/video/uvc/uvc_v4l2.c中

uvc_v4l2_open(struct inode *inode,struct file *file)函数

和uvc_v4l2_release(struct inode *inode,struct file *file)函数,

改后为:

uvc_v4l2_open(struct file *file)

uvc_v4l2_release(struct file *file)

3./driver/media/video/v4l2-dev.c

v4l2_open()函数下打开文件一行修改为ret = vdev->fops->open(filp)

v4l2_release()函数下释放文件一行修改为vdev->fops->release(filp);

还有如果修改后出现817[#1]的错误不用急,那是因为你的摄像头不匹配或者你将/driver/media/video/uvc/uvc_v4l2(copy).c改动了,又或者是你改了内核其他东西,实在不行再看看您的配置,如果你按照我的方式来得话,应该错误时解决的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: