コード例 #1
0
ファイル: main.c プロジェクト: shadowbladeZ/mload-module
s32 __MLoad_Initialize(u32 *queuehandle)
{
	void *buffer = NULL;
	s32   ret;

	/* Initialize memory heap */
	Mem_Init();

	/* Initialize timer subsystem */
	Timer_Init();

	/* Allocate queue buffer */
	buffer = Mem_Alloc(0x20);
	if (!buffer)
		return IPC_ENOMEM;

	/* Create message queue */
	ret = os_message_queue_create(buffer, 8);
	if (ret < 0)
		return ret;

	/* Enable PPC HW access */
	os_ppc_access(1);

	/* Software interrupt */
	os_software_IRQ(9);

	/* Register devices */
	os_device_register(DEVICE_NAME, ret);

	/* Copy queue handler */
	*queuehandle = ret;

	return 0;
}
コード例 #2
0
ファイル: main.c プロジェクト: kenji-tan/sdhc-module
s32 __SDHC_Initialize(u32 *queuehandle)
{
	void *buffer = NULL;
	s32   ret;

	/* Initialize memory heap */
	Mem_Init();

	/* Initialize timer subsystem */
	Timer_Init();

	/* Allocate queue buffer */
	buffer = Mem_Alloc(0x80);
	if (!buffer)
		return IPC_ENOMEM;

	/* Create message queue */
	ret = os_message_queue_create(buffer, 32);
	if (ret < 0)
		return ret;

	/* Register devices */
	os_device_register(DEVICE_NAME, ret);

	/* Copy queue handler */
	*queuehandle = ret;

	return 0;
}
コード例 #3
0
ファイル: main.c プロジェクト: spacemanspiff/Hermes--cIOS
int main(void)
{

current_port= ((u32) use_usb_port1)!=0;
// changes IOS vector interrupt to crt0.s routine

//swi_mload_led_on();

syscall_base=swi_mload_get_syscall_base();
os_sync_after_write((void *) &syscall_base, 4);

swi_mload_call_func((void *) copy_int_vect, (void *) swi_mload_get_ios_base(), NULL);


heaphandle = os_heap_create(heapspace, sizeof(heapspace));

void* timer1_queuespace = os_heap_alloc(heaphandle, 0x80);

timer1_queuehandle = os_message_queue_create(timer1_queuespace, 32);



    if(tiny_ehci_init()<0) return -1;
	
  
    ehc_loop();

	return 0;
}
コード例 #4
0
ファイル: main.c プロジェクト: spacemanspiff/Hermes--cIOS
int main(void)
{
int n=0x0;
int tid=0;
u32 message;


	heaphandle = os_heap_create(heapspace, sizeof(heapspace));

	void* queuespace = os_heap_alloc(heaphandle, 0x20);

	queuehandle = os_message_queue_create(queuespace, 8);

	os_sync_before_read((void *) 0x13740000, 16 );
	
	 tid=os_create_timer(1000*1000, 1000*1000*1, queuehandle, 0x666);
	 
	 // count to 0
	 *((u32 *) 0x13740000)=0;
	 n=0;

	 
    // create a thread to reset the counter 
	int my_thread_id=os_thread_create( (void *) thread_start, NULL, &thread_stack[1024], 1024, 0x28, 1);

	if(my_thread_id>=0) os_thread_continue(my_thread_id);
	
	while(1)
		{

		n++; // counter ++

		os_message_queue_receive(queuehandle,(void *) &message, 0);
		// here i can receive 0x555 (from thread_start timer) or 0x666 message (from tid timer)
	
		if(message==0x555) n=0;

		os_sync_before_read((void *) 0x13740000, 16 );

		*((u32 *) 0x13740000)=n;
		*((u32 *) 0x13740004)= os_get_thread_id();
		*((u32 *) 0x13740008)= os_thread_get_priority();

		os_sync_after_write((void *) 0x13740000, 16 );

	
		//os_stop_timer(tid);
		//os_restart_timer(tid,1000*500);
		}

	return 0;
}
コード例 #5
0
void init_thread_ehci(void)
{
	disable_EHCI_IRQ();


	ehci1_queuehandle= os_message_queue_create( USB_Alloc(4*32)/*os_heap_alloc(heaphandle, 4*32)*/, 32);

	os_unregister_event_handler(DEV_EHCI);
	os_register_event_handler(DEV_EHCI, ehci1_queuehandle, 0); // register interrupt event handler

	enable_EHCI_IRQ();
	os_software_IRQ(DEV_EHCI);

}
コード例 #6
0
ファイル: timer.c プロジェクト: granberro/uLoader
void Timer_Init(void)
{
	void *queuespace = NULL;

	/* Queue already created */
	if (queuehandle >= 0)
		return;

	/* Create queue */
	queuespace  = Mem_Alloc(0x40);
	queuehandle = os_message_queue_create(queuespace, 16);

	/* Create timer */
	timerId = os_create_timer(1000000, 1, queuehandle, 0x666);

	os_stop_timer(timerId);
}
コード例 #7
0
ファイル: main.c プロジェクト: spacemanspiff/Hermes--cIOS
int thread_start(void)
{
int thread_queuehandle = os_message_queue_create( os_heap_alloc(heaphandle, 0x20), 8);



os_create_timer(1000*1000*10, 1000*1000*10, thread_queuehandle, 0x555);

while(1)
	{
    u32 message;	
 
	os_message_queue_receive(thread_queuehandle, (void*)&message, 0);

	os_message_queue_send(queuehandle,0x555, 0); // send 0x555 message to main thread to reset counter (count 10 seconds and resets)
    
	}


return 0;
}
コード例 #8
0
ファイル: main.c プロジェクト: TCCQ/d2x-cios
s32 __FAT_Initialize(u32 *queuehandle)
{
	/* Heap space */
	//static u32 heapspace[0x8000] ATTRIBUTE_ALIGN(32);
	static u32 heapspace[0x7000] ATTRIBUTE_ALIGN(32);

	void *buffer = NULL;
	s32   ret;

	/* Initialize memory heap */
	ret = Mem_Init(heapspace, sizeof(heapspace));
	if (ret < 0)
		return ret;

	/* Initialize timer subsystem */
	ret = Timer_Init();
	if (ret < 0)
		return ret;

	/* Allocate queue buffer */
	buffer = Mem_Alloc(0x80);
	if (!buffer)
		return IPC_ENOMEM;

	/* Create message queue */
	ret = os_message_queue_create(buffer, 32);
	if (ret < 0)
		return ret;

	/* Register device */
	os_device_register(DEVICE_FAT, ret);
	os_device_register("$", ret);

	/* Copy queue handler */
	*queuehandle = ret;

	return 0;
}
コード例 #9
0
ファイル: main.c プロジェクト: spacemanspiff/Hermes--cIOS
int main(void)
{
int fd,n,mounted=0;
int inited=0;
ipcmessage* message;


	memset(&my_reent, 0, sizeof(struct _reent));
	memset(my_filestr, 0, sizeof(FILE_STRUCT)*5);
	memset(file_table, 0, 4*2*5);

	memset(&dir_state_internal,0,sizeof(DIR_STATE_STRUCT));

	dir_internal.device=0;
	dir_internal.dirStruct=&dir_state_internal;

	

	heaphandle = os_heap_create(heapspace, sizeof(heapspace));

	void* queuespace = os_heap_alloc(heaphandle, 0x20);

	queuehandle = os_message_queue_create(queuespace, 8);

	 void* timer1_queuespace = os_heap_alloc(heaphandle, 0x40);

	timer1_queuehandle = os_message_queue_create(timer1_queuespace, 16);
	timer1_id=os_create_timer(1000*1000, 1, timer1_queuehandle, 0x666);
	os_stop_timer(timer1_id);

	 
	extern DISC_INTERFACE __io_wiisd;
	inited=__io_wiisd.startup();
	msleep(100);

	os_device_register(DEVICE, queuehandle);
	while(1)
		{
		int result = 1;
		int ack = 1;

		os_message_queue_receive(queuehandle,(void *) &message, 0);
		
		switch( message->command )
		{
		
	    case IOS_OPEN:
			{
			result = -6;

                                //debug_printf("%s try open %sfor fd %d\n",DEVICE,message->open.device,message->open.resultfd);
				// Checking device name
				if (0 == strcmp(message->open.device, DEVICE))
                                  {
									result = message->open.resultfd;        
                                  }
				else
				if (0 == strcmp(message->open.device, DEVICE"/log"))
                                  {
								  if(inited && !mounted) 
										mounted=fatMountSimple("sd", &__io_wiisd);

								  if(mounted)
									{
									static char log_name[]="sd:/log000.txt";
									for(n=0;n<5;n++) if(my_filestr[n].inUse==0) break;
									fd=-1;
									if(n!=5)
										{
										my_reent._errno=0;
										fd=_FAT_open_r(&my_reent, &my_filestr[n], log_name, O_CREAT | O_TRUNC | O_RDWR, 0);
										log_name[9]++;
										if(log_name[9]>='9') {log_name[9]='0';log_name[8]++;}
										if(log_name[8]>='9') {log_name[8]='0';log_name[7]++;}
										if(log_name[7]>='9') {log_name[7]='0';log_name[8]='0';log_name[9]='0';}

										}
									
									if(fd<0) result=-1; 
									else 
										{
										result=file_table[n][0]=message->open.resultfd;
										file_table[n][1]= fd;
										}
									}
                        
                                  }
				else if (0 == memcmp(message->open.device, DEVICE"/", sizeof(DEVICE)))
                                        
				{
				if(inited && !mounted) 
					mounted=fatMountSimple("sd", &__io_wiisd);

				if(mounted)
					{
					for(n=0;n<5;n++) if(my_filestr[n].inUse==0) break;
					fd=-1;
					if(n!=5)
						{
						my_reent._errno=0;
						fd=_FAT_open_r(&my_reent, &my_filestr[n], message->open.device+sizeof(DEVICE),
							message->open.mode, 0);	
							
						}

					if(fd<0) result=-1; 
					else 
						{
						result=file_table[n][0]=message->open.resultfd;
						file_table[n][1]= fd;
						}
					}
				}
			
					
			}	
			break;

		case IOS_IOCTLV:
			{
			result = -1;

			ioctlv *vec = message->ioctlv.vector;

                                int i,in = message->ioctlv.num_in,io= message->ioctlv.num_io;
                               
                                os_sync_before_read( vec, (in+io)*sizeof(ioctlv));

                                for(i=0;i<in+io;i++){
                                        os_sync_before_read( vec[i].data, vec[i].len);
                                      
                                }

			#if 0
			// list the directory content to directory.txt
			switch(message->ioctl.command )
				{
				
				case 0xcacafea:
				if(inited && !mounted) 
						mounted=fatMountSimple("sd", &__io_wiisd);

				if(mounted)
					{
					my_reent._errno=0;
					
					result=-666;
					if(_FAT_diropen_r(&my_reent, &dir_internal, "sd:/"))
						{
						static char log_name2[]="sd:/directory.txt";
						char filename[768];

						result = 0;
						my_reent._errno=0;
						fd=_FAT_open_r(&my_reent, &my_filestr[4], log_name2, O_CREAT | O_TRUNC | O_RDWR, 0);
						my_reent._errno=0;
						while(!_FAT_dirnext_r (&my_reent, &dir_internal, filename, &filestat))
							{
							my_reent._errno=0;
							
							if(fd>=0)
								{
								if(filestat.st_mode & S_IFDIR)_FAT_write_r (&my_reent, fd, "[", 1); // es directorio
								_FAT_write_r (&my_reent, fd, filename, strlen(filename));
								if(filestat.st_mode & S_IFDIR)_FAT_write_r (&my_reent, fd, "]", 1); // es directorio
								_FAT_write_r (&my_reent, fd, "\n", 1);
								
								}
							
							}
							my_reent._errno=0;
							if(fd>=0) _FAT_close_r (&my_reent, fd);fd=-1;

						  _FAT_dirclose_r(&my_reent, &dir_internal);
						}

					
					}
				break;
				}
			#endif
				for(i=in;i<in+io;i++){
											os_sync_after_write( vec[i].data, vec[i].len);
									}
			
			}
			break;

		case IOS_CLOSE:
			{
			result = -1;
			if(mounted)
				{
				my_reent._errno=0;
				for(n=0;n<5;n++)
					{
					if(message->fd==file_table[n][0])
						{
						fd=file_table[n][1];
						file_table[n][0]=file_table[n][1]=0;
						_FAT_close_r (&my_reent, fd);
						result = 0;
						break;
						}
					}

				for(n=0;n<5;n++) if(my_filestr[n].inUse!=0) break;
					  
				if(n==5) {fatUnmount ("sd");mounted=0;}
				
				}
				else result=-6;
				
			}	
			break;

		case IOS_READ:
			{
			
			result=-1;
			if(mounted)
				{
				my_reent._errno=0;
				for(n=0;n<5;n++)
					{
					if(message->fd==file_table[n][0])
						{
						fd=file_table[n][1];
						result=_FAT_read_r (&my_reent, fd, message->write.data, message->write.length);
						}
					}
				}
			os_sync_after_write( message->write.data, message->write.length);
			}	
			break;

		case IOS_WRITE:
			{
		
			os_sync_before_read( message->write.data, message->write.length);

			result=-1;
			if(mounted)
				{
				my_reent._errno=0;
				for(n=0;n<5;n++)
					{
					if(message->fd==file_table[n][0])
						{
						fd=file_table[n][1];
						result=_FAT_write_r (&my_reent, fd, message->write.data, message->write.length);
						}
					}
				}		
			}	
			break;

		case IOS_SEEK:
			{
			result=-1;
			if(mounted)
				{
				my_reent._errno=0;
				for(n=0;n<5;n++)
					{
					if(message->fd==file_table[n][0])
						{
						fd=file_table[n][1];
						result=_FAT_seek_r (&my_reent, fd, message->seek.offset, message->seek.origin);
						}
					}
				}		
			}
			break;

		default:
			result=-1;
			break;

		}

		if (ack)
			os_message_queue_ack( (void*)message, result );

		}

	return 0;
}
コード例 #10
0
ファイル: printf.c プロジェクト: spacemanspiff/uLoader
void debug_printf(char *format,...)
{
 #if 1
 va_list	opt;

 static char out[32] ATTRIBUTE_ALIGN(32)=" ";

 int val;

 char *s;

 va_start(opt, format);

 int fd;

int message;

static int one=1;
static u32 buffer[8];
static u32 queuehandle2=-1;

if(one)
	{
	queuehandle2 = os_message_queue_create(buffer, 8);
	one=0;
	}
else
 os_message_queue_receive(queuehandle2, (void *)&message, 0);
internal=internal_debug_printf;
 
 if(internal & 2) goto salir;

 if(index_dev & 1)
	{
	
	if(internal)
		fd = FAT_Open("usb:/ffs_log.txt" ,O_WRONLY | O_APPEND);
	else
		fd=os_open("usb:/ffs_log.txt" ,O_WRONLY | O_APPEND);
	}
else
	{
	
	if(internal)
		fd = FAT_Open("sd:/ffs_log.txt" ,O_WRONLY | O_APPEND);
	else
		fd=os_open("sd:/ffs_log.txt" ,O_WRONLY | O_APPEND);
	}

	

	if(fd<0) goto salir;

 while(format[0])
	{
	if(format[0]!='%') {out[0]=*format++; printf_write(fd, out, strlen(out));}
	else
		{
		format++;
		switch(format[0])
			{
			case 'd':
			case 'i':
				val=va_arg(opt,int);
				int_char(val);
				
				printf_write(fd, mem_cad, strlen(mem_cad));
				
				break;

			case 'u':
				val=va_arg(opt, unsigned);
				uint_char(val);
				
				//printf_write(fd, mem_cad, strlen(mem_cad));
				printf_write(fd, mem_cad, strlen(mem_cad));
				
				break;

			case 'x':
				val=va_arg(opt,int);
                hex_char((u32) val);
				printf_write(fd, mem_cad, strlen(mem_cad));
				
				break;

			case 's':
				s=va_arg(opt,char *);
				printf_write(fd, s, strlen(s));
				break;

			}
		 format++;
		}
	
	}
   
	va_end(opt);
if(internal)
	FAT_Close(fd);
else
	os_close(fd);

salir:
	os_message_queue_send(queuehandle2, 0, 0);
#endif	
}