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

📄 amd.c

📁 Microsoft WinCE 6.0 BSP FINAL release source code for use with the i.MX27ADS TO2 WCE600_FINAL_MX27_S
💻 C
📖 第 1 页 / 共 5 页
字号:
            // a timeout has occurred (DQ5 -> 1) then there is a failure.
            // **********************************************************
            if ((ulDataWritten & CREATE_MASK_16(bIsPaired, AMD_FLASH_DQ5_X16)) 
                == CREATE_MASK_16(bIsPaired, AMD_FLASH_DQ5_X16)) {
                ERRORMSG(ZONE_HAL_ERROR, 
                    (TEXT("ERROR: Erase chip timeout Poll cnt %d - [0x%x] rd value[0]:0x%x\r\n"), 
                    i, ulFlashBase, ulDataWritten));
                break;
            }
        }
    }

    // return to read array mode by issuing a soft reset
    WR_FLASH_REG_INDEXED16(bIsPaired, ulFlashBase, 
        CYCLE_1_ADDR_RESET, CYCLE_1_DATA_RESET);

    DEBUGMSG(ZONE_HAL_FUNCTION, (TEXT("AMDx16_EraseChip-\r\n")));
    return bDone;
}

// WARNING: for relocation purpose. Do not move!
void AMDx16_RelocateEnd(void)
{
}

//-----------------------------------------------------------------------------
//
// Function: AMDx16_LockSector
//
// Function performs dynamic locking of a sector.
// For 16bit mode flash devices.
//
// Parameters:
//      pFlashDesc
//          [in] pointer to NOR flash descriptor
//
//      ulSectorAddress
//          [in] sector address to lock
//
// Returns:
//      FALSE on failure
//
//-----------------------------------------------------------------------------
BOOL AMDx16_LockSector(NOR_FLASH_DESC *pFlashDesc, ULONG ulSectorAddress)
{
    ULONG ulFlashBase;
    BOOL bIsPaired;
    BOOL bLock;

    DEBUGMSG(ZONE_HAL_FUNCTION, (TEXT("AMDx16_LockSector+ 0x%x 0x%x\r\n"), 
        pFlashDesc, ulSectorAddress));

    if (!pFlashDesc) {
    	DEBUGMSG(ZONE_HAL_ERROR, (TEXT("AMDx16_LockSector: null param\r\n")));
        return FALSE;
    }
        
    bIsPaired = pFlashDesc->PairedFlash;
    ulFlashBase = pFlashDesc->FlashBase;
    
    // Issue DYB write command
    // **************************
    WR_FLASH_REG_INDEXED16(bIsPaired, ulFlashBase, 
        CYCLE_1_ADDR_UNLOCK_x16, CYCLE_1_DATA_UNLOCK);
    
    WR_FLASH_REG_INDEXED16(bIsPaired, ulFlashBase, 
        CYCLE_2_ADDR_UNLOCK_x16, CYCLE_2_DATA_UNLOCK);
    
    WR_FLASH_REG_INDEXED16(bIsPaired, ulFlashBase, 
        CYCLE_3_ADDR_CMD_x16, CYCLE_3_DATA_DYB_WRITE);
    
    WR_FLASH_REG_16(bIsPaired, ulSectorAddress, 
        CYCLE_4_DATA_DYB_WRITE);

    bLock = AMDx16_IsSectorLocked(pFlashDesc, ulSectorAddress);

    // return to read array mode by issuing a soft reset
    WR_FLASH_REG_INDEXED16(bIsPaired, ulFlashBase, 
        CYCLE_1_ADDR_RESET, CYCLE_1_DATA_RESET);

    DEBUGMSG(ZONE_HAL_FUNCTION, (TEXT("AMDx16_LockSector-\r\n")));
    
    if (!bLock)
        return FALSE;
    else
        return TRUE;
}

