Commit 12abac853d38600847c1be2ccf90a67691a3588a
1 parent
ae40972f
Name the magic constants, wrap long lines
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3803 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
221 additions
and
103 deletions
hw/slavio_serial.c
| @@ -89,6 +89,7 @@ typedef struct { | @@ -89,6 +89,7 @@ typedef struct { | ||
| 89 | int rptr, wptr, count; | 89 | int rptr, wptr, count; |
| 90 | } SERIOQueue; | 90 | } SERIOQueue; |
| 91 | 91 | ||
| 92 | +#define SERIAL_REGS 16 | ||
| 92 | typedef struct ChannelState { | 93 | typedef struct ChannelState { |
| 93 | qemu_irq irq; | 94 | qemu_irq irq; |
| 94 | int reg; | 95 | int reg; |
| @@ -96,7 +97,7 @@ typedef struct ChannelState { | @@ -96,7 +97,7 @@ typedef struct ChannelState { | ||
| 96 | chn_id_t chn; // this channel, A (base+4) or B (base+0) | 97 | chn_id_t chn; // this channel, A (base+4) or B (base+0) |
| 97 | chn_type_t type; | 98 | chn_type_t type; |
| 98 | struct ChannelState *otherchn; | 99 | struct ChannelState *otherchn; |
| 99 | - uint8_t rx, tx, wregs[16], rregs[16]; | 100 | + uint8_t rx, tx, wregs[SERIAL_REGS], rregs[SERIAL_REGS]; |
| 100 | SERIOQueue queue; | 101 | SERIOQueue queue; |
| 101 | CharDriverState *chr; | 102 | CharDriverState *chr; |
| 102 | int e0_mode, led_mode, caps_lock_mode, num_lock_mode; | 103 | int e0_mode, led_mode, caps_lock_mode, num_lock_mode; |
| @@ -109,6 +110,107 @@ struct SerialState { | @@ -109,6 +110,107 @@ struct SerialState { | ||
| 109 | 110 | ||
| 110 | #define SERIAL_MAXADDR 7 | 111 | #define SERIAL_MAXADDR 7 |
| 111 | #define SERIAL_SIZE (SERIAL_MAXADDR + 1) | 112 | #define SERIAL_SIZE (SERIAL_MAXADDR + 1) |
| 113 | +#define SERIAL_CTRL 0 | ||
| 114 | +#define SERIAL_DATA 1 | ||
| 115 | + | ||
| 116 | +#define W_CMD 0 | ||
| 117 | +#define CMD_PTR_MASK 0x07 | ||
| 118 | +#define CMD_CMD_MASK 0x38 | ||
| 119 | +#define CMD_HI 0x08 | ||
| 120 | +#define CMD_CLR_TXINT 0x28 | ||
| 121 | +#define CMD_CLR_IUS 0x38 | ||
| 122 | +#define W_INTR 1 | ||
| 123 | +#define INTR_INTALL 0x01 | ||
| 124 | +#define INTR_TXINT 0x02 | ||
| 125 | +#define INTR_RXMODEMSK 0x18 | ||
| 126 | +#define INTR_RXINT1ST 0x08 | ||
| 127 | +#define INTR_RXINTALL 0x10 | ||
| 128 | +#define W_IVEC 2 | ||
| 129 | +#define W_RXCTRL 3 | ||
| 130 | +#define RXCTRL_RXEN 0x01 | ||
| 131 | +#define W_TXCTRL1 4 | ||
| 132 | +#define TXCTRL1_PAREN 0x01 | ||
| 133 | +#define TXCTRL1_PAREV 0x02 | ||
| 134 | +#define TXCTRL1_1STOP 0x04 | ||
| 135 | +#define TXCTRL1_1HSTOP 0x08 | ||
| 136 | +#define TXCTRL1_2STOP 0x0c | ||
| 137 | +#define TXCTRL1_STPMSK 0x0c | ||
| 138 | +#define TXCTRL1_CLK1X 0x00 | ||
| 139 | +#define TXCTRL1_CLK16X 0x40 | ||
| 140 | +#define TXCTRL1_CLK32X 0x80 | ||
| 141 | +#define TXCTRL1_CLK64X 0xc0 | ||
| 142 | +#define TXCTRL1_CLKMSK 0xc0 | ||
| 143 | +#define W_TXCTRL2 5 | ||
| 144 | +#define TXCTRL2_TXEN 0x08 | ||
| 145 | +#define TXCTRL2_BITMSK 0x60 | ||
| 146 | +#define TXCTRL2_5BITS 0x00 | ||
| 147 | +#define TXCTRL2_7BITS 0x20 | ||
| 148 | +#define TXCTRL2_6BITS 0x40 | ||
| 149 | +#define TXCTRL2_8BITS 0x60 | ||
| 150 | +#define W_SYNC1 6 | ||
| 151 | +#define W_SYNC2 7 | ||
| 152 | +#define W_TXBUF 8 | ||
| 153 | +#define W_MINTR 9 | ||
| 154 | +#define MINTR_STATUSHI 0x10 | ||
| 155 | +#define MINTR_RST_MASK 0xc0 | ||
| 156 | +#define MINTR_RST_B 0x40 | ||
| 157 | +#define MINTR_RST_A 0x80 | ||
| 158 | +#define MINTR_RST_ALL 0xc0 | ||
| 159 | +#define W_MISC1 10 | ||
| 160 | +#define W_CLOCK 11 | ||
| 161 | +#define CLOCK_TRXC 0x08 | ||
| 162 | +#define W_BRGLO 12 | ||
| 163 | +#define W_BRGHI 13 | ||
| 164 | +#define W_MISC2 14 | ||
| 165 | +#define MISC2_PLLDIS 0x30 | ||
| 166 | +#define W_EXTINT 15 | ||
| 167 | +#define EXTINT_DCD 0x08 | ||
| 168 | +#define EXTINT_SYNCINT 0x10 | ||
| 169 | +#define EXTINT_CTSINT 0x20 | ||
| 170 | +#define EXTINT_TXUNDRN 0x40 | ||
| 171 | +#define EXTINT_BRKINT 0x80 | ||
| 172 | + | ||
| 173 | +#define R_STATUS 0 | ||
| 174 | +#define STATUS_RXAV 0x01 | ||
| 175 | +#define STATUS_ZERO 0x02 | ||
| 176 | +#define STATUS_TXEMPTY 0x04 | ||
| 177 | +#define STATUS_DCD 0x08 | ||
| 178 | +#define STATUS_SYNC 0x10 | ||
| 179 | +#define STATUS_CTS 0x20 | ||
| 180 | +#define STATUS_TXUNDRN 0x40 | ||
| 181 | +#define STATUS_BRK 0x80 | ||
| 182 | +#define R_SPEC 1 | ||
| 183 | +#define SPEC_ALLSENT 0x01 | ||
| 184 | +#define SPEC_BITS8 0x06 | ||
| 185 | +#define R_IVEC 2 | ||
| 186 | +#define IVEC_TXINTB 0x00 | ||
| 187 | +#define IVEC_LONOINT 0x06 | ||
| 188 | +#define IVEC_LORXINTA 0x0c | ||
| 189 | +#define IVEC_LORXINTB 0x04 | ||
| 190 | +#define IVEC_LOTXINTA 0x08 | ||
| 191 | +#define IVEC_HINOINT 0x60 | ||
| 192 | +#define IVEC_HIRXINTA 0x30 | ||
| 193 | +#define IVEC_HIRXINTB 0x20 | ||
| 194 | +#define IVEC_HITXINTA 0x10 | ||
| 195 | +#define R_INTR 3 | ||
| 196 | +#define INTR_EXTINTB 0x01 | ||
| 197 | +#define INTR_TXINTB 0x02 | ||
| 198 | +#define INTR_RXINTB 0x04 | ||
| 199 | +#define INTR_EXTINTA 0x08 | ||
| 200 | +#define INTR_TXINTA 0x10 | ||
| 201 | +#define INTR_RXINTA 0x20 | ||
| 202 | +#define R_IPEN 4 | ||
| 203 | +#define R_TXCTRL1 5 | ||
| 204 | +#define R_TXCTRL2 6 | ||
| 205 | +#define R_BC 7 | ||
| 206 | +#define R_RXBUF 8 | ||
| 207 | +#define R_RXCTRL 9 | ||
| 208 | +#define R_MISC 10 | ||
| 209 | +#define R_MISC1 11 | ||
| 210 | +#define R_BRGLO 12 | ||
| 211 | +#define R_BRGHI 13 | ||
| 212 | +#define R_MISC1I 14 | ||
| 213 | +#define R_EXTINT 15 | ||
| 112 | 214 | ||
| 113 | static void handle_kbd_command(ChannelState *s, int val); | 215 | static void handle_kbd_command(ChannelState *s, int val); |
| 114 | static int serial_can_receive(void *opaque); | 216 | static int serial_can_receive(void *opaque); |
| @@ -159,11 +261,14 @@ static uint32_t get_queue(void *opaque) | @@ -159,11 +261,14 @@ static uint32_t get_queue(void *opaque) | ||
| 159 | 261 | ||
| 160 | static int slavio_serial_update_irq_chn(ChannelState *s) | 262 | static int slavio_serial_update_irq_chn(ChannelState *s) |
| 161 | { | 263 | { |
| 162 | - if ((s->wregs[1] & 1) && // interrupts enabled | ||
| 163 | - (((s->wregs[1] & 2) && s->txint == 1) || // tx ints enabled, pending | ||
| 164 | - ((((s->wregs[1] & 0x18) == 8) || ((s->wregs[1] & 0x18) == 0x10)) && | 264 | + if ((s->wregs[W_INTR] & INTR_INTALL) && // interrupts enabled |
| 265 | + (((s->wregs[W_INTR] & INTR_TXINT) && s->txint == 1) || | ||
| 266 | + // tx ints enabled, pending | ||
| 267 | + ((((s->wregs[W_INTR] & INTR_RXMODEMSK) == INTR_RXINT1ST) || | ||
| 268 | + ((s->wregs[W_INTR] & INTR_RXMODEMSK) == INTR_RXINTALL)) && | ||
| 165 | s->rxint == 1) || // rx ints enabled, pending | 269 | s->rxint == 1) || // rx ints enabled, pending |
| 166 | - ((s->wregs[15] & 0x80) && (s->rregs[0] & 0x80)))) { // break int e&p | 270 | + ((s->wregs[W_EXTINT] & EXTINT_BRKINT) && |
| 271 | + (s->rregs[R_STATUS] & STATUS_BRK)))) { // break int e&p | ||
| 167 | return 1; | 272 | return 1; |
| 168 | } | 273 | } |
| 169 | return 0; | 274 | return 0; |
| @@ -189,16 +294,18 @@ static void slavio_serial_reset_chn(ChannelState *s) | @@ -189,16 +294,18 @@ static void slavio_serial_reset_chn(ChannelState *s) | ||
| 189 | s->rregs[i] = 0; | 294 | s->rregs[i] = 0; |
| 190 | s->wregs[i] = 0; | 295 | s->wregs[i] = 0; |
| 191 | } | 296 | } |
| 192 | - s->wregs[4] = 4; | ||
| 193 | - s->wregs[9] = 0xc0; | ||
| 194 | - s->wregs[11] = 8; | ||
| 195 | - s->wregs[14] = 0x30; | ||
| 196 | - s->wregs[15] = 0xf8; | 297 | + s->wregs[W_TXCTRL1] = TXCTRL1_1STOP; // 1X divisor, 1 stop bit, no parity |
| 298 | + s->wregs[W_MINTR] = MINTR_RST_ALL; | ||
| 299 | + s->wregs[W_CLOCK] = CLOCK_TRXC; // Synch mode tx clock = TRxC | ||
| 300 | + s->wregs[W_MISC2] = MISC2_PLLDIS; // PLL disabled | ||
| 301 | + s->wregs[W_EXTINT] = EXTINT_DCD | EXTINT_SYNCINT | EXTINT_CTSINT | | ||
| 302 | + EXTINT_TXUNDRN | EXTINT_BRKINT; // Enable most interrupts | ||
| 197 | if (s->disabled) | 303 | if (s->disabled) |
| 198 | - s->rregs[0] = 0x7c; | 304 | + s->rregs[R_STATUS] = STATUS_TXEMPTY | STATUS_DCD | STATUS_SYNC | |
| 305 | + STATUS_CTS | STATUS_TXUNDRN; | ||
| 199 | else | 306 | else |
| 200 | - s->rregs[0] = 0x44; | ||
| 201 | - s->rregs[1] = 6; | 307 | + s->rregs[R_STATUS] = STATUS_TXEMPTY | STATUS_TXUNDRN; |
| 308 | + s->rregs[R_SPEC] = SPEC_BITS8; | ||
| 202 | 309 | ||
| 203 | s->rx = s->tx = 0; | 310 | s->rx = s->tx = 0; |
| 204 | s->rxint = s->txint = 0; | 311 | s->rxint = s->txint = 0; |
| @@ -219,17 +326,17 @@ static inline void clr_rxint(ChannelState *s) | @@ -219,17 +326,17 @@ static inline void clr_rxint(ChannelState *s) | ||
| 219 | s->rxint = 0; | 326 | s->rxint = 0; |
| 220 | s->rxint_under_svc = 0; | 327 | s->rxint_under_svc = 0; |
| 221 | if (s->chn == chn_a) { | 328 | if (s->chn == chn_a) { |
| 222 | - if (s->wregs[9] & 0x10) | ||
| 223 | - s->otherchn->rregs[2] = 0x60; | 329 | + if (s->wregs[W_MINTR] & MINTR_STATUSHI) |
| 330 | + s->otherchn->rregs[R_IVEC] = IVEC_HINOINT; | ||
| 224 | else | 331 | else |
| 225 | - s->otherchn->rregs[2] = 0x06; | ||
| 226 | - s->rregs[3] &= ~0x20; | 332 | + s->otherchn->rregs[R_IVEC] = IVEC_LONOINT; |
| 333 | + s->rregs[R_INTR] &= ~INTR_RXINTA; | ||
| 227 | } else { | 334 | } else { |
| 228 | - if (s->wregs[9] & 0x10) | ||
| 229 | - s->rregs[2] = 0x60; | 335 | + if (s->wregs[W_MINTR] & MINTR_STATUSHI) |
| 336 | + s->rregs[R_IVEC] = IVEC_HINOINT; | ||
| 230 | else | 337 | else |
| 231 | - s->rregs[2] = 0x06; | ||
| 232 | - s->otherchn->rregs[3] &= ~4; | 338 | + s->rregs[R_IVEC] = IVEC_LONOINT; |
| 339 | + s->otherchn->rregs[R_INTR] &= ~INTR_RXINTB; | ||
| 233 | } | 340 | } |
| 234 | if (s->txint) | 341 | if (s->txint) |
| 235 | set_txint(s); | 342 | set_txint(s); |
| @@ -242,21 +349,21 @@ static inline void set_rxint(ChannelState *s) | @@ -242,21 +349,21 @@ static inline void set_rxint(ChannelState *s) | ||
| 242 | if (!s->txint_under_svc) { | 349 | if (!s->txint_under_svc) { |
| 243 | s->rxint_under_svc = 1; | 350 | s->rxint_under_svc = 1; |
| 244 | if (s->chn == chn_a) { | 351 | if (s->chn == chn_a) { |
| 245 | - if (s->wregs[9] & 0x10) | ||
| 246 | - s->otherchn->rregs[2] = 0x30; | 352 | + if (s->wregs[W_MINTR] & MINTR_STATUSHI) |
| 353 | + s->otherchn->rregs[R_IVEC] = IVEC_HIRXINTA; | ||
| 247 | else | 354 | else |
| 248 | - s->otherchn->rregs[2] = 0x0c; | 355 | + s->otherchn->rregs[R_IVEC] = IVEC_LORXINTA; |
| 249 | } else { | 356 | } else { |
| 250 | - if (s->wregs[9] & 0x10) | ||
| 251 | - s->rregs[2] = 0x20; | 357 | + if (s->wregs[W_MINTR] & MINTR_STATUSHI) |
| 358 | + s->rregs[R_IVEC] = IVEC_HIRXINTB; | ||
| 252 | else | 359 | else |
| 253 | - s->rregs[2] = 0x04; | 360 | + s->rregs[R_IVEC] = IVEC_LORXINTB; |
| 254 | } | 361 | } |
| 255 | } | 362 | } |
| 256 | if (s->chn == chn_a) | 363 | if (s->chn == chn_a) |
| 257 | - s->rregs[3] |= 0x20; | 364 | + s->rregs[R_INTR] |= INTR_RXINTA; |
| 258 | else | 365 | else |
| 259 | - s->otherchn->rregs[3] |= 4; | 366 | + s->otherchn->rregs[R_INTR] |= INTR_RXINTB; |
| 260 | slavio_serial_update_irq(s); | 367 | slavio_serial_update_irq(s); |
| 261 | } | 368 | } |
| 262 | 369 | ||
| @@ -265,17 +372,17 @@ static inline void clr_txint(ChannelState *s) | @@ -265,17 +372,17 @@ static inline void clr_txint(ChannelState *s) | ||
| 265 | s->txint = 0; | 372 | s->txint = 0; |
| 266 | s->txint_under_svc = 0; | 373 | s->txint_under_svc = 0; |
| 267 | if (s->chn == chn_a) { | 374 | if (s->chn == chn_a) { |
| 268 | - if (s->wregs[9] & 0x10) | ||
| 269 | - s->otherchn->rregs[2] = 0x60; | 375 | + if (s->wregs[W_MINTR] & MINTR_STATUSHI) |
| 376 | + s->otherchn->rregs[R_IVEC] = IVEC_HINOINT; | ||
| 270 | else | 377 | else |
| 271 | - s->otherchn->rregs[2] = 0x06; | ||
| 272 | - s->rregs[3] &= ~0x10; | 378 | + s->otherchn->rregs[R_IVEC] = IVEC_LONOINT; |
| 379 | + s->rregs[R_INTR] &= ~INTR_TXINTA; | ||
| 273 | } else { | 380 | } else { |
| 274 | - if (s->wregs[9] & 0x10) | ||
| 275 | - s->rregs[2] = 0x60; | 381 | + if (s->wregs[W_MINTR] & MINTR_STATUSHI) |
| 382 | + s->rregs[R_IVEC] = IVEC_HINOINT; | ||
| 276 | else | 383 | else |
| 277 | - s->rregs[2] = 0x06; | ||
| 278 | - s->otherchn->rregs[3] &= ~2; | 384 | + s->rregs[R_IVEC] = IVEC_LONOINT; |
| 385 | + s->otherchn->rregs[R_INTR] &= ~INTR_TXINTB; | ||
| 279 | } | 386 | } |
| 280 | if (s->rxint) | 387 | if (s->rxint) |
| 281 | set_rxint(s); | 388 | set_rxint(s); |
| @@ -288,18 +395,18 @@ static inline void set_txint(ChannelState *s) | @@ -288,18 +395,18 @@ static inline void set_txint(ChannelState *s) | ||
| 288 | if (!s->rxint_under_svc) { | 395 | if (!s->rxint_under_svc) { |
| 289 | s->txint_under_svc = 1; | 396 | s->txint_under_svc = 1; |
| 290 | if (s->chn == chn_a) { | 397 | if (s->chn == chn_a) { |
| 291 | - if (s->wregs[9] & 0x10) | ||
| 292 | - s->otherchn->rregs[2] = 0x10; | 398 | + if (s->wregs[W_MINTR] & MINTR_STATUSHI) |
| 399 | + s->otherchn->rregs[R_IVEC] = IVEC_HITXINTA; | ||
| 293 | else | 400 | else |
| 294 | - s->otherchn->rregs[2] = 0x08; | 401 | + s->otherchn->rregs[R_IVEC] = IVEC_LOTXINTA; |
| 295 | } else { | 402 | } else { |
| 296 | - s->rregs[2] = 0; | 403 | + s->rregs[R_IVEC] = IVEC_TXINTB; |
| 297 | } | 404 | } |
| 298 | } | 405 | } |
| 299 | if (s->chn == chn_a) | 406 | if (s->chn == chn_a) |
| 300 | - s->rregs[3] |= 0x10; | 407 | + s->rregs[R_INTR] |= INTR_TXINTA; |
| 301 | else | 408 | else |
| 302 | - s->otherchn->rregs[3] |= 2; | 409 | + s->otherchn->rregs[R_INTR] |= INTR_TXINTB; |
| 303 | slavio_serial_update_irq(s); | 410 | slavio_serial_update_irq(s); |
| 304 | } | 411 | } |
| 305 | 412 | ||
| @@ -311,45 +418,45 @@ static void slavio_serial_update_parameters(ChannelState *s) | @@ -311,45 +418,45 @@ static void slavio_serial_update_parameters(ChannelState *s) | ||
| 311 | if (!s->chr || s->type != ser) | 418 | if (!s->chr || s->type != ser) |
| 312 | return; | 419 | return; |
| 313 | 420 | ||
| 314 | - if (s->wregs[4] & 1) { | ||
| 315 | - if (s->wregs[4] & 2) | 421 | + if (s->wregs[W_TXCTRL1] & TXCTRL1_PAREN) { |
| 422 | + if (s->wregs[W_TXCTRL1] & TXCTRL1_PAREV) | ||
| 316 | parity = 'E'; | 423 | parity = 'E'; |
| 317 | else | 424 | else |
| 318 | parity = 'O'; | 425 | parity = 'O'; |
| 319 | } else { | 426 | } else { |
| 320 | parity = 'N'; | 427 | parity = 'N'; |
| 321 | } | 428 | } |
| 322 | - if ((s->wregs[4] & 0x0c) == 0x0c) | 429 | + if ((s->wregs[W_TXCTRL1] & TXCTRL1_STPMSK) == TXCTRL1_2STOP) |
| 323 | stop_bits = 2; | 430 | stop_bits = 2; |
| 324 | else | 431 | else |
| 325 | stop_bits = 1; | 432 | stop_bits = 1; |
| 326 | - switch (s->wregs[5] & 0x60) { | ||
| 327 | - case 0x00: | 433 | + switch (s->wregs[W_TXCTRL2] & TXCTRL2_BITMSK) { |
| 434 | + case TXCTRL2_5BITS: | ||
| 328 | data_bits = 5; | 435 | data_bits = 5; |
| 329 | break; | 436 | break; |
| 330 | - case 0x20: | 437 | + case TXCTRL2_7BITS: |
| 331 | data_bits = 7; | 438 | data_bits = 7; |
| 332 | break; | 439 | break; |
| 333 | - case 0x40: | 440 | + case TXCTRL2_6BITS: |
| 334 | data_bits = 6; | 441 | data_bits = 6; |
| 335 | break; | 442 | break; |
| 336 | default: | 443 | default: |
| 337 | - case 0x60: | 444 | + case TXCTRL2_8BITS: |
| 338 | data_bits = 8; | 445 | data_bits = 8; |
| 339 | break; | 446 | break; |
| 340 | } | 447 | } |
| 341 | - speed = 2457600 / ((s->wregs[12] | (s->wregs[13] << 8)) + 2); | ||
| 342 | - switch (s->wregs[4] & 0xc0) { | ||
| 343 | - case 0x00: | 448 | + speed = 2457600 / ((s->wregs[W_BRGLO] | (s->wregs[W_BRGHI] << 8)) + 2); |
| 449 | + switch (s->wregs[W_TXCTRL1] & TXCTRL1_CLKMSK) { | ||
| 450 | + case TXCTRL1_CLK1X: | ||
| 344 | break; | 451 | break; |
| 345 | - case 0x40: | 452 | + case TXCTRL1_CLK16X: |
| 346 | speed /= 16; | 453 | speed /= 16; |
| 347 | break; | 454 | break; |
| 348 | - case 0x80: | 455 | + case TXCTRL1_CLK32X: |
| 349 | speed /= 32; | 456 | speed /= 32; |
| 350 | break; | 457 | break; |
| 351 | default: | 458 | default: |
| 352 | - case 0xc0: | 459 | + case TXCTRL1_CLK64X: |
| 353 | speed /= 64; | 460 | speed /= 64; |
| 354 | break; | 461 | break; |
| 355 | } | 462 | } |
| @@ -362,7 +469,8 @@ static void slavio_serial_update_parameters(ChannelState *s) | @@ -362,7 +469,8 @@ static void slavio_serial_update_parameters(ChannelState *s) | ||
| 362 | qemu_chr_ioctl(s->chr, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp); | 469 | qemu_chr_ioctl(s->chr, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp); |
| 363 | } | 470 | } |
| 364 | 471 | ||
| 365 | -static void slavio_serial_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val) | 472 | +static void slavio_serial_mem_writeb(void *opaque, target_phys_addr_t addr, |
| 473 | + uint32_t val) | ||
| 366 | { | 474 | { |
| 367 | SerialState *serial = opaque; | 475 | SerialState *serial = opaque; |
| 368 | ChannelState *s; | 476 | ChannelState *s; |
| @@ -374,21 +482,22 @@ static void slavio_serial_mem_writeb(void *opaque, target_phys_addr_t addr, uint | @@ -374,21 +482,22 @@ static void slavio_serial_mem_writeb(void *opaque, target_phys_addr_t addr, uint | ||
| 374 | channel = (addr & SERIAL_MAXADDR) >> 2; | 482 | channel = (addr & SERIAL_MAXADDR) >> 2; |
| 375 | s = &serial->chn[channel]; | 483 | s = &serial->chn[channel]; |
| 376 | switch (saddr) { | 484 | switch (saddr) { |
| 377 | - case 0: | ||
| 378 | - SER_DPRINTF("Write channel %c, reg[%d] = %2.2x\n", CHN_C(s), s->reg, val & 0xff); | 485 | + case SERIAL_CTRL: |
| 486 | + SER_DPRINTF("Write channel %c, reg[%d] = %2.2x\n", CHN_C(s), s->reg, | ||
| 487 | + val & 0xff); | ||
| 379 | newreg = 0; | 488 | newreg = 0; |
| 380 | switch (s->reg) { | 489 | switch (s->reg) { |
| 381 | - case 0: | ||
| 382 | - newreg = val & 7; | ||
| 383 | - val &= 0x38; | 490 | + case W_CMD: |
| 491 | + newreg = val & CMD_PTR_MASK; | ||
| 492 | + val &= CMD_CMD_MASK; | ||
| 384 | switch (val) { | 493 | switch (val) { |
| 385 | - case 8: | ||
| 386 | - newreg |= 0x8; | 494 | + case CMD_HI: |
| 495 | + newreg |= CMD_HI; | ||
| 387 | break; | 496 | break; |
| 388 | - case 0x28: | 497 | + case CMD_CLR_TXINT: |
| 389 | clr_txint(s); | 498 | clr_txint(s); |
| 390 | break; | 499 | break; |
| 391 | - case 0x38: | 500 | + case CMD_CLR_IUS: |
| 392 | if (s->rxint_under_svc) | 501 | if (s->rxint_under_svc) |
| 393 | clr_rxint(s); | 502 | clr_rxint(s); |
| 394 | else if (s->txint_under_svc) | 503 | else if (s->txint_under_svc) |
| @@ -398,31 +507,31 @@ static void slavio_serial_mem_writeb(void *opaque, target_phys_addr_t addr, uint | @@ -398,31 +507,31 @@ static void slavio_serial_mem_writeb(void *opaque, target_phys_addr_t addr, uint | ||
| 398 | break; | 507 | break; |
| 399 | } | 508 | } |
| 400 | break; | 509 | break; |
| 401 | - case 1 ... 3: | ||
| 402 | - case 6 ... 8: | ||
| 403 | - case 10 ... 11: | ||
| 404 | - case 14 ... 15: | 510 | + case W_INTR ... W_RXCTRL: |
| 511 | + case W_SYNC1 ... W_TXBUF: | ||
| 512 | + case W_MISC1 ... W_CLOCK: | ||
| 513 | + case W_MISC2 ... W_EXTINT: | ||
| 405 | s->wregs[s->reg] = val; | 514 | s->wregs[s->reg] = val; |
| 406 | break; | 515 | break; |
| 407 | - case 4: | ||
| 408 | - case 5: | ||
| 409 | - case 12: | ||
| 410 | - case 13: | 516 | + case W_TXCTRL1: |
| 517 | + case W_TXCTRL2: | ||
| 518 | + case W_BRGLO: | ||
| 519 | + case W_BRGHI: | ||
| 411 | s->wregs[s->reg] = val; | 520 | s->wregs[s->reg] = val; |
| 412 | slavio_serial_update_parameters(s); | 521 | slavio_serial_update_parameters(s); |
| 413 | break; | 522 | break; |
| 414 | - case 9: | ||
| 415 | - switch (val & 0xc0) { | 523 | + case W_MINTR: |
| 524 | + switch (val & MINTR_RST_MASK) { | ||
| 416 | case 0: | 525 | case 0: |
| 417 | default: | 526 | default: |
| 418 | break; | 527 | break; |
| 419 | - case 0x40: | 528 | + case MINTR_RST_B: |
| 420 | slavio_serial_reset_chn(&serial->chn[1]); | 529 | slavio_serial_reset_chn(&serial->chn[1]); |
| 421 | return; | 530 | return; |
| 422 | - case 0x80: | 531 | + case MINTR_RST_A: |
| 423 | slavio_serial_reset_chn(&serial->chn[0]); | 532 | slavio_serial_reset_chn(&serial->chn[0]); |
| 424 | return; | 533 | return; |
| 425 | - case 0xc0: | 534 | + case MINTR_RST_ALL: |
| 426 | slavio_serial_reset(serial); | 535 | slavio_serial_reset(serial); |
| 427 | return; | 536 | return; |
| 428 | } | 537 | } |
| @@ -435,18 +544,18 @@ static void slavio_serial_mem_writeb(void *opaque, target_phys_addr_t addr, uint | @@ -435,18 +544,18 @@ static void slavio_serial_mem_writeb(void *opaque, target_phys_addr_t addr, uint | ||
| 435 | else | 544 | else |
| 436 | s->reg = 0; | 545 | s->reg = 0; |
| 437 | break; | 546 | break; |
| 438 | - case 1: | 547 | + case SERIAL_DATA: |
| 439 | SER_DPRINTF("Write channel %c, ch %d\n", CHN_C(s), val); | 548 | SER_DPRINTF("Write channel %c, ch %d\n", CHN_C(s), val); |
| 440 | s->tx = val; | 549 | s->tx = val; |
| 441 | - if (s->wregs[5] & 8) { // tx enabled | 550 | + if (s->wregs[W_TXCTRL2] & TXCTRL2_TXEN) { // tx enabled |
| 442 | if (s->chr) | 551 | if (s->chr) |
| 443 | qemu_chr_write(s->chr, &s->tx, 1); | 552 | qemu_chr_write(s->chr, &s->tx, 1); |
| 444 | else if (s->type == kbd && !s->disabled) { | 553 | else if (s->type == kbd && !s->disabled) { |
| 445 | handle_kbd_command(s, val); | 554 | handle_kbd_command(s, val); |
| 446 | } | 555 | } |
| 447 | } | 556 | } |
| 448 | - s->rregs[0] |= 4; // Tx buffer empty | ||
| 449 | - s->rregs[1] |= 1; // All sent | 557 | + s->rregs[R_STATUS] |= STATUS_TXEMPTY; // Tx buffer empty |
| 558 | + s->rregs[R_SPEC] |= SPEC_ALLSENT; // All sent | ||
| 450 | set_txint(s); | 559 | set_txint(s); |
| 451 | break; | 560 | break; |
| 452 | default: | 561 | default: |
| @@ -466,13 +575,14 @@ static uint32_t slavio_serial_mem_readb(void *opaque, target_phys_addr_t addr) | @@ -466,13 +575,14 @@ static uint32_t slavio_serial_mem_readb(void *opaque, target_phys_addr_t addr) | ||
| 466 | channel = (addr & SERIAL_MAXADDR) >> 2; | 575 | channel = (addr & SERIAL_MAXADDR) >> 2; |
| 467 | s = &serial->chn[channel]; | 576 | s = &serial->chn[channel]; |
| 468 | switch (saddr) { | 577 | switch (saddr) { |
| 469 | - case 0: | ||
| 470 | - SER_DPRINTF("Read channel %c, reg[%d] = %2.2x\n", CHN_C(s), s->reg, s->rregs[s->reg]); | 578 | + case SERIAL_CTRL: |
| 579 | + SER_DPRINTF("Read channel %c, reg[%d] = %2.2x\n", CHN_C(s), s->reg, | ||
| 580 | + s->rregs[s->reg]); | ||
| 471 | ret = s->rregs[s->reg]; | 581 | ret = s->rregs[s->reg]; |
| 472 | s->reg = 0; | 582 | s->reg = 0; |
| 473 | return ret; | 583 | return ret; |
| 474 | - case 1: | ||
| 475 | - s->rregs[0] &= ~1; | 584 | + case SERIAL_DATA: |
| 585 | + s->rregs[R_STATUS] &= ~STATUS_RXAV; | ||
| 476 | clr_rxint(s); | 586 | clr_rxint(s); |
| 477 | if (s->type == kbd || s->type == mouse) | 587 | if (s->type == kbd || s->type == mouse) |
| 478 | ret = get_queue(s); | 588 | ret = get_queue(s); |
| @@ -493,26 +603,26 @@ static int serial_can_receive(void *opaque) | @@ -493,26 +603,26 @@ static int serial_can_receive(void *opaque) | ||
| 493 | ChannelState *s = opaque; | 603 | ChannelState *s = opaque; |
| 494 | int ret; | 604 | int ret; |
| 495 | 605 | ||
| 496 | - if (((s->wregs[3] & 1) == 0) // Rx not enabled | ||
| 497 | - || ((s->rregs[0] & 1) == 1)) // char already available | 606 | + if (((s->wregs[W_RXCTRL] & RXCTRL_RXEN) == 0) // Rx not enabled |
| 607 | + || ((s->rregs[R_STATUS] & STATUS_RXAV) == STATUS_RXAV)) | ||
| 608 | + // char already available | ||
| 498 | ret = 0; | 609 | ret = 0; |
| 499 | else | 610 | else |
| 500 | ret = 1; | 611 | ret = 1; |
| 501 | - //SER_DPRINTF("channel %c can receive %d\n", CHN_C(s), ret); | ||
| 502 | return ret; | 612 | return ret; |
| 503 | } | 613 | } |
| 504 | 614 | ||
| 505 | static void serial_receive_byte(ChannelState *s, int ch) | 615 | static void serial_receive_byte(ChannelState *s, int ch) |
| 506 | { | 616 | { |
| 507 | SER_DPRINTF("channel %c put ch %d\n", CHN_C(s), ch); | 617 | SER_DPRINTF("channel %c put ch %d\n", CHN_C(s), ch); |
| 508 | - s->rregs[0] |= 1; | 618 | + s->rregs[R_STATUS] |= STATUS_RXAV; |
| 509 | s->rx = ch; | 619 | s->rx = ch; |
| 510 | set_rxint(s); | 620 | set_rxint(s); |
| 511 | } | 621 | } |
| 512 | 622 | ||
| 513 | static void serial_receive_break(ChannelState *s) | 623 | static void serial_receive_break(ChannelState *s) |
| 514 | { | 624 | { |
| 515 | - s->rregs[0] |= 0x80; | 625 | + s->rregs[R_STATUS] |= STATUS_BRK; |
| 516 | slavio_serial_update_irq(s); | 626 | slavio_serial_update_irq(s); |
| 517 | } | 627 | } |
| 518 | 628 | ||
| @@ -553,8 +663,8 @@ static void slavio_serial_save_chn(QEMUFile *f, ChannelState *s) | @@ -553,8 +663,8 @@ static void slavio_serial_save_chn(QEMUFile *f, ChannelState *s) | ||
| 553 | qemu_put_be32s(f, &s->txint_under_svc); | 663 | qemu_put_be32s(f, &s->txint_under_svc); |
| 554 | qemu_put_8s(f, &s->rx); | 664 | qemu_put_8s(f, &s->rx); |
| 555 | qemu_put_8s(f, &s->tx); | 665 | qemu_put_8s(f, &s->tx); |
| 556 | - qemu_put_buffer(f, s->wregs, 16); | ||
| 557 | - qemu_put_buffer(f, s->rregs, 16); | 666 | + qemu_put_buffer(f, s->wregs, SERIAL_REGS); |
| 667 | + qemu_put_buffer(f, s->rregs, SERIAL_REGS); | ||
| 558 | } | 668 | } |
| 559 | 669 | ||
| 560 | static void slavio_serial_save(QEMUFile *f, void *opaque) | 670 | static void slavio_serial_save(QEMUFile *f, void *opaque) |
| @@ -582,8 +692,8 @@ static int slavio_serial_load_chn(QEMUFile *f, ChannelState *s, int version_id) | @@ -582,8 +692,8 @@ static int slavio_serial_load_chn(QEMUFile *f, ChannelState *s, int version_id) | ||
| 582 | } | 692 | } |
| 583 | qemu_get_8s(f, &s->rx); | 693 | qemu_get_8s(f, &s->rx); |
| 584 | qemu_get_8s(f, &s->tx); | 694 | qemu_get_8s(f, &s->tx); |
| 585 | - qemu_get_buffer(f, s->wregs, 16); | ||
| 586 | - qemu_get_buffer(f, s->rregs, 16); | 695 | + qemu_get_buffer(f, s->wregs, SERIAL_REGS); |
| 696 | + qemu_get_buffer(f, s->rregs, SERIAL_REGS); | ||
| 587 | return 0; | 697 | return 0; |
| 588 | } | 698 | } |
| 589 | 699 | ||
| @@ -610,7 +720,9 @@ SerialState *slavio_serial_init(target_phys_addr_t base, qemu_irq irq, | @@ -610,7 +720,9 @@ SerialState *slavio_serial_init(target_phys_addr_t base, qemu_irq irq, | ||
| 610 | if (!s) | 720 | if (!s) |
| 611 | return NULL; | 721 | return NULL; |
| 612 | 722 | ||
| 613 | - slavio_serial_io_memory = cpu_register_io_memory(0, slavio_serial_mem_read, slavio_serial_mem_write, s); | 723 | + slavio_serial_io_memory = cpu_register_io_memory(0, slavio_serial_mem_read, |
| 724 | + slavio_serial_mem_write, | ||
| 725 | + s); | ||
| 614 | cpu_register_physical_memory(base, SERIAL_SIZE, slavio_serial_io_memory); | 726 | cpu_register_physical_memory(base, SERIAL_SIZE, slavio_serial_io_memory); |
| 615 | 727 | ||
| 616 | s->chn[0].chr = chr1; | 728 | s->chn[0].chr = chr1; |
| @@ -629,7 +741,8 @@ SerialState *slavio_serial_init(target_phys_addr_t base, qemu_irq irq, | @@ -629,7 +741,8 @@ SerialState *slavio_serial_init(target_phys_addr_t base, qemu_irq irq, | ||
| 629 | } | 741 | } |
| 630 | s->chn[0].otherchn = &s->chn[1]; | 742 | s->chn[0].otherchn = &s->chn[1]; |
| 631 | s->chn[1].otherchn = &s->chn[0]; | 743 | s->chn[1].otherchn = &s->chn[0]; |
| 632 | - register_savevm("slavio_serial", base, 2, slavio_serial_save, slavio_serial_load, s); | 744 | + register_savevm("slavio_serial", base, 2, slavio_serial_save, |
| 745 | + slavio_serial_load, s); | ||
| 633 | qemu_register_reset(slavio_serial_reset, s); | 746 | qemu_register_reset(slavio_serial_reset, s); |
| 634 | slavio_serial_reset(s); | 747 | slavio_serial_reset(s); |
| 635 | return s; | 748 | return s; |
| @@ -662,7 +775,8 @@ static void sunkbd_event(void *opaque, int ch) | @@ -662,7 +775,8 @@ static void sunkbd_event(void *opaque, int ch) | ||
| 662 | ChannelState *s = opaque; | 775 | ChannelState *s = opaque; |
| 663 | int release = ch & 0x80; | 776 | int release = ch & 0x80; |
| 664 | 777 | ||
| 665 | - KBD_DPRINTF("Untranslated keycode %2.2x (%s)\n", ch, release? "release" : "press"); | 778 | + KBD_DPRINTF("Untranslated keycode %2.2x (%s)\n", ch, release? "release" : |
| 779 | + "press"); | ||
| 666 | switch (ch) { | 780 | switch (ch) { |
| 667 | case 58: // Caps lock press | 781 | case 58: // Caps lock press |
| 668 | s->caps_lock_mode ^= 1; | 782 | s->caps_lock_mode ^= 1; |
| @@ -792,12 +906,16 @@ void slavio_serial_ms_kbd_init(target_phys_addr_t base, qemu_irq irq, | @@ -792,12 +906,16 @@ void slavio_serial_ms_kbd_init(target_phys_addr_t base, qemu_irq irq, | ||
| 792 | s->chn[0].disabled = disabled; | 906 | s->chn[0].disabled = disabled; |
| 793 | s->chn[1].disabled = disabled; | 907 | s->chn[1].disabled = disabled; |
| 794 | 908 | ||
| 795 | - slavio_serial_io_memory = cpu_register_io_memory(0, slavio_serial_mem_read, slavio_serial_mem_write, s); | 909 | + slavio_serial_io_memory = cpu_register_io_memory(0, slavio_serial_mem_read, |
| 910 | + slavio_serial_mem_write, | ||
| 911 | + s); | ||
| 796 | cpu_register_physical_memory(base, SERIAL_SIZE, slavio_serial_io_memory); | 912 | cpu_register_physical_memory(base, SERIAL_SIZE, slavio_serial_io_memory); |
| 797 | 913 | ||
| 798 | - qemu_add_mouse_event_handler(sunmouse_event, &s->chn[0], 0, "QEMU Sun Mouse"); | 914 | + qemu_add_mouse_event_handler(sunmouse_event, &s->chn[0], 0, |
| 915 | + "QEMU Sun Mouse"); | ||
| 799 | qemu_add_kbd_event_handler(sunkbd_event, &s->chn[1]); | 916 | qemu_add_kbd_event_handler(sunkbd_event, &s->chn[1]); |
| 800 | - register_savevm("slavio_serial_mouse", base, 2, slavio_serial_save, slavio_serial_load, s); | 917 | + register_savevm("slavio_serial_mouse", base, 2, slavio_serial_save, |
| 918 | + slavio_serial_load, s); | ||
| 801 | qemu_register_reset(slavio_serial_reset, s); | 919 | qemu_register_reset(slavio_serial_reset, s); |
| 802 | slavio_serial_reset(s); | 920 | slavio_serial_reset(s); |
| 803 | } | 921 | } |