📄 ct_flash.c
字号:
typedef struct _CT_FLASH_INFO
{
u32 u32Manufacture; /*!< The manufacturer ID of flash not support CFI. */
u32 u32Device; /*!< The device ID of flash. */
u8 u8BlockSizeIndex;
} CT_FLASH_INFO;
typedef struct _CT_FLASH_BLOCK_SIZE
{
unsigned int num_erase_blocks; /*!< Number of sector defs. */
unsigned long sector_size[5]; /*!< Byte size of sector */
unsigned int num_sectors[5]; /*!< Num sectors of this size */
} CT_FLASH_BLOCK_SIZE;
static CT_FLASH_BLOCK_SIZE const stBlockSizeTable[]=
{
{1, {0x1000, 0, 0, 0, 0}, { 128, 0, 0, 0, 0}},//4M 4Kx128
{1, {0x1000, 0, 0, 0, 0}, { 256, 0, 0, 0, 0}},//8M 4Kx256
{1, {0x1000, 0, 0, 0, 0}, { 512, 0, 0, 0, 0}},//16M 4Kx512
{1, {0x1000, 0, 0, 0, 0}, { 1024, 0, 0, 0, 0}},//32M 4Kx1024
{5, {0x10000, 0x8000, 0x4000, 0x2000, 0x1000}, { 7, 1, 1, 1, 2}},//4MTop
{5, {0x1000 , 0x2000, 0x4000, 0x8000, 0x10000}, { 2, 1, 1, 1, 7}},//4MBottom
{5, {0x10000, 0x8000, 0x4000, 0x2000, 0x1000}, { 15, 1, 1, 1, 2}},//8MTop
{5, {0x1000 , 0x2000, 0x4000, 0x8000, 0x10000}, { 2, 1, 1, 1, 15}},//8MBottom
{5, {0x10000, 0x8000, 0x4000, 0x2000, 0x1000}, { 31, 1, 1, 1, 2}},//16MTop
{5, {0x1000 , 0x2000, 0x4000, 0x8000, 0x10000}, { 2, 1, 1, 1, 31}},//16MBottom
{1, {0x10000, 0, 0, 0, 0}, { 8, 0, 0, 0, 0}},//4M 64Kx8
{1, {0x10000, 0, 0, 0, 0}, { 16, 0, 0, 0, 0}},//8M 64Kx16
{1, {0x10000, 0, 0, 0, 0}, { 32, 0, 0, 0, 0}},//16M 64Kx32
{1, {0x10000, 0, 0, 0, 0}, { 64, 0, 0, 0, 0}},//32M 64Kx64
{1, {0x10000, 0, 0, 0, 0}, { 128, 0, 0, 0, 0}},//64M 64Kx128
};
typedef enum _SPIFlashStruct
{
en4Mx128 = 0, //4M 4k x 128 Sector
en8Mx256, //8M 4k x 256 Sector
en16Mx512, //16M 4k x 512 Sector
en32Mx1024, //32M 4k x 1024 Sector
en4MTOP, //4M TOP
en4MBTM, //4M BOTTOM
en8MTOP, //8M TOP
en8MBTM, //8M BOTTOM
en16MTOP, //8M TOP
en16MBTM, //8M BOTTOM
en4Mx8, //4M 64k x 8 Sector
en8Mx16, //8M 64k x 16 Sector
en16Mx32, //16M 64k x 32 Sector
en32Mx64, //32M 64k x 64 Sector
en64Mx128, //64M 64k x 128 Sector
} SPIFlashStruct;
static CT_FLASH_INFO const stFlashInfoTable[]=
{
//==========================================================
// Flash Area ID
//==========================================================
// 3V boot sector, byte/word mode both
{MXICPART , ID_MX25L4005 , en4Mx128}, //4M 4k x 128
{MXICPART , ID_MX25L8005 , en8Mx256}, //8M 4k x 256
{MXICPART , ID_MX25L1605 , en16Mx32}, //16M 64k x 32
{MXICPART , ID_MX25L3205 , en32Mx64}, //32M 64k x 64
{SST , ID_SST25LF040A , en4Mx128}, //4M 4k x 128
{SST , ID_SST25LF080A , en8Mx256}, //8M 4k x 256
{SST , ID_SST25VF016B , en16Mx512}, //16M 4k x 512
{EON , ID_EN25B80 , en8MBTM},
{EON , ID_EN25B80T , en8MTOP},
{EON , ID_EN25B40B , en4MBTM},
{EON , ID_EN25B40T , en4MTOP},
{EON , ID_EN25P40 , en4Mx128},
{EON , ID_EN25B16B , en16MBTM},
{EON , ID_EN25B32B , en32Mx64},
{EON , ID_EN25F80 , en8Mx256}, //Eon_F80
{EON , ID_EN25B64B , en64Mx128},
{EON , ID_EN25F16 , en16Mx512},
{WINBOND , ID_W25D40B , en4MBTM},
{WINBOND , ID_W25D40T , en4MTOP},
{WINBOND , ID_W25X40 , en4Mx128}, //4M 4k x 8
{WINBOND , ID_W25X80 , en8Mx16}, //8M 64k x 16
{WINBOND , ID_W25X16 , en16Mx32}, //16M 64k x 32
{WINBOND , ID_W25X32 , en32Mx64}, //32M 64k x 64
{WINBOND , ID_W25X64 , en64Mx128}, //64M 64k x 128
{PMC , ID_PM25LV040 , en4Mx128}, //4M 4K x 8
{ATMEL , ID_AT26DF081A , en8Mx256}, //8M 4k x 256
{ATMEL , ID_AT26F004 , en4Mx128}, //4M 4K x 128
{ATMEL , ID_AT26DF161 , en16Mx32}, //16M 64k x 32
{AMIC , ID_A25L16P , en16MBTM},
{AMIC , ID_A25L80P , en8MBTM},
{AMIC , ID_A25L40P , en4MBTM},
{ESI , ID_ES25P16 , en16Mx512}, //16M 4k x 512
{SPANSION , ID_FL004A , en4Mx8}, //4M 64k x 8
{SPANSION , ID_FL008A , en8Mx16}, //8M 64k x 16
{SPANSION , ID_FL016A , en16Mx32}, //16M 64k x 32
{SPANSION , ID_FL032A , en32Mx64}, //16M 64k x 32
{SPANSION , ID_FL064A , en64Mx128}, //16M 64k x 32
{ST , ID_M25P80 , en8Mx16}, //8M 64k x 16
{ST , ID_M25P16 , en16Mx32}, //16M 64k x 32
{ST , ID_M25P32 , en32Mx64}, //32M 64k x 64
{ST , ID_M25P64 , en64Mx128}, //64M 64k x 128
{ESMT , ID_EFL008A , en8Mx256}, //8M 256sector x 4k
{ESMT , ID_EFL016A , en16Mx512}, //16M 512sector x 4k
};
/* ---------------------------------------------------------------------------------*/
/* Flash command start area. */
/* ---------------------------------------------------------------------------------*/
/*********************************************************************/
/* Flash_status utilizes the DQ6, DQ5, and DQ3 polling algorithms */
/* described in the flash data book. It can quickly ascertain the */
/* operational status of the flash device, and return an */
/* appropriate status code (defined in flash.h) */
/*********************************************************************/
EN_DRV_RESULT CT_Flash_Status( flash_ft * fp )
{
int Result;
#ifdef CT_OS_CHECK_STACKSIZE
CT_OS_RecordTaskStack();
#endif
Result = CT_STATUS_READY;/*DQ6 not Toggle => Pass*/
// CT_Print(GROUP_FLASH | LEVEL_INFO," Counter %d Result %d\n\r",Counter,Result);
return Result;
}
/*!
CTH_Flash_Reset
Flash Reset Status.
Remarks
None.
Parameters
None.
Return Values
None.
*/
EN_DRV_RESULT CT_Flash_Reset( void )
{
#ifdef CT_OS_CHECK_STACKSIZE
CT_OS_RecordTaskStack();
#endif
return SUCCESS; // FLASH_OK;
}
/*!
CTH_Flash_GetManufactcode
Get Flash Manufact code.
Remarks
None.
Parameters
None.
Return Values
Flash Manufact code.
*/
u32 CT_Flash_GetManufactcode( void )
{
register unsigned int answer;
#ifdef CT_OS_CHECK_STACKSIZE
CT_OS_RecordTaskStack();
#endif
DEBUGF("\n Get Flash Manufactuer CODE: ");
//To Do:Read Manufactcode ID.
answer = SPF_INFO1.wID >> 8;
return (answer & DATAMASK);
}
/*!
CTH_Flash_GetDeviceid
Get Flash Device ID number.
Remarks
None.
Parameters
None.
Return Values
Flash Device ID number.
*/
u32 CT_Flash_GetDeviceid( unsigned int ManuFactureID )
{
register unsigned int answer;
#ifdef CT_OS_CHECK_STACKSIZE
CT_OS_RecordTaskStack();
#endif
DEBUGF("\n Get Flash deice ID: ");
//To Do: Read ID.
answer = SPF_INFO1.wID;
return (answer & DATAMASK);
}
/*!
CTH_Flash_SectorErase
Flash Secotr Erase.
Remarks
None.
Parameters
addr = flash sector erase for byte mode start address.
Return Values
None.
*/
EN_DRV_RESULT CT_Flash_SectorErase( u32 addr )
{
#ifdef CT_OS_CHECK_STACKSIZE
CT_OS_RecordTaskStack();
#endif
if(SPF_EraseSector(addr) == TRUE)
return DRV_OK;
else
return DRVERR_NOTOK;
}
/*!
CTH_Flash_ChipErase
Flash Chip Erase.
Remarks
None.
Parameters
None.
Return Values
None.
*/
EN_DRV_RESULT CT_Flash_ChipErase( void )
{
#ifdef CT_OS_CHECK_STACKSIZE
CT_OS_RecordTaskStack();
#endif
if(SPF_EraseChip() == TRUE)
return DRV_OK;
else
return DRVERR_NOTOK;
}
/*!
CTH_Flash_Burn
Burn Flash Data.
Remarks
None.
Parameters
faddr = flash write start address.
daddr = DRAM data start address.
size = Burn data size(Byte size).
Return Values
None.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -