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, | ... | ... |