update 20130426 by yangchaofeng 参考《【申嵌培训】mini2440之U-boot移植详细手册-20110908》
一、准备阶段
下载软件:u-boot 下载地址:ftp://ftp.denx.de/pub/u-boot/
u-boot-2009.11.tar.bz2 为《friendlyARM》参考文档版本
u-boot-2010.03.tar.bz2 为《申嵌-uboot移植》参考文档版本
本次使用较新的uboot版本:u-boot-2010.03.tar.bz2
tar xvjf /yang/uboot_tools/u-boot-2010.03.tar.bz2
二、建立开发板文件,测试编译环境(6.1)
1、修改顶层Makefile(6.1.1) (目的:定义交叉编译工具链和开发板配置选项)
vim Makefile
CROSS_COMPILE ?=arm-linux-
yang2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t yang2440 samsung s3c24x0
2、在/board 中建立yang2440 目录和文件(6.1.2)
复制sbc2410x 的文件(config.mk flash.c lowlevel_init.S Makefile yang2440.c)到此,做适当修改
cd samsung/
mkdir yang2440
cd yang2440
cp -arf /yang/uboot/u-boot-2010.03/board/sbc2410x/* ./
mv sbc2410x.c yang2440.c
修改此目录下的:vim Makefile
COBJS := sbc2410x.o flash.o修改为:
COBJS := yang2440.o flash.o
3、在include/configs/中建立开发板配置文件(6.1.3)
cp include/configs/sbc2410x.h include/configs/yang2440.h
4、测试编译环境(6.1.4)
make yang2440_config
make
编译通过
压缩:tar cjf u-boot-2010.03_000.tar.bz2 u-boot-2010.03
二、修正配置文件
1、修改配置文件(6.5.2) include/configs/yang2440.h
vim include/configs/yang2440.h
//#define CONFIG_S3C2410 1 /* specifically a SAMSUNG S3C2410 SoC */
//#define CONFIG_SBC2410X 1 /* on a friendly-arm SBC-2410X Board */
/**************** add by yangchaofeng ***********************************/
#define CONFIG_S3C2440 1 /* in a SAMSUNG S3C2440 SoC */
#define CONFIG_YANG2440 1 /* on a YANG2440 Board */
#define CONFIG_YANG2440_LED 1
#define CONFIG_S3C2410_NAND_SKIP_BAD 1 /* input clock of PLL */
/**************** add by yangchaofeng ***********************************/
修改vim include/asm/arch/s3c24x0_cpu.h 对S3C2440支持
#ifdef CONFIG_S3C2400
#include <asm/arch/s3c2400.h>
#elif defined CONFIG_S3C2440
#include <asm/arch/s3c2410.h>
#else
2、添加CONFIG_S3C2440 定义,目的:对CONFIG_S3C2440的支持 (6.5.1)
按照手册依次修改以下文件(6.5.1):
->common/serial.c
cpu/arm920t/s3c24x0/interrupts.c
->cpu/arm920t/s3c24x0/timer.c
->include/serial.h
->cpu/arm920t/s3c24x0/speed.c
include/asm-arm/arch-s3c24x0/s3c24x0.h(主要存放寄存器定义)
->s3c24x0_dma
->-->s3c24x0_clock_power
->s3c2410_nand
->-->s3c24x0_gpio
编译通过
压缩:tar cjf u-boot-2010.03_001.tar.bz2 u-boot-2010.03
三、探索启动代码(6.2) (cpu/arm920t/start.S)
1、修改CPU 频率初始化设置(6.2.2)
vim cpu/arm920t/start.S
加入:
#define CLK_CTL_BASE 0x4C000000
#define MDIV_405 0x7f << 12
#define PSDIV_405 0x21
#define MDIV_200 0xa1 << 12
#define PSDIV_200 0x31
#if defined(CONFIG_S3C2440)
ldr r1, =0x7fff
ldr r0, =INTSUBMSK
str r1, [r0]
#endif
#if defined(CONFIG_S3C2440)
/* FCLK:HCLK:PCLK = 1:4:8 */
ldr r0, =CLKDIVN
mov r1, #5
str r1, [r0]
mrc p15, 0, r1, c1, c0, 0
orr r1, r1, #0xc0000000
mcr p15, 0, r1, c1, c0, 0
mov r1, #CLK_CTL_BASE
mov r2, #MDIV_405
add r2, r2, #PSDIV_405
str r2, [r1, #0x04]
#else/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
#endif /* CONFIG_S3C24X0 */
2、修改lowlevel_init.S 文件(6.2.3)
为了匹配mini2440 的存储器位宽、速度、刷新率(总线上连接的Nor Flash 和SDRAM),需要修改lowlevel_init.S文件。
vim board/samsung/yang2440/lowlevel_init.S
#if defined(CONFIG_S3C2440)
#define Trp 0x2 /* 4clk */
#define REFCNT 1012
#else
#define Trp 0x0 /* 2clk */
#define REFCNT 0x0459
#endif
#define B4_BWSCON (DW16 + WAIT + UBLB)
#define B3_BWSCON (DW16)
3、修改代码重定向部分 cpu/arm920t/start.S(6.2.4)
按照手册,添加相关代码
cp /yang/uboot_tools/u-boot-2010.03/board/embedclub/smdk2440a/nand_read.c board/samsung/yang2440/
vim board/samsung/yang2440/Makefile
COBJS := nand_read.o yang2440.o flash.o
m cpu/arm920t/u-boot.lds
board/samsung/yang2440/lowlevel_init.o
board/samsung/yang2440/nand_read.o
再次编译、烧写。串口有数据输出。此时LED1、LED3长亮,蜂鸣器长响!
4、关闭为AT9200 写的LED 跳转(6.2.1)
/* 注释这两行
bl coloured_LED_init
bl red_LED_on
*/
vim board/samsung/yang2440/yang2440.c
原因在此://蜂鸣器为pwm输出功能,LED1、LED2、LED3、LED4依次为:输出、输入、输出、输入
gpio->GPBCON = 0x00044556;
gpio->GPBUP = 0x000007FF;
加入:
#ifdef CONFIG_YANG2440_LED
bl LED_on
#endif
编译通过
压缩:tar cjf u-boot-2010.03_002.tar.bz2 u-boot-2010.03
将u-boot下载测试,可以输出信息。ED1、LED2、LED3、LED4亮一下,蜂鸣器响一下
四、修改初始化代码(6.3)
1、修改 board/samsung/yang2440/yang2440.c (6.3.2)
vim board/samsung/yang2440/yang2440.c
->FCLK_SPEED
->board_init //将4个LED管脚和buzzer设为输出
vim include/asm-arm/mach-types.h 添加机器码
#define MACH_TYPE_YANG2440 1900
编译通过
压缩:tar cjf u-boot-2010.03_003.tar.bz2 u-boot-2010.03
增加debug信息输出:vim include/common.h
#define DEBUG 1
2、修改lib_arm/board.c 文件(6.3.1)
不做修改!无意义!!!
4、继续完善:CONFIG_S3C2440 定义,目的:对CONFIG_S3C2440支持 (6.5.1)
按照手册依次修改以下文件(6.5.1):
drivers/i2c/s3c24x0_i2c.c
include/asm-arm/arch-s3c24x0/s3c24x0.h(主要存放寄存器定义)
-> s3c24x0_interrupt
->usb_device
->sdi (SD)
编译通过
压缩:tar cjf u-boot-2010.03_004.tar.bz2 u-boot-2010.03
除LCD及video外,其它相关配置均已修改完成!
5、继续修改配置文件(6.5.2)include/configs/yang2440.h
vim include/configs/yang2440.h
->Hardware drivers (DM9000)
6、 修改网络相关代码 (6.4.4)
drivers/net/dm9000x.c
->dm9000_init
修改完后,编译、烧写。ping 测试网卡可以正常工作!!!
压缩:tar cjf u-boot-2010.03_005.tar.bz2 u-boot-2010.03
7、修改网络相关代码 (6.4.4)
net/nfs.c
->#define NFS_TIMEOUT (10*2000UL)
修改为:CONFIG_BOOTCOMMAND=u-boot启动时不进入命令行下的默认执行命令:
#define CONFIG_BOOTCOMMAND "nfs 30008000 192.168.0.250:/opt/zImage.img;bootm"
nfs烧写下载成功,内核启动不成功!!!
刚开始怀疑是不是因为nand的问题,后来想了想,改了回了自己写的机器码1900->1999
vim include/asm-arm/mach-types.h 添加机器码
编译,烧写,内核启动成功!!!
#define CONFIG_SYS_PROMPT "[u-boot@YANG2440]# "
#define CONFIG_BOOTARGS "console=ttySAC0 root=/dev/nfs " \
"nfsroot=192.168.0.250:/yang/filesystem/myfs_mini " \
"ip=192.168.0.230:192.168.0.250:192.168.0.1:255.255.255.0:debian:eth0:off"
利用自己编译的文件系统,通过nfs挂接设置并成功!!!
压缩:tar cvjf u-boot-2010.03_006.tar.bz2 u-boot-2010.03
修改:#define CONFIG_SYS_LOAD_ADDR 0x30008000
#define CONFIG_BOOTCOMMAND "nfs 192.168.0.250:/opt/zImage.img;bootm" //取掉了30008000
常用:
nfs启动:nfs 30008000 192.168.0.250:/opt/zImage.img
nfs 192.168.0.250:/opt/uImage-shenqian
bootm
setenv bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0