⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmcmng.c

📁 好记星的控件,包括button,list,对文件操作
💻 C
📖 第 1 页 / 共 4 页
字号:
    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 + -