上个星期主要一直在搞vivi这个bootloader东西,主要是针对QQ2440开发板,我要的是在Nor Flash上跑,一个星期过去,结果出来了,现在的vivi才是我想要的,我把menuconfig去掉,把非S3C2440的所有其他CPU干掉,同时把其他没用的宏干掉,修改makefile变得简单容易阅读的,同时,上个星期一直在ubuntu 10.04系统里调试,每次打开机器都要他妈的开个VirtualBox的虚拟机,加上笔记本不稳定,串口错误数据下子把笔记本弄的重启,受不了,就直接用windows下的GNU410版本进行编译,经修改后,完全可以编译vivi编码,这样就可以摆脱虚拟机的痛苦。。。。呵呵
下面是vivi主目录下的Makefile文件,已经调整过,支持CYGWIN和ubuntu平台,不同ubuntu下用的是arm-gcc 3.4.2版本,就是Friendly那边下载的,直接解压就可以,在cygwin平台使用的是GNU410版本
FILE: Makefile
======================================================================
# cygwin CYG_GNU410_INC = '/cygdrive/c/Program Files/GNUARM.410/lib/gcc/arm-elf/4.1.0'CYG_GNU410_CLIB = '/cygdrive/c/Program Files/GNUARM.410/arm-elf/lib'CYG_GNU410_GCCLIB = '/cygdrive/c/Program Files/GNUARM.410/lib/gcc/arm-elf/4.1.0'CYG_GNU410_BIN = '/cygdrive/c/Program Files/GNUARM.410/bin'# vc6GNU410_INC = 'C:/Program Files/GNUARM.410/lib/gcc/arm-elf/4.1.0'GNU410_CLIB = 'C:/Program Files/GNUARM.410/arm-elf/lib'GNU410_GCCLIB = 'C:/Program Files/GNUARM.410/lib/gcc/arm-elf/4.1.0'GNU410_BIN = 'C:/Program Files/GNUARM.410/bin'# linux GCC 4.3.2 GNU432_INC = '/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include'GNU432_CLIB = '/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib'GNU432_GCCLIB = '/usr/local/arm/4.3.2/lib/gcc/arm-none-linux-gnueabi/4.3.2/armv4t'GNU432_BIN = '/usr/local/arm/4.3.2/bin'ifdef COMSPECifdef _VBOOT_VC6_# vc6ARM_INCLUDE ?=$(GNU410_INC)ARM_C_LPATH ?=$(GNU410_CLIB)ARM_GCC_LPATH ?=$(GNU410_GCCLIB)ARM_BIN_PATH ?=$(GNU410_BIN)VBOOT_ROOT ?=E:/work/vivi_bakup/vbootelse # cygwinARM_INCLUDE ?=$(CYG_GNU410_INC)ARM_C_LPATH ?=$(CYG_GNU410_CLIB)ARM_GCC_LPATH ?=$(CYG_GNU410_GCCLIB)ARM_BIN_PATH ?=$(CYG_GNU410_BIN)VBOOT_ROOT ?=$(shell /bin/pwd)endifelse# linuxARM_INCLUDE ?=$(GNU432_INC)ARM_C_LPATH ?=$(GNU432_CLIB)ARM_GCC_LPATH ?=$(GNU432_GCCLIB)ARM_BIN_PATH ?=$(GNU432_BIN)VBOOT_ROOT ?=$(shell /bin/pwd)endififdef COMSPEC#cygwin, vc6CROSS_COMPILE = $(ARM_BIN_PATH)/arm-elf-else#linuxCROSS_COMPILE = $(ARM_BIN_PATH)/arm-linux-endifLINUX_INCLUDE_DIR = $(ARM_INCLUDE)TOPDIR = $(VBOOT_ROOT)CONFIG_FILE = defconfigARCH = arminclude $(CONFIG_FILE)VERSION = 0PATCHLEVEL = 1SUBLEVEL = 4VBOOTRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)VBOOTPATH = '$(TOPDIR)/include'MAKE = makeAS = $(CROSS_COMPILE)asLD = $(CROSS_COMPILE)ldCC = $(CROSS_COMPILE)gccCPP = $(CC) -EAR = $(CROSS_COMPILE)arNM = $(CROSS_COMPILE)nmOBJCOPY = $(CROSS_COMPILE)objcopyMAKEFILES = $(TOPDIR)/$(CONFIG_FILE)export TOPDIR LD CCall: vbootCPPFLAGS = -I$(VBOOTPATH) -I$(LINUX_INCLUDE_DIR)CFLAGS = $(CPPFLAGS) -Wall -Wstrict-prototypes -O2 -fPIC -fomit-frame-pointer# cygwin platformifdef COMSPECCFLAGS += -D__GNU410__endifAFLAGS = -D__ASSEMBLY__ $(CPPFLAGS)CORE_FILES = init/main.o init/version.o lib/lib.oLIBS = lib/priv_data/priv_data.oSUBDIRS = drivers libDRIVERS-y :=DRIVERS-$(CONFIG_SERIAL) += drivers/serial/serial.oDRIVERS-$(CONFIG_MTD) += drivers/mtd/mtd.oDRIVERS := $(DRIVERS-y)CLEAN_FILES = vboot.elf vboot.bin vboot.nm vboot.mapOBJCOPYFLAGS = -R .comment -R .stab -R .stabstrCLIBS = -L$(ARM_GCC_LPATH) -L$(ARM_C_LPATH) -lgcc -lcLINKFLAGS = -Tarch/vboot.lds -Bstatic include arch/Makefileexport CPPFLAGS CFLAGS AFLAGS DRIVERS LDFLAGSvboot: include/version.h init/main.o init/version.o linuxsubdirs $(LD) -v $(LINKFLAGS) \ $(HEAD) \ $(CORE_FILES) \ $(DRIVERS) \ $(LIBS) \ -o vboot.elf $(CLIBS) $(NM) -v -l vboot.elf > vboot.map $(OBJCOPY) -O binary -S vboot.elf vboot.bin $(OBJCOPYFLAGS)linuxsubdirs: $(patsubst %, _dir_%, $(SUBDIRS))$(patsubst %, _dir_%, $(SUBDIRS)) : include/version.h $(MAKE) CFLAGS="$(CFLAGS) $(CFLAGS_KERNEL)" -C $(patsubst _dir_%, %, $@).PHONY: dummyinclude/version.h: dummyinit/version.o: init/version.c $(CC) $(CFLAGS) -DUTS_MACHINE='"$(ARCH)"' -c -o init/version.o init/version.cinit/main.o: init/main.c $(CC) $(CFLAGS) $(CFLAGS_KERNEL) $(PROFILING) -c -o $*.o $<clean: find . \( -name '*.o' -o -name core -o -name ".*.flags" \) -type f -print \ | xargs rm -f rm -f $(CLEAN_FILES) include Rules.make
======================================================================
同时在使用ViVi时,注意几个问题:
ViVi命令:
Flash erase 0x00000000(ADDR) 0x4000(LENGTH) ;
地址必须是Nor Flash的边界值,开发板上是amd160DB的Nor Flash, block信息是:
1 x 8k, 2 x 4k, 1 x 16k, 32 x 64k,(总线是8-bit或者16-bit会有些变化),不过这里的的ADDR和LENGTH都是以8-bit总线算的,可以查datasheet来获得地址信息。
Load flash 0x00000000(ADDR) 0x4000(LENGTH) x;
这里跟上面一样,因为这命令先把文件通过x-modem协议下载到地址RAM空间的基本地址,然后再把RAM的数据拷贝到Nor Flash中,写Nor Flash必须先擦除整块,所以这里ADDR和LENGTH都必须块对齐,不过你可以使用分区表来定位信息,不过你的分区表必须都是块对齐,例如:Load flash vivi x
不爽一下自己:
1. 使用Nor Falsh为MTD时,就是因为不了解Nor Flash的使用,结果把head.S初始化看了好多遍,以为初始化时搞错了,然后把Nor Flash的datasheet看了一遍,最后发现原来是自己使用错误引起。。。
2. 把ViVi使用GNU410在Cygwin下编译时,竟然出现使用x-modem下载屡次失败,移过来可能就几个小时,结果找x-modem这个错误找了好久,结果是定义数据类型时出错,我把__u8和__s8类型搞反了,弄得我把x-modem协议和代码查了好多遍。
3. 编译器从arm-gcc 3.4.2换成GNU410时,被那个库依赖问题搞了半天,依赖的是c标准库和gcc库,不然报错,记得库依赖顺序不可以搞错。。。
======================================================================
(续) 今天也修改了Makefile,上面Makefile已经修正,支持VC6编辑器,不过还是使用make来处理,同时也改了编译出来的名字叫vboot,好听多了。。。
这里贴一下在调用上面Makefile的build.bat,其实跟cygwin差不多,主要是路径问题,cygwin的路径是/cygdriver/c改成C:/这样就可以啦,同时也把/cygwin/bin目录添加进来,因为要使用到mv, cp, rm等命令,而且值得注意的是,我把/cygwin/bin放到$PATH的最前,主要是我机器环境比较复杂,这样可以先调用/cygwin/bin里的工具,免得夜长梦多。。。。
FILE:build.bat
======================================================================
set PATH=D:\cygwin\bin;%PATH%;C:\Program Files\GNUARM.410\bin;C:\Program Files\GNUARM.410\arm-elf\bin;C:\Program Files\GNUARM.410\libexec\gcc\arm-elf\4.1.0;
make _VBOOT_VC6_=1 COMSPEC=1 -C .. -f Makefile
======================================================================