uboot-1.1.6移植心得

来源:互联网 发布:mysql数据导出 编辑:程序博客网 时间:2024/04/29 03:15
硬件平台与源码包:mini2440,u-boot-1.1.6
1.将u-boot烧写到nandflash中
(1)用jlink加载init.bin到0地址,并运行,然后停止。
(2)用jlink加载u-boot.bin_openjtag到0x33f80000地址,并运行,然后停止。
(3)用jlink加载u-boot.bin到0x30000000地址,并运行。
(4)在crt中打开串口,执行nand erase 0 40000,然后执行nand write.jffs2 30000000 0 40000
具体烧写u-boot实验流程:
(1)    使用jink链接jtag接口,并打开j-link Commander
(2)    输入r
(3)    Speed 1200
(4)    Loadbin e:\main.bin 0
(5)    Setpc 0
(6)    g
(7)    h
(8)    loadbin e:\u-boot.bin_opnjtag0x33f80000
(9)    setpc 0x33f80000                                 //保存串口调试终端打开并连接
(10) g
(11) loadbin e:\u-boot.bin 0x30000000
(12) 串口调试终端输入 nanderase 0 0x3000
(13) 串口调试终端输入 nandwrite 0x30000000 0 0x30000
(14) 拔掉jtag,重启。




2.编译uboot
make smdk2410_config
make


过程分析:
(1)make smdk2410_config
执行如下命令:
smdk2410_config :unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
由于MKCONFIG := $(SRCTREE)/mkconfig
所以命令等价于 mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0,即执行mkconfig命令


mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0的分析:
//以运行make smdk2410_config为例进行说明
//可以知道Target=smdk2410($1) Architecture=arm($2) CPU=arm920t($3) Board=smdk2410($4) VENDOR=NULL($5) SOC=s3c24x0($6)


APPEND=no # Default: Create new config file
BOARD_NAME="" # Name to print in make output


//参数个数大于0的话执行,这里$1为smdk2410进入*)分支,不进行任何操作退出。
while [ $# -gt 0 ] ; do
case "$1" in
--) shift ; break ;;
-a) shift ; APPEND=yes ;;
-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
*)  break ;;
esac
done


//加入不存在BOARD_NAME,则设置BOARD_NAME为$1。在这里BOARD_NAME之前为"",所以该命令设置BOARD_NAME=smdk2410
[ "${BOARD_NAME}" ] || BOARD_NAME="$1"


