Unable to handle kernel paging request at virtual address e6f4b4d0

调试tiny4412LCD屏幕的时候,驱动加载的时候会挂掉。对寄存器ioremap的时候没有出错,但是访问寄存器的时候出错了。

[  187.030282] Unable to handle kernel paging request at virtual address e6f4b4d0
[  187.034416] pgd = dedc0000
[  187.037145] [e6f4b4d0] *pgd=5f2d0811, *pte=00000000, *ppte=00000000
[  187.043359] Internal error: Oops: 7 [#1] PREEMPT SMP
[  187.048304] Modules linked in: tiny4412_fb(+) compat snd_soc_tiny4412_wm8960 snd_soc_wm8960
[  187.056638] CPU: 0    Not tainted  (3.0.86-FriendlyARM #53)
[  187.062198] PC is at lcd_init+0x1b8/0x564 [tiny4412_fb]
[  187.067405] LR is at l2x0_cache_sync+0x38/0x3c
[  187.071828] pc : [<bf0053dc>]    lr : [<c0055e80>]    psr: 600b0013
[  187.071831] sp : df345e90  ip : df345e78  fp : df345eac
[  187.083284] r10: 0000001c  r9 : c00bcbcc  r8 : bf005224
[  187.088492] r7 : 00000320  r6 : 00000001  r5 : c09048cc  r4 : bf005b0c
[  187.095002] r3 : e6f4b4c0  r2 : 00000000  r1 : a00b0013  r0 : c09a2338
[  187.101513] Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
[  187.108631] Control: 10c5387d  Table: 5edc004a  DAC: 00000015
[  187.114359] 
[  187.114361] LR: 0xc0055e00:
[  187.118611] 5e00  e59f0008 eb18e751 e89da818 c09a2330 c09a2338 e1a0c00d e92dd830 e24cb004
[  187.126770] 5e20  e59f401c e1a00004 eb18e814 e1a05000 ebffffc2 e1a00004 e1a01005 eb18e743
[  187.134929] 5e40  e89da830 c09a2338 e1a0c00d e92dd830 e24cb004 e3024330 e34c409a e2845008
[  187.143088] 5e60  e1a00005 eb18e805 e5943000 e3a02000 e1a01000 e5832730 e1a00005 eb18e733
[  187.151247] 5e80  e89da830 e1a0c00d e92dd878 e24cb004 e59f60a0 e0602001 e5963010 e1a04000
[  187.159407] 5ea0  e1520003 e1a05001 2a000020 e2860008 eb18e7f2 e3c4401f e1a01000 e1550004
[  187.167566] 5ec0  9a000014 e0643005 e3530a01 90843003 82843a01 e1530004 9a000005 e5962000
[  187.175725] 5ee0  e2822e7f e5824000 e2844020 e1530004 8afffffb e1550003 9affffef e59f0038
[  187.183885] 
[  187.183887] SP: 0xdf345e10:
[  187.188138] 5e10  00000000 e6f4a000 1003c000 c090da80 c00bcbcc 0000040f 00000007 00000001
[  187.196297] 5e30  00000320 bf005224 df345eac df345e48 c0048210 c0042510 c09a2338 a00b0013
[  187.204456] 5e50  00000000 e6f4b4c0 bf005b0c c09048cc 00000001 00000320 bf005224 c00bcbcc
[  187.212615] 5e70  0000001c df345eac df345e78 df345e90 c0055e80 bf0053dc 600b0013 ffffffff
[  187.220774] 5e90  bf005a10 c09a1f00 df344000 00000000 df345eec df345eb0 c0042808 bf005230
[  187.228934] 5eb0  00000000 df345ec0 bf005a10 bf0059c8 00000001 ded2f0c0 bf005a10 bf0059c8
[  187.237093] 5ed0  00000001 ded2f0c0 00000001 0000001c df345fa4 df345ef0 c00be284 c00427dc
[  187.245252] 5ef0  bf0059d4 c015e9f4 c00bccf4 00000000 be988594 e6f21f80 df344000 c0904988

原因是访问超出了ioremap的界限。

 

    #define         CLK_DIV_LCD                     0x534
    static volatile unsigned long *clk_regs_base;


    clk_regs_base = ioremap(CLK_REGS_BASE, 0x1000);
    if (clk_regs_base == NULL)
    {
        printk("ioremap clk_regs_base error\n");
        return -EINVAL;
    }

    temp = readl(clk_regs_base + CLK_DIV_LCD); //出错位置
    temp &= ~0x0f;
    writel(temp, clk_regs_base + CLK_DIV_LCD);

指针加1,等于地址加4,所有这里访问越界了,需要将CLK_DIV_LCD的值除以4,才是正确的访问地址。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值