- 论坛徽章:
- 0
|
首先感谢tekkaman的无私奉献。博客地址见下面的链接。
开发环境:
VMware WorkStation 6.5
Fedora 9
Windows XP
Micro2440开发板(128MB nand flash)
参考链接:
1. U-boot官方代码
ftp://ftp.denx.de/pub/u-boot/u-boot-2009.08.tar.bz2
2. Tekkamanninja的U-boot-2009.08移植
http://blog.chinaunix.net/u1/34474/showart.php?id=2085154
Git工具下载:
Fedora9利用的下载工具是yum,那么如何下载git呢?
$yum install git-all.i386 --- [附录1]
下载U-boot-2009.08经过tekkamanninja修改可以自动适应64MB/128MB的mini2440开发板的源代码,方法是利用git工具,在命令行上执行:
#mkdir /opt/u-boot
#cd /opt/u-boot
#git clone git://github.com/tekkamanninja/U-boot-2009.08_tekkaman.git
下载完成以后即可看到 /opt/u-boot/ U-boot-2009.08_tekkaman:
#cd /opt/u-boot/ U-boot-2009.08_tekkaman
修改Makefile,设置CROSS_COMPILE=arm-linux-
#gedit /opt/u-boot/ U-boot-2009.08_tekkaman/Makefile
配置编译:
#make mini2440_config
#make
完成后,得到 /opt/u-boot/ U-boot-2009.08_tekkaman/u-boot.bin。
U-boot的烧写:
1. 连接串口线和USB线,打开超级终端,连接串口
2. 打开DNW,这里不使用DNW的串口功能,用DNW来做USB下载;
3. 设置开发板从NOR Flash启动,打开开发板电源;
4. 选择Supervivi的a功能;
5. 用DNW传输u-boot.bin,传输完毕后,会自动烧写到Nand Flash;
6. 设置开发板从Nand Flash启动,这时候可以再液晶屏上看到开机画面。
U-boot-2009.08的Tekkamanninja移植:
接下来分析tekkamanninja针对U-boot-2009.08的移植过程。
具体的分析和移植过程请看。
http://blog.chinaunix.net/u3/111832/showart_2181981.html
总的修改记录:
目录
状态
涉及的文件
board
添加
添加 \tekkamanninja
添加 \tekkamanninja\mini2440
common
修改
cmd_load.c
cmd_mem.c
cmd_mmc.c
cmd_nand.c
serial.c
cpu
修改|添加
\arm920t\s3c24x0\interrupts.c
\arm920t\s3c24x0\Makefile
\arm920t\s3c24x0\mmc.c --- 添加
\arm920t\s3c24x0\speed.c
\arm920t\s3c24x0\timer.c
\arm920t\s3c24x0\usb.c
\arm920t\s3c24x0\usb_ohci.c
\arm920t\config.mk
\arm920t\start.S
drivers
修改|添加
\i2c\s3c24x0_i2c.c
\mtd\nand\nand_base.c
\mtd\nand\nand_util.c
\mtd\nand\s3c2410_nand.c
\net\dm9000x.c
\rtc\s3c24x0_rtc.c
\serial\serial_s3c24x0.c
\usb\host\ohci-hcd.c
\vedio\cfb_console.c
\vedio\Makefile
\vedio\s3c2410_fb.c --- 添加
\vedio\videomodes.c
\vedio\videomodes.h
include
修改|添加
\asm-arm\arch-s3c24x0\mmc.h --- 添加
\asm-arm\arch-s3c24x0\regs-sdi.h --- 添加
\configs\mini2440.h --- 添加
\linux\mtd\mtd.h
common.h
mmc.h
part.h
s3c24x0.h
s3c2410.h
serial.h
lib_arm
修改
board.c
net
修改
bootp.c
bootp.h
net.c
nfs.c
rarp.c
sntp.c
tftp.c
根目录
修改
Makefile
board目录的修改
smdk2410
mini2440
状态
config.mk
config.mk
修改
flash.c
flash.c
修改
lowlevel_init.S
lowlevel_init.S
修改
Makefile
Makefile
修改
smdk2410.c
mini2440.c
修改
nand_read.c
添加
总结一下,实际需要修改的文件,蓝色表示只需要添加|| defined(CONFIG_S3C2440)的文件:
目录
状态
涉及的文件
board
添加
添加 \tekkamanninja
添加 \tekkamanninja\mini2440
common
修改
cmd_load.c
cmd_mem.c
cmd_mmc.c
cmd_nand.c
serial.c
cpu
修改|添加
\arm920t\s3c24x0\interrupts.c
\arm920t\s3c24x0\Makefile
\arm920t\s3c24x0\mmc.c --- 添加
\arm920t\s3c24x0\speed.c
\arm920t\s3c24x0\timer.c
\arm920t\s3c24x0\usb.c
\arm920t\s3c24x0\usb_ohci.c
\arm920t\config.mk
\arm920t\start.S
drivers
修改|添加
\i2c\s3c24x0_i2c.c
\mtd\nand\nand_base.c
\mtd\nand\nand_util.c
\mtd\nand\s3c2410_nand.c
\net\dm9000x.c
\rtc\s3c24x0_rtc.c
\serial\serial_s3c24x0.c
\usb\host\ohci-hcd.c
\vedio\cfb_console.c
\vedio\Makefile
\vedio\s3c2410_fb.c --- 添加
\vedio\videomodes.c
\vedio\videomodes.h
include
修改|添加
\asm-arm\arch-s3c24x0\mmc.h --- 添加
\asm-arm\arch-s3c24x0\regs-sdi.h --- 添加
\configs\mini2440.h --- 添加
\linux\mtd\mtd.h
common.h
mmc.h
part.h
s3c24x0.h
s3c2410.h
serial.h
lib_arm
修改
board.c
net
修改
nfs.c
根目录
修改
Makefile
移植过程中重要的宏定义
总结一下,最重要的几个宏定义,这些配置都在mini2440.h中设置。
CONFIG_S3C2440
非常重要
CONFIG_MINI2440
主要是针对mini2440开发板,配置LED
ENABLE_CMD_NAND_YAFFS
增加对Yaffs文件系统的支持,
ENABLE_CMD_NAND_YAFFS_SKIPFB
ENABLE_CMD_LOADB_X
增加的U-boot命令
CONFIG_CMD_MMC
给SD卡使用的
CONFIG_MINI2440_LED
调试用,非必须的
CONFIG_SYS_HZ
方便调整频率,非必须的,实际上原始代码按照1000来配置的,但是这里为了精确,tekkamanninja采用了下面的方法来计算。
/* the PWM TImer 4 uses a counter of 15625 for 10 ms, so we need */
/* it to wrap 100 times (total 1562500) to get 1 sec. */
#define CONFIG_SYS_HZ 1562500
总结一下:CONFIG_S3C2410 和CONFIG_S3C2440,只要在CONFIG_S3C2410出现的地方,几乎都有CONFIG_S3C2440,搜索整个路径,得到:
排除include\configs目录下的文件,剩下:
其中的有些文件只需要简单的在出现CONFIG_S3C2410后面加上CONFIG_S3C2440即可。
移植目标:
尝试SMDK2410烧写出来的U-boot。
1. 修改CROSS_COMPILE
2. make smdk2410_config
3. make
4. 烧写u-boot.bin
测试结果,终端无任何输出,有可能是因为MPLL没有设置。明天继续测试。
应用于Linux操作系统,U-boot的移植目标:
1. 串口有数据输出
涉及到如下的方面:
board\samsung\smdk2410
顶层Makefile
include\configs\smdk2410.h
cpu\arm920t\s3c24x0\speed.c
cpu\arm920t\start.S
include\s3c24x0.h (主要是nand flash相关的)
lib_arm\board.c (U-boot启动时的一些信息)
2. 支持网络功能,DM9000x网卡。
3. 添加MMC|SD卡驱动
4. 支持yaffs|yaffs1文件系统的烧写
5. 终极目标是移植成功Linux。
应用于VxWorks操作系统,U-boot的移植目标:
1. 串口有数据输出
设计到如下的方面:
2. 支持网络功能,DM9000x网卡。
3. 终极目标是移植成功VxWorks。
具体的移植过程[移植成功]:
1. 为了减小体积
a) 删除了不需要的board配置,只剩下samsung目录;
b) 删除了不需要的cpu配置,只剩下arm920t;
c) 删除了不需要的lib文件,剩下lib_arm和lib_generic文件;
d) 删除了不需要的头文件,进入include目录,删除include类似asm_*的文件夹,剩下asm-arm和asm_generic;
2. 进入board\samsung目录
a) 复制smdk2410,重命名为mini2440
b) 重命名smdk2410.c为mini2440.c
c) 编辑Makefile,修改smdk2410.o为mini2440.o
3. 进入include\configs目录
a) 复制smdk2410.h为mini2440.h
4. 替换mini2440目录
a) 主要修改在于自带的U-boot是烧写到nor flash中的,如果要烧写到nand flash,需要增加nand的读写驱动,
采用tekkaman移植好的mini2440
5. 修改顶层Makefile
a) 修改源代码的一个bug
修改:
__OBJS := $(subst $(obj),,$(OBJS))
__LIBS := $(subst $(obj),,$(LIBS)) $(subst $(obj),,$(LIBBOARD))
为:
__OBJS := $(subst $(obj),,$(OBJS))
__LIBS := $(subst $(obj),,$(LIBBOARD)) $(subst $(obj),,$(LIBS))
b) 交叉工具链的指定
# load ARCH, BOARD, and CPU configuration
include $(obj)include/config.mk
export ARCH CPU BOARD VENDOR SOC
CROSS_COMPILE = arm-linux-
# set default to nothing for native builds
ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE ?=
endif
c) 找到
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0
复制一份,修改为:
mini2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t mini2440 samsung s3c24x0
6. 在整个代码目录搜索CONFIG_S3C2410,因为S3C2410和S3C2440是兼容的,
在需要的地方都补上CONFIG_S3C2440,排除掉一些明显不相关的文件,剩下:
在有CONFIG_S3C2410的地方,都补上CONFIG_S3C2440,
#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
7. S3C2440多了AC97和CAM接口
因此include\s3c2410.h增加了AC97和CAM接口的定义
#define BIT_CAM (0x1
#define BIT_BAT_FLT (0x1
#define BIT_TICK (0x1
#define BIT_WDT (0x1
#define BIT_WDT_AC97 (0x1
8. 修改时钟,由于MPLL的计算已经改变了,
需要修改cpu\arm920t\s3c24x0\speed.c
static ulong get_PLLCLK(int pllreg)函数中增加:
//tekkaman
#if defined(CONFIG_S3C2440)
if (pllreg == MPLL)
return ((CONFIG_SYS_CLK_FREQ * m * 2) /(p
else if (pllreg == UPLL)
#endif
//tekkaman
ulong get_HCLK(void)函数中增加:
//tekkaman
#if defined(CONFIG_S3C2440)
if (clk_power->CLKDIVN & 0x6)
{
if ((clk_power->CLKDIVN & 0x6)==2) return(get_FCLK()/2);
if ((clk_power->CLKDIVN & 0x6)==6) return((clk_power->CAMDIVN & 0x100) ? get_FCLK()/6 : get_FCLK()/3);
if ((clk_power->CLKDIVN & 0x6)==4) return((clk_power->CAMDIVN & 0x200) ? get_FCLK()/8 : get_FCLK()/4);
return(get_FCLK());
}
else return(get_FCLK());
#else
return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK());
#endif
9. [VIP]修改启动代码
cpu\arm920t\start.S
10. 进入include目录,找到s3c24x0.h
a) 在结构体S3C24X0_CLOCK_POWER中添加:
#if defined (CONFIG_S3C2440)
S3C24X0_REG32 CAMDIVN;
#endif
b) 2410和2440的nand控制差别比较大
所以修改S3C2410_NAND的定义,
#if defined (CONFIG_S3C2440)
/* NAND FLASH (see S3C2440 manual chapter 6) */
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__))*/ S3C2410_NAND;
#endif
c) [WAIT]2410和2440的USB设备的寄存器也不一样,稍后修改
d) 2440比2410多了一个GPIO口,修改S3C24X0_GPIO的定义
#if defined (CONFIG_S3C2440)
S3C24X0_REG32 res9[3];
S3C24X0_REG32 MSLCON;
S3C24X0_REG32 GPJCON;
S3C24X0_REG32 GPJDAT;
S3C24X0_REG32 GPJUP;
#endif
e) [WAIT] 2410和2440的SD INTERFACE也不一样,稍后修改。
11. 添加一些启动显示信息
修改lib_arm\board.c,
找到函数static int display_banner (void)
12. 编译cmd_mmc.c出现问题,
由于暂时不需要支持MMC
所以修改common/Makefile
#COBJS-$(CONFIG_CMD_MMC) += cmd_mmc.o
13. 编译video出现问题
可以修改Makefile和下面的配置解决。
14. 配置mini2440
a) 替换mini2440.h
采用tekkaman移植好的mini2440
b) 第一个阶段先实现串口控制,暂时不需要mmc,也不需要video
所以去掉mini2440.h中相关的宏定义。
15. 经过以上步骤,已经编译成功了,但是仍然无法出现串口提示,正常情况下,下载的U-boot代码,都几乎不需要改串口相关的代码,只要配置好即可打印出数据的,所以这个时候应该从顶层的文件开始检查,检查串口相关的配置,时钟,nand flash等。
确认已经修改了顶层Makefile中的:
__OBJS := $(subst $(obj),,$(OBJS))
__LIBS := $(subst $(obj),,$(LIBBOARD)) $(subst $(obj),,$(LIBS))
这个等待分析,不是太容易发现,感觉像是U-boot的bug!!!
16. 以上会出现蜂鸣器长鸣的现象。使得蜂鸣器不发出响声。
查看原理图,得到蜂鸣器由GPB0控制,GPB0=1的时候,蜂鸣器响。
追踪代码,发现是board\mini2440\mini2440.c文件的问题。
#if defined(CONFIG_MINI2440_LED)
gpio->GPBDAT = 0x00000181;
#endif
为了使得GPB0=0,可以修改为:
#if defined(CONFIG_MINI2440_LED)
gpio->GPBDAT = 0x00000180;
#endif
或者保留上面的代码,修改board.c文件中的start_armboot函数,即U-boot启动完成,蜂鸣器停止。
#if defined(CONFIG_MINI2440_LED)
gpio->GPBDAT = 0x0; //tekkamanninja
#endif
17. [WAIT]串口已经可以打印出数据了,提示Nand:No NAND device found!!
发现原因在于drivers\mtd\nand\s3c2410_nand.c
需要修改寄存器地址,
采用tekkaman移植好的mini2440
18. 为了简化,删除了不需要的board配置和cpu配置。
u-boot-2009.08-OK.bin是利用git下载tekkaman的移植代码,直接编译得到的文件,经过下载烧写,串口能够正常输出。u-boot-2009.08-serial-OK.bin文件是newtelcom光实现第一个阶段nand读写和串口输出正常的bin文件。
![]()
文件:
u-boot-2009.08-OK.rar
大小:
110KB
下载:
下载
![]()
文件:
u-boot-2009.08-serial-ok.rar
大小:
101KB
下载:
下载
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/111832/showart_2181979.html |
|