// ============================================================================= // 功能:RTC时间注册及初始化 // 参数:time, 时间值 // 返回:true,正常操作,否则出错 // ============================================================================= ptu32_t ModuleInstall_CpuRtc(ptu32_t para) { s64 rtc_time; struct timeval tv; u16 evtt; //初始化硬件 PMC_EnablePeripheral(ID_RTC); pRtcSemp = Lock_SempCreate(1,0,CN_BLOCK_FIFO,"RTC_SEMP"); if(NULL == pRtcSemp) return false; evtt = Djy_EvttRegist(EN_CORRELATIVE,CN_PRIO_REAL,0,0, Rtc_UpdateTime,NULL,800, "RTC Update Event"); if(evtt == CN_EVTT_ID_INVALID) { free(pRtcSemp); return false; } Djy_EventPop(evtt,NULL,0,NULL,0,0); Rtc_GetTime(&rtc_time); tv.tv_sec = rtc_time/1000000;//us ---> s tv.tv_usec = 0; settimeofday(&tv,NULL); //注册RTC时间 if(!Rtc_RegisterDev(NULL,Rtc_SetTime)) return false; return true; }
//THIS IS TELNET SERVER MODULE FUNCTION bool_t ServiceTelnetInit(ptu32_t para) { bool_t result; u16 evttID; u16 eventID; result = false; pTelnetClientSync = Lock_MutexCreate(NULL); if(NULL == pTelnetClientSync) { goto __TELNET_INIT_EXIT; } evttID = Djy_EvttRegist(EN_CORRELATIVE, gTelnetAcceptPrior, 0, 1, __TelnetAcceptMain,NULL, gTelnetAcceptStack, "TelnetAcceptMain"); eventID = Djy_EventPop(evttID, NULL, 0, 0, 0, 0); if((evttID == CN_EVTT_ID_INVALID)||(eventID == CN_EVENT_ID_INVALID)) { printk("%s:Create the accept main failed:evttID:0x%04x eventID:0x%04x\n\r",\ __FUNCTION__,evttID,eventID); goto __TELNET_INIT_EXIT; } gTelnetClientEvttID = Djy_EvttRegist(EN_CORRELATIVE, gTelnetProcessPrior, 0, 1, TelnetClientMain,NULL, gTelnetProcessStack, "TelnetClientMain"); return __telnetConsoleInstall(); __TELNET_INIT_EXIT: return result; }
//----组件初始化2----------------------------------------------------------- //功能:可选组件初始化函数共有3个: // 1、sys_module_init,在sys_init.c中,参见该函数注释 // 2、prj_module_init,在这里初始化的模块,需要调用跟具体工程相关的代码,例 // 如键盘模块,除了调用module_init_keyboard函数外,还要调用跟硬件相关的 // module_init_keyboard_hard函数。 // 前两步初始化时,块相联分配方式还没有初始化,驱动中如果用到动态分配,使用 // 的是准静态分配,关于准静态分配的说明,参见mems.c文件。 // 3、run_module_init,参见该函数注释。 //参数:无 //返回:无 //----------------------------------------------------------------------------- void prj_module_init(void) { uint16_t evtt_main; #if CN_CFG_KEYBOARD == 1 Keyboard_ModuleInit(0); #endif #if CN_CFG_DJYFS == 1 Djyfs_ModuleInit(0); #if CN_CFG_DJYFS_FLASH == 1 DFFSD_ModuleInit(); #endif #endif #if(CN_CFG_UART0_USED == 1) module_init_uart0(0); #endif #if(CN_CFG_UART1_USED == 1) module_init_uart1(0); #endif evtt_main = Djy_EvttRegist(EN_CORRELATIVE,CN_PRIO_RRS,0,0,2, __djy_main,CN_MAIN_STACK,"main function"); //事件的两个参数暂设为0,如果用shell启动,可用来采集shell命令行参数 Djy_EventPop(evtt_main,NULL,0,NULL,0,0,0); return ; }
void Enet_Task(void) { u16 enettask; ModuleInstall_Enet(0); enettask = Djy_EvttRegist(EN_CORRELATIVE,180,0,0,2, EnetTest,0x100,"ENET TASK"); Djy_EventPop(enettask,NULL,0,NULL,0,0,200); }
// ============================================================================= // 功能:SPI错误弹出API函数,当发生错误时,调用该函数,弹出错误处理事件,并将错误号 // 以参数的形式传递给弹出的事件 // 参数:SPI,SPI控制块指针 // ErrNo,发生错误序号,如未收到ACK信号CN_SPI_NO_ACK_ERR // 返回:执行结果,-1参数错误,0无错误 // ============================================================================= s32 SPI_ErrPop(struct tagSPI_CB *SPI, u32 ErrNo) { if(NULL == SPI) return -1; //弹出错误处理事件,并将错误号以参数形式传递 Djy_EventPop(SPI->ErrorPopEvtt,NULL,0,ErrNo,0,0); return CN_SPI_EXIT_NOERR; }
//----异步事件中断引擎--------------------------------------------------------- //功能:响应异步信号,根据中断号调用用户ISR,随后弹出中断线控制块的my_evtt_id // 成员指定的事件类型,最后在返回前查看是否需要做上下文切换,如需要则切换 // 之。 //参数:ufast ufl_line,响应的中断线号 //返回:无 //----------------------------------------------------------------------------- void __Int_EngineAsynSignal(ufast_t ufl_line) { struct tagEventECB *event; u32 isr_result; tg_pIntSrcTable = malloc(tg_IntUsedNum * sizeof(struct tagIntLine)); if(tg_pIntSrcTable == NULL) return; // tg_int_global.en_asyn_signal_counter = 1; g_bScheduleEnable = false; // tg_int_global.en_asyn_signal = false; tg_int_global.nest_asyn_signal++; if(tg_pIntSrcTable[ufl_line].enable_nest == true) //允许嵌套的情况 { Int_DisableAsynLine(ufl_line); //不禁止,可能会形成无限循环 __int_enable_irq(); //L138中异步信号用irq实现,响应中断时,ARM把Ibit关闭了。 } if(tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].clear_type == CN_INT_CLEAR_PRE) Int_ClearLine(ufl_line); //中断应答, if(tg_pIntSrcTable[ufl_line].ISR != NULL) isr_result = tg_pIntSrcTable[ufl_line].ISR(ufl_line); else { if(tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].clear_type == CN_INT_CLEAR_USER) Int_ClearLine(ufl_line); //中断应答, } if(tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].clear_type == CN_INT_CLEAR_POST) Int_ClearLine(ufl_line); //中断应答, if(tg_pIntSrcTable[ufl_line].enable_nest == true) //支持嵌套的情况 { __int_disable_irq(); Int_EnableAsynLine(ufl_line); } event = tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].sync_event; if(event != NULL) //看同步指针中有没有事件(注:单个事件,不是队列) { event->event_result = isr_result; __Djy_EventReady(event); //把该事件放到ready队列 tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].sync_event = NULL; //解除同步 } if(tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].my_evtt_id != CN_INVALID_EVTT_ID) { Djy_EventPop(tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].my_evtt_id, NULL,0,(ptu32_t)isr_result, (ptu32_t)ufl_line,0); } tg_int_global.nest_asyn_signal--; if(tg_int_global.nest_asyn_signal == 0) { // tg_int_global.en_asyn_signal = true; // tg_int_global.en_asyn_signal_counter = 0; if(g_ptEventReady != g_ptEventRunning) __Djy_ScheduleAsynSignal(); //执行中断内调度 g_bScheduleEnable = true; } }
bool_t TcpEffectTest(char *param) { u16 evtt_id = CN_EVTT_ID_INVALID; evtt_id = Djy_EvttRegist(EN_CORRELATIVE, CN_PRIO_RRS-4, 0, 1, (ptu32_t (*)(void))tcptstserver,NULL, 0x1000, "TCPEffectServer"); if (evtt_id != CN_EVTT_ID_INVALID) { Djy_EventPop(evtt_id, NULL, 0, NULL, 0, 0); } return true; }
bool_t UdpServer_SndTask(char *param) { u16 evtt_id = CN_EVTT_ID_INVALID; evtt_id = Djy_EvttRegist(EN_CORRELATIVE, CN_PRIO_RRS, 0, 1, (ptu32_t (*)(void))UdpServer_Snd,NULL, 0x1000, "UdpServer_Snd"); if (evtt_id != CN_EVTT_ID_INVALID) { Djy_EventPop(evtt_id, NULL, 0, NULL, 0, 0); } return true; }
static bool_t __CreateClientThread(ptu32_t para) { bool_t result = false; u16 taskID; taskID = Djy_EventPop(gTelnetClientEvttID, NULL, 0, para, 0, 0); if(taskID != CN_EVENT_ID_INVALID) { result = true; } return result; }
//关于信号灯的使用 // ============================================================================= // 函数功能:创建一个线程(DJY中叫一个事件) // 输入参数: // 输出参数: // 返回值 : // ============================================================================= int create_thread(void *(*start_routine)(void *),void *arg) { uint16_t threadID; #error 不能用CN_CFG_MAIN_STACK吧,偷懒。 threadID = Djy_EvttRegist(EN_CORRELATIVE,CN_PRIO_RRS,0,0, start_routine,NULL,CN_CFG_MAIN_STACK,NULL); Djy_EventPop(threadID,NULL,0,arg,0,0); // debug_printf("-------------threadID=%d\n",threadID); 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; }
ptu32_t LedAllOff(void) { u8 i; while(1) { for(i = 0; i < 8; i++) { LED_Off(i); Djy_DelayUs(100*mS); } Djy_EventPop(ledontask,NULL,0,NULL,0,200); Djy_WaitEvttPop(Djy_MyEvttId(),NULL,CN_TIMEOUT_FOREVER); } return 0; }
void led_init(void) { GPIO_PowerOn(CN_GPIO_C); GPIO_CfgPinFunc(CN_GPIO_C, 6, CN_GPIO_MODE_GPIO_OUT_PP_2Mhz); GPIO_CfgPinFunc(CN_GPIO_C, 4, CN_GPIO_MODE_GPIO_OUT_PP_2Mhz); GPIO_CfgPinFunc(CN_GPIO_C, 8, CN_GPIO_MODE_GPIO_OUT_PP_2Mhz); GPIO_CfgPinFunc(CN_GPIO_C, 9, CN_GPIO_MODE_GPIO_OUT_PP_2Mhz); evtt_led = Djy_EvttRegist(EN_CORRELATIVE, CN_PRIO_RRS, 0, 1, led_flash, NULL,1000, "hello led"); if (evtt_led != CN_EVTT_ID_INVALID) { event_led = Djy_EventPop(evtt_led, NULL, 0, NULL, 0, 0); } }
//----初始化CAN配置参数--------------------------------------------------------- //功能: 初始化CAN配置参数 //参数: pCanPara,CAN控制器配置参数结构体指针 //返回: 成功初始化则返回true,否则则返回false. //----------------------------------------------------------------------------- bool_t CAN_Main(void) { uint16_t evtt; uint8_t i; bool_t ret; CanFilterConfPara *pFilterConfPara; pFilterConfPara=malloc(sizeof(CanFilterConfPara)); if(pFilterConfPara==NULL) { printf("Can Init failed.\r\n"); return false; } pFilterConfPara->FilterNumber=0; pFilterConfPara->FilterMode=CAN_FILTERMODE_IDMASK; pFilterConfPara->FilterScale=CAN_FILTERSCALE_32BIT; pFilterConfPara->FilterIdHigh=0x0000; pFilterConfPara->FilterIdLow=0x0000; pFilterConfPara->FilterMaskIdHigh=0x0000; pFilterConfPara->FilterMaskIdLow=0x0000; pFilterConfPara->FilterFIFOAssignment=0; pFilterConfPara->FilterActivation=1; pFilterConfPara->BankNumber=14; for(i=0;i<CN_CAN_NUM;i++) { ret=CAN_Hard_Init(i,125,pFilterConfPara); if(!ret) { printf("Can Init failed.\r\n"); return false; } } CAN_Shell_Module_Install(); evtt = Djy_EvttRegist(EN_CORRELATIVE,CN_PRIO_RRS,0,0,__Can_Monitor, CAN_MonitorStack,sizeof(CAN_MonitorStack),"CAN Monitor function"); if(evtt!=CN_EVTT_ID_INVALID) { Djy_EventPop(evtt,NULL,0,NULL,0,0); } else { Djy_EvttUnregist(evtt); } printf("CAN install OK.\r\n"); return true; }
void Led_Task(void) { LED_Init(); ledontask = Djy_EvttRegist(EN_CORRELATIVE,CN_PRIO_RRS,0,0, LedAllOn,NULL,0x30,"LedAllOn function"); if(ledontask == CN_EVTT_ID_INVALID) { printk("ledontask create failed!\r\n"); } ledofftask = Djy_EvttRegist(EN_CORRELATIVE,CN_PRIO_RRS,0,0, LedAllOff,NULL,0x30,"LedAllOff function"); if(ledofftask == CN_EVTT_ID_INVALID) { printk("ledofftask create failed!\r\n"); } Djy_EventPop(ledontask,NULL,0,NULL,0,200); }
int pthread_create(pthread_t *threadId, const pthread_attr_t *attr,\ ptu32_t (*taskroutine)(void ),void *arg) { int result = -1; u16 evttID; u16 eventID; evttID = Djy_EvttRegist(EN_CORRELATIVE,CN_PRIO_RRS,0,0,\ taskroutine,NULL,0x1000,NULL); if(evttID != CN_EVTT_ID_INVALID) { eventID = Djy_EventPop(evttID,NULL,0,(ptu32_t)arg,0,0); if(CN_EVENT_ID_INVALID != eventID) { if(NULL != threadId) { *threadId = (evttID<<16)|eventID; } result = 0; } } return result; }
//----异步事件中断引擎--------------------------------------------------------- //功能?响应异步信号?根据中断号调用用户ISR?随后弹出中断线控制块的my_evtt_id // 成员指定的事件类型?最后在返回前查看是否需要做上下文切换?如需要则切换 // 之。 //参数?ufast ufl_line?响应的中断线号 //返回?无 //----------------------------------------------------------------------------- void __Int_EngineAsynSignal(ufast_t ufl_line) { struct tagEventECB *event; u32 isr_result; g_bScheduleEnable = false; tg_int_global.nest_asyn_signal=1; if(tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].clear_type == CN_INT_CLEAR_PRE) Int_ClearLine(ufl_line); //中断应答, if(tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].ISR != NULL) isr_result = tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].ISR(ufl_line); else { if(tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].clear_type == CN_INT_CLEAR_USER) Int_ClearLine(ufl_line); //中断应答, } if(tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].clear_type == CN_INT_CLEAR_POST) Int_ClearLine(ufl_line); //中断应答, event = tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].sync_event; if(event != NULL) //看同步指针中有没有事件(注?单个事件?不是队列) { event->event_result = isr_result; __Djy_EventReady(event); //把该事件放到ready队列 tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].sync_event = NULL; //解除同步 } if(tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].my_evtt_id != CN_EVTT_ID_INVALID) { Djy_EventPop(tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].my_evtt_id, NULL,0,(ptu32_t)isr_result, (ptu32_t)ufl_line,0); } tg_int_global.nest_asyn_signal = 0; if(g_ptEventReady != g_ptEventRunning) __Djy_ScheduleAsynSignal(); //执行中断内调度 g_bScheduleEnable = true; return; }
//----组件初始化2----------------------------------------------------------- //功能:可选组件初始化函数共有3个: // 1、sys_module_init,在sys_init.c中,参见该函数注释 // 2、prj_module_init,在这里初始化的模块,需要调用跟具体工程相关的代码,例 // 如键盘模块,除了调用module_init_keyboard函数外,还要调用跟硬件相关的 // module_init_keyboard_hard函数。 // 前两步初始化时,块相联分配方式还没有初始化,驱动中如果用到动态分配,使用 // 的是准静态分配,关于准静态分配的说明,参见mems.c文件。 // 3、run_module_init,参见该函数注释。 //参数:无 //返回:无 //----------------------------------------------------------------------------- void Sys_ModuleInit(void) { tagDevHandle char_term_hdl; u32 stdinout; uint16_t evtt_main; //初始化PutChark,Putsk,GetChark,GetsK四个内核级输入输出函数,此后,printk //可以正常使用.printf和scanf将调用前述4个函数执行输入输出 Stddev_KnlInOutInit( 0 ); //shell模块,依赖:无 Sh_MoudleInit(0); //文件系统模块,依赖:shell // Djyfs_ModuleInit(0); //设备驱动模块 Driver_ModuleInit(0); //多路复用模块,提供类似Linux的epoll、select的功能 Multiplex_ModuleInit(0); //提供在shell上输出内核信息的功能,依赖:shell模块 Debug_InfoInit(0); //异常监视模块,依赖:shell模块 Exp_ModuleInit(0); //安装异常信息解析器,解析异常模块记录的二进制数据 Exp_InfoDecoderInit( ); UART_ModuleInit(CN_UART0); UART_ModuleInit(CN_UART1); //标准IO初始化,不影响printk函数,此后,printf和scanf将使用stdin/out输出和输 //入,如果裁掉,将一直用PutChark,Putsk,GetChark,GetsK执行IO //依赖: 若stdin/out/err是文件,则依赖文件系统 // 若是设备,则依赖设备驱动 // 同时,还依赖用来输出信息的设施,例如串口,LCD等 Stddev_ModuleInit( 0 ); //打开IO设备,不同的板件,这部分可能区别比较大. stdinout = Driver_FindDevice(gc_pCfgStddevName); char_term_hdl = Driver_OpenDeviceAlias(stdinout,O_RDWR,0); if(char_term_hdl != NULL) { Driver_CtrlDevice(char_term_hdl,CN_UART_START,0,0); //设置串口波特率为115200, Driver_CtrlDevice(char_term_hdl,CN_UART_SET_BAUD,115200,0); CharTerm_ModuleInit((ptu32_t)stdinout); Driver_CloseDevice(char_term_hdl); } //djybus模块 DjyBus_ModuleInit(0); //IIC总线模块,依赖:djybus ModuleInit_IICBus(0); //SPI总线模块,依赖:djybus ModuleInit_SPIBus(0); SPI_Init(); IIC0_Init(); // IIC1_Init(); //日历时钟模块 // TM_ModuleInit(0); //使用硬件RTC,注释掉则使用tick做RTC计时,依赖:日历时钟模块 // RTC_ModuleInit(0); //定时器组件 // module_init_timersoft(0); //键盘输入模块 // Keyboard_ModuleInit(0); //键盘输入驱动,依赖:键盘输入模块 // module_init_keyboard_hard(0); //字符集模块 // Charset_ModuleInit(0); //gb2312字符编码,依赖:字符集模块 // Charset_Gb2312ModuleInit(0); //ascii字符集,注意,gb2312包含了ascii,初始化了gb2312后,无须本模块 //依赖:字符集模块 // Charset_AsciiModuleInit(0); //初始化utf8字符集 // Charset_Utf8ModuleInit(0); //国际化字符集支持,依赖所有字符集模块以及具体字符集初始化 // Charset_NlsModuleInit("C"); // Font_ModuleInit(0); //字体模块 //8*8点阵的ascii字体依赖:字体模块 // Font_Ascii8x8FontModuleInit(0); //6*12点阵的ascii字体依赖:字体模块 // Font_Ascii6x12FontModuleInit(0); //从数组安装GB2312点阵字体,包含了8*16的ascii字体.依赖:字体模块 // Font_Gb2312_816_1616_ArrayModuleInit(0); //从文件安装GB2312点阵字体,包含了8*16的ascii字体.依赖:字体模块,文件系统 // Font_Gb2312_816_1616_FileModuleInit("sys:\\gb2312_1616"); //8*16 ascii字体初始化,包含高128字节,依赖:字体模块 //注:如果安装了GB2312,无须再安装 // Font_Ascii8x16FontModuleInit(0); //看门狗模块,如果启动了加载时喂硬件狗,看门狗软件模块从此开始接管硬件狗. // module_init_wdt(0); //事件的两个参数暂设为0,如果用shell启动,可用来采集shell命令行参数 evtt_main = Djy_EvttRegist(EN_CORRELATIVE,CN_PRIO_RRS,0,0,__djy_main, NULL,gc_u32CfgMainStackLen,"main function"); //事件的两个参数暂设为0,如果用shell启动,可用来采集shell命令行参数 Djy_EventPop(evtt_main,NULL,0,NULL,0,200); Heap_DynamicModuleInit(0);//自此malloc函数执行块相联算法 //至此,初始化时使用的栈,已经被系统回收,本函数就此结束,否则会死得很难看 return ; }
//----操作系统内核组件配置----------------------------------------------------- //功能:配置和初始化可选功能组件,在用户工程目录中必须实现本函数,在内核初始化 // 阶段调用。 // 本函数实现内核裁剪功能,例如只要注释掉 // ModuleInstall_Multiplex(0); // 这一行,多路复用组件就被裁剪掉了。 // 用户可从example中copy本文件,把不要的组件注释掉,强烈建议,不要删除,也 // 不要修改调用顺序。可以把用户模块的初始化代码也加入到本函数中,建议跟在 // 系统模块初始化后面. // 有些组件有依赖关系,裁剪时,注意阅读注释. //参数:无 //返回:无 //--------------------------------------------------------------------------- void Sys_ModuleInit(void) { static struct tagGkWinRsc desktop; struct tagDisplayRsc *lcd_windows; tagDevHandle char_term_hdl; u32 stdinout; uint16_t evtt_main; //初始化PutChark,Putsk,GetChark,GetsK四个内核级输入输出函数,此后,printk //可以正常使用.printf和scanf将调用前述4个函数执行输入输出 Stddev_KnlInOutInit( 0 ); //shell模块,依赖:无 ModuleInstall_Sh(0); //文件系统模块,依赖:shell ModuleInstall_Djyfs(0); //设备驱动模块 ModuleInstall_Driver(0); //多路复用模块,提供类似Linux的epoll、select的功能 ModuleInstall_Multiplex(0); //消息队列模块 ModuleInstall_MsgQ(0); //提供在shell上输出内核信息的功能,依赖:shell模块 ModuleInstall_DebugInfo(0); //异常监视模块,依赖:shell模块 ModuleInstall_Exp(0); //安装异常信息解析器,解析异常模块记录的二进制数据 // Exp_InfoDecoderInit( ); //flash文件系统初始化,依赖:文件系统模块,shell模块 ModuleInstall_DFFSD(0); //nand flash驱动,依赖:flash文件系统模块 ModuleInstall_WinFs(NULL); //设置工作路径,依赖:文件系统,且相关路径存在. Djyfs_SetWorkPath(gc_pCfgWorkPath); //标准IO初始化,不影响printk函数,此后,printf和scanf将使用stdin/out输出和输 //入,如果裁掉,将一直用PutChark,Putsk,GetChark,GetsK执行IO //依赖: 若stdin/out/err是文件,则依赖文件系统 // 若是设备,则依赖设备驱动 // 同时,还依赖用来输出信息的设施,例如串口,LCD等 ModuleInstall_Stddev( 0 ); ModuleInstall_Cmd(0); //打开IO设备,不同的板件,这部分可能区别比较大. stdinout = Driver_FindDevice(gc_pCfgStddevName); char_term_hdl = Driver_OpenDeviceAlias(stdinout,O_RDWR,0); if(char_term_hdl != NULL) { ModuleInstall_CharTerm((ptu32_t)stdinout); Driver_CloseDevice(char_term_hdl); } //djybus模块 ModuleInstall_DjyBus(0); //IIC总线模块,依赖:djybus ModuleInstall_IICBus(0); //SPI总线模块,依赖:djybus ModuleInstall_SPIBus(0); //日历时钟模块 ModuleInstall_TM(0); //使用硬件RTC,注释掉则使用tick做RTC计时,依赖:日历时钟模块 // ModuleInstall_RTC(0); //定时器组件 ModuleInstall_TimerSoft(0); // ModuleInstall_DjyIp(0); //键盘输入模块 ModuleInstall_KeyBoard(0); //键盘输入驱动,依赖:键盘输入模块 ModuleInstall_KeyBoardWindows(0); //字符集模块 ModuleInstall_Charset(0); //gb2312字符编码,依赖:字符集模块 ModuleInstall_CharsetGb2312(0); //ascii字符集,注意,gb2312包含了ascii,初始化了gb2312后,无须本模块 //依赖:字符集模块 // ModuleInstall_CharsetAscii(0); //初始化utf8字符集 // ModuleInstall_CharsetUtf8(0); //国际化字符集支持,依赖所有字符集模块以及具体字符集初始化 ModuleInstall_CharsetNls("C"); ModuleInstall_Font(0); //字体模块 //8*8点阵的ascii字体依赖:字体模块 // ModuleInstall_FontAscii8x8Font(0); //6*12点阵的ascii字体依赖:字体模块 // ModuleInstall_FontAscii6x12Font(0); //从数组安装GB2312点阵字体,包含了8*16的ascii字体.依赖:字体模块 ModuleInstall_FontGb2312_816_1616_Array(0); //从文件安装GB2312点阵字体,包含了8*16的ascii字体.依赖:字体模块,文件系统 // ModuleInstall_FontGb2312_816_1616_File("sys:\\gb2312_1616"); //8*16 ascii字体初始化,包含高128字节,依赖:字体模块 //注:如果安装了GB2312,无须再安装 ModuleInstall_FonAscii8x16Font(0); ModuleInstall_GK(0); //gkernel模块 //lcd驱动初始化,如果用系统堆的话,第二个参数用NULL //堆的名字,是在lds文件中命名的,注意不要搞错. //依赖: gkernel模块 lcd_windows = (struct tagDisplayRsc*)ModuleInstall_Lcd("sim_display",NULL); GK_ApiCreateDesktop(lcd_windows,&desktop,0,0, CN_COLOR_RED+CN_COLOR_GREEN,CN_WINBUF_BUF,0,0); //触摸屏模块,依赖:gkernel模块和显示器驱动 ModuleInstall_Touch(0); //依赖:触摸屏模块,宿主显示器驱动,以及所依赖的硬件,例如qh_1的IIC驱动. // 如果矫正数据存在文件中,还依赖文件系统. ModuleInstall_TouchWindows((ptu32_t)"sim touch"); //看门狗模块,如果启动了加载时喂狗,看门狗软件模块硬件从此开始接管硬件狗. // ModuleInstall_Wdt(0); //GDD组件初始化 ModuleInstall_GDD(&desktop,pGddInputDev,sizeof(pGddInputDev)/sizeof(void*)); evtt_main = Djy_EvttRegist(EN_CORRELATIVE,CN_PRIO_RRS,0,0, __djy_main,NULL,gc_u32CfgMainStackLen, "main function"); //事件的两个参数暂设为0?如果用shell启动?可用来采集shell命令行参数 Djy_EventPop(evtt_main,NULL,0,NULL,0,0); //用户自己程序的初始化模块,建议放在这里. Heap_DynamicModuleInit(0); //自此malloc函数执行块相联算法 //至此,初始化时使用的栈,已经被系统回收,本函数就此结束,否则会死得很难看 return ; }
//----操作系统内核组件配置----------------------------------------------------- //功能:配置和初始化可选功能组件,在用户工程目录中必须实现本函数,在内核初始化 // 阶段调用。 // 本函数实现内核裁剪功能,例如只要注释掉 // ModuleInstall_Multiplex(0); // 这一行,多路复用组件就被裁剪掉了。 // 用户可从example中copy本文件,把不要的组件注释掉,强烈建议,不要删除,也 // 不要修改调用顺序。可以把用户模块的初始化代码也加入到本函数中,建议跟在 // 系统模块初始化后面. // 有些组件有依赖关系,裁剪时,注意阅读注释. //参数:无 //返回:无 //--------------------------------------------------------------------------- void Sys_ModuleInit(void) { tagDevHandle char_term_hdl; u32 stdinout; uint16_t evtt_main; //初始化PutChark,Putsk,GetChark,GetsK四个内核级输入输出函数,此后,printk //可以正常使用.printf和scanf将调用前述4个函数执行输入输出 Stddev_KnlInOutInit( 0 ); //shell模块,依赖:无 ModuleInstall_Sh(0); //文件系统模块,依赖:shell ModuleInstall_Djyfs(0); //设备驱动模块 ModuleInstall_Driver(0); //多路复用模块,提供类似Linux的epoll、select的功能 ModuleInstall_Multiplex(0); //消息队列模块 ModuleInstall_MsgQ(0); //提供在shell上输出内核信息的功能,依赖:shell模块 ModuleInstall_DebugInfo(0); //异常监视模块,依赖:shell模块 ModuleInstall_Exp(0); //文件系统 extern ptu32_t ModuleInstall_DFFSD(ptu32_t para); extern ptu32_t ModuleInstall_fs_s29glxxx(ptu32_t para); ModuleInstall_DFFSD(0); ModuleInstall_fs_s29glxxx("easyfs"); //设置工作路径,依赖:文件系统,且相关路径存在. Djyfs_SetWorkPath(gc_pCfgWorkPath); ModuleInstall_UART(CN_UART0); //标准IO初始化,不影响printk函数,此后,printf和scanf将使用stdin/out输出和输 //入,如果裁掉,将一直用PutChark,Putsk,GetChark,GetsK执行IO //依赖: 若stdin/out/err是文件,则依赖文件系统 // 若是设备,则依赖设备驱动 // 同时,还依赖用来输出信息的设施,例如串口,LCD等 ModuleInstall_Stddev( 0 ); //打开IO设备,不同的板件,这部分可能区别比较大. stdinout = Driver_FindDevice(gc_pCfgStddevName); char_term_hdl = Driver_OpenDeviceAlias(stdinout,O_RDWR,0); if(char_term_hdl != NULL) { Driver_CtrlDevice(char_term_hdl,CN_UART_START,0,0); Driver_CtrlDevice(char_term_hdl,CN_UART_DMA_USED,0,0); //设置串口波特率为115200, Driver_CtrlDevice(char_term_hdl,CN_UART_SET_BAUD,115200,0); ModuleInstall_CharTerm((ptu32_t)stdinout); Driver_CloseDevice(char_term_hdl); } //djybus模块 ModuleInstall_DjyBus(0); //IIC总线模块,依赖:djybus ModuleInstall_IICBus(0); //SPI总线模块,依赖:djybus ModuleInstall_SPIBus(0); //日历时钟模块 ModuleInstall_TM(0); // //使用硬件RTC,注释掉则使用tick做RTC计时,依赖:日历时钟模块 // ModuleInstall_RTC(0); //定时器组件 extern ptu32_t ModuleInstall_TimerSoft(ptu32_t para); ModuleInstall_TimerSoft(CN_TIMER_SOURCE_TICK); //看门狗模块,如果启动了加载时喂硬件狗,看门狗软件模块从此开始接管硬件狗. ModuleInstall_Wdt(0); //网络协议栈组件 extern ptu32_t ModuleInstall_DjyIp(ptu32_t para); //协议栈组件初始化 ModuleInstall_DjyIp(0); //添加屋里网卡 extern bool_t ModuleInstall_Tsec(ptu32_t para); ModuleInstall_Tsec(1); //添加LOOP网卡 extern bool_t Loop_AddDevShell(char *param); Loop_AddDevShell(NULL); evtt_main = Djy_EvttRegist(EN_CORRELATIVE,CN_PRIO_RRS,0,0, __djy_main,NULL,gc_u32CfgMainStackLen, "main function"); //事件的两个参数暂设为0?如果用shell启动?可用来采集shell命令行参数 Djy_EventPop(evtt_main,NULL,0,NULL,0,0); //用户自己程序的初始化模块,建议放在这里. Heap_DynamicModuleInit(0); //自此malloc函数执行块相联算法 //至此,初始化时使用的栈,已经被系统回收,本函数就此结束,否则会死得很难看 #ifndef DEBUG extern void LockSysCode(void); LockSysCode(); #endif // extern int VncServer_Main(); // VncServer_Main(); return ; }