18#include "iLink_internal.h"
24extern void (*CallBackFunction)(
int reason,
unsigned int offset,
unsigned int size);
30extern int IntrEventFlag;
32extern const void *RequestHandlers[];
34void UBUFThread(
void *arg)
36 void (*RequestResponseHandler)(
unsigned int header,
volatile unsigned int *buffer,
unsigned int nQuads);
43 unsigned int DataBufferLevel;
45 WaitEventFlag(IntrEventFlag, iLinkEventBusReset | iLinkEventURx, WEF_OR, &ef_bits);
46 ClearEventFlag(IntrEventFlag, ~(iLinkEventBusReset | iLinkEventURx));
48 while ((DataBufferLevel = ILINKRegisterBase->ubufReceiveLevel) > 0) {
49 data = ILINKRegisterBase->ubufReceive;
50 iDEBUG_PRINTF(
"Handling UBUF data... handler: 0x%02lx.\n", (data >> 4) & 0xF);
51 RequestResponseHandler = RequestHandlers[(data >> 4) & 0xF];
52 RequestResponseHandler(data, (
volatile unsigned int *)&ILINKRegisterBase->ubufReceive, DataBufferLevel - 1);
57int GetConsoleIDs(u64 *guid,
char *ModelName)
63 if (
sceCdRI((u8 *)&ilink_id, &stat) < 0 || stat != 0) {
65 DEBUG_PRINTF(
"Error reading console/ILINK ID.\n");
67 *guid = (ilink_id & 0xFFFFFFFF00000000) | ((*(u8 *)&ilink_id) | 0x08004600);
68 if (
sceCdRM(ModelName, &stat) < 0 || stat != 0) {
70 DEBUG_PRINTF(
"Error reading console model name.\n");
79void iLinkDisableIntr(
void)
81 ILINKRegisterBase->intr0Mask = 0;
82 ILINKRegisterBase->intr1Mask = 0;
83 ILINKRegisterBase->intr2Mask = 0;
86 ILINKRegisterBase->intr0 = 0xFFFFFFFF;
87 ILINKRegisterBase->intr1 = 0xFFFFFFFF;
88 ILINKRegisterBase->intr2 = 0xFFFFFFFF;
91void iLinkEnableIntr(
void)
94 ILINKRegisterBase->intr0Mask = iLink_INTR0_CmdRst | iLink_INTR0_PhyRst | iLink_INTR0_RetEx | iLink_INTR0_STO | iLink_INTR0_PBCntR | iLink_INTR0_UResp | iLink_INTR0_URx;
95#ifdef REQ_CHECK_DMAC_STAT
96 ILINKRegisterBase->intr0Mask |= iLink_INTR0_DRFR;
99#ifdef REQ_CHECK_ERRORS
100 ILINKRegisterBase->intr0Mask |= (iLink_INTR0_HdrErr | iLink_INTR0_SntBsyAck);
102 ILINKRegisterBase->intr1Mask = iLink_INTR1_UTD;
105static void ShutDownDMAChannels(
void)
108 ILINKRegisterBase->dmaCtrlSR0 = ILINKRegisterBase->dmaCtrlSR1 = 0;
111 iLinkDMACRegs[0].chcr = iLinkDMACRegs[1].chcr = iLinkDMACRegs[2].chcr = 0;
115 sceDisableDMAChannel(IOP_DMAC_FDMA0);
116 sceDisableDMAChannel(IOP_DMAC_FDMA1);
117 sceDisableDMAChannel(IOP_DMAC_FDMA2);
120int iLinkResetHW(
void)
122 ShutDownDMAChannels();
125 ILINKRegisterBase->UnknownRegister7C = 0x40;
127 ILINKRegisterBase->UnknownRegister7C = 0;
130 if (!(ILINKRegisterBase->ctrl2 & iLink_CTRL2_LPSEn))
131 ILINKRegisterBase->ctrl2 = iLink_CTRL2_LPSEn;
134 while (!(ILINKRegisterBase->ctrl2 & iLink_CTRL2_SOK))
140void iLinkShutdownHW(
void)
142 ShutDownDMAChannels();
143 ILINKRegisterBase->ctrl2 &= (~iLink_CTRL2_LPSEn);
146void iLinkHWInitialize(
void)
148 iLinkPHY_SetLCTRL(0);
152 ILINKRegisterBase->ctrl0 = iLink_CTRL0_TxRst | iLink_CTRL0_RxRst | iLink_CTRL0_RcvSelfID | iLink_CTRL0_BusIDRst | iLink_CTRL0_CycTmrEn | iLink_CTRL0_RetLim(0x0F) | iLink_CTRL0_DELim(3);
153 while (ILINKRegisterBase->ctrl0 & (iLink_CTRL0_RxRst | iLink_CTRL0_TxRst)) {};
155 ILINKRegisterBase->ubufTransmitClear = 0;
156 ILINKRegisterBase->ubufReceiveClear = 0;
158 ILINKRegisterBase->dbufFIFO_lvlR0 = DBUF_FIFO_RESET_TX | DBUF_FIFO_RESET_RX;
159 ILINKRegisterBase->dbufFIFO_lvlR1 = DBUF_FIFO_RESET_TX | DBUF_FIFO_RESET_RX;
164 iLinkWritePhy(5, iLinkReadPhy(5) | REG05_EN_ACCL | REG05_EN_MULTI);
167 sceEnableDMAChannel(IOP_DMAC_FDMA0);
168 sceEnableDMAChannel(IOP_DMAC_FDMA2);
170 GenerationNumber = 0;
171 NodeCapabilities = 0;
174void iLinkEnableCMaster(
void)
176 ILINKRegisterBase->ctrl0 |= iLink_CTRL0_CMstr;
179void iLinkBusEnable(
void)
181 ILINKRegisterBase->ctrl0 |= (iLink_CTRL0_RxEn | iLink_CTRL0_TxEn);
184void *malloc(
unsigned int nBytes)
190 result = AllocSysMemory(ALLOC_FIRST, nBytes, NULL);
196void free(
void *buffer)
201 FreeSysMemory(buffer);
int CpuResumeIntr(int state)
int CpuSuspendIntr(int *state)
int sceCdRM(char *buffer, u32 *status)
int sceCdRI(u8 *buffer, u32 *result)