STM32H750XB_RT-THREAD/25-FMC—扩展外部NAND/User/nand/nandtest.c

214 lines
5.1 KiB
C
Raw Normal View History

2025-07-21 06:34:29 +00:00
#include "./nand/nandtest.h"
#include "./nand/bsp_nand.h"
#include "./nand/ftl.h"
#include "string.h"
#include "./malloc/malloc.h"
/**
* @brief <EFBFBD><EFBFBD>NANDijһҳд<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param pagenum:Ҫд<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD>ַ
* @param colnum:Ҫд<EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD>ʼ<EFBFBD>е<EFBFBD>ַ(ҳ<EFBFBD>ڵ<EFBFBD>ַ)
* @param writebytes:Ҫд<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD>С<EFBFBD><EFBFBD>MT29F16G<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ4320<EFBFBD><EFBFBD>MT29F4G<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ2112
* @retval 0,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>,ȫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;1,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>,<EFBFBD>в<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t test_writepage(uint32_t pagenum,uint16_t colnum,uint16_t writebytes)
{
uint8_t *pbuf;
uint8_t sta=0;
uint16_t i=0;
pbuf=mymalloc(SRAMEX,5000);
for(i=0;i<writebytes;i++)//׼<><D7BC>Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>0<EFBFBD><30>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
{
pbuf[i]=i;
}
sta=NAND_WritePage(pagenum,colnum,pbuf,writebytes); //<2F><>nandд<64><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
myfree(SRAMEX,pbuf); //<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
return sta;
}
/**
* @brief <EFBFBD><EFBFBD>ȡNANDijһҳָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param pagenum : Ҫ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD>ַ
* @param colnum : Ҫ<EFBFBD><EFBFBD>ȡ<EFBFBD>Ŀ<EFBFBD>ʼ<EFBFBD>е<EFBFBD>ַ(ҳ<EFBFBD>ڵ<EFBFBD>ַ)
* @param readbytes : Ҫ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD>С<EFBFBD><EFBFBD>MT29F16G<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ4320<EFBFBD><EFBFBD>MT29F4G<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ2112
* @retval <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t test_readpage(uint32_t pagenum, uint16_t colnum, uint16_t readbytes)
{
uint8_t *pbuf;
uint8_t sta=0;
uint16_t i=0;
pbuf=mymalloc(SRAMEX,5000);
sta=NAND_ReadPage(pagenum,colnum,pbuf,readbytes); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
if(sta==0||sta==NSTA_ECC1BITERR||sta==NSTA_ECC2BITERR)//<2F><>ȡ<EFBFBD>ɹ<EFBFBD>
{
printf("read page data is:\r\n");
for(i=0;i<readbytes;i++)
{
printf("%d ",pbuf[i]); //<2F><><EFBFBD>ڴ<EFBFBD>ӡ<EFBFBD><D3A1>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
printf("\r\nend\r\n");
}
myfree(SRAMEX,pbuf); //<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
return sta;
}
/**
* @brief <EFBFBD><EFBFBD>һҳ<EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һҳ,<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
* @note Դҳ<EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD>ҳҪ<EFBFBD><EFBFBD>ͬһ<EFBFBD><EFBFBD>Plane<EFBFBD>ڣ<EFBFBD>(ͬΪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>/ͬΪż<EFBFBD><EFBFBD>)
* @param spnum : Դҳ<EFBFBD><EFBFBD>ַ
* @param epnum : Ŀ<EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD>ַ
* @param colnum : Ҫд<EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD>ʼ<EFBFBD>е<EFBFBD>ַ(ҳ<EFBFBD>ڵ<EFBFBD>ַ)
* @param writebytes : Ҫд<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD>С<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳ<EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD>С
* @retval <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t test_copypageandwrite(uint32_t spnum, uint32_t dpnum, uint16_t colnum, uint16_t writebytes)
{
uint8_t *pbuf;
uint8_t sta=0;
uint16_t i=0;
pbuf=mymalloc(SRAMEX,5000);
for(i=0;i<writebytes;i++)//׼<><D7BC>Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>0X80<38><30>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
{
pbuf[i]=i+0X80;
}
sta=NAND_CopyPageWithWrite(spnum,dpnum,colnum,pbuf,writebytes); //<2F><>nandд<64><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
myfree(SRAMEX,pbuf); //<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
return sta;
}
/**
* @brief <EFBFBD><EFBFBD>ȡNANDijһҳSpare<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param pagenum : Ҫ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD>ַ
* @param colnum : Ҫ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>spare<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ
* @param readbytes : Ҫ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD>С<EFBFBD><EFBFBD>MT29F16G<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ64<EFBFBD><EFBFBD>MT29F4G<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ224
* @retval <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t test_readspare(uint32_t pagenum, uint16_t colnum, uint16_t readbytes)
{
uint8_t *pbuf;
uint8_t sta=0;
uint16_t i=0;
pbuf=mymalloc(SRAMEX,512);
memset(pbuf,0,512);
sta=NAND_ReadSpare(pagenum,colnum,pbuf,readbytes); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
if(sta==0)//<2F><>ȡ<EFBFBD>ɹ<EFBFBD>
{
printf("read spare data is:\r\n");
for(i=0;i<readbytes;i++)
{
printf("%x ",pbuf[i]); //<2F><><EFBFBD>ڴ<EFBFBD>ӡ<EFBFBD><D3A1>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
printf("\r\nend\r\n");
}
myfree(SRAMEX,pbuf); //<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
return sta;
}
/**
* @brief <EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>λ<EFBFBD>ÿ<EFBFBD>ʼ,<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>NAND,ÿ<EFBFBD><EFBFBD>BLOCK<EFBFBD>ĵ<EFBFBD>һ<EFBFBD><EFBFBD>page<EFBFBD><EFBFBD>ǰ5<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
* @param sblock : ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>block<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void test_readallblockinfo(uint32_t sblock)
{
uint8_t j=0;
uint32_t i=0;
uint8_t sta;
uint8_t buffer[5];
for(i=sblock;i<nand_dev.block_totalnum;i++)
{
printf("block %d info:",i);
sta=NAND_ReadSpare(i*nand_dev.block_pagenum,0,buffer,5);//<2F><>ȡÿ<C8A1><C3BF>block,<2C><>һ<EFBFBD><D2BB>page<67><65>ǰ5<C7B0><35><EFBFBD>ֽ<EFBFBD>
if(sta)printf("failed\r\n");
for(j=0;j<5;j++)
{
printf("%x ",buffer[j]);
}
printf("\r\n");
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
/* FTL<54><4C><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD> */
/**
* @brief <EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ,д<EFBFBD><EFBFBD>seccnt<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param secx : <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param secsize : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
* @param seccnt : Ҫд<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t test_ftlwritesectors(uint32_t secx, uint16_t secsize, uint16_t seccnt)
{
uint8_t *pbuf;
uint8_t sta=0;
uint32_t i=0;
pbuf=mymalloc(SRAMEX,secsize*seccnt);
for(i=0;i<secsize*seccnt;i++) //׼<><D7BC>Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>0<EFBFBD><30>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
{
pbuf[i]=i;
}
sta=FTL_WriteSectors(pbuf,secx,secsize,seccnt); //<2F><>nandд<64><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
myfree(SRAMEX,pbuf); //<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
return sta;
}
/**
* @brief <EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>seccnt<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param secx : <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param secsize : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
* @param seccnt : Ҫ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t test_ftlreadsectors(uint32_t secx, uint16_t secsize, uint16_t seccnt)
{
uint8_t *pbuf;
uint8_t sta=0;
uint32_t i=0;
pbuf=mymalloc(SRAMEX,secsize*seccnt);
memset(pbuf,0,secsize*seccnt);
sta=FTL_ReadSectors(pbuf,secx,secsize,seccnt); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
if(sta==0)
{
printf("read sec %d data is:\r\n",secx);
for(i=0;i<secsize*seccnt;i++) //׼<><D7BC>Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>0<EFBFBD><30>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
{
printf("%x ",pbuf[i]); //<2F><><EFBFBD>ڴ<EFBFBD>ӡ<EFBFBD><D3A1>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
printf("\r\nend\r\n");
}
myfree(SRAMEX,pbuf); //<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
return sta;
}