ZYNQ EMMCFLASHSD卡硬件性能测试

    技术2022-07-10  136

    vivado硬件配置:勾选上SD0,SD1,FLASH和PS_UART

    生成.bit,导入SDK,分别建硬件测试工程

    1,EMMC裸机读写测试

    方法:使用了 XILINX SDK 库函数实现读写,先往 EMMC 里面写 1024 个数据,然后读出来对比;

    #include <stdio.h> #include "xparameters.h" #include "xil_exception.h" #include "xsdps.h" #include "xil_printf.h" static XSdPs ps7_EMMC; XSdPs_Config * EMMC_Config; u8 WR_Buf[1024]; u8 RD_Buf[1024]; u8 Emmc_ExtCsd[1024]; int main() { u32 i;

    s32 Status; u32 Buffer_size=1024; u8 SD_ERROR=0; EMMC_Config= XSdPs_LookupConfig(XPAR_PS7_SD_1_DEVICE_ID); Status = XSdPs_CfgInitialize(&ps7_EMMC, EMMC_Config, EMMC_Config->BaseAddress); if (Status != XST_SUCCESS) { print("EMMC Config failed !\n\r"); return XST_FAILURE; } Status=XSdPs_MmcCardInitialize(&ps7_EMMC); if (Status != XST_SUCCESS) { print("EMMC Config failed !\n\r"); return XST_FAILURE; } Status=XSdPs_Change_ClkFreq(&ps7_EMMC,50000000); Status=XSdPs_Select_Card(&ps7_EMMC); Status=XSdPs_SetBlkSize(&ps7_EMMC,XSDPS_BLK_SIZE_512_MASK); Status=XSdPs_Get_Mmc_ExtCsd(&ps7_EMMC,Emmc_ExtCsd); for(i=0;i<Buffer_size;i++) { WR_Buf[i]=i; } Status = XSdPs_WritePolled(&ps7_EMMC, 0x00, 2, WR_Buf); Status = XSdPs_ReadPolled(&ps7_EMMC, 0x00, 2, RD_Buf); //-----------------------check data----------------------------------------------- for(i=0; i<Buffer_size;i++) { if(WR_Buf[i]!=RD_Buf[i]) { SD_ERROR=1; break; } } if(SD_ERROR) xil_printf("EMMC Data checked Error\r\n"); else xil_printf("EMMC Data checked Successfully\r\n"); return 0; }

    2,SD卡裸机读写测试

    实现了创建一个 text.txt 的文件,并且打开,只有往里面写 0~1023~共计 1024 个数据,之后再读这个文件,读出 1024 个数据,最后对比数据内容是否和写入的一致。用户可以可以直接复制以上程序到自己的工程使用。除此之外,要让自己新建的工程可以正常编译,还要设置 BSP 库:菜单栏Xilinx->Board Support Package Setting勾选 xilffs 库,以支持 SD 卡的裸机文件系统支持。

    #include <stdio.h> #include "xparameters.h" #include "xsdps.h" #include "xil_printf.h" #include "ff.h" static FATFS SD_Dev; // File System instance char *SD_Path = "0:/"; // string pointer to the logical drive number static char FileName[32] = "test.txt"; // name of the log u8 WR_Buf[1024] __attribute__ ((aligned(32))); // Buffer should be word aligned (multiple of 4) u8 RD_Buf[1024] __attribute__ ((aligned(32))); // Buffer should be word aligned (multiple of 4) int SD_init() {               FRESULT result;                result = f_mount(&SD_Dev,SD_Path, 0);               if (result != 0)

                {                    return XST_FAILURE;             }            return XST_SUCCESS; } int SD_read(char *FileName,u8 *DestinationAddress,u32 ByteLength) {             FIL file;             FRESULT result;             UINT BytesRd;            result = f_open(&file,FileName,FA_READ);           if(result)

               {                  return XST_FAILURE;             }            result = f_lseek(&file, 0);          if(result)         {           return XST_FAILURE;         }         result = f_read(&file, (void*)DestinationAddress,ByteLength,&BytesRd);        if(result)      {            return XST_FAILURE;       }      result = f_close(&file);    if(result)    {         return XST_FAILURE;    }        return XST_SUCCESS; } int SD_write(char *FileName,u8 *SourceAddress,u32 ByteLength) {              FIL file;              FRESULT result;              UINT BytesWr;             result = f_open(&file,FileName,FA_CREATE_ALWAYS | FA_WRITE);             if(result)              {                    return XST_FAILURE;              }             result = f_lseek(&file, 0);             if(result)             {                    return XST_FAILURE;             }            result = f_write(&file,(void*) SourceAddress,ByteLength,&BytesWr);            if(result)          {               return XST_FAILURE;          }

              result = f_close(&file);        if(result)

          {           return XST_FAILURE;        }        return XST_SUCCESS; } int main() {            int i;            FRESULT result;           u8 SD_ERROR=0;           u32 Buffer_size=1024;           SD_init();          for(i=0;i<Buffer_size;i++)          {               WR_Buf[i]=i;           } //-----------------------write test data to file-----------------------------------          result=SD_write(FileName, WR_Buf, Buffer_size);         if (result!=0)        {              return XST_FAILURE;        }         xil_printf("SD CARD written Successfully\r\n"); //-----------------------read test data ------------------------------------------        result=SD_read(FileName, RD_Buf, Buffer_size);         if (result!=0)       {           return XST_FAILURE;        }        xil_printf("SD CARD Data read Successfully\r\n"); //-----------------------check data----------------------------------------------- for(i=0; i<Buffer_size;i++) {            if(WR_Buf[i]!=RD_Buf[i])           {

               SD_ERROR=1;             break;          } } if(SD_ERROR)          xil_printf("SD CARD Data checked Error\r\n"); else           xil_printf("SD CARD Data checked Successfully\r\n"); return 0; }

    3,FLASH读写测试

    #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <time.h> #include <sys/ioctl.h> #include <sys/mount.h> #include <linux/compiler.h> #include <mtd/mtd-user.h>

    struct BSL {  char  booslink[10];  //a fixed string idefined as booslink  //char  serialNumber[24]; //++++add a Serial Number  //char  PCBA_serialNumber[24];  //char  reserved_0[24]; };

    int non_region_erase(int Fd, int start, int count, int unlock) {     mtd_info_t meminfo;

        if (ioctl(Fd,MEMGETINFO,&meminfo) == 0)     {         erase_info_t erase;

            erase.start = start;

            erase.length = meminfo.erasesize;

            for (; count > 0; count--) {             printf("\rPerforming Flash Erase of length %u at offset 0x%x",                     erase.length, erase.start);             fflush(stdout);

                if(unlock != 0)             {                 //Unlock the sector first.                 printf("\rPerforming Flash unlock at offset 0x%x",erase.start);                 if(ioctl(Fd, MEMUNLOCK, &erase) != 0)                 {                     perror("\nMTD Unlock failure");                     close(Fd);                     return 8;                 }             }

                if (ioctl(Fd,MEMERASE,&erase) != 0)             {                 perror("\nMTD Erase failure");                 close(Fd);                 return 8;             }             erase.start += meminfo.erasesize;         }         printf(" done\n");     }     return 0; }

    int main(int argc, char *argv[]) {     int fd;       char *cmd;     struct mtd_info_user info;        int regcount;     int ret;     int res;

        if(3>argc)     {         printf("You must specify a device!\n");         return 16;     }     cmd=argv[1];

        // Open the device     if ((fd = open(argv[2],O_RDWR)) < 0)     {         fprintf(stderr,"File open error\n");         return 8;     }     else     {         ioctl(fd,MEMGETINFO,&info);         //printf("info.size=%d\n info.erasesize=%d\n info.writesize=%d\n info.oobsize=%d\n",info.size,info.erasesize,info.writesize,info.oobsize);     }         if (ioctl(fd,MEMGETREGIONCOUNT,®count) == 0)     {         //printf("regcount=%d\n",regcount);     }

        /*erase the device*/     if (strcmp(cmd, "erase") == 0)     {         if(regcount == 0)         {                 res = non_region_erase(fd,0,(info.size/info.erasesize),0);             }                printf("erase!\n");     }

        /*write file to this device*/     struct BSL *bsl_write =(struct BSL*)malloc(sizeof(struct BSL));     if (strcmp(cmd, "write") == 0)     {         printf("write ok!\n");         strcpy(bsl_write->booslink,argv[3]);         ret = write(fd, bsl_write, sizeof(struct BSL) );

            return 0;     }

        /*read file from this device*/     struct BSL *bsl_read =(struct BSL*)malloc(sizeof(struct BSL));     if (strcmp(cmd, "read") == 0)     {       read(fd, bsl_read, sizeof(struct BSL));       printf("%s\n", bsl_read);         printf("read ok!\n");     }     return 1; }

    Processed: 0.011, SQL: 9