首先使用原来可以成功运行的kernel配置进行配置,我使用的是MVL3.0,其内核版本是2.4.18。
注:由于两款硬件的SDRAM大小不同,以前的SDRAM是256M,新硬件的SDRAM是128M,因此修改配置文件中的kernel cmdline,内容如下:
CODE:
console=ttyS0,115200 root=/dev/ram rw ip=off mem=128M@0x00000000 initrd=0x00800000,8M
然后执行一下命令:
CODE:
make ixdp425_config
make oldconfig
make dep
make zImage
成功,得到vmlinux和zImage,用file命令检查vmlinux文件,显示:
CODE:
file vmlinux
vmlinux: ELF 32-bit MSB executable, ARM, Version 1 (ARM), statically linked, not stripped
确认为可以在ARM上执行的文件。然后连接硬件,启动到RedBoot系统,执行以下命令:
CODE:
RedBoot> load -r -v -b 0x11600000 zImage
Using default protocol (TFTP)
|
Raw file loaded 0x11600000-0x116ada3f, assumed entry at 0x11600000
RedBoot> fis list
Name FLASH addr Mem addr Length Entry point
RedBoot 0x50000000 0x50000000 0x00060000 0x00000000
RedBoot config 0x50FC0000 0x50FC0000 0x00001000 0x00000000
FIS directory 0x50FE0000 0x50FE0000 0x00020000 0x00000000
mac 0x50060000 0x10000000 0x00020000 0x10000000
zimage 0x50080000 0x11600000 0x00100000 0x11600000
ramdisk 0x50180000 0x10800000 0x00600000 0x10800000
param 0x505E0000 0x00100000 0x00020000 0x10800000
RedBoot> go 0x11600000
Uncompressing Linux.................................................. done, boot
ing the kernel.
到此,系统就没有反映了。
网上搜索了一下,发现有三种情况遇到此问题:
1、一部分同仁们在cmdline中的console定义错误,将ttyS0写成了tty0,这样将输出定向到了标准终端,而不是串口;
2、一部分同仁在省级到2.6.10以上内核时还是错误的定义了console输出,2.6.10后的串口名据说变成ttySC0了,我也没试过2.6.10的内核;
3、还有一部分人在升级到2.6.10后,使用一个叫做skyeye的工具模拟,好像那样会牵扯到一个memory.h和lubbock.c中的关于内存基地址的定义问题,需要修改基地址中的0xa0000000为0xc00000000。
对比了硬件厂家提供的软件包,其中在arch/arm/boot目录下,Makefile中有以下定义点:
CODE:
ifeq ($(CONFIG_ARCH_IXP425),y)
ZRELADDR = 0x00008000
PARAMS_PHYS = 0x00000100
endif
这与厂家提供的地址不同,这几个地址是kernel imgae解压缩后的地址,硬件相关,因此需要修改一致:
然后还有arch/arm/boot/compressed目录下的head-xscale.S文件,这个文件是初始化是调用的汇编,与芯片相关的,MVL提供的和厂商提供的不一样,因此用厂商提供的该文件替换。
然后就是注意kernel配置中的CMDLINE的设置,就OK了!
重新编译内核,加载,OK,系统启动成功。
但是现在碰到了新的问题,启动后系统报出如下错误:
CODE:
[error] No ISR registered to service interrupt
这个报错是由于一个模块没有加载成功造成的,重新编译modules后,替换到ramdisk中,就OK了!