Chinaunix首页 | 论坛 | 博客
  • 博客访问: 188323
  • 博文数量: 33
  • 博客积分: 1460
  • 博客等级: 上尉
  • 技术积分: 500
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-24 18:08
文章分类

全部博文(33)

文章存档

2009年(4)

2008年(9)

2007年(20)

我的朋友

分类: LINUX

2007-10-18 15:28:24

 


 
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的问题!!
阅读(2642) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~