int main(int argc, char *argv[]) { GUITHREAD thdFb = -1; GUITHREAD thdKeypad = -1; GUITHREAD thdTouch = -1; GUIWINDOW *pWnd = NULL; int iExit = 0; //初始化设备驱动 //InitializeDevice(); //装载输入法数据库 //OpenInputDb("/home/ubuntu/workspace/guilib/run/input/china.db"); //初始化GUI环境,运行调度线程及事件封装线程 InitializeGUI(); //运行设备抽象层的线程 ThreadCreate(&thdFb, NULL, DefaultFbThread, GetCurrFbmap()); //ThreadCreate(&thdKeypad, NULL, // DefaultKeypadThread, GetCurrKeypad()); ThreadCreate(&thdTouch, NULL, DefaultTouchThread, GetCurrTouch()); //第一个窗体线程运行 pWnd = CreateWindow(0, 0, 800, 480, FrmWiFiInit, FrmWiFiExit, FrmWiFiPaint, FrmWiFiLoop, FrmWiFiPause, FrmWiFiResume, NULL); //pWnd由调度线程释放 SendSysMsg_ThreadCreate(pWnd); //等待结束标志设立 while (!iExit) { iExit = GetExitFlag(); if (iExit) { ThreadCancel(thdTouch); //取消可能阻塞的触摸屏线程 ThreadCancel(thdKeypad); //取消可能阻塞的键盘线程 ThreadCancel(thdFb); //取消可能阻塞的帧缓冲线程 break; } MsecSleep(100); } //回收设备抽象层的线程 ThreadJoin(thdTouch, NULL); ThreadJoin(thdKeypad, NULL); ThreadJoin(thdFb, NULL); //释放GUI环境,回收事件封装线程及调度线程 ReleaseGUI(); //释放输入法数据库 CloseInputDb(); //释放设备驱动 //ReleaseDevice(); return 0; }
int _main( int argc, char *argv[] ) { int fres=0; s32 ret=0; struct IPCMessage *CMessage=NULL; thread_set_priority( 0, 0x58 ); #ifdef DEBUG dbgprintf("$IOSVersion: FFS-SD: %s %s 64M DEBUG$\n", __DATE__, __TIME__ ); #else dbgprintf("$IOSVersion: FFS-SD: %s %s 64M Release$\n", __DATE__, __TIME__ ); #endif //dbgprintf("FFS:Heap Init..."); HeapID = heap_create(Heap, sizeof Heap); QueueSpace = heap_alloc(HeapID, 0x20); //dbgprintf("ok\n"); QueueID = RegisterDevices(); if( QueueID < 0 ) { ThreadCancel( 0, 0x77 ); } sdhc_init(); //dbgprintf("FFS:Mounting SD...\n"); fres = f_mount(0, &fatfs); //dbgprintf("FFS:f_mount():%d\n", fres); if(fres != FR_OK) { //dbgprintf("FFS:Error %d while trying to mount SD\n", fres); ThreadCancel( 0, 0x77 ); } //dbgprintf("FFS:Clean up..."); //clean up folders FS_Delete("/tmp"); FS_Delete("/import"); f_mkdir("/tmp"); f_mkdir("/import"); thread_set_priority( 0, 0x0B ); //dbgprintf("ok\n"); while (1) { ret = mqueue_recv(QueueID, (void *)&CMessage, 0); if( ret != 0 ) { //dbgprintf("FFS:mqueue_recv(%d) FAILED:%d\n", QueueID, ret); continue; } //dbgprintf("FFS:Cmd:%d\n", CMessage->command ); switch( CMessage->command ) { case IOS_OPEN: { ret = FS_Open( CMessage->open.device, CMessage->open.mode ); #ifdef DEBUG if( ret != FS_NO_DEVICE ) dbgprintf("FFS:IOS_Open(\"%s\", %d):%d\n", CMessage->open.device, CMessage->open.mode, ret ); #endif mqueue_ack( (void *)CMessage, ret); } break; case IOS_CLOSE: { #ifdef DEBUG dbgprintf("FFS:IOS_Close(%d):", CMessage->fd); #endif ret = FS_Close( CMessage->fd ); #ifdef DEBUG dbgprintf("%d\n", ret ); #endif mqueue_ack( (void *)CMessage, ret); } break; case IOS_READ: { #ifdef DEBUG dbgprintf("FFS:IOS_Read(%d, 0x%p, %u):", CMessage->fd, CMessage->read.data, CMessage->read.length ); #endif ret = FS_Read( CMessage->fd, CMessage->read.data, CMessage->read.length ); #ifdef DEBUG dbgprintf("%d\n", ret ); #endif mqueue_ack( (void *)CMessage, ret ); } break; case IOS_WRITE: { #ifdef DEBUG dbgprintf("FFS:IOS_Write(%d, 0x%p, %u)", CMessage->fd, CMessage->write.data, CMessage->write.length ); #endif ret = FS_Write( CMessage->fd, CMessage->write.data, CMessage->write.length ); #ifdef DEBUG dbgprintf(":%d\n", ret ); #endif mqueue_ack( (void *)CMessage, ret ); } break; case IOS_SEEK: { #ifdef DEBUG dbgprintf("FFS:IOS_Seek(%d, %x, %d):", CMessage->fd, CMessage->seek.offset, CMessage->seek.origin ); #endif ret = FS_Seek( CMessage->fd, CMessage->seek.offset, CMessage->seek.origin ); #ifdef DEBUG dbgprintf("%d\n", ret ); #endif mqueue_ack( (void *)CMessage, ret ); } break; case IOS_IOCTL: FFS_Ioctl(CMessage); break; case IOS_IOCTLV: FFS_Ioctlv(CMessage); break; #ifdef EDEBUG default: dbgprintf("FFS:unimplemented/invalid msg: %08x\n", CMessage->command); mqueue_ack( (void *)CMessage, -1017); #endif } } return 0; }