1.到sourceforge.net中下载uboot源码,我用的版本是1.1.4.(和1.1.3没太多区别,修改的地方基本一样)。
2.解压后,修改Makefile中的交叉编译路径。
ifeq ($(ARCH),arm)
CROSS_COMPILE = /opt/host/armv4l/bin/armv4l-unknown-linux-
endif
3.make smdk2410_config ;make 后出现错误,根据提示修改:
(1)将cpu/arm920t/config.mk中的PLATform_CPPFLAGS +=$( -mapcs-32,$(call cc-option,-mabi=apcs-gnu)改为PLATform_CPPFLAGS +=$(call cc-option,-mapcs-32,$(call cc-option,-mabi=apcs-gnu),)
(2)将/include/asm-arm/processor.h中的
union debug_insn {
u32arm;
u16thumb;
};改为
union debug_insn {
u32arm_mode;
u16thumb_mode;
};
4.再make后即可编译通过啦。因为uboot中的2410板子里没有edu上用的那种flash,所以就把ppcboot中的flash文件直接拷过来啦。哈哈。方便。将/ppcboot-2.0.0/board/smdk2410/flash.c和flash-define.h拷到u-boot-1.1.4/board/smdk2410下,再将/ppcboot-2.0.0/include/flash.h拷到u-boot-1.1.4/nclude/下。hoho。flash驱动算是搞定。
5.修改include/configs/smdk2410.h,
去掉#define CONFIG_DRIVER_CS8900 1
#define CS8900_BASE 0x8000300
#define CS8900_BUS16 1
加上#define CONFIG_DRIVER_DM9000 1
#define CONFIG_DM9000_BASE 0x8000300
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (CONFIG_DM9000_BASE+4)
#define CONFIG_DM9000_USE_16BIT
#define COMMAND_LINE "initrd=0x30800000,0x440000 mem=64M root=/dev/ram init=/linuxrc console=ttyS0"
再修改其它一些配置,不具体写了,修改后如下:
#define CONFIG_COMMANDS /
(CONFIG_CMD_DFL | /
CFG_CMD_CACHE | /
CFG_CMD_PING | / //加上PING哦,否则不能下载
CFG_CMD_REGINFO | /
CFG_CMD_DATE | /
CFG_CMD_ELF)
#define CONFIG_ETHADDR08:00:3e:26:0a:5b
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR192.168.2.110
#define CONFIG_SERVERIP192.168.2.111
#define CFG_MAX_FLASH_BANKS1/* max number of memory banks */
#define CONFIG_INTEL_E28F128 1
#ifdef CONFIG_INTEL_E28F128
#define PHYS_FLASH_SIZE0x01000000 /* 16MB */
#define CFG_FLASH_SIZEPHYS_FLASH_SIZE /* 16MB */
#define CFG_MAX_FLASH_SECT(128)/* max number of sectors on one chip */
#define CFG_ENV_ADDR(CFG_FLASH_BASE + 0x020000) /* addr of environment */
#endif
6.Ok。make编译后,生成uboot.bin文件,下载到ram中,go 30008000,出现
#Starting application at 0x30008000…
Start linux..
Setup linux parameters at 0x3000100 然后就不动了:(
我的解决方法是到cpu/arm920t/start.S中
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
//blcpu_init_crit
#endif
注释掉blcpu_init_crit。哈哈,重新编译后就可以在ram中调试啦。看了这段子程序,是调用board/smdk2410/lowlevel_init.S文件,这个文件是用来初始化ram的,估计是在ram中运行,就不能初始化了吧?(恳请大虾解惑)。
一切调试成功后,就可以烧进去了。注意现在就要把blcpu_init_crit前的注释去掉喽。烧到flash中就必须初始化ram,否则烧写后什么显示都没。
下面是我uboot工作状态:
PPCBoot 2.0.0 (Dec 15 2005 - 20:00:18)
PPCBoot code: 33F00000 -> 33F15D5C BSS: -> 33F191F0
DRAM Configuration:
Bank #0: 30000000 64 MB
Flash Memory Start 0x0
Device ID of the Flash is 18
intel E28F128J3A150 init finished!!!
Flash: 16 MB
Write 18 to Watchdog and it is 18 now
start linux now(y/n):
SMDK2410 # tftp 30008000 u-boot.bin
<DM9000> I/O: 8000300, VID: 90000a46
NetOurIP =c0a802de
NetServerIP = c0a8026f
NetOurGatewayIP = c0a80201
NetOurSubnetMask = ffffff00
ARP broadcast 1
ARP broadcast 2
TFTP from server 192.168.2.111; our IP address is 192.168.2.222
Filename 'u-boot.bin'.
Load address: 0x0
Loading: #####################
done
Bytes transferred = 103676 (194fc hex)
SMDK2410 # go 30008000
## Starting application at 0x30008000 ...
Start linux ..
Setup linux parameters at 0x30000100
U-Boot 1.1.4 (Dec 27 2006 - 13:56:04)
U-Boot code: 33F80000 -> 33F994FC BSS: -> 33F9D8DC
RAM Configuration:
Bank #0: 30000000 64 MB
Flash Memory Start 0x0
Device ID of the Flash is 18
intel E28F128J3A150 init finished!!!
Flash: 16 MB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
DAILY2410 #
DAILY2410 #
DAILY2410 # printenv
bootdelay=3
baudrate=115200
ethaddr=08:00:3e:26:0a:5b
ipaddr=192.168.2.110
serverip=192.168.2.111
netmask=255.255.255.0
stdin=serial
stdout=serial
stderr=serial
Environment size: 161/65532 bytes
DAILY2410 #
Environment size: 161/65532 bytes
DAILY2410 # bdinfo
arch_number = 0x000000C1
env_t = 0x00000000
boot_params = 0x30000100
DRAM bank = 0x00000000
-> start = 0x30000000
-> size = 0x04000000
ethaddr = 08:00:3E:26:0A:5B
ip_addr = 192.168.2.110
baudrate = 115200 bps
DAILY2410 #
DAILY2410 # flinfo
Bank # 1: intel E28F128J3A150
00000000 (RO) 00020000 00040000 00060000 00080000
000A0000 000C0000 000E0000 00100000 00120000
00140000 00160000 00180000 001A0000 001C0000
001E0000 00200000 00220000 00240000 00260000
00280000 002A0000 002C0000 002E0000 00300000
00320000 00340000 00360000 00380000 003A0000
003C0000 003E0000 00400000 00420000 00440000
00460000 00480000 004A0000 004C0000 004E0000
00500000 00520000 00540000 00560000 00580000
005A0000 005C0000 005E0000 00600000 00620000
00640000 00660000 00680000 006A0000 006C0000
006E0000 00700000 00720000 00740000 00760000
00780000 007A0000 007C0000 007E0000 00800000
00820000 00840000 00860000 00880000 008A0000
008C0000 008E0000 00900000 00920000 00940000
00960000 00980000 009A0000 009C0000 009E0000
00A00000 00A20000 00A40000 00A60000 00A80000
00AA0000 00AC0000 00AE0000 00B00000 00B20000
00B40000 00B60000 00B80000 00BA0000 00BC0000
00BE0000 00C00000 00C20000 00C40000 00C60000
00C80000 00CA0000 00CC0000 00CE0000 00D00000
00D20000 00D40000 00D60000 00D80000 00DA0000
00DC0000 00DE0000 00E00000 00E20000 00E40000
00E60000 00E80000 00EA0000 00EC0000 00EE0000
00F00000 00F20000 00F40000 00F60000 00F80000
00FA0000 00FC0000 00FE0000
DAILY2410 #
DAILY2410 # protect off 1:0
Un-Protect Flash Sectors 0-0 in Bank # 1
. done
DAILY2410 #
DAILY2410 # erase 1:0
Erase Flash Sectors 0-0 in Bank # 1 [XXXXX]
DAILY2410 #
DAILY2410 # tftp 30008000 u-boot.bin
dm9000 i/o: 0x8000300, id: 0x90000a46
MAC: 00:80:00:80:00:80
operating at unknown: 15 mode
TFTP from server 192.168.2.111; our IP address is 192.168.2.110
Filename 'u-boot.bin'.
Load address: 0x30008000
Loading: T #####################
done
Bytes transferred = 103704 (19518 hex)
DAILY2410 # cp.b 30008000 0 20000
Copy to Flash... *******************************************************
#
done
{
__asm__(
"movr1, #0/n"
"movr1, #7 << 5/n" /* 8 segments */
"1:orrr3, r1, #63 << 26/n" /* 64 entries */
"2:mcrp15, 0, r3, c7, c14, 2/n" /* clean & invalidate D index */
"subsr3, r3, #1 << 26/n"
"bcs2b/n" /* entries 64 to 0 */
"subsr1, r1, #1 << 5/n"
"bcs1b/n" /* segments 7 to 0 */
"mcrp15, 0, r1, c7, c5, 0/n" /* invalidate I cache */
"mcrp15, 0, r1, c7, c10, 4/n" /* drain WB */
);
}
static inline void cpu_arm920_tlb_invalidate_all(void)
{
__asm__(
"movr0, #0/n"
"mcrp15, 0, r0, c7, c10, 4/n"/* drain WB */
"mcrp15, 0, r0, c8, c7, 0/n"/* invalidate I & D TLBs */
);
}
void call_linux(long a0, long a1, long a2)
{
__asm__(
"movr0, %0/n"
"movr1, %1/n"
"movr2, %2/n"
"movip, #0/n"
"mcrp15, 0, ip, c13, c0, 0/n"/* zero PID */
"mcrp15, 0, ip, c7, c7, 0/n"/* invalidate I,D caches */
"mcrp15, 0, ip, c7, c10, 4/n"/* drain write buffer */
"mcrp15, 0, ip, c8, c7, 0/n"/* invalidate I,D TLBs */
"mrcp15, 0, ip, c1, c0, 0/n"/* get control register */
"bicip, ip, #0x0001/n"/* disable MMU */
"mcrp15, 0, ip, c1, c0, 0/n"/* write control register */
"movpc, r2/n"
"nop/n"
"nop/n"
: /* no outpus */
: "r" (a0), "r" (a1), "r" (a2)
);
#define RAMDISK 1
/*static*/ void setup_linux_param(ulong param_base)
{
struct param_struct *params = (struct param_struct *)param_base;
#ifdef RAMDISK
char linux_cmd[] = "initrd=0x30800000,0x440000 mem=64M root=/dev/ram init=/linuxrc console=ttyS0";
#endif
#ifdef CRAMFS
char linux_cmd[] = "root=/dev/mtdblock/2 rw mem=32M";
#endif
printf("Setup linux parameters at 0x%08lx/n", param_base);
memset(params, 0, sizeof(struct param_struct));
params->u1.s.page_size = LINUX_PAGE_SIZE;
params->u1.s.nr_pages = (DRAM_SIZE >> LINUX_PAGE_SHIFT);
#if 0
params->u1.s.page_size = LINUX_PAGE_SIZE;
params->u1.s.nr_pages = (dram_size >> LINUX_PAGE_SHIFT);
params->u1.s.ramdisk_size = 0;
params->u1.s.rootdev = rootdev;
params->u1.s.flags = 0;
#endif
/* If use ramdisk */
params->u1.s.initrd_start = 0xC0800000 ;
params->u1.s.initrd_size = 0x440000;
params->u1.s.rd_start = 0;
/* set linux command line */
if (linux_cmd == NULL) {
printf("Wrong magic: could not found linux command line/n");
} else {
memcpy(params->commandline, linux_cmd, strlen(linux_cmd) + 1);
}
}
以及几个宏变量的定义。
在cmd_boot.c中将do_go函数改为
int do_go (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
ulongaddr, rc;
int rcode = 0;
if (argc < 2) {
printf ("Usage:/n%s/n", cmdtp->usage);
return 1;
}
addr = simple_strtoul(argv[1], NULL, 16);
printf ("## Starting application at 0x%08lx .../n", addr);
printf("Start linux ../n");
setup_linux_param(/*boot_mem_base*/0x30000000 + 0x100);
call_linux(0, 0xc1, addr);
printf("End/n");
rc = ((ulong (*)(int, char *[]))addr) (--argc, &argv[1]);
if (rc != 0) rcode = 1;
printf ("## Application terminated, rc = 0x%lx/n", rc);
return rcode;
}
就ok啦。
重新编译后,我的linux和ramdisk.image.gz就可以欢快的跑起来啦。
哈,不过这是2.4的内核,把armlinux.c中的ttyS0改为ttySAC0,在用论坛上下的zImage.2410.2.6测试一下,哈,2.6也能跑啦。
不过bootm的问题我无法解决。
做了一个uImage。Tftp 30008000后,出现:
## Booting image at 30008000 ...
Image Name:
Created: 2007-01-01 12:18:08 UTC
Image Type: ARM Linux Kernel Image (gzip compressed)
Data Size: 893780 Bytes = 872.8 kB
Load Address: 30008000
Entry Point: 30008000
Verifying Checksum ... OK
Uncompressing Kernel Image ... Error: inflate() returned -3
GUNZIP ERROR - must RESET board to recover
看了论坛上的旧帖,说是地址覆盖了。故改为31000000 .tftp后,bootm 31000000,呵,内核也能跑以来,可是莫名奇妙的是那些打印信息不在console上显示,怎么全都跑到lcd上显示去了。。。我晕。。就是把原来的zImage做成的uImage,解压后两个应该是一样的啊。
晕。。。不搞了。。还是先用go继续做吧。