static int __i8042_command(int command, u8 *param) { int receive = (command >> 8) & 0xf; int send = (command >> 12) & 0xf; // Send the command. int ret = i8042_wait_write(); if (ret) return ret; outb(command, PORT_PS2_STATUS); // Send parameters (if any). int i; for (i = 0; i < send; i++) { ret = i8042_wait_write(); if (ret) return ret; outb(param[i], PORT_PS2_DATA); } // Receive parameters (if any). for (i = 0; i < receive; i++) { ret = i8042_wait_read(); if (ret) return ret; param[i] = inb(PORT_PS2_DATA); dprintf(7, "i8042 param=%x\n", param[i]); } return 0; }
static int i8042_kbd_write(u8 c) { dprintf(7, "i8042_kbd_write c=%d\n", c); int ret = i8042_wait_write(); if (! ret) outb(c, PORT_PS2_DATA); return ret; }
void i8042_reboot(void) { int i; for (i=0; i<10; i++) { i8042_wait_write(); udelay(50); outb(0xfe, PORT_PS2_STATUS); /* pulse reset low */ udelay(50); } }
inline void i8042_write_data(uint8_t data) { i8042_wait_write(); i386_outb(I8042_DATA_PORT, data); }
inline void i8042_write_command(uint8_t cmd) { i8042_wait_write(); i386_outb(I8042_CMD_PORT, cmd); }