原创 续:深入剖析barebox(U-BOOT-II)在i.MX27上的移植

2011-10-31 11:37 2366 13 13 分类: 消费电子

深入剖析barebox(U-BOOT-II)在i.MX27上的移植

#define INITCALLS                   \

KEEP(*(.initcall.0))                    \

KEEP(*(.initcall.1))                    \

KEEP(*(.initcall.2))                    \

KEEP(*(.initcall.3))                    \

KEEP(*(.initcall.4))                    \

KEEP(*(.initcall.5))                    \

KEEP(*(.initcall.6))                    \

KEEP(*(.initcall.7))                    \

KEEP(*(.initcall.8))                    \

KEEP(*(.initcall.9))                    \

KEEP(*(.initcall.10))                  \

KEEP(*(.initcall.11))

 

#define pure_initcall(fn)             __define_initcall("0",fn,0)

 

#define core_initcall(fn)             __define_initcall("1",fn,1)

#define postcore_initcall(fn)             __define_initcall("2",fn,2)

#define console_initcall(fn)        __define_initcall("3",fn,3)

#define postconsole_initcall(fn) __define_initcall("4",fn,4)

#define mem_initcall(fn)            __define_initcall("5",fn,5)

#define mmu_initcall(fn)            __define_initcall("6",fn,6)

#define postmmu_initcall(fn)             __define_initcall("7",fn,7)

#define coredevice_initcall(fn)          __define_initcall("8",fn,8)

#define fs_initcall(fn)                 __define_initcall("9",fn,9)

#define device_initcall(fn)          __define_initcall("10",fn,10)

#define late_initcall(fn)              __define_initcall("11",fn,11)

 

和linux驱动一样的处理方式。所以我们只要熟知linux内核,理解起barebox就很容易了,他里面很多东西都是借鉴的linux内核。

从上面可以看出core_initcall所定义的函数调用的优先级别最高,比如

core_initcall(clocksource_init); clocksource_init函数是delay系列函数实现的基础,而该函数是非常基础的函数,所以我们要将clocksource_init定义为高优先级函数。至于我们的设备驱动则是device_initcall(fn),可以看出他的优先级是比较低的了,可以看出设备驱动的加载必须是再barebox的核心组件都初始化完毕后再加载的。

core_initcall(arm_mem_malloc_init);负责malloc、free函数的实现

postcore_initcall(getc_buffer_flush);

postcore_initcall(env_push_context);

postcore_initcall(init_cwd);

postcore_initcall(net_init);

postcore_initcall(hist_init);

在完成init系列函数的初始化后,barebox开始从flash中加载环境变量,并且将环境变量挂载到/env目录下,包括

Env/config 配置文件

Env/bin/init 根据配置文件中的内容执行一些初始化

Env/bin/boot  加载内核的一些列脚本

最后进入shell死循环,等待用户的输入。如果用户不输入,超时时间到达后,自动执行env/bin/boot脚本,完成内核的加载。Barebox至此启动完成。

4、移植步骤

  • 从官网下载并且解压barebox
    1. cd ~
  • git clone git://git.pengutronix.de/git/barebox.git barebox
  • cd barebox
  • 在arch/arm/boards下建立硬件电路板对应的工程文件夹,比如我们的电路板叫nidetech-mx27
    1. mkdir –p arch/arm/boards/nidetech-mx27
  • 复制和你开发板最相近的板级支持工程文件到你的工程目录,我们的开发板跟pca100比较相近,所以我选择这个工程作为模板
    1. cd arch/arm/boards/nidetech-mx27
    2. cp arch/arm/boards/phycard-i.MX27/*  ./  -a
    3. 复制默认的环境变量文件夹到工程目录
    4. cp defaultenv/config arch/arm/boards/nidetech-mx27/env
  • 修改Kconfig和Makefile以支持新的电路板nidetech-mx27

根据cpu的平台选择相应的Kconfig来修改,例如nidetech-mx27是采用的是freescale的imx系列cpu,那么我们就要修改如下文件

Arch/arm/mach-imx/Kconfig

在其中为自己的电路板添加一项

因为我们的cpu是imx27,所以找到红色处,再其后面再添加一项基于mx27的电路板

if ARCH_IMX27

choice

prompt "i.MX27 Board Type"

config MACH_NIDETECH_MX27

     bool "nidetech-i.MX27"

     select MACH_HAS_LOWLEVEL_INIT

     help

       Say Y here if you are using Phytec's nidetech-i.MX27 equipped

       with a Freescale i.MX27 Processor

 

a.定义boardinfo,boardinfo就是barebox启动后打印出来的板子的名称信息

config BOARDINFO

     default "Nidetech i.MX27" if MACH_NIDETECH_MX27

b. 定义默认的代码段基地址 TEXT_BASE

config ARCH_TEXT_BASE

     default 0xa7f00000 if MACH_PCA100

c.定义自己的mach-type

在 arch/arm/tools/mach-types文件中添加自己的mach-type

d.修改makefile文件,支持新工程的编译

在arch/arm/Makefile中添加

Board-$(CONFIG_MACH_NIDETECH_MX27) := nidetech-mx27(工程目录名)

  • 配置并编译,barebox支持menuconfig,通过可视化菜单来选择

电路板的相关配置

make ARCH=arm CROSS_COMPILE=arm-v5te-linux-gnueabi- menuconfig

  • 设置System Type

 在这里可以选择你自己的电路板类型nidetech-i.MX27

  如果需要支持从NAND FLASH中启动bootloader的话,必须选择support starting barebox from nand

  • General Setting

 

如果你想支持tab键自动补齐命令和文件名的话,必须选择Enable command line editing 和 enable auto completion

选择activate first console on startup

如果想使用单独的默认的环境变量的话,选择compile in default environment,并且制定默认环境的路径在你新建板子的工程目录下。

make ARCH=arm CROSS_COMPILE=arm-v5te-linux-gnueabi- 来编译。编译成功的话,可以在根目录下发现barebox.bin文件。

5、运行

  1. 用atktool工具将barebox.bin烧入到nandflash的地址0x0
    1. barebox的环境变量介绍

    barebox的环境变量保持在/env/config文件中。我们可以用edit命令来编辑该文件

    edit env/config

    用ctrl+d保存修改并退出,ctrl+c取消修改并退出

    eth0.ipaddr=192.168.50.127  :设备ip地址

    eth0.netmask=255.255.255.0  :设备的子网掩码

    eth0.gateway=192.168.50.1   :设备的网关

    eth0.serverip=192.168.50.87    : 服务器ip,通常是内核或者nfs服务器的地址

    eth0.ethaddr=00:11:22:33:44:aa  :设备的mac地址

    ip = none :不在内核中设置ip地址  dhcp通过dhcp来获取设备ip

     

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
13
关闭 站长推荐上一条 /3 下一条