Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = cd600000
[00000000] *pgd=5d48d831, *pte=00000000, *ppte=00000000
Internal error: Oops: 17 [#3] PREEMPT
last sysfs file: /sys/devices/virtual/misc/RS485/dev
Modules linked in: mycom_rs485
CPU: 0 Tainted: G D (2.6.38-FriendlyARM #10)
PC is at mycom_rs485_ioctl+0x6c/0xd4 [mycom_rs485]
LR is at do_vfs_ioctl+0x538/0x5bc
pc : [<bf00006c>] lr : [<c01f2ad8>] psr: 60000013
sp : cd67ff10 ip : 000003e7 fp : 00000000
r10: 00000000 r9 : cd67e000 r8 : c0175788
r7 : cd156000 r6 : 00000000 r5 : 00000000 r4 : 7f005000
r3 : 00000000 r2 : 7f005800 r1 : 00000000 r0 : cd647820
Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
Control: 00c5387d Table: 5d600008 DAC: 00000015
Process rs485 (pid: 1007, stack limit = 0xcd67e268)
Stack: (0xcd67ff10 to 0xcd680000)
ff00: cd647820 00000000 00000000 cd647820
ff20: 00000000 c01f2ad8 00000005 00000000 cd453c24 00000002 cd453c24 00000002
ff40: cd67ff50 00000003 cd453c24 cd453c00 cd647820 00000020 00000001 00000001
ff60: cd67ff74 c0186194 00000003 cd647820 00000000 00000000 00000003 c0175788
ff80: cd67e000 c01f2b90 00000003 00000000 00000000 00000003 00000001 00000000
ffa0: 00000036 c01755e0 00000003 00000001 00000003 00000000 00000000 00000000
ffc0: 00000003 00000001 00000000 00000036 00000000 00000000 400bb000 00000000
ffe0: 00000000 be9e2cd0 0000857c 402654ec 60000010 00000003 5fffe821 5fffec21
[<bf00006c>] (mycom_rs485_ioctl+0x6c/0xd4 [mycom_rs485]) from [<c01f2ad8>] (do_vfs_ioctl+0x538/0x5bc)
[<c01f2ad8>] (do_vfs_ioctl+0x538/0x5bc) from [<c01f2b90>] (sys_ioctl+0x34/0x54)
[<c01f2b90>] (sys_ioctl+0x34/0x54) from [<c01755e0>] (ret_fast_syscall+0x0/0x30)
Code: e150000c dafffff9 e5530001 e5c20020 (e4d30001)
---[ end trace 8d6db23fc19efd45 ]---
Segmentation fault
---------------------驱动代码是----------------------------------
#其他头文件
#include <mach/gpio-bank-b.h>
#include <mach/gpio-bank-h.h>
#define DEVICE_NAME "RS485"
#define WrUTXH0(ch) (*(volatile unsigned char *)(S3C_PA_UART2+0x20))=(unsigned char)(ch)
#define RdURXH0() (*(volatile unsigned char *)(S3C_PA_UART3+0x24))
#define UART2_BASE (0x7F005800)
#define rULCON2 (*(volatile unsigned *)(UART2_BASE+0x00))
#define rUCON2 (*(volatile unsigned *)(UART2_BASE+0x04))
#define rUFCON2 (*(volatile unsigned *)(UART2_BASE+0x08))
#define rUBRDIV2 (*(volatile unsigned *)(UART2_BASE+0x28))
#define rUDIVSLOT2 (*(volatile unsigned *)(UART2_BASE+0x2C))
static void Delay(void)
{
volatile int i;
for(i=0 ; i < 1000 ; i++)
{
}
}
static long mycom_rs485_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
switch(cmd) {
unsigned tmp;
char *pt = "Hello, mycom";
case 0: //send
tmp = readl(S3C_PA_UART2 + 0x10);
while(!(tmp & 0x2)); //Wait until THR is empty.
Delay();
WrUTXH0(*pt);//只发送'H'
return 0;
case 1: //receive
printk(DEVICE_NAME"received: ");
tmp = readl(S3C_PA_UART3 + 0x10);
while(tmp & 0x1)
printk("%c", RdURXH0());
return 0;
default:
return -EINVAL;
}
}
static struct file_operations dev_fops = {
.owner = THIS_MODULE,
.unlocked_ioctl = mycom_rs485_ioctl,
};
static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &dev_fops,
};
static int __init dev_init(void)
{
int ret;
{
unsigned tmp;
tmp = readl(S3C64XX_GPBCON);
tmp = (tmp & ~(0xffff<<0))|(0x2222<<0); //TXD2/GPB1 RXD2/GPB0 TXD3/GPB3 RXD3/GPB2
writel(tmp, S3C64XX_GPBCON);
tmp = readl(S3C64XX_GPBPUD);
tmp = (tmp & ~(0xf<<0))|(0x1<<0);
writel(tmp, S3C64XX_GPBPUD);
//UART2
tmp = readl(S3C64XX_GPHDAT);
tmp = (tmp & ~(0x11<<2));
writel(tmp, S3C64XX_GPHDAT);
}
ret = misc_register(&misc);
printk (DEVICE_NAME"\tinitialized\n");
return ret;
}
static void __exit dev_exit(void)
{
misc_deregister(&misc);
}
module_init(dev_init);
module_exit(dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("mycom Inc.");