|
现在我使用ARM 3358的系统总线和DPS的HPI连接,原理图如下
现在要开Linux的驱动,采用模块驱动形式
驱动部分代码如下:
#define HPI_BASE_ADDRESS 0x00000000
#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;
}
程序跑到如上红色部分出现错误,错误的信息如下
[root@EmbedSky linuxpc]# ./drivertest
SysBus_open-Success to open
----------------------------1
----------------------------2
----------------------------3
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = dfb60000
[00000000] *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 [LinSysBus]
LR is at console_unlock+0x154/0x1e4
pc : [<bf0932cc>] lr : [<c003c900>] psr: 60000013
sp : dfaa5f10 ip : dfaa5e10 fp : dfaa5f3c
r10: 00000000 r9 : 00000000 r8 : 00000000
r7 : 00000000 r6 : 40225000 r5 : dfb0b000 r4 : 00001000
r3 : c086a124 r2 : 00000001 r1 : 00000005 r0 : 00000024
Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
Control: 10c5387d Table: 9fb60019 DAC: 00000015
现在不知道哪里出问题了,请高手指教,谢谢!
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|