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