Revision e1bb04f7

b/hw/m48t59.c
35 35
struct m48t59_t {
36 36
    /* Hardware parameters */
37 37
    int      IRQ;
38
    int mem_index;
39
    uint32_t mem_base;
38 40
    uint32_t io_base;
39 41
    uint16_t size;
40 42
    /* RTC management */
......
481 483
    return retval;
482 484
}
483 485

  
486
static void nvram_writeb (void *opaque, target_phys_addr_t addr, uint32_t value)
487
{
488
    m48t59_t *NVRAM = opaque;
489
    
490
    addr -= NVRAM->mem_base;
491
    if (addr < 0x1FF0)
492
        NVRAM->buffer[addr] = value;
493
}
494

  
495
static void nvram_writew (void *opaque, target_phys_addr_t addr, uint32_t value)
496
{
497
    m48t59_t *NVRAM = opaque;
498
    
499
    addr -= NVRAM->mem_base;
500
    if (addr < 0x1FF0) {
501
        NVRAM->buffer[addr] = value >> 8;
502
        NVRAM->buffer[addr + 1] = value;
503
    }
504
}
505

  
506
static void nvram_writel (void *opaque, target_phys_addr_t addr, uint32_t value)
507
{
508
    m48t59_t *NVRAM = opaque;
509
    
510
    addr -= NVRAM->mem_base;
511
    if (addr < 0x1FF0) {
512
        NVRAM->buffer[addr] = value >> 24;
513
        NVRAM->buffer[addr + 1] = value >> 16;
514
        NVRAM->buffer[addr + 2] = value >> 8;
515
        NVRAM->buffer[addr + 3] = value;
516
    }
517
}
518

  
519
static uint32_t nvram_readb (void *opaque, target_phys_addr_t addr)
520
{
521
    m48t59_t *NVRAM = opaque;
522
    uint32_t retval = 0;
523
    
524
    addr -= NVRAM->mem_base;
525
    if (addr < 0x1FF0)
526
        retval = NVRAM->buffer[addr];
527

  
528
    return retval;
529
}
530

  
531
static uint32_t nvram_readw (void *opaque, target_phys_addr_t addr)
532
{
533
    m48t59_t *NVRAM = opaque;
534
    uint32_t retval = 0;
535
    
536
    addr -= NVRAM->mem_base;
537
    if (addr < 0x1FF0) {
538
        retval = NVRAM->buffer[addr] << 8;
539
        retval |= NVRAM->buffer[addr + 1];
540
    }
541

  
542
    return retval;
543
}
544

  
545
static uint32_t nvram_readl (void *opaque, target_phys_addr_t addr)
546
{
547
    m48t59_t *NVRAM = opaque;
548
    uint32_t retval = 0;
549
    
550
    addr -= NVRAM->mem_base;
551
    if (addr < 0x1FF0) {
552
        retval = NVRAM->buffer[addr] << 24;
553
        retval |= NVRAM->buffer[addr + 1] << 16;
554
        retval |= NVRAM->buffer[addr + 2] << 8;
555
        retval |= NVRAM->buffer[addr + 3];
556
    }
557

  
558
    return retval;
559
}
560

  
561
static CPUWriteMemoryFunc *nvram_write[] = {
562
    &nvram_writeb,
563
    &nvram_writew,
564
    &nvram_writel,
565
};
566

  
567
static CPUReadMemoryFunc *nvram_read[] = {
568
    &nvram_readb,
569
    &nvram_readw,
570
    &nvram_readl,
571
};
484 572
/* Initialisation routine */
485
m48t59_t *m48t59_init (int IRQ, uint32_t io_base, uint16_t size)
573
m48t59_t *m48t59_init (int IRQ, uint32_t mem_base,
574
                       uint32_t io_base, uint16_t size)
486 575
{
487 576
    m48t59_t *s;
488 577

  
......
496 585
    }
497 586
    s->IRQ = IRQ;
498 587
    s->size = size;
588
    s->mem_base = mem_base;
499 589
    s->io_base = io_base;
500 590
    s->addr = 0;
501 591
    register_ioport_read(io_base, 0x04, 1, NVRAM_readb, s);
502 592
    register_ioport_write(io_base, 0x04, 1, NVRAM_writeb, s);
593
    if (mem_base != 0) {
594
        s->mem_index = cpu_register_io_memory(0, nvram_read, nvram_write, s);
595
        cpu_register_physical_memory(mem_base, 0x4000, s->mem_index);
596
    }
503 597
    s->alrm_timer = qemu_new_timer(vm_clock, &alarm_cb, s);
504 598
    s->wd_timer = qemu_new_timer(vm_clock, &watchdog_cb, s);
505 599
    s->lock = 0;
b/hw/m48t59.h
7 7
uint32_t m48t59_read (m48t59_t *NVRAM);
8 8
void m48t59_set_addr (m48t59_t *NVRAM, uint32_t addr);
9 9
void m48t59_toggle_lock (m48t59_t *NVRAM, int lock);
10
m48t59_t *m48t59_init (int IRQ, uint32_t io_base, uint16_t size);
10
m48t59_t *m48t59_init (int IRQ, uint32_t io_base,
11
                       uint32_t mem_base, uint16_t size);
11 12

  
12 13
#endif /* !defined (__M48T59_H__) */

Also available in: Unified diff