如何调试uBoot?

时间:2012-05-18 08:52:48

标签: u-boot

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

当我打开电路板时,我从串行调试控制台得不到输出,甚至没有错误消息。我可以确认,虽然该卡可以正常使用卡上的另一张工作图像。

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

1 个答案:

答案 0 :(得分:4)

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

确保按照the Denx U-Boot doc/README.mx28evk file中的规定设置了EVK开关:将启动模式DIP开关设置为:

  • 引导模式选择:1 0 0 1(从SD卡插槽0 - U42引导)
  • JTAG PSWITCH RESET:右侧(禁用重置)
  • 电池来源:向下
  • Wall 5V:Up
  • 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中。我也倾向于在putcspl_power_init.c中添加大量spl_mem_init.c语句。

请注意,错误编程PMU spl_power_init.c会导致重置,只有在您到达spl_mem_init.c后才能显示。不要让这个假你出局。