u-boot移植问题

时间:2022-08-03 04:27:16
    大家好,小弟新接触嵌入式开发,目前正在学习u-boot的移植。我的开发板是ok6410板子,但是最新的u-boot2012.10上面没有针对该核心的CPU,有smdk6400的,于是我从网上搜索了一下一致的步骤,做了以下修改:

#############################################################################
    1)Borads.cfg 中第56行 加入“zcg6410  arm   arm1176  ok6410   samsung   s3c6410”;

    #cd u-boot-2011.06/board/samsung/    //进入目录
    #mkdir zcg6410                        //创建zcg6410文件夹

    2) 因6410和6400的资源差不多,所以就以6400项目的代码作为模板,以后再修改

    #cp -ar smdk6400/* zcg6410/   //将6400下所有的代码复制到6410下
    #cd zcg6410                   //进入zcg6410目录
    #mv smdk6400.c zcg6410.c      //将zcg6410下的smdk6400.c改名为zcg6410.c
    #cd ../../../                //回到u-boot根目录
    #cp include/configs/smdk6400.h include/configs/zcg6410.h //建立6410配置头文件
 
    注:把新建zcg6410下smdk6400_nand_spl.c更名位zcg6410_nand_spl.c,并且把zcg6410_nand_spl.c和makefile文件中的6400改为6410。其他文件不需要改动。

    3)修改u-boot跟目录下的Makefile文件。查找到smdk6400_config的地方,在他下面按照smdk6400_config的格式建立zcg6410_config的编译选项,另外还要指定交叉编译器 

    #vim Makefile
    CROSS_COMPILE ?= arm-linux-        //指定交叉编译器为arm-linux-gcc
    zcg6410_noUSB_config \
    zcg6410_config      :      unconfig
      @mkdir -p $(obj)include $(obj)board/samsung/zcg6410       // 注意@前不是空格,是Tab键
      @mkdir -p $(obj)nand_spl/board/samsung/zcg6410
      @echo "#define CONFIG_NAND_U_BOOT" > $(obj)include/config.h
      @if [ -z "$(findstring zcg6410_noUSB_config,$@)" ]; then                   \
             echo "RAM_TEXT = 0x57e00000" >> $(obj)board/samsung/zcg6410/config.tmp;\           //前面两个Tab键
             $(MKCONFIG) $(@:_config=) arm arm1176 zcg6410 samsung s3c6410;            \
      else                                                                \
             echo "RAM_TEXT = 0xc7e00000" >> $(obj)board/samsung/zcg6410/config.tmp;\
             $(MKCONFIG) $(@:_noUSB_config=) arm arm1176 zcg6410 samsung s3c6410;       \
      fi
      @echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk

*说明:arm    :CPU的架构(ARCH)
       arm1176:CPU的类型
       zcg6410 :对应在board目录下建立新的开发板项目的目录
       samsung:新开发板项目目录的上级目录,如直接在board下建立新的开发板项目的目录,则这里就为NULL
       s3c64xx:CPU型号
*注意:编译选项格式的第二行要用Tab键开始,否则编译会出错

    4)进入顶层目录nand_spl/board/samsung目录新建目录zcg6410,并将smdk6400下的文件复制到刚刚新建的zcg6410下 

    #cd nand_spl/board/samsung //
    #cp –ar smdk6400/* zcg6410/

    注:修改目此6410目录下的makefile文件,把里面的6400改为6410

    5)测试编译新建的zcg6410开发板项目 

    #make zcg6410_config //如果出现Configuring for zcg6410 board...则表示设置正确
    #make //编译后在根目录下会出现u-boot.bin和u-boot-nand.bin文件,则u-boot移植的第一步就算完成了

##################################################################################

    上面的步骤1-4都完成了之后,make的时候出错了。。。。。。错误如下:
u-boot移植问题
    这个原因,好像是“‘>=’缺少了左操作符”,因此我又看了一下zcg6410.h的文档的第57行,如下图:
