字符从键盘输入到在显示器显示出来的详细过程 |
您所在的位置:网站首页 › ascii的字符是不是都可以显示在屏幕上 › 字符从键盘输入到在显示器显示出来的详细过程 |
在task_table 中增加一项 PUBLIC TASK task_table[NR_TASKS]= { {task_tty, STACK_SIZE_TTY, "tty"}}; /*======================================================================* task_tty *======================================================================*/ PUBLIC void task_tty() { TTY* p_tty; init_keyboard(); //初始化键盘缓冲区,指定中断号和其对应的中断处理程序,打开该中断 for(p_tty=TTY_FIRST;p_ttyp_inbuf_head= p_tty->p_inbuf_tail = p_tty->in_buf; init_screen(p_tty); } /*======================================================================* tty_do_read *======================================================================*/ PRIVATE void tty_do_read(TTY* p_tty) { if(is_current_console(p_tty->p_console)) {//若为当前控制台则 keyboard_read(p_tty);//将键盘的扫描码从缓冲区读出来并解析为用户真正想要的输入,然后调用in_process(key)对输入进行处理 } } /*======================================================================* tty_do_write *======================================================================*/ PRIVATE void tty_do_write(TTY* p_tty) { if(p_tty->inbuf_count) { charch = *(p_tty->p_inbuf_tail); p_tty->p_inbuf_tail++; if(p_tty->p_inbuf_tail == p_tty->in_buf + TTY_IN_BYTES) { p_tty->p_inbuf_tail= p_tty->in_buf; } p_tty->inbuf_count--; out_char(p_tty->p_console, ch); //将一个字符放在显存中的对应位置,此函数在console .c中 } } /*======================================================================* /*======================================================================* in_process *======================================================================*/ PUBLIC void in_process(TTY* p_tty, u32 key) { char output[2] = {'\0', '\0'}; if (!(key & FLAG_EXT)) { put_key(p_tty,key); } else { int raw_code = key &MASK_RAW; switch(raw_code) { case ENTER: put_key(p_tty,'\n'); break; case BACKSPACE: put_key(p_tty,'\b'); break; case UP: if ((key &FLAG_SHIFT_L) || (key & FLAG_SHIFT_R)) { scroll_screen(p_tty->p_console,SCR_DN); } break; caseDOWN: if((key & FLAG_SHIFT_L) || (key & FLAG_SHIFT_R)) { scroll_screen(p_tty->p_console,SCR_UP); } break; caseF1: caseF2: caseF3: caseF4: caseF5: caseF6: caseF7: caseF8: caseF9: case F10: caseF11: caseF12: /*Alt + F1~F12 */ if((key & FLAG_ALT_L) || (key & FLAG_ALT_R)) { select_console(raw_code - F1);//选择控制台 } break; default: break; } } } /*======================================================================* put_key *======================================================================*/ PRIVATE void put_key(TTY* p_tty, u32 key) { if(p_tty->inbuf_count < TTY_IN_BYTES) { *(p_tty->p_inbuf_head)= key; p_tty->p_inbuf_head++; if(p_tty->p_inbuf_head == p_tty->in_buf + TTY_IN_BYTES) { p_tty->p_inbuf_head= p_tty->in_buf; } p_tty->inbuf_count++; } } tty_write *======================================================================*/ PUBLIC void tty_write(TTY* p_tty, char*buf, int len) { char* p = buf; int i = len; while (i) { out_char(p_tty->p_console,*p++); i--; } } /*======================================================================* sys_write *======================================================================*/ PUBLIC int sys_write(char* buf, int len,PROCESS* p_proc) { tty_write(&tty_table[p_proc->nr_tty], buf, len); return 0; } Keyboard 的内容 /*======================================================================* init_keyboard *======================================================================*/ PUBLIC void init_keyboard() { kb_in.count= 0; kb_in.p_head= kb_in.p_tail = kb_in.buf; shift_l = shift_r = 0; alt_l = alt_r = 0; ctrl_l = ctrl_r = 0; caps_lock = 0; num_lock = 1; scroll_lock= 0; set_leds(); put_irq_handler(KEYBOARD_IRQ, keyboard_handler);/*设定键盘中断处理程序*/ enable_irq(KEYBOARD_IRQ); /*开键盘中断*/ } /*======================================================================* keyboard_handler 读入到键盘缓冲区 *======================================================================*/ PUBLIC void keyboard_handler(int irq) { u8scan_code = in_byte(KB_DATA); if(kb_in.count < KB_IN_BYTES) { *(kb_in.p_head)= scan_code; kb_in.p_head++; if(kb_in.p_head == kb_in.buf + KB_IN_BYTES) { kb_in.p_head= kb_in.buf; } kb_in.count++; } } /*======================================================================* keyboard_read *======================================================================*/ PUBLIC void keyboard_read(TTY* p_tty) { u8 scan_code; char output[2]; int make; /*1: make; 0: break. */ u32 key = 0;/* 用一个整型来表示一个键。比如,如果 Home 被按下, * 则 key 值将为定义在keyboard.h 中的 'HOME'。 */ u32* keyrow; /*指向 keymap[] 的某一行 */ if(kb_in.count> 0){ code_with_E0= 0; scan_code= get_byte_from_kbuf(); /* 下面开始解析扫描码 */一部分省略了 if(scan_code == 0xE1) { inti; u8pausebrk_scode[] = {0xE1, 0x1D, 0x45, 0xE1, 0x9D, 0xC5}; intis_pausebreak = 1; for(i=1;i |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |