24IRX_ID(
"rmmanx", 2, 4);
27IRX_ID(
"rmman2", 2, 4);
31IRX_ID(
"rmman", 1, 16);
35#define DPRINTF(x...) printf("RMMAN: "x)
40#define RM_EF_EXIT_THREAD 1
41#define RM_EF_EXIT_THREAD_DONE 2
42#define RM_EF_CLOSE_PORT 4
43#define RM_EF_CLOSE_PORT_DONE 8
48#define RM_EE_DATA_TYPE struct rmEEData2
49#define RM_RPCFUNC_END RMMAN2_RPCFUNC_END
50#define RM_RPCFUNC_INIT RMMAN2_RPCFUNC_INIT
51#define RM_RPCFUNC_CLOSE RMMAN2_RPCFUNC_CLOSE
52#define RM_RPCFUNC_OPEN RMMAN2_RPCFUNC_OPEN
53#define RM_RPCFUNC_VERSION RMMAN2_RPCFUNC_VERSION
54#define RM_RPCFUNC_REMOTE2_6 RMMAN2_RPCFUNC_REMOTE2_6
56#define RM_RPC_ID RMMANX_RPC_ID
58#define RM_RPC_ID RMMAN2_RPC_ID
60#define RM_PACKET_CMD(packet) (packet->cmd.u.cmd2)
64#define RM_EE_DATA_TYPE struct rmEEData
65#define RM_RPCFUNC_END RMMAN_RPCFUNC_END
66#define RM_RPCFUNC_INIT RMMAN_RPCFUNC_INIT
67#define RM_RPCFUNC_CLOSE RMMAN_RPCFUNC_CLOSE
68#define RM_RPCFUNC_OPEN RMMAN_RPCFUNC_OPEN
69#define RM_RPCFUNC_VERSION RMMAN_RPCFUNC_VERSION
70#define RM_RPC_ID RMMAN_RPC_ID
71#define RM_PACKET_CMD(packet) (packet->cmd.u.cmd1)
81 RM_EE_DATA_TYPE eeData;
82#ifndef BUILDING_RMMAN2
90 RM_EE_DATA_TYPE *eeBuffer;
91#ifndef BUILDING_RMMAN2
100#ifndef BUILDING_RMMAN2
107#ifdef BUILDING_RMMAN2
108#ifdef BUILDING_RMMANX
118static int portStatus[RM_MAX_PORT];
119static int eventFlagID;
120static int MainThreadID;
121static int IsInitialized;
122static int RpcThreadID;
127static int CreateMainThread(
void);
128static void MainThread(
void *arg);
130#ifndef BUILDING_RMMAN2
135#ifndef BUILDING_RMMAN2
140#ifndef BUILDING_RMMAN2
146int _start(
int argc,
char *argv[])
154#ifdef BUILDING_RMMAN2
155#ifdef BUILDING_RMMANX
156 export_table = &_exp_rmmanx;
158 export_table = &_exp_rmman2;
161 export_table = &_exp_rmman;
164 if(RegisterLibraryEntries(export_table) == 0)
166 result = CreateMainThread() <= 0 ? MODULE_NO_RESIDENT_END : MODULE_RESIDENT_END;
168 else result = MODULE_NO_RESIDENT_END;
180 for (i = 0; i < RM_MAX_PORT; i += 1)
185 EventFlagData.attr = 2;
186 EventFlagData.bits = 0;
187 if((eventFlagID = CreateEventFlag(&EventFlagData)) != 0)
189 ThreadData.attr = TH_C;
190 ThreadData.thread = &MainThread;
191 ThreadData.priority = 0x2E;
192 ThreadData.stacksize = 0x800;
193 if((MainThreadID = CreateThread(&ThreadData)) != 0)
195 StartThread(MainThreadID, NULL);
205int rmmanOpen(
int port,
int slot,
void *buffer)
209 if ((port >= RM_MAX_PORT) || (slot >= RM_MAX_SLOT))
214 if(!((portStatus[port] >> slot) & 1))
217#ifndef BUILDING_RMMAN2
221 pRmData = &
RmData[port][slot];
222#ifndef BUILDING_RMMAN2
223 pRmData->port = port;
224 pRmData->slot = slot;
226 pRmData->state = RM_STATE_EXECCMD;
227 pRmData->reqState = RM_RSTATE_COMPLETE;
228 pRmData->eeBuffer = buffer;
229#ifndef BUILDING_RMMAN2
230 pRmData->currentTask = RM_TASK_QUERY;
231 pRmData->counter = 0;
234#ifndef BUILDING_RMMAN2
238 if((pRmData->eventFlagID = CreateEventFlag(&evf)) != 0)
240 pRmData->powerMode = 0;
241 portStatus[port] |= (1 << slot);
246 portStatus[port] |= (1 << slot);
255int rmmanClose(
int port,
int slot)
259 if ((port >= RM_MAX_PORT) || (slot >= RM_MAX_SLOT))
264 if((portStatus[port] >> slot) & 1)
266#ifndef BUILDING_RMMAN2
270 pRmData = &
RmData[port][slot];
272 if(pRmData->state != RM_STATE_FINDRM)
274 SetEventFlag(pRmData->eventFlagID, RM_EF_EXIT_THREAD);
275 WaitEventFlag(pRmData->eventFlagID, RM_EF_EXIT_THREAD_DONE, WEF_AND|WEF_CLEAR, &bits);
277 if(pRmData->closed != 0)
279 portStatus[port] ^= (1 << slot);
285 portStatus[port] ^= (1 << slot);
289 portStatus[port] ^= (1 << slot);
303 if(IsInitialized != 0)
306 for(port = 0; port < RM_MAX_PORT; port++)
309 for(slot = 0; slot < RM_MAX_SLOT; slot++)
311 if((portStatus[port] >> slot) & 1)
312 rmmanClose(port, slot);
316 SetEventFlag(eventFlagID, RM_EF_EXIT_THREAD);
317 WaitEventFlag(eventFlagID, RM_EF_EXIT_THREAD_DONE, WEF_AND|WEF_CLEAR, &bits);
318 DeleteEventFlag(eventFlagID);
320 if(DeleteThread(eventFlagID) == 0)
334static void MainThread(
void *arg)
345 ReferEventFlagStatus(eventFlagID, &evfInfo);
347 if(evfInfo.
currBits == RM_EF_EXIT_THREAD)
349 SetEventFlag(eventFlagID, RM_EF_EXIT_THREAD_DONE);
353 for(port = 0; port < RM_MAX_PORT; port++)
355 for(slot = 0; slot < RM_MAX_SLOT; slot++)
357 if((portStatus[port] >> slot) & 1)
359#ifndef BUILDING_RMMAN2
360 ReferEventFlagStatus(
RmData[port][slot].eventFlagID, &evfInfo);
362 if(evfInfo.
currBits == RM_EF_CLOSE_PORT)
364 RmData[port][slot].powerMode = 3;
365 if(InitRemote(&
RmData[port][slot]) == 0)
366 RmData[port][slot].closed = 0;
368 RmData[port][slot].closed = 1;
370 SetEventFlag(
RmData[port][slot].eventFlagID, RM_EF_CLOSE_PORT_DONE);
372 HandleTasks(&
RmData[port][slot]);
375 HandleTasks(&
RmData[port][slot]);
385#ifndef BUILDING_RMMAN2
386 switch(
RmData->currentTask)
392 RmData->state = RM_STATE_EXECCMD;
398 RmData->state = RM_STATE_FINDRM;
405 if(InitRemote(
RmData) != 0)
410 HandleRmTaskFailed(
RmData);
414 RmData->state = RM_STATE_STABLE;
415 if(PollRemote(
RmData) != 0)
419 if(
RmData->reqState == RM_RSTATE_BUSY)
420 RmData->reqState = RM_RSTATE_COMPLETE;
422 if(HandleRmTaskFailed(
RmData) == 0 &&
RmData->reqState == RM_RSTATE_BUSY)
423 RmData->reqState = RM_RSTATE_FAILED;
436#ifndef BUILDING_RMMAN2
442 if(RmExecute(
RmData) != 0)
444 if(
RmData->port < RM_MAX_PORT)
446 switch(
RmData->outBuffer[1])
479 RmData->inBuffer[0] = 0x61;
480 RmData->sio2Data.in_size = 7;
481 RmData->sio2Data.out_size = 7;
482 RmData->sio2Data.regdata[1] = 0;
483 RmData->inBuffer[1] = 0x0F;
485 RmData->sio2Data.regdata[0] = (
RmData->sio2Data.regdata[0] & ~3) | (
RmData->port & 3);
486 RmData->sio2Data.regdata[0] = (
RmData->sio2Data.regdata[0] & ~0x000000C0) | 0x40;
487 RmData->sio2Data.regdata[0] = (
RmData->sio2Data.regdata[0] & ~0x0001FF00) | 0x00700;
488 RmData->sio2Data.regdata[0] = (
RmData->sio2Data.regdata[0] & ~0x07FC0000) | 0x001C0000;
490 for(i = 2; i < 7; i++)
499#ifndef BUILDING_RMMAN2
501 return(RmExecute(
RmData) > 0);
506#ifdef BUILDING_RMMANX
507 if (iomanX_devctl(
"dvr_misc:", 0x5668, 0, 0, rmbuf, 0xA) < 0)
509 if (
sceCdApplySCmd(0x1E, 0, 0, rmbuf) == 0 || (rmbuf[0] & 0x80) != 0)
512 RmData->state = RM_STATE_DISCONN;
515#ifdef BUILDING_RMMANX
516 RmData->outBuffer[0] = rmbuf[0];
517 for (i = 1; i < 5; i += 1)
519 RmData->outBuffer[i] = rmbuf[(i - 1) * 2];
521 RmData->outBuffer[4] = rmbuf[8];
523 for (i = 0; i < 4; i += 1)
525 RmData->outBuffer[i] = rmbuf[i + 1];
528 RmData->state = RM_STATE_STABLE;
533#ifndef BUILDING_RMMAN2
538 RmData->inBuffer[0] = 0x61;
539 RmData->inBuffer[1] = 0x04;
540 for(i = 2; i < 7; i++)
550 sio2_rm_transfer_init();
551 sio2_transfer(&
RmData->sio2Data);
552 sio2_transfer_reset();
554 if(((
RmData->sio2Data.stat6c >> 14) & 3) == 0)
568 if(
RmData->counter + 1 < 10)
573 RmData->currentTask = RM_TASK_QUERY;
582 int i, OldState, dmatID;
586 for(i = 0; (
unsigned int)i <
sizeof(
RmData->eeData.data); i++)
592 dmat.src = &
RmData->eeData;
593 dmat.dest = ((
RmData->frame & 1) == 0) ? (u8*)
RmData->eeBuffer : (u8*)
RmData->eeBuffer + 128;
598 dmatID = sceSifSetDma(&dmat, 1);
604#ifndef BUILDING_RMMAN2
608 return(RmExecute(
RmData) > 0);
615 RmData->inBuffer[0] = 0x61;
616 RmData->inBuffer[1] = 0x06;
619 for(i = 3; i < 7; i++)
626static int rmmanVersion(
void)
631#ifdef BUILDING_RMMAN2
632static int rmmanRemote2_6(u8 *res)
634#ifdef BUILDING_RMMANX
642 if ((scmdbuf[0] & 0x80) == 0)
653static void *RmmanRpc_init(
struct rmRpcPacket *packet)
655 RM_PACKET_CMD(packet).result = rmmanInit();
659static void *RmmanRpc_version(
struct rmRpcPacket *packet)
661 RM_PACKET_CMD(packet).result = rmmanVersion();
665static void *RmmanRpc_open(
struct rmRpcPacket *packet)
667#ifndef BUILDING_RMMAN2
668 RM_PACKET_CMD(packet).result = rmmanOpen(RM_PACKET_CMD(packet).port, RM_PACKET_CMD(packet).slot, RM_PACKET_CMD(packet).data);
670 RM_PACKET_CMD(packet).result = rmmanOpen(0, 0, RM_PACKET_CMD(packet).data);
675static void *RmmanRpc_end(
struct rmRpcPacket *packet)
677 RM_PACKET_CMD(packet).result = rmmanEnd();
681static void *RmmanRpc_close(
struct rmRpcPacket *packet)
683#ifndef BUILDING_RMMAN2
684 RM_PACKET_CMD(packet).result = rmmanClose(RM_PACKET_CMD(packet).port, RM_PACKET_CMD(packet).slot);
686 RM_PACKET_CMD(packet).result = rmmanClose(0, 0);
691#ifdef BUILDING_RMMAN2
692static void *RmmanRpc_remote2_6(
struct rmRpcPacket *packet)
694 RM_PACKET_CMD(packet).result = rmmanRemote2_6((u8 *)&(RM_PACKET_CMD(packet).data));
699static void *RpcHandler(
int fno,
void *buffer,
int len)
706 switch(((
struct rmRpcPacket *)buffer)->cmd.command)
709 retBuff = RmmanRpc_end((
struct rmRpcPacket *)buffer);
711 case RM_RPCFUNC_INIT:
712 retBuff = RmmanRpc_init((
struct rmRpcPacket *)buffer);
714 case RM_RPCFUNC_CLOSE:
715 retBuff = RmmanRpc_close((
struct rmRpcPacket *)buffer);
717 case RM_RPCFUNC_OPEN:
718 retBuff = RmmanRpc_open((
struct rmRpcPacket *)buffer);
720 case RM_RPCFUNC_VERSION:
721 retBuff = RmmanRpc_version((
struct rmRpcPacket *)buffer);
723#ifdef BUILDING_RMMAN2
724 case RM_RPCFUNC_REMOTE2_6:
725 retBuff = RmmanRpc_remote2_6((
struct rmRpcPacket *)buffer);
729 DPRINTF(
"invalid function code (%03x)\n", (
unsigned int)((
struct rmRpcPacket *)buffer)->cmd.command);
736static void RpcThread(
void *arg)
740 if(!sceSifCheckInit())
742 DPRINTF(
"yet sif hasn't been init\n");
748 sceSifSetRpcQueue(&RpcDataQueue, GetThreadId());
749 sceSifRegisterRpc(&RpcServerData, RM_RPC_ID, &RpcHandler, &RpcDataBuffer, NULL, NULL, &RpcDataQueue);
750 sceSifRpcLoop(&RpcDataQueue);
753static int CreateMainThread(
void)
758 ThreadData.attr=TH_C;
759 ThreadData.thread=&RpcThread;
760 ThreadData.priority=0x2E;
761 ThreadData.stacksize=0x800;
762 if((RpcThreadID=CreateThread(&ThreadData))!=0)
764 StartThread(RpcThreadID, NULL);
int CpuResumeIntr(int state)
int CpuSuspendIntr(int *state)
int sceCdApplySCmd(u8 cmdNum, const void *inBuff, u16 inBuffSize, void *outBuff)