移植UBoot的2016版本/添加新的板级支持

        以前移植的UBoot都是2009年的版本,现在发现新版本的uboot代码

结构有了很大的变化,感觉组织的越来越像Linux内核了。

当前编译Uboot的Linux系统:

       Ubuntu 14.04 (32位)

交叉编译环境为:

       arm-linux-gnueabi-gcc (4.7.3版本)

在ubuntu下安装交叉编译环境的命令:

      sudo apt-get install gcc-arm-linux-gnueabi

下载新版Uboot并解压:

      推荐官方下载地址(ftp://ftp.denx.de/pub/u-boot/)

解压:~/ARM/uboot$ tar -vjxf u-boot-2016.05.tar.bz2


进入源码目录,

      先配置编译环境(修改根目录下的Makefile):

            找到下面的内容:

            VERSION = 2016

            PATCHLEVEL = 05

            SUBLEVEL =

            EXTRAVERSION =

            NAME =

            修改为:

           VERSION = 2016

           PATCHLEVEL = 05

           SUBLEVEL =

           EXTRAVERSION =

           NAME =

           ARCH = arm

           CROSS_COMPILE = arm-linux-gnueabi-

 

      接着找到和自己板子体系结构相近的配置,我现在用S3C2440

的板子,所以在2410的基础上修改.

      如果现在有一个新加工好的板子,而不是买的板子(TQ2440,

mini2440等等),那么现在假如给新的板子命名为MY2440

      先从板级配置文件开始:

cp u-boot-2016.05/configs/smdk2410_defconfig

u-boot-2016.05/configs/my2440_defconfig

      现在就创建了新的板级配置文件,但是里面的配置还都是smdk2410

板子的配置,现在改为自己想要的配置。

      gedit u-boot-2016.05/configs/my2440_defconfig

      改动前的内容如下:

        CONFIG_ARM=y

        CONFIG_TARGET_SMDK2410=y

       CONFIG_HUSH_PARSER=y

       CONFIG_SYS_PROMPT="SMDK2410 # "

       CONFIG_CMD_USB=y

       # CONFIG_CMD_SETEXPR is not set

       CONFIG_CMD_DHCP=y

       CONFIG_CMD_PING=y

       CONFIG_CMD_CACHE=y

       CONFIG_CMD_EXT2=y

       CONFIG_CMD_FAT=y

 

       现在改为:

       CONFIG_ARM=y

       CONFIG_TARGET_MY2440=y

       CONFIG_HUSH_PARSER=y

       CONFIG_SYS_PROMPT="MY2440 # "

       CONFIG_CMD_USB=y

       # CONFIG_CMD_SETEXPR is not set

       CONFIG_CMD_DHCP=y

       CONFIG_CMD_PING=y

       CONFIG_CMD_CACHE=y

       CONFIG_CMD_EXT2=y

       CONFIG_CMD_FAT=y

 

       现在添加MY2440板子的底层实现,还是在SMDK2410代码

基础上修改,UBoot源码中大部分和板子相关的代码在board目录下。

       现在先不考虑具体板子的细节,先能让其编译通过,再一步

一步修改。现在干脆就把.../board/samsung/smdk2410/复制一份,

直接把目录的名字改为自己板子的名字。

       cp -rf u-boot-2016.05/board/samsung/smdk2410/

u-boot-2016.05/board/samsung/my2440/

到这一步板子底层代码也添加了,但是这些代码还没有和刚才

创建的配置关联起来,所以现在需要修改配置将其对应起来。

打开对应体系结构的目录,并修改里面的配置:

       gedit u-boot-2016.05/arch/arm/Kconfig

在打开的文件中查找TARGET_SMDK2410部分,现在要添加自己板子

对应的体系结构,由于2440和smdk2410体系结构相似,所以直接

       复制smdk2410的配置,添加为现在my2440的配置。

       config TARGET_SMDK2410

       bool "Support smdk2410"

       select CPU_ARM920T

       现在在其下面添加自己板子的体系结构:

       config TARGET_MY2440

       bool "Support my2440"

       select CPU_ARM920T

 

       上面这一步的TARGET_MY2440其实是为了和my2440_defconfig

配置文件中修改的配置对应起来(TARGET_MY2440)。

然后添加完体系结构的配置后,还需要指定板级代码的目录,就是

刚才复制的.../board/samsung/my2440/的路径:

在u-boot-2016.05/arch/arm/Kconfig中,查找smdk2410的板子

源码目录: source "board/samsung/smdk2410 ......。

       找到后添加自己板子的源码目录:

       ......

       source "board/ppcag/bg0900/Kconfig"

       source "board/samsung/smdk2410/Kconfig"

       source "board/sandisk/sansa_fuze_plus/Kconfig"

       ......

       现在改为:

       ......

       source "board/ppcag/bg0900/Kconfig"

       source "board/samsung/smdk2410/Kconfig"

       source "board/samsung/my2440/Kconfig"

       source "board/sandisk/sansa_fuze_plus/Kconfig"

       ......

       刚才通过复制添加的板级源码,只是复制的smdk2410的,

但是里面的实现还得改为现在板子(MY2440).

       先从配置文件改起:

       gedit u-boot-2016.05/board/samsung/my2440/Kconfig

       配置文件打开后,可以看到很多配置还都是smdk2410的配置:

       if TARGET_SMDK2410

 

       config SYS_BOARD

       default "smdk2410"

 

       config SYS_VENDOR

       default "samsung"

 

       config SYS_SOC

       default "s3c24x0"

 

       config SYS_CONFIG_NAME

       default "smdk2410"

 

       endif

       现在把里面的内容改为当前板子(MY2440)的配置:

       if TARGET_MY2440

 

       config SYS_BOARD

       default "my2440"

 

       config SYS_VENDOR

       default "samsung"

 

       config SYS_SOC

       default "s3c24x0"

 

       config SYS_CONFIG_NAME

       default "my2440"

 

       endif

 

       上面的default "my2440"不能写错,这里是为了在执行

make my2440_config命令时,将里面的值生成到根目录.config配置

文件里面的。

       还要修改底层源码的实现文件,在这儿先把文件名改了,

改成自己板子的名字:

       mv u-boot-2016.05/board/samsung/my2440/smdk2410.c

       u-boot-2016.05/board/samsung/my2440/my2440.c

虽然该代码中,大多数代码是S3C24x0系列通用的,但是这里还是

有一个地方要改:

       gedit u-boot-2016.05/board/samsung/my2440/my2440.c

打开后搜索: SMDK2410,

       int board_init(void)

       {

              /* arch number of SMDK2410-Board */

              gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;

 

              /* adress of boot parameters */

              gd->bd->bi_boot_params = 0x30000100;

 

              icache_enable();

              dcache_enable();

 

              return 0;

       }

       将其改为:

       int board_init(void)

       {

              /* arch number of MY2440-Board */

              gd->bd->bi_arch_number = MACH_TYPE_MINI2440;

 

              /* adress of boot parameters */

              gd->bd->bi_boot_params = 0x30000100;

 

              icache_enable();

              dcache_enable();

 

              return 0;

       }

       这里板子底层初始化部分先暂时使用MINI2440板子的参数配置,

目的先是为了编译能通过。

       另外还需要修改Makefile,否则在编译时会抱错:

        gedit u-boot-2016.05/board/samsung/my2440/Makefile

       修改前:

       obj-y := smdk2410.o

       obj-y += lowlevel_init.o

       修改后:

       obj-y:= my2440.o

       obj-y += lowlevel_init.o

 

       现在接着修改板子底层的代码引用的头文件smdk2410.h,

而现在板子用的s3c2440,所以现在创建自己板子的定义,

还是直接复制并更改:

       cp u-boot-2016.05/include/configs/smdk2410.h

       u-boot-2016.05/include/configs/my2440.h

       主要将头文件里面的smdk2410相关的地方改为目标板的具体参数。如:

       #define CONFIG_S3C24X0 /* This is a SAMSUNG S3C24x0-type SoC */

       #define CONFIG_S3C2410 /* specifically a SAMSUNG S3C2410 SoC */

       #define CONFIG_SMDK2410 /* on a SAMSUNG SMDK2410 Board */

       修改成下面这样

       #define CONFIG_S3C24X0 /* This is a SAMSUNG S3C24x0-type SoC */

       #define CONFIG_S3C2440/* specifically a SAMSUNG S3C2440 SoC */

       #define CONFIG_MY2440/* on custom my2440 Board */

 

       现在开始重新编译UBoot:

       进入源码目录,cd u-boot-2016.05

       在编译前先清空一次目录,sudo make distclean

       修改编译配置,make my2440_config

       修改完编译项后,最好先检查下根目录下生成的配置.config(该文件为隐藏文件),

              gedit .config

       主要检查如下几项配置是否正确:

       ......

       CONFIG_SYS_ARCH="arm"

       CONFIG_SYS_CPU="arm920t"

       CONFIG_SYS_SOC="s3c24x0"

       CONFIG_SYS_VENDOR="samsung"

       CONFIG_SYS_BOARD="my2440"

       CONFIG_SYS_CONFIG_NAME="my2440"

       ......

       这样就可以正式开始编译了:

       sudo make

 

       ......

       ......

  LD      net/built-in.o

  LD      test/built-in.o

  LD      test/dm/built-in.o

  CC      examples/standalone/stubs.o

  LD      examples/standalone/libstubs.o

  CC      examples/standalone/hello_world.o

  LD      examples/standalone/hello_world

  OBJCOPY examples/standalone/hello_world.srec

  OBJCOPY examples/standalone/hello_world.bin

  LDS     u-boot.lds

  LD      u-boot

  OBJCOPY u-boot.srec

  OBJCOPY u-boot-nodtb.bin

  COPY    u-boot.bin

  SYM     u-boot.sym

  CFG     u-boot.cfg

 

       直到出现上面几行内容,就可以肯定UBoot已经编译通过了,

到现在为止,紧紧是编译通过了,但是其中的很多地方还都是smdk2410

板子的实现,接下来的几篇博客再记录这些地方的修改方法。





你可能感兴趣的:(嵌入式/单片机,嵌入式/ARM)