在移植MPlayer播放器时,遇到个头大的问题,WM9713也识别了,dsp等节点也都有了,但是在测试播放时出现了下面的错误:
Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 22.163695] pgd = 9f144000
[ 22.166380] [00000000] *pgd=4f105831, *pte=00000000, *ppte=00000000
[ 22.172629] Internal error: Oops: 80000007 [#1] PREEMPT ARM
[ 22.178166] Modules linked in:
[ 22.181205] CPU: 0 PID: 609 Comm: cat Not tainted 3.10.30 #193
[ 22.187007] task: 9f8a0900 ti: 9f88c000 task.ti: 9f88c000
[ 22.192379] PC is at 0x0
[ 22.194905] LR is at s3c_ac97_trigger+0xa8/0xb0
[ 22.199399] pc : [<00000000>] lr : [<802ecdf8>] psr: 60000093
[ 22.199399] sp : 9f88de18 ip : 8050ae28 fp : 00000001
[ 22.210835] r10: 00000000 r9 : a09ec000 r8 : a09ec000
[ 22.216035] r7 : 9fbfb700 r6 : 00000001 r5 : 9f8becc0 r4 : 80528c54
[ 22.222534] r3 : 00000000 r2 : 9f88dd98 r1 : 00000002 r0 : 0000001d
[ 22.229036] Flags: nZCv IRQs off FIQs on Mode SVC_32 ISA ARM Segment kernel
[ 22.236400] Control: 10c5387d Table: 4f144019 DAC: 00000015
[ 22.242119] Process cat (pid: 609, stack limit = 0x9f88c230)
[ 22.247751] Stack: (0x9f88de18 to 0x9f88e000)
[ 22.252086] de00: 9fb98a00 802e6fb0
[ 22.260234] de20: 9fb98a00 9fb98a00 80527414 00000003 00000000 802c413c 9fb98a00 802c404c
[ 22.268379] de40: 9fb98ac0 9f9d2c00 9fb98a00 00000800 9fb98ac0 802cd958 00000800 802c8d68
[ 22.276525] de60: 9fb98a00 803a8088 805273dc 801df908 00000000 9f8a6a14 9f8a6a14 7f000000
[ 22.284671] de80: 80044121 00000800 a09ec000 9fb98a00 9f88dec4 00000001 a09ec000 7f000000
[ 22.292816] dea0: 00000800 802cdacc 802cbcdc 9fb98a00 9fb98a00 9f88c000 9f9d2c00 802d3950
[ 22.300962] dec0: 9f88df80 00000000 00000000 9f95e980 9f95e880 9f88def4 9fb82c40 00000000
[ 22.309108] dee0: 9f88c000 00001000 9fb98a00 802d704c 9fb98a00 9fb82a00 9fb98a00 a09ef000
[ 22.317253] df00: 00000000 00000001 7ec67970 802d3a90 00000000 9fb82c40 9f9d2c00 00001000
[ 22.325399] df20: 7ec67970 00000000 00000000 802d565c 00000000 9f9d2e8c 9fb78920 9f9e1480
[ 22.333545] df40: 00001000 7ec67970 9f88df80 00000000 00000000 00001000 00000000 800ad29c
[ 22.341690] df60: 9f9e1488 00000020 9f9e1480 00000000 9f88df80 7ec67970 00000000 800ad400
[ 22.349836] df80: 00000000 00000000 00001000 7ec67970 76f806e0 00000003 8000ede8 9f88c000
[ 22.357982] dfa0: 00000000 8000ec40 00001000 7ec67970 00000003 7ec67970 00001000 000efc6c
[ 22.366128] dfc0: 00001000 7ec67970 76f806e0 00000003 0000008f 00000003 00000000 00000000
[ 22.374273] dfe0: 00000003 7ec67950 0000f628 76e3c90c 60000010 00000003 ffffffff ffffffff
[ 22.382436] [<802ecdf8>] (s3c_ac97_trigger+0xa8/0xb0) from [<802e6fb0>] (soc_pcm_trigger+0x94/0x9c)
[ 22.391440] [<802e6fb0>] (soc_pcm_trigger+0x94/0x9c) from [<802c413c>] (snd_pcm_do_start+0x28/0x2c)
[ 22.400449] [<802c413c>] (snd_pcm_do_start+0x28/0x2c) from [<802c404c>] (snd_pcm_action_single+0x38/0x78)
[ 22.409983] [<802c404c>] (snd_pcm_action_single+0x38/0x78) from [<802cd958>] (snd_pcm_lib_read1+0x2bc/0x358)
[ 22.419773] [<802cd958>] (snd_pcm_lib_read1+0x2bc/0x358) from [<802cdacc>] (snd_pcm_lib_read+0x60/0x64)
[ 22.429132] [<802cdacc>] (snd_pcm_lib_read+0x60/0x64) from [<802d3950>] (snd_pcm_oss_read3+0x4c/0x110)
[ 22.438404] [<802d3950>] (snd_pcm_oss_read3+0x4c/0x110) from [<802d704c>] (snd_pcm_plug_read_transfer+0x78/0xd4)
[ 22.448541] [<802d704c>] (snd_pcm_plug_read_transfer+0x78/0xd4) from [<802d3a90>] (snd_pcm_oss_read2+0x7c/0x120)
[ 22.458679] [<802d3a90>] (snd_pcm_oss_read2+0x7c/0x120) from [<802d565c>] (snd_pcm_oss_read+0x168/0x1b8)
[ 22.468130] [<802d565c>] (snd_pcm_oss_read+0x168/0x1b8) from [<800ad29c>] (vfs_read+0xac/0x140)
[ 22.476793] [<800ad29c>] (vfs_read+0xac/0x140) from [<800ad400>] (SyS_read+0x44/0x70)
有个空指针,经翻腾找了空指针的原因,代码如下:
static struct samsung_dma_ops dmadev_ops = {
.request = samsung_dmadev_request,
.release = samsung_dmadev_release,
.config = samsung_dmadev_config,
.prepare = samsung_dmadev_prepare,
.trigger = samsung_dmadev_trigger,
.started =NULL,
.flush = samsung_dmadev_flush,
.stop = samsung_dmadev_flush,
};
位置在dma-ops.c文件中。
不知道为啥要给个NULL,明明在ac97.c文件中通过dma_data->ops->started(dma_data->channel);这个代码要调用这个启动函数,由于为空,就直接报错死掉了。
有大侠知道这是什么原因么,linux内核为3.10.30版本,这之后的新版本这里的代码都是一样的。郁闷两天了,求高手指点迷津。