u-boot移植问题
    ‘>=’的左操作符是“CONFIG_SYS_TEXT_BASE”。于是我认为是可能没有定义这个宏,但是我根据原来的u-boot make了一下smdk6400,完全可以。证明“CONFIG_SYS_TEXT_BASE”是定义过的。

     我的问题是:
     1.“CONFIG_SYS_TEXT_BASE”定义的位置在哪里?
     2.如果确实定义了,那么为什么我会make失败呢?

19 个解决方案

#1


start.S中初始化部分

#2


.globl _TEXT_BASE
_TEXT_BASE:
.word CONFIG_SYS_TEXT_BASE


你指的是这一部分吗?那既然定义了的话,为什么make会出现上述错误呢?我该怎么修改一下?请指教!谢谢!

#3


引用 1 楼 XXOO0396 的回复:
start.S中初始化部分


.globl _TEXT_BASE
_TEXT_BASE:
.word CONFIG_SYS_TEXT_BASE


你指的是这一部分吗?那既然定义了的话,为什么make会出现上述错误呢?我该怎么修改一下?请指教!谢谢!

#4


或许你的基地址等参数值不正确,还有#define CONFIG_MACH_后面的值,看芯片手册分析一下对不对

#5


呵呵,我跟你说哈,我用的是u-boot-2012.10版本的u-boot,
请打开根目录下的makefile,找到smdk6400_config目标:
看看echo "RAM_TEXT = 0x57e00000" >> $(obj)board/samsung/smdk6400/config.tmp;\这一句,明确的告诉你这里的RAM_TEXT将会用于生成宏CONFIG_SYS_TEXT_BASE
而这个信息是在执行make smdk6400_config 的时候写入到config.tm这个临时文件的。

再看board\samsung\smdk6410\config.mk这个文件,里面有如下行:
ifndef CONFIG_NAND_SPL
CONFIG_SYS_TEXT_BASE = $(RAM_TEXT)
else
CONFIG_SYS_TEXT_BASE = 0
endif

好我们再看根目录下的config.mk,搜索CONFIG_SYS_TEXT_BASE,会发现如下行:
ifneq ($(CONFIG_SYS_TEXT_BASE),)
CPPFLAGS += -DCONFIG_SYS_TEXT_BASE=$(CONFIG_SYS_TEXT_BASE)
endif
这个还只是一个环境变量而已。

这次是真的好了,CPPFLAGS最后会作为gcc,as这些编译器的控制标志,而
-DCONFIG_SYS_TEXT_BASE=$(CONFIG_SYS_TEXT_BASE) 就等价于#define CONFIG_SYS_TEXT_BASE X 
其中X 是$(CONFIG_SYS_TEXT_BASE)的值,这次是真的宏常量了。

好了,到此,CONFIG_SYS_TEXT_BASE的成生旅程就走完了……您还有疑问么??



#6


细看了一下,建议你配置完后打开include/config.mk(如果你make 的时候指定了BUILD_DIR=或-O=)那就是你指定的那个目录下的include/config.mk,详细检查一下以下这几个变量是否正确:
                                          你的应该是
ARCH   = arm                              arm
CPU    = arm1176                          arm1176
BOARD  = smdk6410                         zcg6410
VENDOR = samsung                          samsung
SOC    = s3c64xx                          s3c6410
CONFIG_NAND_U_BOOT = y                    y
还有就是如果配置的时候指定了BUILD_DIR=或-O=,那么make 的时候也要带上!

/board/samsung/zcg6410/config.mk中
sinclude $(OBJTREE)/board/$(BOARDDIR)/config.tmp
/config.mk中
ifdef BOARD
sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk # include board specific rules
endif

有关CONFIG_SYS_TEXT_BASE宏的变量就VENDOR和BOARD。


呵呵,我也在学习,可以一起啊……

#7


u-boot官方的没有6410就换一个,改來改去的天知道要改多久,如果真心要改注意 写法为__的玩意儿,那个和芯片息息相关,多半都是改这些

#8


哈哈 学习了,谢谢大神!

#9


