s3c2410的u-boot及linux2.6.10后的内核移植
1.开始UBOOT,我用的是1.1.5版本尽量用新一点的.
开始编译详细的步骤我不多讲,只个大概了.网上资料多多.
(1)
在u-boot的board目录下
#mkdir board/s3c2410
#cp board/smdk2410/* board/s3c2410/
#mv board/s3c2410/smdk2410.c board/s3c2410/s3c2410.c
#cp include/configs/smdk2410.h include/configs/s3c2410.h
(2)
修改board/s3c2410/Makefile,将其中的smdk2410.o为s3c2410.o
(3)
修改顶层Makefile,在smdk2410_config的附近添加
s3c2410_config : unconfig
@./mkconfig $(@:_config=) arm arm920t s3c2410 NULL s3c24x0
(4)修改board/s3c2410/lowlevel_init.S
其实不用改什么
(5)include/configs/s3c2410.h里面flash的大小要自己修改成板子的大小,(这里注意要和配置文件一致)
再添加
#define CONFIG_SETUP_MEMORY_TAGS
#define CONFIG_INITRD_TAG
#define CONFIG_CMDLINE_TAG
有些环境变量自己可以对照着试试(在uboot里面已经弄好了,只是注释掉的.可以去掉注释并改成自
己所要的).用printenv打印出来
(7)然后就编译就可以了
2.linux2.6内核.编译基本按make arch=arm s3c2410_defconfig
但要用uboot启动问题多多.
(1) 如果内核不是uImage,则下载后,比如下在0x30008000
,则通过go 0x30008000,但注意这样uboot没有传参数给内核.所以
会有Error: unrecognized/unsupported machine ID (r1 = 0x33f4fca
.这样的错误
一种方法是修改common/cmd_boot.c
/*#if defined(CONFIG_I386)*/
DECLARE_GLOBAL_DATA_PTR;
/*#endif*/
#if !defined(CONFIG_NIOS)
/*******************add here*******************************/
if(argc==2)
rc = ((ulong (*)(int, char *[]))addr) (0, gd->bd->bi_arch_number);
else
/*********************add end *****************************/
rc = ((ulong (*)(int, char *[]))addr) (--argc, &argv[1]);
解决
还可以在arch/arm/kernel/head.S写死r1
mov r1, #0xc1
(2)最搞的bootint the kernel没显示了.
一般这个错误有两种原因..
一个内核的commandline 还一个是由于主频设置的问题
通过go启动内核的话参数用的是编译时的..而bootm则是启动的经过处理的uImage(加了一个头)
所以用bootm就会把uboot设置的commandline传给内核..如果是用bootm启动出现bootint the
kernel没显示了.则应该好好检查一下.可以printenv打印看uboot有没设置对commandline
还有主频问题就是
在MPLLCON这个寄存器的配置上。(board/s3c2410/s3c2410.c)
在VIVI:MPLLCON = 0x0005c040;计算出来的Mpll = 200Mhz
Uboot114:MPLLCON = 0x000a1031;计算出来的Mpll = 202Mhz
内核不怎么如果设成202Mhz就不行.尚在分析中.
把MPLLCON改成 = 0x0005c040..终于有显示了.
或者写死内核.这个尚在分析中,不讨论..
s3c2410 # bootm 32000000
## Booting image at 32000000 ...
Image Name: linux-2.6.18 Image
Created: 2007-08-15 7:22:32 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1468948 Bytes = 1.4 MB
Load Address: 30008000
Entry Point: 30008000
Verifying Checksum ... OK
OK
Starting kernel ...
Uncompressing
Linux..................................................................................
.............. done, booting the kernel.
Linux version 2.6.18 (lb@lb) (gcc version 3.4.4) #1 Wed Aug 15 15:20:51 CST 2007
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=00007177
Machine: S3C2410
Warning: bad configuration page, trying to continue
Memory policy: ECC disabled, Data cache writeback
CPU S3C2410A (id 0x32410002)
S3C2410: core 200.000 MHz, memory 100.000 MHz, peripheral 50.000 MHz
S3C24XX Clocks, (c) 2004 Simtec Electronics
CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
CPU0: D VIVT write-back cache
另:
skyeye.conf一定要设置对.我一开始就死那里
我的
cpu: arm920t
mach: s3c2410x
mem_bank: map=M, type=R, addr=0x00000000, size=0x0400000,file=u-boot4.bin,boot=yes
mem_bank: map=M, type=R, addr=0x00000000, size=0x0C00000
mem_bank: map=M, type=RW, addr=0x30000000, size=0x2000000
mem_bank: map=M, type=RW, addr=0x32000000, size=0x2000000, file=uImage2.6.18.1 #是uImage..如果是vmlinux则应放到0x30008000
#all peripherals I/O mapping area
mem_bank: map=I, type=RW, addr=0x48000000, size=0x20000000
主要是rom和ram的大小要和配置文件的一样.像我这里uImage2.6.18.1放在0x32000000
bootm 0x32000000就可以启动..
还提示3s按enter..按的速度要快.一开始按的太慢以为没用..不然自启动了.
还有文件系统和网卡下次整理..弄了一个礼拜休息下.还有内核202.8MHz的问题!!