u-boot : u-boot-xlnx
ref : https://github.com/xilinx/u-boot-xlnx.git
tag : xilinx-v2017.1
# git checkout xilinx-v2017.1
其关于分区的信息都可以从include/configs/zynq-common.h里面获取
#define CONFIG_EXTRA_ENV_SETTINGS \
"ethaddr=00:0a:35:00:01:22\0" \
"kernel_image=uImage\0" \
"kernel_load_address=0x2080000\0" \
"ramdisk_image=uramdisk.image.gz\0" \
"ramdisk_load_address=0x4000000\0" \
"devicetree_image=devicetree.dtb\0" \
"devicetree_load_address=0x2000000\0" \
"bitstream_image=system.bit.bin\0" \
"boot_image=BOOT.bin\0" \
"loadbit_addr=0x100000\0" \
"loadbootenv_addr=0x2000000\0" \
"kernel_size=0x500000\0" \
"devicetree_size=0x20000\0" \
"ramdisk_size=0x5E0000\0" \
"boot_size=0xF00000\0" \
"fdt_high=0x20000000\0" \
"initrd_high=0x20000000\0" \
"bootenv=uEnv.txt\0" \
"loadbootenv=load mmc 0 ${loadbootenv_addr} ${bootenv}\0" \
"importbootenv=echo Importing environment from SD ...; " \
"env import -t ${loadbootenv_addr} $filesize\0" \
"sd_uEnvtxt_existence_test=test -e mmc 0 /uEnv.txt\0" \
"preboot=if test $modeboot = sdboot && env run sd_uEnvtxt_existence_test; " \
"then if env run loadbootenv; " \
"then env run importbootenv; " \
"fi; " \
"fi; \0" \
"mmc_loadbit=echo Loading bitstream from SD/MMC/eMMC to RAM.. && " \
"mmcinfo && " \
"load mmc 0 ${loadbit_addr} ${bitstream_image} && " \
"fpga load 0 ${loadbit_addr} ${filesize}\0" \
"norboot=echo Copying Linux from NOR flash to RAM... && " \
"cp.b 0xE2100000 ${kernel_load_address} ${kernel_size} && " \
"cp.b 0xE2600000 ${devicetree_load_address} ${devicetree_size} && " \
"echo Copying ramdisk... && " \
"cp.b 0xE2620000 ${ramdisk_load_address} ${ramdisk_size} && " \
"bootm ${kernel_load_address} ${ramdisk_load_address}
${devicetree_load_address}\0" \
"qspiboot=echo Copying Linux from QSPI flash to RAM... && " \
"sf probe 0 0 0 && " \
"sf read ${kernel_load_address} 0x100000 ${kernel_size} && " \
"sf read ${devicetree_load_address} 0x600000 ${devicetree_size} && " \
"echo Copying ramdisk... && " \
"sf read ${ramdisk_load_address} 0x620000 ${ramdisk_size} && " \
"bootm ${kernel_load_address} ${ramdisk_load_address}
${devicetree_load_address}\0" \
由上面可以提出QSPI相关的信息如下:
kernel_load_address=0x2080000
ramdisk_load_address=0x4000000
devicetree_load_address=0x2000000
kernel_size=0x500000 #5M
devicetree_size=0x20000 #128K
ramdisk_size=0x5E0000 #5.8M
再看QSPI相关
"qspiboot=echo Copying Linux from QSPI flash to RAM... && " \
"sf probe 0 0 0 && " \
"sf read ${kernel_load_address} 0x100000 ${kernel_size} && " \
"sf read ${devicetree_load_address} 0x600000 ${devicetree_size} && " \
"echo Copying ramdisk... && " \
"sf read ${ramdisk_load_address} 0x620000 ${ramdisk_size} && " \
"bootm ${kernel_load_address} ${ramdisk_load_address}
${devicetree_load_address}\0" \
把上面参数代进去可以得到
sf read [addr] [off] [len]
sf read 0x02080000 0x10_0000 0x50_0000 #5M
sf read 0x02000000 0x60_0000 0x2_0000 #128K
sf read 0x04000000 0x62_0000 0x5e_0000 #5.9M
bootm 0x0208_0000 0x0400_0000 0x0200_0000 # bootm kernel ramdisk dtb
由此不难得到分区如下:
.name start-addr end-addr #len
.u-boot 0 10_0000 #1M
.kernel 10_0000 60_0000 #5M
.dtb 60_0000 2_0000 #128K
.fs 62_0000 C0_0000 #0x5e_0000 (5.8M)
那环境变量存在哪里呢?
看u-boot里面
define CONFIG_ENV_OFFSET 0xE0000
即 0xE0000 ~ 0x10_0000 # 128K
#ifndef CONFIG_ENV_IS_NOWHERE
# ifndef CONFIG_SYS_NO_FLASH
/* Environment in NOR flash */
# define CONFIG_ENV_IS_IN_FLASH
# elif defined(CONFIG_ZYNQ_QSPI)
/* Environment in Serial Flash */
# define CONFIG_ENV_IS_IN_SPI_FLASH
# elif defined(CONFIG_NAND_ZYNQ)
/* Environment in NAND flash */
# define CONFIG_ENV_IS_IN_NAND
# elif defined(CONFIG_SYS_NO_FLASH)
# define CONFIG_ENV_IS_NOWHERE
# endif
# define CONFIG_ENV_SECT_SIZE CONFIG_ENV_SIZE
/* cc108 requires to be 0xF00000 to have boot.bin with bitstream included */
# ifndef CONFIG_ENV_OFFSET
# define CONFIG_ENV_OFFSET 0xE0000
# endif
#endif
由配置.config可知,CONFIG_SYS_NO_FLASH, CONFIG_ZYNQ_QSPI都由定义,则CONFIG_ENV_IS_IN_SPI_FLASH
即bootenv和u-boot放在一起,即
.name start-addr end-addr #len
.u-boot 0 E_0000 #896K
.env E_00000 10_0000 #128K (0x20000)
.kernel 10_0000 60_0000 #5M
.dtb 60_0000 2_0000 #128K
.fs 62_0000 C0_0000 #0x5e_0000 (5.8M)