Как отлаживать uBoot?

Я пытаюсь запустить Uboot на плате Freescale mx28evk. Он отлично компилируется и дает мне образ, который я могу скопировать на SD-карту.

Когда я включаю плату, я не получаю ни вывода из последовательной консоли отладки, ни даже сообщения об ошибке. Однако я могу подтвердить, что плата работает нормально с другим рабочим изображением на карте.

Что было бы подходящим следующим шагом, чтобы выяснить, что вызывает проблему? Есть ли какие-либо шаблоны или магические числа в разделе uBoot, которые я могу найти, чтобы подтвердить, что это действительный uBoot?


person Herr von Wurst    schedule 18.05.2012    source источник
comment
Он компилируется нормально - Какой компилятор вы используете? Проблема может быть в самом начале. В противном случае использование внутрисхемного эмулятора, например J-Link, было бы следующим шагом для большинства людей.   -  person sawdust    schedule 28.08.2012
comment
Пожалуйста, укажите версию U-Boot, которую вы скомпилировали. См. также community.freescale.com/thread/304614.   -  person Jonathan Ben-Avraham    schedule 18.08.2013


Ответы (2)


Предполагая, что вы настроили версию 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.

Убедитесь, что вы установили переключатели EVK, как указано в файл Denx U-Boot doc/README.mx28evk: установите 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:

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.h, а реализацию putc в spl_boot.c. Я также склонен помещать много утверждений putc в spl_power_init.c и spl_mem_init.c.

Обратите внимание, что неправильное программирование PMU spl_power_init.c может привести к сбросу, который появится позже, когда вы доберетесь до spl_mem_init.c. Не позволяйте этому обмануть вас.

person Jonathan Ben-Avraham    schedule 19.08.2013

Попробуйте сделать SD карту без U-Boot ( mk_mx28_sd ​​/dev/sdX)

Попробуйте перекомпилировать бутлеты (./ltib -p boot_stream.spec -f) перед созданием SD-карты с U-Boot (mk_mx28_sd ​​-u /dev/sdX)

person spearson    schedule 14.09.2012
comment
Если вы используете последнюю версию U-Boot с поддержкой SPL, вы не можете использовать бутлет для ее загрузки. Вместо этого вам нужно создать u-boot.sd цель (./tools/mxsboot sd u-boot.sb u-boot.sd), dd на SD-карту и загрузиться. Функция SPL в U-Boot на самом деле является общей переработкой концепции бутлета. См. emlinews.net/2012/10/u- boot-spl-framework-becomes-generic. - person Jonathan Ben-Avraham; 19.08.2013