该回复于2012-11-15 22:29:19被管理员删除

#10


我越来越发对楼上的楼上那只小猫感兴趣了。。。。。如果小猫在 也请解决下我的疑问,我用的交叉编译链是4.3.3的 编译我买的TQ2440的板子时提示版本出错,上网查了下 说是我用的版本太新了,开发板光盘里自带的是3.4.5的  我可以在虚拟机里装两个交叉工具链么?

#11


变量前面_平台相关 __和芯片相关,就像7楼说的,u-boot官方版不可能没s3c6410的,没得就去三星官网找找.

#12


引用 10 楼 cumtgao 的回复:
我越来越发对楼上的楼上那只小猫感兴趣了。。。。。如果小猫在 也请解决下我的疑问,我用的交叉编译链是4.3.3的 编译我买的TQ2440的板子时提示版本出错,上网查了下 说是我用的版本太新了,开发板光盘里自带的是3.4.5的  我可以在虚拟机里装两个交叉工具链么?

 

工具链可以有多个的,但要注意,如果你的交叉编译器名字相同,又都在PATH环境变量的情况下,通常是使用PATH值里面靠前的那个,所以,有多个的话使用的时候最好改下PATH

#13


引用 11 楼 nadleeh123 的回复:
变量前面_平台相关 __和芯片相关,就像7楼说的,u-boot官方版不可能没s3c6410的,没得就去三星官网找找.


uboot里的确是木有6410的,不过通过6400的移植还是很轻松的……,三星官网更难找……连DATASHEET都木有下载的链了&……

#14


还真是高人多啊!新手,学习了!谢谢!

#15


呵呵!说的有道理

#16


JQGuardian  他已经分析很清楚了。

你用我的这个配置吧

kb6410_noUSB_config     \
kb6410_config   :       unconfig
        @mkdir -p $(obj)include $(obj)board/samsung/kb6410
        @mkdir -p $(obj)nand_spl/board/samsung/kb6410
        @echo "#define CONFIG_NAND_U_BOOT" > $(obj)include/config.h
        @echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
        @if [ -z "$(findstring kb6410_noUSB_config,$@)" ]; then                 \
                echo "RAM_TEXT = 0x57e00000" >> $(obj)board/samsung/kb6410/config.tmp;\
        else                                                                            \
                echo "RAM_TEXT = 0xc7e00000" >> $(obj)board/samsung/kb6410/config.tmp;\
        fi
        @$(MKCONFIG) kb6410 arm arm1176 kb6410 samsung s3c6410
####    #@$(MKCONFIG) kb6410 arm arm1176 kb6410 samsung s3c64xx
        @echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk

[root@zhaoji kb-uboot-2011.12]# make kb6410_config

warning: Please migrate to boards.cfg.  Failure to do so will
         mean removal of your board in the next release.

Configuring for kb6410 board... 

#17


这个问题我见过,,,
   #cd u-boot-2011.06/board/samsung/    //进入目录
     不要#mkdir zcg6410                        //创建zcg6410文件夹

    2) 因6410和6400的资源差不多,所以就以6400项目的代码作为模板,以后再修改

     不要#cp -ar smdk6400/* zcg6410/   //将6400下所有的代码复制到6410下
    要 #cp -rf smdk6410 zcg6410
    #cd zcg6410                   //进入zcg6410目录
    #mv smdk6400.c zcg6410.c      //将zcg6410下的smdk6400.c改名为zcg6410.c
    vi ./Makefile 中 smdk6400 -> zcg6410
    #cd ../../../                //回到u-boot根目录
    #cp include/configs/smdk6400.h include/configs/zcg6410.h //建立6410配置头文件
 
    注:把新建zcg6410下smdk6400_nand_spl.c更名位zcg6410_nand_spl.c,并且把zcg6410_nand_spl.c和makefile文件中的6400改为6410。其他文件不需要改动。

    3)修改u-boot跟目录下的Makefile文件。查找到smdk6400_config的地方,在他下面按照smdk6400_config的格式建立zcg6410_config的编译选项,另外还要指定交叉编译器 


