• PUDN用户
    了解作者
  • Unix_Linux
    开发工具
  • 16KB
    文件大小
  • gz
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 15
    下载次数
  • 2005-09-18 20:58
    上传日期
This document describes how to complie keyboard and mouse driver. 键盘驱动
kbddriver.tar.gz
  • kbddriver
  • keyboard.h
    540B
  • keyboard.c
    23.5KB
  • wmt_keyb.c
    27.4KB
内容介绍
/* * SA1111 PS/2 keyboard/mouse driver * * 2000 by VASARA RESEARCH INC. * * Changelog: * Jun.xx,2000: Kunihiko IMAI <imai@vasara.co.jp> * Port to 2.4.0test1-ac19-rmk1-np1 * Apr.17,2000: Takafumi Kawana <kawana@pro.or.jp> * Internal Release for XP860 * * * This driver is based on linux/drivers/char/pc_keyb.c * Original declaration follows: * * linux/drivers/char/pc_keyb.c * * Separation of the PC low-level part by Geert Uytterhoeven, May 1997 * See keyboard.c for the whole history. * * Major cleanup by Martin Mares, May 1997 * * Combined the keyboard and PS/2 mouse handling into one file, * because they share the same hardware. * Johan Myreen <jem@iki.fi> 1998-10-08. * * Code fixes to handle mouse ACKs properly. * C. Scott Ananian <cananian@alumni.princeton.edu> 1999-01-29. * */ #include <linux/config.h> #include <linux/spinlock.h> #include <linux/sched.h> #include <linux/interrupt.h> #include <linux/tty.h> #include <linux/mm.h> #include <linux/signal.h> #include <linux/init.h> #include <linux/kbd_ll.h> #include <linux/delay.h> #include <linux/random.h> #include <linux/poll.h> #include <linux/miscdevice.h> #include <linux/slab.h> #include <linux/kbd_kern.h> #include <linux/ioport.h> #include <linux/timer.h> #include <asm/hardware.h rel='nofollow' onclick='return false;'> #include <asm/bitops.h rel='nofollow' onclick='return false;'> #include <asm/uaccess.h rel='nofollow' onclick='return false;'> #include <asm/irq.h rel='nofollow' onclick='return false;'> #include <asm/system.h rel='nofollow' onclick='return false;'> #include <asm/io.h rel='nofollow' onclick='return false;'> /* Some configuration switches are present in the include file... */ #include <linux/pc_keyb.h> #include <asm/keyboard.h rel='nofollow' onclick='return false;'> #include <asm/hardware/sa1111.h rel='nofollow' onclick='return false;'> #define KBD_STAT_RXB (1<<4) #define KBD_STAT_RXF (1<<5) #define KBD_STAT_TXB (1<<6) #define KBD_STAT_TXE (1<<7) #define KBD_STAT_STP (1<<8) #define MSE_STAT_RXB (1<<4) #define MSE_STAT_RXF (1<<5) #define MSE_STAT_TXB (1<<6) #define MSE_STAT_TXE (1<<7) #define MSE_STAT_STP (1<<8) /* Simple translation table for the SysRq keys */ #ifdef CONFIG_MAGIC_SYSRQ unsigned char wmt_sysrq_xlate[128] = "\000\0331234567890-=\177\t" /* 0x00 - 0x0f */ "qwertyuiop[]\r\000as" /* 0x10 - 0x1f */ "dfghjkl;'`\000\\zxcv" /* 0x20 - 0x2f */ "bnm,./\000*\000 \000\201\202\203\204\205" /* 0x30 - 0x3f */ "\206\207\210\211\212\000\000789-456+1" /* 0x40 - 0x4f */ "230\177\000\000\213\214\000\000\000\000\000\000\000\000\000\000" /* 0x50 - 0x5f */ "\r\000/"; /* 0x60 - 0x6f */ #endif spinlock_t kbd_controller_lock = SPIN_LOCK_UNLOCKED; static unsigned char wmt_handle_kbd_event(void); static inline void wmt_handle_mouse_event(unsigned char scancode); static int __init wmt_mouse_init(void); unsigned char wmt_handle_kbd2_event(unsigned long data); static struct aux_queue *queue; /* Mouse data buffer. */ static int aux_count = 0; /* * Wait for keyboard controller input buffer to drain. * * Don't use 'jiffies' so that we don't depend on * interrupts.. * * Quote from PS/2 System Reference Manual: * * "Address hex 0060 and address hex 0064 should be written only when * the input-buffer-full bit and output-buffer-full bit in the * Controller Status register are set 0." */ /* * Translation of escaped scancodes to keycodes. * This is now user-settable. * The keycodes 1-88,96-111,119 are fairly standard, and * should probably not be changed - changing might confuse X. * X also interprets scancode 0x5d (KEY_Begin). * * For 1-88 keycode equals scancode. */ #define E0_KPENTER 96 #define E0_RCTRL 97 #define E0_KPSLASH 98 #define E0_PRSCR 99 #define E0_RALT 100 #define E0_BREAK 101 /* (control-pause) */ #define E0_HOME 102 #define E0_UP 103 #define E0_PGUP 104 #define E0_LEFT 105 #define E0_RIGHT 106 #define E0_END 107 #define E0_DOWN 108 #define E0_PGDN 109 #define E0_INS 110 #define E0_DEL 111 /* for USB 106 keyboard */ #define E0_YEN 124 #define E0_BACKSLASH 89 #define E1_PAUSE 119 /* * The keycodes below are randomly located in 89-95,112-118,120-127. * They could be thrown away (and all occurrences below replaced by 0), * but that would force many users to use the `setkeycodes' utility, where * they needed not before. It does not matter that there are duplicates, as * long as no duplication occurs for any single keyboard. */ #define SC_LIM 89 #define FOCUS_PF1 85 /* actual code! */ #define FOCUS_PF2 89 #define FOCUS_PF3 90 #define FOCUS_PF4 91 #define FOCUS_PF5 92 #define FOCUS_PF6 93 #define FOCUS_PF7 94 #define FOCUS_PF8 95 #define FOCUS_PF9 120 #define FOCUS_PF10 121 #define FOCUS_PF11 122 #define FOCUS_PF12 123 #define JAP_86 124 /* tfj@olivia.ping.dk: * The four keys are located over the numeric keypad, and are * labelled A1-A4. It's an rc930 keyboard, from * Regnecentralen/RC International, Now ICL. * Scancodes: 59, 5a, 5b, 5c. */ #define RGN1 124 #define RGN2 125 #define RGN3 126 #define RGN4 127 static unsigned char high_keys[128 - SC_LIM] = { RGN1, RGN2, RGN3, RGN4, 0, 0, 0, /* 0x59-0x5f */ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60-0x67 */ 0, 0, 0, 0, 0, FOCUS_PF11, 0, FOCUS_PF12, /* 0x68-0x6f */ 0, 0, 0, FOCUS_PF2, FOCUS_PF9, 0, 0, FOCUS_PF3, /* 0x70-0x77 */ FOCUS_PF4, FOCUS_PF5, FOCUS_PF6, FOCUS_PF7, /* 0x78-0x7b */ FOCUS_PF8, JAP_86, FOCUS_PF10, 0 /* 0x7c-0x7f */ }; /* BTC */ #define E0_MACRO 112 /* LK450 */ #define E0_F13 113 #define E0_F14 114 #define E0_HELP 115 #define E0_DO 116 #define E0_F17 117 #define E0_KPMINPLUS 118 /* * My OmniKey generates e0 4c for the "OMNI" key and the * right alt key does nada. [kkoller@nyx10.cs.du.edu] */ #define E0_OK 124 /* * New microsoft keyboard is rumoured to have * e0 5b (left window button), e0 5c (right window button), * e0 5d (menu button). [or: LBANNER, RBANNER, RMENU] * [or: Windows_L, Windows_R, TaskMan] */ #define E0_MSLW 125 #define E0_MSRW 126 #define E0_MSTM 127 #define KEYBOARD_IRQ IRQ_GPIO(2) #define CODE_1 0x1E #define CODE_2 0x1D #define CODE_3 0x1B #define CODE_4 0x9E #define CODE_5 0x9D #define CODE_6 0x9B #define CODE_7 0x5E #define CODE_8 0x5D #define CODE_9 0x5B #define CODE_0 0xDD #define CODE_JIN 0xDB #define CODE_XIN 0xDE #define CODE_OK 0x17 #define CODE_CANCEL 0x0F #define CODE_SWITCH 0x8F #define CODE_LISTEN 0x97 #define CODE_UP 0x57 #define CODE_DOWN 0x4F #define CODE_LEFT 0xD7 #define CODE_RIGHT 0xCF #define MOUSE_OK 0x3E #define MOUSE_UPLEFT 0x39 #define MOUSE_UP 0x3D #define MOUSE_UPRIGHT 0x35 #define MOUSE_DOWNLEFT 0x2B #define MOUSE_DOWN 0x2F #define MOUSE_DOWNRIGHT 0x27 #define MOUSE_LEFT 0x3B #define MOUSE_RIGHT 0x37 #define MOVE_FIRST 3 #define MOVE_LEN 1 //accelerate mouse move distance. #define MOVE_MAX 6 //the max nubmer of accelerate mousr move. #ifndef KBD_WMT_DATA*/ #define KBD_WMT_DATA 0xf0000000 /*wmt keyboard date line.(read only)*/ #endif /*#define DEBUG_KBD 1*/ static unsigned char e0_keys[128] = { 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00-0x07 */ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x08-0x0f */ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10-0x17 */ 0, 0, 0, 0, E0_KPENTER, E0_RCTRL, 0, 0, /* 0x18-0x1f */ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20-0x27 */ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x28-0x2f */ 0, 0, 0, 0, 0, E0_KPSLASH, 0, E0_PRSCR, /* 0x30-0x37 */ E0_RALT, 0, 0, 0, 0, E0_F13, E0_F14, E0_HELP, /* 0x38-0x3f */ E0_DO, E0_F17, 0, 0, 0, 0, E0_BREAK, E0_HOME, /* 0x40-0x47 */ E0_UP, E0_PGUP, 0, E0_LEFT, E0_OK, E0_RIGHT, E0_KPMINPLUS, E0_END, /* 0x48-0x4f */ E0_DOWN, E0_PGDN, E0_INS, E0_DEL, 0, 0, 0, 0, /* 0x50-0x57 */ 0, 0, 0, E0_MSLW, E0_MSR
评论
    相关推荐