void uart_init(unsigned n) { switch(n) { case 0: uart_base = MSM_UART1_BASE; break; case 1: uart_base = MSM_UART2_BASE; break; case 2: uart_base = MSM_UART3_BASE; break; } #if UART_NEED_INIT uwr(0x0A, UART_CR); /* disable TX and RX */ uwr(0x30, UART_CR); /* reset error status */ uwr(0x10, UART_CR); /* reset receiver */ uwr(0x20, UART_CR); /* reset transmitter */ //mdelay(100); nopdelay(); /* configuration for 19.2MHz TCXO */ uwr(0xC0, UART_MREG); uwr(0xB2, UART_NREG); uwr(0x7D, UART_DREG); uwr(0x1C, UART_MNDREG); uwr(0x10, UART_CR); /* reset RX */ uwr(0x20, UART_CR); /* reset TX */ uwr(0x30, UART_CR); /* reset error status */ uwr(0x40, UART_CR); /* reset RX break */ uwr(0x70, UART_CR); /* rest? */ uwr(0xD0, UART_CR); /* reset */ uwr(0x7BF, UART_IPR); /* stale timeout = 630 * bitrate */ uwr(0, UART_IMR); uwr(0, UART_RFWR); /* RX watermark = 58 * 2 - 1 */ uwr(0x1E, UART_TFWR); /* TX watermark */ //uwr(0, UART_RFWR); uwr(UART_CSR_115200, UART_CSR); uwr(0, UART_IRDA); uwr(0x1E, UART_HCR); // uwr(0x7F4, UART_MR1); /* RFS/ CTS/ 500chr RFR */ uwr(0, UART_MR1); uwr(0x34, UART_MR2); /* 8N1 */ //mdelay(100); nopdelay(); uwr(0x05, UART_CR); /* enable TX & RX */ //mdelay(100); nopdelay(); #endif }
/* * Initialise padman * a = 0 should work.. */ int padInit(int a) { // Version check isn't used by default // int ver; int i; static int _rb_count = 0; if (_rb_count != _iop_reboot_count) { _rb_count = _iop_reboot_count; padReset(); } if(padInitialised) return 0; padsif[0].server = NULL; padsif[1].server = NULL; do { if (SifBindRpc(&padsif[0], PAD_BIND_RPC_ID1, 0) < 0) { return -1; } nopdelay(); } while(!padsif[0].server); do { if (SifBindRpc(&padsif[1], PAD_BIND_RPC_ID2, 0) < 0) { return -3; } nopdelay(); } while(!padsif[1].server); // If you require a special version of the padman, check for that here (uncomment) // ver = padGetModVersion(); for(i = 0; i<8; i++) { PadState[0][i].open = 0; PadState[0][i].port = 0; PadState[0][i].slot = 0; PadState[1][i].open = 0; PadState[1][i].port = 0; PadState[1][i].slot = 0; } ((u32 *)(&buffer[0]))[0]=PAD_RPCCMD_INIT; ((u32 *)(&buffer[0]))[4]=(u32)openSlot; if (SifCallRpc( &padsif[0], 1, 0, buffer, 128, buffer, 128, NULL, NULL) < 0) return -1; padInitialised = 1; return 0; }
int NetManInitRPCClient(void){ int result; ee_sema_t SemaData; ee_thread_t ThreadData; if(!IsInitialized){ SemaData.max_count=1; SemaData.init_count=1; SemaData.option=SemaData.attr=0; NetManIOSemaID=CreateSema(&SemaData); TxActiveBankID=0; memset(&TxFIFOData1, 0, sizeof(TxFIFOData1)); memset(&TxFIFOData2, 0, sizeof(TxFIFOData2)); CurrentTxFIFOData=UNCACHED_SEG(&TxFIFOData1); SemaData.max_count=1; SemaData.init_count=1; SemaData.option=SemaData.attr=0; TxBankAccessSema=CreateSema(&SemaData); SemaData.max_count=1; SemaData.init_count=1; SemaData.option=SemaData.attr=0; NetManTxSemaID=CreateSema(&SemaData); ThreadData.func=&TxThread; ThreadData.stack=TxThreadStack; ThreadData.stack_size=sizeof(TxThreadStack); ThreadData.gp_reg=&_gp; ThreadData.initial_priority=0x58; ThreadData.attr=ThreadData.option=0; StartThread(TxThreadID=CreateThread(&ThreadData), NULL); while((SifBindRpc(&NETMAN_rpc_cd, NETMAN_RPC_NUMBER, 0)<0)||(NETMAN_rpc_cd.server==NULL)){ nopdelay(); nopdelay(); nopdelay(); nopdelay(); } // ((struct NetManInit*)TransmitBuffer)->AlignmentData=&AlignmentData; if((result=SifCallRpc(&NETMAN_rpc_cd, NETMAN_IOP_RPC_FUNC_INIT, 0, TransmitBuffer, sizeof(struct NetManInit), ReceiveBuffer, sizeof(struct NetManInitResult), NULL, NULL))>=0){ result=((struct NetManInitResult*)ReceiveBuffer)->result; TxFrameTagBuffer=((struct NetManInitResult*)ReceiveBuffer)->FrameTagBuffer; } IsInitialized=1; } else result=0; return result; }
int cdvdInit(int mode) { int i=0,len=0,ret=0; u8 *pkt; cdvdCd.server = NULL; do { if ((ret = SifBindRpc(&cdvdCd, CDVD_INIT_BIND_RPC, 0)) < 0) { return -1; } if (!cdvdCd.server) { nopdelay(); } } while(!cdvdCd.server); pkt = sendBuffer; PUSHDATA( int, pkt, mode, i); pkt += i; len += i; if ((ret = SifCallRpc(&cdvdCd, 0, 0, sendBuffer, len, NULL, 0, 0, 0)) < 0) return -1; cdvdInitialised = 1; return 0; }
int poweroffInit() { int res; static int _init_count = -1; if(_init_count == _iop_reboot_count) return 0; _init_count = _iop_reboot_count; while(((res = SifBindRpc(&cd0, PWROFF_IRX, 0)) >= 0) && (cd0.server == NULL)) nopdelay(); ee_thread_t thread; ee_thread_status_t thisThread; ee_sema_t sema; // Terminate and delete any previously created threads if (powerOffThreadId >= 0) { TerminateThread(powerOffThreadId); DeleteThread(powerOffThreadId); powerOffThreadId = -1; } // Delete any previously created semaphores if (PowerOffSema >= 0) { DeleteSema(PowerOffSema); PowerOffSema = -1; } sema.init_count = 0; sema.max_count = 1; sema.option = 0; PowerOffSema = CreateSema(&sema); ReferThreadStatus(GetThreadId(), &thisThread); if (thisThread.current_priority == 0) { ChangeThreadPriority(GetThreadId(), 51); thread.initial_priority = 50; } else thread.initial_priority = thisThread.current_priority - 1; thread.stack_size = 512 * 16; thread.gp_reg = &_gp; thread.func = PowerOffThread; thread.stack = (void *)poffThreadStack; powerOffThreadId = CreateThread(&thread); StartThread(powerOffThreadId, NULL); DIntr(); SifAddCmdHandler(POFF_SIF_CMD, _poff_intr_callback, NULL); EIntr(); int autoShutdown = 0; SifCallRpc(&cd0, PWROFF_ENABLE_AUTO_SHUTOFF, 0, NULL, 0, &autoShutdown, sizeof(autoShutdown), 0, 0); return res; }
int poweroffInit(void) { ee_thread_t thread; int res; static int _init_count = -1; if(_init_count == _iop_reboot_count) return 0; _init_count = _iop_reboot_count; while(((res = SifBindRpc(&cd0, PWROFF_IRX, 0)) >= 0) && (cd0.server == NULL)) nopdelay(); // Terminate and delete any previously created threads if (powerOffThreadId >= 0) { TerminateThread(powerOffThreadId); DeleteThread(powerOffThreadId); powerOffThreadId = -1; } thread.initial_priority = POWEROFF_THREAD_PRIORITY; thread.stack_size = sizeof(poffThreadStack); thread.gp_reg = &_gp; thread.func = PowerOffThread; thread.stack = (void *)poffThreadStack; thread.option = PWROFF_IRX; thread.attr = 0; powerOffThreadId = CreateThread(&thread); StartThread(powerOffThreadId, NULL); int autoShutdown = 0; SifCallRpc(&cd0, PWROFF_ENABLE_AUTO_SHUTOFF, 0, NULL, 0, &autoShutdown, sizeof(autoShutdown), NULL, NULL); return res; }
/** Initializes audsrv library @returns error code */ int audsrv_init() { int ret; if (initialized) { /* already done */ return 0; } memset(&cd0, '\0', sizeof(cd0)); while (1) { if (SifBindRpc(&cd0, AUDSRV_IRX, 0) < 0) { set_error(AUDSRV_ERR_RPC_FAILED); return -1; } if (cd0.server != 0) { break; } nopdelay(); } ee_sema_t compSema; compSema.init_count = 1; compSema.max_count = 1; compSema.option = 0; completion_sema = CreateSema(&compSema); if (completion_sema < 0) { set_error(AUDSRV_ERR_FAILED_TO_CREATE_SEMA); return -1; } SifCallRpc(&cd0, AUDSRV_INIT, 0, sbuff, 64, sbuff, 64, NULL, NULL); ret = sbuff[0]; if (ret != 0) { set_error(ret); return ret; } /* register a callback handler */ DI(); SifAddCmdHandler(AUDSRV_CDDA_CALLBACK, cdda_stopped, NULL); SifAddCmdHandler(AUDSRV_FILLBUF_CALLBACK, fillbuf_requested, NULL); EI(); /* initialize IOP heap (for adpcm samples) */ SifInitIopHeap(); set_error(AUDSRV_ERR_NOERROR); return AUDSRV_ERR_NOERROR; }
int PS2CamInit(int mode) { // unsigned int i; int ret=0; int *buf; int timeout; if(CamInited)return 0; SifInitRpc(0); timeout = 100000; while (((ret = SifBindRpc(&cdata, PS2_CAM_RPC_ID, 0)) >= 0) && (cdata.server == NULL)) nopdelay(); nopdelay(); if (ret < 0)return ret; buf = (int *)&data[0]; buf[0] = mode; printf("bind done\n"); SifCallRpc(&cdata, PS2CAM_RPC_INITIALIZE, 0, (void*)(&data[0]),4,(void*)(&data[0]),4,0,0); nopdelay(); CamInited = 1; printf("init done\n"); compSema.init_count = 1; compSema.max_count = 1; compSema.option = 0; sem = CreateSema(&compSema); printf("sema done\n"); return buf[0]; }
int PS2CamGetIRXVersion(void) { int *ret; ret = (int *)&data[0]; SifCallRpc(&cdata, PS2CAM_RPC_GETIRXVERSION, 0, (void*)(&data[0]),4,(void*)(&data[0]),4,0,0); nopdelay(); return ret[0]; }
int PS2CamGetDeviceCount(void) { int *ret; ret = (int *)&data[0]; SifCallRpc(&cdata, PS2CAM_RPC_GETDEVCOUNT, 0, (void*)(&data[0]),4,(void*)(&data[0]),4,0,0); nopdelay(); return ret[0]; }
int poweroffInit(void) { ee_thread_t thread; ee_sema_t sema; int res; static int _init_count = -1; if(_init_count == _iop_reboot_count) return 0; _init_count = _iop_reboot_count; while(((res = SifBindRpc(&cd0, PWROFF_IRX, 0)) >= 0) && (cd0.server == NULL)) nopdelay(); // Terminate and delete any previously created threads if (powerOffThreadId >= 0) { TerminateThread(powerOffThreadId); DeleteThread(powerOffThreadId); powerOffThreadId = -1; } // Delete any previously created semaphores if (PowerOffSema >= 0) { DeleteSema(PowerOffSema); PowerOffSema = -1; } sema.init_count = 0; sema.max_count = 1; sema.option = 0; PowerOffSema = CreateSema(&sema); thread.initial_priority = POWEROFF_THREAD_PRIORITY; thread.stack_size = sizeof(poffThreadStack); thread.gp_reg = &_gp; thread.func = PowerOffThread; thread.stack = (void *)poffThreadStack; powerOffThreadId = CreateThread(&thread); StartThread(powerOffThreadId, NULL); DI(); SifAddCmdHandler(POFF_SIF_CMD, _poff_intr_callback, NULL); EI(); int autoShutdown = 0; SifCallRpc(&cd0, PWROFF_ENABLE_AUTO_SHUTOFF, 0, NULL, 0, &autoShutdown, sizeof(autoShutdown), NULL, NULL); return res; }
void ResetAll() { u32 core; volatile u16 *statx; *SD_C_SPDIF_OUT = 0; nopdelay(); *SD_C_SPDIF_OUT = 0x8000; nopdelay(); *U32_REGISTER(0x10F0) |= 0xB0000; for(core=0; core < 2; core++) { VoiceTransIoMode[core] = 0; *U16_REGISTER(0x1B0) = 0; *SD_CORE_ATTR(core) = 0; nopdelay(); *SD_CORE_ATTR(core) = SD_SPU2_ON; *SD_P_MVOLL(core) = 0; *SD_P_MVOLR(core) = 0; statx = U16_REGISTER(0x344 + (core * 1024)); while(*statx & 0x7FF); *SD_A_KOFF_HI(core) = 0xFFFF; *SD_A_KOFF_LO(core) = 0xFFFF; // Should probably only be 0xFF } *SD_S_PMON_HI(1) = 0; *SD_S_PMON_LO(1) = 0; *SD_S_NON_HI(1) = 0; *SD_S_NON_LO(1) = 0; }
int PS2CamGetDeviceStatus(int handle) { int *ret; ret = (int *)&data[0]; ret[0] = handle; SifCallRpc(&cdata, PS2CAM_RPC_GETDEVSTATUS, 0, (void*)(&data[0]),4,(void*)(&data[0]),4,0,0); nopdelay(); return ret[0]; }
int ds3ps2_init() { if (ds3ps2_initialized) return 0; ds3ps2if.server = NULL; do { if (SifBindRpc(&ds3ps2if, DS3PS2_BIND_RPC_ID, 0) < 0) { return -1; } nopdelay(); } while (!ds3ps2if.server); ds3ps2_initialized = 1; return 1; }
int PS2CamSetDeviceBandwidth(int handle, char bandwidth) { int *ret; ret = (int *)&data[0]; ret[0] = handle; ret[1] = bandwidth; SifCallRpc(&cdata, PS2CAM_RPC_SETDEVBANDWIDTH, 0, (void*)(&data[0]),4,(void*)(&data[0]),4,0,0); nopdelay(); return ret[0]; }
int iop_heap_dma_upload(void *src,u32 dst,int size) { int i=0,len=0,size2; u8 *pkt; int ret=0; int ret2=0; int p=0; int cont1=0; while(size>0) // send data with src unaligned { if(size>512) size2=512; else size2=size; CD_memcpy2(memsend,((unsigned char *) src)+p,size2); do { FlushCache(0); /* build packet */ pkt = send_buffer2; PUSHDATA( u32, pkt, (u32)memsend, i); pkt += i; len += i; PUSHDATA( u32, pkt, dst, i); pkt += i; len += i; PUSHDATA( int, pkt, size2, i); pkt += i; len += i; PUSHDATA( int, pkt, 0, i); pkt += i; len += i; ret = SifSetDma((SifDmaTransfer_t*)send_buffer2,1); if(ret==0) {nopdelay();cont1++;} if(ret==0 && cont1>=3) {cont1=0;SifSetDChain();} }while(ret==0); // modificado por Hermes while((ret2 = SifDmaStat(ret))>=0); FlushCache(0); size-=size2; p+=size2; dst+=size2; } return (ret2 < -1); }
int cdInit(int mode) { int i=0,len=0,ret=0; char *pkt; cdvdCd.server = NULL; while(!cdvdCd.server) { if ((ret = SifBindRpc(&cdvdCd, CD_INIT_BIND_RPC, 0)) < 0) return -1; if (!cdvdCd.server) nopdelay(); } pkt = cdRpcBuffer; PUSHDATA( int, pkt, mode, i); pkt += i; len += i; if ((ret = SifCallRpc(&cdvdCd, 0, 0, cdRpcBuffer, len, NULL, 0, 0, 0)) < 0) return -1; cdInitialised = 1; return 0; }
int PS2CamGetDeviceInfo(int handle, PS2CAM_DEVICE_INFO *info) { int *ret; PS2CAM_DEVICE_INFO *iop_info; ret = (int *)&data[0]; iop_info = (PS2CAM_DEVICE_INFO *)&ret[1]; ret[0] = handle; memcpy(iop_info, info, info->ssize); SifCallRpc(&cdata, PS2CAM_RPC_GETDEVINFO, 0, (void*)(&data[0]),info->ssize+4,(void*)(&data[0]),info->ssize+4,0,0); nopdelay(); memcpy(info, iop_info, iop_info->ssize); return ret[0]; }
int fioInit() { int res; ee_sema_t compSema; static int _rb_count = 0; if(_rb_count != _iop_reboot_count) { _rb_count = _iop_reboot_count; if (_fio_completion_sema >= 0) { DeleteSema(_fio_completion_sema); } memset(&_fio_cd, 0, sizeof _fio_cd); _fio_init = 0; } if (_fio_init) return 0; SifInitRpc(0); while (((res = SifBindRpc(&_fio_cd, 0x80000001, 0)) >= 0) && (_fio_cd.server == NULL)) nopdelay(); if (res < 0) return res; compSema.init_count = 1; compSema.max_count = 1; compSema.option = 0; _fio_completion_sema = CreateSema(&compSema); if (_fio_completion_sema < 0) return -E_LIB_SEMA_CREATE; _fio_init = 1; _fio_block_mode = FIO_WAIT; return 0; }
int PS2MouseInit(void) { if(mouse_init) { printf("PS2Mouse Library already initialised\n"); return 0; } mouseif.server = NULL; do { if (SifBindRpc(&mouseif, PS2MOUSE_BIND_RPC_ID, 0) < 0) { return -1; } nopdelay(); } while(!mouseif.server); mouse_init = 1; return 1; }
int PS2KbdInit(void) /* Initialise the keyboard library */ { int res; ee_sema_t kbdSema; while ((res = SifBindRpc(&cd0, PS2KBD_RPC_ID, 0)) < 0) nopdelay(); memset(rpcBuf, 0, 3 * PS2KBD_KEYMAP_SIZE); rpcKey = 0; kbdSema.init_count = 1; kbdSema.max_count = 1; kbdRpcSema = CreateSema(&kbdSema); if (kbdRpcSema >= 0) { kbdInitialized = 1; return 0; } else return -1; }
void InitVoices() { s32 voice, i; volatile u16 *statx; // Set Start Address of data to transfer. *SD_A_TSA_HI(0) = 0; *SD_A_TSA_LO(0) = 0x5000 >> 1; // Fill with data. // First 16 bytes are reserved. for(i = 0; i < 16; i++) *SD_A_STD(0) = VoiceDataInit[i]; // Set Transfer mode to IO *SD_CORE_ATTR(0) = (*SD_CORE_ATTR(0) & ~SD_CORE_DMA) | SD_DMA_IO; statx = U16_REGISTER(0x344); // Wait for transfer to complete; while(*statx & SD_IO_IN_PROCESS); // Reset DMA settings *SD_CORE_ATTR(0) &= ~SD_CORE_DMA; // Init voices for(voice = 0; voice < 24; voice++) { *SD_VP_VOLL(0, voice) = 0; *SD_VP_VOLR(0, voice) = 0; *SD_VP_PITCH(0, voice) = 0x3FFF; *SD_VP_ADSR1(0, voice) = 0; *SD_VP_ADSR2(0, voice) = 0; *SD_VP_VOLL(1, voice) = 0; *SD_VP_VOLR(1, voice) = 0; *SD_VP_PITCH(1, voice) = 0x3FFF; *SD_VP_ADSR1(1, voice) = 0; *SD_VP_ADSR2(1, voice) = 0; // Top address of waveform data *SD_VA_SSA_HI(0, voice) = 0; *SD_VA_SSA_LO(0, voice) = 0x5000 >> 1; *SD_VA_SSA_HI(1, voice) = 0; *SD_VA_SSA_LO(1, voice) = 0x5000 >> 1; } // Set all voices to ON *SD_A_KON_HI(0) = 0xFFFF; *SD_A_KON_LO(0) = 0xFF; *SD_A_KON_HI(1) = 0xFFFF; *SD_A_KON_LO(1) = 0xFF; // There is no guarantee that voices will be turn on at once. // So we wait to make sure. nopdelay(); // Set all voices to OFF *SD_A_KOFF_HI(0) = 0xFFFF; *SD_A_KOFF_LO(0) = 0xFF; *SD_A_KOFF_HI(1) = 0xFFFF; *SD_A_KOFF_LO(1) = 0xFF; // There is no guarantee that voices will be turn off at once. // So we wait to make sure. nopdelay(); *SD_S_ENDX_HI(0) = 0; *SD_S_ENDX_LO(0) = 0; }
int NetManInitRPCClient(void){ static const char NetManID[]="NetMan"; int result; ee_sema_t SemaData; ee_thread_t ThreadData; if(!IsInitialized) { SemaData.max_count=1; SemaData.init_count=1; SemaData.option=(u32)NetManID; SemaData.attr=0; if((NetManIOSemaID=CreateSema(&SemaData)) < 0) { deinitCleanup(); return NetManIOSemaID; } SemaData.max_count=1; SemaData.init_count=1; SemaData.option=(u32)NetManID; SemaData.attr=0; if((NetManTxSemaID=CreateSema(&SemaData)) < 0) { deinitCleanup(); return NetManTxSemaID; } ThreadData.func=&TxThread; ThreadData.stack=TxThreadStack; ThreadData.stack_size=sizeof(TxThreadStack); ThreadData.gp_reg=&_gp; ThreadData.initial_priority=0x57; //I would design this to have a lower priority than the TCP/IP stack, but somehow that results in worse sending performance (I guess because the TCP/IP stack takes quite a bit of runtime). ThreadData.attr=ThreadData.option=0; if((TxThreadID=CreateThread(&ThreadData)) < 0) { deinitCleanup(); return TxThreadID; } if((result = StartThread(TxThreadID, NULL)) < 0) { deinitCleanup(); return result; } while((SifBindRpc(&NETMAN_rpc_cd, NETMAN_RPC_NUMBER, 0)<0)||(NETMAN_rpc_cd.server==NULL)) nopdelay(); if((result=SifCallRpc(&NETMAN_rpc_cd, NETMAN_IOP_RPC_FUNC_INIT, 0, NULL, 0, &ReceiveBuffer, sizeof(s32), NULL, NULL))>=0) { if((result=ReceiveBuffer.result) == 0) IsInitialized=1; else deinitCleanup(); }else{ deinitCleanup(); } } else result=0; return result; }
int audsrv_init() { ee_sema_t compSema; ee_thread_t rpcThread; int ret; if (initialized) { /* already done */ return 0; } memset(&cd0, '\0', sizeof(cd0)); while (1) { if (SifBindRpc(&cd0, AUDSRV_IRX, 0) < 0) { set_error(AUDSRV_ERR_RPC_FAILED); return -1; } if (cd0.server != 0) { break; } nopdelay(); } compSema.init_count = 1; compSema.max_count = 1; compSema.option = 0; completion_sema = CreateSema(&compSema); if (completion_sema < 0) { set_error(AUDSRV_ERR_FAILED_TO_CREATE_SEMA); return -1; } /* Create RPC server */ rpcThread.attr = 0; rpcThread.option = 0; rpcThread.func = &rpc_server_thread; rpcThread.stack = rpc_server_stack; rpcThread.stack_size = sizeof(rpc_server_stack); rpcThread.gp_reg = &_gp; rpcThread.initial_priority = 0x60; rpc_server_thread_id = CreateThread(&rpcThread); StartThread(rpc_server_thread_id, NULL); SifCallRpc(&cd0, AUDSRV_INIT, 0, sbuff, 64, sbuff, 64, NULL, NULL); ret = sbuff[0]; if (ret != 0) { set_error(ret); return ret; } /* initialize IOP heap (for adpcm samples) */ SifInitIopHeap(); set_error(AUDSRV_ERR_NOERROR); return AUDSRV_ERR_NOERROR; }
int NetManInitRPCClient(void){ static const char NetManID[]="NetMan"; int result; ee_sema_t SemaData; ee_thread_t ThreadData; if(!IsInitialized){ memset(&TxFIFOData1, 0, sizeof(TxFIFOData1)); memset(&TxFIFOData2, 0, sizeof(TxFIFOData2)); TxFIFOData1.FrameBuffer = memalign(64, (MAX_FRAME_SIZE*NETMAN_RPC_BLOCK_SIZE+0x3F)&~0x3F); TxFIFOData2.FrameBuffer = memalign(64, (MAX_FRAME_SIZE*NETMAN_RPC_BLOCK_SIZE+0x3F)&~0x3F); if(TxFIFOData1.FrameBuffer == NULL) return -ENOMEM; if(TxFIFOData2.FrameBuffer == NULL){ deinitCleanup(); return -ENOMEM; } SemaData.max_count=1; SemaData.init_count=1; SemaData.option=(unsigned int)NetManID; SemaData.attr=0; if((NetManIOSemaID=CreateSema(&SemaData)) < 0){ deinitCleanup(); return NetManIOSemaID; } TxActiveBankID=0; CurrentTxFIFOData=UNCACHED_SEG(&TxFIFOData1); SemaData.max_count=1; SemaData.init_count=1; SemaData.option=(unsigned int)NetManID; SemaData.attr=0; if((TxBankAccessSema=CreateSema(&SemaData)) < 0){ deinitCleanup(); return TxBankAccessSema; } SemaData.max_count=1; SemaData.init_count=1; SemaData.option=(unsigned int)NetManID; SemaData.attr=0; if((NetManTxSemaID=CreateSema(&SemaData)) < 0){ deinitCleanup(); return NetManTxSemaID; } ThreadData.func=&TxThread; ThreadData.stack=TxThreadStack; ThreadData.stack_size=sizeof(TxThreadStack); ThreadData.gp_reg=&_gp; ThreadData.initial_priority=0x58; ThreadData.attr=ThreadData.option=0; if((TxThreadID=CreateThread(&ThreadData)) < 0){ deinitCleanup(); return TxThreadID; } if((result = StartThread(TxThreadID, NULL)) < 0){ deinitCleanup(); return result; } while((SifBindRpc(&NETMAN_rpc_cd, NETMAN_RPC_NUMBER, 0)<0)||(NETMAN_rpc_cd.server==NULL)){ nopdelay(); nopdelay(); nopdelay(); nopdelay(); } if((result=SifCallRpc(&NETMAN_rpc_cd, NETMAN_IOP_RPC_FUNC_INIT, 0, NULL, 0, ReceiveBuffer, sizeof(int), NULL, NULL))>=0){ if((result=*(int*)ReceiveBuffer) == 0) IsInitialized=1; else deinitCleanup(); }else{ deinitCleanup(); } } else result=0; return result; }
// init memcard lib // // args: MC_TYPE_MC = use MCSERV/MCMAN // MC_TYPE_XMC = use XMCSERV/XMCMAN // returns: 0 = successful // < 0 = error int mcInit(int type) { int ret=0; static int _rb_count = 0; if(_rb_count != _iop_reboot_count) { _rb_count = _iop_reboot_count; mcReset(); } if(g_mclibInited) return -1; SifInitRpc(0); // set which modules to use g_mcType = type; // bind to mc rpc on iop do { if((ret=SifBindRpc(&g_cdata, 0x80000400, 0)) < 0) { #ifdef MC_DEBUG printf("libmc: bind error\n"); #endif return ret; } if(g_cdata.server == NULL) nopdelay(); } while (g_cdata.server == NULL); // for some reason calling this init sif function with 'mcserv' makes all other // functions not work properly. although NOT calling it means that detecting // whether or not cards are formatted doesnt seem to work :P if(g_mcType == MC_TYPE_MC) { #ifdef MC_DEBUG printf("libmc: using MCMAN & MCSERV\n"); #endif g_descParam.offset=0xFFFFFF27; // call init function if((ret = SifCallRpc(&g_cdata, mcRpcCmd[g_mcType][MC_RPCCMD_INIT], 0, &g_descParam, sizeof(g_descParam), g_rdata, 4, NULL, NULL))>=0) { ret = *(s32*)g_rdata; } else{ // init error #ifdef MC_DEBUG printf("libmc: initialisation error\n"); #endif g_mclibInited = 0; return *(s32*)g_rdata - 100; } } else if(g_mcType == MC_TYPE_XMC) { #ifdef MC_DEBUG printf("libmc: using XMCMAN & XMCSERV\n"); #endif // call init function if((ret = SifCallRpc(&g_cdata, mcRpcCmd[g_mcType][MC_RPCCMD_INIT], 0, &g_descParam, sizeof(g_descParam), g_rdata, 12, NULL, NULL)) < 0) { // init error #ifdef MC_DEBUG printf("libmc: initialisation error\n"); #endif g_mclibInited = 0; return ret - 100; } // check if old version of mcserv loaded if(*(s32*)UNCACHED_SEG(g_rdata+4) < 0x205) { #ifdef MC_DEBUG printf("libmc: mcserv is too old (%x)\n", *(s32*)UNCACHED_SEG(g_rdata+4)); #endif g_mclibInited = 0; return -120; } // check if old version of mcman loaded if(*(s32*)UNCACHED_SEG(g_rdata+8) < 0x206) { #ifdef MC_DEBUG printf("libmc: mcman is too old (%x)\n", *(s32*)UNCACHED_SEG(g_rdata+8)); #endif g_mclibInited = 0; return -121; } ret = *(s32*)UNCACHED_SEG(g_rdata+0); } // successfully inited g_mclibInited = 1; g_currentCmd = 0; return ret; }