Play-/Source/iop/Iop_Speed.h

153 lines
3.2 KiB
C
Raw Permalink Normal View History

#pragma once
2021-01-24 19:35:35 -05:00
#include <vector>
2021-02-19 17:40:21 -05:00
#include <functional>
#include "Types.h"
#include "BasicUnion.h"
#include "Convertible.h"
namespace Iop
{
2021-02-15 20:08:31 -05:00
class CIntc;
class CSpeed
{
public:
2021-02-19 17:28:10 -05:00
typedef std::function<void(const uint8*, uint32)> EthernetFrameTxHandler;
2021-02-15 20:08:31 -05:00
CSpeed(CIntc&);
2021-02-19 17:28:10 -05:00
void Reset();
2021-02-19 17:28:10 -05:00
2021-01-25 20:08:21 -05:00
void SetEthernetFrameTxHandler(const EthernetFrameTxHandler&);
void RxEthernetFrame(const uint8*, uint32);
uint32 ReadRegister(uint32);
void WriteRegister(uint32, uint32);
2021-02-19 17:28:10 -05:00
2021-04-01 17:22:33 -04:00
uint32 ReceiveDma(uint8*, uint32, uint32, uint32);
2021-01-24 19:35:35 -05:00
2021-02-25 19:48:25 -05:00
void CountTicks(uint32);
2021-02-28 10:33:07 -05:00
private:
2021-01-25 20:08:21 -05:00
enum SMAP_BD_TX_CTRLSTAT
{
SMAP_BD_TX_READY = 0x8000,
};
2021-02-19 17:28:10 -05:00
2021-02-18 20:02:01 -05:00
enum SMAP_BD_RX_CTRLSTAT
{
SMAP_BD_RX_EMPTY = 0x8000,
};
2021-02-19 17:28:10 -05:00
2021-01-25 20:08:21 -05:00
struct SMAP_BD
{
uint16 ctrlStat;
uint16 reserved;
uint16 length;
uint16 pointer;
};
static_assert(sizeof(SMAP_BD) == 0x8, "Size of SMAP_BD must be 8 bytes.");
enum
{
SMAP_BD_SIZE = 0x00000200,
SMAP_BD_COUNT = SMAP_BD_SIZE / sizeof(SMAP_BD),
};
enum
{
INTR_ATA0 = 0,
INTR_ATA1 = 1,
INTR_SMAP_TXDNV = 2, //DNV = Descriptor not valid
INTR_SMAP_RXDNV = 3,
INTR_SMAP_TXEND = 4,
INTR_SMAP_RXEND = 5,
INTR_SMAP_EMAC3 = 6,
INTR_DVR = 9,
INTR_UART = 12
};
2021-01-25 20:08:21 -05:00
enum
{
REG_REV1 = 0x10000002,
REG_REV3 = 0x10000004,
2021-01-24 19:35:35 -05:00
REG_DMA_CTRL = 0x10000024,
REG_INTR_STAT = 0x10000028,
REG_INTR_MASK = 0x1000002A,
REG_PIO_DIR = 0x1000002C,
REG_PIO_DATA = 0x1000002E,
2021-02-15 20:08:31 -05:00
REG_SMAP_INTR_CLR = 0x10000128,
2021-01-24 14:18:23 -05:00
REG_SMAP_TXFIFO_FRAME_INC = 0x10001010,
2021-02-18 20:02:01 -05:00
REG_SMAP_RXFIFO_RD_PTR = 0x10001034,
REG_SMAP_RXFIFO_FRAME_CNT = 0x1000103C,
REG_SMAP_RXFIFO_FRAME_DEC = 0x10001040,
REG_SMAP_TXFIFO_DATA = 0x10001100,
2021-02-18 20:02:01 -05:00
REG_SMAP_RXFIFO_DATA = 0x10001200,
2021-01-24 14:18:23 -05:00
REG_SMAP_EMAC3_TXMODE0_HI = 0x10002008,
REG_SMAP_EMAC3_TXMODE0_LO = 0x1000200A,
2021-01-30 20:29:35 -05:00
REG_SMAP_EMAC3_ADDR_HI = 0x1000201C,
REG_SMAP_EMAC3_ADDR_LO = 0x10002020,
REG_SMAP_EMAC3_STA_CTRL_HI = 0x1000205C,
REG_SMAP_EMAC3_STA_CTRL_LO = 0x1000205E,
2021-01-24 14:18:23 -05:00
REG_SMAP_BD_TX_BASE = 0x10003000,
REG_SMAP_BD_RX_BASE = 0x10003200,
};
enum REV3_FLAGS
{
SPEED_CAPS_SMAP = 0x01,
SPEED_CAPS_ATA = 0x02,
};
2021-02-19 17:28:10 -05:00
enum SMAP_EMAC3_STA_CMD
{
SMAP_EMAC3_STA_CMD_READ = 0x01,
SMAP_EMAC3_STA_CMD_WRITE = 0x02,
};
2021-02-19 17:28:10 -05:00
struct SMAP_EMAC3_STA_CTRL : public convertible<uint32>
{
uint32 phyRegAddr : 5;
uint32 phyAddr : 5;
uint32 phyOpbClck : 2;
uint32 phyStaCmd : 2;
uint32 phyErrRead : 1;
uint32 phyOpComp : 1;
uint32 phyData : 16;
};
2021-02-19 17:28:10 -05:00
2021-02-15 20:08:31 -05:00
void CheckInterrupts();
2021-01-24 14:18:23 -05:00
void ProcessEmac3StaCtrl();
2021-01-25 20:08:21 -05:00
void HandleTx();
2021-02-19 17:28:10 -05:00
void LogRead(uint32);
void LogWrite(uint32, uint32);
2021-01-24 14:18:23 -05:00
void LogBdRead(const char*, uint32, uint32);
void LogBdWrite(const char*, uint32, uint32, uint32);
2021-01-25 20:08:21 -05:00
EthernetFrameTxHandler m_ethernetFrameTxHandler;
2021-02-19 17:28:10 -05:00
2021-02-15 20:08:31 -05:00
CIntc& m_intc;
2021-02-19 17:28:10 -05:00
2021-02-25 19:48:25 -05:00
bool m_pendingRx = false;
int32 m_rxDelay = 0;
uint32 m_rxIndex = 0;
2021-02-28 10:33:07 -05:00
2021-02-15 20:08:31 -05:00
uint32 m_intrStat = 0;
2021-01-24 14:18:23 -05:00
uint32 m_intrMask = 0;
uint32 m_eepRomReadIndex = 0;
static const uint32 m_eepRomDataSize = 4;
static const uint16 m_eepromData[];
2021-01-24 19:35:35 -05:00
std::vector<uint8> m_txBuffer;
2021-02-19 17:36:10 -05:00
std::vector<uint8> m_rxBuffer;
uint32 m_rxFifoPtr = 0;
uint32 m_rxFrameCount = 0;
2021-01-30 20:29:35 -05:00
uint32 m_smapEmac3AddressHi = 0;
uint32 m_smapEmac3AddressLo = 0;
UNION32_16 m_smapEmac3StaCtrl;
2021-01-24 19:35:35 -05:00
uint8 m_smapBdTx[SMAP_BD_SIZE];
2021-02-18 20:02:01 -05:00
uint8 m_smapBdRx[SMAP_BD_SIZE];
};
}