📄 key.c
字号:
/* 串口转键盘驱动 Brad 2004-11-29*/#include <linux/module.h>#if defined(COBFIG_MODVERSIONS)#define MODVERSIONS#include <linux/modversions.h>#endif#include <linux/kernel.h>#include <linux/input.h>#include <linux/init.h>#include <linux/kbd_ll.h>#include <linux/types.h>#include <linux/param.h>#include "Key.h"#define KEY_TIMEOUT 1//1*HZstatic int mykey_open (struct inode *node, struct file *filp);static int mykey_release (struct inode *node, struct file *filp);static ssize_t mykey_read (struct file *file, char *buf, size_t count, loff_t *offset); static ssize_t mykey_write (struct file *file, const char *buf, size_t count, loff_t *offset);static int mykey_ioctl(struct inode *node, struct file *filp, unsigned int cmd, unsigned long arg);struct file_operations mykey_fops; //文件操作pid_t CurPid; //current PIDstatic int mykey_open (struct inode *node, struct file *filp){ printk("Process %d opened device.\n", current->pid); return 0;}static int mykey_release (struct inode *node, struct file *filp){ printk("Process %d closed device.\n", current->pid); return 0;}static ssize_t mykey_read (struct file *file, char *buf, size_t count, loff_t *offset){ return count;}static ssize_t mykey_write (struct file *file, const char *buf, size_t count, loff_t *offset){ return count;}static int mykey_ioctl(struct inode *node, struct file *filp, unsigned int cmd, unsigned long arg){ switch(cmd){ case MYKEY_IOC_LEFT:{ handle_scancode(0xe0, 1); handle_scancode(0x4b, 1); handle_scancode(0xe0, 0); handle_scancode(0x4b, 0); }break; case MYKEY_IOC_RIGHT:{ handle_scancode(0xe0, 1); handle_scancode(0x4d, 1); handle_scancode(0xe0, 0); handle_scancode(0x4d, 0); }break; case MYKEY_IOC_UP:{ handle_scancode(0xe0, 1); handle_scancode(0x48, 1); handle_scancode(0xe0, 0); handle_scancode(0x48, 0); }break; case MYKEY_IOC_DOWN:{ handle_scancode(0xe0, 1); handle_scancode(0x50, 1); handle_scancode(0xe0, 0); handle_scancode(0x50, 0); }break; case MYKEY_IOC_ENTER:{ handle_scancode(0x1c, 1); handle_scancode(0x1c, 0); }break; case MYKEY_IOC_ESC:{ handle_scancode(0x01, 1); handle_scancode(0x01, 0); }break; case MYKEY_IOC_TAB:{ handle_scancode(0x0f, 1); //set_current_state(TASK_INTERRUPTIBLE); //schedule_timeout(KEY_TIMEOUT); //handle_scancode(0x0f, 1); handle_scancode(0x0f, 0); }break; case MYKEY_IOC_SHIFTTAB:{ handle_scancode(0x2a, 1); handle_scancode(0x0f, 1); handle_scancode(0x2a, 0); handle_scancode(0x0f, 0); }break; case MYKEY_IOC_SPACE:{ handle_scancode(0x39, 1); set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(KEY_TIMEOUT); handle_scancode(0x39, 0); }break; default: return -EINVAL; } return 0;}int init_module(void){ int res; unsigned char *cName="MyKey"; printk("Hello, kernel! This is MyKey module.\n"); mykey_fops.read= mykey_read; mykey_fops.write = mykey_write; mykey_fops.ioctl = mykey_ioctl; mykey_fops.open = mykey_open; mykey_fops.release = mykey_release; //register mykey res = register_chrdev(MYKEY_MAJOR, cName, &mykey_fops); if(res){ printk("can't register device with kernel!\n"); return res; } else{ printk("Register device success!\n"); } return 0;}void cleanup_module(void){ unregister_chrdev(MYKEY_MAJOR, "MyKey"); printk("Good-bye, kernel!.\n");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -