ZYNQ从⼯程创建到从flash启动Linux(基于ZC706开发板)(⼆)ZYNQ 从⼯程创建到从flash启动linux(基于ZC706开发板)(⼆)
这⼀节主要讲如何从flash启动Linux。写这篇帖⼦的⽬的,主要是因为⾃⼰在实际操作的过程中,遇到了⼀些问题,没有合适的参考内容,浪费了⾮常多的时间,⾛了很多的弯路,希望能给遇到相同问题的xx⼀些帮助
0. 为什么要从flash启动
很多开发板都有SD卡接⼝,从SD卡启动会⽐从flash简单⼀些,并且⼀些⼯具的默认配置也是从SD卡启动的,那么为什么要花这么多的精⼒折腾从flash启动呢。我认为⼀些可能的原因:1. 硬件受限,我就是这种情况,这次项⽬使⽤的硬件是甲⽅爸爸提供的,就没有SD卡接⼝,并且硬件和外壳封装好了,不⽅便打开,这种情况下就只能使⽤flash了。2.flash速度:在启动地时候,需要通过u-boot把flash中地内容(或者是SD卡⾥的内容(内核、设备树和⽂件系统等)拷贝到DDR中运⾏,如果速度快,⽆疑会缩短启动地时间。flash使⽤的是spi 接⼝,如果配置成dual quad形式,那么速率会进⼀步提升。 3.稳定性,⽅便性:flash焊接在pcb上,会⽐插拔式的SD卡更稳定。读写只需要通过jtag操作就可以,⽐把SD卡拿出来放到电脑上读写要⽅便。其实我说的这些应该均不是主要原因(后续看到了,继续补充)
1.⼯具准备
1.vivado2018.2
2.petalinux 2018.3
(安装见:ZYNQ 从⼯程创建到从flash启动linux(基于ZC706开发板)(⼯具安装))
3.xilinx SDK 2018.2
(注意版本,因为在官⽅⽂档中有这么⼀句话,我也不清楚这个是不是这个是不是必要条件,为了稳妥起见,我还是选择了相似的版本)
2.新建硬件描述⽂件
创建⼯程
1. 点开vivado,file->project->new
2. 然后点next->next,然后
3. 接下来,这⾥如果是⾃定义的硬件,就按照芯⽚选择,如果是开发板,直接选择board,然后选择对应的开发板
4. IP INTETRATOR-> create block design->ZYNQ7 Processing System
5. 点击ps的Ip核,然后选择Presest->ZC706。(如果是⾃⼰开发的硬件,则根据⾃⼰的硬件配置各种硬件,⽐如flash,时钟,uart
等。
6. run block automation->Ok
7. source ->Generate outout products
8. source->Create HDL Wrapper
9. File->export->Export Hardware 勾选⽣include(这个时候,把硬件描述⽂件和⽐特⽂件等export,在⼯作⽬录⾥⽣成了⼀个.sdk⽂
件夹
在petalinux⾥编译
1. source <petalinux-dir>/settings.sh这个命令是petalinux⽤于配置的命令
2. cd <yoour project-dir>切换到你放⼯程⽂件夹的⽬录下
3. petalinux-create --type project --template zynq --name csdn_petalinux 创建新的⼯程⽂件,其中zynq代表的是芯⽚的系列,根据⾃⼰的芯⽚
类型填写
4. 把刚才⽣成的硬件描述⽂件移动到⼯作⽬录下 路径:<your-project-dir>\csdn.sdk\design_1_wrapper_hw_platform_0/system.hdf拷贝到当前
新建的⼯程⽂件⽬录下
5. cd <cscd_petalinux>切换到你的⼯程⽬录下
6. petalinux-config --get-hw-description=<csdn_petalinux_dir>,在这⾥需要选择启动的类型,我们这次是从flash启动,所以按照下图
Subsystem AUTO Hardware Settings --->
Advanced bootable images storage Settings --->
boot image settings --->
image storage media ---> choose primary flash
kernel image settings --->
image storage media ---> choose primary flash
这个地⽅需要修改两个启动项,boot和kernel的存储位置,都选到flash。
7. 为了加快编译速度,我们可以选择多个线程同时编译,
Yocto Settings----->
Parallel thread execution
(10) sets number of bb threads(BB_NUMBER_THEADS)
(10) sets number os parallel make -j(paralled_make)
8. 其他的都按照默认,保存退出
9. petalinx-config -c u-boot,设置u-boot配置,默认,保存退出
10. petalinux-config -c kernel ,配置内核,默认,保存退出
11. petalinux-config -c rootfs,配置⽂件系统,默认,保存退出
12. petalinux-build配置已经完成,开始编译,需要花⼀点时间linux系统安装步骤csdn
制作启动⽂件
上⼀步完成了完成了我们启动需要的u-boot.elf⽂件和image.ub⽂件的制作。我们还需要⼀个关键的FSBL⽂件。
1. 通过vivado launch或者是直接打开xilinx SDK,然后,点击file->new->application
Project name: FSBL
Hareware platform:ZC706
2. next->Zynq FSBL->finish,接下来会⾃动编译,⽣成和我们硬件配置⽂件对应的FSBL.elf⽂件
3. SDK⾥点击xilinx tools->creat boot image
4. 添加三个关键的⽂件FSBL.elf,然后是u-boot,最后是image.ub,后两个都是通过petalinux⽣成的在<your-project-dir>/image/linux⽬
录下⾯。具体创建,可以参考别⼈的贴⼦,不是本帖⼦的重点。本帖⼦的重点在于image.ub的offset值设置,这个值的设置,⼤多数帖⼦都没有设置,有的⽐如有的帖⼦⾥边会说0x800000或者是0x520000。其实这个值是由FSBL.elf和u-boot.elf的⼤⼩相加来的。⼤概如下图所⽰,同时这个值也会在u-boot中起作⽤,所以这个值必须设置正确,否则会出现不到内核的情况。我们的u-boot的现在已
经⽣成,所以在⽣成u-boot的时候,需要在petalinux-config出现图像界⾯的时候,在subsystem auto hardware setting->flash setting位置查看前两个parition的size的⼤⼩,前两个相加再加1就是kernel开始的位置。
5. 把⽣成好的s⽂件使⽤xilinx中的xilinx tools->programing flash烧录到开发板中,在flash type中要选择和你的开发板上和flash
连接的spi接⼝的对应的类型。
可能遇到的问题(重要)
这个地⽅才是最想给⼤家看的地⽅,因为出错了不到错误的原因,可能需要耽搁很久。
1. 没有修改kernel和boot的启动⽅式,错误提⽰:mmc:no card present。
当然会提⽰没有mmc了,因为默认的是从SD卡启动,所以会从SD卡寻image.ub⽂件,没到,就报错了。
2.错误提⽰:partition count 14
出现这个错误的原因是由于flash type选择错误,这个错误,导致partition识别错误。
3. Wrong image foramt
Hit any key to stop autoboot: 4 3 2 1 0
SF: Detected s25fl128s_64k with page size 512 Bytes, erase size 128 KiB, total 32 MiB
device 0 offset 0xe20000, size 0xa80000
SF: 11010048 bytes @ 0xe20000 Read: OK
## Loading kernel from FIT Image at 10000000 ...
Wrong image format(⼤概是这个错误提⽰,记不清楚了)
这个原因很有可能是因为版本不匹配的问题。我使⽤了官⽅发布的2019的BSP包和2019的petalinux发⽣了这个错误。后来更换了开发环境,使⽤了2018的petalinux和对应的2018的BSP。
4. 卡在console[ttyPS0] enable
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论