//加入参数总数小于4或大于6就退出。这里不退出。
[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1


echo "Configuring for ${BOARD_NAME} board..."




//SRCTREE与OBJTREE一致,执行else分支。
//进入include目录。删除include/asm目录(实际没有该目录)。链接include/arm目录到include/asm-arm目录。
#
# Create link to architecture specific headers
#
if [ "$SRCTREE" != "$OBJTREE" ] ; then
mkdir -p ${OBJTREE}/include
mkdir -p ${OBJTREE}/include2
cd ${OBJTREE}/include2
rm -f asm
ln -s ${SRCTREE}/include/asm-$2 asm
LNPREFIX="../../include2/asm/"
cd ../include
rm -rf asm-$2
rm -f asm
mkdir asm-$2
ln -s asm-$2 asm
else
cd ./include
rm -f asm
ln -s asm-$2 asm
fi


//删除include/asm-arm/arch目录(实际上没有该目录)
rm -f asm-$2/arch


//判断是$6是否为空或NULL。这里执行else分支,ln -s include/asm-arm/arch到inlcude/arch-s3c24x0
if [ -z "$6" -o "$6" = "NULL" ] ; then
ln -s ${LNPREFIX}arch-$3 asm-$2/arch
else
ln -s ${LNPREFIX}arch-$6 asm-$2/arch
fi


//执行if内部内容。删除include/asm-arm/proc,并链接include/asm-arm/proc到include/proc-armv
if [ "$2" = "arm" ] ; then
rm -f asm-$2/proc
ln -s ${LNPREFIX}proc-armv asm-$2/proc
fi


#
# Create include file for Make
#
echo "ARCH   = $2" >  config.mk
echo "CPU    = $3" >> config.mk
echo "BOARD  = $4" >> config.mk


//$5为NULL,则不执行下面内容
[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk


//$6存在并不为NULL。打印SOC=s3c24x0到config.mk中
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC    = $6" >> config.mk


#
# Create board specific header file
#
//APPEND为no,执行else,创建config.h
if [ "$APPEND" = "yes" ] # Append to existing config file
then
echo >> config.h
else
> config.h # Create new config file
fi
//打印/* Automatically generated - do not edit */到include/config.h中
//打印#include <configs/$1.h>到include/config.h中
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/$1.h>" >>config.h


exit 0




/*-------------以下是实际执行的命令--------------*/
BOARD_NAME=smdk2410
echo "Configuring for ${BOARD_NAME} board..."
cd ./include
rm -f asm
ln -s asm-arm asm
rm -f asm-arm/arch
ln -s arch-s3c24x0 asm-arm/arch //尽管include目录下没有直接的arch-s3c24x0,但是ln找到了asm-arm目录下的文件
rm -f asm-arm/proc
ln -s proc-armv asm-arm/proc //尽管include目录下没有直接的proc-armv,但是ln找到了asm-arm目录下的文件
echo "ARCH   = arm" >  config.mk
echo "CPU    = arm920t" >> config.mk
echo "BOARD  = smdk2410" >> config.mk
echo "SOC    = s3c24x0" >> config.mk
> config.h //创建一个空的config.h
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/smdk2410.h>" >>config.h




(2) make 分析见Makefile说明
这里仅仅贴出u-boot.bin编译的过程,另外调试的时候最后加行u-boot.dis的编译命令
/*--------------- u-boot.bin说明----------------------
u-boot.bin: u-boot
arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot



$(obj)u-boot: depend version $(tools examples post post/cpu) $(cpu/arm920t/start.o等) $(很多*.a) (board/smdk2410/u-boot.lds)
UNDEF_SYM=`arm-linux-objdump -x $(很多*.a) |sed  -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
--start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
-Map u-boot.map -o u-boot

arm-linux-ld  -Bstatic -T board/smdk2410/u-boot.lds -Ttext 0x33F80000  /*$$UNDEF_SYM $(__OBJS) 没看懂的部分*/
--start-group $(__LIBS) --end-group $(PLATFORM_LIBS)
-Map u-boot.map -o u-boot


TEXT_BASE = 0x33F80000在board/smdk2410/config.mk中获得

depend dep:
for dir in $(SUBDIRS) ; do $(MAKE) -C $$dir _depend ; done
version:
@echo -n "#define U_BOOT_VERSION \"U-Boot " > $(VERSION_FILE); \
echo -n "$(U_BOOT_VERSION)" >> $(VERSION_FILE); \
echo -n $(shell $(CONFIG_SHELL) $(TOPDIR)/tools/setlocalversion \
$(TOPDIR)) >> $(VERSION_FILE); \
echo "\"" >> $(VERSION_FILE)
------------------------------------------------------*/


3. 移植u-boot
移植u-boot-1.1.6过程比较乱,尚未做笔记,这里详细说明1.1.6的移植过程。
调试uboot的时候值得注意有两点:
(1)之前的init.bin配置的时钟可能不自己u-boot中配置的不一样。
所以如果直接将u-boot加载到0x30000000的内存就setpc 0x30000000运行调试,
此时的SDRAM仍然是init.bin中的参数设置,很可能导致u-boot出错。
解决方案,可以重现编辑init.bin与uboot的时钟参数设置和存储控制器参数设置移植。
或先下载uboot到nandflash中,然后在从继续连接jtag,setpc为0,运行。这样相当于从nandflash中运行的流程调试,可以正常拷贝nandflash数据。
(2)移植过程中大部分时间用在nandflash调试中,要擅于使用jlink查看SDRAM中的数据是否从nandflash中正常的拷贝出来,是否完全拷贝出来,可以对照u-boot.bin观察。

0 0
原创粉丝点击