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

📄 nand.c

📁 freescale i.mx31 BSP CE5.0全部源码
💻 C
📖 第 1 页 / 共 5 页
字号:
                        dwBlockStatus = FMD_GetBlockStatus(dwBlock);
                        if(!(dwBlockStatus & BLOCK_STATUS_UNKNOWN) && !(dwBlockStatus & BLOCK_STATUS_BAD))
                        {
                            dwStartSectorAddr = dwBlock * g_FlashInfo.wSectorsPerBlock;
                            dwCount = dwNumSectors > g_FlashInfo.wSectorsPerBlock? g_FlashInfo.wSectorsPerBlock : dwNumSectors;
                            if(FMD_ReadSector((SECTOR_ADDR)dwStartSectorAddr,
                                                (LPBYTE)dwDestAddress, NULL, 
                                                dwCount) != TRUE)
                            {
                                OALMSG(OAL_ERROR, (TEXT("ERROR: Failed to read EBOOT image.\r\n")));
                                fErr = TRUE;
                                break;
                            }
                            else
                            {
                                dwNumSectors -= dwCount;
                                dwDestAddress += dwCount * g_FlashInfo.wDataBytesPerSector;
                                if(dwNumSectors == 0)
                                    break;
                            }
                        }
                        else
                            OALMSG(OAL_INFO, (TEXT("block %d bad.\r\n"), dwBlock));

                        dwBlock++;
                    };
                    if(fErr == FALSE)
                    {
                        OALMSG(OAL_INFO, (TEXT("INFO: EBOOT image at %X.\r\n"), EBOOT_FCACHE_START));
                        DisplayMem(EBOOT_FCACHE_START, NAND_EBOOT_IMAGE_SIZE, 0x100);
                    }
                }
                else
                    OALMSG(OAL_INFO, (TEXT("INFO: NAND device non existent.\r\n")));
                break;

            case '7':
                if(g_fNandExists == TRUE)
                {
                    if(FMD_ReadSector((SECTOR_ADDR)0,
                                        (LPBYTE)EBOOT_FCACHE_START, NULL, 
                                        NAND_IMAGE_NUM_SECTOR(NAND_LOADER_IMAGE_SIZE, g_FlashInfo.wDataBytesPerSector)) != TRUE)
                    {
                        OALMSG(OAL_ERROR, (TEXT("ERROR: Failed to read NAND Loader image.\r\n")));
                    }
                    else
                    {
                        OALMSG(OAL_INFO, (TEXT("INFO: NAND Loader image at %X.\r\n"), EBOOT_FCACHE_START));
                        DisplayMem(EBOOT_FCACHE_START, NAND_LOADER_IMAGE_SIZE, 0x100);
                    }
                }
                else
                    OALMSG(OAL_INFO, (TEXT("INFO: NAND device non existent.\r\n")));
                break;

            case '8':
                if(g_fNandExists == TRUE)
                {
                    DWORD dwBlock;
                    do
                    {
                        OALMSG(1, (TEXT("Enter bad block number(1-%d): "), (g_FlashInfo.dwNumBlocks - 1)));
                        dwBlock = GetBlockNumberInput();

                        if(dwBlock >= 1 && dwBlock < g_FlashInfo.dwNumBlocks)
                        {
                            if(FMD_SetBlockStatus(dwBlock, BLOCK_STATUS_BAD) != TRUE)
                                OALMSG(OAL_ERROR, (TEXT("ERROR: Failed to set block %d bad.\r\n"), dwBlock));
                            else
                                OALMSG(OAL_INFO, (TEXT("INFO: block %d set as bad.\r\n"), dwBlock));
                        }
                    } while(dwBlock != -1);
                }
                else
                    OALMSG(OAL_INFO, (TEXT("INFO: NAND device non existent.\r\n")));
                break;

            case '9':
                if(g_fNandExists == TRUE)
                {
                    DWORD dwBlock;
                    DWORD dwStartBlock;
                    DWORD dwEndBlock;
                    while(1)
                    {
                        OALMSG(1, (TEXT("Enter erase start block number(0-%d): "), (g_FlashInfo.dwNumBlocks - 1)));
                        dwBlock = GetBlockNumberInput();
                        if(dwBlock != -1 && dwBlock >= 0 && dwBlock < g_FlashInfo.dwNumBlocks)
                        {
                            dwStartBlock = dwBlock;
                            break;
                        }
                    };
                    while(1)
                    {
                        OALMSG(1, (TEXT("Enter erase end block number(%d-%d): "), dwStartBlock, (g_FlashInfo.dwNumBlocks - 1)));
                        dwBlock = GetBlockNumberInput();
                        if(dwBlock < 0 || dwBlock > g_FlashInfo.dwNumBlocks || dwBlock < dwStartBlock)
                        {
                            OALMSG(1, (TEXT("Invalid block number %d\r\n"), dwBlock));
                            continue;
                        }
                        else
                        {
                            dwEndBlock = dwBlock;
                            break;
                        }

                    };
                    while(dwStartBlock <= dwEndBlock)
                    {
                        if(FMD_EraseBlock(dwStartBlock) != TRUE)
                            OALMSG(OAL_ERROR, (TEXT("ERROR: Failed to erase block %d.\r\n"), dwStartBlock));
                        else
                            OALMSG(1, (TEXT("INFO: block %d erased.\r\n"), dwStartBlock));
                        dwStartBlock++;
                    }
                }
                else
                    OALMSG(OAL_INFO, (TEXT("INFO: NAND device non existent.\r\n")));
                break;

             //zhongtao@
            case 'A':
            case 'a':
                if(g_fNandExists == TRUE)
                {
                    DWORD dwBlock;
                    do
                    {
                        OALMSG(1, (TEXT("Enter fill block number(1-%d): "), (g_FlashInfo.dwNumBlocks - 1)));
                        dwBlock = GetBlockNumberInput();

                        if(dwBlock >= 1 && dwBlock < g_FlashInfo.dwNumBlocks)
                        {
                            if(FMD_WriteSector(dwBlock*g_FlashInfo.wSectorsPerBlock, (LPBYTE)0x88000000, (PSectorInfo)NULL, 1) != TRUE)
                                OALMSG(OAL_ERROR, (TEXT("ERROR: Failed to fill data  block %d.\r\n"), dwBlock));
                            else
                                OALMSG(OAL_INFO, (TEXT("INFO: block %d fill data from 0x88000000.\r\n"), dwBlock));
                        }
                    } while(dwBlock != -1);
                }
                else
                    OALMSG(OAL_INFO, (TEXT("INFO: NAND device non existent.\r\n")));
                break;

            case 'D':
            case 'd':
                if(g_fNandExists == TRUE)
                {
                    DWORD dwSector;
                    DWORD dwMaxSector;
                    DWORD *pImage = (DWORD *)EBOOT_FCACHE_START;

                    dwMaxSector = g_FlashInfo.dwNumBlocks * g_FlashInfo.wSectorsPerBlock - 1;
                    while(1)
                    {
                        DEBUGMSG(1, (TEXT("Enter start sector number(0-%d): "), dwMaxSector));
                        dwSector = GetUserInputNumber();
                        if(dwSector != -1 && dwSector >= 0 && dwSector < dwMaxSector)
                        {
                            break;
                        }
                    };
                    //while(dwSector <= dwMaxSector)
                    {
                        if(FMD_ReadSector((SECTOR_ADDR)dwSector, (LPBYTE)pImage, NULL, 1) != TRUE)
                        {
                            OALMSG(OAL_ERROR, (TEXT("ERROR: Failed to read EBOOT image.\r\n")));
                        }
                        else
                        {
                            OALMSG(OAL_INFO, (TEXT("INFO: sector 0x%X data\r\n"), dwSector));
                            DisplayMem((DWORD)pImage, g_FlashInfo.wDataBytesPerSector, 0x100);
                        }
                        dwSector++;
                        pImage += g_FlashInfo.wDataBytesPerSector / sizeof(DWORD);
                    }
                }
                else
                    DEBUGMSG(1, (TEXT("WARNING: NAND device not present.\r\n")));
                break;

            case 'S':
            case 's':
                if(g_fNandExists == TRUE)
                {
                    DWORD dwBlock;
		      DWORD dwStatus;			
                    do
                    {
                        DEBUGMSG(1, (TEXT("Enter block number(1-%d): "), (g_FlashInfo.dwNumBlocks - 1)));
                        dwBlock = GetUserInputNumber();

                        if(dwBlock >= 1 && dwBlock < g_FlashInfo.dwNumBlocks)
                        {
                            dwStatus = FMD_GetBlockStatus(dwBlock);
                           DEBUGMSG(1, (TEXT("status(%#x)\r\n"), dwStatus));							
                        }
                    } while(dwBlock != -1);
                }
                else
                    DEBUGMSG(1, (TEXT("WARNING: NAND device not present.\r\n")));
                break;

            case 'I':
            case 'i':
                EdbgOutputDebugString("NAND flash information:\r\n");
                EdbgOutputDebugString("Number of blocks: %d\r\n", g_FlashInfo.dwNumBlocks);
                EdbgOutputDebugString("Sectors per block: %d\r\n", g_FlashInfo.wSectorsPerBlock);
                EdbgOutputDebugString("Sector size: %d\r\n", g_FlashInfo.wDataBytesPerSector);
                EdbgOutputDebugString("Data port width: %d\r\n", g_FlashWidth);
                break;

            case 'Z':
            case 'z':
                memset((void*)(EBOOT_FCACHE_START+EBOOT_IMAGE_SIZE), 0, EBOOT_IMAGE_SIZE);
                break;

            case 'R':
            case 'r':
                {
                    extern BOOL CS8900ReadEEPROM(UINT16, UINT16*);

                    UINT16 data;
                    DWORD addr; 
                    do
                    {
                        DEBUGMSG(1, (TEXT("Enter EEPROM Addr(0-63): ")));
                        addr = GetUserInputNumber();

                        if((addr <= 63) && CS8900ReadEEPROM((UINT16)addr, &data)){
                           DEBUGMSG(1, (TEXT("%#x\r\n"), data));							
                        }
                    } while(addr != -1);
                }
                break;

            case 'P':
            case 'p':
                {
                    extern BOOL CS8900WriteEEPROM(UINT16, UINT16);

                     BOOL b = TRUE;
                     int i;
                     for(i = 0; i<=63; i++){
                         b = b && CS8900WriteEEPROM(i, 0xFFFF);
                     }
                    DEBUGMSG(1, (TEXT("%s\r\n"), b? L"success": L"fail"));							
                }
                break;

             //zhongtao#
#endif
            case 'N':
            case 'n':
                g_BINRegionInfo.dwNumRegions = 1;
                g_BINRegionInfo.Region[0].dwRegionLength = EBOOT_IMAGE_SIZE;
                g_BINRegionInfo.Region[0].dwRegionStart =   EBOOT_RAM_IMAGE_START;  
                g_BINRegionInfo.Region[0].szFileName[0] = '\0'; 
                WriteNandLoaderRegionToNand(NULL);
                break;

            case 'E':
            case 'e':
                g_BINRegionInfo.dwNumRegions = 1;
                g_BINRegionInfo.Region[0].dwRegionLength = EBOOT_IMAGE_SIZE;
                g_BINRegionInfo.Region[0].dwRegionStart =   EBOOT_RAM_IMAGE_START;  
                g_BINRegionInfo.Region[0].szFileName[0] = '\0'; 
                WriteEBootRegionToNand(NULL);
                break;

            case 'K':
            case 'k':
                g_BINRegionInfo.dwNumRegions = 1;
                g_BINRegionInfo.Region[0].dwRegionLength = 63*1024*1024;
                g_BINRegionInfo.Region[0].dwRegionStart =   IMAGE_WINCE_CODE_RAM_CA_START;  
                g_BINRegionInfo.Region[0].szFileName[0] = '\0'; 
                WriteOSRegionsToNand(pBootCfg);
                break;

            case 'b':
            case 'B':
                // Return To Main Menu.
                bExitMenu = TRUE;
                break;
            
            default:
                break;
        }
    } while(bExitMenu == FALSE);

    return bImageExists;
}

