新闻中心

在ZC702上运行Linux(4)-编译和使用U-Boot & Linux

来源:Xilinx
发布时间:[2014-01-29]

  1. 安装工具链

  参考http://wiki.xilinx.com/zynq-tools 下载并安装cross compiler。cross compiler位于http://www.xilinx.com/member/mentor_codebench/xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin

  如网页上所说,安装包xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin提示系统是dash,而安装包需要bash。按照提示运行命令

  sudo dpkg-reconfigure -plow dash

  选择No。然后重新运行安装包。

  缺省情况下安装后的工具链位于

  ~/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin

  bash> export CROSS_COMPILE=arm-xilinx-linux-gnueabi-

  bash> export PATH= /CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin:$PATH

一般是/home/

  bash> export ARCH=arm

  可以把配置命令都放到一个文件setup里面,然后用以下命令使之生效:

  . ./setup

  2. 编译U-Boot

  bash> git clone git://git.xilinx.com/u-boot-xarm.git

  bash> cd u-boot-xarm

  bash> make zynq_zc70x_config

  bash> make

  缺省情况下下载的是master分支,如果需要在特定分支上工作可以:

  git checkout -b xilinx-14.3-build2

  可以用以下命令确认本地源码是哪个分支:

  git branch -l

  对U-Boot来说,当前的master和xilinx-14.3-build1/xilinx-14.3-build2 /xilinx-14.3-build2-trd是一回事。

  对Linux kernel来说,标签xilinx-14.3-build2/xilinx-14.3-build2-trd的时间是2012-10-23,master的最近更新时间是2012-10-26,在标签xilinx-14.3-build2后又有7次更新。

  当前的时间:2012/11/15

  3. 编译Linux

  bash> git clone git://git.xilinx.com/linux-xlnx.git

  bash> cd linux-xlnx

  bash> make xilinx_zynq_defconfig

  bash> make uImage

  到最后一步生成uImage的时候,提示没有找到mkimage,这时可以把u-boot/tools下面的mkimage拷贝到/usr/bin重新make即可uImage。

  4. 使用U-BOOT和zImage

  Zynq的ROM会在SD卡上寻找一个叫做BOOT.BIN的文件。用SDK生成ZC702的fsbl,以及编译生成的u-boot(需要改名为u-boot.elf)可以生成这个文件。尽管最新的wiki要求用SDK 14.3,实际上我用的SDK 14.2也没有什么问题。

  打开SDK->XilinxTools->Create Boot Image窗口,Bif file下拉框选择”Create a new bif file…”,FSBL file选中SDK生成的fsbl,点击Add增加u-boot.elf,设置好output folder,点击Create Image即可生成3个文件:

  bootimage.bif

  u-boot.bin

  u-boot.mcs

  将u-boot.bin改名为BOOT.BIN就可以使用了。

  注意:

  1. 底层调用的bootgen只能识别.elf和.bit的文件,如果编译生成的u-boot(尽管已经是ELF格式了)不添加扩展名,无法Create Image。如果扩展名是这两个以外的,例如.fle,生成的文件不正确,size明显要大很多。

  2. 之前有过一次Create Image失败,怀疑是因为路径里面有特殊字符(-或者.),后来测试发现不是。估计原因有可能是路径名太长,有待验证。

  用生成的BOOT.BIN和uImage替换SD卡上的同名文件,启动正常。

  5. Board Support Package (BSP)

  一部分代码在arch/arm/mach-zynq

  Hardware BlockDriver NameNotesDetailed Page

  GICgic.cin arch/arm/common

  PL330pl330.ca different driver now exists in kernel.org

  PS2ps2.csupport for keyboard and mouse in QEMU

  SCU Global Timerscu_gtimer.cprovides primitive abilities only

  System Level Control Registersslcr.cSLCR

  Triple Timer Countertimer.cOnly supports 1 TTC currently

  其他的外设和驱动源文件的的对应关系如下:

  Hardware BlockDriver NameNotesDetailed Page

  CANnot supported

  GEMxilinx_emacps.c

  GPIOxilinx_gpiops.c

  I2Ci2c-xilinx_ps.c

  NANDxilinx_nandpss.c

  QSPIxilinx_qspipc.c

  SCU WDTxilinx_scuwdt.c

  SPIxilinx_spips.c

  System WDTxilinx_wdtps.c

  UARTxilinx_uartps.c

  USB Hostehci-xilinx-usbps.c

  USB Devicexilinx_usbps_udc.c

  USB OTGxilinx_usbps_otg.c

  6. Device Tree

  Device Tree实际上是一种硬件描述方法。通过data和code分离的方式,达到一个kernel image可以支持多种硬件平台的目的。具体表现形式有两种:

  device tree source (.dts): 描述硬件平台的文本文件

  device tree blob (.dtb): 通过.dts编译生成,在Linux启动前加载到内存,然后Linux kernel根据这个文件初始化自己

  Xilinx ARM kernel使用device tree。 在Linux kernel 3.0之前, 大多数ARM Linux kernels使用platform data,并不支持。对ARM平台,dts一般放在./arch/arm/boot/dts/

  Device Tree的使用方式有两种:

  任意内存地址方式:U-Boot将devicetree.dtb的内存地址作为bootm的第三个参数,kernel通过寄存器R2找到device tree。从14.3开始,这个方法开始作为Linux kernel的缺省配置。

  固定内存地址方式:devicetree.dtb被硬编码在16Mb的位置,这主要是为了在u-boot下使用go 命令 (这个命令不会配置R2寄存器)。Kernel里面有一个”System Type->Xilinx Specific Options->Device Tree At Fixed Address”配置项,需要使能device tree后才可见。

  从Linux kernel 3.3开始,device tree可以支持中断号。不过要注意这个中断号需要在Zynq-7000 EPP TRM Table 7-3 查表得到的值上减去32。例如:查表得到UART 1的IRQID为82,所以device tree 中UART1的中断号要填写为50。

  7. Kernel Command Line获取方式:

  缺省情况下,从device tree获取。

  通过配置kernel (Boot Options->Always use the default kernel command string),使用硬编码的command line。

  8. 编译Device Tree

  bash> scripts/dtc/dtc -I dts -O dtb -o

  注意:device tree compiler (dtc) binary需要在kernel configuration里面打开device tree后才会出现在scripts/dtc/目录。

  Linux源码里面的dts和pre-built dts略有区别。修改zynq-zc702.dtc的Linux command line中ip部分:

  原始的:ip=:::::eth0:dhcp

  修改后的:ip=192.168.1.10:::255.255.255.0:ZC702:eth0

  编译后生成了dtb,经过比较,确认和pre-built package里面的devicetree.dtb完全一致。

  9. SMP

  通过boot log和以下命令可以看到在ZC702上两个Cortex-A9都在运行中

  zynq> cat /proc/cpuinfo

  如果需要只运行一个核,需要在device tree里面的kernel command line里面加上"maxcpus=1"

  如果需要指定某个应用运行在特定的CPU core上,可以用taskset命令。BusyBox支持该命令。

  The following command will display the help information for the taskset command.

  zynq> taskset 2 top

  需要注意的是,taskset的CPU core编号是从1开始的,而不是从0开始。

最新活动

寻找《xilinx UltraScale™ MPSoC架构》 下载文档有奖
活动时间:2014/3/22-2014/5/22
Xilinx Zynq交流群已开辟
QQ群号:323470211,还有 Xilinx 资深工程师入驻,帮您答疑解惑!!!
ZYNQ论坛互动专区
ZedBoard及ZingBoard开发优秀手记展示,详情进入……