From 53af4c6390e430bb7ccb7436c07efa07c53f2cb9 Mon Sep 17 00:00:00 2001 From: yz70s Date: Sun, 21 May 2017 23:28:17 +0200 Subject: xbox/chihiro: usb devices are now slot devices [Samuele Zannoli] --- src/mame/drivers/chihiro.cpp | 100 ++++++++++++++++++++++++++++++++---------- src/mame/drivers/xbox.cpp | 18 ++++---- src/mame/includes/xbox_pci.h | 8 +++- src/mame/includes/xbox_usb.h | 36 ++++++++++++++- src/mame/machine/xbox_pci.cpp | 28 +++++++++++- src/mame/machine/xbox_usb.cpp | 38 +++++++++++++--- 6 files changed, 189 insertions(+), 39 deletions(-) diff --git a/src/mame/drivers/chihiro.cpp b/src/mame/drivers/chihiro.cpp index 6a0586a8c40..8dd17281f4c 100644 --- a/src/mame/drivers/chihiro.cpp +++ b/src/mame/drivers/chihiro.cpp @@ -393,7 +393,10 @@ Thanks to Alex, Mr Mudkips, and Philip Burke for this info. //#define LOG_BASEBOARD //#define VERBOSE_MSG -///////////////////////// +/* + * Class declaration for jvs_master + */ + DECLARE_DEVICE_TYPE(JVS_MASTER, jvs_master) class jvs_master : public jvs_host @@ -447,11 +450,13 @@ int jvs_master::received_packet(uint8_t *buffer) return (int)length; } -///////////////////////// +/* + * Class declaration for ohci_hlean2131qc_device + */ DECLARE_DEVICE_TYPE(OHCI_HLEAN2131QC, ohci_hlean2131qc_device) -class ohci_hlean2131qc_device : public device_t, public ohci_function +class ohci_hlean2131qc_device : public device_t, public ohci_function, public device_slot_card_interface { public: ohci_hlean2131qc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); @@ -459,6 +464,7 @@ public: int handle_nonstandard_request(int endpoint, USBSetupPacket *setup) override; int handle_bulk_pid(int endpoint, int pid, uint8_t *buffer, int size) override; void set_region_base(uint8_t *data); + void set_region(const char *_region_tag, int _region_offset); protected: virtual void device_start() override; @@ -482,6 +488,8 @@ private: static const uint8_t strdesc1[]; static const uint8_t strdesc2[]; int maximum_send; + const char *region_tag; + int region_offset; uint8_t *region; struct { @@ -494,11 +502,18 @@ private: } jvs; }; -DEFINE_DEVICE_TYPE(OHCI_HLEAN2131QC, ohci_hlean2131qc_device, "ohci_hlean2131qc", "OHCI Hlean2131qc") +DEFINE_DEVICE_TYPE(OHCI_HLEAN2131QC, ohci_hlean2131qc_device, "ohci_hlean2131qc", "OHCI an2131qc HLE") + +#define MCFG_OHCI_HLEAN2131QC_REGION(_region_tag, _region_offset) \ + downcast(device)->set_region(_region_tag, _region_offset); + +/* + * Class declaration for ohci_hlean2131sc_device + */ DECLARE_DEVICE_TYPE(OHCI_HLEAN2131SC, ohci_hlean2131sc_device) -class ohci_hlean2131sc_device : public device_t, public ohci_function +class ohci_hlean2131sc_device : public device_t, public ohci_function, public device_slot_card_interface { public: ohci_hlean2131sc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); @@ -506,6 +521,7 @@ public: int handle_nonstandard_request(int endpoint, USBSetupPacket *setup) override; int handle_bulk_pid(int endpoint, int pid, uint8_t *buffer, int size) override; void set_region_base(uint8_t *data); + void set_region(const char *_region_tag, int _region_offset); protected: virtual void device_start() override; @@ -524,6 +540,8 @@ private: static const uint8_t strdesc0[]; static const uint8_t strdesc1[]; static const uint8_t strdesc2[]; + const char *region_tag; + int region_offset; uint8_t *region; uint8_t midi_rs232; uint8_t response[256]; @@ -532,7 +550,14 @@ private: int step; }; -DEFINE_DEVICE_TYPE(OHCI_HLEAN2131SC, ohci_hlean2131sc_device, "ohci_hlean2131sc", "OHCI Hlean2131sc") +DEFINE_DEVICE_TYPE(OHCI_HLEAN2131SC, ohci_hlean2131sc_device, "ohci_hlean2131sc", "OHCI an2131sc HLE") + +#define MCFG_OHCI_HLEAN2131SC_REGION(_region_tag, _region_offset) \ + downcast(device)->set_region(_region_tag, _region_offset); + +/* + * Class declaration for chihiro_state + */ class chihiro_state : public xbox_base_state { @@ -783,9 +808,12 @@ const uint8_t ohci_hlean2131qc_device::strdesc2[] = { 0x0E,0x03,0x42,0x00,0x41,0 ohci_hlean2131qc_device::ohci_hlean2131qc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, OHCI_HLEAN2131QC, tag, owner, clock), - ohci_function() + ohci_function(), + device_slot_card_interface(mconfig, *this) { maximum_send = 0; + region_tag = nullptr; + region_offset = 0; region = nullptr; jvs.buffer_in_expected = 0; jvs.buffer_out_used = 0; @@ -821,6 +849,12 @@ void ohci_hlean2131qc_device::set_region_base(uint8_t *data) region = data; } +void ohci_hlean2131qc_device::set_region(const char *_region_tag, int _region_offset) +{ + region_tag = _region_tag; + region_offset = _region_offset; +} + int ohci_hlean2131qc_device::handle_nonstandard_request(int endpoint, USBSetupPacket *setup) { int sense; @@ -1083,6 +1117,9 @@ void ohci_hlean2131qc_device::process_jvs_packet() void ohci_hlean2131qc_device::device_start() { + initialize(machine()); + if (region_tag) + set_region_base(memregion(region_tag)->base() + region_offset); } //pc20 @@ -1101,9 +1138,12 @@ const uint8_t ohci_hlean2131sc_device::strdesc2[] = { 0x0E,0x03,0x42,0x00,0x41,0 ohci_hlean2131sc_device::ohci_hlean2131sc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, OHCI_HLEAN2131SC, tag, owner, clock), - ohci_function() + ohci_function(), + device_slot_card_interface(mconfig, *this) { region = nullptr; + region_tag = nullptr; + region_offset = 0; midi_rs232 = 0; response_size = 0; step = 0; @@ -1114,6 +1154,12 @@ void ohci_hlean2131sc_device::set_region_base(uint8_t *data) region = data; } +void ohci_hlean2131sc_device::set_region(const char *_region_tag, int _region_offset) +{ + region_tag = _region_tag; + region_offset = _region_offset; +} + void ohci_hlean2131sc_device::initialize(running_machine &machine) { ohci_function::initialize(machine); @@ -1403,6 +1449,9 @@ void ohci_hlean2131sc_device::process_packet() void ohci_hlean2131sc_device::device_start() { + initialize(machine()); + if (region_tag) + set_region_base(memregion(region_tag)->base() + region_offset); } // ======================> ide_baseboard_device @@ -1716,9 +1765,6 @@ static INPUT_PORTS_START(chihiro) void chihiro_state::machine_start() { - ohci_hlean2131qc_device *usb_device1; - ohci_hlean2131sc_device *usb_device2; - xbox_base_state::machine_start(); chihiro_devs.ide = machine().device("ide"); chihiro_devs.dimmboard = machine().device("rom_board"); @@ -1737,14 +1783,6 @@ void chihiro_state::machine_start() break; } hack_counter = 0; - usb_device1 = machine().device("ohci_hlean2131qc"); - usb_device1->initialize(machine()); - usb_device1->set_region_base(memregion(":others")->base()); // temporary - machine().device(":pci:02.0")->plug_usb_device(1, usb_device1); // connect - usb_device2 = machine().device("ohci_hlean2131sc"); - usb_device2->initialize(machine()); - usb_device2->set_region_base(memregion(":others")->base() + 0x2080); // temporary - machine().device(":pci:02.0")->plug_usb_device(2, usb_device2); // connect // savestates save_item(NAME(hack_counter)); } @@ -1753,6 +1791,20 @@ static SLOT_INTERFACE_START(ide_baseboard) SLOT_INTERFACE("bb", IDE_BASEBOARD) SLOT_INTERFACE_END +SLOT_INTERFACE_START(usb_baseboard) + SLOT_INTERFACE("an2131qc", OHCI_HLEAN2131QC) + SLOT_INTERFACE("an2131sc", OHCI_HLEAN2131SC) + SLOT_INTERFACE("xbox_controller", OHCI_GAME_CONTROLLER) +SLOT_INTERFACE_END + +static MACHINE_CONFIG_FRAGMENT(an2131qc_configuration) + MCFG_OHCI_HLEAN2131QC_REGION(":others", 0) +MACHINE_CONFIG_END + +static MACHINE_CONFIG_FRAGMENT(an2131sc_configuration) + MCFG_OHCI_HLEAN2131SC_REGION(":others", 0x2080) +MACHINE_CONFIG_END + static MACHINE_CONFIG_DERIVED(chihiro_base, xbox_base) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(chihiro_map) @@ -1764,9 +1816,13 @@ static MACHINE_CONFIG_DERIVED(chihiro_base, xbox_base) MCFG_DEVICE_MODIFY(":pci:09.0:ide:1") MCFG_DEVICE_SLOT_INTERFACE(ide_baseboard, "bb", true) - // next lines are temporary - MCFG_DEVICE_ADD("ohci_hlean2131qc", OHCI_HLEAN2131QC, 0) - MCFG_DEVICE_ADD("ohci_hlean2131sc", OHCI_HLEAN2131SC, 0) + MCFG_USB_PORT_ADD(":pci:02.0:port1", usb_baseboard, "an2131qc", true) + MCFG_SLOT_OPTION_MACHINE_CONFIG("an2131qc", an2131qc_configuration) + MCFG_USB_PORT_ADD(":pci:02.0:port2", usb_baseboard, "an2131sc", true) + MCFG_SLOT_OPTION_MACHINE_CONFIG("an2131sc", an2131sc_configuration) + MCFG_USB_PORT_ADD(":pci:02.0:port3", usb_baseboard, nullptr, false) + MCFG_USB_PORT_ADD(":pci:02.0:port4", usb_baseboard, nullptr, false) + MCFG_DEVICE_ADD("jvs_master", JVS_MASTER, 0) MCFG_SEGA_837_13551_DEVICE_ADD("837_13551", "jvs_master", ":TILT", ":P1", ":P2", ":A0", ":A1", ":A2", ":A3", ":A4", ":A5", ":A6", ":A7", ":OUTPUT") MACHINE_CONFIG_END diff --git a/src/mame/drivers/xbox.cpp b/src/mame/drivers/xbox.cpp index fbbfbe708b5..c0906a553ea 100644 --- a/src/mame/drivers/xbox.cpp +++ b/src/mame/drivers/xbox.cpp @@ -130,15 +130,8 @@ void xbox_state::hack_eeprom() void xbox_state::machine_start() { - ohci_game_controller_device *usb_device; - xbox_base_state::machine_start(); xbox_devs.ide = machine().device("ide"); - usb_device = machine().device("ohci_gamepad"); - if (usb_device != nullptr) { - usb_device->initialize(machine()); - machine().device(":pci:02.0")->plug_usb_device(3, usb_device); // connect to root hub port 3, chihiro needs to use 1 and 2 - } // savestates //save_item(NAME(item)); } @@ -160,6 +153,10 @@ void xbox_state::machine_reset() id[88] |= (1 << 2); // ultra dma mode 2 supported } +SLOT_INTERFACE_START(usb_xbox) + SLOT_INTERFACE("xbox_controller", OHCI_GAME_CONTROLLER) +SLOT_INTERFACE_END + SLOT_INTERFACE_START(xbox_ata_devices) SLOT_INTERFACE("hdd", IDE_HARDDISK) SLOT_INTERFACE("cdrom", ATAPI_CDROM) @@ -175,7 +172,12 @@ static MACHINE_CONFIG_DERIVED(xbox, xbox_base) MCFG_DEVICE_MODIFY(":pci:09.0:ide:1") MCFG_DEVICE_SLOT_INTERFACE(xbox_ata_devices, "cdrom", true) - /* sound hardware */ + MCFG_USB_PORT_ADD(":pci:02.0:port1", usb_xbox, nullptr, false) + MCFG_USB_PORT_ADD(":pci:02.0:port2", usb_xbox, nullptr, false) + MCFG_USB_PORT_ADD(":pci:02.0:port3", usb_xbox, "xbox_controller", false) + MCFG_USB_PORT_ADD(":pci:02.0:port4", usb_xbox, nullptr, false) + +/* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") // MCFG_SOUND_ADD("aysnd", AY8910, MAIN_CLOCK/4) // MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30) diff --git a/src/mame/includes/xbox_pci.h b/src/mame/includes/xbox_pci.h index 7c9f34b5d8d..90418ccc854 100644 --- a/src/mame/includes/xbox_pci.h +++ b/src/mame/includes/xbox_pci.h @@ -114,7 +114,7 @@ extern const device_type MCPX_SMBUS; /* * OHCI USB Controller */ - +class usb_function_device; class mcpx_ohci_device : public pci_device { public: mcpx_ohci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); @@ -129,6 +129,7 @@ public: protected: virtual void device_start() override; virtual void device_reset() override; + virtual void device_config_complete() override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; private: @@ -137,6 +138,11 @@ private: emu_timer *timer; std::function hack_callback; DECLARE_ADDRESS_MAP(ohci_mmio, 32); + struct dev_t { + ohci_function *dev; + int port; + } connecteds[4]; + int connecteds_count; }; extern const device_type MCPX_OHCI; diff --git a/src/mame/includes/xbox_usb.h b/src/mame/includes/xbox_usb.h index bf32b1ad2ab..d70017d756c 100644 --- a/src/mame/includes/xbox_usb.h +++ b/src/mame/includes/xbox_usb.h @@ -340,6 +340,10 @@ struct usb_device_configuration std::forward_list interfaces; }; +/* + * OHCI Usb Controller + */ + class ohci_function; // forward declaration class ohci_usb_controller @@ -397,6 +401,10 @@ private: } ohcist; }; +/* + * Base class for usb devices + */ + class ohci_function { public: ohci_function(); @@ -455,9 +463,35 @@ protected: usb_device_configuration *selected_configuration; }; +/* + * Usb port connector + */ + +class ohci_usb_connector : public device_t, public device_slot_interface +{ +public: + ohci_usb_connector(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + virtual ~ohci_usb_connector(); + + ohci_function *get_device(); + +protected: + virtual void device_start() override; +}; + +extern const device_type OHCI_USB_CONNECTOR; + +#define MCFG_USB_PORT_ADD(_tag, _slot_intf, _def_slot, _fixed) \ + MCFG_DEVICE_ADD(_tag, OHCI_USB_CONNECTOR, 0) \ + MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _fixed) + +/* + * Game controller usb device + */ + DECLARE_DEVICE_TYPE(OHCI_GAME_CONTROLLER, ohci_game_controller_device) -class ohci_game_controller_device : public device_t, public ohci_function +class ohci_game_controller_device : public device_t, public ohci_function, public device_slot_card_interface { public: ohci_game_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); diff --git a/src/mame/machine/xbox_pci.cpp b/src/mame/machine/xbox_pci.cpp index 33b86730cfc..25462638f47 100644 --- a/src/mame/machine/xbox_pci.cpp +++ b/src/mame/machine/xbox_pci.cpp @@ -229,14 +229,15 @@ mcpx_ohci_device::mcpx_ohci_device(const machine_config &mconfig, const char *ta : pci_device(mconfig, MCPX_OHCI, tag, owner, clock), ohci_usb(nullptr), m_interrupt_handler(*this), - timer(nullptr) + timer(nullptr), + connecteds_count(0) { } void mcpx_ohci_device::plug_usb_device(int port, ohci_function *function) { function->set_bus_manager(ohci_usb); - ohci_usb->usb_ohci_plug(port, function); // connect to root hub port 3, chihiro needs to use 1 and 2 + ohci_usb->usb_ohci_plug(port, function); } void mcpx_ohci_device::device_start() @@ -256,6 +257,8 @@ void mcpx_ohci_device::device_start() timer = timer_alloc(0); ohci_usb->set_timer(timer); ohci_usb->start(); + for (int i=0;i < connecteds_count;i++) + plug_usb_device(connecteds[i].port, connecteds[i].dev); } void mcpx_ohci_device::device_reset() @@ -265,6 +268,27 @@ void mcpx_ohci_device::device_reset() ohci_usb->reset(); } +void mcpx_ohci_device::device_config_complete() +{ + char id[8]; + + for (int i = 1; i<=4; i++) + { + sprintf(id, "port%d", i); + ohci_usb_connector *conn = downcast(subdevice(id)); + if (conn) + { + ohci_function *func = conn->get_device(); + if (func) + { + connecteds[connecteds_count].dev = func; + connecteds[connecteds_count].port = i; + connecteds_count++; + } + } + } +} + void mcpx_ohci_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { if (ohci_usb) diff --git a/src/mame/machine/xbox_usb.cpp b/src/mame/machine/xbox_usb.cpp index e8776dce19b..1211991f2e5 100644 --- a/src/mame/machine/xbox_usb.cpp +++ b/src/mame/machine/xbox_usb.cpp @@ -8,7 +8,7 @@ //#define LOG_OHCI /* - * Ohci usb controller + * OHCI usb controller */ #ifdef LOG_OHCI @@ -721,11 +721,9 @@ void ohci_usb_controller::usb_ohci_interrupts() { if (((ohcist.hc_regs[HcInterruptStatus] & ohcist.hc_regs[HcInterruptEnable]) != 0) && ((ohcist.hc_regs[HcInterruptEnable] & MasterInterruptEnable) != 0)) { - //m_interrupt_handler(1); irq_callback(1); } else { - //m_interrupt_handler(0); irq_callback(0); } } @@ -849,8 +847,8 @@ void ohci_usb_controller::usb_ohci_device_address_changed(int old_address, int n } /* -* ohci device base class -*/ + * Base class for usb devices + */ ohci_function::ohci_function() { @@ -1322,6 +1320,35 @@ int ohci_function::execute_transfer(int endpoint, int pid, uint8_t *buffer, int return size; } +/* + * Usb port connector + */ + +DEFINE_DEVICE_TYPE(OHCI_USB_CONNECTOR, ohci_usb_connector, "usb_connector", "Usb Connector Abstraction"); + +ohci_usb_connector::ohci_usb_connector(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, OHCI_USB_CONNECTOR, tag, owner, clock), + device_slot_interface(mconfig, *this) +{ +} + +ohci_usb_connector::~ohci_usb_connector() +{ +} + +void ohci_usb_connector::device_start() +{ +} + +ohci_function* ohci_usb_connector::get_device() +{ + return dynamic_cast(get_card_device()); +} + +/* + * Game controller usb device + */ + INPUT_PORTS_START(xbox_controller) PORT_START("ThumbstickLh") // left analog thumbstick horizontal movement PORT_BIT(0xff, 0x80, IPT_AD_STICK_X) PORT_NAME("ThumbstickLh") PORT_SENSITIVITY(100) PORT_KEYDELTA(1) PORT_MINMAX(0, 0xff) @@ -1391,6 +1418,7 @@ DEFINE_DEVICE_TYPE(OHCI_GAME_CONTROLLER, ohci_game_controller_device, "ohci_gc", ohci_game_controller_device::ohci_game_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, OHCI_GAME_CONTROLLER, tag, owner, clock), ohci_function(), + device_slot_card_interface(mconfig, *this), m_ThumbstickLh(*this, "ThumbstickLh"), m_ThumbstickLv(*this, "ThumbstickLv"), m_ThumbstickRh(*this, "ThumbstickRh"), -- cgit v1.2.3