Some SM(S)C fixes and the PC87306 now handles its own keyboard controller.

This commit is contained in:
OBattler
2025-08-03 18:26:20 +02:00
parent 9dd1e0936a
commit ead6a8f8d0
10 changed files with 99 additions and 74 deletions

View File

@@ -45,27 +45,27 @@ extern const device_t fdc37c666_device;
extern const device_t fdc37c669_device; extern const device_t fdc37c669_device;
extern const device_t fdc37c669_370_device; extern const device_t fdc37c669_370_device;
extern const device_t fdc37c67x_device;
#define FDC37C93X_NORMAL 0x0002 #define FDC37C93X_NORMAL 0x0002
#define FDC37C93X_FR 0x0003 #define FDC37C93X_FR 0x0003
#define FDC37C93X_APM 0x0030 #define FDC37C93X_APM 0x0030
#define FDC37C93X_CHIP_ID 0x00ff #define FDC37C93X_CHIP_ID 0x00ff
#define FDC37C931 0x0100 /* Compaq KBC firmware and configuration registers on GPIO ports. */ #define FDC37XXX1 0x0100 /* Compaq KBC firmware and configuration registers on GPIO ports. */
#define FDC37C932 0x0200 /* AMI '5' Megakey KBC firmware. */ #define FDC37XXX2 0x0200 /* AMI '5' Megakey KBC firmware. */
#define FDC37C933 0x0300 /* IBM KBC firmware. */ #define FDC37XXX3 0x0300 /* IBM KBC firmware. */
#define FDC37C935 0x0500 /* Phoenix Multikey/42 1.38 KBC firmware. */ #define FDC37XXX5 0x0500 /* Phoenix Multikey/42 1.38 KBC firmware. */
#define FDC37C937 0x0700 /* Phoenix Multikey/42i 4.16 KBC firmware. */ #define FDC37XXX7 0x0700 /* Phoenix Multikey/42i 4.16 KBC firmware. */
#define FDC37C93X_KBC 0x0f00 #define FDC37XXXX_KBC 0x0f00
#define FDC37C93X_NO_NVR 0x1000 #define FDC37C93X_NO_NVR 0x1000
#define FDC37C93X_370 0x2000 #define FDC37XXXX_370 0x2000
extern const device_t fdc37c93x_device; extern const device_t fdc37c93x_device;
extern const device_t fdc37m60x_device; extern const device_t fdc37m60x_device;
extern const device_t fdc37c67x_device;
/* ITE */ /* ITE */
extern const device_t it8661f_device; extern const device_t it8661f_device;
extern const device_t it8671f_device; extern const device_t it8671f_device;
@@ -84,7 +84,13 @@ extern const device_t i82091aa_ide_device;
extern const device_t pc87310_device; extern const device_t pc87310_device;
/* National Semiconductors */ /* 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 pc87306_device;
extern const device_t pc87311_device; extern const device_t pc87311_device;
extern const device_t pc87311_ide_device; extern const device_t pc87311_ide_device;
extern const device_t pc87332_device; extern const device_t pc87332_device;

View File

@@ -63,7 +63,7 @@ machine_at_acerv62x_init(const machine_t *model)
pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1); pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1);
device_add(&i440fx_device); device_add(&i440fx_device);
device_add(&piix3_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); device_add(&sst_flash_29ee020_device);
spd_register(SPD_TYPE_SDRAM, 0x7, 128); 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); pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4);
device_add(&i440lx_device); device_add(&i440lx_device);
device_add(&piix4e_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); device_add(&intel_flash_bxt_device);
spd_register(SPD_TYPE_SDRAM, 0xF, 256); spd_register(SPD_TYPE_SDRAM, 0xF, 256);
device_add(&lm78_device); /* no reporting in BIOS */ 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(&i440lx_device);
device_add(&piix4e_device); device_add(&piix4e_device);
device_add(&nec_mate_unk_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); device_add(&intel_flash_bxt_device);
spd_register(SPD_TYPE_SDRAM, 0x7, 256); 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); pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4);
device_add(&i440zx_device); device_add(&i440zx_device);
device_add(&piix4e_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(ics9xxx_get(ICS9250_08));
device_add(&sst_flash_39sf020_device); device_add(&sst_flash_39sf020_device);
spd_register(SPD_TYPE_SDRAM, 0x3, 512); spd_register(SPD_TYPE_SDRAM, 0x3, 512);

View File

@@ -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(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2);
pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1);
pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); 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(&i430fx_device);
device_add(&piix_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); device_add(&intel_flash_bxt_ami_device);
return ret; return ret;

