23#include "iLink_internal.h"
25#define MODNAME "iLINK_HW_Manager"
26IRX_ID(MODNAME, 0x00, 0x98);
33extern unsigned int *ConfigurationROM;
34void (*CallBackFunction)(
int reason,
unsigned int offset,
unsigned int size);
37char ConsoleModelName[32];
39unsigned short int LocalNodeID;
41extern int GenerationNumber;
43extern int NodeCapabilities;
45int IntrEventFlag, UBUFTxSema, UBUFThreadID;
47extern unsigned char IsBusRoot;
59#ifdef REQ_CHECK_CONSOLE_VERSION
60static inline unsigned int GetBIOSVersion(
void)
65 fd = open(
"rom0:ROMVER", O_RDONLY);
66 read(fd, romver_str, 4);
70 return strtoul(romver_str, NULL, 16);
74int _start(
int argc,
char *argv[])
82 DEBUG_PRINTF(
"iLink driver version 0.98H\n");
84#ifdef REQ_CHECK_CONSOLE_VERSION
85 if (GetBIOSVersion() > 0x160) {
86 printf(
"Unsupported console detected. Not loading.\n");
87 return MODULE_NO_RESIDENT_END;
93 if ((result = iLinkResetHW()) < 0) {
94 DEBUG_PRINTF(
"Error occurred while resetting i.Link hardware. Code: %d\n", result);
95 return MODULE_NO_RESIDENT_END;
100 DEBUG_PRINTF(
"Initializing Configuration ROM...\n");
102 memset(ConsoleModelName, 0,
sizeof(ConsoleModelName));
104 GetConsoleIDs(&ConsoleGUID, ConsoleModelName);
105 DEBUG_PRINTF(
"Console GUID: 0x%08lx %08lx, ModelName: %s.\n", (u32)(ConsoleGUID >> 32), (u32)ConsoleGUID, ConsoleModelName);
107 InitializeConfigurationROM();
109 CallBackFunction = NULL;
110 IntrEventFlag = CreateEventFlag(&EventFlagData);
111 UBUFTxSema = CreateMutex(IOP_MUTEX_UNLOCKED);
113 ThreadData.attr = TH_C;
114 ThreadData.option = 0;
115 ThreadData.thread = &UBUFThread;
116 ThreadData.stacksize = 0x350;
117 ThreadData.priority = 0x60;
119 StartThread(UBUFThreadID = CreateThread(&ThreadData), NULL);
124 for (i = 0; i < MAX_CONCURRENT_TRANSACTIONS; i++)
125 TransactionContexts[i].IsConnected = 0;
127 DEBUG_PRINTF(
"Initialization complete.\n");
129 return ((RegisterLibraryEntries(&_exp_iLinkman) != 0) ? MODULE_NO_RESIDENT_END : MODULE_RESIDENT_END);
132int _exit(
int argc,
char *argv[])
140 ReleaseLibraryEntries(&_exp_iLinkman);
143 TerminateThread(UBUFThreadID);
144 DeleteThread(UBUFThreadID);
145 DeleteSema(UBUFTxSema);
146 DeleteEventFlag(IntrEventFlag);
149 FreeSysMemory(ConfigurationROM);
151 return MODULE_RESIDENT_END;
154int iLinkTrAlloc(
unsigned short int NodeID,
unsigned char speed)
158 if (NodeID != LocalNodeID) {
161 for (i = 0; i < MAX_CONCURRENT_TRANSACTIONS; i++) {
162 if (TransactionContexts[i].IsConnected == 0) {
163 TransactionContexts[i].NodeID = NodeID;
164 TransactionContexts[i].GenerationNumber = GenerationNumber;
165 TransactionContexts[i].IsConnected = 1;
166 iLinkSetNodeTrSpeed(i, speed);
171 result = (i == MAX_CONCURRENT_TRANSACTIONS) ? (
unsigned int)(-1002) : i;
178void iLinkTrFree(
int trContext)
180 TransactionContexts[trContext].IsConnected = 0;
183int iLinkTrWrite(
int trContext,
unsigned short int offset_high,
unsigned int offset_low,
void *buffer,
unsigned int nBytes)
185 return ((nBytes == 4) ? iLinkWriteReq(&TransactionContexts[trContext], offset_high, offset_low, buffer, nBytes) : iLinkWritePHTReq(&TransactionContexts[trContext], offset_high, offset_low, buffer, nBytes));
188int iLinkTrRead(
int trContext,
unsigned short int offset_high,
unsigned int offset_low,
void *buffer,
unsigned int nBytes)
190 return ((nBytes == 4) ? iLinkReadReq(&TransactionContexts[trContext], offset_high, offset_low, buffer, nBytes) : iLinkReadPHTReq(&TransactionContexts[trContext], offset_high, offset_low, buffer, nBytes));
193unsigned int iLinkSetNodeCapabilities(
unsigned int capabilities)
195 NodeCapabilities = capabilities;
198 if (NodeCapabilities & iLink_NODE_CMC)
199 iLinkEnableCMaster();
201 InitializeConfigurationROM();
202 return (NodeCapabilities);
205int iLinkGetGenerationNumber(
void)
207 return (GenerationNumber);
210int iLinkGetLocalNodeID(
void)
212 return (LocalNodeID);
215int iLinkGetNodeCount(
void)
220void iLinkEnableSBus(
void)
222 iLinkPHY_SetLCTRL(1);
227void iLinkDisableSBus(
void)
229 ILINKRegisterBase->ctrl0 &= ~(iLink_CTRL0_RxEn | iLink_CTRL0_TxEn);
232void iLinkResetSBus(
void)
234 ClearEventFlag(IntrEventFlag, ~(iLinkEventBusReady | iLinkEventGotSELFIDs));
236 DEBUG_PRINTF(
"-=Reseting bus=-\n");
240 DEBUG_PRINTF(
"-=Waiting for the serial bus to be ready=-\n");
241 WaitEventFlag(IntrEventFlag, iLinkEventBusReady | iLinkEventGotSELFIDs, WEF_AND, NULL);
242 DEBUG_PRINTF(
"-=Bus reset and ready=-\n");
245void *iLinkSetTrCallbackHandler(
void *function)
249 cb_function = CallBackFunction;
250 CallBackFunction = function;
255static const unsigned char speeds[3] = {
261int iLinkGetNodeTrSpeed(
int trContext)
266 for (i = 0; i < 3; i++) {
267 if (speeds[i] == TransactionContexts[trContext].speed) {
276int iLinkSetNodeTrSpeed(
int trContext,
unsigned char speed)
280 result = iLinkGetNodeTrSpeed(trContext);
288 TransactionContexts[trContext].speed = (speed > (
sizeof(speeds) - 1)) ? speeds[
sizeof(speeds) - 1] : speeds[speed];
293u64 iLinkGetLocalNodeEUI64(
void)
int RegisterIntrHandler(int irq, int mode, int(*handler)(void *), void *arg)
int ReleaseIntrHandler(int irq)
int DisableIntr(int irq, int *res)