我正試圖讓Uboot在飛思卡爾mx28evk板上運行。它編譯得很好,並給我一個圖像,我可以dd複製到SD卡。如何調試uBoot?
當我打開電路板時,串口調試控制檯沒有輸出,甚至沒有出現錯誤信息。我可以確認,雖然董事會工作正常卡上的另一個工作形象。
什麼是適當的下一步找出導致問題的原因?在uBoot分區上是否有任何模式或幻數,我可以查找以確認它是有效的uBoot?
我正試圖讓Uboot在飛思卡爾mx28evk板上運行。它編譯得很好,並給我一個圖像,我可以dd複製到SD卡。如何調試uBoot?
當我打開電路板時,串口調試控制檯沒有輸出,甚至沒有出現錯誤信息。我可以確認,雖然董事會工作正常卡上的另一個工作形象。
什麼是適當的下一步找出導致問題的原因?在uBoot分區上是否有任何模式或幻數,我可以查找以確認它是有效的uBoot?
假設已配置一個的U-Boot版本如u-boot-2013.07
與mx28evk_config
配置和使用的工具鏈如arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
建u-boot.sb
生成文件目標,並轉換目標到.sd
文件使用./tools/mxsboot sd u-boot.sb u-boot.sd
,那麼最可能的問題是您在PMU或SDRAM配置中有錯誤。這些配置中的錯誤可能會導致重置循環重置發生在您到達U-Boot橫幅打印輸出之前。
確保您已經設置了EVK交換機作爲the Denx U-Boot doc/README.mx28evk
file規定:設置啓動模式DIP開關:
,你爲了調試這類問題需要下一步是把串行輸出年初,在SPL SRAM代碼。開始時在arch/arm/cpu/arm926ejs/mxs/spl_boot.c:mxs_common_spl_init()
中輸入putc
。例如:
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();
}
,我使用的,這是從飛思卡爾i.MX28 bootlet代碼借的putc
:
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
和spl_boot.c
的putc
實施。我也傾向於把很多putc
報表spl_power_init.c
和spl_mem_init.c
。
注意,誤編程PMU spl_power_init.c
可能會導致復位,當你到spl_mem_init.c
只會出現以後。別讓這個假冒出來。
嘗試使SD卡沒有U形引導(mk_mx28_sd的/ dev/sdX的)
嘗試使SD卡用的U-Boot之前重新編譯bootlets(./ltib -p boot_stream.spec -f)( mk_mx28_sd -u的/ dev/sdX的)
如果您使用的是啓用了SPL的最新版本的U-Boot,則無法使用bootlet來啓動它。相反,你需要建立''u-boot.sd''目標(''./tools/mxsboot sd u-boot.sb u-boot.sd''),''dd''到SD卡並開機。 U-Boot的SPL特性實際上是對bootlet概念的一般重寫。請參閱http://www.emlinews.net/2012/10/u-boot-spl-framework-becomes-generic/。 –
*「它編譯得很好」* - 你在使用什麼編譯器?問題一開始就可能是正確的。否則,對於大多數人來說,使用在線仿真器(例如J-Link)將是下一步。 – sawdust
請指出您編譯的U-Boot的版本。另請參閱https://community.freescale.com/thread/304614 –