View File

@@ -79,7 +79,7 @@ machine_at_acerv35n_init(const machine_t *model)
device_add(&i430hx_device); device_add(&i430hx_device);
device_add(&piix3_device); device_add(&piix3_device);
/* The chip is not marked FR but the BIOS accesses register 06h of GPIO. */ /* 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); device_add(&sst_flash_29ee010_device);
return ret; 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); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
device_add(&i430hx_device); device_add(&i430hx_device);
device_add(&piix3_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); device_add(&intel_flash_bxt_device);
return ret; return ret;
@@ -244,8 +244,7 @@ machine_at_tc430hx_init(const machine_t *model)
device_add(&i430hx_device); device_add(&i430hx_device);
device_add(&piix3_device); device_add(&piix3_device);
device_add(&kbc_ps2_ami_pci_device); device_add_params(&pc87306_device, (void *) PC8730X_AMI_MEGAKEY);
device_add(&pc87306_device);
device_add(&intel_flash_bxt_ami_device); device_add(&intel_flash_bxt_ami_device);
return ret; return ret;
@@ -283,8 +282,7 @@ machine_at_infinia7200_init(const machine_t *model)
device_add(&i430hx_device); device_add(&i430hx_device);
device_add(&piix3_device); device_add(&piix3_device);
device_add(&kbc_ps2_ami_pci_device); device_add_params(&pc87306_device, (void *) PC8730X_AMI_MEGAKEY);
device_add(&pc87306_device);
device_add(&intel_flash_bxt_ami_device); device_add(&intel_flash_bxt_ami_device);
return ret; return ret;
@@ -342,8 +340,7 @@ machine_at_cu430hx_common_init(const machine_t *model)
device_add(&i430hx_device); device_add(&i430hx_device);
device_add(&piix3_device); device_add(&piix3_device);
device_add(&kbc_ps2_ami_pci_device); device_add_params(&pc87306_device, (void *) PC8730X_AMI_MEGAKEY);
device_add(&pc87306_device);
device_add(&intel_flash_bxt_ami_device); 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); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0);
device_add(&i430hx_device); device_add(&i430hx_device);
device_add(&piix3_device); device_add(&piix3_device);
device_add(&kbc_ps2_ami_pci_device); device_add_params(&pc87306_device, (void *) PC8730X_AMI_MEGAKEY);
device_add(&pc87306_device);
device_add(&intel_flash_bxt_ami_device); device_add(&intel_flash_bxt_ami_device);
return ret; return ret;
@@ -578,7 +574,7 @@ machine_at_presario2240_init(const machine_t *model)
device_add(&i430vx_device); device_add(&i430vx_device);
device_add(&piix3_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); device_add(&sst_flash_29ee020_device);
return ret; return ret;
@@ -608,7 +604,7 @@ machine_at_presario4500_init(const machine_t *model)
device_add(&i430vx_device); device_add(&i430vx_device);
device_add(&piix3_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); device_add(&sst_flash_29ee020_device);
return ret; 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); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 4);
device_add(&i430vx_device); device_add(&i430vx_device);
device_add(&piix3_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); device_add(&intel_flash_bxt_ami_device);
return ret; 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); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0);
device_add(&i430vx_device); device_add(&i430vx_device);
device_add(&piix3_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); device_add(&intel_flash_bxt_device);
return ret; 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); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
device_add(&i430vx_device); device_add(&i430vx_device);
device_add(&piix3_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); device_add(&sst_flash_29ee020_device);
return ret; return ret;
@@ -734,8 +730,7 @@ machine_at_pb680_init(const machine_t *model)
device_add(&i430vx_device); device_add(&i430vx_device);
device_add(&piix3_device); device_add(&piix3_device);
device_add(&kbc_ps2_ami_pci_device); device_add_params(&pc87306_device, (void *) PC8730X_AMI_MEGAKEY);
device_add(&pc87306_device);
device_add(&intel_flash_bxt_ami_device); device_add(&intel_flash_bxt_ami_device);
return ret; return ret;
@@ -766,7 +761,7 @@ machine_at_pb810_init(const machine_t *model)
device_add(&i430vx_device); device_add(&i430vx_device);
device_add(&piix3_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); device_add(&intel_flash_bxt_device);
return ret; return ret;
@@ -861,7 +856,7 @@ machine_at_gw2kte_init(const machine_t *model)
device_add(&i430vx_device); device_add(&i430vx_device);
device_add(&piix3_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); device_add(&intel_flash_bxt_ami_device);
return ret; return ret;
@@ -890,7 +885,7 @@ machine_at_ma23c_init(const machine_t *model)
device_add(&i430tx_device); device_add(&i430tx_device);
device_add(&piix4_device); device_add(&piix4_device);
device_add(&nec_mate_unk_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); device_add(&intel_flash_bxt_device);
spd_register(SPD_TYPE_SDRAM, 0x7, 256); 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); pci_register_slot(0x08, PCI_CARD_NORMAL, 3, 4, 1, 2);
device_add(&i430tx_device); device_add(&i430tx_device);
device_add(&piix4_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); device_add(&amd_flash_29f020a_device);
spd_register(SPD_TYPE_SDRAM, 0x3, 128); spd_register(SPD_TYPE_SDRAM, 0x3, 128);
device_add(&lm78_device); /* fans: Thermal, CPU, Chassis; temperature: unused */ 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); pci_register_slot(0x14, PCI_CARD_NORMAL, 3, 0, 1, 2);
device_add(&i430tx_device); device_add(&i430tx_device);
device_add(&piix4_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); device_add(&intel_flash_bxt_device);
spd_register(SPD_TYPE_SDRAM, 0x3, 128); spd_register(SPD_TYPE_SDRAM, 0x3, 128);