//-----------------------------------------------------------------------------
//
// Function: AMDx16_UnlockSector
//
// Function performs dynamic unlocking of a sector.
// For 16bit mode flash devices.
//
// Parameters:
//      pFlashDesc
//          [in] pointer to NOR flash descriptor
//
//      ulSectorAddress
//          [in] sector address to unlock
//
// Returns:
//      FALSE on failure
//
//-----------------------------------------------------------------------------
BOOL AMDx16_UnlockSector(NOR_FLASH_DESC *pFlashDesc, 
    ULONG ulSectorAddress)
{
    ULONG ulFlashBase;
    BOOL bIsPaired;
    BOOL bLock;
    
    DEBUGMSG(ZONE_HAL_FUNCTION, (TEXT("AMDx16_UnlockSector+ 0x%x 0x%x\r\n"), 
        pFlashDesc, ulSectorAddress));

    if (!pFlashDesc) {
    	DEBUGMSG(ZONE_HAL_ERROR, (TEXT("AMDx16_UnlockSector: null param\r\n")));
        return FALSE;
    }
        
    bIsPaired = pFlashDesc->PairedFlash;
    ulFlashBase = pFlashDesc->FlashBase;
    
    // Issue DYB erase command
    // **************************
    WR_FLASH_REG_INDEXED16(bIsPaired, ulFlashBase, 
        CYCLE_1_ADDR_UNLOCK_x16, CYCLE_1_DATA_UNLOCK);
    
    WR_FLASH_REG_INDEXED16(bIsPaired, ulFlashBase, 
        CYCLE_2_ADDR_UNLOCK_x16, CYCLE_2_DATA_UNLOCK);
    
    WR_FLASH_REG_INDEXED16(bIsPaired, ulFlashBase, 
        CYCLE_3_ADDR_CMD_x16, CYCLE_3_DATA_DYB_ERASE);
    
    WR_FLASH_REG_16(bIsPaired, ulSectorAddress, 
        CYCLE_4_DATA_DYB_ERASE);

    bLock = AMDx16_IsSectorLocked(pFlashDesc, ulSectorAddress);

    // return to read array mode by issuing a soft reset
    WR_FLASH_REG_INDEXED16(bIsPaired, ulFlashBase, 
        CYCLE_1_ADDR_RESET, CYCLE_1_DATA_RESET);

    DEBUGMSG(ZONE_HAL_FUNCTION, (TEXT("AMDx16_LockSector-\r\n")));
    
    if (bLock)
        return FALSE;
    else
        return TRUE;
}

//-----------------------------------------------------------------------------
//
// Function: AMDx16_IsSectorLocked
//
// Function checks the dynamic lock bit to see if block has been locked.
// For 16bit mode flash devices.
//
// Parameters:
//      pFlashDesc
//          [in] pointer to NOR flash descriptor
//
//      ulSectorAddress
//          [in] sector address to check lock status
//
// Returns:
//      FALSE if not locked.
//
//-----------------------------------------------------------------------------
BOOL AMDx16_IsSectorLocked(NOR_FLASH_DESC *pFlashDesc, ULONG ulSectorAddress)
{
    ULONG ulFlashBase;
    BOOL bIsPaired;
    BOOL bLocked;

    DEBUGMSG(ZONE_HAL_FUNCTION, (TEXT("AMDx16_IsSectorLocked+ 0x%x 0x%x\r\n"),
        pFlashDesc, ulSectorAddress));

    if (!pFlashDesc) {
    	DEBUGMSG(ZONE_HAL_ERROR, (TEXT("AMDx16_IsSectorLocked: null param\r\n")));
        return FALSE;
    }
        
    bIsPaired = pFlashDesc->PairedFlash;
    ulFlashBase = pFlashDesc->FlashBase;
    
    // Issue DYB status command
    // **************************
    WR_FLASH_REG_INDEXED16(bIsPaired, ulFlashBase, 
        CYCLE_1_ADDR_UNLOCK_x16, CYCLE_1_DATA_UNLOCK);
    
    WR_FLASH_REG_INDEXED16(bIsPaired, ulFlashBase, 
        CYCLE_2_ADDR_UNLOCK_x16, CYCLE_2_DATA_UNLOCK);
    
    WR_FLASH_REG_INDEXED16(bIsPaired, ulFlashBase, 
        CYCLE_3_ADDR_CMD_x16, CYCLE_3_DATA_DYB_STATUS);
    
    if (CHECK_FLASH_STATUS_16(bIsPaired, ulFlashBase, 1))
        bLocked = TRUE;
    else
        bLocked = FALSE;

    // return to read array mode by issuing a soft reset
    WR_FLASH_REG_INDEXED16(bIsPaired, ulFlashBase, 
        CYCLE_1_ADDR_RESET, CYCLE_1_DATA_RESET);

    DEBUGMSG(ZONE_HAL_FUNCTION, (TEXT("AMDx16_IsSectorLocked-\r\n")));
    return bLocked;
}

