⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key.c

📁 内核键盘
💻 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 + -