另:我发生以上错误时,我没有改好文件名所导致

#18


u-boot移植未错误,来学习

#19


该回复于2013-03-21 13:56:50被管理员删除

#1


start.S中初始化部分

#2


.globl _TEXT_BASE
_TEXT_BASE:
.word CONFIG_SYS_TEXT_BASE


你指的是这一部分吗?那既然定义了的话,为什么make会出现上述错误呢?我该怎么修改一下?请指教!谢谢!

#3


引用 1 楼 XXOO0396 的回复:
start.S中初始化部分


.globl _TEXT_BASE
_TEXT_BASE:
.word CONFIG_SYS_TEXT_BASE


你指的是这一部分吗?那既然定义了的话,为什么make会出现上述错误呢?我该怎么修改一下?请指教!谢谢!

#4


或许你的基地址等参数值不正确,还有#define CONFIG_MACH_后面的值,看芯片手册分析一下对不对

#5


呵呵,我跟你说哈,我用的是u-boot-2012.10版本的u-boot,
请打开根目录下的makefile,找到smdk6400_config目标:
看看echo "RAM_TEXT = 0x57e00000" >> $(obj)board/samsung/smdk6400/config.tmp;\这一句,明确的告诉你这里的RAM_TEXT将会用于生成宏CONFIG_SYS_TEXT_BASE
而这个信息是在执行make smdk6400_config 的时候写入到config.tm这个临时文件的。

再看board\samsung\smdk6410\config.mk这个文件,里面有如下行:
ifndef CONFIG_NAND_SPL
CONFIG_SYS_TEXT_BASE = $(RAM_TEXT)
else
CONFIG_SYS_TEXT_BASE = 0
endif

好我们再看根目录下的config.mk,搜索CONFIG_SYS_TEXT_BASE,会发现如下行:
ifneq ($(CONFIG_SYS_TEXT_BASE),)
CPPFLAGS += -DCONFIG_SYS_TEXT_BASE=$(CONFIG_SYS_TEXT_BASE)
endif
这个还只是一个环境变量而已。

这次是真的好了,CPPFLAGS最后会作为gcc,as这些编译器的控制标志,而
-DCONFIG_SYS_TEXT_BASE=$(CONFIG_SYS_TEXT_BASE) 就等价于#define CONFIG_SYS_TEXT_BASE X 
其中X 是$(CONFIG_SYS_TEXT_BASE)的值,这次是真的宏常量了。

好了,到此,CONFIG_SYS_TEXT_BASE的成生旅程就走完了……您还有疑问么??



#6


细看了一下,建议你配置完后打开include/config.mk(如果你make 的时候指定了BUILD_DIR=或-O=)那就是你指定的那个目录下的include/config.mk,详细检查一下以下这几个变量是否正确:
                                          你的应该是
ARCH   = arm                              arm
CPU    = arm1176                          arm1176
BOARD  = smdk6410                         zcg6410
VENDOR = samsung                          samsung
SOC    = s3c64xx                          s3c6410
CONFIG_NAND_U_BOOT = y                    y
还有就是如果配置的时候指定了BUILD_DIR=或-O=,那么make 的时候也要带上!

/board/samsung/zcg6410/config.mk中
sinclude $(OBJTREE)/board/$(BOARDDIR)/config.tmp
/config.mk中
ifdef BOARD
sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk # include board specific rules
endif

有关CONFIG_SYS_TEXT_BASE宏的变量就VENDOR和BOARD。


呵呵,我也在学习,可以一起啊……

#7


u-boot官方的没有6410就换一个,改來改去的天知道要改多久,如果真心要改注意 写法为__的玩意儿,那个和芯片息息相关,多半都是改这些

#8


哈哈 学习了,谢谢大神!

#9


该回复于2012-11-15 22:29:19被管理员删除

#10


我越来越发对楼上的楼上那只小猫感兴趣了。。。。。如果小猫在 也请解决下我的疑问,我用的交叉编译链是4.3.3的 编译我买的TQ2440的板子时提示版本出错,上网查了下 说是我用的版本太新了,开发板光盘里自带的是3.4.5的  我可以在虚拟机里装两个交叉工具链么?

#11


变量前面_平台相关 __和芯片相关,就像7楼说的,u-boot官方版不可能没s3c6410的,没得就去三星官网找找.

#12


引用 10 楼 cumtgao 的回复:
我越来越发对楼上的楼上那只小猫感兴趣了。。。。。如果小猫在 也请解决下我的疑问,我用的交叉编译链是4.3.3的 编译我买的TQ2440的板子时提示版本出错,上网查了下 说是我用的版本太新了,开发板光盘里自带的是3.4.5的  我可以在虚拟机里装两个交叉工具链么?

 

工具链可以有多个的,但要注意,如果你的交叉编译器名字相同,又都在PATH环境变量的情况下,通常是使用PATH值里面靠前的那个,所以,有多个的话使用的时候最好改下PATH

#13


引用 11 楼 nadleeh123 的回复:
变量前面_平台相关 __和芯片相关,就像7楼说的,u-boot官方版不可能没s3c6410的,没得就去三星官网找找.


uboot里的确是木有6410的,不过通过6400的移植还是很轻松的……,三星官网更难找……连DATASHEET都木有下载的链了&……

#14


还真是高人多啊!新手,学习了!谢谢!

#15


呵呵!说的有道理

#16


JQGuardian  他已经分析很清楚了。

你用我的这个配置吧

kb6410_noUSB_config     \
kb6410_config   :       unconfig
        @mkdir -p $(obj)include $(obj)board/samsung/kb6410
        @mkdir -p $(obj)nand_spl/board/samsung/kb6410
        @echo "#define CONFIG_NAND_U_BOOT" > $(obj)include/config.h
        @echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
        @if [ -z "$(findstring kb6410_noUSB_config,$@)" ]; then                 \
                echo "RAM_TEXT = 0x57e00000" >> $(obj)board/samsung/kb6410/config.tmp;\
        else                                                                            \
                echo "RAM_TEXT = 0xc7e00000" >> $(obj)board/samsung/kb6410/config.tmp;\
        fi
        @$(MKCONFIG) kb6410 arm arm1176 kb6410 samsung s3c6410
####    #@$(MKCONFIG) kb6410 arm arm1176 kb6410 samsung s3c64xx
        @echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk

[root@zhaoji kb-uboot-2011.12]# make kb6410_config

warning: Please migrate to boards.cfg.  Failure to do so will
         mean removal of your board in the next release.

Configuring for kb6410 board... 

#17


这个问题我见过,,,
   #cd u-boot-2011.06/board/samsung/    //进入目录
     不要#mkdir zcg6410                        //创建zcg6410文件夹

    2) 因6410和6400的资源差不多,所以就以6400项目的代码作为模板,以后再修改

     不要#cp -ar smdk6400/* zcg6410/   //将6400下所有的代码复制到6410下
    要 #cp -rf smdk6410 zcg6410
    #cd zcg6410                   //进入zcg6410目录
    #mv smdk6400.c zcg6410.c      //将zcg6410下的smdk6400.c改名为zcg6410.c
    vi ./Makefile 中 smdk6400 -> zcg6410
    #cd ../../../                //回到u-boot根目录
    #cp include/configs/smdk6400.h include/configs/zcg6410.h //建立6410配置头文件
 
    注:把新建zcg6410下smdk6400_nand_spl.c更名位zcg6410_nand_spl.c,并且把zcg6410_nand_spl.c和makefile文件中的6400改为6410。其他文件不需要改动。

    3)修改u-boot跟目录下的Makefile文件。查找到smdk6400_config的地方,在他下面按照smdk6400_config的格式建立zcg6410_config的编译选项,另外还要指定交叉编译器 


另:我发生以上错误时,我没有改好文件名所导致

#18


u-boot移植未错误,来学习

#19


该回复于2013-03-21 13:56:50被管理员删除

#20