ZYNQ Boot.bin文件结构

2015-02-04 23:25 阅读 1,287 次 评论 12 条

0x0000地址对应内容Boot Header Parameters

0x0098 地址对应的内容为image header table

0x009C地址对应的内容为partition表的起始地址,即为parition header table

问题一、Zynq的bin文件中,PL的bitstream文件是从何处开始?

Partition Header Offset:0x00000c80

Partition Count: 4

Partition Number: 0

Header Dump

Image Word Len: 0x00008005

Data Word Len: 0x00008005

Partition Word Len:0x00008005

Load Addr: 0x00000000

Exec Addr: 0x00000000

Partition Start: 0x00000370

Partition Attr: 0x00000010

Partition Checksum Offset: 0x00000000

Section Count: 0x00000000

Checksum: 0xfffe7a30

Partition Number: 1

Header Dump

Image Word Len: 0x0007f2e8

Data Word Len: 0x0007f2e8

Partition Word Len:0x0007f2e8

Load Addr: 0x00000000

Exec Addr: 0x00000000

Partition Start: 0x00008380(PL的bitstream地址)

Partition Attr: 0x00000020

Partition Checksum Offset: 0x00000000

Section Count: 0x00000001

Checksum: 0xffe7a156

Partition Number: 2

Header Dump

Image Word Len: 0x00000002

Data Word Len: 0x00000002

Partition Word Len:0x00000002

Load Addr: 0x00114000

Exec Addr: 0x00100000

Partition Start: 0x00087670

Partition Attr: 0x00000010

Partition Checksum Offset: 0x00000000

Section Count: 0x00000002

Checksum: 0xffd64717

Partition Number: 3

Header Dump

Image Word Len: 0x00005005

Data Word Len: 0x00005005

Partition Word Len:0x00005005

Load Addr: 0x00100000

Exec Addr: 0x00000000

Partition Start: 0x00087680

Partition Attr: 0x00000010

Partition Checksum Offset: 0x00000000

Section Count: 0x00000000

Checksum: 0xffe69700

从boot.bin文件的partitionheader中解析的信息看,PL的bitstream从0x00008380地址开始。此处的0x00008380为word address,所有应该乘以4,得到0x00020E00地址为PL bitstream的起始地址。

问题二、在进行IAP时,需要将fsbl的代码区与qspi flash的sector对齐,在擦写时可以不擦写fsbl。

Zynq的fsbl文件何处结束,是否可控?

Fsbl的开始地址为0x00000370*4=0xDC0;长度为0x00008005*4=0x20014,所以结束地址为0x20dd4,考虑到64byte对齐,所以结束地址为0x20e00,与上面的PL起始地址0x20e00相对应。由于已经超过了前128KB空间,所有需要从下个sector开始,下一个sector为64KB空间,所有fsbl的结束地址应该为0x30000结束,或者PL的bitstream应该从0x30000开始。

避免读取过多无效的fsbl代码,我们选择将PL的bitstream的开始地址设置为0x30000。

boot文件偏移地址设置

Partition Header Offset:0x00000c80

Partition Count: 4

Partition Number: 0

Header Dump

Image Word Len: 0x00006003

Data Word Len: 0x00006003

Partition Word Len:0x00006003

Load Addr: 0x00000000

Exec Addr: 0x00000000

Partition Start: 0x000005c0

Partition Attr: 0x00000010

Partition Checksum Offset: 0x00000000

Section Count: 0x00000001

Checksum: 0xfffed7e5

Partition Number: 1

Header Dump

Image Word Len: 0x0007f2e8

Data Word Len: 0x0007f2e8

Partition Word Len:0x0007f2e8

Load Addr: 0x00000000

Exec Addr: 0x00000000

Partition Start: 0x0000c000

Partition Attr: 0x00000020

Partition Checksum Offset: 0x00000000

Section Count: 0x00000001

Checksum: 0xffe764d6

Partition Number: 2

Header Dump

Image Word Len: 0x00000002

Data Word Len: 0x00000002

Partition Word Len:0x00000002

Load Addr: 0x00114000

Exec Addr: 0x00100000

