📄 dvb_flash.c
字号:
if(!flash_init()) return FALSE;
if(CT_SYS_Hostbus_Open(EN_CT_HOSTBUS_ACCESS_FLASH))
{
/*#ifdef CI_ENABLE
DVB_CI_Pause();
#endif*/
#ifdef ATA_ENABLE
DVB_ATA_Pause();
#endif
enResult = CT_Flash_Read(u32Address, u32BufferSize, pu8Buffer);
CT_SYS_Hostbus_Close();
if(enResult == DRV_OK)
{
return TRUE;
}
else
{
FLASH_DBG(( "{DVB_FlashReadData} CT_Flash_Read failed! (Addr=0x%06lX)\n", u32Address));
return FALSE;
}
}
else
{
FLASH_DBG(( "{DVB_FlashReadData} CT_SYS_Hostbus_Open failed! (Addr=0x%06lX)\n", u32Address));
return FALSE;
}
}
/*! \fn u32 DVB_FlashGetBankAddress(u8 u8Bank)
\brief Get address of bank in flash.
\param u8Bank (Input) Indicate which bank.
\return address of bank
*/
u32 DVB_FlashGetBankAddress (u8 u8Bank)
{
/* caculate the flash address */
return ((u32)FLASHSRV_BASE_ADDRESS + ((u32)u8Bank)*((u32)FLASHSRV_BYTE_MODE_BANK_SIZE));
}
// for DVB2.0 start
bool8 DVB_FlashReadBank (u8 u8Bank, u32 u32DramAddress)
{
return DVB_FlashRead(u8Bank, 0, (u8*)u32DramAddress, FLASHSRV_BYTE_MODE_BANK_SIZE);
}
bool8 DVB_FlashWriteBank (u8 u8Bank, u32 u32DramAddress)
{
if(DVB_FlashErase(u8Bank) == FALSE)
return FALSE;
return DVB_FlashWrite(u8Bank, 0, (u8*)u32DramAddress, FLASHSRV_BYTE_MODE_BANK_SIZE);
}
bool8 DVB_FlashDump (u8 u8Bank, u16 u16Start, u16 u16Length)
{
u32 u32FlashAddr;
FLASH_DBG(( "\n\r{DVB_FlashDump} start u8Bank[%d] u16Start[0x%x] u16Length[%d]\n\r",
u8Bank, u16Start, u16Length));
u32FlashAddr = DVB_FlashGetBankAddress(u8Bank) + (u32)u16Start;
DVB_DramDump (u32FlashAddr,(u32)u16Length);
return (TRUE);
}
// for DVB2.0 end
#if FLASH_TEST
#define FLASH_SELTTEST 0
u32 u32TestLength = FLASHSRV_BYTE_MODE_BANK_SIZE;
u8 au8TestArry[FLASHSRV_BYTE_MODE_BANK_SIZE]; // 64K Bytes
#if FLASH_SELTTEST
u8 au8TestArry2[FLASHSRV_BYTE_MODE_BANK_SIZE * 25]; // 64K Bytes
#endif /* end #if FLASH_SELTTEST */
bool8 DVB_FlashWriteImage (u8 u8StartBank, u32 u32DramAddress, u32 u32Size)
{
u8 u8BankNum = 0; /* cover how many bank number */
u8 u8Bank = u8StartBank, i = 0;
u32 u32DramAdr = u32DramAddress;
u8BankNum = u32Size / (FLASHSRV_WORD_MODE_BANK_SIZE * 2);
if (u32Size % (FLASHSRV_WORD_MODE_BANK_SIZE * 2))
u8BankNum ++ ;
for (i = 0; i < u8BankNum; i ++)
{
u8Bank = u8StartBank + i;
u32DramAdr = u32DramAddress + ( i * (FLASHSRV_WORD_MODE_BANK_SIZE * 2));
/* erase/write bank will be done in FlashWriteBank ( )*/
if (DVB_FlashWriteBank (u8Bank, u32DramAdr) == FALSE)
{
FLASH_DBG(( "\n\r{DVB_FlashWriteImage} Fail \n"));
return (FALSE);
}
}
FLASH_DBG(( "\n\r{DVB_FlashWriteImage} Success\n"));
return (TRUE);
}
void flashinfo_print (void)
{
ST_FLASH_INFO_T stFlashInfo;
DVB_FlashCheckID (&stFlashInfo);
FLASH_DBG(( "Manufacturer ID: 0x%x\n", pstFlashInfo.u16Manufacture)) ;
FLASH_DBG(( "Device ID : 0x%x\n", pstFlashInfo.u16Device));
FLASH_DBG(( "Size : 0x%x bytes\n", stFlashInfo.u32FlashSize));
FLASH_DBG(( "Bank Number < 64K per Bnk> : %d\n", stFlashInfo.u8Num_Bank));
FLASH_DBG(( "Bank boot Type <0 : btm, 1 : top> : %d\n", _bFlashBootType));
}
void flash_test (u8 u8Mode, u16 u16Para1, u16 u16Para2)
{
u32 u32Count;
u8* pu8TestPtr;
u8 u8CheckCount = 0;
u8 u8CheckValue = 0;
u8 u8FlahBank = 0;
if(flash_init() == FALSE) return;
switch (u8Mode)
{
default:
case 0: /* Show Flash Information */
flashinfo_print ();
break;
case 1: /* ERASE test */
u8FlahBank = (u8)(u16Para1 & 0xFF);
if ((u8FlahBank == 0) || (u8FlahBank >= _bFlashBankNum))
{
FLASH_DBG(( "Wrong Bank Number\n"));
break;
}
FLASH_DBG(( "Erase Flash Bank[%d]\n", u8FlahBank));
DVB_FlashErase (u8FlahBank);
DVB_FlashDump (u8FlahBank, 0, 64);
//DVB_FlashErase (u8FlahBank - 1);
//DVB_FlashDump (u8FlahBank, 0, 64);
break;
case 2: /* Flash Write Test, not include bank0 */
u8FlahBank = (u8)(u16Para1 & 0xFF);
/* check parameter */
if ((u8FlahBank == 0) || (u8FlahBank >= _bFlashBankNum))
{
FLASH_DBG(( "Wrong Bank Number\n"));
break;
}
for (u32Count = 0; u32Count< 20; u32Count++)
{
au8TestArry[u32Count] = (u8)(u32Count & 0x000000FF);
}
pu8TestPtr = (u8*) au8TestArry;
DVB_FlashWrite (u8FlahBank, 0x06, pu8TestPtr, 8);
DVB_FlashWrite (u8FlahBank, 0x14, pu8TestPtr, 10);
DVB_FlashWrite (u8FlahBank, 0x22, pu8TestPtr, 12);
DVB_FlashWrite (u8FlahBank, 0x30, pu8TestPtr, 14);
DVB_FlashWrite (u8FlahBank, 0x40, pu8TestPtr, 16);
DVB_FlashWrite (u8FlahBank, 0x58, pu8TestPtr, 6);
DVB_FlashWrite (u8FlahBank, 0x66, pu8TestPtr, 4);
DVB_FlashWrite (u8FlahBank, 0x74, pu8TestPtr, 2);
FLASH_DBG(( "\n----1-8\n"));
memset (pu8TestPtr, 0, 20);
DVB_FlashRead (u8FlahBank, 0x06, pu8TestPtr, 8);
for (u32Count = 0; u32Count < 20; u32Count++)
{
FLASH_DBG(( "[%d]", pu8TestPtr[u32Count]));
if ((u32Count % 10 == 0) && (u32Count != 0))
{
FLASH_DBG(( "\n"));
}
}
FLASH_DBG(( "\n----2-10\n"));
memset (pu8TestPtr, 0, 20);
DVB_FlashRead (u8FlahBank, 0x14, pu8TestPtr, 10);
for (u32Count = 0; u32Count < 20;u32Count++)
{
FLASH_DBG(( "[%d]", pu8TestPtr[u32Count]));
if ((u32Count % 10 == 0) && (u32Count != 0))
{
FLASH_DBG(( "\n"));
}
}
FLASH_DBG(( "\n----3-12\n"));
memset (pu8TestPtr, 0, 20);
DVB_FlashRead (u8FlahBank, 0x22, pu8TestPtr, 12);
for (u32Count = 0; u32Count< 20; u32Count++)
{
FLASH_DBG(( "[%d]", pu8TestPtr[u32Count]));
if ((u32Count % 10 == 0) && (u32Count != 0))
{
FLASH_DBG(( "\n"));
}
}
FLASH_DBG(( "\n----4-14\n"));
memset (pu8TestPtr, 0, 20);
DVB_FlashRead (u8FlahBank, 0x30, pu8TestPtr, 14);
for (u32Count = 0; u32Count< 20;u32Count++)
{
FLASH_DBG(( "[%d]", pu8TestPtr[u32Count]));
if ((u32Count % 10 == 0) && (u32Count != 0))
{
FLASH_DBG(( "\n"));
}
}
FLASH_DBG(( "\n----5-16\n"));
memset (pu8TestPtr, 0, 20);
DVB_FlashRead (u8FlahBank, 0x40, pu8TestPtr, 16);
for (u32Count = 0; u32Count < 20; u32Count++)
{
FLASH_DBG(( "[%d]", pu8TestPtr[u32Count]));
if ((u32Count % 10 == 0) && (u32Count != 0))
{
FLASH_DBG(( "\n\r"));
}
}
FLASH_DBG(( "\n----6-6\n"));
memset (pu8TestPtr, 0, 20);
DVB_FlashRead (u8FlahBank, 0x58, pu8TestPtr, 6);
for (u32Count = 0; u32Count< 20; u32Count++)
{
FLASH_DBG(( "[%d]", pu8TestPtr[u32Count]));
if ((u32Count % 10 == 0) && (u32Count != 0))
{
FLASH_DBG(( "\n"));
}
}
FLASH_DBG(( "\n----7-4\n"));
memset (pu8TestPtr, 0, 20);
DVB_FlashRead (u8FlahBank, 0x66, pu8TestPtr, 4);
for (u32Count = 0; u32Count < 20; u32Count++)
{
FLASH_DBG(( "[%d]", pu8TestPtr[u32Count]));
if ((u32Count % 10 == 0) && (u32Count != 0))
{
FLASH_DBG(( "\n"));
}
}
FLASH_DBG(( "\n----8-2\n"));
memset (pu8TestPtr, 0, 20);
DVB_FlashRead (u8FlahBank, 0x74, pu8TestPtr, 2);
for (u32Count = 0; u32Count < 20; u32Count++)
{
FLASH_DBG(( "[%d]", pu8TestPtr[u32Count]));
if ((u32Count % 10 == 0) && (u32Count != 0))
{
FLASH_DBG(( "\n"));
}
}
break;
case 3: /* Flash Erase, Read & Write Test, not include bank0 */
memset (au8TestArry, 0xff, u32TestLength);
u8FlahBank = (u8)(u16Para1 & 0xFF);
if ((u8FlahBank == 0) || (u8FlahBank >= _bFlashBankNum))
{
FLASH_DBG(( "Wrong Bank Number\n"));
break;
}
for (u8CheckCount=0; u8CheckCount<4; u8CheckCount++)
{
switch(u8CheckCount)
{
case 0:
u8CheckValue = 0x33;
break;
case 1:
u8CheckValue = 0x11;
break;
case 2:
u8CheckValue = 0xAA;
break;
case 3:
u8CheckValue = 0x55;
break;
}
DVB_FlashErase (u8FlahBank);
pu8TestPtr = (u8*) au8TestArry;
memset (pu8TestPtr, u8CheckValue, u32TestLength);
DVB_FlashWrite (u8FlahBank, 0, pu8TestPtr, u32TestLength);
memset (pu8TestPtr, 0xff, u32TestLength);
DVB_FlashRead (u8FlahBank, 0, pu8TestPtr, u32TestLength);
FLASH_DBG(( "\n case3 0x%x 0[0x%x] 1[0x%x] last[0x%x]\n",
u8CheckValue, pu8TestPtr[0], pu8TestPtr[1], pu8TestPtr[u32TestLength-1]));
}
break;
case 5: /* Flash WriteBank & ReadBank Test include bank0 */
memset (au8TestArry, 0xff, u32TestLength);
u8FlahBank = (u8)(u16Para1&0xFF);
if (u8FlahBank >= _bFlashBankNum)
{
FLASH_DBG(( "Wrong Bank Number\n"));
break;
}
// if (u8FlahBank==0)
// {
// break;
// }
for (u8CheckCount=0; u8CheckCount<4; u8CheckCount++)
{
switch (u8CheckCount)
{
case 0:
u8CheckValue = 0x33;
break;
case 1:
u8CheckValue = 0x11 ;
break;
case 2:
u8CheckValue = 0xAA ;
break;
case 3:
u8CheckValue = 0x55 ;
break;
}
pu8TestPtr = (u8*) au8TestArry;
memset (pu8TestPtr, u8CheckValue, u32TestLength);
DVB_FlashWriteBank (u8FlahBank, (u32) pu8TestPtr);
memset (pu8TestPtr,0xff,u32TestLength);
DVB_FlashReadBank (u8FlahBank, (u32) pu8TestPtr);
FLASH_DBG(( "\n case5 0x%x 0[0x%x] 1[0x%x] last[0x%x]\n",
u8CheckValue, au8TestArry[0], au8TestArry[1], au8TestArry[u32TestLength-1]));
}
break;
#if FLASH_SELTTEST
case 6: /* DVB_FlashWriteImage test */
memset (au8TestArry2, 0x77, sizeof (au8TestArry2));
u8FlahBank = 1;
u32Count = 25 << 16;
if (DVB_FlashWriteImage (u8FlahBank, au8TestArry2, u32Count) == TRUE)
{
memset (au8TestArry, 0x00, u32TestLength);
u8FlahBank = 25;
DVB_FlashReadBank (u8FlahBank, (u32) au8TestArry);
FLASH_DBG(( "\n case6 0[0x%x] 1[0x%x] last[0x%x]\n",
au8TestArry[0], au8TestArry[1], au8TestArry[u32TestLength-1]));
}
break;
#endif /* end #if FLASH_SELTTEST */
#if 0
case 9: /* Dump Flash Data */
DVB_FlashDump (28, 0, 0x40);
DVB_FlashDump (29, 0, 0x80);
break;
#endif
}
}
#endif /* end #if FLASH_TEST */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -