- 论坛徽章:
- 0
|
移植目标:
尝试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
需要修改nand寄存器地址,
采用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_2181985.html |
|