精华内容
下载资源
问答
  • ZYNQ emmc使用

    千次阅读 2018-12-05 11:27:07
    1)如果使用的是sd0,zynq-zed.dts中已经有配置,不用进行更改 &sdhci0{ u-boot,dm-pre-reloc; status = “okay”; }; 2)如果使用SD1则需要更改设备树 &amp...

    1、设备树更改
    1)如果使用的是sd0,zynq-zed.dts中已经有配置,不用进行更改

    &sdhci0{
    	u-boot,dm-pre-reloc;
    	status = “okay”;
    };
    

    2)如果使用SD1则需要更改设备树

    &sdhci1{
    	u-boot,dm-pre-reloc;
    	status = “okay”;
    };
    

    2、烧写设备树之后/dev下出现mmcblk0,还需要进行分区

    fdisk /dev/mmcblk0
    

    3、分区完成之后/dev下出现mmcblk0p1,初次使用还需要进行格式化,然后就可以mount了

    mkfs.ext2 -T largefile /dev/mmcblk0p1  
    mount /dev/mmcblk0p1 emmc/
    

    4、测试读写速度
    1)测试写速度

    time dd if=/dev/zero bs=1024 count=1000000 of=1Gb.file
    

    2)测试读速度

    time dd if=1Gb.file bs=64k  of=/dev/null
    

    5、硬盘由于强制关机之类的操作会造成一定的损坏,造成部分分区挂载不上,可以使用fsck来修复,文件系统中没有此命令,需要交叉编译e2fsprogs包。
    1)下载源码包

    http://sourceforge.net/projects/e2fsprogs/
    cd arm-tools
    tar xzvf e2fsprogs.tar.gz
    cd e2fsprogs
    mkdir release
    cd release
    

    2)交叉编译

    ../configure CC=arm-linux-gnueabi-gcc --enable-elf-shlibs --build=i686-linux --host=arm-linux --prefix=/home/test/arm_tools/e2fsprogs-1.44.5/release
    make
    make install
    

    3)编译成功之后sbin下有相关命令,复制到开发板/usr/bin目录,复制lib目录下动态库到开发板/lib下,就可以进行磁盘修复了

    fsck.ext4 -p /dev/mmcblk1p1
    

    4)e2fsprogs包中的其他命令
    badblocks
    用来检查设备(通常是硬盘分区)上的坏块
    blkid
    定位并打印出块设备属性的命令行工具
    chattr
    在 ext2 和 ext3 文件系统上改变文件属性
    compile_et
    用来将错误代码(error-code)和相关出错信息的列表 转化为适用于 com_err 库的 C 语言文件
    debugfs
    文件系统调试器。能用来检查和改变 ext2 文件系统的状态
    dumpe2fs
    打印特定设备上现存的文件系统的超级块(super block)和块群(blocks group)的信息
    e2fsck
    用来检查和修复 ext2 和 ext3 文件系统
    e2image
    将关键的 ext2 文件系统数据保存到一个文件中
    e2label
    显示或者改变指定设备上的 ext2 文件系统标识
    findfs
    通过卷标或通用唯一标识符(UUID)寻找文件系统
    fsck
    用来检查或者修理文件系统
    fsck.ext2
    默认检查 ext2 文件系统
    fsck.ext3
    默认检查 ext3 文件系统
    logsave
    把一个命令的输出保存在日志文件中
    lsattr
    列出 ext2 文件系统上的文件属性
    mk_cmds
    将一个包含命令列表的文件转化为适用于子系统库 libss 的 C 源文件
    mke2fs
    用来创建 ext2 或 ext3 文件系统
    mkfs.ext2
    默认创建 ext2 文件系统
    mkfs.ext3
    默认创建 ext3 文件系统
    mklost+found
    在 ext2 文件系统上创建一个 lost+found 目录,并给该目录预分配磁盘数据块,以减轻 e2fsck 命令的负担。
    resize2fs
    可以用来增大或缩小 ext2 文件系统
    tune2fs
    调整 ext2 文件系统的可调参数
    uuidgen
    创建一个新的通用唯一标识符(UUID)。这个新 UUID 可以被认为是在所有已创建的 UUID 中独一无二的,不论是在本地的系统或者别的系统,过去还是将来。
    libblkid
    包含设备识别和节点释放的库函数
    libcom_err
    通用错误显示库
    libe2p
    用于 dumpe2fs, chattr, lsattr
    libext2fs
    允许用户级的程序操作 ext2 文件系统
    libss
    用于 debugfs
    libuuid
    用来给对象产生通用唯一标识符(UUID)使之可以在本地系统之外引用
    6、从应用程序中读取emmc信息
    1)shell命令awk,详解参照https://www.cnblogs.com/xudong-bupt/p/3721210.html,如果想要读取emmc总量,可执行

    df | grep /dev/mmcblk1p1 |awk '{print $2}'
    

    2)如果想在程序中执行shell命令,可使用popen,popen总是和pclose一起出现被使用的。popen() 创建一个管道,通过fork或者invoke一个子进程,然后执行command。返回值在标准IO流中,由于是在管道之中,因此数据流是单向的,command只能产生stdout或者读取stdin,因此type只有两个值:‘w’或‘r’。r表示command从管道中读取数据流,而w表示command的stdout输出到管道中。command无法同时读取和输出。popen返回该FIFO数据流的指针。代码如下:

    int Emmc_Status_Query()
    {
    	char buffer[20];
    	FILE *fp;
    	int chars_read;
    	fp = popen("df | grep vmhgfs-fuse | awk '{print $2}'","r");
    	if(fp != NULL){
    		chars_read = fread(buffer,sizeof(char),20,fp);
    		pclose(fp);
    		if(chars_read <= 0){
    			return -1;
    		}
    		else{
    			printf("total_size:%d\n",atoi(buffer));
    		}
    	}else{
    		return  -1;
    	}
    	return 0;
    }
    
    展开全文
  • ZYNQ EMMC/FLASH/SD卡硬件性能测试

    千次阅读 2020-07-01 10:02:50
    方法:使用了 XILINX SDK 库函数实现读写,先往 EMMC 里面写 1024 个数据,然后读出来对比; #include <stdio.h> #include "xparameters.h" #include "xil_exception.h" #include "xsdps.h" #include "xil_...

    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,&regcount) == 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;
    }

    展开全文
  • ZYNQ700PS端裸机——EMMC、SD驱动实现

    千次阅读 2020-07-03 18:07:09
    下面来介绍一下,emmc、sd的驱动实现。 一、vivado PL端设置 二、ps端代码编写

    下面来介绍一下,emmc、sd的驱动实现。

    一、vivado PL端设置

    PL端 设置: 如果你是用sd卡、或者EMMC要在vivado zynq核上勾选 sd、emmc。
    emmc和sd使用公用那几个IO.同一个时刻只能当做其中一个使用。
    zynq有两个sd接口。也可以一个给sd卡,一个给EMMC使用。
    下面的例子是修改官方例程。
    

    二、ps端代码编写

    
    SD 、emm初始化基本一样。这是裸机不需要文件系统。直接对sd卡/emmc进行读写
    #ifdef __ICCARM__
    #pragma data_alignment = 32
    u8 DestinationAddress[10*1024];
    #pragma data_alignment = 32
    u8 SourceAddress[10*1024];
    #else 
    u8 DestinationAddress[10*1024] __attribute__ ((aligned(32)));
    u8 SourceAddress[10*1024]__attribute__ ((aligned(32)));
    #endif
    #define TEST 7/* Number of SD blocks to test */
    #define NUM_BLOCKS 16/* Sector offset to test */
    #define SECTOR_OFFSET 204800
    XSdPs SD_InstancePtr;
    bool  SdCard_Init(void)
    {             
    	static XSdPs SdInstance;             
    	XSdPs_Config *SdConfig;             
    	int Status;             
    	u32 BuffCnt;      
    	 /* * Since block size is 512 bytes. File Size is 	512*BlockCount.              */        
          u32 FileSize = (512*NUM_BLOCKS); 
          /* File Size is only up to 2MB */            
           u32 Sector = SECTOR_OFFSET;             
           for(BuffCnt = 0; BuffCnt < FileSize; BuffCnt++)
           {                    		   
           		SourceAddress[BuffCnt] = 4;
           //TEST + BuffCnt;        
            }     
                   /* * Initialize the host controller */          	
           SdConfig = XSdPs_LookupConfig(XPAR_XSDPS_1_DEVICE_ID);            
           if (NULL == SdConfig) 
           {                   
    			return XST_FAILURE;            
           }            
    	Status = XSdPs_CfgInitialize(&SdInstance, SdConfig,SdConfig->BaseAddress);           
    	if (Status != XST_SUCCESS)
    	 {		          
           	return XST_FAILURE;            
         }           
     	Status = XSdPs_CardInitialize(&SdInstance);		   
    	if (Status != XST_SUCCESS)
    	{                    
     		return XST_FAILURE;          
        }	           
    /*              * Write data to SD/eMMC.              */             
     	if (!(SdInstance.HCS)) Sector *= XSDPS_BLK_SIZE_512_MASK;             
     	Status = XSdPs_WritePolled(&SdInstance, Sector, NUM_BLOCKS, SourceAddress);
     	if (Status != XST_SUCCESS) 
     	{                   
      		return XST_FAILURE;            
       	}           
    /*              * Read data from SD/eMMC.              */
    	if (!(SdInstance.HCS)) 
    	Sector *= XSDPS_BLK_SIZE_512_MASK;             
    	Status  = XSdPs_ReadPolled(&SdInstance, Sector, NUM_BLOCKS,                                    DestinationAddress);             
    	if (Status!=XST_SUCCESS) 
    	{                    
    		return XST_FAILURE;            
    	}             
    /*              * Data verification              */
    	for(BuffCnt = 0; BuffCnt < FileSize; BuffCnt++)           
    	{                   
      	if(SourceAddress[BuffCnt] != DestinationAddress[BuffCnt])                    
      	{                          
        	 Uart_Send("qwert",5);                       
         	 return XST_FAILURE;                
     	 }          
    	}
           Uart_Send(DestinationAddress,FileSize); //输出从sd或者emmc的数观察对不对
    }
    
    
    
    展开全文
  • zynq emmc 启动模式

    千次阅读 2018-11-21 15:55:22
    前面说的我的硬件上有一颗eMMC的芯片,型号是MTFC4GACAJCN-4M IT,有4GB的容量。 BOOT.bin的文件较小,只有不到3MB,但是image.ub的文件根据不同的需求,将来可能会越来越大,将它们都放在16MB的QSPI Flash上有点...

    原文地址:https://blog.csdn.net/vacajk/article/details/53908666

    前面说的我的硬件上有一颗eMMC的芯片,型号是MTFC4GACAJCN-4M IT,有4GB的容量。
    BOOT.bin的文件较小,只有不到3MB,但是image.ub的文件根据不同的需求,将来可能会越来越大,将它们都放在16MB的QSPI Flash上有点危险,而且下载起来也不太方便。

    所以准备将u-boot和kernel的存储位置分开,将包含u-boot的BOOT.bin烧录在QSPI Flash当中,将image.ub文件直接放在eMMC中进行启动。

     

    step1:eMMC存储空间分区

    参考文档网址:http://zedboard.org/sites/default/files/design/PicoZed_Petalinux_2015_2_eMMC_boot_v3.0_0.zip

    前面我配置的方式是BOOT.bin和image.ub都在QSPI Flash当中,这样我才能正常启动Linux,来给eMMC提前进行分区。

     

    因为我的板子上没有SD卡,所以禁用了PS的SD0外设,最终我的eMMC芯片挂载到了mmcblk0上。(假如既有SD卡<SD0>又有eMMC<SD1>,一般情况下SD卡会是mmcblk0,eMMC会是mmcblk1)

    启动板子,输入用户名密码后,进行分区。按照手册上的说明,分一个128MB的分区出来,并格式化成FAT32.

    下面是我的分区和格式化过程:

     

    root@ifc_petalinux:~# fdisk /dev/mmcblk0

    The number of cylinders for this disk is set to 117504.
    There is nothing wrong with that, but this is larger than 1024,
    and could in certain setups cause problems with:
    1) software that runs at boot time (e.g., old versions of LILO)
    2) booting and partitioning software from other OSs
       (e.g., DOS FDISK, OS/2 FDISK)

    Command (m for help): p

    Disk /dev/mmcblk0: 3850 MB, 3850371072 bytes
    4 heads, 16 sectors/track, 117504 cylinders
    Units = cylinders of 64 * 512 = 32768 bytes

            Device Boot      Start         End      Blocks  Id System

    Command (m for help): n
    Command action
       e   extended
       p   primary partition (1-4)
    p
    Partition number (1-4): 1
    First cylinder (1-117504, default 1): Using default value 1
    Last cylinder or +size or +sizeM or +sizeK (1-117504, default 117504): +128M


    Command (m for help): t
    Partition number (1-4): 1
    Hex code (type L to list codes): L

     0 Empty                  1b Hidden Win95 FAT32     9f BSD/OS                
     1 FAT12                  1c Hidden W95 FAT32 (LBA) a0 Thinkpad hibernation  
     4 FAT16 <32M             1e Hidden W95 FAT16 (LBA) a5 FreeBSD               
     5 Extended               3c Part.Magic recovery    a6 OpenBSD               
     6 FAT16                  41 PPC PReP Boot          a8 Darwin UFS            
     7 HPFS/NTFS              42 SFS                    a9 NetBSD                
     a OS/2 Boot Manager      63 GNU HURD or SysV       ab Darwin boot           
     b Win95 FAT32            80 Old Minix              b7 BSDI fs               
     c Win95 FAT32 (LBA)      81 Minix / old Linux      b8 BSDI swap             
     e Win95 FAT16 (LBA)      82 Linux swap             be Solaris boot          
     f Win95 Ext'd (LBA)      83 Linux                  eb BeOS fs               
    11 Hidden FAT12           84 OS/2 hidden C: drive   ee EFI GPT               
    12 Compaq diagnostics     85 Linux extended         ef EFI (FAT-12/16/32)    
    14 Hidden FAT16 <32M      86 NTFS volume set        f0 Linux/PA-RISC boot    
    16 Hidden FAT16           87 NTFS volume set        f2 DOS secondary         
    17 Hidden HPFS/NTFS       8e Linux LVM              fd Linux raid autodetect 
    Hex code (type L to list codes): b
    Changed system type of partition 1 to b (Win95 FAT32)

    Command (m for help): w
    The partition table has been altered.
    Calling ioctl() to re-read partition table
     mmcblk0: p1
    root@ifc_petalinux:~# 

    mkdosfs -F 32 /dev/mmcblk0p1
     

     

     

    step2:配置u-boot从eMMC引导启动PetaLinux

    执行命令:

    petalinux-config
    配置启动方式,将kernel启动配置为eMMC启动:

    #Subsystem AUTO Hardware Settings --->
    #   Advanced bootable images storage Settings --->
    #       boot image settings --->
    #           image storage media ---> primary flash
    #       kernel image settings --->
    #           image storage media ---> primary sd
    #       SD/SDIO Settings ----> ps_sd1
    其中的SD/SDIO Settings一定要配置为eMMC对应的SD1。

    重新编译:

    petalinux-build
    编译完成后,重新使用Windows的Xilinx SDK将:zynq_fsbl.elf--->IFC_TOP_wrapper.bit--->u-boot.elf三个文件打包成BOOT.bin文件,改名为BOOT_EMMC.bin。

    将BOOT.bin和image.ub文件复制到U盘上,然后把U盘插到板子的USB口。

    mkdir /mnt/usb
    mkdir /mnt/emmc
    #挂载usb和emmc
    mount /dev/sda1 /mnt/usb
    mount /dev/mmcblk0p1 /mnt/emmc
    #复制image.ub到emmc第一个分区mmcblk0p1
    cp /mnt/usb/image.ub /mnt/emmc
    #复制BOOT_EMMC.bin到QSPI FLASH第一个分区mtd0
    flashcp /mnt/usb/BOOT_EMMC.bin /dev/mtd0
    #接触挂载
    umount /mnt/usb
    umount /mnt/emmc
    假如出现:FAT-fs (sda1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.

    说明上次U盘没有正确移除,可能会造成image.ub的复制错误。需要在windows中修复一下U盘,再重新进行上面的操作。

    重新启动板子:

    shutdown now -r
    这一次板子就能够从QSPI运行FSBL,加载bit,运行u-boot,

    然后u-boot从eMMC芯片引导加载Linux操作系统。

     

    eMMC最终被我分为了3个区,

    第一个分区用来存放image.ub或者将来的设备树等文件,128MB

    第二个分区用来存放用户数据,2048MB

    第三个分区用来存放库文件,如opencv的库,剩余的1个多GB

     

    待改进:

    eMMC默认是有两个16MB的boot分区的,而且还支持加密什么的,是否可以把u-boot和image.ub放到里面去。

    并且两个boot分区可在系统升级时进行切换。好复杂,将来有时间再研究吧。
    --------------------- 
    作者:vacajk 
    来源:CSDN 
    原文:https://blog.csdn.net/vacajk/article/details/53908666 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • Zynq ZC702平台 QSPI + eMMC实现

    千次阅读 2018-11-06 16:20:03
    预备知识: UG821 The processor system boot is a two-stage ...• Another boot mode supported through FSBL is eMMC boot mode. This boot mode is possible only when the primary boot mode (set through...
  • 需要注意的是,SD卡可能直接拔插在PC机上做了格式化,所以按上面的博客操作即可,但是MMC一般都是焊接在板卡上的,默认情况下是不能直接进行读写操作的,需要借助f_mkfs函数对EMMC进行格式化操作之后才可以正常读写...
  • #include <stdio.h> #include “xparameters.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 Statu
  • ZYNQ板Linux系统启动后,使用ls /dev查看EMMC设备,如下: 2.使用fdisk对EMMC进行分区 mmcblk0对应SD卡,mmcblk1对应EMMC,当没有对EMMC进行分区时,上图中没有mmcblk1p1,使用下图步骤对EMMC进行分区: 3.使用...
  • ZYNQ7000_emmc_文件系统

    千次阅读 2018-11-26 16:38:59
    ZYNQ7000_emmc_文件系统一、目标二、根文件系统的修改三、从emmc启动根文件系统四、设置终端登录 一、目标 1、修改根文件系统 2、从emmc启动根文件系统 3、设置从终端登录 二、根文件系统的修改 从xilinx wiki...
  • ZYNQ7000 EMMC/SD硬件测试

    2020-08-19 21:45:07
    1.EMMC裸机读写测试 方法:使用了 XILINX SDK 库函数实现读写,先往 EMMC 里面写 1024 个数据,然后读出来对比 #include <stdio.h> #include "xparameters.h" #include "xil_exception.h" #include "xsdps....
  • ZYNQ EMMC在sdk中实现文件读写笔记

    千次阅读 2019-10-29 09:19:15
    https://forums.xilinx.com/t5/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/zynq-emmc-sdk-%E6%B5%8B%E8%AF%95%E6%A1%88%E4%BE%8B-in-vivado2016-4/m-p/948864 (zynq emmc sdk 测试...
  • 最近项目需要用到ZYNQ7010的SD0以及SD1(eMMC),裸机跑,但实际中SD0空闲不使用,仅使用EMMC,用领航者开发板V1来进行测试。 问题描述: 单独使用SD0或者emmc的时候,导入原子哥的例程代码均能正常运行,但同时使能...
  • 文章目录硬件配置及代码存放说明操作步骤 硬件配置及代码存放说明 QSPI连接一个16MB的Flash SD1接口接emmczynq_fsbl.elf+fpga.bit +u-boot.elf...petalinux-create --type project --template zynq --name emmc_prj
  • ZYNQ实验板带有SD卡(SD0)和eMMC芯片(SD1),计划从SD卡启动系统,将镜像文件加载到eMMC,并最终从QSPI和eMMC引导系统。 需要准备2份PetaLinux 2018.3版本的系统文件BOOT.BIN和image.ub:一份用于从SD卡启动,...
  • Zynq7020 EMMC与SD卡之间的问题

    千次阅读 2019-06-24 18:00:02
    我们的开发板是有一个EMMC和一个SD卡的,自带的uboot默认是从SD0启动,然而刚好我的EMMC就是在SD0上,但为了调试方便我希望在SD卡上启动,也就是在SD1上启动,这就存在了问题,我该如何修改才能实现此功能呢?...
  • 前言 虽可使用Petalinux进行移植,简单方便,但为了更清楚明白的了解...ZYNQ #5 - 从vivado工程开始,从emmc启动Linux_里先森-CSDN博客 流程 对于手动移植,所需的文件为: BOOT.bin(FSBL+fpga_bit文件+u_boot.elf...
  • Xilinx zynq zynqMP SD EMMC

    千次阅读 2018-07-23 18:49:37
    参考 mmcblk0: error -110 transferring data, sector 266312, nr 240, cmd response 0x900, card status 0xb00 Linux Kernel 4.9, emmc ... AR# 69995 2017.1-2017.4 Zynq UltraScale+ MPSoC: Linux mmcb...
  • 同时将linux kernel、根文件系统部署在接到SD1接口上的emmc中,qspi-flash中放置BOOT.BIN,uboot唤起emmc中的image.ub。并填坑关于petalinux在SD0为空时,配置从SD1启动的bughtml目录linux1 - VIVADO工程创建这里...
  • 板子上使用的是8G的emmc连接到sd1,首先要对emmc格式化,然后在修改petalinux kernel的保存位置,之后在生成boot.bin然后修改环境变量就可以了。 Step1: 格式化emmc 查看是否识别到当前的emmc,可以看到mmcblk1...
  • ZYNQ_MPSoc的qspi+emmc启动方式制作流程
  • zynq Nand flash,QSPI,EMMC接口

    千次阅读 2016-07-20 14:31:41
    Static Memory Controller (SMC) ...3.选用小QSPI Flash,镜像文件跟用户数据存储在EMMC存储器,eMMC存贮器走SDIO2.0协议,最大支持32G bit;1 DDR3 SDRAM: 1.DDR3 SDRAM 最大支持8G bit
  • ZYNQ裸机emmc使用f_open创建文件名长度不能超过8个字节问题
  • ZYNQ7000全可编程SoC中的EMMC应用技术研究
  • 关于xilinx的XC7Z045芯片(简称Zynq7045)在linux环境下挂载emmc,以及进行EMMC分区,格式化和文件使用测试。在zynq045的板卡上测试使用过的。
  • zynqmp.dtsi sdhc0: sdhc@ff160000 { compatible = "zynq,sdhc"; reg = <0x0 0xff160000 0x0 0x1000>; clocks = <&sdio0_ref_div_clk>; interrupts = <80 0 4>; ...
  • VxWorks在Zynq平台上的移植详细流程

    热门讨论 2017-10-23 09:45:48
    详细介绍了VxWorks移植到Zynq平台,包括bootrom和内核(vxWorks、vxworks.sym),通过QSPI启动bootrom,文件系统(TFFS)挂载到EMMC中,以及调试EMMC驱动,以及应用程序的开发
  • 先明确:/dev/mmcblk0p1是SD卡的... /dev/mmcblk1是未进行分区的EMMC;一会下面会讲到要讲把EMMC分为 /dev/mmcblk1p1和 /dev/mmcblk1p2。 编译petalinux:执行petalinux-config。 (1)选择Subsystem AUTO Hardwa...
  • XILINX ZYNQ裸机篇2019版
  • 同时将linux kernel、根文件系统部署在接到SD1接口上的emmc中,qspi-flash中放置BOOT.BIN,uboot唤起emmc中的image.ub。并填坑关于petalinux在SD0为空时,配置从SD1启动的bug 目录 1 - VIVADO工程建立 1.1...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 439
精华内容 175
关键字:

emmczynq