flashmng.c
来自「好记星的控件,包括button,list,对文件操作」· C语言 代码 · 共 1,302 行 · 第 1/5 页
C
1,302 行
return retVal;
}
return FlashMngTableRead();
case FLASH_COMMAND_GETINFO:
((MFlashInfo *)buffer)->uPageSum = g_uFlashBlockUser * g_pFlashPara->uPagePerBlock * g_pFlashPara->uDataPerPage / NORMAL_PAGE_SIZE - FLASH_RESERVE_SECTOR;
((MFlashInfo *)buffer)->uPageSize = NORMAL_PAGE_SIZE;
return NFLS_ERR_NO;
default:
return NFLS_ERR_COMMAND;
}
}
#ifdef FLASH_TEST
/********************************************************************************/
/* FUNCTION: FlashTest */
/* DESCRIPTION:Test flash read, write and erase */
/* Test logical read and write */
/* Test bad block manager(include ECC) */
/* INPUTS: */
/* OUTPUTS: */
/* RETURN: */
/********************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==================================================*/
/* Victor 2005-05-09 create */
/********************************************************************************/
const unsigned char *errStr[] = {
(const unsigned char *)"ok",
(const unsigned char *)"format error, need format",
(const unsigned char *)"battery low",
(const unsigned char *)"bad blocks are too many to use",
(const unsigned char *)"nucleus driver manager error",
(const unsigned char *)"address is out of range",
(const unsigned char *)"illegal command",
(const unsigned char *)"not align linear address with page boundary",
(const unsigned char *)"NFLASH_PARAMETER in not available",
(const unsigned char *)"unknown chip ID",
(const unsigned char *)"busy phase is too long",
(const unsigned char *)"some internal error occur"
};
void FlashTest(void)
{
INT retVal;
UINT i;
UINT j;
UINT k;
GraphClearScreen();
//if((retVal = FlashModInitial()) < 0){
if((retVal = FlashIoCtrl(NFLASH_DRIVENO, FLASH_COMMAND_FORMAT, NULL)) < 0){
goto displayErr;
}
//}
g_pFlashTestDataBuf = &g_FlashTestBuf[0];
g_pFlashTestSpareBuf = &g_FlashTestBuf[CURRENT_PAGE_SIZE];
// Test flash read, write and erase
#ifdef FLASH_PHY_TEST
// flash erase
for(i = FLASH_RESERVE_BLOCK; i < g_pFlashPara->uBlockSum; i ++){
// read block spare
if((retVal = FlashMngReadDriver(FLASH_IO_ONLYSPARE, i*g_pFlashPara->uDataPerBlock,
g_pFlashSpareBuf, CURRENT_SPARE_SIZE)) != CURRENT_SPARE_SIZE){
goto displayErr;
}
if(BLOCK_ATTRIBUTE(g_pFlashSpareBuf) == FLASH_ATTRIBUTE_GOOD){ // this block is a good block
// erase this block
if((retVal = FlashMngEraseDriver(i*g_pFlashPara->uDataPerBlock)) != NFLS_ERR_NO){
goto displayErr;
}
}
}
// flash read: all bytes will be 0xff
for(i = FLASH_RESERVE_BLOCK; i < g_pFlashPara->uBlockSum; i ++){
// read block spare
if((retVal = FlashMngReadDriver(FLASH_IO_ONLYSPARE, i*g_pFlashPara->uDataPerBlock,
g_pFlashSpareBuf, CURRENT_SPARE_SIZE)) != CURRENT_SPARE_SIZE){
goto displayErr;
}
if(BLOCK_ATTRIBUTE(g_pFlashSpareBuf) == FLASH_ATTRIBUTE_GOOD){ // this block is a good block
for(j = 0; j < g_pFlashPara->uPagePerBlock; j++){
// read data and spare
if((retVal = FlashMngReadDriver(FLASH_IO_DATASPARE, i * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage,
&g_FlashBuf[0], CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE)) != CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE){
goto displayErr;
}
// check data and spare
for(k = 0; k < CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE; k++){
if(g_FlashBuf[k] != 0xff){
retVal = -13;
goto displayErr;
}
}
}
}
}
// flash write
for(i = FLASH_RESERVE_BLOCK; i < g_pFlashPara->uBlockSum; i ++){
// read block spare
if((retVal = FlashMngReadDriver(FLASH_IO_ONLYSPARE, i*g_pFlashPara->uDataPerBlock,
g_pFlashSpareBuf, CURRENT_SPARE_SIZE)) != CURRENT_SPARE_SIZE){
goto displayErr;
}
if(BLOCK_ATTRIBUTE(g_pFlashSpareBuf) == FLASH_ATTRIBUTE_GOOD){ // this block is a good block
for(j = 0; j < g_pFlashPara->uPagePerBlock; j++){
// set data and spare
for(k = 0; k < (CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE)/4; k++){
((UINT32 *)g_FlashBuf)[k] = i * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage + k;
}
BLOCK_ATTRIBUTE(g_pFlashSpareBuf) = FLASH_ATTRIBUTE_GOOD;
// write data and spare
if((retVal = FlashMngWriteDriver(FLASH_IO_DATASPARE, i * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage,
&g_FlashBuf[0], CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE)) != CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE){
goto displayErr;
}
}
}
}
// flash read
for(i = FLASH_RESERVE_BLOCK; i < g_pFlashPara->uBlockSum; i ++){
// read block spare
if((retVal = FlashMngReadDriver(FLASH_IO_ONLYSPARE, i*g_pFlashPara->uDataPerBlock,
g_pFlashSpareBuf, CURRENT_SPARE_SIZE)) != CURRENT_SPARE_SIZE){
goto displayErr;
}
if(BLOCK_ATTRIBUTE(g_pFlashSpareBuf) == FLASH_ATTRIBUTE_GOOD){ // this block is a good block
for(j = 0; j < g_pFlashPara->uPagePerBlock; j++){
// read data and spare
if((retVal = FlashMngReadDriver(FLASH_IO_DATASPARE, i * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage,
&g_FlashBuf[0], CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE)) != CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE){
goto displayErr;
}
// check data and spare
for(k = 0; k < (CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE)/4; k++){
if(((UINT32 *)g_FlashBuf)[k] != i * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage + k){
if(k != (CURRENT_PAGE_SIZE + BLOCK_ATTRIBUTE_OFFSET)/4){
retVal = -13;
goto displayErr;
}
}
}
}
}
}
retVal = 0; // all ok
#endif // FLASH_PHY_TEST
//Test logical read and write
#ifdef FLASH_LOG_TEST
// write half block 3
for(j = 0; j < g_pFlashPara->uPagePerBlock/2; j++){
// set data
for(k = 0; k < CURRENT_PAGE_SIZE/4; k++){
((UINT32 *)g_pFlashTestDataBuf)[k] = 3 * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage + k;
}
// write data to logical page
if(FlashIo(0, (3 * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage)/512,
g_pFlashTestDataBuf, 4, FALSE) == 0){
retVal = -11;
goto displayErr;
}
}
// write half block 4
for(j = 0; j < g_pFlashPara->uPagePerBlock/2; j++){
// set data
for(k = 0; k < CURRENT_PAGE_SIZE/4; k++){
((UINT32 *)g_pFlashTestDataBuf)[k] = 4 * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage + k;
}
// write data to logical page
if(FlashIo(0, (4 * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage)/512,
g_pFlashTestDataBuf, 4, FALSE) == 0){
retVal = -11;
goto displayErr;
}
}
///////////////////////////////////////////////////////////////////////////////////////
// read half block 3
for(j = 0; j < g_pFlashPara->uPagePerBlock/2; j++){
// read data from logical page
if(FlashIo(0, (3 * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage)/512,
g_pFlashTestDataBuf, 4, TRUE) == 0){
retVal = -11;
goto displayErr;
}
// check data
for(k = 0; k < CURRENT_PAGE_SIZE/4; k++){
if(((UINT32 *)g_pFlashTestDataBuf)[k] != 3 * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage + k){
retVal = -11;
goto displayErr;
}
}
}
// read half block 4
for(j = 0; j < g_pFlashPara->uPagePerBlock/2; j++){
// read data from logical page
if(FlashIo(0, (4 * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage)/512,
g_pFlashTestDataBuf, 4, TRUE) == 0){
retVal = -11;
goto displayErr;
}
// check data
for(k = 0; k < CURRENT_PAGE_SIZE/4; k++){
if(((UINT32 *)g_pFlashTestDataBuf)[k] != 4 * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage + k){
retVal = -11;
goto displayErr;
}
}
}
///////////////////////////////////////////////////////////////////////////////////////
// write another half block 3
for(j = g_pFlashPara->uPagePerBlock/2; j < g_pFlashPara->uPagePerBlock; j++){
// set data
for(k = 0; k < CURRENT_PAGE_SIZE/4; k++){
((UINT32 *)g_pFlashTestDataBuf)[k] = 3 * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage + k;
}
// write data to logical page
if(FlashIo(0, (3 * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage)/512,
g_pFlashTestDataBuf, 4, FALSE) == 0){
retVal = -11;
goto displayErr;
}
}
// write another half block 4
for(j = g_pFlashPara->uPagePerBlock/2; j < g_pFlashPara->uPagePerBlock; j++){
// set data
for(k = 0; k < CURRENT_PAGE_SIZE/4; k++){
((UINT32 *)g_pFlashTestDataBuf)[k] = 4 * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage + k;
}
// write data to logical page
if(FlashIo(0, (4 * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage)/512,
g_pFlashTestDataBuf, 4, FALSE) == 0){
retVal = -11;
goto displayErr;
}
}
///////////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?