官方QQ群收藏本站

百问linux嵌入式论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 58|回复: 0

输入子系统--按键驱动--内核恐慌

[复制链接]

13

主题

23

帖子

101

积分

注册会员

Rank: 2

积分
101
发表于 2020-2-5 22:53:45 | 显示全部楼层 |阅读模式
本帖最后由 waka 于 2020-2-5 22:56 编辑

注意:如果点击空白处无法输入,则点击字会有输入提示符 | 则可以使用键盘进行输入!
此板块为[第二期Linux驱动开发]
  • 问题所在章节:输入子系统
  • 发生问题的运行环境:
我用三期3.4.2的内核 交叉编译器4.4.3
  • 问题发生描述:
我按着韦老师输入子系统,独立写出L S Enter Shift,可是用cat /dev/tty1测试出现问题, 一直未能解决。
最主要的问题,只要一按Shift键,就会出现内核恐慌。还有一些功能和预期也不符合...代码如下:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/sched.h>//jiffies在此头文件中定义
#include <linux/init.h>
#include <linux/timer.h>

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/irq.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <linux/poll.h>



#include <linux/delay.h>
#include <linux/errno.h>
#include <linux/sched.h>
#include <linux/i2c.h>
#include <linux/i2c-algo-bit.h>

#include <linux/module.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/gpio.h>
#include <linux/mm.h>
#include <linux/irq.h>
#include <linux/interrupt.h>
#include <asm/io.h>
#include <asm/module.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <mach/regs-gpio.h>
#include <mach/hardware.h>
#include <linux/input.h>


static struct input_dev *input_key;
static struct timer_list mytimer;
static int input_irq = 0;

static irqreturn_t key_interrupt(int irq, void *devpw)
{
        //printk("key_interrupt is called\r\n");
        input_irq = irq;
        mod_timer(&mytimer, jiffies + HZ / 100);
        return IRQ_HANDLED;
        
}



static void  mytimer_ok(unsigned long arg)
{
        printk("mytimer_ok is called\r\n");
        unsigned int pinval;
        if(input_irq == 0)
        {
                return;
        }
        printk("1mytimer_ok is called\r\n");
        switch(input_irq)
        {
                case IRQ_EINT0:
                        pinval = s3c2410_gpio_getpin(S3C2410_GPF(0));
                        printk("!pinval = %d\r\n", !pinval);
                        input_event(input_key, EV_KEY, KEY_L, !pinval);
                        //input_report_key(input_key, KEY_RIGHT, !pinval);
                        input_sync(input_key);
                        break;
                case IRQ_EINT2:
                        pinval = s3c2410_gpio_getpin(S3C2410_GPF(2));
                        printk("!pinval = %d\r\n", !pinval);
                        input_event(input_key, EV_KEY, KEY_S, !pinval);
                        //input_report_key(input_key, KEY_LEFT, !pinval);
                        input_sync(input_key);
                        break;
                case IRQ_EINT11:
                        pinval = s3c2410_gpio_getpin(S3C2410_GPF(3));                        
                        printk("!pinval = %d\r\n", !pinval);
                        input_event(input_key, EV_KEY, KEY_ENTER, !pinval);
                        //input_report_key(input_key, KEY_LEFT, !pinval);
                        input_sync(input_key);
                        break;
                case IRQ_EINT19:
                        printk("3mytimer_ok is called\r\n");
                        pinval = s3c2410_gpio_getpin(S3C2410_GPF(11));
                        printk("3mytimer_ok is called\r\n");
                        printk("!pinval = %d\r\n", !pinval);
                        input_event(input_key, EV_KEY, KEY_LEFTSHIFT, !pinval);
                        //input_report_key(input_key, KEY_LEFT, !pinval);
                        input_sync(input_key);
                        break;
                default:
                        break;

        }
}


static int __init mykey_init(void)
{

        input_key = input_allocate_device();
        set_bit(EV_KEY, input_key->evbit);
        set_bit(EV_REP, input_key->evbit);
        set_bit(KEY_L, input_key->keybit);
        set_bit(KEY_S, input_key->keybit);
        set_bit(KEY_ENTER, input_key->keybit);
        set_bit(KEY_LEFTSHIFT, input_key->keybit);
        input_register_device(input_key);

        request_irq(IRQ_EINT0,  key_interrupt, 0, "my_key", NULL);
        request_irq(IRQ_EINT2,  key_interrupt, 0, "my_key", NULL);
        request_irq(IRQ_EINT11, key_interrupt, 0, "my_key", NULL);
        request_irq(IRQ_EINT19, key_interrupt, 0, "my_key", NULL);

        init_timer(&mytimer);
        mytimer.expires = 0;//设定超时时间,100S        
        mytimer.data = 250;    //传递给定时器超时函数的值        
        mytimer.function = mytimer_ok;//设置定时器超时函数        
        add_timer(&mytimer);
        
        return 0;
}

static void __exit mykey_exit(void)
{
        input_unregister_device(input_key);
        free_irq(IRQ_EINT0,  NULL);
        free_irq(IRQ_EINT2,  NULL);
        free_irq(IRQ_EINT11, NULL);
        free_irq(IRQ_EINT19, NULL);
        //del_timer(&mytimer);
        
}
module_init(mykey_init);
module_exit(mykey_exit);
MODULE_LICENSE("GPL");

  • 输出的错误信息:
