📄 keypad.c
字号:
udelay(DELAY_TIME); } else { handle_scancode(0xe0,!(0xe0 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0x4d,!(0x4d & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0xe0,!(0xe0 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0xcd,!(0xcd & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); }#ifdef HR_DEBUG printk("KEYPAD6\n");#endif break; case KEYPAD7: if(numlock == 0) { handle_scancode(0x47,!(0x47 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0xc7,!(0xc7 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); } else { handle_scancode(0xe0,!(0xe0 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0x47,!(0x47 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0xe0,!(0xe0 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0x97,!(0x97 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); }#ifdef HR_DEBUG printk("KEYPAD7\n");#endif break; case KEYPAD8: if(numlock == 0) { handle_scancode(0x48,!(0x48 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0xc8,!(0xc8 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); } else { handle_scancode(0xe0,!(0xe0 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0x48,!(0x48 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0xe0,!(0xe0 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0xc8,!(0xc8 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); }#ifdef HR_DEBUG printk("KEYPAD8\n");#endif break; case KEYPAD9: if(numlock == 0) { handle_scancode(0x49,!(0x49 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0xc9,!(0xc9 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); } else { handle_scancode(0xe0,!(0xe0 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0x49,!(0x49 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0xe0,!(0xe0 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0xc9,!(0xc9 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); }#ifdef HR_DEBUG printk("KEYPAD9\n");#endif break; case KEYPADADD: handle_scancode(0x4e,!(0x4e & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0xce,!(0xce & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME);#ifdef HR_DEBUG printk("KEYPADADD\n");#endif break; case KEYPADSUB: handle_scancode(0x4a,!(0x4a & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0xca,!(0xca & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME);#ifdef HR_DEBUG printk("KEYPADSUB\n");#endif break; case KEYPADDOT: if(numlock == 0) { handle_scancode(0x53,!(0x53 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0xd3,!(0xd3 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); } else { handle_scancode(0xe0,!(0xe0 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0x53,!(0x53 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0xe0,!(0xe0 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0xd3,!(0xd3 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); }#ifdef HR_DEBUG printk("KEYPADDOT\n");#endif break; case KEYPADMUL: handle_scancode(0x37,!(0x37 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0xb7,!(0xb7 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME);#ifdef HR_DEBUG printk("KEYPADMUL\n");#endif break; case KEYPADDIV: handle_scancode(0xe0,!(0xe0 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0x35,!(0x35 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0xe0,!(0xe0 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0xb5,!(0xb5 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME);#ifdef HR_DEBUG printk("KEYPADDIV\n");#endif break; case KEYPADENTER: handle_scancode(0xe0,!(0xe0 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0x1c,!(0x1c & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0xe0,!(0xe0 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0x9c,!(0x9c & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME);#ifdef HR_DEBUG printk("KEYPADENTER\n");#endif break; case KEYPADNUMLK: numlock = ~(numlock); handle_scancode(0x45,!(0x45 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME); handle_scancode(0xc5,!(0xc5 & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME);#ifdef HR_DEBUG printk("KEYPADNUMLK\n");#endif break; default: handle_scancode(0xff,!(0xff & 0x80)); tasklet_schedule(&keyboard_tasklet); udelay(DELAY_TIME);#ifdef HR_DEBUG printk("[ ]\n");#endif break; }} #define keypad_MAJOR 196devfs_handle_t keypad_handle; /* register handle to store device fs */int keypad_temp_count=0;ssize_t keypad_read (struct file * file ,char * buf, size_t count, loff_t * f_ops){ ui8ScanCode=readKBValue(); put_user(ui8ScanCode,buf); // return sizeof(ui8ScanCode); return count;} /*=========== SimpleD Write =======================*/ssize_t keypad_write (struct file * file ,const char * buf, size_t count, loff_t * f_ops){ printk("s3c2410: device file-write operation!\n"); return count;} /*=========== SimpleD Ioctl =======================*/ssize_t keypad_ioctl (struct inode * inode ,struct file * file, unsigned int cmd, long data){ printk("s3c2410: device ioctl operation!\n"); }/*============ SimpleD device open ==============*/ ssize_t keypad_open (struct inode * inode ,struct file * file){ return 0;} /*============ SimpleD device close =============*/ssize_t keypad_release (struct inode * inode ,struct file * file){ return 0;}struct file_operations keypad_ops ={ open: keypad_open, read: keypad_read, write: keypad_write, ioctl: keypad_ioctl, release: keypad_release,};static void IRQ_keypad_interrupt(int nr, void *devid, struct pt_regs *regs){ ui8ScanCode=readKBValue(); HR_del_pre_scancode(ui8ScanCode); //printk(" %x pressed!\n",ui8ScanCode);}static int __init HW_keypad_init(void){ int ret = -ENODEV; int delay ; set_external_irq(IRQ_keypad_INT,EXT_FALLING_EDGE, GPIO_PULLUP_EN); set_gpio_ctrl(GPIO_SimpleINT_EINT1); ret = request_irq(IRQ_keypad_INT, IRQ_keypad_interrupt, SA_INTERRUPT, "keypad", NULL); if (ret) { printk(KERN_INFO "request SimpleINT IRQ failed (%d)\n", IRQ_keypad_INT); return ret; } ret = devfs_register_chrdev(keypad_MAJOR, "keypad", &keypad_ops); if( ret < 0 ){ printk (" s3c2410: init_module failed with %d\n", ret); return ret; } else { printk(KERN_INFO" S3c2410 keypad register success!!!\n"); ; } keypad_handle = devfs_register( NULL, "keypad", DEVFS_FL_DEFAULT, keypad_MAJOR, 0, S_IFCHR, &keypad_ops, NULL);//------------------------------------------------------------------- KeyPadInit();//------------------------------------------------------------------- return ret;}int __init s3c2410_keypad_init(void) { int ret = -ENODEV; ret = HW_keypad_init(); if (ret) return ret; return 0;}int init_module(){ s3c2410_keypad_init();}void cleanup_module(){ devfs_unregister_chrdev( keypad_MAJOR, "keypad" ); devfs_unregister( keypad_handle ); free_irq(IRQ_keypad_INT, NULL);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -