Commit 07ad1b93a365a15c77b5848bba0f6a3399bce076
1 parent
d36cd60e
disable keyboard interrupts if keyboard clock disabled (may not be fully correct…
…) - added keyboard ID for extended keyboard git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@482 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
17 additions
and
2 deletions
vl.c
| ... | ... | @@ -1462,6 +1462,10 @@ void serial_received_byte(SerialState *s, int ch) |
| 1462 | 1462 | s->lsr |= UART_LSR_BI | UART_LSR_DR; |
| 1463 | 1463 | serial_update_irq(); |
| 1464 | 1464 | break; |
| 1465 | + case 'd': | |
| 1466 | + // tb_flush(); | |
| 1467 | + cpu_set_log(CPU_LOG_ALL); | |
| 1468 | + break; | |
| 1465 | 1469 | case TERM_ESCAPE: |
| 1466 | 1470 | goto send_char; |
| 1467 | 1471 | } |
| ... | ... | @@ -1979,6 +1983,7 @@ void ne2000_init(void) |
| 1979 | 1983 | /* Keyboard Commands */ |
| 1980 | 1984 | #define KBD_CMD_SET_LEDS 0xED /* Set keyboard leds */ |
| 1981 | 1985 | #define KBD_CMD_ECHO 0xEE |
| 1986 | +#define KBD_CMD_GET_ID 0xF2 /* get keyboard ID */ | |
| 1982 | 1987 | #define KBD_CMD_SET_RATE 0xF3 /* Set typematic rate */ |
| 1983 | 1988 | #define KBD_CMD_ENABLE 0xF4 /* Enable scanning */ |
| 1984 | 1989 | #define KBD_CMD_RESET_DISABLE 0xF5 /* reset and disable scanning */ |
| ... | ... | @@ -2065,6 +2070,8 @@ KBDState kbd_state; |
| 2065 | 2070 | int reset_requested; |
| 2066 | 2071 | |
| 2067 | 2072 | /* update irq and KBD_STAT_[MOUSE_]OBF */ |
| 2073 | +/* XXX: not generating the irqs if KBD_MODE_DISABLE_KBD is set may be | |
| 2074 | + incorrect, but it avoids having to simulate exact delays */ | |
| 2068 | 2075 | static void kbd_update_irq(KBDState *s) |
| 2069 | 2076 | { |
| 2070 | 2077 | int irq12_level, irq1_level; |
| ... | ... | @@ -2080,7 +2087,8 @@ static void kbd_update_irq(KBDState *s) |
| 2080 | 2087 | if (s->mode & KBD_MODE_MOUSE_INT) |
| 2081 | 2088 | irq12_level = 1; |
| 2082 | 2089 | } else { |
| 2083 | - if (s->mode & KBD_MODE_KBD_INT) | |
| 2090 | + if ((s->mode & KBD_MODE_KBD_INT) && | |
| 2091 | + !(s->mode & KBD_MODE_DISABLE_KBD)) | |
| 2084 | 2092 | irq1_level = 1; |
| 2085 | 2093 | } |
| 2086 | 2094 | } |
| ... | ... | @@ -2120,7 +2128,7 @@ uint32_t kbd_read_status(CPUX86State *env, uint32_t addr) |
| 2120 | 2128 | KBDState *s = &kbd_state; |
| 2121 | 2129 | int val; |
| 2122 | 2130 | val = s->status; |
| 2123 | -#if defined(DEBUG_KBD) && 0 | |
| 2131 | +#if defined(DEBUG_KBD) | |
| 2124 | 2132 | printf("kbd: read status=0x%02x\n", val); |
| 2125 | 2133 | #endif |
| 2126 | 2134 | return val; |
| ... | ... | @@ -2162,9 +2170,11 @@ void kbd_write_command(CPUX86State *env, uint32_t addr, uint32_t val) |
| 2162 | 2170 | break; |
| 2163 | 2171 | case KBD_CCMD_KBD_DISABLE: |
| 2164 | 2172 | s->mode |= KBD_MODE_DISABLE_KBD; |
| 2173 | + kbd_update_irq(s); | |
| 2165 | 2174 | break; |
| 2166 | 2175 | case KBD_CCMD_KBD_ENABLE: |
| 2167 | 2176 | s->mode &= ~KBD_MODE_DISABLE_KBD; |
| 2177 | + kbd_update_irq(s); | |
| 2168 | 2178 | break; |
| 2169 | 2179 | case KBD_CCMD_READ_INPORT: |
| 2170 | 2180 | kbd_queue(s, 0x00, 0); |
| ... | ... | @@ -2251,6 +2261,11 @@ static void kbd_write_keyboard(KBDState *s, int val) |
| 2251 | 2261 | case 0x05: |
| 2252 | 2262 | kbd_queue(s, KBD_REPLY_RESEND, 0); |
| 2253 | 2263 | break; |
| 2264 | + case KBD_CMD_GET_ID: | |
| 2265 | + kbd_queue(s, KBD_REPLY_ACK, 0); | |
| 2266 | + kbd_queue(s, 0xab, 0); | |
| 2267 | + kbd_queue(s, 0x83, 0); | |
| 2268 | + break; | |
| 2254 | 2269 | case KBD_CMD_ECHO: |
| 2255 | 2270 | kbd_queue(s, KBD_CMD_ECHO, 0); |
| 2256 | 2271 | break; | ... | ... |