Commit 4aed2c33eb0e2c98db0d6a6ad13997651fad06bf
1 parent
9ed1e667
M48T02 support (Robert Reif)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3872 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
40 additions
and
15 deletions
hw/m48t59.c
| ... | ... | @@ -36,13 +36,13 @@ |
| 36 | 36 | #endif |
| 37 | 37 | |
| 38 | 38 | /* |
| 39 | - * The M48T08 and M48T59 chips are very similar. The newer '59 has | |
| 39 | + * The M48T02, M48T08 and M48T59 chips are very similar. The newer '59 has | |
| 40 | 40 | * alarm and a watchdog timer and related control registers. In the |
| 41 | 41 | * PPC platform there is also a nvram lock function. |
| 42 | 42 | */ |
| 43 | 43 | struct m48t59_t { |
| 44 | 44 | /* Model parameters */ |
| 45 | - int type; // 8 = m48t08, 59 = m48t59 | |
| 45 | + int type; // 2 = m48t02, 8 = m48t08, 59 = m48t59 | |
| 46 | 46 | /* Hardware parameters */ |
| 47 | 47 | qemu_irq IRQ; |
| 48 | 48 | int mem_index; |
| ... | ... | @@ -210,9 +210,14 @@ void m48t59_write (void *opaque, uint32_t addr, uint32_t val) |
| 210 | 210 | |
| 211 | 211 | if (addr > 0x1FF8 && addr < 0x2000) |
| 212 | 212 | NVRAM_PRINTF("%s: 0x%08x => 0x%08x\n", __func__, addr, val); |
| 213 | - if (NVRAM->type == 8 && | |
| 214 | - (addr >= 0x1ff0 && addr <= 0x1ff7)) | |
| 213 | + | |
| 214 | + /* check for NVRAM access */ | |
| 215 | + if ((NVRAM->type == 2 && addr < 0x7f8) || | |
| 216 | + (NVRAM->type == 8 && addr < 0x1ff8) || | |
| 217 | + (NVRAM->type == 59 && addr < 0x1ff0)) | |
| 215 | 218 | goto do_write; |
| 219 | + | |
| 220 | + /* TOD access */ | |
| 216 | 221 | switch (addr) { |
| 217 | 222 | case 0x1FF0: |
| 218 | 223 | /* flags register : read-only */ |
| ... | ... | @@ -270,10 +275,12 @@ void m48t59_write (void *opaque, uint32_t addr, uint32_t val) |
| 270 | 275 | set_up_watchdog(NVRAM, val); |
| 271 | 276 | break; |
| 272 | 277 | case 0x1FF8: |
| 278 | + case 0x07F8: | |
| 273 | 279 | /* control */ |
| 274 | - NVRAM->buffer[0x1FF8] = (val & ~0xA0) | 0x90; | |
| 280 | + NVRAM->buffer[addr] = (val & ~0xA0) | 0x90; | |
| 275 | 281 | break; |
| 276 | 282 | case 0x1FF9: |
| 283 | + case 0x07F9: | |
| 277 | 284 | /* seconds (BCD) */ |
| 278 | 285 | tmp = fromBCD(val & 0x7F); |
| 279 | 286 | if (tmp >= 0 && tmp <= 59) { |
| ... | ... | @@ -281,7 +288,7 @@ void m48t59_write (void *opaque, uint32_t addr, uint32_t val) |
| 281 | 288 | tm.tm_sec = tmp; |
| 282 | 289 | set_time(NVRAM, &tm); |
| 283 | 290 | } |
| 284 | - if ((val & 0x80) ^ (NVRAM->buffer[0x1FF9] & 0x80)) { | |
| 291 | + if ((val & 0x80) ^ (NVRAM->buffer[addr] & 0x80)) { | |
| 285 | 292 | if (val & 0x80) { |
| 286 | 293 | NVRAM->stop_time = time(NULL); |
| 287 | 294 | } else { |
| ... | ... | @@ -289,9 +296,10 @@ void m48t59_write (void *opaque, uint32_t addr, uint32_t val) |
| 289 | 296 | NVRAM->stop_time = 0; |
| 290 | 297 | } |
| 291 | 298 | } |
| 292 | - NVRAM->buffer[0x1FF9] = val & 0x80; | |
| 299 | + NVRAM->buffer[addr] = val & 0x80; | |
| 293 | 300 | break; |
| 294 | 301 | case 0x1FFA: |
| 302 | + case 0x07FA: | |
| 295 | 303 | /* minutes (BCD) */ |
| 296 | 304 | tmp = fromBCD(val & 0x7F); |
| 297 | 305 | if (tmp >= 0 && tmp <= 59) { |
| ... | ... | @@ -301,6 +309,7 @@ void m48t59_write (void *opaque, uint32_t addr, uint32_t val) |
| 301 | 309 | } |
| 302 | 310 | break; |
| 303 | 311 | case 0x1FFB: |
| 312 | + case 0x07FB: | |
| 304 | 313 | /* hours (BCD) */ |
| 305 | 314 | tmp = fromBCD(val & 0x3F); |
| 306 | 315 | if (tmp >= 0 && tmp <= 23) { |
| ... | ... | @@ -310,14 +319,16 @@ void m48t59_write (void *opaque, uint32_t addr, uint32_t val) |
| 310 | 319 | } |
| 311 | 320 | break; |
| 312 | 321 | case 0x1FFC: |
| 322 | + case 0x07FC: | |
| 313 | 323 | /* day of the week / century */ |
| 314 | 324 | tmp = fromBCD(val & 0x07); |
| 315 | 325 | get_time(NVRAM, &tm); |
| 316 | 326 | tm.tm_wday = tmp; |
| 317 | 327 | set_time(NVRAM, &tm); |
| 318 | - NVRAM->buffer[0x1FFC] = val & 0x40; | |
| 328 | + NVRAM->buffer[addr] = val & 0x40; | |
| 319 | 329 | break; |
| 320 | 330 | case 0x1FFD: |
| 331 | + case 0x07FD: | |
| 321 | 332 | /* date */ |
| 322 | 333 | tmp = fromBCD(val & 0x1F); |
| 323 | 334 | if (tmp != 0) { |
| ... | ... | @@ -327,6 +338,7 @@ void m48t59_write (void *opaque, uint32_t addr, uint32_t val) |
| 327 | 338 | } |
| 328 | 339 | break; |
| 329 | 340 | case 0x1FFE: |
| 341 | + case 0x07FE: | |
| 330 | 342 | /* month */ |
| 331 | 343 | tmp = fromBCD(val & 0x1F); |
| 332 | 344 | if (tmp >= 1 && tmp <= 12) { |
| ... | ... | @@ -336,6 +348,7 @@ void m48t59_write (void *opaque, uint32_t addr, uint32_t val) |
| 336 | 348 | } |
| 337 | 349 | break; |
| 338 | 350 | case 0x1FFF: |
| 351 | + case 0x07FF: | |
| 339 | 352 | /* year */ |
| 340 | 353 | tmp = fromBCD(val); |
| 341 | 354 | if (tmp >= 0 && tmp <= 99) { |
| ... | ... | @@ -367,9 +380,13 @@ uint32_t m48t59_read (void *opaque, uint32_t addr) |
| 367 | 380 | struct tm tm; |
| 368 | 381 | uint32_t retval = 0xFF; |
| 369 | 382 | |
| 370 | - if (NVRAM->type == 8 && | |
| 371 | - (addr >= 0x1ff0 && addr <= 0x1ff7)) | |
| 383 | + /* check for NVRAM access */ | |
| 384 | + if ((NVRAM->type == 2 && addr < 0x078f) || | |
| 385 | + (NVRAM->type == 8 && addr < 0x1ff8) || | |
| 386 | + (NVRAM->type == 59 && addr < 0x1ff0)) | |
| 372 | 387 | goto do_read; |
| 388 | + | |
| 389 | + /* TOD access */ | |
| 373 | 390 | switch (addr) { |
| 374 | 391 | case 0x1FF0: |
| 375 | 392 | /* flags register */ |
| ... | ... | @@ -398,39 +415,47 @@ uint32_t m48t59_read (void *opaque, uint32_t addr) |
| 398 | 415 | set_up_watchdog(NVRAM, NVRAM->buffer[0x1FF7]); |
| 399 | 416 | goto do_read; |
| 400 | 417 | case 0x1FF8: |
| 418 | + case 0x07F8: | |
| 401 | 419 | /* control */ |
| 402 | 420 | goto do_read; |
| 403 | 421 | case 0x1FF9: |
| 422 | + case 0x07F9: | |
| 404 | 423 | /* seconds (BCD) */ |
| 405 | 424 | get_time(NVRAM, &tm); |
| 406 | - retval = (NVRAM->buffer[0x1FF9] & 0x80) | toBCD(tm.tm_sec); | |
| 425 | + retval = (NVRAM->buffer[addr] & 0x80) | toBCD(tm.tm_sec); | |
| 407 | 426 | break; |
| 408 | 427 | case 0x1FFA: |
| 428 | + case 0x07FA: | |
| 409 | 429 | /* minutes (BCD) */ |
| 410 | 430 | get_time(NVRAM, &tm); |
| 411 | 431 | retval = toBCD(tm.tm_min); |
| 412 | 432 | break; |
| 413 | 433 | case 0x1FFB: |
| 434 | + case 0x07FB: | |
| 414 | 435 | /* hours (BCD) */ |
| 415 | 436 | get_time(NVRAM, &tm); |
| 416 | 437 | retval = toBCD(tm.tm_hour); |
| 417 | 438 | break; |
| 418 | 439 | case 0x1FFC: |
| 440 | + case 0x07FC: | |
| 419 | 441 | /* day of the week / century */ |
| 420 | 442 | get_time(NVRAM, &tm); |
| 421 | - retval = NVRAM->buffer[0x1FFC] | tm.tm_wday; | |
| 443 | + retval = NVRAM->buffer[addr] | tm.tm_wday; | |
| 422 | 444 | break; |
| 423 | 445 | case 0x1FFD: |
| 446 | + case 0x07FD: | |
| 424 | 447 | /* date */ |
| 425 | 448 | get_time(NVRAM, &tm); |
| 426 | 449 | retval = toBCD(tm.tm_mday); |
| 427 | 450 | break; |
| 428 | 451 | case 0x1FFE: |
| 452 | + case 0x07FE: | |
| 429 | 453 | /* month */ |
| 430 | 454 | get_time(NVRAM, &tm); |
| 431 | 455 | retval = toBCD(tm.tm_mon + 1); |
| 432 | 456 | break; |
| 433 | 457 | case 0x1FFF: |
| 458 | + case 0x07FF: | |
| 434 | 459 | /* year */ |
| 435 | 460 | get_time(NVRAM, &tm); |
| 436 | 461 | if (NVRAM->type == 8) |
| ... | ... | @@ -650,7 +675,7 @@ m48t59_t *m48t59_init (qemu_irq IRQ, target_phys_addr_t mem_base, |
| 650 | 675 | } |
| 651 | 676 | if (mem_base != 0) { |
| 652 | 677 | s->mem_index = cpu_register_io_memory(0, nvram_read, nvram_write, s); |
| 653 | - cpu_register_physical_memory(mem_base, 0x4000, s->mem_index); | |
| 678 | + cpu_register_physical_memory(mem_base, size, s->mem_index); | |
| 654 | 679 | } |
| 655 | 680 | if (type == 59) { |
| 656 | 681 | s->alrm_timer = qemu_new_timer(vm_clock, &alarm_cb, s); | ... | ... |
hw/sun4m.c
| ... | ... | @@ -623,7 +623,7 @@ static void sun4c_hw_init(const struct hwdef *hwdef, int RAM_size, |
| 623 | 623 | } |
| 624 | 624 | |
| 625 | 625 | nvram = m48t59_init(slavio_irq[0], hwdef->nvram_base, 0, |
| 626 | - hwdef->nvram_size, 8); | |
| 626 | + hwdef->nvram_size, 2); | |
| 627 | 627 | |
| 628 | 628 | slavio_serial_ms_kbd_init(hwdef->ms_kb_base, slavio_irq[hwdef->ms_kb_irq], |
| 629 | 629 | nographic); |
| ... | ... | @@ -848,7 +848,7 @@ static const struct hwdef hwdefs[] = { |
| 848 | 848 | .sun4c_intctl_base = 0xf5000000, |
| 849 | 849 | .sun4c_counter_base = 0xf3000000, |
| 850 | 850 | .vram_size = 0x00100000, |
| 851 | - .nvram_size = 0x2000, // XXX 0x800, | |
| 851 | + .nvram_size = 0x800, | |
| 852 | 852 | .esp_irq = 2, |
| 853 | 853 | .le_irq = 3, |
| 854 | 854 | .clock_irq = 5, | ... | ... |