Revision 4b816985 hw/etraxfs_ser.c
b/hw/etraxfs_ser.c | ||
---|---|---|
22 | 22 |
* THE SOFTWARE. |
23 | 23 |
*/ |
24 | 24 |
|
25 |
#include <stdio.h> |
|
26 |
#include <ctype.h> |
|
27 |
#include "hw.h" |
|
25 |
#include "sysbus.h" |
|
28 | 26 |
#include "qemu-char.h" |
29 |
#include "etraxfs.h" |
|
30 | 27 |
|
31 | 28 |
#define D(x) |
32 | 29 |
|
... | ... | |
48 | 45 |
|
49 | 46 |
struct etrax_serial |
50 | 47 |
{ |
51 |
CPUState *env;
|
|
48 |
SysBusDevice busdev;
|
|
52 | 49 |
CharDriverState *chr; |
53 |
qemu_irq *irq;
|
|
50 |
qemu_irq irq; |
|
54 | 51 |
|
55 | 52 |
/* This pending thing is a hack. */ |
56 | 53 |
int pending_tx; |
... | ... | |
64 | 61 |
s->regs[R_INTR] &= ~(s->regs[RW_ACK_INTR]); |
65 | 62 |
s->regs[R_MASKED_INTR] = s->regs[R_INTR] & s->regs[RW_INTR_MASK]; |
66 | 63 |
|
67 |
qemu_set_irq(s->irq[0], !!s->regs[R_MASKED_INTR]);
|
|
64 |
qemu_set_irq(s->irq, !!s->regs[R_MASKED_INTR]); |
|
68 | 65 |
s->regs[RW_ACK_INTR] = 0; |
69 | 66 |
} |
70 | 67 |
|
... | ... | |
164 | 161 |
|
165 | 162 |
} |
166 | 163 |
|
167 |
void etraxfs_ser_init(CPUState *env, qemu_irq *irq, CharDriverState *chr, |
|
168 |
target_phys_addr_t base) |
|
164 |
static void etraxfs_ser_init(SysBusDevice *dev) |
|
169 | 165 |
{ |
170 |
struct etrax_serial *s; |
|
166 |
struct etrax_serial *s = FROM_SYSBUS(typeof (*s), dev);
|
|
171 | 167 |
int ser_regs; |
172 | 168 |
|
173 |
s = qemu_mallocz(sizeof *s); |
|
174 |
|
|
175 |
s->env = env; |
|
176 |
s->irq = irq; |
|
177 |
s->chr = chr; |
|
178 |
|
|
179 | 169 |
/* transmitter begins ready and idle. */ |
180 | 170 |
s->regs[RS_STAT_DIN] |= (1 << STAT_TR_RDY); |
181 | 171 |
s->regs[RS_STAT_DIN] |= (1 << STAT_TR_IDLE); |
182 | 172 |
|
183 |
qemu_chr_add_handlers(chr, serial_can_receive, serial_receive, |
|
184 |
serial_event, s); |
|
185 |
|
|
173 |
sysbus_init_irq(dev, &s->irq); |
|
186 | 174 |
ser_regs = cpu_register_io_memory(0, ser_read, ser_write, s); |
187 |
cpu_register_physical_memory (base, R_MAX * 4, ser_regs); |
|
175 |
sysbus_init_mmio(dev, R_MAX * 4, ser_regs); |
|
176 |
s->chr = qdev_init_chardev(&dev->qdev); |
|
177 |
if (s->chr) |
|
178 |
qemu_chr_add_handlers(s->chr, |
|
179 |
serial_can_receive, serial_receive, |
|
180 |
serial_event, s); |
|
188 | 181 |
} |
182 |
|
|
183 |
static void etraxfs_serial_register(void) |
|
184 |
{ |
|
185 |
sysbus_register_dev("etraxfs,serial", sizeof (struct etrax_serial), |
|
186 |
etraxfs_ser_init); |
|
187 |
} |
|
188 |
|
|
189 |
device_init(etraxfs_serial_register) |
Also available in: Unified diff