SD卡mmc.bin的理解

对于普通的SD卡,我有个2gsd卡,拿它作为例子:

1)使用本站提供的windows工具完全格式化一次你的sd

2)进到ubuntu环境下查看SD卡扇区数量:

zswan@zswan-laptop-ubuntu:~/tmp$ sudo fdisk /dev/sdb1

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to

         switch off the mode (command 'c') and change display units to

         sectors (command 'u').

Command (m for help): p

Disk /dev/sdb1: 2059 MB, 2059278848 bytes

64 heads, 62 sectors/track, 1013 cylinders

Units = cylinders of 3968 * 512 = 2031616 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x00000000


计算扇区数量:

2059278848/512 = 4022029个扇区,按图1的结构,BL1应该烧写在第4022029-18=4022011个扇区当中。BL2应该烧写在第(4022011-BL2扇区数)的中。

飞凌提供的MMC启动的bin文件,其实就是个支持SD卡的uboot,其结构是这样的:


所以为了一次性烧写方便,MMC.bin其实应该是BL2代码BL2的前8k字节作为BL1的代码。但是由于BL2,BL1是分着烧写的,不大方便,所以干脆在BL2的后面再附上一个BL1的相同代码,这样结合出来的mmc.bin,我只需要把它烧写到:4022029-2-560mmc.bin280k=560个扇区)= 4021467起始的扇区中去,就可以了。

烧写方法:

Ubuntu环境下:

sudo dd of=/dev/sdb1 if=./mmc.bin count=560 seek=4021467

这样就可以了。

SDHC的类同,只是总的扇区数减去(1026+560)才是mmc bin烧写的位置。


(二)
拷贝的过程


BL1被拷贝到8ksteppingstone中这个是硬件就做好了的。但是BL2被拷贝到SDRAM中是BL1中的代码实现的。在BL1中也使用了IROM硬件code定义好了的copyMMCtoMEM函数,直接从MMC中拷贝BL2的代码。


两次拷贝执行完后MMC.BIN作为一个完整的uboot就已经被拷贝到SDRAM中了。


ok6410的开发板上,SDboot主要的作用就是启动mmc.BINuboot去初始化NAND,把保存在sd
中的uboot.bin, zImage拷贝到内存中,然后写进NAND中,是为了从NANDboot做准备的。


Zynq是Xilinx推出的一款嵌入式SoC(系统-on-a-chip),它集成了CPU核心和FPGA逻辑于一身。如果你想在Zynq上读取SD卡中的.bin文件,通常需要通过以下几个步骤: 1. **准备硬件**:确保Zynq开发板上有SD卡插槽,并且SD卡已插入并包含待读取的.bin文件。 2. **配置外设**:在Zynq中,你需要设置GPIO口作为SD卡控制器的I/O,以便控制数据传输。这可能涉及到使用PS(处理器部分)的硬件资源。 3. **驱动支持**:Zynq通常有现成的SD/MMC卡驱动,可以从Linux内核源码或第三方库获取。如果没有集成,可能需要编译并加载适当的驱动模块。 4. **打开文件系统**:在操作系统层面,你需要通过文件系统API(如Linux的`open()`, `read()`等函数)打开SD卡设备节点,并定位到存储.bin文件的位置。 5. **读取文件**:一旦文件描述符准备好,就可以开始读取.bin文件内容了。每次从SD卡读取数据时,可以指定缓冲区大小。 ```cpp #include <fcntl.h> #include <unistd.h> #include <sys/mman.h> int fd = open("/dev/mmcblk0p1", O_RDONLY); // 这里假设SD卡挂载点为/dev/mmcblk0p1 if (fd == -1) { perror("Failed to open device"); return -1; } off_t offset = /* 指定bin文件偏移量 */; size_t size = /* 指定要读取的数据长度 */; char* buffer = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, offset); if (buffer == MAP_FAILED) { perror("mmap failed"); close(fd); return -1; } // 现在可以处理buffer中的数据 // 使用完后记得 munmap(buffer, size); munmap(buffer, size); close(fd); ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值