电子民工
全部博文(18)
分类: LINUX
2009-06-13 21:26:04
(一)使用工具及环境:
使用开发板:友善之臂QQ2440V3
linux版本: redhat9.0
交叉工具链:arm-linux-gcc 3.4.1,在友善之臂网站可以下载编译好的直接使用
u-boot版本:u-boot-1.1.6
u-boot下载地址:
(二)u-boot分析:u-boot按功能可以分成两个阶段
A.第一阶段:主要完成如下功能
1)硬件初始化,包括关闭watchdog,关中断,设置cpu速度和时钟,ram初始化等;
2)为加载u-boot第二阶段代码准备ram空间;
3)复制u-boot第二阶段代码到ram空间;
4)设置堆栈;
5)跳转到第二阶段代码入口点;
B.第二阶段:主要功能如下
1)初始化本阶段所要使用的硬件设备,包括串口,网口,flash等;
2)检测系统内存映射;
3)将内存映相和根文件系统映相从flash上读到ram空间;
4)为内核设置启动参数;
5)调用内核;
(三)u-boot-1.1.6移植过程
第一步:新建开发板相应目录及文件
1)mkdir work
2)cp u-boot-1.1.6.tar.gz /work/
3)cd /work
4)tar xzvf u-boot-1.1.6.tar.gz
5)cd u-boot-1.1.6
6)mkdir board/hb2440
7)cp -r board/smdk2410 board/hb2440
8)mv board/hb2440/smdk2410.c board/hb2440/hb2440.c
9)cp include/configs/smdk2410.h include/configs/hb2440.h
10)vi Makefile
在顶层Makefile中添加两行代码如下:
hb2440_config : unconfig
@$(MKCONFIG) $(@:_config) arm arm920t hb2440 NULL s3c24x0
11)vi board/hb2440/Makefile
COBJS := smdk2410.o flash.o
修改为
COBJS := hb2440.o flash.o
12)此时可以先编译一下
make hb2440_config
显示Configuring for hb2440 board...
make
第二步:修改SDRAM配置
1)由于s3c2440大部分配置和s3c2410一致,这里只需要修该一个参数
vi board/hb2440/lowlevel_init.S
修改#define REFCNT 1113为0x4f4,即设置HCLK为100MHZ
第三步:设置时钟频率FCLK:HCLK:PCLK=1:4:8,UPLL为48MHZ
1)修改board/hb2440/hb2440.c的board_init函数
2)修改cpu/arm920t/s3c24x0/speed.c中的get_PCLK(),get_HCLK(),
get_PCLK()等函数
3)修改include/configs/hb2440.h中第111行修改"SMDK2410"为"HB2440"
4)在include/s3c24x0.h第129行添加S3C24X0_REG32 CAMDIVN
5)此时再进行编译(直接make即可),烧录进Nor flash重启系统,在串口终端
就可以看到u-boot及各种基本命令了
6)上面修改代码部分见附件里面的相应代码部分
第四步:在上面启动u-boot后看到得flash信息不对,这一步添加对AM29LV800支持
1)修改include/configs/hb2440.h中
#define CONFIG_AMD_LV400 1
#if 0
#define CONFIG_AMD_LV800 1
#endif
修改为
#if 0
#define CONFIG_AMD_LV400 1
#endif
#define CONFIG_AMD_LV800 1
2)此时的u-boot可以使用loadb,loady命令从串口下载文件了
第五步:增加对串口xmodem协议命令,修改文件common/cmd_load.c
1)修改代码如附件相应文件
第六步:支持cs8900网卡芯片,可以再上面的基础上直接在串口终端里面设置环境参数
1)直接修改环境参数如下
HB2440# setenv ipaddr 192.168.1.17
HB2440# setenv athaddr 08:00:3e:26:0a:5b
HB2440# setenv serverip 192.168.1.100
HB2440# saveenv
2)或在代码里面修改相应的参数,代码在board/hb2440/lowlevel_init.S中
修改
#define CONFIG_ETHADDR 08:00:3e:26:0a:5b
#define CONFIG_NETNASK 255.255.255.0
#define CONFIG_IPADDR 192.168.1.17
#define CONFIG_SERVERIP 192.168.1.100
并增加对ping命令的支持
在宏#define CONFIG_COMMANDS\
(CONFIG_CMD_DFL |\
...
CFG_CMD_CACHE |\
增加 CFG_CMD_PING |\
...
第七步:支持nand flash读写操作及命令
1)配置宏CFG_CMD_NAND,同上面Ping命令
2)增加几个宏在include/configs/hb2440.h中
#define CFG_NAND_DEVICE 0
#define CFG_MAX_NAND_DEVICE 1
#define NAND_MAX_CHIPS 1
3)增加s3c2440的nand flash数据结构如下
typedef struct {
S3C24X0_REG32 NFCONF;
S3C24X0_REG32 NFCONT;
S3C24X0_REG32 NFCMD;
S3C24X0_REG32 NFADDR;
S3C24X0_REG32 NFDATA;
S3C24X0_REG32 NFMECCD0;
S3C24X0_REG32 NFMECCD1;
S3C24X0_REG32 NFSECCD;
S3C24X0_REG32 NFSTAT;
S3C24X0_REG32 NFESTAT0;
S3C24X0_REG32 NFESTAT1;
S3C24X0_REG32 NFMECC0;
S3C24X0_REG32 NFMECC1;
S3C24X0_REG32 NFSECC;
S3C24X0_REG32 NFSBLK;
S3C24X0_REG32 NFEBLK;
} /*__attribute__((__packed__))*/ S3C2440_NAND;
4)在include/s3c2410.h中增加S3C2440_GetBase_NAND()函数如下
static inline S3C2440_NAND * const S3C2440_GetBase_NAND(void)
{
return (S3C2440_NAND * const)S3C2410_NAND_BASE;
}
5)在cpu/arm920t/s3c24x0/下增加文件nand_flash.c文件,主要是实现
board_nand_init()函数,参照内核中对NAND flash初始化编写,见附加
6)修改cpu/arm920t/s3c24x0/Makefile文件
添加刚加入的nand_flash.o如下
COBJS = i2c.o interrupts.o serial.o speed.o \
usb_ohci.o nand_flash.o
7)好了,此时可以进行编译了,但如果用arm-linux-gcc 3.4.1编译会遇到软浮
点的问题,这个问题困扰了我好久,最后的解决办法如下
修改cpu/arm920t/config.mk中
PLATFORM_RELFAGS += -fno-strict-aliasing -fno-common -ffixed-r8 \
-msoft-float
为:
PLATFORM_RELFAGS += -fno-strict-aliasing -fno-common -ffixed-r8 #\
-msoft-float
再次编译就可以了,此时可以对nand flash的命令操作了
第八步:支持对nand flash的yaffs文件映相的烧写命令
1)在common/cmd_nand.c中增加使用说明,当在串口中使用help nand时显示
nand write/read.yaffs...说明
修改见附件
2)在include/nand.h中增加skipfristblk成员,因为前面用了,这里进行定义
struct nand_write_options {
u_char *buffer;
ulong length; /* number of bytes to write */
ulong offset; /* start address in NAND */
int quiet; /* don't display progress messages */
int autoplace; /* if true use auto oob layout */
int forcejffs2; /* force jffs2 oob layout */
int forceyaffs; /* force yaffs oob layout */
int noecc; /* write without ecc */
int writeoob; /* image contains oob data */
int pad; /* pad to page size */
int blockalign; /* 1|2|4 set multiple of
eraseblocks
* to align to */
int skipfristblk;
};
3)修改drivers/nand/nand_util.c中第301行增加下面代码
int skipfristblk = opts->skipfristblk;
修改910行,注销掉该行,一面烧写时会报此警告
第九步:修改默认参数,以便烧录内核和文件系统后可以自动运行
1)在include/configs/hb2440.h增加linux3个启动相关的宏
/*set para*/
#define CONFIG_SETUP_MEMORY_TAGS 1
#define CONFIG_CMDLINE_TAG 1
#define CONFIG_BOOTARGS "noinitrd root=/dev/mtdblock 2
init=/linuxrc console=ttySAC0"
2)自动启动命令
#define CONFIG_BOOTDELAY 3
#define CONFIG_BOOTCOMMAND "nboot 0x32000000 0 0; bootm
0x32000000"
第十步:以上步骤已经修改好了从Nor flash上启动的u-boot,并且可以操作nand flash,进行读写以下附件是上面所涉及到得代码文件
第十一部:重新编译#make disclean
#make hb2440_config
#make all
然后会在个根目录生成U-boot.bin
|