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

来源:互联网 发布:淘宝怎么参与团购 编辑:程序博客网 时间:2024/04/29 08:47

实现烧录器的烧录功能:

1.       在菜单中增加一项

2.       通过串口不断检测输入值

3.       通过值的选择来实现烧录功能

4.       烧录时需要检测flash 的状态:比如是坏的flash或者flash没有插入,如果异常就应当在屏幕上打印出相关信息,来提示用户当前flash状态,并且此时应当返回来等待用户的后续操作

5.       flashTOC要重新安装,来取得其块信息及状态

主要添加和修改函数如下:

 

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_Setuperror!!!/r/n");

      }

}

//BOOL FMD_EraseBlock(BLOCK_ID blockID)如果用此函数来做判断,会执行//FMDSocEraseBlock(g_cs,dwBlockID)函数,来不断地读取flash状态信息,从而转去响应坏块信息,在这里,我们只要检测是否有FLASH插入即可

 

BOOL FMDTEST_EraseBlock(BLOCK_ID blockID)

{

       DWORDdwBlockID = blockID;

       ChipIdSerialTestId;

       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))

              returnFALSE;

#if 0

       if(!FMDSocEraseBlock(g_cs,dwBlockID))

       {

              RETAILMSG(DBG_ATLAS_ZONE_ERROR,(TEXT("ERROR: %s: FMD_EraseBlock failed!!!/r/n"),_T(__FUNCTION__)));         

              returnFALSE;

       }

#endif    

       returnTRUE;

}

 

 

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/nEdbgGetDebugCharget 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)

{

 

       DWORDdwOnkeyPinStaus;

      

       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;

 

}

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

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

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

 

原创粉丝点击