summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Ryan Holtz <ryan.holtz@arrowheadgs.com>2020-07-13 00:49:55 +0200
committer Ryan Holtz <ryan.holtz@arrowheadgs.com>2020-07-13 00:50:05 +0200
commit7f97be53b66347b4a0df73544efcdc4586c880fb (patch)
treea293c51b8035186a09c4c3280387fe0c02082a76
parent920183b7dedaf9e8f4817222481a4c9c9dc35aec (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.cpp67
-rw-r--r--src/devices/machine/ibm21s850.h90
-rw-r--r--src/devices/machine/tsb12lv01a.cpp14
-rw-r--r--src/mame/drivers/midzeus.cpp10
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)