diff --git a/src/include/86box/sio.h b/src/include/86box/sio.h index 9866a11ff..f34381039 100644 --- a/src/include/86box/sio.h +++ b/src/include/86box/sio.h @@ -45,27 +45,27 @@ extern const device_t fdc37c666_device; extern const device_t fdc37c669_device; extern const device_t fdc37c669_370_device; -extern const device_t fdc37c67x_device; - #define FDC37C93X_NORMAL 0x0002 #define FDC37C93X_FR 0x0003 #define FDC37C93X_APM 0x0030 #define FDC37C93X_CHIP_ID 0x00ff -#define FDC37C931 0x0100 /* Compaq KBC firmware and configuration registers on GPIO ports. */ -#define FDC37C932 0x0200 /* AMI '5' Megakey KBC firmware. */ -#define FDC37C933 0x0300 /* IBM KBC firmware. */ -#define FDC37C935 0x0500 /* Phoenix Multikey/42 1.38 KBC firmware. */ -#define FDC37C937 0x0700 /* Phoenix Multikey/42i 4.16 KBC firmware. */ -#define FDC37C93X_KBC 0x0f00 +#define FDC37XXX1 0x0100 /* Compaq KBC firmware and configuration registers on GPIO ports. */ +#define FDC37XXX2 0x0200 /* AMI '5' Megakey KBC firmware. */ +#define FDC37XXX3 0x0300 /* IBM KBC firmware. */ +#define FDC37XXX5 0x0500 /* Phoenix Multikey/42 1.38 KBC firmware. */ +#define FDC37XXX7 0x0700 /* Phoenix Multikey/42i 4.16 KBC firmware. */ +#define FDC37XXXX_KBC 0x0f00 #define FDC37C93X_NO_NVR 0x1000 -#define FDC37C93X_370 0x2000 +#define FDC37XXXX_370 0x2000 extern const device_t fdc37c93x_device; extern const device_t fdc37m60x_device; +extern const device_t fdc37c67x_device; + /* ITE */ extern const device_t it8661f_device; extern const device_t it8671f_device; @@ -84,7 +84,13 @@ extern const device_t i82091aa_ide_device; extern const device_t pc87310_device; /* National Semiconductors */ +#define PC8730X_AMI_MEGAKEY FDC37XXX2 +#define PC8730X_PHOENIX_42 FDC37XXX5 +#define PC8730X_PHOENIX_42I FDC37XXX7 +#define PC8730X_KBC FDC37XXXX_KBC + extern const device_t pc87306_device; + extern const device_t pc87311_device; extern const device_t pc87311_ide_device; extern const device_t pc87332_device; diff --git a/src/machine/m_at_slot1.c b/src/machine/m_at_slot1.c index b172f2469..0bbadca0c 100644 --- a/src/machine/m_at_slot1.c +++ b/src/machine/m_at_slot1.c @@ -63,7 +63,7 @@ machine_at_acerv62x_init(const machine_t *model) pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1); device_add(&i440fx_device); device_add(&piix3_device); - device_add_params(&fdc37c93x_device, (void *) (FDC37C935 | FDC37C93X_APM)); + device_add_params(&fdc37c93x_device, (void *) (FDC37XXX5 | FDC37C93X_APM)); device_add(&sst_flash_29ee020_device); spd_register(SPD_TYPE_SDRAM, 0x7, 128); @@ -208,7 +208,7 @@ machine_at_spitfire_init(const machine_t *model) pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); device_add(&i440lx_device); device_add(&piix4e_device); - device_add_params(&fdc37c93x_device, (void *) (FDC37C935 | FDC37C93X_NORMAL | FDC37C93X_NO_NVR)); + device_add_params(&fdc37c93x_device, (void *) (FDC37XXX5 | FDC37C93X_NORMAL | FDC37C93X_NO_NVR)); device_add(&intel_flash_bxt_device); spd_register(SPD_TYPE_SDRAM, 0xF, 256); device_add(&lm78_device); /* no reporting in BIOS */ @@ -244,7 +244,7 @@ machine_at_ma30d_init(const machine_t *model) device_add(&i440lx_device); device_add(&piix4e_device); device_add(&nec_mate_unk_device); - device_add_params(&fdc37c67x_device, (void *) (FDC37C932 | FDC37C93X_370)); + device_add_params(&fdc37c67x_device, (void *) (FDC37XXX2 | FDC37XXXX_370)); device_add(&intel_flash_bxt_device); spd_register(SPD_TYPE_SDRAM, 0x7, 256); @@ -797,7 +797,7 @@ machine_at_vei8_init(const machine_t *model) pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); device_add(&i440zx_device); device_add(&piix4e_device); - device_add_params(&fdc37m60x_device, (void *) (FDC37C932 | FDC37C93X_370)); + device_add_params(&fdc37m60x_device, (void *) (FDC37XXX2 | FDC37XXXX_370)); device_add(ics9xxx_get(ICS9250_08)); device_add(&sst_flash_39sf020_device); spd_register(SPD_TYPE_SDRAM, 0x3, 512); diff --git a/src/machine/m_at_socket5.c b/src/machine/m_at_socket5.c index 4abfada33..de7807abb 100644 --- a/src/machine/m_at_socket5.c +++ b/src/machine/m_at_socket5.c @@ -407,10 +407,9 @@ machine_at_zappa_init(const machine_t *model) pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - device_add(&kbc_ps2_intel_ami_pci_device); device_add(&i430fx_device); device_add(&piix_device); - device_add(&pc87306_device); + device_add_params(&pc87306_device, (void *) PC8730X_AMI_MEGAKEY); device_add(&intel_flash_bxt_ami_device); return ret; diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index f43650f62..5ea7ebbe0 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -79,7 +79,7 @@ machine_at_acerv35n_init(const machine_t *model) device_add(&i430hx_device); device_add(&piix3_device); /* The chip is not marked FR but the BIOS accesses register 06h of GPIO. */ - device_add_params(&fdc37c93x_device, (void *) (FDC37C935 | FDC37C93X_FR)); + device_add_params(&fdc37c93x_device, (void *) (FDC37XXX5 | FDC37C93X_FR)); device_add(&sst_flash_29ee010_device); return ret; @@ -170,7 +170,7 @@ machine_at_m7shi_init(const machine_t *model) pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); device_add(&i430hx_device); device_add(&piix3_device); - device_add_params(&fdc37c93x_device, (void *) (FDC37C935 | FDC37C93X_NORMAL)); + device_add_params(&fdc37c93x_device, (void *) (FDC37XXX5 | FDC37C93X_NORMAL)); device_add(&intel_flash_bxt_device); return ret; @@ -244,8 +244,7 @@ machine_at_tc430hx_init(const machine_t *model) device_add(&i430hx_device); device_add(&piix3_device); - device_add(&kbc_ps2_ami_pci_device); - device_add(&pc87306_device); + device_add_params(&pc87306_device, (void *) PC8730X_AMI_MEGAKEY); device_add(&intel_flash_bxt_ami_device); return ret; @@ -283,8 +282,7 @@ machine_at_infinia7200_init(const machine_t *model) device_add(&i430hx_device); device_add(&piix3_device); - device_add(&kbc_ps2_ami_pci_device); - device_add(&pc87306_device); + device_add_params(&pc87306_device, (void *) PC8730X_AMI_MEGAKEY); device_add(&intel_flash_bxt_ami_device); return ret; @@ -342,8 +340,7 @@ machine_at_cu430hx_common_init(const machine_t *model) device_add(&i430hx_device); device_add(&piix3_device); - device_add(&kbc_ps2_ami_pci_device); - device_add(&pc87306_device); + device_add_params(&pc87306_device, (void *) PC8730X_AMI_MEGAKEY); device_add(&intel_flash_bxt_ami_device); } @@ -415,8 +412,7 @@ machine_at_pcv90_init(const machine_t *model) pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430hx_device); device_add(&piix3_device); - device_add(&kbc_ps2_ami_pci_device); - device_add(&pc87306_device); + device_add_params(&pc87306_device, (void *) PC8730X_AMI_MEGAKEY); device_add(&intel_flash_bxt_ami_device); return ret; @@ -578,7 +574,7 @@ machine_at_presario2240_init(const machine_t *model) device_add(&i430vx_device); device_add(&piix3_device); - device_add_params(&fdc37c93x_device, (void *) (FDC37C932 | FDC37C93X_NORMAL)); + device_add_params(&fdc37c93x_device, (void *) (FDC37XXX2 | FDC37C93X_NORMAL)); device_add(&sst_flash_29ee020_device); return ret; @@ -608,7 +604,7 @@ machine_at_presario4500_init(const machine_t *model) device_add(&i430vx_device); device_add(&piix3_device); - device_add_params(&fdc37c93x_device, (void *) (FDC37C931 | FDC37C93X_APM)); + device_add_params(&fdc37c93x_device, (void *) (FDC37XXX1 | FDC37C93X_APM)); device_add(&sst_flash_29ee020_device); return ret; @@ -641,7 +637,7 @@ machine_at_dellhannibalp_init(const machine_t *model) pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 4); device_add(&i430vx_device); device_add(&piix3_device); - device_add_params(&fdc37c93x_device, (void *) (FDC37C932 | FDC37C93X_FR)); + device_add_params(&fdc37c93x_device, (void *) (FDC37XXX2 | FDC37C93X_FR)); device_add(&intel_flash_bxt_ami_device); return ret; @@ -669,7 +665,7 @@ machine_at_p55va_init(const machine_t *model) pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430vx_device); device_add(&piix3_device); - device_add_params(&fdc37c93x_device, (void *) (FDC37C932 | FDC37C93X_FR)); + device_add_params(&fdc37c93x_device, (void *) (FDC37XXX2 | FDC37C93X_FR)); device_add(&intel_flash_bxt_device); return ret; @@ -697,7 +693,7 @@ machine_at_brio80xx_init(const machine_t *model) pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); device_add(&i430vx_device); device_add(&piix3_device); - device_add_params(&fdc37c93x_device, (void *) (FDC37C935 | FDC37C93X_NORMAL | FDC37C93X_370)); + device_add_params(&fdc37c93x_device, (void *) (FDC37XXX5 | FDC37C93X_NORMAL | FDC37XXXX_370)); device_add(&sst_flash_29ee020_device); return ret; @@ -734,8 +730,7 @@ machine_at_pb680_init(const machine_t *model) device_add(&i430vx_device); device_add(&piix3_device); - device_add(&kbc_ps2_ami_pci_device); - device_add(&pc87306_device); + device_add_params(&pc87306_device, (void *) PC8730X_AMI_MEGAKEY); device_add(&intel_flash_bxt_ami_device); return ret; @@ -766,7 +761,7 @@ machine_at_pb810_init(const machine_t *model) device_add(&i430vx_device); device_add(&piix3_device); - device_add_params(&fdc37c93x_device, (void *) (FDC37C935 | FDC37C93X_NORMAL | FDC37C93X_370)); + device_add_params(&fdc37c93x_device, (void *) (FDC37XXX5 | FDC37C93X_NORMAL | FDC37XXXX_370)); device_add(&intel_flash_bxt_device); return ret; @@ -861,7 +856,7 @@ machine_at_gw2kte_init(const machine_t *model) device_add(&i430vx_device); device_add(&piix3_device); - device_add_params(&fdc37c93x_device, (void *) (FDC37C932 | FDC37C93X_FR)); + device_add_params(&fdc37c93x_device, (void *) (FDC37XXX2 | FDC37C93X_FR)); device_add(&intel_flash_bxt_ami_device); return ret; @@ -890,7 +885,7 @@ machine_at_ma23c_init(const machine_t *model) device_add(&i430tx_device); device_add(&piix4_device); device_add(&nec_mate_unk_device); - device_add_params(&fdc37c67x_device, (void *) (FDC37C932 | FDC37C93X_370)); + device_add_params(&fdc37c67x_device, (void *) (FDC37XXX2 | FDC37XXXX_370)); device_add(&intel_flash_bxt_device); spd_register(SPD_TYPE_SDRAM, 0x7, 256); @@ -1234,7 +1229,7 @@ machine_at_tomahawk_init(const machine_t *model) pci_register_slot(0x08, PCI_CARD_NORMAL, 3, 4, 1, 2); device_add(&i430tx_device); device_add(&piix4_device); - device_add_params(&fdc37c67x_device, (void *) (FDC37C932 | FDC37C93X_370)); + device_add_params(&fdc37c67x_device, (void *) (FDC37XXX2 | FDC37XXXX_370)); device_add(&amd_flash_29f020a_device); spd_register(SPD_TYPE_SDRAM, 0x3, 128); device_add(&lm78_device); /* fans: Thermal, CPU, Chassis; temperature: unused */ @@ -1632,7 +1627,7 @@ machine_at_thunderbolt_init(const machine_t *model) pci_register_slot(0x14, PCI_CARD_NORMAL, 3, 0, 1, 2); device_add(&i430tx_device); device_add(&piix4_device); - device_add_params(&fdc37c93x_device, (void *) (FDC37C935 | FDC37C93X_NORMAL | FDC37C93X_NO_NVR)); + device_add_params(&fdc37c93x_device, (void *) (FDC37XXX5 | FDC37C93X_NORMAL | FDC37C93X_NO_NVR)); device_add(&intel_flash_bxt_device); spd_register(SPD_TYPE_SDRAM, 0x3, 128); diff --git a/src/machine/m_at_socket7_3v.c b/src/machine/m_at_socket7_3v.c index 6303484dd..41f212b32 100644 --- a/src/machine/m_at_socket7_3v.c +++ b/src/machine/m_at_socket7_3v.c @@ -106,10 +106,9 @@ machine_at_thor_common_init(const machine_t *model, int has_video) if (has_video && (gfxcard[0] == VID_INTERNAL)) device_add(machine_get_vid_device(machine)); - device_add(&kbc_ps2_intel_ami_pci_device); device_add(&i430fx_device); device_add(&piix_device); - device_add(&pc87306_device); + device_add_params(&pc87306_device, (void *) PC8730X_AMI_MEGAKEY); device_add(&intel_flash_bxt_ami_device); } @@ -359,10 +358,9 @@ machine_at_endeavor_init(const machine_t *model) if (sound_card_current[0] == SOUND_INTERNAL) machine_snd = device_add(machine_get_snd_device(machine)); - device_add(&kbc_ps2_intel_ami_pci_device); device_add(&i430fx_device); device_add(&piix_device); - device_add(&pc87306_device); + device_add_params(&pc87306_device, (void *) PC8730X_AMI_MEGAKEY); device_add(&intel_flash_bxt_ami_device); return ret; @@ -457,8 +455,7 @@ machine_at_pb640_init(const machine_t *model) if (gfxcard[0] == VID_INTERNAL) device_add(machine_get_vid_device(machine)); - device_add(&kbc_ps2_intel_ami_pci_device); - device_add(&pc87306_device); + device_add_params(&pc87306_device, (void *) PC8730X_AMI_MEGAKEY); device_add(&intel_flash_bxt_ami_device); return ret; @@ -546,7 +543,7 @@ machine_at_acerm3a_init(const machine_t *model) pci_register_slot(0x10, PCI_CARD_VIDEO, 4, 0, 0, 0); device_add(&i430hx_device); device_add(&piix3_device); - device_add_params(&fdc37c93x_device, (void *) (FDC37C935 | FDC37C93X_NORMAL)); + device_add_params(&fdc37c93x_device, (void *) (FDC37XXX5 | FDC37C93X_NORMAL)); device_add(&sst_flash_29ee010_device); @@ -718,8 +715,7 @@ machine_at_p55t2s_init(const machine_t *model) pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430hx_device); device_add(&piix3_device); - device_add(&kbc_ps2_ami_pci_device); - device_add(&pc87306_device); + device_add_params(&pc87306_device, (void *) PC8730X_AMI_MEGAKEY); device_add(&intel_flash_bxt_device); return ret; @@ -784,7 +780,7 @@ machine_at_gw2kma_init(const machine_t *model) device_add(&i430vx_device); device_add(&piix3_device); - device_add_params(&fdc37c93x_device, (void *) (FDC37C932 | FDC37C93X_FR)); + device_add_params(&fdc37c93x_device, (void *) (FDC37XXX2 | FDC37C93X_FR)); device_add(&intel_flash_bxt_ami_device); return ret; @@ -945,7 +941,7 @@ machine_at_vectra54_init(const machine_t *model) device_add(&i430fx_device); device_add(&piix_device); - device_add_params(&fdc37c93x_device, (void *) (FDC37C932 | FDC37C93X_NORMAL)); + device_add_params(&fdc37c93x_device, (void *) (FDC37XXX2 | FDC37C93X_NORMAL)); device_add(&sst_flash_29ee010_device); return ret; diff --git a/src/machine/m_at_socket8.c b/src/machine/m_at_socket8.c index 097512abc..e06356c2c 100644 --- a/src/machine/m_at_socket8.c +++ b/src/machine/m_at_socket8.c @@ -188,7 +188,7 @@ machine_at_acerv60n_init(const machine_t *model) pci_register_slot(0x0C, PCI_CARD_NORMAL, 2, 3, 4, 1); device_add(&i440fx_device); device_add(&piix3_device); - device_add_params(&fdc37c93x_device, (void *) (FDC37C935 | FDC37C93X_NORMAL)); + device_add_params(&fdc37c93x_device, (void *) (FDC37XXX5 | FDC37C93X_NORMAL)); device_add(&sst_flash_29ee010_device); spd_register(SPD_TYPE_SDRAM, 0x7, 128); @@ -421,7 +421,7 @@ machine_at_m6mi_init(const machine_t *model) pci_register_slot(0x0F, PCI_CARD_NORMAL, 4, 1, 2, 3); device_add(&i440fx_device); device_add(&piix3_device); - device_add_params(&fdc37c93x_device, (void *) (FDC37C935 | FDC37C93X_NORMAL)); + device_add_params(&fdc37c93x_device, (void *) (FDC37XXX5 | FDC37C93X_NORMAL)); device_add(&intel_flash_bxt_device); return ret; diff --git a/src/sio/sio_fdc37c67x.c b/src/sio/sio_fdc37c67x.c index 1601565d5..c9d0bd149 100644 --- a/src/sio/sio_fdc37c67x.c +++ b/src/sio/sio_fdc37c67x.c @@ -743,11 +743,11 @@ fdc37c67x_init(const device_t *info) dev->lpt = device_add_inst(&lpt_port_device, 1); - dev->kbc_type = info->local & FDC37C93X_KBC; + dev->kbc_type = info->local & FDC37XXXX_KBC; - dev->is_compaq = (dev->kbc_type == FDC37C931); + dev->is_compaq = (dev->kbc_type == FDC37XXX1); - dev->port_370 = !!(info->local & FDC37C93X_370); + dev->port_370 = !!(info->local & FDC37XXXX_370); dev->max_ld = 8; @@ -759,20 +759,20 @@ fdc37c67x_init(const device_t *info) } switch (dev->kbc_type) { - case FDC37C931: + case FDC37XXX1: dev->kbc = device_add(&kbc_ps2_compaq_device); break; - case FDC37C932: + case FDC37XXX2: dev->kbc = device_add(&kbc_ps2_intel_ami_pci_device); break; - case FDC37C933: + case FDC37XXX3: default: dev->kbc = device_add(&kbc_ps2_pci_device); break; - case FDC37C935: + case FDC37XXX5: dev->kbc = device_add(&kbc_ps2_phoenix_device); break; - case FDC37C937: + case FDC37XXX7: dev->kbc = device_add(&kbc_ps2_phoenix_pci_device); break; } diff --git a/src/sio/sio_fdc37c93x.c b/src/sio/sio_fdc37c93x.c index d9699cd1f..9d0acfae2 100644 --- a/src/sio/sio_fdc37c93x.c +++ b/src/sio/sio_fdc37c93x.c @@ -1877,13 +1877,13 @@ fdc37c93x_init(const device_t *info) dev->lpt = device_add_inst(&lpt_port_device, 1); dev->chip_id = info->local & FDC37C93X_CHIP_ID; - dev->kbc_type = info->local & FDC37C93X_KBC; + dev->kbc_type = info->local & FDC37XXXX_KBC; dev->is_apm = (dev->chip_id == FDC37C93X_APM); - dev->is_compaq = (dev->kbc_type == FDC37C931); + dev->is_compaq = (dev->kbc_type == FDC37XXX1); dev->has_nvr = !(info->local & FDC37C93X_NO_NVR); - dev->port_370 = !!(info->local & FDC37C93X_370); + dev->port_370 = !!(info->local & FDC37XXXX_370); if (dev->has_nvr) { dev->nvr = device_add(&amstrad_megapc_nvr_device); @@ -1912,20 +1912,20 @@ fdc37c93x_init(const device_t *info) } switch (dev->kbc_type) { - case FDC37C931: + case FDC37XXX1: dev->kbc = device_add(&kbc_ps2_compaq_device); break; - case FDC37C932: + case FDC37XXX2: dev->kbc = device_add(&kbc_ps2_intel_ami_pci_device); break; - case FDC37C933: + case FDC37XXX3: default: dev->kbc = device_add(&kbc_ps2_pci_device); break; - case FDC37C935: + case FDC37XXX5: dev->kbc = device_add(&kbc_ps2_phoenix_device); break; - case FDC37C937: + case FDC37XXX7: dev->kbc = device_add(&kbc_ps2_phoenix_pci_device); break; } diff --git a/src/sio/sio_fdc37m60x.c b/src/sio/sio_fdc37m60x.c index 2d53b1048..8d18a1192 100644 --- a/src/sio/sio_fdc37m60x.c +++ b/src/sio/sio_fdc37m60x.c @@ -634,11 +634,11 @@ fdc37m60x_init(const device_t *info) dev->lpt = device_add_inst(&lpt_port_device, 1); - dev->kbc_type = info->local & FDC37C93X_KBC; + dev->kbc_type = info->local & FDC37XXXX_KBC; - dev->is_compaq = (dev->kbc_type == FDC37C931); + dev->is_compaq = (dev->kbc_type == FDC37XXX1); - dev->port_370 = !!(info->local & FDC37C93X_370); + dev->port_370 = !!(info->local & FDC37XXXX_370); dev->max_ld = 8; @@ -650,20 +650,20 @@ fdc37m60x_init(const device_t *info) } switch (dev->kbc_type) { - case FDC37C931: + case FDC37XXX1: dev->kbc = device_add(&kbc_ps2_compaq_device); break; - case FDC37C932: + case FDC37XXX2: dev->kbc = device_add(&kbc_ps2_intel_ami_pci_device); break; - case FDC37C933: + case FDC37XXX3: default: dev->kbc = device_add(&kbc_ps2_pci_device); break; - case FDC37C935: + case FDC37XXX5: dev->kbc = device_add(&kbc_ps2_phoenix_device); break; - case FDC37C937: + case FDC37XXX7: dev->kbc = device_add(&kbc_ps2_phoenix_pci_device); break; } diff --git a/src/sio/sio_pc87306.c b/src/sio/sio_pc87306.c index ddf274061..67f3dd59d 100644 --- a/src/sio/sio_pc87306.c +++ b/src/sio/sio_pc87306.c @@ -23,6 +23,7 @@ #include <86box/io.h> #include <86box/timer.h> #include <86box/device.h> +#include <86box/keyboard.h> #include <86box/lpt.h> #include <86box/mem.h> #include <86box/nvr.h> @@ -42,8 +43,10 @@ typedef struct pc87306_t { uint8_t regs[29]; uint8_t gpio[2]; uint16_t gpioba; + uint16_t kbc_type; int cur_reg; fdc_t *fdc; + void *kbc; serial_t *uart[2]; lpt_t *lpt; nvr_t *nvr; @@ -245,6 +248,15 @@ serial_handler(pc87306_t *dev, int uart) } } +static void +kbc_handler(pc87306_t *dev) +{ + kbc_at_handler(0, 0x0060, dev->kbc); + + if (dev->regs[0x05] & 0x01) + kbc_at_handler(1, 0x0060, dev->kbc); +} + static void pc87306_write(uint16_t port, uint8_t val, void *priv) { @@ -350,6 +362,8 @@ pc87306_write(uint16_t port, uint8_t val, void *priv) nvr_lock_set(0x00, 256, !!(val & 0x80), dev->nvr); break; case 0x05: + if (valxor & 0x01) + kbc_handler(dev); if (valxor & 0x08) nvr_at_handler(!!(val & 0x08), 0x0070, dev->nvr); if (valxor & 0x20) @@ -495,6 +509,8 @@ pc87306_init(UNUSED(const device_t *info)) { pc87306_t *dev = (pc87306_t *) calloc(1, sizeof(pc87306_t)); + dev->kbc_type = info->local & PC8730X_KBC; + dev->fdc = device_add(&fdc_at_nsc_device); dev->uart[0x00] = device_add_inst(&ns16550_device, 1); @@ -504,6 +520,19 @@ pc87306_init(UNUSED(const device_t *info)) dev->nvr = device_add(&at_mb_nvr_device); + switch (dev->kbc_type) { + case PC8730X_AMI_MEGAKEY: + default: + dev->kbc = device_add(&kbc_ps2_intel_ami_pci_device); + break; + case PC8730X_PHOENIX_42: + dev->kbc = device_add(&kbc_ps2_phoenix_device); + break; + case PC8730X_PHOENIX_42I: + dev->kbc = device_add(&kbc_ps2_phoenix_pci_device); + break; + } + dev->gpio[0] = dev->gpio[1] = 0xff; pc87306_reset_common(dev);