开发环境:
系统:ubuntu 10.04.4
单板:tq2440
NAND FLASH:K9F1216U0A 256MB
NOR Flash:AM29LV160A 2MB
SDRAM:HY57V561620 x2 64MB
NET:DM9000AEP
编译器:arm-linux-gcc-4.3.2
搭建开发环境详见ubuntu 10.04.4开发环境配置。
目标:
1.串口正常输出
2.支持NOR Flash
3.支持DM9000网卡
一、获取源代码
下载u-boot-1.1.6.tar.bz2,并解压到工作目录
change@change:~/Si$ tar -jxvf u-boot-1.1.6.tar.bz2 -C TQ2440/
change@change:~$ cd Si/TQ2440/u-boot-1.1.6/
change@change:~/Si/TQ2440/u-boot-1.1.6$ make distclean
change@change:~/Si/TQ2440/u-boot-1.1.6$ ls
arm_config.mk COPYING fs lib_m68k MAKEALL nios_config.mk
avr32_config.mk cpu i386_config.mk lib_microblaze Makefile post
blackfin_config.mk CREDITS include lib_mips microblaze_config.mk ppc_config.mk
board disk lib_arm lib_nios mips_config.mk README
CHANGELOG doc lib_avr32 lib_nios2 mkconfig rtc
CHANGELOG-before-U-Boot-1.1.5 drivers lib_blackfin lib_ppc nand_spl rules.mk
common dtt lib_generic m68k_config.mk net tools
config.mk examples lib_i386 MAINTAINERS nios2_config.mk
change@change:~/Si/TQ2440/u-boot-1.1.6$
方便移植,新建Source Insighe工程,阅读源码,工程添加源码是,以下未用文件可以不添加
board/下除 smdk2410 以外的所有其它目标板文件夹不添加
cpu/下除 arm920t 以外的所有其它cpu目录不添加
根目录下lib_XXX 的库文件目录,只留下 lib_arm 和 lib_generic ,其它lib_XXX 不添加
include/目录下arm-XXX 的文件目录,只留下 asm-arm ,其它arm-XXX 不添加
include/configs 目录下除 smdk2410.h 以外的所有其它配置头文件不添加
二、新建单板
change@change:~/Si/TQ2440/u-boot-1.1.6$ cp -rf board/smdk2410/ board/TQ2440
change@change:~/Si/TQ2440/u-boot-1.1.6$ mv board/TQ2440/smdk2410.c board/TQ2440/TQ2440.c
change@change:~/Si/TQ2440/u-boot-1.1.6$
修改board/TQ2440/Makefile文件中28行的COBJS改为:
COBJS := TQ2440.o flash.o
change@change:~/Si/TQ2440/u-boot-1.1.6$ cp include/configs/smdk2410.h include/configs/TQ2440.h
change@change:~/Si/TQ2440/u-boot-1.1.6$
修改顶层(u-boot-1.1.6目录)Makefile 文件1882行,增加:
TQ2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t TQ2440 NULL s3c24x0
注释:各项的意思如下:
arm: CPU 的架构(ARCH)
arm920t: CPU 的类型(CPU),其对应于 cpu/arm920t 子目录。
TQ2440: 开发板的型号(BOARD),对应于 board/micro2440 目录。
NULL: 开发者/或经销商(vender)。(此处没加 vender,为 NULL。)
s3c24x0: 片上系统(SOC)。
已配置默认交叉编译链,这里采用默认配置,不需配置。
三、配置、编译、测试
change@change:~/Si/TQ2440/u-boot-1.1.6$ make distclean
change@change:~/Si/TQ2440/u-boot-1.1.6$ make TQ2440_config
Configuring for TQ2440 board...
change@change:~/Si/TQ2440/u-boot-1.1.6$ make
........
arm-linux-objcopy --gap-fill=0xff -O srec u-boot u-boot.srec
arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
change@change:~/Si/TQ2440/u-boot-1.1.6$ ls
arm_config.mk cpu include lib_nios mkconfig rules.mk
avr32_config.mk CREDITS lib_arm lib_nios2 nand_spl System.map
blackfin_config.mk disk lib_avr32 lib_ppc net tools
board doc lib_blackfin m68k_config.mk nios2_config.mk u-boot
CHANGELOG drivers lib_generic MAINTAINERS nios_config.mk u-boot.bin
CHANGELOG-before-U-Boot-1.1.5 dtt lib_i386 MAKEALL post u-boot.map
common examples lib_m68k Makefile ppc_config.mk u-boot.srec
config.mk fs lib_microblaze microblaze_config.mk README
COPYING i386_config.mk lib_mips mips_config.mk rtc
change@change:~/Si/TQ2440/u-boot-1.1.6$
可以看到编译顺利生成u-boot.bin,但是还不支持TQ2440,烧到单板不会有任何输出。
四、修改源码支持单板串口输出
1.修改内存SDRM配置
进入/board/TQ440目录修改 lowlevel_init.S文件54行如下:
#define B1_BWSCON (DW16) //(DW32) (IDE)
#define B2_BWSCON (DW16) // (IDE)
#define B3_BWSCON (DW16 + WAIT + UBLB) //CS8900
#define B4_BWSCON (DW16) //DM9000
#define B5_BWSCON (DW8) //(DW16)
#define B6_BWSCON (DW32)
#define B7_BWSCON (DW32)
修改lowlevel_init.S文件126行如下:
#define REFCNT 0x4f4
/*period=7.8125us,HCLK=100Mhz,(2048+1-7.8125*100)=0x4F4 */
//1113 /* period=15.6us, HCLK=60Mhz, (2048+1-15.6*60) */
2.修改时钟
S3c2440 的时钟计算公式和 s3c2410 不一样,对于 s3c2440 开发板,将 PCLK 设为
400Mhz,分频比为FCLK:HCLK:PCLK=1:4:8。 首先屏蔽原来s3c2410的时钟设置,修改cpu/arm920t/目录下start.S文件148行如下:
#if 0
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
#endif
然后在board_init函数中重新配置时钟,修改board/TQ2440/TQ2440.c文件中的
68行的board_init函数,并增加一些声明:
/* S3C2440: Mpll = (2*m * Fin) / (p * 2^s), UPLL = (m * Fin) / (p * 2^s)
* m = M (the value for divider M)+ 8, p = P (the value for divider P) + 2
*/
/* Fin = 12.0000MHz */
#define S3C2440_MPLL_400MHZ ((0x5c<<12)|(0x02<<4)|(0x01)) //HJ 400MHz
#define S3C2440_UPLL_48MHZ ((0x38<<12)|(0x02<<4)|(0x02)) //HJ 100MHz
#define S3C2440_CLKDIV 0x05 /* FCLK:HCLK:PCLK = 1:4:8, UCLK = UPLL */
//HJ 100MHz
/* S3C2410: Mpll,Upll = (m * Fin) / (p * 2^s)
* m = M (the value for divider M)+ 8, p = P (the value for divider P) + 2
*/
#define S3C2410_MPLL_200MHZ ((0x5c<<12)|(0x04<<4)|(0x00))
#define S3C2410_UPLL_48MHZ ((0x28<<12)|(0x01<<4)|(0x02))
#define S3C2410_CLKDIV 0x03 /* FCLK:HCLK:PCLK = 1:2:4 */
以上代码针对s3c2410、s3c2440分别定义了MPLL、UPLL寄存器的值。开发板输入时钟为 12Mhz(这在 include/configs/TQ2440.h中的宏 CONFIG_SYS_CLK_FREQ 中定义),可以根据代码中的计算公式针对自己的开发板修改系统时钟。下面是针对 s3c2410、s3c2440分别使用不同的宏设置系统时钟,用下面替换以前的board_init
int board_init (void)
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();
/* set up the I/O ports */
gpio->GPACON = 0x007FFFFF;
gpio->GPBCON = 0x00044555;
gpio->GPBUP = 0x000007FF;
gpio->GPCCON = 0xAAAAAAAA;
gpio->GPCUP = 0x0000FFFF;
gpio->GPDCON = 0xAAAAAAAA;
gpio->GPDUP = 0x0000FFFF;
gpio->GPECON = 0xAAAAAAAA;
gpio->GPEUP = 0x0000FFFF;
gpio->GPFCON = 0x000055AA;
gpio->GPFUP = 0x000000FF;
gpio->GPGCON = 0xFF95FFBA;
gpio->GPGUP = 0x0000FFFF;
gpio->GPHCON = 0x002AFAAA;
gpio->GPHUP = 0x000007FF;
/* support both of S3C2410 and S3C2440 */
if ((gpio->GSTATUS1 == 0x32410000) || (gpio->GSTATUS1 == 0x32410002))
{
/* FCLK:HCLK:PCLK = 1:2:4 */
clk_power->CLKDIVN = S3C2410_CLKDIV;
/* change to asynchronous bus mod */
__asm__( "mrc p15, 0, r1, c1, c0, 0\n" /* read ctrl register */
"orr r1, r1, #0xc0000000\n" /* Asynchronous */
"mcr p15, 0, r1, c1, c0, 0\n" /* write ctrl register */
:::"r1"
);
/* to reduce PLL lock time, adjust the LOCKTIME register */
clk_power->LOCKTIME = 0xFFFFFF;
/* configure MPLL */
clk_power->MPLLCON = S3C2410_MPLL_200MHZ;
/* some delay between MPLL and UPLL */
delay (4000);
/* configure UPLL */
clk_power->UPLLCON = S3C2410_UPLL_48MHZ;
/* some delay between MPLL and UPLL */
delay (8000);
/* arch number of SMDK2410-Board */
gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
}
else
{
clk_power->CLKDIVN = S3C2440_CLKDIV; //HJ 1:4:8
/* change to asynchronous bus mod */
__asm__( "mrc p15, 0, r1, c1, c0, 0\n" /* read ctrl register */
"orr r1, r1, #0xc0000000\n" /* Asynchronous */
"mcr p15, 0, r1, c1, c0, 0\n" /* write ctrl register */
:::"r1"
);
/* to reduce PLL lock time, adjust the LOCKTIME register */
clk_power->LOCKTIME = 0xFFFFFF;
/* configure MPLL */
clk_power->MPLLCON = S3C2440_MPLL_400MHZ; //fin=12.000MHz
/* some delay between MPLL and UPLL */
delay (4000);
/* configure UPLL */
clk_power->UPLLCON = S3C2440_UPLL_48MHZ; //fin=12.000MHz
/* some delay between MPLL and UPLL */
delay (8000);
/* arch number of SMDK2440-Board */
gd->bd->bi_arch_number = MACH_TYPE_S3C2440;
}
/* adress of boot parameters */
gd->bd->bi_boot_params = 0x30000100;
icache_enable();
dcache_enable();
return 0;
}
最后一步,获取系统时钟的函数需要针对s3c2410、s3c2440的不同进行修改。 在后面设置串口波特率时需要获得系统时钟, 就是在 U-Boot 的第二阶段,lib_arm/board.c
中start_armboot 函数调用 serial_init 函数初始化串口时,会调用 get_PCLK 函数。它在 cpu/arm920t/s3c24x0/speed.c 中定义,与它相关的还有 get_HCLK、get_PLLCLK 等函数。 前面的 board_init 函数在识别出 S3C2410 或 S3C2440 后,设置了机器类型 ID:gd?bd?bi_arch_number,后面的函数可以通过它来分辨是 S3C2410 还是 S3C2440。首先要在程序的开头增加如下一行,DECLARE_GLOBAL_DATA_PTR;这样才可以使用 gd 变量。
在 cpu/arm920t/s3c24x0/speed.c 中修改:
在程序开头40行增加一行:DECLARE_GLOBAL_DATA_PTR;这样才可以使用 gd 变量
修改54行:get_PPLCLK 函数:
static ulong get_PLLCLK(int pllreg)
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
ulong r, m, p, s;
if (pllreg == MPLL)
r = clk_power->MPLLCON;
else if (pllreg == UPLL)
r = clk_power->UPLLCON;
else
hang();
m = ((r & 0xFF000) >> 12) + 8;
p = ((r & 0x003F0) >> 4) + 2;
s = r & 0x3;
/* support both of S3C2410 and S3C2440 */
if (gd->bd->bi_arch_number == MACH_TYPE_SMDK2410)
return((CONFIG_SYS_CLK_FREQ * m) / (p << s));
else
return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s)); /* S3C2440 */
}
由于分频系数的设置方法也不一样,get_HCLK、get_PCLK也需要修改。对于s3c2410,沿用原来的计算方法,else分支中是s3c2440的代码,如下所示:
//修改get_HCLK、get_PCLK:
/* for s3c2440 */
#define S3C2440_CLKDIVN_PDIVN (1<<0)
#define S3C2440_CLKDIVN_HDIVN_MASK (3<<1)
#define S3C2440_CLKDIVN_HDIVN_1 (0<<1)
#define S3C2440_CLKDIVN_HDIVN_2 (1<<1)
#define S3C2440_CLKDIVN_HDIVN_4_8 (2<<1)
#define S3C2440_CLKDIVN_HDIVN_3_6 (3<<1)
#define S3C2440_CLKDIVN_UCLK (1<<3)
#define S3C2440_CAMDIVN_CAMCLK_MASK (0xf<<0)
#define S3C2440_CAMDIVN_CAMCLK_SEL (1<<4)
#define S3C2440_CAMDIVN_HCLK3_HALF (1<<8)
#define S3C2440_CAMDIVN_HCLK4_HALF (1<<9)
#define S3C2440_CAMDIVN_DVSEN (1<<12)
/* return HCLK frequency */
ulong get_HCLK(void)
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
unsigned long clkdiv;
unsigned long camdiv;
int hdiv = 1;
/* support both of S3C2410 and S3C2440 */
if (gd->bd->bi_arch_number == MACH_TYPE_SMDK2410)
return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK());
else
{
clkdiv = clk_power->CLKDIVN;
camdiv = clk_power->CAMDIVN;
/* work out clock scalings */
switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) {
case S3C2440_CLKDIVN_HDIVN_1:
hdiv = 1;
break;
case S3C2440_CLKDIVN_HDIVN_2:
hdiv = 2;
break;
case S3C2440_CLKDIVN_HDIVN_4_8:
hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4;
break;
case S3C2440_CLKDIVN_HDIVN_3_6:
hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3;
break;
}
return get_FCLK() / hdiv;
}
}
/* return PCLK frequency */
ulong get_PCLK(void)
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
unsigned long clkdiv;
unsigned long camdiv;
int hdiv = 1;
/* support both of S3C2410 and S3C2440 */
if (gd->bd->bi_arch_number == MACH_TYPE_SMDK2410)
return((clk_power->CLKDIVN & 0x1) ? get_HCLK()/2 : get_HCLK());
else
{
clkdiv = clk_power->CLKDIVN;
camdiv = clk_power->CAMDIVN;
/* work out clock scalings */
switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) {
case S3C2440_CLKDIVN_HDIVN_1:
hdiv = 1;
break;
case S3C2440_CLKDIVN_HDIVN_2:
hdiv = 2;
break;
case S3C2440_CLKDIVN_HDIVN_4_8:
hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4;
break;
case S3C2440_CLKDIVN_HDIVN_3_6:
hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3;
break;
}
return get_FCLK() / hdiv / ((clkdiv & S3C2440_CLKDIVN_PDIVN)? 2:1);
}
}
在 include/s3c24x0.h 中重新定义 S3C24X0_CLOCK_POWER 结构体,在 include/s3c24x0.h 中,S3C24X0_CLOCK_POWER 结构体中增加:129 行
S3C24X0_REG32 CAMDIVN; /* for s3c2440*/
至此,对s3c2440的支持(时钟配置部分)就算做好了。下面重新配置、编译
change@change:~/Si/TQ2440/u-boot-1.1.6$ make distclean
change@change:~/Si/TQ2440/u-boot-1.1.6$ make TQ2440_config
Configuring for TQ2440 board...
change@change:~/Si/TQ2440/u-boot-1.1.6$ make
make[1]: Leaving directory `/home/change/Si/TQ2440/u-boot-1.1.6/common'
UNDEF_SYM=`arm-linux-objdump -x lib_generic/libgeneric.a board/TQ2440/libTQ2440.a cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a drivers/sk98lin/libsk98lin.a post/libpost.a post/cpu/libcpu.a common/libcommon.a |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
cd /home/change/Si/TQ2440/u-boot-1.1.6 && arm-linux-ld -Bstatic -T /home/change/Si/TQ2440/u-boot-1.1.6/board/TQ2440/u-boot.lds -Ttext 0x33F80000 $UNDEF_SYM cpu/arm920t/start.o \
--start-group lib_generic/libgeneric.a board/TQ2440/libTQ2440.a cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a drivers/sk98lin/libsk98lin.a post/libpost.a post/cpu/libcpu.a common/libcommon.a --end-group -L /home/change/tools/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/armv4t -lgcc \
-Map u-boot.map -o u-boot
arm-linux-objcopy --gap-fill=0xff -O srec u-boot u-boot.srec
arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
change@change:~/Si/micro2440/u-boot-1.1.6$
编译成功,最终在u-boot-1.1.6目录下生成u-boot.bin,下载到单板NOR flash设置串口115200 8 n 1串口就有输出了。
五、增加Nor Flash支持
TQ2440开发板使用2M的EN29LV160A。
由于AM29LV800与EN29LV160A相似,修改配置文件/include/configs/TQ2440.h 156:如下:
/*-----------------------------------------------------------------------
* FLASH and environment organization
*/
#if 0
#define CONFIG_AMD_LV400 1 /* uncomment this if you have a LV400 flash */
#endif
#define CONFIG_AMD_LV800 1 /* uncomment this if you have a LV800 flash */
#define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */
#ifdef CONFIG_AMD_LV800
#define PHYS_FLASH_SIZE 0x00200000 /* 2MB */
#define CFG_MAX_FLASH_SECT (19) /* max number of sectors on one chip */
#define CFG_ENV_ADDR (CFG_FLASH_BASE + 0xF0000) /* addr of environment */
#endif
#ifdef CONFIG_AMD_LV400
#define PHYS_FLASH_SIZE 0x00080000 /* 512KB */
#define CFG_MAX_FLASH_SECT (11) /* max number of sectors on one chip */
#define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x070000) /* addr of environment */
#endif
/* timeout values are in ticks */
#define CFG_FLASH_ERASE_TOUT (5*CFG_HZ) /* Timeout for Flash Erase */
#define CFG_FLASH_WRITE_TOUT (5*CFG_HZ) /* Timeout for Flash Write */
#define CFG_ENV_IS_IN_FLASH 1
#define CFG_ENV_SIZE 0x10000 /* Total Size of Environment Sector */
最后make一下,没有错误,加载到内存中运行正常。
六、增加对网卡的支持,TQ开发板使用100M的DM9000。
u-boot 自带网卡驱动,所以只要做些设置即可。
(1)DM9000网卡使用的片选信号是nGCS 4,也就说明DM9000使用了BANK4。修改lowlevel_init.S(路径:board/TQ2440/lowlevel_init.S)。
/* BWSCON */
#define DW8 (0x0)
#define DW16 (0x1)
#define DW32 (0x2)
#define WAIT (0x1<<2)
#define UBLB (0x1<<3)
#define B1_BWSCON (DW32)
#define B2_BWSCON (DW16)
#if 0
#define B3_BWSCON (DW16 + WAIT + UBLB)
#endif
#define B3_BWSCON (DW16 + UBLB)
#define B4_BWSCON (DW16 + WAIT + UBLB)
#define B5_BWSCON (DW16)
#define B6_BWSCON (DW32)
#define B7_BWSCON (DW32)
修改前BANK3外接的CS8900网卡,将BANK3注释掉,修改数据宽度为16位,设置BANK4数据宽度16位,使用WAIT和nBE信号。
#define B4_Tacs 0x0 /*0clk */
#define B4_Tcos 0x3 /*4clk */
#define B4_Tacc 0x7 /* 14clk */
#define B4_Tcoh 0x1 /*1clk */
#define B4_Tah 0x3 /*4clk */
#define B4_Tacp 0x6 /*6clk */
#define B4_PMC 0x0 /* normal */
根据DM9000数据手册设置时序,具体见DM9000数据手册。
(2)增加网卡的 DM9000 的配置,include/configs/TQ2440.h 的56行和96行
/*
* Hardware drivers
*/
#define CONFIG_DRIVER_DM9000 1 //去掉了原来 CS8900 的配置
#define CONFIG_DM9000_BASE 0x20000000
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (CONFIG_DM9000_BASE + 4)
#define CONFIG_DM9000_USE_16BIT
#define CONFIG_ETHADDR 10:23:45:67:89:AB
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 10.21.17.110
#define CONFIG_SERVERIP 10.21.17.85
注释掉CS8900的信息,添加DM9000的配置信息。
宏定义CONFIG_DRIVER_DM9000为1表示配置使用DM9000网卡,u-boot编译时会将DM9000相关的驱动编译进去。
其中0x20000000是DM9000的基址(BANK4),由于DM9000只有一条地址线CMD(LADDR2)用于
区别是数据还是地址(CMD为低时数据总线上传输的是地址信号,CMD为高时传输的是数据信号),
所以DM9000_DATA为0x20000004,DM9000_IO为0x20000000。
我的PC和开发板使用路由器相连,PC IP地址为172.16.1.111,开发板设置为1172.16.1.133,保证在同一个网段就行。
增加ping命令:
#define CONFIG_COMMANDS \
(CONFIG_CMD_DFL| \
CFG_CMD_CACHE| \
/*CFG_CMD_NAND|*/ \
/*CFG_CMD_EEPROM |*/ \
/*CFG_CMD_I2C|*/ \
/*CFG_CMD_USB|*/ \
FG_CMD_REGINFO| \
CFG_CMD_PING| \
CFG_CMD_DATE| \
CFG_CMD_ELF)
仿照CMD命令格式,我们使用CFG_CMD_PING增加对ping的支持。
change@change:~/Si/TQ2440/u-boot-1.1.6$ make distclean
change@change:~/Si/TQ2440/u-boot-1.1.6$ make TQ2440_config
Configuring for TQ2440 board...
change@change:~/Si/TQ2440/u-boot-1.1.6$ make
make[1]: Leaving directory `/home/change/Si/TQ2440/u-boot-1.1.6/common'
UNDEF_SYM=`arm-linux-objdump -x lib_generic/libgeneric.a board/TQ2440/libTQ2440.a cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a drivers/sk98lin/libsk98lin.a post/libpost.a post/cpu/libcpu.a common/libcommon.a |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
cd /home/change/Si/TQ2440/u-boot-1.1.6 && arm-linux-ld -Bstatic -T /home/change/Si/TQ2440/u-boot-1.1.6/board/TQ2440/u-boot.lds -Ttext 0x33F80000 $UNDEF_SYM cpu/arm920t/start.o \
--start-group lib_generic/libgeneric.a board/TQ2440/libTQ2440.a cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a drivers/sk98lin/libsk98lin.a post/libpost.a post/cpu/libcpu.a common/libcommon.a --end-group -L /home/change/tools/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/armv4t -lgcc \
-Map u-boot.map -o u-boot
arm-linux-objcopy --gap-fill=0xff -O srec u-boot u-boot.srec
arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
change@change:~/Si/TQ2440/u-boot-1.1.6$ cp u-boot.bin /home/change/work/tftpboot/
七、烧写、测试
单板NOR Flash启动,通过u-boot烧写上面的程序到NOR Flash
U-Boot 1.1.6 (Mar 24 2012 - 03:44:51)
DRAM: 64 MB
Flash: 2 MB
NAND: 256 MiB
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
TQ2440 # printenv
bootargs=noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0
bootdelay=3
baudrate=115200
ethaddr=08:00:3e:26:0a:5b
bootcmd=nboot 0x30000000 0 0;bootm 0x30000000
ilesize=168d8
fileaddr=32000000
gatewayip=172.16.1.1
netmask=255.255.255.0
ipaddr=172.16.1.111
serverip=172.16.1.133
stdin=serial
stdout=serial
stderr=serial
Environment size: 529/131068 bytes
TQ2440 # tftp 0x32000000 u-boot.bin
dm9000 i/o: 0x20000000, id: 0x90000a46
MAC: 00:80:00:80:00:80
could not establish link
TFTP from server 172.16.1.133; our IP address is 172.16.1.111
Filename 'u-boot.bin'.
Load address: 0x32000000
Loading: ###################
done
Bytes transferred = 92372 (168d4 hex)
TQ2440 # protect off all
Un-Protect Flash Bank # 1
TQ2440 # erase 0 0x7ffff
Erasing sector 0 ... ok.
Erasing sector 1 ... ok.
Erasing sector 2 ... ok.
Erasing sector 3 ... ok.
Erasing sector 4 ... ok.
Erasing sector 5 ... ok.
Erasing sector 6 ... ok.
Erasing sector 7 ... ok.
Erasing sector 8 ... ok.
Erasing sector 9 ... ok.
Erasing sector 10 ... ok.
Erased 11 sectors
TQ2440 # cp.b 0x32000000 0 0x80000
Copy to Flash... done
TQ2440 #
烧写成功,重启单板,串口输出如下:
U-Boot 1.1.6 (Apr 27 2013 - 21:27:15)
DRAM: 64 MB
Flash: 2 MB
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
TQ2440 # printenv
bootcmd=nand read.jffs2 0x32000000 kernel; bootm 0x32000000
bootdelay=3
baudrate=115200
ethaddr=08:00:3e:26:0a:5b
mtdids=nand0=nandflash0
mtdparts=mtdparts=nandflash0:2m@0(kernel),8m(jffs2),-(yaffs)
filesize=3edbcc
fileaddr=30000000
netmask=255.255.255.0
ipaddr=192.168.1.17
bootargs=noinitrd console=ttySAC0 root=/dev/mtdblock1 rootfstype=jffs2
partition=nand0,0
mtddevnum=0
mtddevname=kernel
serverip=192.168.1.107
stdin=serial
stdout=serial
stderr=serial
Environment size: 458/65532 bytes
TQ2440 # set ipaddr 172.16.1.111
TQ2440 # set serverip 172.16.1.133
TQ2440 # set gatewayip 172.16.1.1
TQ2440 # ping 172.16.1.133
dm9000 i/o: 0x20000000, id: 0x90000a46
MAC: 00:80:00:80:00:80
could not establish link
host 172.16.1.133 is alive
TQ2440 # tftp 0x32000000 u-boot_2012.04.01.bin
dm9000 i/o: 0x20000000, id: 0x90000a46
MAC: 00:80:00:80:00:80
could not establish link
TFTP from server 172.16.1.133; our IP address is 172.16.1.111
Filename 'u-boot_2012.04.01.bin'.
Load address: 0x32000000
Loading: ###########################################
done
Bytes transferred = 217492 (35194 hex)
TQ2440 # protect off all
Un-Protect Flash Bank # 1
TQ2440 # erase 0 0x7ffff
Erasing sector 0 ... ok.
Erasing sector 1 ... ok.
Erasing sector 2 ... ok.
Erasing sector 3 ... ok.
Erasing sector 4 ... ok.
Erasing sector 5 ... ok.
Erasing sector 6 ... ok.
Erasing sector 7 ... ok.
Erasing sector 8 ... ok.
Erasing sector 9 ... ok.
Erasing sector 10 ... ok.
Erased 11 sectors
TQ2440 # cp.b 0x32000000 0 0x80000
Copy to Flash... done
TQ2440 #
测试网卡,可以ping通。通过tftp命令将程序放到内存,再写到NOR Flash,其中这个版本u-boot写NOR Flash过程有点长,要耐心等待。上面又将
u-boot-2012.04.01烧到NOR Flash,重启u-boot-2012.04.01正常运行,测试OK
U-Boot 2012.04.01 (Oct 25 2012 - 22:47:25)
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: 2 MiB
NAND: 256 MiB
In: serial
Out: serial
Err: serial
Net: dm9000
Hit any key to stop autoboot: 0
SMDK2410 #
这只是最简版的u-boot,很多功能还不支持,但基本上可以使用了。有兴趣可以在此基础上修改。暂时发现一个bug,不能save。