eboot中读取寄存器中的值的方法

实现烧录器的烧录功能:

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;

 

}

// 对于有些定义在特定文件中的变量,如果在其他地方使用可能会报错,

通常方式,可将其在使用的地方讲其声明的头文件包含进来,声明其为外部变量。

但是最可靠的方法是:讲该变量封装在一个函数中,以后需要使用时只需调用该函数,让其成为函数返回值即可

 

你可能感兴趣的:(eboot中读取寄存器中的值的方法)