/* test if a character is in the queue */ static int kbd_testc(struct stdio_dev *dev) { #if defined(CONFIG_MPC5xxx) || defined(CONFIG_MPC8540) || defined(CONFIG_MPC8541) || defined(CONFIG_MPC8555) /* no ISR is used, so received chars must be polled */ ps2ser_check(); #endif if(in_pointer==out_pointer) return(0); /* no data */ else return(1); }
void ps2mult_write_output(u_char val) { int i; PRINTF_KEYB("write_output(0x%02x)\n", val); for (i = 0; i < KBD_TIMEOUT; i++) { if (!kbd_command_active && !mouse_command_active) { break; } udelay(1000); ps2ser_check(); } if (kbd_command_active) { PRINTF("keyboard command not acknoledged\n"); kbd_command_active = 0; } if (mouse_command_active) { PRINTF("mouse command not acknoledged\n"); mouse_command_active = 0; } if (ctl_command_active) { switch (ctl_command_active) { case KBD_CCMD_WRITE_MODE: /* Scan code conversion not supported */ command_byte = val & ~KBD_MODE_KCC; break; case KBD_CCMD_WRITE_AUX_OBUF: ps2mult_receive_byte(val, PS2MULT_MS_SELECTOR); break; case KBD_CCMD_WRITE_MOUSE: ps2mult_send_byte(val, PS2MULT_MS_SELECTOR); break; default: PRINTF("invalid controller command\n"); break; } ctl_command_active = 0; return; } ps2mult_send_byte(val, PS2MULT_KB_SELECTOR); }
u_char ps2mult_read_input(void) { u_char byte = 0; if (atomic_read(&ps2mult_buf_cnt) == 0) { ps2ser_check(); } if (atomic_read(&ps2mult_buf_cnt)) { byte = ps2mult_buf[ps2mult_buf_out_idx++]; ps2mult_buf_out_idx &= (PS2BUF_SIZE - 1); atomic_dec(&ps2mult_buf_cnt); } PRINTF_KEYB("read_input()=0x%02x\n", byte); return byte; }
u_char ps2mult_read_status(void) { u_char byte; if (atomic_read(&ps2mult_buf_cnt) == 0) { ps2ser_check(); } if (atomic_read(&ps2mult_buf_cnt)) { byte = ps2mult_buf_status[ps2mult_buf_out_idx]; } else { byte = KBD_STAT_DEFAULT; } PRINTF_KEYB("read_status()=0x%02x\n", byte); return byte; }
/* gets the character from the queue */ static int kbd_getc(struct stdio_dev *dev) { char c; while(in_pointer==out_pointer) { #if defined(CONFIG_MPC5xxx) || defined(CONFIG_MPC8540) || defined(CONFIG_MPC8541) || defined(CONFIG_MPC8555) /* no ISR is used, so received chars must be polled */ ps2ser_check(); #endif ;} if((out_pointer+1)==KBD_BUFFER_LEN) out_pointer=0; else out_pointer++; c=kbd_buffer[out_pointer]; return (int)c; }
static int ps2mult_getc_w (void) { int res = -1; int i; for (i = 0; i < KBD_TIMEOUT; i++) { if (ps2ser_check()) { res = ps2ser_getc(); break; } udelay(1000); } switch (res) { case PS2MULT_KB_SELECTOR: case PS2MULT_MS_SELECTOR: received_selector = res; break; default: break; } return res; }