Revision 6c319c82
b/hw/escc.c | ||
---|---|---|
21 | 21 |
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
22 | 22 |
* THE SOFTWARE. |
23 | 23 |
*/ |
24 |
|
|
24 | 25 |
#include "hw.h" |
26 |
#include "sysbus.h" |
|
25 | 27 |
#include "escc.h" |
26 | 28 |
#include "qemu-char.h" |
27 | 29 |
#include "console.h" |
... | ... | |
114 | 116 |
} ChannelState; |
115 | 117 |
|
116 | 118 |
struct SerialState { |
119 |
SysBusDevice busdev; |
|
117 | 120 |
struct ChannelState chn[2]; |
118 | 121 |
int it_shift; |
122 |
int mmio_index; |
|
119 | 123 |
}; |
120 | 124 |
|
121 | 125 |
#define SERIAL_CTRL 0 |
... | ... | |
723 | 727 |
CharDriverState *chrA, CharDriverState *chrB, |
724 | 728 |
int clock, int it_shift) |
725 | 729 |
{ |
726 |
int escc_io_memory, i; |
|
727 |
SerialState *s; |
|
728 |
|
|
729 |
s = qemu_mallocz(sizeof(SerialState)); |
|
730 |
|
|
731 |
escc_io_memory = cpu_register_io_memory(escc_mem_read, |
|
732 |
escc_mem_write, |
|
733 |
s); |
|
734 |
if (base) |
|
735 |
cpu_register_physical_memory(base, ESCC_SIZE << it_shift, |
|
736 |
escc_io_memory); |
|
737 |
|
|
738 |
s->it_shift = it_shift; |
|
739 |
s->chn[0].chr = chrB; |
|
740 |
s->chn[1].chr = chrA; |
|
741 |
s->chn[0].disabled = 0; |
|
742 |
s->chn[1].disabled = 0; |
|
743 |
s->chn[0].irq = irqB; |
|
744 |
s->chn[1].irq = irqA; |
|
745 |
|
|
746 |
for (i = 0; i < 2; i++) { |
|
747 |
s->chn[i].chn = 1 - i; |
|
748 |
s->chn[i].type = ser; |
|
749 |
s->chn[i].clock = clock / 2; |
|
750 |
if (s->chn[i].chr) { |
|
751 |
qemu_chr_add_handlers(s->chn[i].chr, serial_can_receive, |
|
752 |
serial_receive1, serial_event, &s->chn[i]); |
|
753 |
} |
|
730 |
DeviceState *dev; |
|
731 |
SysBusDevice *s; |
|
732 |
SerialState *d; |
|
733 |
|
|
734 |
dev = qdev_create(NULL, "escc"); |
|
735 |
qdev_set_prop_int(dev, "disabled", 0); |
|
736 |
qdev_set_prop_int(dev, "frequency", clock); |
|
737 |
qdev_set_prop_int(dev, "it_shift", it_shift); |
|
738 |
qdev_set_prop_ptr(dev, "chrB", chrB); |
|
739 |
qdev_set_prop_ptr(dev, "chrA", chrA); |
|
740 |
qdev_set_prop_int(dev, "chnBtype", ser); |
|
741 |
qdev_set_prop_int(dev, "chnAtype", ser); |
|
742 |
qdev_init(dev); |
|
743 |
s = sysbus_from_qdev(dev); |
|
744 |
sysbus_connect_irq(s, 0, irqA); |
|
745 |
sysbus_connect_irq(s, 1, irqB); |
|
746 |
if (base) { |
|
747 |
sysbus_mmio_map(s, 0, base); |
|
754 | 748 |
} |
755 |
s->chn[0].otherchn = &s->chn[1]; |
|
756 |
s->chn[1].otherchn = &s->chn[0]; |
|
757 |
if (base) |
|
758 |
register_savevm("escc", base, 2, escc_save, escc_load, s); |
|
759 |
else |
|
760 |
register_savevm("escc", -1, 2, escc_save, escc_load, s); |
|
761 |
qemu_register_reset(escc_reset, s); |
|
762 |
escc_reset(s); |
|
763 |
return escc_io_memory; |
|
749 |
|
|
750 |
d = FROM_SYSBUS(SerialState, s); |
|
751 |
return d->mmio_index; |
|
764 | 752 |
} |
765 | 753 |
|
766 | 754 |
static const uint8_t keycodes[128] = { |
... | ... | |
903 | 891 |
void slavio_serial_ms_kbd_init(target_phys_addr_t base, qemu_irq irq, |
904 | 892 |
int disabled, int clock, int it_shift) |
905 | 893 |
{ |
906 |
int slavio_serial_io_memory, i; |
|
907 |
SerialState *s; |
|
908 |
|
|
909 |
s = qemu_mallocz(sizeof(SerialState)); |
|
894 |
DeviceState *dev; |
|
895 |
SysBusDevice *s; |
|
896 |
|
|
897 |
dev = qdev_create(NULL, "escc"); |
|
898 |
qdev_set_prop_int(dev, "disabled", disabled); |
|
899 |
qdev_set_prop_int(dev, "frequency", clock); |
|
900 |
qdev_set_prop_int(dev, "it_shift", it_shift); |
|
901 |
qdev_set_prop_ptr(dev, "chrB", NULL); |
|
902 |
qdev_set_prop_ptr(dev, "chrA", NULL); |
|
903 |
qdev_set_prop_int(dev, "chnBtype", mouse); |
|
904 |
qdev_set_prop_int(dev, "chnAtype", kbd); |
|
905 |
qdev_init(dev); |
|
906 |
s = sysbus_from_qdev(dev); |
|
907 |
sysbus_connect_irq(s, 0, irq); |
|
908 |
sysbus_connect_irq(s, 1, irq); |
|
909 |
sysbus_mmio_map(s, 0, base); |
|
910 |
} |
|
910 | 911 |
|
911 |
s->it_shift = it_shift; |
|
912 |
static void escc_init1(SysBusDevice *dev) |
|
913 |
{ |
|
914 |
SerialState *s = FROM_SYSBUS(SerialState, dev); |
|
915 |
int io; |
|
916 |
unsigned int i; |
|
917 |
uint32_t clock, disabled; |
|
918 |
|
|
919 |
s->it_shift = qdev_get_prop_int(&dev->qdev, "it_shift", 0); |
|
920 |
clock = qdev_get_prop_int(&dev->qdev, "frequency", 0); |
|
921 |
s->chn[0].chr = qdev_get_prop_ptr(&dev->qdev, "chrB"); |
|
922 |
s->chn[1].chr = qdev_get_prop_ptr(&dev->qdev, "chrA"); |
|
923 |
disabled = qdev_get_prop_int(&dev->qdev, "disabled", 0); |
|
924 |
s->chn[0].disabled = disabled; |
|
925 |
s->chn[1].disabled = disabled; |
|
912 | 926 |
for (i = 0; i < 2; i++) { |
913 |
s->chn[i].irq = irq;
|
|
927 |
sysbus_init_irq(dev, &s->chn[i].irq);
|
|
914 | 928 |
s->chn[i].chn = 1 - i; |
915 |
s->chn[i].chr = NULL; |
|
916 | 929 |
s->chn[i].clock = clock / 2; |
930 |
if (s->chn[i].chr) { |
|
931 |
qemu_chr_add_handlers(s->chn[i].chr, serial_can_receive, |
|
932 |
serial_receive1, serial_event, &s->chn[i]); |
|
933 |
} |
|
917 | 934 |
} |
918 | 935 |
s->chn[0].otherchn = &s->chn[1]; |
919 | 936 |
s->chn[1].otherchn = &s->chn[0]; |
920 |
s->chn[0].type = mouse; |
|
921 |
s->chn[1].type = kbd; |
|
922 |
s->chn[0].disabled = disabled; |
|
923 |
s->chn[1].disabled = disabled; |
|
937 |
s->chn[0].type = qdev_get_prop_int(&dev->qdev, "chnBtype", 0); |
|
938 |
s->chn[1].type = qdev_get_prop_int(&dev->qdev, "chnAtype", 0); |
|
924 | 939 |
|
925 |
slavio_serial_io_memory = cpu_register_io_memory(escc_mem_read, |
|
926 |
escc_mem_write, |
|
927 |
s); |
|
928 |
cpu_register_physical_memory(base, ESCC_SIZE << it_shift, |
|
929 |
slavio_serial_io_memory); |
|
940 |
io = cpu_register_io_memory(escc_mem_read, escc_mem_write, s); |
|
941 |
sysbus_init_mmio(dev, ESCC_SIZE << s->it_shift, io); |
|
942 |
s->mmio_index = io; |
|
930 | 943 |
|
931 |
qemu_add_mouse_event_handler(sunmouse_event, &s->chn[0], 0, |
|
932 |
"QEMU Sun Mouse"); |
|
933 |
qemu_add_kbd_event_handler(sunkbd_event, &s->chn[1]); |
|
934 |
register_savevm("slavio_serial_mouse", base, 2, escc_save, escc_load, s); |
|
944 |
if (s->chn[0].type == mouse) { |
|
945 |
qemu_add_mouse_event_handler(sunmouse_event, &s->chn[0], 0, |
|
946 |
"QEMU Sun Mouse"); |
|
947 |
} |
|
948 |
if (s->chn[1].type == kbd) { |
|
949 |
qemu_add_kbd_event_handler(sunkbd_event, &s->chn[1]); |
|
950 |
} |
|
951 |
register_savevm("escc", -1, 2, escc_save, escc_load, s); |
|
935 | 952 |
qemu_register_reset(escc_reset, s); |
936 | 953 |
escc_reset(s); |
937 | 954 |
} |
955 |
|
|
956 |
static SysBusDeviceInfo escc_info = { |
|
957 |
.init = escc_init1, |
|
958 |
.qdev.name = "escc", |
|
959 |
.qdev.size = sizeof(SerialState), |
|
960 |
.qdev.props = (DevicePropList[]) { |
|
961 |
{.name = "frequency", .type = PROP_TYPE_INT}, |
|
962 |
{.name = "it_shift", .type = PROP_TYPE_INT}, |
|
963 |
{.name = "disabled", .type = PROP_TYPE_INT}, |
|
964 |
{.name = "chrB", .type = PROP_TYPE_PTR}, |
|
965 |
{.name = "chrA", .type = PROP_TYPE_PTR}, |
|
966 |
{.name = "chnBtype", .type = PROP_TYPE_INT}, |
|
967 |
{.name = "chnAtype", .type = PROP_TYPE_INT}, |
|
968 |
{.name = NULL} |
|
969 |
} |
|
970 |
}; |
|
971 |
|
|
972 |
static void escc_register_devices(void) |
|
973 |
{ |
|
974 |
sysbus_register_withprop(&escc_info); |
|
975 |
} |
|
976 |
|
|
977 |
device_init(escc_register_devices) |
Also available in: Unified diff