347
345
/* If fd is zero, it means that the serial device uses the console */
348
SerialState *serial_init(SetIRQFunc *set_irq, void *opaque,
349
int base, int irq, CharDriverState *chr)
346
SerialState *serial_init(int base, qemu_irq irq, CharDriverState *chr)
353
350
s = qemu_mallocz(sizeof(SerialState));
356
s->set_irq = set_irq;
357
s->irq_opaque = opaque;
359
354
s->lsr = UART_LSR_TEMT | UART_LSR_THRE;
360
355
s->iir = UART_IIR_NO_INT;
373
368
/* Memory mapped interface */
374
static uint32_t serial_mm_readb (void *opaque, target_phys_addr_t addr)
369
uint32_t serial_mm_readb (void *opaque, target_phys_addr_t addr)
376
371
SerialState *s = opaque;
378
373
return serial_ioport_read(s, (addr - s->base) >> s->it_shift) & 0xFF;
381
static void serial_mm_writeb (void *opaque,
382
target_phys_addr_t addr, uint32_t value)
376
void serial_mm_writeb (void *opaque,
377
target_phys_addr_t addr, uint32_t value)
384
379
SerialState *s = opaque;
386
381
serial_ioport_write(s, (addr - s->base) >> s->it_shift, value & 0xFF);
389
static uint32_t serial_mm_readw (void *opaque, target_phys_addr_t addr)
384
uint32_t serial_mm_readw (void *opaque, target_phys_addr_t addr)
391
386
SerialState *s = opaque;
393
return serial_ioport_read(s, (addr - s->base) >> s->it_shift) & 0xFFFF;
389
val = serial_ioport_read(s, (addr - s->base) >> s->it_shift) & 0xFFFF;
390
#ifdef TARGET_WORDS_BIGENDIAN
396
static void serial_mm_writew (void *opaque,
397
target_phys_addr_t addr, uint32_t value)
396
void serial_mm_writew (void *opaque,
397
target_phys_addr_t addr, uint32_t value)
399
399
SerialState *s = opaque;
400
#ifdef TARGET_WORDS_BIGENDIAN
401
value = bswap16(value);
401
403
serial_ioport_write(s, (addr - s->base) >> s->it_shift, value & 0xFFFF);
404
static uint32_t serial_mm_readl (void *opaque, target_phys_addr_t addr)
406
uint32_t serial_mm_readl (void *opaque, target_phys_addr_t addr)
406
408
SerialState *s = opaque;
408
return serial_ioport_read(s, (addr - s->base) >> s->it_shift);
411
val = serial_ioport_read(s, (addr - s->base) >> s->it_shift);
412
#ifdef TARGET_WORDS_BIGENDIAN
411
static void serial_mm_writel (void *opaque,
412
target_phys_addr_t addr, uint32_t value)
418
void serial_mm_writel (void *opaque,
419
target_phys_addr_t addr, uint32_t value)
414
421
SerialState *s = opaque;
422
#ifdef TARGET_WORDS_BIGENDIAN
423
value = bswap32(value);
416
425
serial_ioport_write(s, (addr - s->base) >> s->it_shift, value);
428
437
&serial_mm_writel,
431
SerialState *serial_mm_init (SetIRQFunc *set_irq, void *opaque,
432
target_ulong base, int it_shift,
433
int irq, CharDriverState *chr)
440
SerialState *serial_mm_init (target_phys_addr_t base, int it_shift,
441
qemu_irq irq, CharDriverState *chr,
450
457
register_savevm("serial", base, 2, serial_save, serial_load, s);
452
s_io_memory = cpu_register_io_memory(0, serial_mm_read,
454
cpu_register_physical_memory(base, 8 << it_shift, s_io_memory);
460
s_io_memory = cpu_register_io_memory(0, serial_mm_read,
462
cpu_register_physical_memory(base, 8 << it_shift, s_io_memory);
456
465
qemu_chr_add_handlers(chr, serial_can_receive1, serial_receive1,
457
466
serial_event, s);