牢骚:
嵌入式行业当中,大都以做产品和解决方案居多。对于做产品的公司,BSP相关的工作相对少些甚至没有直接让方案公司来搞定。其实底层工作是还可以细分的,比如BSP和内核驱动。过来的人都清楚,底层工作有模式,但是不像应用开发有太多的套路,没有一个明确的梯形上升空间,总之下面出了问题,都是你的事。由于基于产品为目的开发比比皆是,使得大家忽略的uboot的功效。其实uboot也是一个博大精深的领地。最近要开发一个项目,从硬件一点一点开始,其中涉及大量BSP内容,正好再从头整理一遍,回顾一下当年的初心从走路开始,废话不多说,下面go:
一、版本的选择:
下载地址:ftp://ftp.denx.de/pub/u-boot/
并不是越新的越好,新版本和老板可能对于你的cpu和board内容都是一样的,增加的仅仅是新的cpu和评估板。我个人认为还有一个 比较关键的就是“目录结构”的改变。不仅仅是把文件调换的位置,而是新生一些文件将共性的东西抽象再一起,这个我们稍后以及在今后的连载中(我会强迫自己连载)详细的说。如今的uboot虽然逻辑功能没变但已经不是韦老师的那个时代(韦东山老师,业界大牛人现在依然活跃,当年一边工作一边学习老师的视频,得到了鱼也学到了渔)。我选用的版本是u-boot-2013.10.tar.bz2 没有具体的原因,公司的服务器上出现概率最高的版本,想必很多同事都弄过,便于交流而已。硬件用ARM Cortex A8。
二、Makefile分析
目录展开入上图。
1、版本号
VERSION = 2013 //主版本号
PATCHLEVEL = 10 //补丁的等级
SUBLEVEL = //次版本号
EXTRAVERSION = //附加的信息,可以自己根据需要DIY
ifneq "$(SUBLEVEL)" "" //判断SUBLEVEL是否不为空
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
else
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL)$(EXTRAVERSION)
endif
其中要生成的版本号由U_BOOT_VERSION= 表示
TIMESTAMP_FILE = $(obj)include/generated/timestamp_autogenerated.h
VERSION_FILE = $(obj)include/generated/version_autogenerated.h
这两行是在编译的时候生成的现在去目录找是看不到的。
2、两个很重要的变量HOSTARCH HOSTOS
HOSTARCH := $(shell uname -m | \
sed -e s/i.86/x86/ \
-e s/sun4u/sparc64/ \
-e s/arm.*/arm/ \
-e s/sa110/arm/ \
-e s/ppc64/powerpc/ \
-e s/ppc/powerpc/ \
-e s/macppc/powerpc/\
-e s/sh.*/sh/)
HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \
sed -e 's/\(cygwin\).*/cygwin/')
export HOSTARCH HOSTOS
HOSTARCH 的获得看起来貌似有些复杂静下心仔细看:
首先启用了一个shell命令 uname -m 获得本地计算机的体系结构,后面还有两个关键点 一个 “|” 管道,还有一个sed字符串替换命令。
实现了用后面的字符串替换前面的字符串实现体系结构命名统一。例:-e s/arm.*/arm/ \ -e s/sa110/arm/ \ 都是替换成“arm”
HOSTOS 得到主机的操作系统 uname -s 得到的是 Linux,自己可以尝试一下。
这两个环境变量主要是得到本地环境的操作系统和cpu的信息。