/ # key_interrupt is called
mytimer_ok is called
Unable to handle kernel NULL pointer dereference at virtual address 00000030
pgd = c0004000
[00000030] *pgd=00000000
Internal error: Oops: 17 [#1] ARM
Modules linked in: key(O)
CPU: 0    Tainted: G           O  (3.4.2 #1)
PC is at s3c2410_gpio_getpin+0x54/0x74
LR is at mytimer_ok+0x80/0x12c [key]
pc : [<c0163808>]    lr : [<bf000080>]    psr: 20000013
sp : c0449e40  ip : c0449e50  fp : c0449e4c
r10: 00000100  r9 : c048a6ec  r8 : c048a4ec
r7 : c0448000  r6 : c0458498  r5 : c0489ce0  r4 : bf000368
r3 : 00000000  r2 : 0000000b  r1 : 00000008  r0 : 000000ab
Flags: nzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
Control: c000717f  Table: 33aac000  DAC: 00000017
Process swapper (pid: 0, stack limit = 0xc0448270)
Stack: (0xc0449e40 to 0xc044a000)
9e40: c0449e64 c0449e50 bf000080 c01637c4 c0449e80 c0489ce0 c0449eb4 c0449e68
9e60: c002310c bf000010 00000001 00000001 00015220 bf000000 c048aaec c048a8ec
9e80: c0449e80 c0449e80 c004f8ec 00000004 00000001 c0489b80 c0448000 c04593b4
9ea0: c0489b60 00000100 c0449ef4 c0449eb8 c001e0d4 c0023004 c0449edc c0449ec8
9ec0: 00000001 0000000a c045a6fc c045fe94 0000001e 00000000 c0449f6c 30004000
9ee0: 41129200 3043fed8 c0449f04 c0449ef8 c001e2f4 c001e048 c0449f24 c0449f08
9f00: c0009abc c001e2b4 c0009d7c 60000013 f6000000 c0449f6c c0449f34 c0449f28
9f20: c0008210 c0009a90 c0449f8c c0449f38 c0008e04 c0008210 00fafdf4 f6100000
9f40: f6100000 60000013 c0448000 c04788a8 c04531e4 6fffffff 30004000 41129200
9f60: 3043fed8 c0449f8c c0449f80 c0449f80 c0009d70 c0009d7c 60000013 ffffffff
9f80: c0449fac c0449f90 c000a38c c0009d5c c0450140 c0478800 c0441148 6fffffff
9fa0: c0449fbc c0449fb0 c0331ca0 c000a310 c0449ff4 c0449fc0 c042786c c0331c50
9fc0: 00000000 00000000 c0427448 00000000 00000000 c0441148 c0007175 c0450064
9fe0: c0441144 c04531dc 00000000 c0449ff8 30008040 c0427644 00000000 00000000
Backtrace:
[<c01637b4>] (s3c2410_gpio_getpin+0x0/0x74) from [<bf000080>] (mytimer_ok+0x80/0x12c [key])
[<bf000000>] (mytimer_ok+0x0/0x12c [key]) from [<c002310c>] (run_timer_softirq+0x118/0x24c)
r5:c0489ce0 r4:c0449e80
[<c0022ff4>] (run_timer_softirq+0x0/0x24c) from [<c001e0d4>] (__do_softirq+0x9c/0x160)
[<c001e038>] (__do_softirq+0x0/0x160) from [<c001e2f4>] (irq_exit+0x50/0x5c)
[<c001e2a4>] (irq_exit+0x0/0x5c) from [<c0009abc>] (handle_IRQ+0x3c/0x8c)
[<c0009a80>] (handle_IRQ+0x0/0x8c) from [<c0008210>] (asm_do_IRQ+0x10/0x14)
r7:c0449f6c r6:f6000000 r5:60000013 r4:c0009d7c
[<c0008200>] (asm_do_IRQ+0x0/0x14) from [<c0008e04>] (__irq_svc+0x24/0xa0)
Exception stack(0xc0449f38 to 0xc0449f80)
9f20:                                                       00fafdf4 f6100000
9f40: f6100000 60000013 c0448000 c04788a8 c04531e4 6fffffff 30004000 41129200
9f60: 3043fed8 c0449f8c c0449f80 c0449f80 c0009d70 c0009d7c 60000013 ffffffff
[<c0009d4c>] (default_idle+0x0/0x4c) from [<c000a38c>] (cpu_idle+0x8c/0xc4)
[<c000a300>] (cpu_idle+0x0/0xc4) from [<c0331ca0>] (rest_init+0x60/0x78)
r7:6fffffff r6:c0441148 r5:c0478800 r4:c0450140
[<c0331c40>] (rest_init+0x0/0x78) from [<c042786c>] (start_kernel+0x238/0x278)
[<c0427634>] (start_kernel+0x0/0x278) from [<30008040>] (0x30008040)
Code: e5933004 e0030210 e89da800 e3a03000 (e5932030)
---[ end trace b4a2a734627078c3 ]---
Kernel panic - not syncing: Fatal exception in interrupt

回复

使用道具 举报

技术支持
在线咨询
咨询热线
0755-86200561
微信扫一扫
获取更多资讯!

Archiver|小黑屋|百问linux嵌入式论坛     

GMT+8, 2020-2-22 12:46 , Processed in 0.137489 second(s), 12 queries , File On.

Powered by Discuz! X3.3 Licensed

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表