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 | 89 | int rptr, wptr, count; |
| 90 | 90 | } SERIOQueue; |
| 91 | 91 | |
| 92 | +#define SERIAL_REGS 16 | |
| 92 | 93 | typedef struct ChannelState { |
| 93 | 94 | qemu_irq irq; |
| 94 | 95 | int reg; |
| ... | ... | @@ -96,7 +97,7 @@ typedef struct ChannelState { |
| 96 | 97 | chn_id_t chn; // this channel, A (base+4) or B (base+0) |
| 97 | 98 | chn_type_t type; |
| 98 | 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 | 101 | SERIOQueue queue; |
| 101 | 102 | CharDriverState *chr; |
| 102 | 103 | int e0_mode, led_mode, caps_lock_mode, num_lock_mode; |
| ... | ... | @@ -109,6 +110,107 @@ struct SerialState { |
| 109 | 110 | |
| 110 | 111 | #define SERIAL_MAXADDR 7 |
| 111 | 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 | 215 | static void handle_kbd_command(ChannelState *s, int val); |
| 114 | 216 | static int serial_can_receive(void *opaque); |
| ... | ... | @@ -159,11 +261,14 @@ static uint32_t get_queue(void *opaque) |
| 159 | 261 | |
| 160 | 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 | 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 | 272 | return 1; |
| 168 | 273 | } |
| 169 | 274 | return 0; |
| ... | ... | @@ -189,16 +294,18 @@ static void slavio_serial_reset_chn(ChannelState *s) |
| 189 | 294 | s->rregs[i] = 0; |
| 190 | 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 | 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 | 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 | 310 | s->rx = s->tx = 0; |
| 204 | 311 | s->rxint = s->txint = 0; |
| ... | ... | @@ -219,17 +326,17 @@ static inline void clr_rxint(ChannelState *s) |
| 219 | 326 | s->rxint = 0; |
| 220 | 327 | s->rxint_under_svc = 0; |
| 221 | 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 | 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 | 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 | 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 | 341 | if (s->txint) |
| 235 | 342 | set_txint(s); |
| ... | ... | @@ -242,21 +349,21 @@ static inline void set_rxint(ChannelState *s) |
| 242 | 349 | if (!s->txint_under_svc) { |
| 243 | 350 | s->rxint_under_svc = 1; |
| 244 | 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 | 354 | else |
| 248 | - s->otherchn->rregs[2] = 0x0c; | |
| 355 | + s->otherchn->rregs[R_IVEC] = IVEC_LORXINTA; | |
| 249 | 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 | 359 | else |
| 253 | - s->rregs[2] = 0x04; | |
| 360 | + s->rregs[R_IVEC] = IVEC_LORXINTB; | |
| 254 | 361 | } |
| 255 | 362 | } |
| 256 | 363 | if (s->chn == chn_a) |
| 257 | - s->rregs[3] |= 0x20; | |
| 364 | + s->rregs[R_INTR] |= INTR_RXINTA; | |
| 258 | 365 | else |
| 259 | - s->otherchn->rregs[3] |= 4; | |
| 366 | + s->otherchn->rregs[R_INTR] |= INTR_RXINTB; | |
| 260 | 367 | slavio_serial_update_irq(s); |
| 261 | 368 | } |
| 262 | 369 | |
| ... | ... | @@ -265,17 +372,17 @@ static inline void clr_txint(ChannelState *s) |
| 265 | 372 | s->txint = 0; |
| 266 | 373 | s->txint_under_svc = 0; |
| 267 | 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 | 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 | 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 | 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 | 387 | if (s->rxint) |
| 281 | 388 | set_rxint(s); |
| ... | ... | @@ -288,18 +395,18 @@ static inline void set_txint(ChannelState *s) |
| 288 | 395 | if (!s->rxint_under_svc) { |
| 289 | 396 | s->txint_under_svc = 1; |
| 290 | 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 | 400 | else |
| 294 | - s->otherchn->rregs[2] = 0x08; | |
| 401 | + s->otherchn->rregs[R_IVEC] = IVEC_LOTXINTA; | |
| 295 | 402 | } else { |
| 296 | - s->rregs[2] = 0; | |
| 403 | + s->rregs[R_IVEC] = IVEC_TXINTB; | |
| 297 | 404 | } |
| 298 | 405 | } |
| 299 | 406 | if (s->chn == chn_a) |
| 300 | - s->rregs[3] |= 0x10; | |
| 407 | + s->rregs[R_INTR] |= INTR_TXINTA; | |
| 301 | 408 | else |
| 302 | - s->otherchn->rregs[3] |= 2; | |
| 409 | + s->otherchn->rregs[R_INTR] |= INTR_TXINTB; | |
| 303 | 410 | slavio_serial_update_irq(s); |
| 304 | 411 | } |
| 305 | 412 | |
| ... | ... | @@ -311,45 +418,45 @@ static void slavio_serial_update_parameters(ChannelState *s) |
| 311 | 418 | if (!s->chr || s->type != ser) |
| 312 | 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 | 423 | parity = 'E'; |
| 317 | 424 | else |
| 318 | 425 | parity = 'O'; |
| 319 | 426 | } else { |
| 320 | 427 | parity = 'N'; |
| 321 | 428 | } |
| 322 | - if ((s->wregs[4] & 0x0c) == 0x0c) | |
| 429 | + if ((s->wregs[W_TXCTRL1] & TXCTRL1_STPMSK) == TXCTRL1_2STOP) | |
| 323 | 430 | stop_bits = 2; |
| 324 | 431 | else |
| 325 | 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 | 435 | data_bits = 5; |
| 329 | 436 | break; |
| 330 | - case 0x20: | |
| 437 | + case TXCTRL2_7BITS: | |
| 331 | 438 | data_bits = 7; |
| 332 | 439 | break; |
| 333 | - case 0x40: | |
| 440 | + case TXCTRL2_6BITS: | |
| 334 | 441 | data_bits = 6; |
| 335 | 442 | break; |
| 336 | 443 | default: |
| 337 | - case 0x60: | |
| 444 | + case TXCTRL2_8BITS: | |
| 338 | 445 | data_bits = 8; |
| 339 | 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 | 451 | break; |
| 345 | - case 0x40: | |
| 452 | + case TXCTRL1_CLK16X: | |
| 346 | 453 | speed /= 16; |
| 347 | 454 | break; |
| 348 | - case 0x80: | |
| 455 | + case TXCTRL1_CLK32X: | |
| 349 | 456 | speed /= 32; |
| 350 | 457 | break; |
| 351 | 458 | default: |
| 352 | - case 0xc0: | |
| 459 | + case TXCTRL1_CLK64X: | |
| 353 | 460 | speed /= 64; |
| 354 | 461 | break; |
| 355 | 462 | } |
| ... | ... | @@ -362,7 +469,8 @@ static void slavio_serial_update_parameters(ChannelState *s) |
| 362 | 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 | 475 | SerialState *serial = opaque; |
| 368 | 476 | ChannelState *s; |
| ... | ... | @@ -374,21 +482,22 @@ static void slavio_serial_mem_writeb(void *opaque, target_phys_addr_t addr, uint |
| 374 | 482 | channel = (addr & SERIAL_MAXADDR) >> 2; |
| 375 | 483 | s = &serial->chn[channel]; |
| 376 | 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 | 488 | newreg = 0; |
| 380 | 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 | 493 | switch (val) { |
| 385 | - case 8: | |
| 386 | - newreg |= 0x8; | |
| 494 | + case CMD_HI: | |
| 495 | + newreg |= CMD_HI; | |
| 387 | 496 | break; |
| 388 | - case 0x28: | |
| 497 | + case CMD_CLR_TXINT: | |
| 389 | 498 | clr_txint(s); |
| 390 | 499 | break; |
| 391 | - case 0x38: | |
| 500 | + case CMD_CLR_IUS: | |
| 392 | 501 | if (s->rxint_under_svc) |
| 393 | 502 | clr_rxint(s); |
| 394 | 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 | 507 | break; |
| 399 | 508 | } |
| 400 | 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 | 514 | s->wregs[s->reg] = val; |
| 406 | 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 | 520 | s->wregs[s->reg] = val; |
| 412 | 521 | slavio_serial_update_parameters(s); |
| 413 | 522 | break; |
| 414 | - case 9: | |
| 415 | - switch (val & 0xc0) { | |
| 523 | + case W_MINTR: | |
| 524 | + switch (val & MINTR_RST_MASK) { | |
| 416 | 525 | case 0: |
| 417 | 526 | default: |
| 418 | 527 | break; |
| 419 | - case 0x40: | |
| 528 | + case MINTR_RST_B: | |
| 420 | 529 | slavio_serial_reset_chn(&serial->chn[1]); |
| 421 | 530 | return; |
| 422 | - case 0x80: | |
| 531 | + case MINTR_RST_A: | |
| 423 | 532 | slavio_serial_reset_chn(&serial->chn[0]); |
| 424 | 533 | return; |
| 425 | - case 0xc0: | |
| 534 | + case MINTR_RST_ALL: | |
| 426 | 535 | slavio_serial_reset(serial); |
| 427 | 536 | return; |
| 428 | 537 | } |
| ... | ... | @@ -435,18 +544,18 @@ static void slavio_serial_mem_writeb(void *opaque, target_phys_addr_t addr, uint |
| 435 | 544 | else |
| 436 | 545 | s->reg = 0; |
| 437 | 546 | break; |
| 438 | - case 1: | |
| 547 | + case SERIAL_DATA: | |
| 439 | 548 | SER_DPRINTF("Write channel %c, ch %d\n", CHN_C(s), val); |
| 440 | 549 | s->tx = val; |
| 441 | - if (s->wregs[5] & 8) { // tx enabled | |
| 550 | + if (s->wregs[W_TXCTRL2] & TXCTRL2_TXEN) { // tx enabled | |
| 442 | 551 | if (s->chr) |
| 443 | 552 | qemu_chr_write(s->chr, &s->tx, 1); |
| 444 | 553 | else if (s->type == kbd && !s->disabled) { |
| 445 | 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 | 559 | set_txint(s); |
| 451 | 560 | break; |
| 452 | 561 | default: |
| ... | ... | @@ -466,13 +575,14 @@ static uint32_t slavio_serial_mem_readb(void *opaque, target_phys_addr_t addr) |
| 466 | 575 | channel = (addr & SERIAL_MAXADDR) >> 2; |
| 467 | 576 | s = &serial->chn[channel]; |
| 468 | 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 | 581 | ret = s->rregs[s->reg]; |
| 472 | 582 | s->reg = 0; |
| 473 | 583 | return ret; |
| 474 | - case 1: | |
| 475 | - s->rregs[0] &= ~1; | |
| 584 | + case SERIAL_DATA: | |
| 585 | + s->rregs[R_STATUS] &= ~STATUS_RXAV; | |
| 476 | 586 | clr_rxint(s); |
| 477 | 587 | if (s->type == kbd || s->type == mouse) |
| 478 | 588 | ret = get_queue(s); |
| ... | ... | @@ -493,26 +603,26 @@ static int serial_can_receive(void *opaque) |
| 493 | 603 | ChannelState *s = opaque; |
| 494 | 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 | 609 | ret = 0; |
| 499 | 610 | else |
| 500 | 611 | ret = 1; |
| 501 | - //SER_DPRINTF("channel %c can receive %d\n", CHN_C(s), ret); | |
| 502 | 612 | return ret; |
| 503 | 613 | } |
| 504 | 614 | |
| 505 | 615 | static void serial_receive_byte(ChannelState *s, int ch) |
| 506 | 616 | { |
| 507 | 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 | 619 | s->rx = ch; |
| 510 | 620 | set_rxint(s); |
| 511 | 621 | } |
| 512 | 622 | |
| 513 | 623 | static void serial_receive_break(ChannelState *s) |
| 514 | 624 | { |
| 515 | - s->rregs[0] |= 0x80; | |
| 625 | + s->rregs[R_STATUS] |= STATUS_BRK; | |
| 516 | 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 | 663 | qemu_put_be32s(f, &s->txint_under_svc); |
| 554 | 664 | qemu_put_8s(f, &s->rx); |
| 555 | 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 | 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 | 692 | } |
| 583 | 693 | qemu_get_8s(f, &s->rx); |
| 584 | 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 | 697 | return 0; |
| 588 | 698 | } |
| 589 | 699 | |
| ... | ... | @@ -610,7 +720,9 @@ SerialState *slavio_serial_init(target_phys_addr_t base, qemu_irq irq, |
| 610 | 720 | if (!s) |
| 611 | 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 | 726 | cpu_register_physical_memory(base, SERIAL_SIZE, slavio_serial_io_memory); |
| 615 | 727 | |
| 616 | 728 | s->chn[0].chr = chr1; |
| ... | ... | @@ -629,7 +741,8 @@ SerialState *slavio_serial_init(target_phys_addr_t base, qemu_irq irq, |
| 629 | 741 | } |
| 630 | 742 | s->chn[0].otherchn = &s->chn[1]; |
| 631 | 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 | 746 | qemu_register_reset(slavio_serial_reset, s); |
| 634 | 747 | slavio_serial_reset(s); |
| 635 | 748 | return s; |
| ... | ... | @@ -662,7 +775,8 @@ static void sunkbd_event(void *opaque, int ch) |
| 662 | 775 | ChannelState *s = opaque; |
| 663 | 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 | 780 | switch (ch) { |
| 667 | 781 | case 58: // Caps lock press |
| 668 | 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 | 906 | s->chn[0].disabled = disabled; |
| 793 | 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 | 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 | 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 | 919 | qemu_register_reset(slavio_serial_reset, s); |
| 802 | 920 | slavio_serial_reset(s); |
| 803 | 921 | } | ... | ... |