zynqMP LINUX 移植

本文详述了zynqMP Linux移植的过程,包括zynqMP的启动流程,从U-BOOT制作到ATF编译,再到BOOT.BIN的生成,以及LINUX内核的编译。在U-BOOT制作中,讨论了sdboot环境参数的设置;在ATF部分,提到了使用Arm-Trusted-Firmware的注意事项;BOOT.BIN制作中解决了编译问题;最后,概述了LINUX内核的编译工作。
摘要由CSDN通过智能技术生成

最近花了几天时间完成了zynqMP linux的移植工作,这里记录一下工作的流程。


zynqMP linux 启动过程

下图时xilinx手册上摘录的图,描述了zynqMP 上的linux的整个boot过程
这里写图片描述
  系统复位后,首先PMU(Platform Management Unit)会执行PMU ROM中固化代码,执行完后会启动CSU处理核,CSU会负责从启动存储介质中加载FSBL(First Stage Boot Loader)至on-chip ram中,FSBL可以由RPU负责执行也可由APU负责执行,须在制作FSBL时确定。继而,CSU激励RPU或APU执行FSBL。FSBL会加载PMU Frameware交付PMU执行。继而FSBL执行完成后切换至ATF(Arm Trusted Frame),ATF于APU上执行。然后ATF启动u-boot,u-boot为linux配置好运行环境将执行权交付给Linux内核。


U-BOOT制作

从xilinx wiki上下载u-boot-xlnx
查看 board/xilinx/zynqmp/zynqmp.c 中board_late_init

int board_late_init(void)
{
    u32 ver, reg = 0;
    u8 bootmode;
    const char *mode;
    char *new_targets;
    int ret;

    if (!(gd->flags & GD_FLG_ENV_DEFAULT)) {
        debug("Saved variables - Skipping\n");
        return 0;
    }

    ver = zynqmp_get_silicon_version();

    switch (ver) {
    case ZYNQMP_CSU_VERSION_VELOCE:
        setenv("setup", "setenv baudrate 4800 && setenv bootcmd run veloce");
    case ZYNQMP_CSU_VERSION_EP108:
    case ZYNQMP_CSU_VERSION_SILICON:
        setenv("setup", "setenv partid auto");
        break;
    case ZYNQMP_CSU_VERSION_QEMU:
    default:
        setenv("setup", "setenv partid 0");
    }

    ret = zynqmp_mmio_read((ulong)&crlapb_base->boot_mode, &reg);
    if (ret)
        return -EINVAL;

    if (reg >> BOOT_MODE_ALT_SHIFT)
        reg >>= BOOT_MODE_ALT_SHIFT;

    bootmode = reg & BOOT_MODES_MASK;

    puts("Bootmode: ");
    switch (bootmode) {
    case USB_MODE:
        puts("USB_MODE\n");
        mode = "usb";
        setenv("modeboot", "usb_dfu_spl");
        break;
    case JTAG_MODE:
        puts("JTAG_MODE\n");
        mode = "pxe dhcp";
        setenv("modeboot", "jtagboot");
        break;
    case QSPI_MODE_24BIT:
    case QSPI_MODE_32BIT:
        mode = "qspi0";
        puts("QSPI_MODE\n");
        setenv("modeboot", "qspiboot");
        break;
    case EMMC_MODE:
        puts("EMMC_MODE\n");
        mode = "mmc0";
        setenv("mod
  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值