最近有两个网关项目打算用飞思卡尔imx280的方案,因此买了周立功的EasyARM-imx280A开发板进行一些调研。拿到板子之后发现Uboot是2009的,内核是2.6.35的,都是比较老的版本了。网上查了一下,移植新版Uboot与kernel的移植教程寥寥无几,好不容易google到几个也是一笔带过,都没细说移植过程终于到的一些具体问题以及解决办法。可能高手都惜墨如金吧,像我这种菜鸟就不讲究那么多了,我把移植过程中遇到的具体问题与解决办法写出来跟大家一起探讨,当然更希望有高手出来拍砖,多指点指点。
1、准备工作
编译器使用开发板光盘提供的:arm-fsl-linux-gnueabi-gcc(4.4.4),git clone下载最新的U-boot源码(2016.03)。
2、配置并编译源码
配置为mx28evk_nand_defconfig,编译后将生成的bin文件用开发板光盘提供的imx-bootlets(10.12.01)生成 imx28_ivt_uboot.sb。
3、下载Uboot查看运行信息
在这里我使用的是mxsldr下载到USB运行,下载后看打印信息发现Boot prep正常执行,Uboot执行时BOOT:后面输出乱码,RAM:之后便没了打印信息。经过各种跟踪打印之后发现是Boot prep没在某个地址处给出启动模式与内存大小信息。我的解决方法是在bootlets下boot_prep/init-mx28.c中_start末尾添加如下代码:
/* *
* Boot info for mainline U-boot
* HC added 20160423
* */
struct mxs_spl_data *data = (struct mxs_spl_data *)
((CONFIG_SYS_TEXT_BASE - sizeof(struct mxs_spl_data)) & ~0xf);
printf("data pointer: %X ...\r\n", data);
uint8_t bootmode = mxs_get_bootmode_index();
data->mem_dram_size = 64*1024*1024;//mxs_mem_get_size();
data->boot_mode_idx = bootmode;
printf("bootmode: %X ...\r\n", bootmode);
其中mxs_get_bootmode_index()与mxs_mem_get_size()取自Uboot/arch/arm/cpu/arm926ejs/mxs/spl_boot.c,不过mxs_mem_get_size还没调通,先根据板子实际物理内存大小写死了。
重新编译并下载运行,经测试能正确识别USB模式与SD卡模式启动了,也能打印正确的DRAM信息,不过会卡在NAND初始化处,输出信息为:MXS NAND: DMA read error。这下惨啦,究竟是NAND驱动的问题还是DMA驱动的问题呢?
4、如何正确识别NAND Flash
经过仔细对比开发板光盘提供的Uboot 源码,发现官方的Uboot在mx28_evk.c里面有段初始化nand接口GPIO的程序,参照官方源码,我也在mx28_evk.c里面添加了nand接口GPIO初始化函数。再次编译下载运行,bingo。问题解决,正确识别了Nand Flash大小。打印信息如下:
PowerPrep start initialize power...
Configured for 5v only power source. Battery powered operation disabled.
Apr 23 201615:17:44
FRAC 0x92925552
Wait for ddr ready 1Wait for ddr ready 1bank count is 4
power 0x00820616
Frac 0x92925552
start change cpu freq
hbus 0x00000003
cpu 0x00010001
start test memory accress
ddr2 0x40FFFF00
finish simple test
******ddr2 read write success!
finish simple test
finish boot prep,start to run ...
data pointer: 40001FF0 ...
mxs_get_bootmode_index: 00000000
bootmode: 00000000 ...
data->boot_mode_idx: 00000000, data->mem_dram_size:67108864
U-Boot 2016.03-dirty (Apr 23 2016 - 21:46:57 +0800)
CPU: Freescale i.MX28 rev1.2 at 454 MHz
BOOT: USB #0
SPI: ready
DRAM: 64 MiB
setup_gpmi_nand
setup_mmc0
setup_fec0
setup_duart
NAND: 128 MiB
MMC: MXS MMC: 0
*** Warning - bad CRC, using default environment
Video: MXSFB: 'videomode' variable not set!
In: serial
Out: serial
Err: serial
Net: FEC0 [PRIME], FEC1
Hit any key to stop autoboot: 0
(To be continued......)