深入剖析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至此启动完成。
根据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(工程目录名)
电路板的相关配置
make ARCH=arm CROSS_COMPILE=arm-v5te-linux-gnueabi- menuconfig
在这里可以选择你自己的电路板类型nidetech-i.MX27
如果需要支持从NAND FLASH中启动bootloader的话,必须选择support starting barebox from nand
如果你想支持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文件。
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
文章评论(0条评论)
登录后参与讨论