Partition Start: 0x0008b2f0

Partition Attr: 0x00000010

Partition Checksum Offset: 0x00000000

Section Count: 0x00000002

Checksum: 0xffd60a97

Partition Number: 3

Header Dump

Image Word Len: 0x00005005

Data Word Len: 0x00005005

Partition Word Len:0x00005005

Load Addr: 0x00100000

Exec Addr: 0x00000000

Partition Start: 0x0008b300

Partition Attr: 0x00000010

Partition Checksum Offset: 0x00000000

Section Count: 0x00000000

Checksum: 0xffe65a80

从partitionheader中可以看出PLbitstream的起始地址已经改变为0xc000地址,转换为byte地址则为0x30000。

问题三、在IAP时,期望FSBL的代码不擦除,但是FSBL中的头部分包含后续PL、PS代码的起始位置与长度,起始位置已经通过问题二中的方法确定,但是当修改PL或PS的执行代码时,文件的长度有变化,岂不是需要修改FSBL中关于PL、PS代码头中的Partition Header信息?

这个问题通过bootgen试了一下,没有办法解决,但是在fsbl中还是可以解决的,虽然不是那么完美但基本可以用。在生成bin文件时,将PL的地址空间留出,然后将PL的整段代码全部加载。

版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:ZYNQ Boot.bin文件结构 | 起点博客
分类:应用笔记 标签:, ,

发表评论


表情

  1. pingis58
    pingis58 【农民】

    博主,目前我也考虑这个应用。必须把MCS文件解析出来,按格式进入QSPI的FLASH中。能不能直接把MCS文件从到尾写入即可。

  2. will
    will【站长】

    mcs是ASCII形式的,没有看转换关系与地址映射关系。
    如果是zynq的.bin文件,从头到尾写入flash就可以正常加载

  3. pingis58
    pingis58 【农民】

    谢谢回复。后面看完你的相关博文,基本猜到。有个疑问,即然在FLASH中存的就是BIN文件一样的内容,怎么PROGRAM FLASH的时候还只认MCS文件。感觉有点多此一举。

  4. pingis58
    pingis58 【农民】

    还有个不太确定也不知道合不合理的问题,请教下博主。
    我想更新程序,能不能直接在应用程序中接收BIN文件。然后直接写入FALSH。然后进行软件复位?
    有没有其他需要注意的步骤,或要注意的地方。以前没用过这类芯片,还在啃手册中,FSBL还没来得及看。

  5. will
    will【站长】

    在vivado SDK 2014.2及以后的版本,在xilinx tools->program flash中可以选择直接烧写.bin文件
    在vivado中也可以选择.bin文件烧入flash
    以上在zynq系列上均用过

  6. will
    will【站长】

    在应用程序中接收bin文件写入flash也是可以的,只是这么做不安全,一旦程序更新失败,就需要使用jtag进行程序更新。
    如果将IAP放到fsbl中,如果烧写失败可以重新烧写。
    通过地址划分可以针对PL、arm0、arm1分别进行烧写更新。
    fsbl在sdk中有例程,可以直接使用。在板子上跑一遍,根据输入的调试信息可以增强对boot过程的理解。

  7. 苏朕
    苏朕 【队长】

    由于已经超过了前128KB空间,所有需要从下个sector开始,下一个sector为64KB空间,所有fsbl的结束地址应该为0x30000结束,或者PL的bitstream应该从0x30000开始。 请问这句话应该怎么理解呢?128K指的是谁的呢?

  8. will
    will【站长】

    128KB的空间是qspi flash决定的,我们板上的qspi flash只支持64KB的块擦除,所以选择在128KB的位置。

  9. 跨境电商平台
    跨境电商平台 【农民】

    很用心的說明~~~謝謝老实~~~

  10. 苏朕
    苏朕 【队长】

    您好博主,请问XILINX的底层有没有提供QSPI-FLASH的写入呢,我从程序中没有找到相关的代码

  11. will
    will【站长】

    是存在的,xilisf中就全部包含了

  12. will
    will【站长】

    谢谢捧场,最近也开始折腾boot了