📄 oskernel.c
字号:
/****************************************************************************/
/* */
/* Copyright (C) 2005 SHENZHEN MEIJIN CO.LTD */
/* */
/* FILE NAME: OsKernel.c */
/* MODULE NAME: 内核模拟 */
/* DESCRIPTION: 本文件主要定义内核主系统相关的函数 */
/* */
/* FUNCTIONS: */
/* KernelInitialize 内核模块初始化 */
/* RunAp 运行AP */
/* ExitAp 退出AP */
/* RequestExitAp 请求退出AP */
/* DrawCurrentAp 重新显示当前(顶层)AP */
/* DrawFullScreenAp 重新显示全屏AP */
/* HanldeEventTable 根据事件类型寻找对应的事件处理函数 */
/* HanldeEventTableEx 根据事件类型和参数寻找对应的事件处理函数*/
/* KnlSetEventPrevHandle 设置优先事件处理函数 */
/* KnlSetEventBehindHandle 设置事后事件处理函数 */
/* */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-03-18 创建 */
/* Dennyhan 2006.1.24 Add SD card */
/* changed position for booting display */
/* changed ESC key to auto exit */
/* changed macro compling */
/****************************************************************************/
// 包含相关的头文件
#include "Kernel.h"
//#include "ExtLcdDisp.h"
#define GUI_INIT_DRAW_FG_EN 1 // if open, Disable Draw during Initialization
// 全局变量定义
#define GUI_BUFFER_COUNT 51
// For GUI
static APGUI_STRUCT_MODEL g_aGuiBuffer[GUI_BUFFER_COUNT+1]; // GUI结构存放的缓冲区
static APGUI_STRUCT *g_pDesktopGuiModel; // 前一GUI模板的起始句柄
static APGUI_STRUCT_MODEL *g_pPrevGuiModel; // 前一GUI模板的起始句柄
static APGUI_STRUCT_MODEL *g_pCurrGuiModel; // 当前GUI模板的起始句柄
static UINT g_uTotalGuiCount; // 到当前为止的所有GUI控件个数
static UINT8 g_aGuiEntry[GUI_BUFFER_COUNT+1];
#define KNLEXITSTATUS_NULL 0
#define KNLEXITSTATUS_ASK 1 // 询问退出
#define KNLEXITSTATUS_TRUE 2 // 真正退出
static INT g_nKnlExitStatus; // 退出AP状态
static INT g_nKnlExitCode; // 退出代码
// 事件队列相关全局变量
#define MAX_EVENT_COUNT 24 // 队列中的事件个数
static UINT32 g_aEventQueueBuff[MAX_EVENT_COUNT * EVENT_SIZE];
NU_QUEUE g_quEventQueue; // 事件队列
static FPHANDLEEVENT g_fpKernelEventPrev; // 优先事件处理函数
static FPHANDLEEVENT g_fpKernelEventBehind; // 事后事件处理函数
static void AlarmEventCallBack(void);
//=============================================================
// Draw Operation for Initialize
// Only _GuiModelDraw_All: Fixed it.
// That is DrawFullScreenAp()
//------------------------------------
#ifdef GUI_INIT_DRAW_FG_EN
#define GUI_DRAW_STATUS_EN 0
#define GUI_DRAW_STATUS_DIS 1
static UINT _GuiFlagGet(UINT uPos);
static VOID _GuiFlagSet(UINT uStPos, UINT uEndPos, UINT uValue);
#endif
/****************************************************************************/
/* FUNCTION: BOOL KernelInitialize(VOID) */
/* DESCRIPTION:内核模块初始化 */
/* INPUTS: NONE */
/* OUTPUTS: NONE */
/* RETURN: 初始化成功返回TRUE,否则返回FALSE */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-03-18 创建 */
/****************************************************************************/
BOOL KernelInitialize(VOID)
{
NU_DRIVER *pDrv;
INT nInit;
// 先初始化内核变量
g_aGuiBuffer[0].uReserveMark = 0;
g_pPrevGuiModel = NULL;
g_pCurrGuiModel = NULL;
g_uTotalGuiCount = 0;
g_nKnlExitStatus = KNLEXITSTATUS_NULL;
g_nKnlExitCode = 0;
g_fpKernelEventPrev = (FPHANDLEEVENT)NULL;
g_fpKernelEventBehind = (FPHANDLEEVENT)NULL;
// Init Help Part
OsGuiHelpInitialize();
#ifdef GUI_INIT_DRAW_FG_EN
// Clear Draw Disable Flag
_GuiFlagSet(0,GUI_BUFFER_COUNT+1,GUI_DRAW_STATUS_DIS);
#endif
// 再初始化内核模块
MemMngInitialize(); // For flash mode initial /// dennyhan added
#ifndef WIN32
// FALSH管理模块初始化
nInit = FlashModInitial();
if ( nInit < 0 )
{
UINT8 *pFlsErrStr;
pFlsErrStr = NULL;
switch (nInit)
{
case NFLS_ERR_LOWVOLTAGE: // 低电压
pFlsErrStr = (UINT8*)"Power Low!";
break;
case NFLS_ERR_NOSPACE: // 坏块太多
pFlsErrStr = (UINT8*)"No Enough Fls Block!";
break;
case NFLS_ERR_FORMAT:
// 格式化FLASH
nInit = FlashIoCtrl( NFLASH_DRIVENO, FLASH_COMMAND_FORMAT, NULL );
if (nInit == NFLS_ERR_LOWVOLTAGE) // 低电压
pFlsErrStr = (UINT8*)"Power Low!";
else if (nInit != NFLS_ERR_NO) // 格式化失败
pFlsErrStr = (UINT8*)"Error in fls Format!";
//else // if (nInit == NFLS_ERR_NO) // 格式化成功
// break;
break;
default: // 其它错误
pFlsErrStr = (UINT8*)"Flash Init Error!";
break;
}
if ( pFlsErrStr != NULL )
{
HwClearScreen(0xFFFF);
HwShowString( (LCD_SCREEN_WIDTH-13*8)/2,
(LCD_SCREEN_HEIGHT-2*16)/2, pFlsErrStr, 0x0000 );
HwDisplayVirtualBuffer();
}
}
#endif
#if 0 //def _WIN32
//MMC initialize
{
INT MmcFormat(void);
INT MmcModInitial(void);
nInit = MmcModInitial();
if ( nInit < 0 )
{
UINT8 *pFlsErrStr;
pFlsErrStr = NULL;
switch (nInit)
{
case NFLS_ERR_LOWVOLTAGE: // 低电压 FLASH_ERR_LOWVOLTAGE
pFlsErrStr = (UINT8*)"Power Low!";
break;
case NFLS_ERR_NOSPACE: // 坏块太多 FLASH_ERR_NOPREPARE
pFlsErrStr = (UINT8*)"No Enough Fls Block!";
break;
case NFLS_ERR_FORMAT: // FLASH_ERR_NOFORMAT
// 格式化FLASH
nInit = MmcFormat();
if (nInit == NFLS_ERR_LOWVOLTAGE) // 低电压 FLASH_ERR_LOWVOLTAGE
pFlsErrStr = (UINT8*)"Power Low!";
else if (nInit != NFLS_ERR_NO) // 格式化失败 FLASH_ERR_
pFlsErrStr = (UINT8*)"Error in fls Format!";
//else // if (nInit == NFLS_ERR_NO) // 格式化成功
// break;
break;
default: // 其它错误
pFlsErrStr = (UINT8*)"Flash Init Error!";
break;
}
if ( pFlsErrStr != NULL )
{
HwClearScreen(0xFFFF);
HwShowString( (LCD_SCREEN_WIDTH-11*8)/2,
(LCD_SCREEN_HEIGHT-2*16)/2, pFlsErrStr, 0x0000 );
HwDisplayVirtualBuffer();
}
}
}
#endif
FileModInitial(); // 文件系统模拟初始化
ResMngInitialize(); // 资源管理模块初始化
TimerInitialize(); // 定时器管理模块初始化
TimMngInitial(); // Time 时钟初始化
FontMngInitialize(); // 字库管理模块初始化
GraphicInitialize(); // 图形显示模块初始化
ImeInitialize(); // 输入法模块初始化
EditInitialize(); // 编辑器模块初始化
ListInitialize(); // 列表模块初始化
VoiceModInitial(); // Voice 模块初始化
// 创建GUI消息队列
NU_Create_Queue( &g_quEventQueue, "SysEvent", g_aEventQueueBuff,
MAX_EVENT_COUNT * EVENT_SIZE, NU_FIXED_SIZE,
EVENT_SIZE, NU_FIFO );
// 告诉键盘驱动事件队列的指针
pDrv = GetIODriverFromName((UINT8*)DRV_NAME_KEYBOARD);
if ( pDrv )
{
NU_DRIVER_REQUEST request;
request.nu_function = NU_STATUS;
request.nu_timeout = NU_NO_SUSPEND;
request.nu_supplemental_ptr = &g_quEventQueue;
NU_Request_Driver(pDrv, &request);
}
//告诉闹铃驱动闹铃回调函数.
pDrv = GetIODriverFromName((UINT8*)DRV_NAME_ALARM);
if(pDrv)
{
NU_DRIVER_REQUEST request;
request.nu_function = NU_STATUS;
request.nu_timeout = NU_NO_SUSPEND;
request.nu_supplemental = ALARM_IOCTL_SETCALLBACK;
request.nu_supplemental_ptr = AlarmEventCallBack;
NU_Request_Driver(pDrv,&request);
}
return TRUE;
}
static APGUI_STRUCT *_LoadApGuiModel(APGUI_STRUCT *pApGui);
static INT _RunApGuiModel(VOID);
static VOID _GuiModelInitialize(VOID);
static VOID _GuiModelExitAp(INT nExitCode);
static VOID _GuiModelDestroyAp(VOID);
static VOID _GuiModelDraw(VOID);
static VOID _GuiModelDraw_All(VOID);
static BOOL _GuiModelHandleKey(UINT uEvent, UINT uParam);
static INT _GuiModelHandleEvent(UINT uEvent, UINT uParam);
extern INT OsKnlKeyBeepHook(UINT uEvent, UINT uParam); //For KeyBeep
extern INT OsKnlAlarmHook(UINT uEvent, UINT uParam);
/****************************************************************************/
/* FUNCTION: INT RunAp(APGUI_STRUCT *pApGui) */
/* DESCRIPTION:运行AP */
/* INPUTS: pApGui - AP的GUI模板指针 */
/* OUTPUTS: NONE */
/* RETURN: AP运行结束后的返回值,运行失败则返回-1 */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-03-28 创建 */
/****************************************************************************/
INT RunAp(APGUI_STRUCT *pApGui)
{
if( _LoadApGuiModel(pApGui) == NULL )
return EXIT_CODE_ERROR;
return _RunApGuiModel();
}
/****************************************************************************/
/* FUNCTION: VOID ExitAp(INT nExitCode) */
/* DESCRIPTION:退出AP */
/* INPUTS: nExitCode - 退出代码 */
/* OUTPUTS: NONE */
/* RETURN: NONE */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-03-30 创建 */
/****************************************************************************/
VOID ExitAp(INT nExitCode)
{
g_nKnlExitStatus = KNLEXITSTATUS_TRUE;
//if ( (g_nKnlExitCode < EXIT_CODE_FORCE_START) || (g_nKnlExitCode > EXIT_CODE_FORCE_END) )
g_nKnlExitCode = nExitCode;
}
/****************************************************************************/
/* FUNCTION: INT GetCurExitCode(VOID) */
/* DESCRIPTION:退出AP */
/* OUTPUTS: nExitCode - 退出代码 */
/* RETURN: NONE */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* Dennyhan 2006-06-26 创建 */
/****************************************************************************/
INT GetCurExitCode(VOID)
{
return g_nKnlExitCode;
}
/****************************************************************************/
/* FUNCTION: VOID RequestExitAp(INT nExitCode) */
/* DESCRIPTION:请求退出A */
/* INPUTS: nExitCode - 退出代码 */
/* OUTPUTS: NONE */
/* RETURN: NONE */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2006-01-08 创建 */
/****************************************************************************/
VOID RequestExitAp(INT nExitCode)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -