sio_um8669f: Implement IDE controller
This commit is contained in:
@@ -72,6 +72,8 @@ extern const device_t ps1_m2133_sio;
|
|||||||
extern const device_t sio_detect_device;
|
extern const device_t sio_detect_device;
|
||||||
#endif
|
#endif
|
||||||
extern const device_t um8669f_device;
|
extern const device_t um8669f_device;
|
||||||
|
extern const device_t um8669f_ide_device;
|
||||||
|
extern const device_t um8669f_ide_sec_device;
|
||||||
extern const device_t via_vt82c686_sio_device;
|
extern const device_t via_vt82c686_sio_device;
|
||||||
extern const device_t w83787f_88h_device;
|
extern const device_t w83787f_88h_device;
|
||||||
extern const device_t w83787f_device;
|
extern const device_t w83787f_device;
|
||||||
|
@@ -35,8 +35,10 @@
|
|||||||
#include <86box/fdd.h>
|
#include <86box/fdd.h>
|
||||||
#include <86box/fdc.h>
|
#include <86box/fdc.h>
|
||||||
#include <86box/gameport.h>
|
#include <86box/gameport.h>
|
||||||
#include <86box/sio.h>
|
#include <86box/hdc.h>
|
||||||
#include <86box/isapnp.h>
|
#include <86box/isapnp.h>
|
||||||
|
#include <86box/hdc_ide.h>
|
||||||
|
#include <86box/sio.h>
|
||||||
#include <86box/plat_unused.h>
|
#include <86box/plat_unused.h>
|
||||||
|
|
||||||
/* Real chips don't have a PnP ROM and instead rely on the BIOS going in blind.
|
/* Real chips don't have a PnP ROM and instead rely on the BIOS going in blind.
|
||||||
@@ -63,7 +65,9 @@ static uint8_t um8669f_pnp_rom[] = {
|
|||||||
0x22, 0xfa, 0x1f, /* IRQ 1/3/4/5/6/7/8/9/10/11/12 */
|
0x22, 0xfa, 0x1f, /* IRQ 1/3/4/5/6/7/8/9/10/11/12 */
|
||||||
0x47, 0x00, 0x00, 0x01, 0xf8, 0x03, 0x08, 0x08, /* I/O 0x100-0x3F8, decodes 10-bit, 8-byte alignment, 8 addresses */
|
0x47, 0x00, 0x00, 0x01, 0xf8, 0x03, 0x08, 0x08, /* I/O 0x100-0x3F8, decodes 10-bit, 8-byte alignment, 8 addresses */
|
||||||
|
|
||||||
0x15, 0x41, 0xd0, 0xff, 0xff, 0x00, /* logical device PNPFFFF (dummy to create a gap in LDNs) */
|
0x15, 0x41, 0xd0, 0x06, 0x00, 0x01, /* logical device PNP0600, can participate in boot */
|
||||||
|
0x22, 0xfa, 0x1f, /* IRQ 1/3/4/5/6/7/8/9/10/11/12 */
|
||||||
|
0x47, 0x00, 0x00, 0x01, 0xf8, 0x03, 0x08, 0x08, /* I/O 0x100-0x3F8, decodes 10-bit, 8-byte alignment, 8 addresses */
|
||||||
|
|
||||||
0x15, 0x41, 0xd0, 0xb0, 0x2f, 0x01, /* logical device PNPB02F, can participate in boot */
|
0x15, 0x41, 0xd0, 0xb0, 0x2f, 0x01, /* logical device PNPB02F, can participate in boot */
|
||||||
0x47, 0x00, 0x00, 0x01, 0xf8, 0x03, 0x08, 0x08, /* I/O 0x100-0x3F8, decodes 10-bit, 8-byte alignment, 8 addresses */
|
0x47, 0x00, 0x00, 0x01, 0xf8, 0x03, 0x08, 0x08, /* I/O 0x100-0x3F8, decodes 10-bit, 8-byte alignment, 8 addresses */
|
||||||
@@ -89,7 +93,9 @@ static const isapnp_device_config_t um8669f_pnp_defaults[] = {
|
|||||||
.io = { { .base = LPT1_ADDR }, },
|
.io = { { .base = LPT1_ADDR }, },
|
||||||
.irq = { { .irq = LPT1_IRQ }, }
|
.irq = { { .irq = LPT1_IRQ }, }
|
||||||
}, {
|
}, {
|
||||||
.activate = 0
|
.activate = 0,
|
||||||
|
.io = { { .base = 0x1f0 }, },
|
||||||
|
.irq = { { .irq = 14 }, }
|
||||||
}, {
|
}, {
|
||||||
.activate = 0,
|
.activate = 0,
|
||||||
.io = { { .base = 0x200 }, }
|
.io = { { .base = 0x200 }, }
|
||||||
@@ -123,6 +129,7 @@ typedef struct um8669f_t {
|
|||||||
|
|
||||||
fdc_t *fdc;
|
fdc_t *fdc;
|
||||||
serial_t *uart[2];
|
serial_t *uart[2];
|
||||||
|
uint8_t ide;
|
||||||
void *gameport;
|
void *gameport;
|
||||||
} um8669f_t;
|
} um8669f_t;
|
||||||
|
|
||||||
@@ -179,6 +186,18 @@ um8669f_pnp_config_changed(uint8_t ld, isapnp_device_config_t *config, void *pri
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
if (config->activate && (config->io[0].base != ISAPNP_IO_DISABLED))
|
||||||
|
um8669f_log("UM8669F: IDE enabled at port %04X IRQ %d\n", config->io[0].base, config->irq[0].irq);
|
||||||
|
else
|
||||||
|
um8669f_log("UM8669F: IDE disabled\n");
|
||||||
|
|
||||||
|
if (dev->ide < IDE_BUS_MAX) {
|
||||||
|
config->io[1].base = config->io[0].base + 0x206; /* status port apparently fixed */
|
||||||
|
ide_pnp_config_changed(0, config, (void *) (int) dev->ide);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case 5:
|
case 5:
|
||||||
if (config->activate && (config->io[0].base != ISAPNP_IO_DISABLED)) {
|
if (config->activate && (config->io[0].base != ISAPNP_IO_DISABLED)) {
|
||||||
um8669f_log("UM8669F: Game port enabled at port %04X\n", config->io[0].base);
|
um8669f_log("UM8669F: Game port enabled at port %04X\n", config->io[0].base);
|
||||||
@@ -252,6 +271,9 @@ um8669f_reset(um8669f_t *dev)
|
|||||||
|
|
||||||
lpt1_remove();
|
lpt1_remove();
|
||||||
|
|
||||||
|
if (dev->ide < IDE_BUS_MAX)
|
||||||
|
ide_remove_handlers(dev->ide);
|
||||||
|
|
||||||
isapnp_enable_card(dev->pnp_card, ISAPNP_CARD_DISABLE);
|
isapnp_enable_card(dev->pnp_card, ISAPNP_CARD_DISABLE);
|
||||||
|
|
||||||
dev->locked = 1;
|
dev->locked = 1;
|
||||||
@@ -270,9 +292,9 @@ um8669f_close(void *priv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
um8669f_init(UNUSED(const device_t *info))
|
um8669f_init(const device_t *info)
|
||||||
{
|
{
|
||||||
um8669f_log("UM8669F: init()\n");
|
um8669f_log("UM8669F: init(%02X)\n", info->local);
|
||||||
|
|
||||||
um8669f_t *dev = (um8669f_t *) malloc(sizeof(um8669f_t));
|
um8669f_t *dev = (um8669f_t *) malloc(sizeof(um8669f_t));
|
||||||
memset(dev, 0, sizeof(um8669f_t));
|
memset(dev, 0, sizeof(um8669f_t));
|
||||||
@@ -286,6 +308,10 @@ um8669f_init(UNUSED(const device_t *info))
|
|||||||
dev->uart[0] = device_add_inst(&ns16550_device, 1);
|
dev->uart[0] = device_add_inst(&ns16550_device, 1);
|
||||||
dev->uart[1] = device_add_inst(&ns16550_device, 2);
|
dev->uart[1] = device_add_inst(&ns16550_device, 2);
|
||||||
|
|
||||||
|
dev->ide = info->local;
|
||||||
|
if (dev->ide < IDE_BUS_MAX)
|
||||||
|
device_add(&ide_isa_device);
|
||||||
|
|
||||||
dev->gameport = gameport_add(&gameport_sio_device);
|
dev->gameport = gameport_add(&gameport_sio_device);
|
||||||
|
|
||||||
io_sethandler(0x0108, 0x0002,
|
io_sethandler(0x0108, 0x0002,
|
||||||
@@ -300,6 +326,20 @@ const device_t um8669f_device = {
|
|||||||
.name = "UMC UM8669F Super I/O",
|
.name = "UMC UM8669F Super I/O",
|
||||||
.internal_name = "um8669f",
|
.internal_name = "um8669f",
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
|
.local = 0xff,
|
||||||
|
.init = um8669f_init,
|
||||||
|
.close = um8669f_close,
|
||||||
|
.reset = NULL,
|
||||||
|
{ .available = NULL },
|
||||||
|
.speed_changed = NULL,
|
||||||
|
.force_redraw = NULL,
|
||||||
|
.config = NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
const device_t um8669f_ide_device = {
|
||||||
|
.name = "UMC UM8669F Super I/O (With IDE)",
|
||||||
|
.internal_name = "um8669f_ide",
|
||||||
|
.flags = 0,
|
||||||
.local = 0,
|
.local = 0,
|
||||||
.init = um8669f_init,
|
.init = um8669f_init,
|
||||||
.close = um8669f_close,
|
.close = um8669f_close,
|
||||||
@@ -309,3 +349,17 @@ const device_t um8669f_device = {
|
|||||||
.force_redraw = NULL,
|
.force_redraw = NULL,
|
||||||
.config = NULL
|
.config = NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const device_t um8669f_ide_sec_device = {
|
||||||
|
.name = "UMC UM8669F Super I/O (With Secondary IDE)",
|
||||||
|
.internal_name = "um8669f_ide_sec",
|
||||||
|
.flags = 0,
|
||||||
|
.local = 1,
|
||||||
|
.init = um8669f_init,
|
||||||
|
.close = um8669f_close,
|
||||||
|
.reset = NULL,
|
||||||
|
{ .available = NULL },
|
||||||
|
.speed_changed = NULL,
|
||||||
|
.force_redraw = NULL,
|
||||||
|
.config = NULL
|
||||||
|
};
|
||||||
|
Reference in New Issue
Block a user