View File

@@ -106,10 +106,9 @@ machine_at_thor_common_init(const machine_t *model, int has_video)
if (has_video && (gfxcard[0] == VID_INTERNAL)) if (has_video && (gfxcard[0] == VID_INTERNAL))
device_add(machine_get_vid_device(machine)); device_add(machine_get_vid_device(machine));
device_add(&kbc_ps2_intel_ami_pci_device);
device_add(&i430fx_device); device_add(&i430fx_device);
device_add(&piix_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); 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) if (sound_card_current[0] == SOUND_INTERNAL)
machine_snd = device_add(machine_get_snd_device(machine)); machine_snd = device_add(machine_get_snd_device(machine));
device_add(&kbc_ps2_intel_ami_pci_device);
device_add(&i430fx_device); device_add(&i430fx_device);
device_add(&piix_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); device_add(&intel_flash_bxt_ami_device);
return ret; return ret;
@@ -457,8 +455,7 @@ machine_at_pb640_init(const machine_t *model)
if (gfxcard[0] == VID_INTERNAL) if (gfxcard[0] == VID_INTERNAL)
device_add(machine_get_vid_device(machine)); device_add(machine_get_vid_device(machine));
device_add(&kbc_ps2_intel_ami_pci_device); device_add_params(&pc87306_device, (void *) PC8730X_AMI_MEGAKEY);
device_add(&pc87306_device);
device_add(&intel_flash_bxt_ami_device); device_add(&intel_flash_bxt_ami_device);
return ret; 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); pci_register_slot(0x10, PCI_CARD_VIDEO, 4, 0, 0, 0);
device_add(&i430hx_device); device_add(&i430hx_device);
device_add(&piix3_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); 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); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0);
device_add(&i430hx_device); device_add(&i430hx_device);
device_add(&piix3_device); device_add(&piix3_device);
device_add(&kbc_ps2_ami_pci_device); device_add_params(&pc87306_device, (void *) PC8730X_AMI_MEGAKEY);
device_add(&pc87306_device);
device_add(&intel_flash_bxt_device); device_add(&intel_flash_bxt_device);
return ret; return ret;
@@ -784,7 +780,7 @@ machine_at_gw2kma_init(const machine_t *model)
device_add(&i430vx_device); device_add(&i430vx_device);
device_add(&piix3_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); device_add(&intel_flash_bxt_ami_device);
return ret; return ret;
@@ -945,7 +941,7 @@ machine_at_vectra54_init(const machine_t *model)
device_add(&i430fx_device); device_add(&i430fx_device);
device_add(&piix_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); device_add(&sst_flash_29ee010_device);
return ret; return ret;

