areslion 发表于 2013-7-26 17:27:13

3358-ARM-Linux-与DSP-总线驱动问题

现在我使用ARM 3358的系统总线和DPS的HPI连接,原理图如下
现在要开Linux的驱动,采用模块驱动形式
驱动部分代码如下:


#define HPI_BASE_ADDRESS0x00000000

#define HPIC_WRITE_H(*(volatile unsigned short *)(HPI_BASE_ADDRESS+0x01)) //写控制寄存器HPIC 高字节
#define HPIC_WRITE_L(*(volatile unsigned short *)(HPI_BASE_ADDRESS+0x00)) //写控制寄存器HPIC 低字节
#define HPIC_READ_H   (*(volatile unsigned short *)(HPI_BASE_ADDRESS+0x09)) //读控制寄存器HPIC 高字节
#define HPIC_READ_L   (*(volatile unsigned short *)(HPI_BASE_ADDRESS+0x08)) //读控制寄存器HPIC 低字节


ssize_t SysBus_read (struct file * filp, char *buf, size_t count, loff_t * f_pos)
{
        printk("<1>----------------------------1\n");
        int retval = count;
        unsigned long address = short_base;
        unsigned char *kbuf = kmalloc (count, GFP_KERNEL), *ptr;

        printk("<1>----------------------------2\n");
        if (!kbuf)        return -ENOMEM;
        ptr = kbuf;

        printk("<1>----------------------------3\n");
        //v_pIOPregs->HPIC_WRITE_L=w;//配置HPIC 低字节
        //v_pIOPregs->HPIC_WRITE_H=w;//配置HPIC 高字节
        outsw(HPIC_WRITE_L,0x05,1);
        printk("<1>----------------------------4\n");
        outsw(HPIC_WRITE_H,0x05,1);
        printk("<1>----------------------------5\n");

//         unsigned long t1,t2;
//
//         t2 = (0x0000ffff & w);
//         t1 =w >>16 ;
//         v_pIOPregs->HPIA_WRITE_L=t2;
//         v_pIOPregs->HPIA_WRITE_H=t1;
        unsigned long w = 0x80600000;
        unsigned long t1,t2;
        t2 = (0x0000ffff & w);
        t1 =w >>16 ;

        printk("<1>----------------------------6\n");
        outsw(HPIA_WRITE_L,t2,1);
        printk("<1>----------------------------7\n");
        outsw(HPIA_WRITE_H,t1,1);
        printk("<1>----------------------------8\n");


        while (count--)
        {
                printk("<1>----------------------------9\n");
                insw (address,ptr,1);
                printk("<1>----------------------------a\n");
                //*(ptr++) = inw (address);
                ptr += 4;
                wmb();
                printk("<1>----------------------------b\n");
        }

        printk("<1>SysBus_read-\n%s",ptr);
        if ((retval > 0) && copy_to_user (buf, kbuf, retval))        retval = -EFAULT;
        printk("<1>----------------------------c\n");

        kfree (kbuf);
        printk("<1>----------------------------d\n");
        return retval;
}

程序跑到如上红色部分出现错误,错误的信息如下
# ./drivertest
SysBus_open-Success to open
----------------------------1
----------------------------2
----------------------------3
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = dfb60000
*pgd=9fb91831, *pte=00000000, *ppte=00000000
Internal error: Oops: 17 [#1]
Modules linked in: LinSysBus rt5370sta(O)
CPU: 0    Tainted: G         O(3.2.0-EmbedSky #1)
PC is at SysBus_read+0x64/0x1bc
LR is at console_unlock+0x154/0x1e4
pc : [<bf0932cc>]    lr : [<c003c900>]    psr: 60000013
sp : dfaa5f10ip : dfaa5e10fp : dfaa5f3c
r10: 00000000r9 : 00000000r8 : 00000000
r7 : 00000000r6 : 40225000r5 : dfb0b000r4 : 00001000
r3 : c086a124r2 : 00000001r1 : 00000005r0 : 00000024
Flags: nZCvIRQs onFIQs onMode SVC_32ISA ARMSegment user
Control: 10c5387dTable: 9fb60019DAC: 00000015


现在不知道哪里出问题了,请高手指教,谢谢!

areslion 发表于 2013-7-29 13:46:04

怎么没有人回答呢?:funk:
页: [1]
查看完整版本: 3358-ARM-Linux-与DSP-总线驱动问题