实现烧录器的烧录功能:
1. 在菜单中增加一项
2. 通过串口不断检测输入值
3. 通过值的选择来实现烧录功能
4. 烧录时需要检测 flash 的状态:比如是坏的 flash 或者 flash 没有插入,如果异常就应当在屏幕上打印出相关信息,来提示用户当前 flash 状态,并且此时应当返回来等待用户的后续操作
5. 对 flash 的 TOC 要重新安装,来取得其块信息及状态
主要添加和修改函数如下:
MENU_ITEM * GetMainItem()
{
InitMenuItem(pItem++, ('A'), ("SDMMC UpdateImage"), SDMMC_UpdateImage3 , NULL, NULL, NULL, NULL);
}
extern BOOL TOC_Setup(void);
BOOL SDMMC_UpdateImage3(MENU_ITEM *pMenu)//(BOOLEAN *bDownload, BOOLEAN *bSDUpdateMode)(&g_bDownloadImage, &g_bSDUpdateMode)
{
// 对该函数改写前,会一直读取 ECC 错误信息,调用其的函数
if(!FMDTEST_EraseBlock (0) )
{
// 当 flash 异常时,将其对应信息打印在屏幕上
BspEbootUpdateProgressBar(UPD_PHASE_ERROR1, (UCHAR)0);
return FALSE;
}
bRet = TOC_Setup();
if (!bRet)
{
EdbgOutputDebugString("TOC_Setup error!!!/r/n");
}
}
//BOOL FMD_EraseBlock(BLOCK_ID blockID) 如果用此函数来做判断,会执行 //FMDSocEraseBlock(g_cs,dwBlockID) 函数,来不断地读取 flash 状态信息 , 从而转去响应坏块信息,在这里,我们只要检测是否有 FLASH 插入即可
BOOL FMDTEST_EraseBlock(BLOCK_ID blockID)
{
DWORD dwBlockID = blockID;
ChipIdSerial TestId;
g_cs = TransBlock(dwBlockID);//
//g_pFlashExtInfo = &g_FlashInfoExHW[g_cs];
FMDSocReadFlashID(g_cs,&TestId);
RETAILMSG(1,(TEXT("TestId:%d,%d/r/n"),TestId.ucMakerId,TestId.ucDeviceId));
if((TestId.ucMakerId == 0)||(TestId.ucDeviceId== 0))
return FALSE;
#if 0
if (!FMDSocEraseBlock(g_cs,dwBlockID))
{
RETAILMSG(DBG_ATLAS_ZONE_ERROR, (TEXT("ERROR: %s: FMD_EraseBlock failed!!!/r/n"), _T(__FUNCTION__)));
return FALSE;
}
#endif
return TRUE;
}
BOOL EdbgGetDebugChar(char * pChar)
{
char * p, c;
if (g_iDevStatus < ATLAS_DEV_STATUS_IN_USB_SESSION_EBOOT)
{
/****************************************************************************/
// EdbgOutputDebugString("/r/nEdbgGetDebugChar +++++++");
if ( EbootGetPwrKeyFlag () == 1)
{
EdbgOutputDebugString("/r/nEdbgGetDebugChar get reset operation+++++++");
*pChar ='a';
return TRUE;
}
/****************************************************************************/
c = OEMReadDebugByte();
if (c == OEM_DEBUG_READ_NODATA)
return FALSE;
*pChar = c;
return TRUE;
}
}
获得 reset 按键 pin 脚的状态 , 可以通过读取其 on_key_b 对应的寄存器中的值,由原理图可知,
当按下的时候,其对应的值为低
int EbootGetPwrKeyFlag(void)
{
DWORD dwOnkeyPinStaus;
CHECK_CPU2IOBRG_SYNCING;
dwOnkeyPinStaus = PWRC_PIN_STATUS;
CHECK_CPU2IOBRG_SYNCING;
// EdbgOutputDebugString("EbootGetPwrKeyFlag:0x%x /r/n", dwOnkeyPinStaus);
if ((dwOnkeyPinStaus&0x2 )==0 )
return 1;
else
return 0;
}
// 对于有些定义在特定文件中的变量,如果在其他地方使用可能会报错,
通常方式,可将其在使用的地方讲其声明的头文件包含进来,声明其为外部变量。
但是最可靠的方法是:讲该变量封装在一个函数中,以后需要使用时只需调用该函数,让其成为函数返回值即可