//----初始化标准输入模块------------------------------------------------------- //功能: 初始化标准输入模块,执行初始化后,可以创建输入设备。 //参数: 无 //返回: true = 成功,false= 失败. //----------------------------------------------------------------------------- bool_t ModuleInstall_Stddev(ptu32_t para) { static struct tagStdinDeviceRsc root; tg_pStdinInputMsgQ = Stddev_CreatInputMsgQ(10,"StdInDev"); if(tg_pStdinInputMsgQ == NULL) return false; g_ptStdinDevice = M_Malloc(gc_u32CfgStdinDeviceLimit * sizeof(struct tagStdinDeviceRsc),0); if(g_ptStdinDevice == NULL) { Stddev_DeleteInputMsgQ(tg_pStdinInputMsgQ); return false; } s_ptStdinDeviceRscTree = (struct tagStdinDeviceRsc *) Rsc_AddTree(&root.stdin_device_node, sizeof(struct tagStdinDeviceRsc),RSC_STDIN_OUT,"stdin input device"); //初始化泛设备控制块内存池 g_ptStdinDevicePool = Mb_CreatePool((void*)g_ptStdinDevice, gc_u32CfgStdinDeviceLimit, sizeof(struct tagStdinDeviceRsc), 2,10, "输入设备控制块内存池"); Stddev_SetFocusDefault(tg_pStdinInputMsgQ); return true; }
// ========================================================================= // 函数功能:菜单模块初始化函数,初始化相应资源,添加根节点 // 输入参数: 无 // 输出参数:无 // 返回值 : // 说明 :建立菜单项的内存池和根节点 // ========================================================================= ptu32_t module_init_menu(ptu32_t para) { static struct tagRscNode sMenuitemRoot; bool_t result=false; //init the menuitem tree pg_menuitem_root= Rsc_AddTree(&sMenuitemRoot, sizeof(struct tagRscNode),RSC_RSCNODE,"MenuItem_root"); if(NULL==pg_menuitem_root) { printf("create the pg_menuitem_root failed!\n"); return result; } //init the menuitem pool pg_menuitem_pool = Mb_CreatePool((void*)sMenuitemRsc, cn_limit_menuitem, sizeof(struct menu_item), 20,100, "MenuItem_pool"); if(NULL==pg_menuitem_pool) { printf("create the pg_menuitem_pool failed!\n"); return result; } result=true; return result; }
// ============================================================================= // 函数功能: Socket_Init // // 输入参数:para,目前无意义 // 输出参数: // 返回值 :true成功 false失败 // 说明 :1,建立套接字所需要的内存池 // ============================================================================= bool_t Socket_Init(ptu32_t para) { bool_t result; int i; //套接字内存池 pgSocketPool = Mb_CreatePool((void *)sgSocketPool, CN_SOCKET_POOLSIZE,\ sizeof(tagSocket), 0, 0, "Socket Pool"); if (NULL == pgSocketPool) { printk("Socket:Creat SocketPool Failed\n\r"); result = false; } else { printk("Socket:Creat SocketPool Success\n\r"); for(i =0; i < CN_SOCKET_POOLSIZE; i++) { sgSocketMap[i] = NULL; } result = true; } return result; }
//----模块初始化--------------------------------------------------------------- //功能: 初始化Multiplex模块。创建互斥量,初始化内存池。 //参数:para,无效。 //返回:0=成功,非0=失败。 //----------------------------------------------------------------------------- ptu32_t ModuleInstall_Multiplex(ptu32_t para) { Lock_MutexCreate_s(&MultiplexMutex, "Multiplex control block"); //创建MultiplexSets控制块内存池,内存池的初始状态是空的。 g_ptMultiplexSetsPool = Mb_CreatePool(NULL, 0, sizeof(struct tagMultiplexSetsCB), 5, CN_MULTIPLEX_MAX_SETS, "Multiplex control block"); if (g_ptMultiplexSetsPool == NULL) return -1; //创建Multiplex对象控制块内存池,内存池的初始状态是空的。 g_ptMultiplexObjectPool = Mb_CreatePool(NULL, 0, sizeof(struct tagMultiplexObjectCB), 5, CN_MULTIPLEX_MAX_OBJECTS, "Multiplex control block"); if (g_ptMultiplexObjectPool == NULL) { Mb_DeletePool(g_ptMultiplexObjectPool); return -1; } return 0; }
// ============================================================================= // 函数功能:看门狗模块的初始化 // 输入参数: // 输出参数: // 返回值 :1成功 0失败 // 说明 :创建看门狗硬件对应的软看门狗。注册看门狗异常信息解析器 // ============================================================================= ptu32_t ModuleInstall_Wdt(ptu32_t para) { bool_t result_bool; u16 evttid; g_ptWdtPool = M_Malloc(gc_u32CfgWdtLimit * sizeof(tagWdt),0); if(g_ptWdtPool == NULL) return 0; ptWdtPool = Mb_CreatePool(g_ptWdtPool,gc_u32CfgWdtLimit,sizeof(tagWdt),0,0,"wdt pool"); //init the queue ptWdtHead = NULL; ptWdtTail = NULL; ptWdtHard = NULL; //create the msg box for the api to snd msg to the wdt service task ptWdtMsgBox = MsgQ_Create(CN_WDTMSG_LIMIT,sizeof(tagWdtMsg),CN_MSGQ_TYPE_FIFO); //create the main service evttid = Djy_EvttRegist(EN_CORRELATIVE,CN_PRIO_WDT,0,0,Wdt_Service, NULL,0x1000,"wdt service"); if(evttid == CN_EVTT_ID_INVALID) return 0; if( Djy_EventPop(evttid,NULL,0,0,0,0) == CN_EVENT_ID_INVALID) { printk("WDT MODULE:POP SERVICE FAILED!\n\r"); Djy_EvttUnregist(evttid); return 0; } //create the soft wdt match the hard wdt struct tagWdtHalChipInfo hardpara; result_bool = WdtHal_GetChipPara(&hardpara); if(true == result_bool)//存在硬件看门狗,则创建硬件看门狗 { fnWdtHardFeed = hardpara.wdtchip_feed; ptWdtHard = Wdt_Create(hardpara.wdtchip_name,\ hardpara.wdtchip_cycle,\ __Wdt_HardWdtYipHook,\ EN_EXP_DEAL_IGNORE, NULL); } //todo:此处有警告 extern bool_t Exp_RegisterThrowinfoDecoder(fnExp_ThrowinfoDecoderModule decoder,const char *name); if(false ==Exp_RegisterThrowinfoDecoder(__Wdt_WdtExpInfoDecoder,\ CN_WDT_EXPDECODERNAME)) { printk("WDT MODULE: Register Wdt Exp Decoder Failed!\n\r"); } printk("WDT MODULE:Init end ...\n\r"); return 1; }
bool_t install_vncserver_mirrordisplay(rfbScreenInfoPtr rfbserver) { bool_t ret=false; struct tagDisplayRsc *base_display; struct tagGkWinRsc *desktop; struct tagDisplayRsc *mirror_display;//我们的镜像显示器 if(NULL==rfbserver) { return ret; } //通过桌面找到显示器,这种方法有点out ---TODO desktop = GK_ApiGetDesktop("sim_display"); if(NULL==desktop)//找不到桌面。 { return ret; } base_display=desktop->disp; if(NULL==base_display)//找不到主显示器 { return ret; } if((base_display->pixel_format>>8)<8)//暂时不支持8位像素格式 { return ret; } vncclip_pool = Mb_CreatePool((void*)s_vncclip_rsc, cn_limit_vncclip, sizeof(struct tagClipRect), 20,100, "vncclip_pool"); if(NULL == vncclip_pool) { debug_printf("#fatalerror--create the vncclip_pool failed!\n"); return ret; } mirror_display=M_MallocLc(sizeof(struct tagDisplayRsc),0); if(NULL==mirror_display) { debug_printf("#fatalerror--malloc mirror display mem failed!\n"); Mb_DeletePool(vncclip_pool); return ret; } memset(mirror_display,0,sizeof(struct tagDisplayRsc)); //初始化镜像显示器的一些必备属性,跟主显示器保持一致--TODO, mirror_display->pixel_format = base_display->pixel_format; mirror_display->width = base_display->width; if(cn_vnc_keyboard_visual_enable) { mirror_display->height = base_display->height + cn_vnc_keyboard_height; } else { mirror_display->height = base_display->height; } mirror_display->frame_buffer = NULL; mirror_display->draw.bm_to_screen=vnc_bm_to_screen; ret= GK_InstallDisplayMirror(base_display,mirror_display,"vnc_server_disp"); if(ret)//安装成功 { //区域设置 rfbserver->width=mirror_display->width; rfbserver->height=mirror_display->height; rfbserver->rfbServerFormat.bitsPerPixel=(mirror_display->pixel_format>>8); rfbserver->frameBuffer=M_MallocLc(rfbserver->width*\ (rfbserver->height)*(rfbserver->rfbServerFormat.bitsPerPixel/8),0); if(NULL==rfbserver->frameBuffer) { Rsc_DelNode((struct tagRscNode *)mirror_display); free(mirror_display); Mb_DeletePool(vncclip_pool); debug_printf("#fatalerror--malloc rfbserver frame buf failed!\n"); return ret; } //镜像显示器和其基础显示器公用一个buf。 //初始化一些rfbserver的参数 debug_printf("fram buf = %08x %d bytes\n",rfbserver->frameBuffer,\ rfbserver->width*(rfbserver->height)*(rfbserver->rfbServerFormat.bitsPerPixel/8)); memset(rfbserver->frameBuffer,0,rfbserver->width*(rfbserver->height)*(rfbserver->rfbServerFormat.bitsPerPixel/8)); rfbserver->clip_head=NULL; //像素格式 // rfbserver->rfbServerFormat.bitsPerPixel=rfbserver->bitsPerPixel; //感觉rfbScreen对于色彩的设置有点冗余,可以考虑只用format就好了,后续修正--TODO rfbserver->rfbServerFormat.bigEndian=false; rfbserver->rfbServerFormat.trueColour=true; rfbserver->paddedWidthInBytes=(rfbserver->rfbServerFormat.bitsPerPixel/8)*rfbserver->width; switch(rfbserver->rfbServerFormat.bitsPerPixel)//目前就列举这几种吧,后续的再行补充 { case 8://332格式 debug_printf("the server vmirror_display used 332 format!\n"); rfbserver->rfbServerFormat.redShift=5; rfbserver->rfbServerFormat.greenShift=2; rfbserver->rfbServerFormat.blueShift=0; rfbserver->rfbServerFormat.redMax=((1<<3)-1); rfbserver->rfbServerFormat.greenMax=((1<<3)-1); rfbserver->rfbServerFormat.blueMax=((1<<2)-1); rfbserver->rfbServerFormat.depth=8; break; case 16://565格式 debug_printf("the server vmirror_display used 565 format!\n"); rfbserver->rfbServerFormat.redShift=11; rfbserver->rfbServerFormat.greenShift=5; rfbserver->rfbServerFormat.blueShift=0; rfbserver->rfbServerFormat.redMax=((1<<5)-1); rfbserver->rfbServerFormat.greenMax=((1<<6)-1); rfbserver->rfbServerFormat.blueMax=((1<<5)-1); rfbserver->rfbServerFormat.depth=16; break; case 32://真彩色888 debug_printf("the server vmirror_display used 888 format!\n"); rfbserver->rfbServerFormat.redShift=16; rfbserver->rfbServerFormat.greenShift=8; rfbserver->rfbServerFormat.blueShift=0; rfbserver->rfbServerFormat.redMax=((1<<8)-1); rfbserver->rfbServerFormat.greenMax=((1<<8)-1); rfbserver->rfbServerFormat.blueMax=((1<<8)-1); rfbserver->rfbServerFormat.depth=24; break; default://不应该处理,后果很严重,后虚修补bug--TODO break; } vncscreen=rfbserver; vnc_set_vncclip_pool(vncclip_pool); rfbserver->mirror_display = mirror_display; return ret; } else {