Exemple #1
0
void ioInit(void) {
	gIOTerminate = 0;
	gHandlerCount = 0;
	gReqList = NULL;
	gReqEnd = NULL;

	gIOThreadId = 0;

	gQueueSema.init_count = 1;
	gQueueSema.max_count = 1;
	gQueueSema.option = 0;

	gProcSemaId = CreateSema(&gQueueSema);
	gEndSemaId = CreateSema(&gQueueSema);
	gIOPrintfSemaId = CreateSema(&gQueueSema);

	// default custom simple action handler
	ioRegisterHandler(IO_CUSTOM_SIMPLEACTION, &ioSimpleActionHandler);

	gIOThread.attr		= 0;
	gIOThread.stack_size	= THREAD_STACK_SIZE;
	gIOThread.gp_reg	= &_gp;
	gIOThread.func		= &ioWorkerThread;
	gIOThread.stack		= thread_stack;
	gIOThread.initial_priority = 30;

	isIORunning = 1;
	gIOThreadId = CreateThread(&gIOThread);
	StartThread(gIOThreadId, NULL);
}
Exemple #2
0
//-------------------------------------------------------------------------
int _start(int argc, char** argv)
{
	iop_sema_t smp;

	SifInitRpc(0);
#ifdef _NETLOG
	// init netlog
	netlog_init(0, SERVER_UDP_PORT);
	netlog_send("hello from debugger.irx\n");
#endif
	// Starting ntpbserver Remote Procedure Call server
	start_RPC_server();

	// Starting server thread
	start_ServerThread();

	smp.attr = 1;
	smp.initial = 1;
	smp.max = 1;
	smp.option = 0;
	ntpbserver_io_sema = CreateSema(&smp);

	smp.attr = 1;
	smp.initial = 0; // this sema is initialised to 0 !
	smp.max = 1;
	smp.option = 0;
	ntpbserver_cmd_sema = CreateSema(&smp);

	return MODULE_RESIDENT_END;
}
Exemple #3
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;
}
void usb_bulk_command(mass_dev* dev, cbw_packet* packet ) {
	int ret;
	iop_sema_t s;
	usb_callback_data cb_data;

	s.initial = 0;
	s.max = 1;
	s.option = 0;
	s.attr = 0;
	cb_data.semh = CreateSema(&s);

	ret =  UsbBulkTransfer(
		dev->bulkEpO,		//bulk output pipe
		packet,			//data ptr
		31,			//data length
		usb_callback,
		(void*)&cb_data
	);
    
	if (ret != USB_RC_OK) {
		printf("USBHDFSD: Error - sending bulk command %d\n", ret);
	} else {
		WaitSema(cb_data.semh);
	}
	DeleteSema(cb_data.semh);
}
int usb_bulk_get_max_lun(mass_dev* dev) {
	int ret;
	usb_callback_data cb_data;
	iop_sema_t s;
	char max_lun;

	s.initial = 0;
	s.max = 1;
	s.option = 0;
	s.attr = 0;
	cb_data.semh = CreateSema(&s);

	//Call Bulk only mass storage reset
	ret = UsbControlTransfer(
		dev->controlEp, 		//default pipe
		0xA1,
		0xFE,
		0,
		dev->interfaceNumber, //interface number
		1,			//length
		&max_lun,			//data
		usb_callback,
		(void*) &cb_data
		);

	if (ret != USB_RC_OK) {
		printf("USBHDFSD: Error - get_max_lun %d\n", ret);
        max_lun = -ret;
	} else {
		WaitSema(cb_data.semh);
	}
	DeleteSema(cb_data.semh);
	return max_lun;
}
void usb_bulk_clear_halt(mass_dev* dev, int direction) {
	int ret;
	usb_callback_data cb_data;
	iop_sema_t s;
	int endpoint;

	s.initial = 0;
	s.max = 1;
	s.option = 0;
	s.attr = 0;
	cb_data.semh = CreateSema(&s);

	if (direction == 0) {
		endpoint = dev->bulkEpIAddr;
		//endpoint = dev->bulkEpI;
	} else {
		endpoint = dev->bulkEpOAddr;
	}

	ret = UsbClearEndpointFeature(
		dev->controlEp, 		//Config pipe
		0,			//HALT feature
		endpoint,
		usb_callback,
		(void*)&cb_data
		);

	if (ret != USB_RC_OK) {
		printf("USBHDFSD: Error - sending clear halt %d\n", ret);
	} else {
		WaitSema(cb_data.semh);
	}
	DeleteSema(cb_data.semh);
}
Exemple #7
0
void _ps2sdk_alloc_init()
{
    ee_sema_t alloc_sema_struct;
    alloc_sema_struct.init_count = 1;
    alloc_sema_struct.max_count = 1;
    alloc_sema = CreateSema(&alloc_sema_struct);
}
Exemple #8
0
int InitThread(void)
{
	ee_sema_t sema;
	ee_thread_t thread;

	sema.max_count = 255;
	sema.init_count = 0;
	sema.option = (u32)"KernelTopThread";
	if((topSema = CreateSema(&sema)) < 0)
		return -1;

	thread.func = &topThread;
	thread.stack = stack;
	thread.stack_size = sizeof(stack);
	thread.gp_reg = &_gp;
	thread.option = (u32)"KernelTopThread";
	thread.initial_priority = 0;
	if((topId = CreateThread(&thread)) < 0)
	{
		DeleteSema(topSema);
		return -1;
	}

	topArg.requestOut = 0;
	topArg.requestIn = 0;
	StartThread(topId, &topArg);

	ChangeThreadPriority(GetThreadId(), 1);

	return topId;
}
static int WaitValidNetState(int (*checkingFunction)(void)){
	int SemaID, retry_cycles;
	ee_sema_t SemaData;

	// Wait for a valid network status;
	SemaData.option = SemaData.attr = 0;
	SemaData.init_count = 0;
	SemaData.max_count = 1;
	if((SemaID = CreateSema(&SemaData)) < 0)
		return SemaID;

	for(retry_cycles = 0; checkingFunction() == 0; retry_cycles++) {
		SetAlarm(1000 * rmGetHsync(), &EthStatusCheckCb, &SemaID);
		WaitSema(SemaID);

		if(retry_cycles >= 30)	//30s = 30*1000ms
		{
			DeleteSema(SemaID);
			return -1;
		}
	}

	DeleteSema(SemaID);
	return 0;
}
Exemple #10
0
void die(int onsig)
{
    signal(onsig, SIG_IGN);
    CloseDupes();
    Msg_Close();

    if (onsig) {
	if (onsig <= NSIG)
	    WriteError("Terminated on signal %d (%s)", onsig, SigName[onsig]);
	else
	    WriteError("Terminated with error %d", onsig);
    }

    if (do_mailout)
	CreateSema((char *)"mailout");

    t_end = time(NULL);
    Syslog('+', "Send [%6lu] Received [%6lu]", sentbytes, rcvdbytes);
    Syslog(' ', "FTNNNTP finished in %s", t_elapsed(t_start, t_end));

    if (envptr)
	free(envptr);

    ExitClient(onsig);

    msleep(1);      /* For the linker only */
}
Exemple #11
0
/*
 * Check for Zone Mail Hour, return TRUE if it is.
 */