//-----------------------------------------------------------------------------
// PRIVATE FUNCTIONS
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------**
//
//  FUNCTION:        GetKernelExtPointer
//
//  DESCRIPTION:    Used to locate the kernel region's extension area.
//
//  PARAMETERS:        
//            dwRegionStart - start of region
//            dwRegionLength - size of region
//
//  RETURNS:        
//             Pointer to kernel's extension area. NULL if failure.
//-----------------------------------------------------------------------------
static PVOID GetKernelExtPointer(DWORD dwRegionStart, DWORD dwRegionLength)
{
    DWORD dwCacheAddress = 0;
    ROMHDR *pROMHeader;
    DWORD dwNumModules = 0;
    TOCentry *pTOC;

    OALMSG(OAL_FUNC, (TEXT("GetKernelExtPointer+\r\n")));

    if (dwRegionStart == 0 || dwRegionLength == 0)
    {
        OALMSG(OAL_ERROR, (TEXT("ERROR: dwRegionStart:%X dwRegionLength:%X\r\n"),
                    dwRegionStart, dwRegionLength));
        return(NULL);
    }

    if (*(LPDWORD)OEMMapMemAddr(dwRegionStart, dwRegionStart + ROM_SIGNATURE_OFFSET) != ROM_SIGNATURE)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -