4

我试图让 Uboot 在飞思卡尔 mx28evk 板上运行。它编译得很好并给了我一个图像,我可以将它复制到 SD 卡。

当我打开电路板时,串行调试控制台没有输出,甚至没有错误消息。我可以确认该板与卡上的另一个工作图像一起工作正常。

找出导致问题的原因的适当下一步是什么?uBoot 分区上是否有任何模式或幻数可供我查找以确认它是有效的 uBoot?

4

2 回答 2

6

假设您已经配置了 U-Boot 版本,例如u-boot-2013.07使用mx28evk_config配置并u-boot.sb使用工具链构建了 Makefile 目标arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2,并使用 将目标转换为.sd文件./tools/mxsboot sd u-boot.sb u-boot.sd,那么最可能的问题是您的 PMU 或SDRAM 配置。这些配置中的错误可能会导致重置循环,在您到达 U-Boot 横幅打印输出之前发生重置。

确保您已按照Denx U-Bootdoc/README.mx28evk文件中指定的方式设置 EVK 开关: 将引导模式 DIP 开关设置为:

  • 引导模式选择:1 0 0 1(从 SD 卡插槽 0 - U42 引导)
  • JTAG PSWITCH RESET:向右(禁用复位)
  • 电池来源:向下
  • 墙 5V:向上
  • VDD 5V:向左(关闭)
  • 按住按钮:向下(关闭)

调试此类问题所需的下一步是将串行输出及早放入 SPL SRAM 代码中。首先将putc语句放入arch/arm/cpu/arm926ejs/mxs/spl_boot.c:mxs_common_spl_init(). 例如:

void mxs_common_spl_init(const iomux_cfg_t *iomux_setup,
                    const unsigned int iomux_size)
{
    struct mxs_spl_data *data = (struct mxs_spl_data *)
            ((CONFIG_SYS_TEXT_BASE - sizeof(struct mxs_spl_data)) & ~0xf);

    debug_putc('a');

    uint8_t bootmode = mxs_get_bootmode_index();

    debug_putc('b');

    mxs_iomux_setup_multiple_pads(iomux_setup, iomux_size);

    debug_putc('c');

    mxs_power_init();

    debug_putc('d');

    mxs_mem_init();

    debug_putc('e');

    data->mem_dram_size = mxs_mem_get_size();

    data->boot_mode_idx = bootmode;

    mxs_power_wait_pswitch();
}

我使用的putc这个是从 Freescale i.MX28 bootlet 代码中借来的:

void debug_putc(char ch)
{
    int loop = 0;
    while (((*(volatile hw_uartdbgfr_t *) ((0x80000000 + 0x74000) + 0x18)).U)&0x00000020)
    {
            loop++;
            if (loop > 10000)
            break;
    };
    ((*(volatile hw_uartdbgdr_t *) ((0x80000000 + 0x74000) + 0x0)).U = (ch));
}

您需要的类型是:

typedef unsigned int   reg32_t;
typedef unsigned short reg16_t;
typedef unsigned char  reg8_t;

typedef union
{
    reg32_t  U;
    struct
    {
        unsigned DIV_EMI            :  6;
        unsigned RSRVD1             :  2;
        unsigned DIV_XTAL           :  4;
        unsigned RSRVD2             :  4;
        unsigned DCC_RESYNC_ENABLE  :  1;
        unsigned BUSY_DCC_RESYNC    :  1;
        unsigned RSRVD3             :  8;
        unsigned BUSY_SYNC_MODE     :  1;
        unsigned BUSY_REF_CPU       :  1;
        unsigned BUSY_REF_EMI       :  1;
        unsigned BUSY_REF_XTAL      :  1;
        unsigned SYNC_MODE_EN       :  1;
        unsigned CLKGATE            :  1;
    } B;
} hw_clkctrl_emi_t;

typedef union
{
    reg32_t  U;
    struct
    {
            unsigned TRG               :  5;
            unsigned RSRVD1            :  3;
            unsigned BO_OFFSET         :  3;
            unsigned RSRVD2            :  1;
            unsigned LINREG_OFFSET     :  2;
            unsigned RSRVD3            :  2;
            unsigned DISABLE_FET       :  1;
            unsigned ENABLE_LINREG     :  1;
            unsigned DISABLE_STEPPING  :  1;
            unsigned PWDN_BRNOUT       :  1;
            unsigned RSRVD4            : 12;
    } B;
} hw_power_vddactrl_t;


typedef union
{
    reg32_t  U;
    struct
    {
            reg8_t   DATA;
            unsigned FE           :  1;
            unsigned PE           :  1;
            unsigned BE           :  1;
            unsigned OE           :  1;
            unsigned RESERVED     :  4;
            reg16_t  UNAVAILABLE;
    } B;
} hw_uartdbgdr_t;

typedef union
{
    reg32_t  U;
    struct
    {
            unsigned CTS          :  1;
            unsigned DSR          :  1;
            unsigned DCD          :  1;
            unsigned BUSY         :  1;
            unsigned RXFE         :  1;
            unsigned TXFF         :  1;
            unsigned RXFF         :  1;
            unsigned TXFE         :  1;
            unsigned RI           :  1;
            unsigned RESERVED     :  7;
            reg16_t  UNAVAILABLE;
    } B;
} hw_uartdbgfr_t;

void debug_putc(char c);

我把类型arch/arm/cpu/arm926ejs/mxs/mxs_init.hputc实现放在spl_boot.c. 我也倾向于在and中放很多putc语句。spl_power_init.cspl_mem_init.c

请注意,对 PMU 进行错误编程spl_power_init.c可能会导致复位,只有稍后您到达spl_mem_init.c. 不要让这个假装你出去。

于 2013-08-19T17:27:21.420 回答
1

尝试制作没有 U-Boot 的 SD 卡(mk_mx28_sd /dev/sdX)

在使用 U-Boot (mk_mx28_sd -u /dev/sdX) 制作 SD 卡之前尝试重新编译引导程序 (./ltib -p boot_stream.spec -f)

于 2012-09-14T17:52:45.893 回答