📄 mmcmng.c
字号:
request.nu_function = NU_INPUT;
request.nu_supplemental = FLASH_IO_ONLYSPARE;
request.nu_request_info.nu_input.nu_offset = dwOffset;
request.nu_request_info.nu_input.nu_request_size = dwLen;
request.nu_request_info.nu_input.nu_buffer_ptr = pBuff;
request.nu_request_info.nu_status.nu_logical_unit = 0;
NU_Request_Driver(g_pMmcDriver, &request);
if(request.nu_status != NU_SUCCESS)
return 0;
else
return request.nu_request_info.nu_input.nu_actual_size;
}
/*向Mmc Spare区写数据*/
UINT32 __MmcWriteSpareBytes(UINT32 dwOffset, UINT8* pBuff, UINT32 dwLen, BOOL bCreateBad)
{
NU_DRIVER_REQUEST request; /*device request*/
request.nu_function = NU_OUTPUT;
request.nu_supplemental = FLASH_IO_ONLYSPARE;
request.nu_request_info.nu_output.nu_offset = dwOffset;
request.nu_request_info.nu_output.nu_request_size = dwLen;
request.nu_request_info.nu_output.nu_buffer_ptr = pBuff;
request.nu_request_info.nu_status.nu_logical_unit = 0;
NU_Request_Driver(g_pMmcDriver, &request);
if(request.nu_status != NU_SUCCESS)
return 0;
else
return request.nu_request_info.nu_output.nu_actual_size;
}
/*#define FLASH_FILE_LEN 0x1000
#define FLASH_FILE_NUM 0x100
#define FLASH_FILE_PATH "/MmcTest"
VOID __ShowNumber(UINT16 wID)
{
}
BOOL __MmcFileTest()
{
INT hFile;
UINT8 *pBuf;
UINT8 szFileName[100];
UINT16 i, j, wFileTotal;
UINT32 dwTime1, dwTime2;
BOOL bCheck;
bCheck = TRUE;
ApMakeDir(FLASH_FILE_PATH);
pBuf = MemAlloc(FLASH_FILE_LEN);
if(!pBuf)
return FALSE;
memset(pBuf, 0x5A, FLASH_FILE_LEN);
dwTime1 = TimGetSeconds();
NU_Printf("Write\n");
for(i = 0; i < FLASH_FILE_NUM; i ++)
{
__ShowNumber(i);
sprintf(szFileName, "%s/%d.bin", FLASH_FILE_PATH, i);
// sprintf(szFileName, "%d.bin", i);
hFile = FileOpen(szFileName, FILEMODE_CREATEWRITE);
if(hFile < 0)
break;
if(bCheck == TRUE)
memset(pBuf, i % 256, FLASH_FILE_LEN);
if(FileWrite(hFile, pBuf, FLASH_FILE_LEN) != FLASH_FILE_LEN)
{
FileClose(hFile);
i ++;
break;
}
else
FileClose(hFile);
}
wFileTotal = i;
dwTime2 = TimGetSeconds();
NU_Printf("Write(%d/%ds)\n", wFileTotal, dwTime2 - dwTime1);
if(bCheck)
{
dwTime1 = TimGetSeconds();
NU_Printf("Read\n");
for(i = 0; i < wFileTotal; i ++)
{
__ShowNumber(i);
sprintf(szFileName, "%s/%d.bin", FLASH_FILE_PATH, i);
// sprintf(szFileName, "%d.bin", i);
hFile = FileOpen(szFileName, FILEMODE_READONLY);
if(hFile < 0)
break;
memset(pBuf, 0, FLASH_FILE_LEN);
if(FileRead(hFile, pBuf, FLASH_FILE_LEN) != FLASH_FILE_LEN)
{
FileClose(hFile);
break;
}
FileClose(hFile);
for(j = 0; j < FLASH_FILE_LEN; j ++)
{
if(pBuf[j] != i % 256)
break;
}
if(j < FLASH_FILE_LEN)
break;
}
dwTime2 = TimGetSeconds();
NU_Printf("Read(%d/%ds)\n", i, dwTime2 - dwTime1);
}
dwTime1 = TimGetSeconds();
NU_Printf("Delete\n");
for(i = 0; i < wFileTotal; i ++)
{
__ShowNumber(i);
sprintf(szFileName, "%s/%d.bin", FLASH_FILE_PATH, i);
// sprintf(szFileName, "%d.bin", i);
if(FileDelete(szFileName) != NU_SUCCESS)
break;
}
dwTime2 = TimGetSeconds();
NU_Printf("Delete(%d/%ds)\n", i, dwTime2 - dwTime1);
dwTime1 = TimGetSeconds();
memset(pBuf, 0x5A, FLASH_FILE_LEN);
NU_Printf("Write\n");
for(i = 0; i < FLASH_FILE_NUM; i ++)
{
__ShowNumber(i);
sprintf(szFileName, "%s/%d.bin", FLASH_FILE_PATH, i);
// sprintf(szFileName, "%d.bin", i);
hFile = FileOpen(szFileName, FILEMODE_CREATEWRITE);
if(hFile < 0)
break;
if(bCheck == TRUE)
memset(pBuf, (i + 1) % 256, FLASH_FILE_LEN);
if(FileWrite(hFile, pBuf, FLASH_FILE_LEN) != FLASH_FILE_LEN)
{
FileClose(hFile);
i ++;
break;
}
else
FileClose(hFile);
}
wFileTotal = i;
dwTime2 = TimGetSeconds();
NU_Printf("Write(%d/%ds)\n", wFileTotal, dwTime2 - dwTime1);
if(bCheck)
{
dwTime1 = TimGetSeconds();
NU_Printf("Read\n");
for(i = 0; i < wFileTotal; i ++)
{
__ShowNumber(i);
sprintf(szFileName, "%s/%d.bin", FLASH_FILE_PATH, i);
// sprintf(szFileName, "%d.bin", i);
hFile = FileOpen(szFileName, FILEMODE_READONLY);
if(hFile < 0)
break;
memset(pBuf, 0, FLASH_FILE_LEN);
if(FileRead(hFile, pBuf, FLASH_FILE_LEN) != FLASH_FILE_LEN)
{
FileClose(hFile);
break;
}
FileClose(hFile);
for(j = 0; j < FLASH_FILE_LEN; j ++)
{
if(pBuf[j] != (i + 1) % 256)
break;
}
if(j < FLASH_FILE_LEN)
break;
}
dwTime2 = TimGetSeconds();
NU_Printf("Read(%d/%ds)\n", i, dwTime2 - dwTime1);
}
NU_Printf("Test End!!!\n");
MemFree(pBuf);
// while(1);
return TRUE;
}*/
/*UINT16 __MmcIdmaTestErr(UINT32 dwBlock, UINT16 err)
{
#ifndef __PC__
asm("nop");
#endif
NU_Printf("IdmaTestErr: %lx %d\n", dwBlock, err);
return 0;
}
UINT16 __MmcIdmaTest()
{
UINT32 dwBlockTest;
UINT32 dwOffset;
UINT32 i, j, k;
UINT8 pageStatusSpare[2][16];
UINT8 status;
*((UINT8 *)0x48121) = 0x01; //0x01 ED106正式开发板-1M NorMmc程序区
*((UINT16 *)0x48122) = 0x0001; //0x0001 ED106正式开发板-256K Ram区
dwBlockTest = g_MmcParam.uBlockNum; //16;
NU_Printf("\nIdmaTest_Write");
for(i = 0; i < dwBlockTest; i ++)
{
if(i % 50 == 0)
NU_Printf(">");
if(i == 0)
continue;
status = __MmcReadBlockStatus(i, (UINT8 *)pageStatusSpare);
if(status != FLASH_STATUS_GOOD)
{
NU_Printf("\nBlockBad(%d)", i);
continue;
}
dwOffset = i * g_MmcParam.uBlockSize;
memset(g_MmcReadBuf, 0xFF, g_MmcParam.uBlockSize);
memset(g_MmcSpareBuf, 0xFF, 512);
if(__MmcEraseBlock(dwOffset, FALSE) == FALSE)
return __MmcIdmaTestErr(i, 1);
for(j = 0 ; j < g_MmcParam.uBlockSize; j += 4)
{
k = i * 0x10000 + j;
*(UINT32 *)(g_MmcReadBuf +j) = k;
}
for(j = 0 ; j < 512; j += 4)
{
k = i * 0x10000 + j + 1;
if((j == 4) || (j == 20))
k |= 0xFF00;
*(UINT32 *)(g_MmcSpareBuf +j) = k;
}
if(__MmcWriteBytes(dwOffset, g_MmcReadBuf, g_MmcParam.uBlockSize, FALSE)
!= g_MmcParam.uBlockSize)
return __MmcIdmaTestErr(i, 2);
if(__MmcWriteSpareBytes(dwOffset, g_MmcSpareBuf, 512, FALSE)
!= 512)
return __MmcIdmaTestErr(i, 3);
}
NU_Printf("\nIdmaTest_Read");
for(i = 0; i < dwBlockTest; i ++)
{
if(i % 50 == 0)
NU_Printf(">");
if(i == 0)
continue;
status = __MmcReadBlockStatus(i, (UINT8 *)pageStatusSpare);
if(status != FLASH_STATUS_GOOD)
{
NU_Printf("\nBlockBad(%d)", i);
continue;
}
dwOffset = i * g_MmcParam.uBlockSize;
memset(g_MmcReadBuf, 0xFF, g_MmcParam.uBlockSize);
memset(g_MmcSpareBuf, 0xFF, 512);
if(__MmcReadBytes(dwOffset, g_MmcReadBuf, g_MmcParam.uBlockSize)
!= g_MmcParam.uBlockSize)
return __MmcIdmaTestErr(i, 4);
if(__MmcReadSpareBytes(dwOffset, g_MmcSpareBuf, 512)
!= 512)
return __MmcIdmaTestErr(i, 5);
for(j = 0 ; j < g_MmcParam.uBlockSize; j += 4)
{
k = i * 0x10000 + j;
if(*(UINT32 *)(g_MmcReadBuf +j) != k)
return __MmcIdmaTestErr(i, 6);
}
for(j = 0 ; j < 512; j += 4)
{
k = i * 0x10000 + j + 1;
if((j == 4) || (j == 20))
k |= 0xFF00;
if(*(UINT32 *)(g_MmcSpareBuf +j) != k)
return __MmcIdmaTestErr(i, 7);
}
}
NU_Printf("\nIdmaTest_End");
while(1)
SysWatchClear();
return 0;
}
UINT16 __MmcIdmaTest(BOOL bFreqHigh)
{
UINT32 dwBlockTest;
UINT32 dwOffset;
UINT32 i, j, k;
UINT8 pageStatusSpare[2][16];
UINT8 status;
#ifndef __PC__
if(bFreqHigh == TRUE)
{
*((UINT8 *)0x48121) = 0x00; //0x01 ED106正式开发板-1M NorMmc程序区
*((UINT16 *)0x48122) = 0x0000; //0x0001 ED106正式开发板-256K Ram区
}
else
{
*((UINT8 *)0x48121) = 0x01; //0x01 ED106正式开发板-1M NorMmc程序区
*((UINT16 *)0x48122) = 0x0001; //0x0001 ED106正式开发板-256K Ram区
}
#endif
dwBlockTest = 2; //g_MmcParam.uBlockNum; //16;
// NU_Printf("\nIdmaTest_Write");
for(i = 1; i < dwBlockTest; i ++)
{
status = __MmcReadBlockStatus(i, (UINT8 *)pageStatusSpare);
if(status != FLASH_STATUS_GOOD)
{
NU_Printf("\nBlockBad(%d)", i);
continue;
}
dwOffset = i * g_MmcParam.uBlockSize;
memset(g_MmcReadBuf, 0xFF, g_MmcParam.uBlockSize);
memset(g_MmcSpareBuf, 0xFF, 512);
if(__MmcEraseBlock(dwOffset, FALSE) == FALSE)
return __MmcIdmaTestErr(i, 1);
for(j = 0 ; j < g_MmcParam.uBlockSize; j += 2)
{
k = j;
*(UINT16 *)(g_MmcReadBuf +j) = k;
}
for(j = 0 ; j < 512; j += 2)
{
k = j + 1;
if((j == 4) || (j == 20))
k |= 0xFF00;
*(UINT16 *)(g_MmcSpareBuf +j) = k;
}
if(__MmcWriteBytes(dwOffset, g_MmcReadBuf, g_MmcParam.uBlockSize, FALSE)
!= g_MmcParam.uBlockSize)
return __MmcIdmaTestErr(i, 2);
if(__MmcWriteSpareBytes(dwOffset, g_MmcSpareBuf, 512, FALSE)
!= 512)
return __MmcIdmaTestErr(i, 3);
}
NU_Printf("\nIdmaTest_Read");
for(i = 1; i < dwBlockTest; i ++)
{
status = __MmcReadBlockStatus(i, (UINT8 *)pageStatusSpare);
if(status != FLASH_STATUS_GOOD)
{
NU_Printf("\nBlockBad(%d)", i);
continue;
}
dwOffset = i * g_MmcParam.uBlockSize;
memset(g_MmcReadBuf, 0xFF, g_MmcParam.uBlockSize);
memset(g_MmcSpareBuf, 0xFF, 512);
if(__MmcReadBytes(dwOffset, g_MmcReadBuf, g_MmcParam.uBlockSize)
!= g_MmcParam.uBlockSize)
return __MmcIdmaTestErr(i, 4);
if(__MmcReadSpareBytes(dwOffset, g_MmcSpareBuf, 512)
!= 512)
return __MmcIdmaTestErr(i, 5);
for(j = 0 ; j < g_MmcParam.uBlockSize; j += 2)
{
k = j;
if(*(UINT16 *)(g_MmcReadBuf +j) != k)
return __MmcIdmaTestErr(i, *(UINT16 *)(g_MmcReadBuf +j) - k);
}
for(j = 0 ; j < 512; j += 2)
{
k = j + 1;
if((j == 4) || (j == 20))
k |= 0xFF00;
if(*(UINT16 *)(g_MmcSpareBuf +j) != k)
return __MmcIdmaTestErr(i, 7);
}
}
NU_Printf("\nIdmaTest_End");
while(1)
SysWatchClear();
return 0;
}
*/
BOOL __MmcSpareCheckErr(UINT32 dwBlock, UINT32 dwErr)
{
NU_Printf("SpareCheckErr: %d, %d \n", dwBlock, dwErr);
return FALSE;
}
BOOL __MmcSpareCheck(UINT32 dwBlock)
{
UINT32 dwOffset, i;
UINT8 TempSpare[512];
dwOffset = dwBlock * g_MmcParam.uBlockSize;
if(__MmcReadSpareBytes(dwOffset , (UINT8 *)TempSpare, 512) != 512)
return __MmcSpareCheckErr(dwBlock, -1);
// if(__MmcReadBytes(dwOffset, g_MmcReadBuf, g_MmcParam.uBlockSize) != g_MmcParam.uBlockSize)
// return __MmcSpareCheckErr(dwBlock, -2);
if((TempSpare[5] != 0xFF) || (TempSpare[21] != 0xFF))
return TRUE;
for(i = 0;i < 512; i ++)
{
if((i <= 1) || (i == 12) || (i >= 510) || ((i % 16) == 2))
continue;
if(TempSpare[i] != 0xFF)
return __MmcSpareCheckErr(dwBlock, i);
}
return TRUE;
}
/*
static BOOL prj_bCardExist = TRUE;
BOOL IsCardExist(VOID)
{
return prj_bCardExist;
}
BOOL __IsCardExist(VOID)
{
return prj_bCardExist;
}
BOOL MmcSwitch(VOID)
{
prj_bCardExist = !prj_bCardExist;
return prj_bCardExist;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -