static int SMapInit ( IPAddr IP, IPAddr NM, IPAddr GW ) { int i; iop_sys_clock_t ClockTicks; dev9IntrDisable ( INTR_BITMSK ); EnableIntr ( IOP_IRQ_DEV9 ); CpuEnableIntr (); UNKN_1464 = 3; if ( ( iSendMutex = CreateMutex ( IOP_MUTEX_UNLOCKED ) ) < 0 ) return 0; if ( ( iSendReqMutex = CreateMutex ( IOP_MUTEX_UNLOCKED ) ) < 0 ) return 0; if ( !SMap_Init () ) return 0; for ( i = 2; i < 7; ++i ) dev9RegisterIntrCb ( i, SMapInterrupt ); USec2SysClock ( TIMER_INTERVAL, &ClockTicks ); SetAlarm ( &ClockTicks, Timer, ( void* )ClockTicks.lo ); netif_add ( &NIF, &IP, &NM, &GW, NULL, SMapIFInit, tcpip_input ); netif_set_default ( &NIF ); return 1; } /* end SMapInit */
u32_t sys_arch_sem_wait(sys_sem_t Sema,u32_t u32Timeout) { //Wait u32Timeout msec for the Sema to receive a signal. dbgprintf("sys_arch_sem_wait: Sema: %d, Timeout: %x (TID: %d)\n",Sema,u32Timeout,GetThreadId()); if(u32Timeout==0) { //Wait with no timeouts. return WaitSema(Sema)==0 ? 0:SYS_ARCH_TIMEOUT; } else if(u32Timeout==1) { //Poll. return PollSema(Sema)==0 ? 0:SYS_ARCH_TIMEOUT; } else { //Use alarm to timeout. iop_sys_clock_t ClockTicks; iop_sys_clock_t Start; iop_sys_clock_t End; int iPID=GetThreadId(); u32_t u32WaitTime; GetSystemTime(&Start); USec2SysClock(u32Timeout*1000,&ClockTicks); SetAlarm(&ClockTicks,TimeoutHandler,(void*)iPID); if(WaitSema(Sema)!=0) { return SYS_ARCH_TIMEOUT; } CancelAlarm(TimeoutHandler,(void*)iPID); GetSystemTime(&End); u32WaitTime=ComputeTimeDiff(&Start,&End); return u32WaitTime<=u32Timeout ? u32WaitTime:u32Timeout; } }
static u32_t sys_arch_mbox_fetch_internal(sys_mbox_t pMBox, void** ppvMSG, u32_t TimeElaspedout, char block) { void *pmsg; u32_t TimeElasped = 0; iop_sys_clock_t ClockTicks; iop_sys_clock_t Start; iop_sys_clock_t End; int result, iPID; if(block){ iPID=GetThreadId(); if(TimeElaspedout > 0) { GetSystemTime(&Start); USec2SysClock(TimeElaspedout * 1000, &ClockTicks); SetAlarm(&ClockTicks, &TimeoutHandler, (void*)iPID); } if((result=ReceiveMbx(&pmsg, pMBox))!= 0) { return(SYS_ARCH_TIMEOUT); } if(TimeElaspedout > 0) { CancelAlarm(TimeoutHandler,(void*)iPID); GetSystemTime(&End); TimeElasped = ComputeTimeDiff(&Start, &End); } } else{ TimeElasped=((result=PollMbx(&pmsg, pMBox))!=0)?SYS_MBOX_EMPTY:0; } if(result==0){ *ppvMSG = ((arch_message *)pmsg)->sys_msg; free_msg((arch_message *) pmsg); } //Return the number of msec waited. return TimeElasped; }
u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout) { //Wait TimeElaspedout msec for the Sema to receive a signal. dbgprintf("sys_arch_sem_wait: Sema: %d, Timeout: %x (TID: %d)\n", *sem, timeout, GetThreadId()); u32_t result; if(timeout==0) { //Wait with no timeouts. result=(WaitSema(*sem)==0)?0:SYS_ARCH_TIMEOUT; } else if(timeout==1) { //Poll. result=(PollSema(*sem)==0)?0:SYS_ARCH_TIMEOUT; } else { //Use alarm to timeout. iop_sys_clock_t ClockTicks; iop_sys_clock_t Start; iop_sys_clock_t End; int iPID=GetThreadId(); u32_t u32WaitTime; GetSystemTime(&Start); USec2SysClock(timeout*1000,&ClockTicks); SetAlarm(&ClockTicks, &TimeoutHandler, (void*)iPID); if(WaitSema(*sem)==0){ CancelAlarm(TimeoutHandler,(void*)iPID); GetSystemTime(&End); u32WaitTime=ComputeTimeDiff(&Start, &End); result=(u32WaitTime<=timeout)?u32WaitTime:timeout; }else result=SYS_ARCH_TIMEOUT; } return result; }
u32_t sys_arch_mbox_fetch(sys_mbox_t pMBox,void** ppvMSG,u32_t u32Timeout) { void *pmsg; u32 u32Time = 0; iop_sys_clock_t ClockTicks; iop_sys_clock_t Start; iop_sys_clock_t End; if(PollMbx(&pmsg, pMBox) != 0) { int iPID=GetThreadId(); if(u32Timeout > 0) { GetSystemTime(&Start); USec2SysClock(u32Timeout * 1000, &ClockTicks); SetAlarm(&ClockTicks, TimeoutHandler, (void*)iPID); } if(ReceiveMbx(&pmsg, pMBox) != 0) { return(SYS_ARCH_TIMEOUT); } if(u32Timeout > 0) { CancelAlarm(TimeoutHandler,(void*)iPID); GetSystemTime(&End); u32Time = ComputeTimeDiff(&Start,&End); } } if(ppvMSG) { *ppvMSG = ((arch_message *) pmsg)->sys_msg; } free_msg((arch_message *) pmsg); //Return the number of msec waited. return u32Time; }