//-----------------------------------------------------------------------------
// PRIVATE FUNCTIONS
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//
// Function: PrintPriExtTable
//
// Function prints the AMD CFI primary extented table.
//
// Parameters:
//      pPET
//          [in] pointer to AMD CFI primary extented table.
//
// Returns:
//      None
//
//-----------------------------------------------------------------------------
static void PrintPriExtTable(AMD_PET_QUERY_INFO *pPET)
{
    ULONG i;

    DEBUGMSG(ZONE_HAL_INFO, (TEXT("****Primary Vendor Extended Query Data****\r\n")));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Query-unique ASCII string: %c%c%c\r\n"), pPET->ID[0], pPET->ID[0], pPET->ID[0]));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Major version number: %c\r\n"), pPET->VersionMajor));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Minor version number: %c\r\n"), pPET->VersionMinor));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Address Sensitive Unlock: %d\r\n"), pPET->AddrUnlockSiTech));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Erase Suspend Support: %d\r\n"), pPET->EraseSuspendSupport));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Sector Protect group size: %d\r\n"), pPET->SectorProtectGroupSize));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Temporary sector unprotect support: %d\r\n"), pPET->SectorTempUnprotectSupport));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Sector Protect/Unprotect scheme: %d\r\n"), pPET->SectorProtectScheme));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Simultaneous Operation support: %d\r\n"), pPET->SimulOperationSupport));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Burst Mode support: %d\r\n"), pPET->BurstModeSupport));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Page Mode support: %d\r\n"), pPET->PageModeSupport));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("ACC [Acceleration] Supply Minimum: %d\r\n"), pPET->ACCVmin));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("ACC [Acceleration] Supply Maximum: %d\r\n"), pPET->ACCVmax));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Boot sector support: %d\r\n"), pPET->BootSectorSupport));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Unlock bypass support: %d\r\n"), pPET->UnlockBypassSupport));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Customer secure Si area size: %d\r\n"), pPET->SecSiSize));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Embedded HW reset TO max (ns): %d\r\n"), pPET->EmbeddedHwResetTOMax_ns));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Non-embedded HW reset TO max (ns): %d\r\n"), pPET->NonEmbeddedHwResetTOMax_ns));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Erase Suspend timeout maximum (us): %d\r\n"), pPET->EraseSuspendTOMax_us));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Program Suspend timeout maximum (us): %d\r\n"), pPET->ProgramSuspendTOMax_us));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Number of banks: %d\r\n"), pPET->NumBanks));
    
    for (i = 0; i < pPET->NumBanks; i++)
        DEBUGMSG(ZONE_HAL_INFO, (TEXT("Bank %d - Num sectors: %d\r\n"), i, pPET->SectorsInBank[i]));
}

//-----------------------------------------------------------------------------
//
// Function: PrintFlashProgInfo
//
// Function prints the internal flash programming information.
//
// Parameters:
//      pInfo
//          [in] pointer to internal flash programming information struct.
//
// Returns:
//      None
//
//-----------------------------------------------------------------------------
static void PrintFlashProgInfo(FLASH_PROG_INFO *pInfo)
{
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("****Flash Programming Info****\r\n")));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Single byte/word prog TO (us): %d\r\n"), pInfo->ulDatumProgTO_us));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Single byte/word prog TO factor: %d\r\n"), pInfo->ulMaxDatumProgTOFactor));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Min size buffer prog TO (us): %d\r\n"), pInfo->ulBufferProgTO_us));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Min size buffer prog TO factor: %d\r\n"), pInfo->ulMaxBufferProgTOFactor));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Sector erase TO (ms): %d\r\n"), pInfo->ulSectorEraseTO_ms));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Sector erase TO factor: %d\r\n"), pInfo->ulMaxSectorEraseTOFactor));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Chip erase TO: %d\r\n"), pInfo->ulChipEraseTO_ms));
    DEBUGMSG(ZONE_HAL_INFO, (TEXT("Chip erase TO factor: %d\r\n"), pInfo->ulMaxChipEraseTOFactor));
}
//-----------------------------------------------------------------------------
// END OF FILE
//-----------------------------------------------------------------------------

⌨️ 快捷键说明

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