View File

@@ -188,7 +188,7 @@ machine_at_acerv60n_init(const machine_t *model)
pci_register_slot(0x0C, PCI_CARD_NORMAL, 2, 3, 4, 1); pci_register_slot(0x0C, PCI_CARD_NORMAL, 2, 3, 4, 1);
device_add(&i440fx_device); device_add(&i440fx_device);
device_add(&piix3_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); device_add(&sst_flash_29ee010_device);
spd_register(SPD_TYPE_SDRAM, 0x7, 128); 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); pci_register_slot(0x0F, PCI_CARD_NORMAL, 4, 1, 2, 3);
device_add(&i440fx_device); device_add(&i440fx_device);
device_add(&piix3_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); device_add(&intel_flash_bxt_device);
return ret; return ret;

View File

@@ -743,11 +743,11 @@ fdc37c67x_init(const device_t *info)
dev->lpt = device_add_inst(&lpt_port_device, 1); 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; dev->max_ld = 8;
@@ -759,20 +759,20 @@ fdc37c67x_init(const device_t *info)
} }
switch (dev->kbc_type) { switch (dev->kbc_type) {
case FDC37C931: case FDC37XXX1:
dev->kbc = device_add(&kbc_ps2_compaq_device); dev->kbc = device_add(&kbc_ps2_compaq_device);
break; break;
case FDC37C932: case FDC37XXX2:
dev->kbc = device_add(&kbc_ps2_intel_ami_pci_device); dev->kbc = device_add(&kbc_ps2_intel_ami_pci_device);
break; break;
case FDC37C933: case FDC37XXX3:
default: default:
dev->kbc = device_add(&kbc_ps2_pci_device); dev->kbc = device_add(&kbc_ps2_pci_device);
break; break;
case FDC37C935: case FDC37XXX5:
dev->kbc = device_add(&kbc_ps2_phoenix_device); dev->kbc = device_add(&kbc_ps2_phoenix_device);
break; break;
case FDC37C937: case FDC37XXX7:
dev->kbc = device_add(&kbc_ps2_phoenix_pci_device); dev->kbc = device_add(&kbc_ps2_phoenix_pci_device);
break; break;
} }

View File

@@ -1877,13 +1877,13 @@ fdc37c93x_init(const device_t *info)
dev->lpt = device_add_inst(&lpt_port_device, 1); dev->lpt = device_add_inst(&lpt_port_device, 1);
dev->chip_id = info->local & FDC37C93X_CHIP_ID; 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_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->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) { if (dev->has_nvr) {
dev->nvr = device_add(&amstrad_megapc_nvr_device); dev->nvr = device_add(&amstrad_megapc_nvr_device);
@@ -1912,20 +1912,20 @@ fdc37c93x_init(const device_t *info)
} }
switch (dev->kbc_type) { switch (dev->kbc_type) {
case FDC37C931: case FDC37XXX1:
dev->kbc = device_add(&kbc_ps2_compaq_device); dev->kbc = device_add(&kbc_ps2_compaq_device);
break; break;
case FDC37C932: case FDC37XXX2:
dev->kbc = device_add(&kbc_ps2_intel_ami_pci_device); dev->kbc = device_add(&kbc_ps2_intel_ami_pci_device);
break; break;
case FDC37C933: case FDC37XXX3:
default: default:
dev->kbc = device_add(&kbc_ps2_pci_device); dev->kbc = device_add(&kbc_ps2_pci_device);
break; break;
case FDC37C935: case FDC37XXX5:
dev->kbc = device_add(&kbc_ps2_phoenix_device); dev->kbc = device_add(&kbc_ps2_phoenix_device);
break; break;
case FDC37C937: case FDC37XXX7:
dev->kbc = device_add(&kbc_ps2_phoenix_pci_device); dev->kbc = device_add(&kbc_ps2_phoenix_pci_device);
break; break;
} }

