USB键盘的启用需要input设备、Virtual terminal、Frame buffer devices等启动,具体看上面配置。
1. 基本的调用过程即扫描码的传递过程
driver/input/Keybdev.c: keybdev_event -> driver/input/Keybdev.c: emulate_raw -> driver/char/Keyboard.c: handle_scancode
 
handle_scancode 函数进行稍描码到键盘码或ASCII码的转换
2. 配置的作用
Linux系统中针对键盘没有像鼠标一样有个在/dev/input/中的设备,它是直接关联tty设备的即虚拟终端,所以必须打开虚拟终端的支持,才会出现可以读键盘的设备。最终我们要使用的设备是/dev/vc/0。看代码过程中相关代码有driver/char/console.c tty_io.c。
关键点1:在handle_scancode 函数中开头有代码tty = ttytab? ttytab[fg_console]: NULL; 要键盘启作用tty返回不能为空。kbd_init 函数中有ttytab = console_driver.table ,因此就可以查到console.c代码中。console_driver的初始化需要con_init 的执行。tty_io.c:console_init 函数就有
#ifdef CONFIG_VT
con_init();
#endif 所以虚拟终端是必须的。
关键点2:console.c: con_init中有代码如下     
if (conswitchp)
        display_desc = conswitchp->con_startup();
if (!display_desc) {
        fg_console = 0;
        return;
}
为了能够初始化终端,不能进入return语句。关键是变量conswitchp。console.c:take_over_console函数种初始化了conswitchp变量。总的来说因为是终端就是需要一个显示设备才能启动,所以就得选择frame buffer设备,选中frame buffer设备后不需要选择任何具体硬件设备,默认会采用一个空设备来初始化。
3. 具体的按键处理Keyboard.c: handle_scancode
kbd_init 函数种 kbd0.kbdmode = VC_XLATE; 键盘被设置为字符模式,即按钮后直接翻译成ASCII码,当然一些控制键是其他的表示方式。
由于终端设备是以行显示的,所以每次的输入需要回车键,因此在每次的按钮后都需要自动的回车put_queue('\n')。还有加了回车按钮和退格按钮的特殊处理。