今天在编写按键中断程序完成后,加载模块是出现Segmentation fault错误。
源码如下:
static struct class *thirddrv_class;
static struct class_device *thirddrv_class_dev;
volatile unsigned long *gpgcon;
volatile unsigned long *gpgdat;
static irqreturn_t buttons_irq (int irq,void *dev_id)
{
printk("irq=%d\n");
return IRQ_HANDLED;
}
int third_drv_open(struct inode *inode, struct file *file)
{
/*配置GPG5,6,7*/
request_irq(IRQ_EINT13, buttons_irq , IRQT_BOTHEDGE, "k3",1);
request_irq(IRQ_EINT14, buttons_irq , IRQT_BOTHEDGE, "k4",1);
request_irq(IRQ_EINT15, buttons_irq , IRQT_BOTHEDGE, "k5",1);
return 0;
}
ssize_t third_drv_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)
{
/*返回四个引脚的电平*/
unsigned char key_vals[3];
int regval;
if (size != sizeof(key_vals))
return -EINVAL;
/* 读GPG5,6,7*/
regval = *gpgdat;
key_vals[0]= (regval & (1<<5)) ? 1 : 0;
key_vals[1]= (regval & (1<<6