diff options
author | 2020-07-13 00:49:55 +0200 | |
---|---|---|
committer | 2020-07-13 00:50:05 +0200 | |
commit | 7f97be53b66347b4a0df73544efcdc4586c880fb (patch) | |
tree | a293c51b8035186a09c4c3280387fe0c02082a76 | |
parent | 920183b7dedaf9e8f4817222481a4c9c9dc35aec (diff) |
-ibm21s850: Added skeleton 21S851 support, hooked it up in midzeus2 to accurately reflect the PHY model used. [Ryan Holtz]
-rw-r--r-- | src/devices/machine/ibm21s850.cpp | 67 | ||||
-rw-r--r-- | src/devices/machine/ibm21s850.h | 90 | ||||
-rw-r--r-- | src/devices/machine/tsb12lv01a.cpp | 14 | ||||
-rw-r--r-- | src/mame/drivers/midzeus.cpp | 10 |
4 files changed, 141 insertions, 40 deletions
diff --git a/src/devices/machine/ibm21s850.cpp b/src/devices/machine/ibm21s850.cpp index fdd8d9c662d..227d997f70f 100644 --- a/src/devices/machine/ibm21s850.cpp +++ b/src/devices/machine/ibm21s850.cpp @@ -2,8 +2,8 @@ // copyright-holders:Ryan Holtz /************************************************************* - IBM 21S850 IEEE 1394 400Mb/s Physical Layer - Transceiver (PHY) + IBM 21S850 IEEE-1394 400Mb/s 1-Port PHY + IBM 21S851 IEEE-1394 400Mb/s 3-Port PHY Skeleton device @@ -17,18 +17,29 @@ #define LOG_UNKNOWNS (1 << 3) #define LOG_ALL (LOG_READS | LOG_WRITES | LOG_UNKNOWNS) -#define VERBOSE (0) +#define VERBOSE (LOG_ALL) #include "logmacro.h" -DEFINE_DEVICE_TYPE(IBM21S850, ibm21s850_device, "ibm21s850", "IBM 21S850 IEEE 1394 PHY") +DEFINE_DEVICE_TYPE(IBM21S850, ibm21s850_device, "ibm21s850", "IBM 21S850 IEEE-1394 1-Port PHY") +DEFINE_DEVICE_TYPE(IBM21S851, ibm21s851_device, "ibm21s851", "IBM 21S850 IEEE-1394 3-Port PHY") -ibm21s850_device::ibm21s850_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, IBM21S850, tag, owner, clock) +ibm21s85x_base_device::ibm21s85x_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, type, tag, owner, clock) , m_reset_cb(*this) { } -void ibm21s850_device::device_start() +ibm21s850_device::ibm21s850_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : ibm21s85x_base_device(mconfig, IBM21S850, tag, owner, clock) +{ +} + +ibm21s851_device::ibm21s851_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : ibm21s85x_base_device(mconfig, IBM21S851, tag, owner, clock) +{ +} + +void ibm21s85x_base_device::device_start() { save_item(NAME(m_regs)); @@ -37,22 +48,40 @@ void ibm21s850_device::device_start() m_reset_cb.resolve_safe(); } -void ibm21s850_device::device_reset() +void ibm21s85x_base_device::device_reset() { memset(m_regs, 0, 0x10); - m_regs[ROOT_OFFS] |= ROOT_MASK; // Root node - m_regs[CABLE_PWR_OFFS] |= CABLE_PWR_MASK; // Cable is powered - m_regs[NUM_PORTS_OFFS] |= 0x01; // 1 port available - m_regs[CONNECTION1_OFFS] |= CONNECTION1_MASK; // Port 1 connected - m_regs[ENV_OFFS] |= 1 << ENV_SHIFT; // Cable PHY environment - m_regs[REG_COUNT_OFFS] |= 0x09; // 9 registers following the standard block on 21S850 - m_regs[ARB_PHASE_OFFS] |= 2 << ARB_PHASE_OFFS; // Normal arbitration phase (we skip bus reset for now) + m_regs[ROOT_OFFS] |= ROOT_MASK; // Root node + m_regs[GAP_COUNT_OFFS] |= 0x3f; // Initial reset value + m_regs[SPEED_OFFS] |= SPEED_400MBIT << SPEED_SHIFT; // 21S850 and 21S851 both indicate maximum 400Mb/s rate + m_regs[ENHANCED_REGS_OFFS] |= ENHANCED_REGS_MASK; // 21S850 and 21S851 both have an enhanced register map + m_regs[CABLE_PWR_OFFS] |= CABLE_PWR_MASK; // Cable is powered + m_regs[CONNECTION1_OFFS] |= CONNECTION1_MASK; // Port 1 connected + m_regs[ARB_PHASE_OFFS] |= PHASE_BUS_RESET << ARB_PHASE_OFFS; // Power up in Bus Reset phase power_on_reset(); } -void ibm21s850_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +void ibm21s850_device::device_reset() +{ + ibm21s85x_base_device::device_reset(); + + m_regs[NUM_PORTS_OFFS] |= 0x01; // 1 port available + m_regs[ENV_OFFS] |= 1 << ENV_SHIFT; // Cable PHY environment + m_regs[REG_COUNT_OFFS] |= 0x09; // 9 registers following the standard block on 21S850 +} + +void ibm21s851_device::device_reset() +{ + ibm21s85x_base_device::device_reset(); + + m_regs[NUM_PORTS_OFFS] |= 0x03; // 3 port available + m_regs[ENV_OFFS] |= 1 << ENV_SHIFT; // Cable PHY environment + m_regs[REG_COUNT_OFFS] |= 0x0b; // 11 registers following the standard block on 21S851 +} + +void ibm21s85x_base_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { if (id == TIMER_RESET) { @@ -69,7 +98,7 @@ void ibm21s850_device::device_timer(emu_timer &timer, device_timer_id id, int pa } } -uint8_t ibm21s850_device::read(offs_t offset) +uint8_t ibm21s85x_base_device::read(offs_t offset) { if (offset < 0x10) { @@ -80,12 +109,12 @@ uint8_t ibm21s850_device::read(offs_t offset) return 0; } -void ibm21s850_device::power_on_reset() +void ibm21s85x_base_device::power_on_reset() { m_reset_timer->adjust(attotime::zero, 0); } -void ibm21s850_device::write(offs_t offset, uint8_t data) +void ibm21s85x_base_device::write(offs_t offset, uint8_t data) { switch (offset) { diff --git a/src/devices/machine/ibm21s850.h b/src/devices/machine/ibm21s850.h index 723f0fdf149..9ed32cb72a1 100644 --- a/src/devices/machine/ibm21s850.h +++ b/src/devices/machine/ibm21s850.h @@ -2,7 +2,7 @@ // copyright-holders:Ryan Holtz /************************************************************* - IBM 21S850 IEEE 1394 400Mb/s Physical Layer + IBM 21S850/1 IEEE 1394 400Mb/s Physical Layer Transceiver (PHY) Skeleton device @@ -14,11 +14,9 @@ #pragma once -class ibm21s850_device : public device_t +class ibm21s85x_base_device : public device_t { public: - ibm21s850_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - uint8_t read(offs_t offset); void write(offs_t offset, uint8_t data); @@ -26,7 +24,9 @@ public: static constexpr feature_type unemulated_features() { return feature::COMMS; } -private: +protected: + ibm21s85x_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + // device-level overrides virtual void device_start() override; virtual void device_reset() override; @@ -36,7 +36,7 @@ private: static const device_timer_id TIMER_RESET = 0; - enum + enum : uint32_t { PHYSICAL_ID_OFFS = 0, PHYSICAL_ID_SHIFT = 2, @@ -60,6 +60,10 @@ private: ENHANCED_REGS_MASK = 0x20, NUM_PORTS_OFFS = 2, NUM_PORTS_MASK = 0x1f, + SPEED_100MBIT = 0, + SPEED_200MBIT = 1, + SPEED_400MBIT = 2, + SPEED_RESERVED = 3, ASTAT1_OFFS = 3, ASTAT1_SHIFT = 6, @@ -74,12 +78,6 @@ private: PEER_SPEED1_OFFS = 3, PEER_SPEED1_MASK = 0x03, - ENV_OFFS = 4, - ENV_SHIFT = 6, - ENV_MASK = 0xc0, - REG_COUNT_OFFS = 4, - REG_COUNT_MASK = 0x3f, - LPS_OFFS = 11, LPS_MASK = 0x80, PHY_DELAY_OFFS = 11, @@ -102,6 +100,10 @@ private: ARB_PHASE_MASK = 0x18, ARB_STATE_OFFS = 12, ARB_STATE_MASK = 0x07, + PHASE_BUS_RESET = 0, + PHASE_TREE_ID = 1, + PHASE_SELF_ID = 2, + PHASE_NORMAL = 3, LP_TEST_EN_OFFS = 13, LP_TEST_EN_MASK = 0x40, @@ -136,11 +138,73 @@ private: uint8_t m_regs[16]; emu_timer *m_reset_timer; - devcb_write_line m_reset_cb; }; +class ibm21s850_device : public ibm21s85x_base_device +{ +public: + ibm21s850_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +private: + virtual void device_reset() override; + + enum : uint32_t + { + ENV_OFFS = 4, + ENV_SHIFT = 6, + ENV_MASK = 0xc0, + REG_COUNT_OFFS = 4, + REG_COUNT_MASK = 0x3f + }; +}; + +class ibm21s851_device : public ibm21s85x_base_device +{ +public: + ibm21s851_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +private: + virtual void device_reset() override; + + enum : uint32_t + { + ASTAT2_OFFS = 4, + ASTAT2_SHIFT = 6, + ASTAT2_MASK = 0xc0, + BSTAT2_OFFS = 4, + BSTAT2_SHIFT = 4, + BSTAT2_MASK = 0x30, + CHILD2_OFFS = 4, + CHILD2_MASK = 0x08, + CONNECTION2_OFFS = 4, + CONNECTION2_MASK = 0x04, + PEER_SPEED2_OFFS = 4, + PEER_SPEED2_MASK = 0x03, + + ASTAT3_OFFS = 5, + ASTAT3_SHIFT = 6, + ASTAT3_MASK = 0xc0, + BSTAT3_OFFS = 5, + BSTAT3_SHIFT = 4, + BSTAT3_MASK = 0x30, + CHILD3_OFFS = 5, + CHILD3_MASK = 0x08, + CONNECTION3_OFFS = 5, + CONNECTION3_MASK = 0x04, + PEER_SPEED3_OFFS = 5, + PEER_SPEED3_MASK = 0x03, + + ENV_OFFS = 6, + ENV_SHIFT = 6, + ENV_MASK = 0xc0, + REG_COUNT_OFFS = 6, + REG_COUNT_MASK = 0x3f + }; +}; + //device type definition DECLARE_DEVICE_TYPE(IBM21S850, ibm21s850_device) +DECLARE_DEVICE_TYPE(IBM21S851, ibm21s851_device) #endif // MAME_MACHINE_IBM21S850_H diff --git a/src/devices/machine/tsb12lv01a.cpp b/src/devices/machine/tsb12lv01a.cpp index cc95714cff2..fff1eda53e6 100644 --- a/src/devices/machine/tsb12lv01a.cpp +++ b/src/devices/machine/tsb12lv01a.cpp @@ -15,9 +15,10 @@ #define LOG_READS (1 << 1) #define LOG_WRITES (1 << 2) #define LOG_UNKNOWNS (1 << 3) -#define LOG_ALL (LOG_READS | LOG_WRITES | LOG_UNKNOWNS) +#define LOG_IRQS (1 << 4) +#define LOG_ALL (LOG_READS | LOG_WRITES | LOG_UNKNOWNS | LOG_IRQS) -#define VERBOSE (0) +#define VERBOSE (LOG_ALL) #include "logmacro.h" DEFINE_DEVICE_TYPE(TSB12LV01A, tsb12lv01a_device, "tsb12lv01a", "TSB12LV01A IEEE 1394 Link Controller") @@ -79,6 +80,7 @@ WRITE_LINE_MEMBER(tsb12lv01a_device::phy_reset_w) void tsb12lv01a_device::set_interrupt(uint32_t bit) { m_int_status |= bit; + LOGMASKED(LOG_IRQS, "Setting IRQ: %08x\n", bit); check_interrupts(); } @@ -90,7 +92,9 @@ void tsb12lv01a_device::check_interrupts() else m_int_status &= ~INT_INT; - m_int_cb((m_int_status & m_int_mask & INT_INT) ? 1 : 0); + const int state = (m_int_status & m_int_mask & INT_INT) ? 1 : 0; + LOGMASKED(LOG_IRQS, "Active IRQs: %08x, %sing IRQ\n", active_bits, state ? "rais" : "lower"); + m_int_cb(state); } void tsb12lv01a_device::reset_tx() @@ -248,6 +252,10 @@ void tsb12lv01a_device::write(offs_t offset, uint32_t data, uint32_t mem_mask) m_phy_access &= ~PHY_PHYRXDATA_MASK; m_phy_access |= m_phy_read_cb(phy_addr); + if (phy_addr == 0) + { + } + m_int_status |= INT_PHYRRX; check_interrupts(); } diff --git a/src/mame/drivers/midzeus.cpp b/src/mame/drivers/midzeus.cpp index a214bf33f2b..578553633bc 100644 --- a/src/mame/drivers/midzeus.cpp +++ b/src/mame/drivers/midzeus.cpp @@ -46,7 +46,7 @@ The Grid v1.2 10/18/2000 #define LOG_DISK_JR (1 << 3) #define LOG_UNKNOWN (1 << 4) -#define VERBOSE (0) +#define VERBOSE (LOG_FIREWIRE) #include "logmacro.h" #define CPU_CLOCK XTAL(60'000'000) @@ -120,7 +120,7 @@ private: required_device<zeus2_device> m_zeus; required_device<tsb12lv01a_device> m_fw_link; - required_device<ibm21s850_device> m_fw_phy; + required_device<ibm21s851_device> m_fw_phy; output_finder<32> m_leds; output_finder<8> m_lamps; }; @@ -1327,13 +1327,13 @@ void midzeus2_state::midzeus2(machine_config &config) m_ioasic->set_yearoffs(99); m_ioasic->set_upper(474); - IBM21S850(config, m_fw_phy, 0); + IBM21S851(config, m_fw_phy, 0); m_fw_phy->reset_cb().set(m_fw_link, FUNC(tsb12lv01a_device::phy_reset_w)); TSB12LV01A(config, m_fw_link, 0); m_fw_link->int_cb().set(FUNC(midzeus2_state::firewire_irq)); - m_fw_link->phy_read().set(m_fw_phy, FUNC(ibm21s850_device::read)); - m_fw_link->phy_write().set(m_fw_phy, FUNC(ibm21s850_device::write)); + m_fw_link->phy_read().set(m_fw_phy, FUNC(ibm21s851_device::read)); + m_fw_link->phy_write().set(m_fw_phy, FUNC(ibm21s851_device::write)); } void midzeus2_state::crusnexo(machine_config &config) |