Loading hw/escc.c +97 −57 Original line number Diff line number Diff line Loading @@ -21,7 +21,9 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #include "hw.h" #include "sysbus.h" #include "escc.h" #include "qemu-char.h" #include "console.h" Loading Loading @@ -114,8 +116,10 @@ typedef struct ChannelState { } ChannelState; struct SerialState { SysBusDevice busdev; struct ChannelState chn[2]; int it_shift; int mmio_index; }; #define SERIAL_CTRL 0 Loading Loading @@ -723,44 +727,28 @@ int escc_init(target_phys_addr_t base, qemu_irq irqA, qemu_irq irqB, CharDriverState *chrA, CharDriverState *chrB, int clock, int it_shift) { int escc_io_memory, i; SerialState *s; s = qemu_mallocz(sizeof(SerialState)); escc_io_memory = cpu_register_io_memory(escc_mem_read, escc_mem_write, s); if (base) cpu_register_physical_memory(base, ESCC_SIZE << it_shift, escc_io_memory); s->it_shift = it_shift; s->chn[0].chr = chrB; s->chn[1].chr = chrA; s->chn[0].disabled = 0; s->chn[1].disabled = 0; s->chn[0].irq = irqB; s->chn[1].irq = irqA; for (i = 0; i < 2; i++) { s->chn[i].chn = 1 - i; s->chn[i].type = ser; s->chn[i].clock = clock / 2; if (s->chn[i].chr) { qemu_chr_add_handlers(s->chn[i].chr, serial_can_receive, serial_receive1, serial_event, &s->chn[i]); } } s->chn[0].otherchn = &s->chn[1]; s->chn[1].otherchn = &s->chn[0]; if (base) register_savevm("escc", base, 2, escc_save, escc_load, s); else register_savevm("escc", -1, 2, escc_save, escc_load, s); qemu_register_reset(escc_reset, s); escc_reset(s); return escc_io_memory; DeviceState *dev; SysBusDevice *s; SerialState *d; dev = qdev_create(NULL, "escc"); qdev_set_prop_int(dev, "disabled", 0); qdev_set_prop_int(dev, "frequency", clock); qdev_set_prop_int(dev, "it_shift", it_shift); qdev_set_prop_ptr(dev, "chrB", chrB); qdev_set_prop_ptr(dev, "chrA", chrA); qdev_set_prop_int(dev, "chnBtype", ser); qdev_set_prop_int(dev, "chnAtype", ser); qdev_init(dev); s = sysbus_from_qdev(dev); sysbus_connect_irq(s, 0, irqA); sysbus_connect_irq(s, 1, irqB); if (base) { sysbus_mmio_map(s, 0, base); } d = FROM_SYSBUS(SerialState, s); return d->mmio_index; } static const uint8_t keycodes[128] = { Loading Loading @@ -903,35 +891,87 @@ static void sunmouse_event(void *opaque, void slavio_serial_ms_kbd_init(target_phys_addr_t base, qemu_irq irq, int disabled, int clock, int it_shift) { int slavio_serial_io_memory, i; SerialState *s; s = qemu_mallocz(sizeof(SerialState)); s->it_shift = it_shift; DeviceState *dev; SysBusDevice *s; dev = qdev_create(NULL, "escc"); qdev_set_prop_int(dev, "disabled", disabled); qdev_set_prop_int(dev, "frequency", clock); qdev_set_prop_int(dev, "it_shift", it_shift); qdev_set_prop_ptr(dev, "chrB", NULL); qdev_set_prop_ptr(dev, "chrA", NULL); qdev_set_prop_int(dev, "chnBtype", mouse); qdev_set_prop_int(dev, "chnAtype", kbd); qdev_init(dev); s = sysbus_from_qdev(dev); sysbus_connect_irq(s, 0, irq); sysbus_connect_irq(s, 1, irq); sysbus_mmio_map(s, 0, base); } static void escc_init1(SysBusDevice *dev) { SerialState *s = FROM_SYSBUS(SerialState, dev); int io; unsigned int i; uint32_t clock, disabled; s->it_shift = qdev_get_prop_int(&dev->qdev, "it_shift", 0); clock = qdev_get_prop_int(&dev->qdev, "frequency", 0); s->chn[0].chr = qdev_get_prop_ptr(&dev->qdev, "chrB"); s->chn[1].chr = qdev_get_prop_ptr(&dev->qdev, "chrA"); disabled = qdev_get_prop_int(&dev->qdev, "disabled", 0); s->chn[0].disabled = disabled; s->chn[1].disabled = disabled; for (i = 0; i < 2; i++) { s->chn[i].irq = irq; sysbus_init_irq(dev, &s->chn[i].irq); s->chn[i].chn = 1 - i; s->chn[i].chr = NULL; s->chn[i].clock = clock / 2; if (s->chn[i].chr) { qemu_chr_add_handlers(s->chn[i].chr, serial_can_receive, serial_receive1, serial_event, &s->chn[i]); } } s->chn[0].otherchn = &s->chn[1]; s->chn[1].otherchn = &s->chn[0]; s->chn[0].type = mouse; s->chn[1].type = kbd; s->chn[0].disabled = disabled; s->chn[1].disabled = disabled; s->chn[0].type = qdev_get_prop_int(&dev->qdev, "chnBtype", 0); s->chn[1].type = qdev_get_prop_int(&dev->qdev, "chnAtype", 0); slavio_serial_io_memory = cpu_register_io_memory(escc_mem_read, escc_mem_write, s); cpu_register_physical_memory(base, ESCC_SIZE << it_shift, slavio_serial_io_memory); io = cpu_register_io_memory(escc_mem_read, escc_mem_write, s); sysbus_init_mmio(dev, ESCC_SIZE << s->it_shift, io); s->mmio_index = io; if (s->chn[0].type == mouse) { qemu_add_mouse_event_handler(sunmouse_event, &s->chn[0], 0, "QEMU Sun Mouse"); } if (s->chn[1].type == kbd) { qemu_add_kbd_event_handler(sunkbd_event, &s->chn[1]); register_savevm("slavio_serial_mouse", base, 2, escc_save, escc_load, s); } register_savevm("escc", -1, 2, escc_save, escc_load, s); qemu_register_reset(escc_reset, s); escc_reset(s); } static SysBusDeviceInfo escc_info = { .init = escc_init1, .qdev.name = "escc", .qdev.size = sizeof(SerialState), .qdev.props = (DevicePropList[]) { {.name = "frequency", .type = PROP_TYPE_INT}, {.name = "it_shift", .type = PROP_TYPE_INT}, {.name = "disabled", .type = PROP_TYPE_INT}, {.name = "chrB", .type = PROP_TYPE_PTR}, {.name = "chrA", .type = PROP_TYPE_PTR}, {.name = "chnBtype", .type = PROP_TYPE_INT}, {.name = "chnAtype", .type = PROP_TYPE_INT}, {.name = NULL} } }; static void escc_register_devices(void) { sysbus_register_withprop(&escc_info); } device_init(escc_register_devices) Loading
hw/escc.c +97 −57 Original line number Diff line number Diff line Loading @@ -21,7 +21,9 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #include "hw.h" #include "sysbus.h" #include "escc.h" #include "qemu-char.h" #include "console.h" Loading Loading @@ -114,8 +116,10 @@ typedef struct ChannelState { } ChannelState; struct SerialState { SysBusDevice busdev; struct ChannelState chn[2]; int it_shift; int mmio_index; }; #define SERIAL_CTRL 0 Loading Loading @@ -723,44 +727,28 @@ int escc_init(target_phys_addr_t base, qemu_irq irqA, qemu_irq irqB, CharDriverState *chrA, CharDriverState *chrB, int clock, int it_shift) { int escc_io_memory, i; SerialState *s; s = qemu_mallocz(sizeof(SerialState)); escc_io_memory = cpu_register_io_memory(escc_mem_read, escc_mem_write, s); if (base) cpu_register_physical_memory(base, ESCC_SIZE << it_shift, escc_io_memory); s->it_shift = it_shift; s->chn[0].chr = chrB; s->chn[1].chr = chrA; s->chn[0].disabled = 0; s->chn[1].disabled = 0; s->chn[0].irq = irqB; s->chn[1].irq = irqA; for (i = 0; i < 2; i++) { s->chn[i].chn = 1 - i; s->chn[i].type = ser; s->chn[i].clock = clock / 2; if (s->chn[i].chr) { qemu_chr_add_handlers(s->chn[i].chr, serial_can_receive, serial_receive1, serial_event, &s->chn[i]); } } s->chn[0].otherchn = &s->chn[1]; s->chn[1].otherchn = &s->chn[0]; if (base) register_savevm("escc", base, 2, escc_save, escc_load, s); else register_savevm("escc", -1, 2, escc_save, escc_load, s); qemu_register_reset(escc_reset, s); escc_reset(s); return escc_io_memory; DeviceState *dev; SysBusDevice *s; SerialState *d; dev = qdev_create(NULL, "escc"); qdev_set_prop_int(dev, "disabled", 0); qdev_set_prop_int(dev, "frequency", clock); qdev_set_prop_int(dev, "it_shift", it_shift); qdev_set_prop_ptr(dev, "chrB", chrB); qdev_set_prop_ptr(dev, "chrA", chrA); qdev_set_prop_int(dev, "chnBtype", ser); qdev_set_prop_int(dev, "chnAtype", ser); qdev_init(dev); s = sysbus_from_qdev(dev); sysbus_connect_irq(s, 0, irqA); sysbus_connect_irq(s, 1, irqB); if (base) { sysbus_mmio_map(s, 0, base); } d = FROM_SYSBUS(SerialState, s); return d->mmio_index; } static const uint8_t keycodes[128] = { Loading Loading @@ -903,35 +891,87 @@ static void sunmouse_event(void *opaque, void slavio_serial_ms_kbd_init(target_phys_addr_t base, qemu_irq irq, int disabled, int clock, int it_shift) { int slavio_serial_io_memory, i; SerialState *s; s = qemu_mallocz(sizeof(SerialState)); s->it_shift = it_shift; DeviceState *dev; SysBusDevice *s; dev = qdev_create(NULL, "escc"); qdev_set_prop_int(dev, "disabled", disabled); qdev_set_prop_int(dev, "frequency", clock); qdev_set_prop_int(dev, "it_shift", it_shift); qdev_set_prop_ptr(dev, "chrB", NULL); qdev_set_prop_ptr(dev, "chrA", NULL); qdev_set_prop_int(dev, "chnBtype", mouse); qdev_set_prop_int(dev, "chnAtype", kbd); qdev_init(dev); s = sysbus_from_qdev(dev); sysbus_connect_irq(s, 0, irq); sysbus_connect_irq(s, 1, irq); sysbus_mmio_map(s, 0, base); } static void escc_init1(SysBusDevice *dev) { SerialState *s = FROM_SYSBUS(SerialState, dev); int io; unsigned int i; uint32_t clock, disabled; s->it_shift = qdev_get_prop_int(&dev->qdev, "it_shift", 0); clock = qdev_get_prop_int(&dev->qdev, "frequency", 0); s->chn[0].chr = qdev_get_prop_ptr(&dev->qdev, "chrB"); s->chn[1].chr = qdev_get_prop_ptr(&dev->qdev, "chrA"); disabled = qdev_get_prop_int(&dev->qdev, "disabled", 0); s->chn[0].disabled = disabled; s->chn[1].disabled = disabled; for (i = 0; i < 2; i++) { s->chn[i].irq = irq; sysbus_init_irq(dev, &s->chn[i].irq); s->chn[i].chn = 1 - i; s->chn[i].chr = NULL; s->chn[i].clock = clock / 2; if (s->chn[i].chr) { qemu_chr_add_handlers(s->chn[i].chr, serial_can_receive, serial_receive1, serial_event, &s->chn[i]); } } s->chn[0].otherchn = &s->chn[1]; s->chn[1].otherchn = &s->chn[0]; s->chn[0].type = mouse; s->chn[1].type = kbd; s->chn[0].disabled = disabled; s->chn[1].disabled = disabled; s->chn[0].type = qdev_get_prop_int(&dev->qdev, "chnBtype", 0); s->chn[1].type = qdev_get_prop_int(&dev->qdev, "chnAtype", 0); slavio_serial_io_memory = cpu_register_io_memory(escc_mem_read, escc_mem_write, s); cpu_register_physical_memory(base, ESCC_SIZE << it_shift, slavio_serial_io_memory); io = cpu_register_io_memory(escc_mem_read, escc_mem_write, s); sysbus_init_mmio(dev, ESCC_SIZE << s->it_shift, io); s->mmio_index = io; if (s->chn[0].type == mouse) { qemu_add_mouse_event_handler(sunmouse_event, &s->chn[0], 0, "QEMU Sun Mouse"); } if (s->chn[1].type == kbd) { qemu_add_kbd_event_handler(sunkbd_event, &s->chn[1]); register_savevm("slavio_serial_mouse", base, 2, escc_save, escc_load, s); } register_savevm("escc", -1, 2, escc_save, escc_load, s); qemu_register_reset(escc_reset, s); escc_reset(s); } static SysBusDeviceInfo escc_info = { .init = escc_init1, .qdev.name = "escc", .qdev.size = sizeof(SerialState), .qdev.props = (DevicePropList[]) { {.name = "frequency", .type = PROP_TYPE_INT}, {.name = "it_shift", .type = PROP_TYPE_INT}, {.name = "disabled", .type = PROP_TYPE_INT}, {.name = "chrB", .type = PROP_TYPE_PTR}, {.name = "chrA", .type = PROP_TYPE_PTR}, {.name = "chnBtype", .type = PROP_TYPE_INT}, {.name = "chnAtype", .type = PROP_TYPE_INT}, {.name = NULL} } }; static void escc_register_devices(void) { sysbus_register_withprop(&escc_info); } device_init(escc_register_devices)