View File

@@ -634,11 +634,11 @@ fdc37m60x_init(const device_t *info)
dev->lpt = device_add_inst(&lpt_port_device, 1); 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; dev->max_ld = 8;
@@ -650,20 +650,20 @@ fdc37m60x_init(const device_t *info)
} }
switch (dev->kbc_type) { switch (dev->kbc_type) {
case FDC37C931: case FDC37XXX1:
dev->kbc = device_add(&kbc_ps2_compaq_device); dev->kbc = device_add(&kbc_ps2_compaq_device);
break; break;
case FDC37C932: case FDC37XXX2:
dev->kbc = device_add(&kbc_ps2_intel_ami_pci_device); dev->kbc = device_add(&kbc_ps2_intel_ami_pci_device);
break; break;
case FDC37C933: case FDC37XXX3:
default: default:
dev->kbc = device_add(&kbc_ps2_pci_device); dev->kbc = device_add(&kbc_ps2_pci_device);
break; break;
case FDC37C935: case FDC37XXX5:
dev->kbc = device_add(&kbc_ps2_phoenix_device); dev->kbc = device_add(&kbc_ps2_phoenix_device);
break; break;
case FDC37C937: case FDC37XXX7:
dev->kbc = device_add(&kbc_ps2_phoenix_pci_device); dev->kbc = device_add(&kbc_ps2_phoenix_pci_device);
break; break;
} }

View File

@@ -23,6 +23,7 @@
#include <86box/io.h> #include <86box/io.h>
#include <86box/timer.h> #include <86box/timer.h>
#include <86box/device.h> #include <86box/device.h>
#include <86box/keyboard.h>
#include <86box/lpt.h> #include <86box/lpt.h>
#include <86box/mem.h> #include <86box/mem.h>
#include <86box/nvr.h> #include <86box/nvr.h>
@@ -42,8 +43,10 @@ typedef struct pc87306_t {
uint8_t regs[29]; uint8_t regs[29];
uint8_t gpio[2]; uint8_t gpio[2];
uint16_t gpioba; uint16_t gpioba;
uint16_t kbc_type;
int cur_reg; int cur_reg;
fdc_t *fdc; fdc_t *fdc;
void *kbc;
serial_t *uart[2]; serial_t *uart[2];
lpt_t *lpt; lpt_t *lpt;
nvr_t *nvr; 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 static void
pc87306_write(uint16_t port, uint8_t val, void *priv) 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); nvr_lock_set(0x00, 256, !!(val & 0x80), dev->nvr);
break; break;
case 0x05: case 0x05:
if (valxor & 0x01)
kbc_handler(dev);
if (valxor & 0x08) if (valxor & 0x08)
nvr_at_handler(!!(val & 0x08), 0x0070, dev->nvr); nvr_at_handler(!!(val & 0x08), 0x0070, dev->nvr);
if (valxor & 0x20) if (valxor & 0x20)
@@ -495,6 +509,8 @@ pc87306_init(UNUSED(const device_t *info))
{ {
pc87306_t *dev = (pc87306_t *) calloc(1, sizeof(pc87306_t)); 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->fdc = device_add(&fdc_at_nsc_device);
dev->uart[0x00] = device_add_inst(&ns16550_device, 1); 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); 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; dev->gpio[0] = dev->gpio[1] = 0xff;
pc87306_reset_common(dev); pc87306_reset_common(dev);