int get_zmh()
{
    struct tm	l_date; 
    char	sstime[6];
    time_t	Now;

    Now = time(NULL);
    gmtime_r(&Now, &l_date);
    snprintf(sstime, 6, "%02d:%02d", l_date.tm_hour, l_date.tm_min);

    if ((strncmp(sstime, TCFG.zmh_start, 5) >= 0) && (strncmp(sstime, TCFG.zmh_end, 5) < 0)) {
	if (!ZMH) {
	    CreateSema((char *)"zmh");
	    Syslog('!', "Start of Zone Mail Hour");
	    ZMH = TRUE;
	}
    } else {
	if (ZMH) {
	    RemoveSema((char *)"zmh");
	    Syslog('!', "End of Zone Mail Hour");
	    ZMH = FALSE;
	}
    }
    return ZMH;
}
Exemple #12
0
int _start(int argc, char **argv)
{
    iop_sema_t sem_info;

    if (RegisterLibraryEntries(&_exp_alloc) != 0)
	return 1;

    // check arguments for a heap_size parameter.
    if (argc > 1) {
	heap_size = strtoul(argv[1], NULL, 0);
    }

    if (!(heap_start = AllocSysMemory(ALLOC_FIRST, heap_size, NULL)))
	return -1;
    heap_end = heap_start + heap_size;
    _heap_ptr = heap_start;

    sem_info.attr = 1;
    sem_info.option = 1;
    sem_info.initial = 1;
    sem_info.max = 1;

    alloc_sema = CreateSema(&sem_info);

    return 0;
}
Exemple #13
0
Ps2File::Ps2File() {
	_fd = -1;
	_fileSize = 0;
	_filePos = 0;
	_cacheSize = 0;
	_cachePos = 0;
	_eof = false;
	_err = false;

	_cacheBuf = (uint8 *)memalign(64, CACHE_SIZE * 2);

	_cacheOpRunning = 0;
	_filePos = _physFilePos = _cachePos = 0;
	_fileSize = _bytesInCache = _cacheOfs = 0;
	_cacheOpRunning = false;
	_readBytesBlock = 0;
	_stream = true;

#ifdef __PS2_FILE_SEMA__
	ee_sema_t newSema;
	newSema.init_count = 1;
	newSema.max_count = 1;
	_sema = CreateSema(&newSema);
	assert(_sema >= 0);
#endif
}
Exemple #14
0
/** Register This driver with usbd.irx */
int PS2CamInitDriver(void)
{
	int				i;
	iop_sema_t		sema;

	printf("PS2 USB Camera Driver v.%d.%d  ((C) www.ps2dev.org)\n",DRIVER_VERSON_MAJOR,DRIVER_VERSON_MINOR);


	memset(&Camera[0],    0, sizeof(Camera)*MAX_CAM_DEVICE       );
	memset(&CamHandle[0], 0, sizeof(Camera)*MAX_CAM_DEVICE_HANDLE);

	for(i=0;i<MAX_CAM_DEVICE_HANDLE;i++)
	{
		CamHandle[i].fd = i+1;
	}

	//setup sema


	sema.initial= 1;
	sema.max	= 1;
	sema.option = 0;
	sema.attr	= 0;
	ps2cam_sema = CreateSema(&sema);


	//connect to usb.irx
	return UsbRegisterDriver(&cam_driver);
}
Exemple #15
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;
}
Exemple #16
0
int SifCallRpc(SifRpcClientData_t *cd, int rpc_number, int mode,
		void *sendbuf, int ssize, void *recvbuf, int rsize,
		SifRpcEndFunc_t endfunc, void *efarg)
{
	ee_sema_t sema;
	SifRpcCallPkt_t *call;

	call = (SifRpcCallPkt_t *)_rpc_get_packet(&_sif_rpc_data);
	if (!call)
		return -E_SIF_PKT_ALLOC;

	cd->hdr.pkt_addr  = call;
	cd->hdr.rpc_id    = call->rpc_id;
	cd->hdr.sema_id   = -1;
	cd->end_function  = endfunc;
	cd->end_param     = efarg;

	call->rpc_number  = rpc_number;
	call->send_size   = ssize;
	call->receive     = recvbuf;
	call->recv_size   = rsize;
	call->rmode       = 1;
	call->pkt_addr    = call;
	call->client      = cd;
	call->server      = cd->server;

	if (!(mode & SIF_RPC_M_NOWBDC)) {
		if (ssize > 0)
			SifWriteBackDCache(sendbuf, ssize);
		if (rsize > 0)
			SifWriteBackDCache(recvbuf, rsize);
	}

	if (mode & SIF_RPC_M_NOWAIT) {
		if (!endfunc)
			call->rmode = 0;

		if (!SifSendCmd(0x8000000a, call, RPC_PACKET_SIZE, sendbuf,
					cd->buff, ssize))
			return -E_SIF_PKT_SEND;

		return 0;
	}

	sema.max_count  = 1;
	sema.init_count = 0;
	cd->hdr.sema_id = CreateSema(&sema);
	if (cd->hdr.sema_id < 0)
		return -E_LIB_SEMA_CREATE;

	if (!SifSendCmd(0x8000000a, call, RPC_PACKET_SIZE, sendbuf,
				cd->buff, ssize))
		return -E_SIF_PKT_SEND;

	WaitSema(cd->hdr.sema_id);
	DeleteSema(cd->hdr.sema_id);

	return 0;
}
Exemple #17
0
/** 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;
}
AsyncFio::AsyncFio(void) {
	_runningOp = NULL;
	memset((int *)_ioSlots, 0, MAX_HANDLES * sizeof(int));
	ee_sema_t newSema;
	newSema.init_count = 1;
	newSema.max_count = 1;
	_ioSema = CreateSema(&newSema);
}
Exemple #19
0
void ioInit(void) {
	gIOTerminate = 0;
	gHandlerCount = 0;
	gReqList = NULL;
	gReqEnd = NULL;
	
	gDispatcherThreadID = 0;
	gIOThreadId = 0;
	
	gQueueSema.init_count = 1;
	gQueueSema.max_count = 1;
	gQueueSema.option = 0;

	gProcSemaId = CreateSema(&gQueueSema);
	gEndSemaId = CreateSema(&gQueueSema);
	gIOPrintfSemaId = CreateSema(&gQueueSema);
	
	ChangeThreadPriority (  GetThreadId (), 29 );

	// default custom simple action handler
	ioRegisterHandler(IO_CUSTOM_SIMPLEACTION, &ioSimpleActionHandler);
	
	memset(&gIOThread, 0, sizeof(gIOThread));
	
	gIOThread.func         = (void *)ioThreadDispatcher;
	gIOThread.stack        = disp_stack;
	gIOThread.stack_size   = THREAD_STACK_SIZE;
	gIOThread.gp_reg       = &_gp;
	gIOThread.initial_priority = 0;
	
	alarmID = SetAlarm( 625, &ioAlarmFunc, NULL); 
	
	// this one manages the thread switching in alarm intervals
	gDispatcherThreadID = CreateThread(&gIOThread);
	StartThread(gDispatcherThreadID, NULL);

	gIOThread.func         = (void *)ioWorkerThread;
	gIOThread.stack        = thread_stack;
	gIOThread.initial_priority = 30;

	isIORunning = 1;
	gIOThreadId = CreateThread(&gIOThread);
	StartThread(gIOThreadId, NULL);
	
	ChangeThreadPriority (  GetThreadId (), 30 );
}
Exemple #20
0
void sceCdSemaInit(void)
{
	struct t_ee_sema semaParam;

	// return if both semaphores are already inited
	if (nCmdSemaId != -1 && sCmdSemaId != -1)
		return;

	semaParam.init_count = 1;
	semaParam.max_count = 1;
	semaParam.option = 0;
	nCmdSemaId = CreateSema(&semaParam);
	sCmdSemaId = CreateSema(&semaParam);

	semaParam.init_count = 0;
	callbackSemaId = CreateSema(&semaParam);

	cbSema = 0;
}
Exemple #21
0
void OSystem_PS2::initMutexes(void) {
	ee_sema_t newSema;
	newSema.init_count = 1;
	newSema.max_count = 1;
	_mutexSema = CreateSema(&newSema);
	for (int i = 0; i < MAX_MUTEXES; i++) {
		_mutex[i].sema = -1;
		_mutex[i].count = _mutex[i].owner = 0;
	}
}
McAccess::McAccess(int port, int slot) {
	_port = port;
	_slot = slot;
	ee_sema_t newSema;
	newSema.init_count = 1;
	newSema.max_count = 1;
	_sema = CreateSema(&newSema);

	assert(mcInit(MC_TYPE_MC) >= 0);
}
Exemple #23
0
static int makeMySem( void )
{
    struct SemaParam sem;

    sem.initCount = 0;
    sem.maxCount = 1;
    sem.attr = AT_THFIFO;

    /* Create semaphore.  */
    return CreateSema(&sem);
}
Exemple #24
0
int hddInit(iop_device_t *f)
{
	iop_sema_t sema;

	sema.attr=1;
	sema.initial=1;
	sema.max=1;
	sema.option=0;
	fioSema=CreateSema(&sema);

	return 0;
}
Exemple #25
0
void sys_init(void)
{
	iop_sema_t sema;

	dbgprintf("sys_init: Initializing (TID: %d)\n", GetThreadId());

	memset(msg_pool, 0, sizeof(msg_pool));

	sema.initial=sema.max=SYS_MAX_MESSAGES;
	sema.attr=sema.option=0;
	MsgCountSema=CreateSema(&sema);
}
FILE *ps2_fopen(const char *fname, const char *mode) {
	if (cacheListSema == -1) {
		ee_sema_t newSema;
		newSema.init_count = 1;
		newSema.max_count = 1;
		cacheListSema = CreateSema(&newSema);
		assert(cacheListSema >= 0);
	}

	printf("ps2_fopen: %s, %s\n", fname, mode);

	if (!checkedPath && g_engine) {
		// are we playing from cd/dvd?
		const char *gameDataPath = ConfMan.get("path").c_str();
		printf("Read TOC dir: %s\n", gameDataPath);
		if (strncmp(gameDataPath, "cdfs:", 5) != 0)
			driveStop(); // no, we aren't. stop the drive. it's noisy.
		// now cache the dir tree
		tocManager.readEntries(gameDataPath);
		checkedPath = true;
	}

	if (((mode[0] != 'r') && (mode[0] != 'w')) || ((mode[1] != '\0') && (mode[1] != 'b'))) {
		printf("unsupported mode \"%s\" for file \"%s\"\n", mode, fname);
		return NULL;
	}

	bool rdOnly = (mode[0] == 'r');

	int64 cacheId = -1;
	if (rdOnly && tocManager.haveEntries())
		cacheId = tocManager.fileExists(fname);

	if (cacheId != 0) {
		Ps2File *file = findInCache(cacheId);
		if (file)
			return (FILE*)file;

		if (rdOnly) {
			bool isAudioFile = strstr(fname, ".bun") || strstr(fname, ".BUN") || strstr(fname, ".Bun");
			file = new Ps2ReadFile(cacheId, isAudioFile);
		} else
			file = new Ps2WriteFile(cacheId);

		if (file->open(fname)) {
			openFileCount++;
			return (FILE*)file;
		} else
			delete file;
	}
	return NULL;
}
int hddInit(iop_device_t *f)
{
	iop_sema_t sema;

	sema.attr=1;
	sema.initial=1;
	sema.max=1;
	sema.option=0;
	fioSema=CreateSema(&sema);

	AddPowerOffHandler(hddPowerOffHandler, 0);
	return 0;
}
Ps2SaveFileManager::Ps2SaveFileManager(OSystem_PS2 *system, Gs2dScreen *screen) {
	_system = system;
	_screen = screen;
	_mc = new McAccess(0, 0);

	_mcDirList = (mcTable*)memalign(64, MAX_MC_ENTRIES * sizeof(mcTable));
	_mcDirName[0] = '\0';
	_mcCheckTime = 0;
	_mcNeedsUpdate = true;

	for (int mcCheckCount = 0; mcCheckCount < 3; mcCheckCount++) {
		/* retry mcGetInfo 3 times. It slows down startup without mc considerably,
		   but cheap 3rd party memory cards apparently fail to get detected once in a while */

		int mcType, mcFree, mcFormat;
		int res = _mc->getInfo(&mcType, &mcFree, &mcFormat);

		if ((res == 0) || (res == -1)) { // mc okay
			_mcPresent = true;
			printf("MC okay, result = %d. Type %d, Free %d, Format %d\n", res, mcType, mcFree, mcFormat);
			checkMainDirectory();
			break;
		} else {
			_mcPresent = false;
			printf("MC failed, not present or not formatted, code %d\n", res);
		}
	}

	// create save thread
	ee_sema_t newSema;
	newSema.init_count = 0;
	newSema.max_count = 1;
	_autoSaveSignal = CreateSema(&newSema);
	_autoSaveBuf = NULL;
	_autoSaveSize = 0;
	_systemQuit = false;

	ee_thread_t saveThread, thisThread;
	ReferThreadStatus(GetThreadId(), &thisThread);

	saveThread.initial_priority = thisThread.current_priority + 1;
	saveThread.stack_size = 8 * 1024;
	_autoSaveStack = malloc(saveThread.stack_size);	
	saveThread.stack  = _autoSaveStack;
	saveThread.func   = (void *)runSaveThread;
	saveThread.gp_reg = &_gp;

	_autoSaveTid = CreateThread(&saveThread);
	assert(_autoSaveTid >= 0);
	StartThread(_autoSaveTid, this);
}
Exemple #29
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;
}
Exemple #30
0
//---------------------------------------------------------------------------
static int _fs_init_lock(void)
{
#ifndef WIN32
	iop_sema_t sp;

	sp.initial = 1;
	sp.max = 1;
	sp.option = 0;
	sp.attr = 0;
	if((_lock_sema_id = CreateSema(&sp)) < 0) { return(-1); }
#endif

	return(0);
}