将U-Boot-1.1.6移植到MINI2440开发板上,从NAND Flash启动(不使用NOR Flash)。
需要准备的:
Linux环境:Ubuntu 16.04
交叉编译工具链:arm-linux-gcc-3.4.5
U-Boot-1.1.6源码:u-boot-1.1.6.tar.bz2
S3C2440手册:S3C2440A 32-BIT CMOS MICROCONTROLLER USERS MANUAL
ARM920T技术手册:ARM920T Technical Reference Manual
其它相关datasheet
参考资料:《嵌入式Linux应用开发完全手册》以及网上博客(#^.^#)。
说明:下述涉及到Linux基本操作命令的不进行详细描述。
设置交叉编译环境:
推荐直接使用已经编译好的交叉编译工具链,这里使用的是arm-linux-gcc-3.4.5,在目录下新建文件夹:
tzw@tzw-pc:~$ mkdir arm
tzw@tzw-pc:~$ cd arm/
tzw@tzw-pc:~arm$ mkdir -p toolchains/arm-linux-gcc/3.4.5
将交叉编译工具链保存在文件夹中:
tzw@tzw-pc:~/arm$ ls toolchains/arm-linux-gcc/3.4.5/
arm-linux bin distributed include info lib libexec man tmp
其中/bin目录下的可执行文件即为编译时用到的文件。
然后将交叉编译工具链的路径添加到环境变量中,添加有很多方法,这里将其保存在bash.bashrc文件中,打开并编辑bash.bashrc:
tzw@tzw-pc:~$ sudo gedit /etc/bash.bashrc
在文件最后新起一行,添加如下语句,注意不要改动文件中其他内容:
------- bash.bashrc -------
export PATH=$PATH:/home/tzw/arm/toolchains/arm-linux-gcc/3.4.5/bin
保存并关闭文件。
在Ubuntu中,打开新的终端或者在终端上输入bash打开新的shell都会读取/etc/bash.bashrc和~/.bashrc,因此采用这种方法只需要重新打开一个终端就可以使环境变量生效。也可以在旧终端中输入如下命令使环境变量生效:
tzw@tzw-pc:~$ source /etc/bash.bashrc
重新打开一个终端(快捷键:Ctrl+Alt+t),输入命令:
tzw@tzw-pc:~$ arm-linux-gcc -v
回车可以看到输出信息:
Reading specs from /home/tzw/arm/toolchains/arm-linux-gcc/3.4.5/bin/../lib/gcc/arm-linux/3.4.5/specs
...
gcc version 3.4.5
则交叉编译工具链已经设置好了,最后一行为所使用的GCC的版本,如果出现如下信息:
arm-linux-gcc: command not found
说明没有正确设置,需要检查上述步骤是否完成。
获取U-Boot源码:
从官网下载u-boot-1.1.6源码压缩包,在arm目录下新建u-boot文件夹并将源码解压到u-boot文件夹:
tzw@tzw-pc:~/arm$ mkdir u-boot
tzw@tzw-pc:~/arm$ cd u-boot
tzw@tzw-pc:~/arm/u-boot$ tar -jxvf u-boot-1.1.6.tar.bz2
查看解压的结果:
tzw@tzw-pc:~/arm/u-boot$ ls u-boot-1.1.6
arm_config.mk fs MAKEALL
avr32_config.mk i386_config.mk Makefile
blackfin_config.mk include microblaze_config.mk
board lib_arm mips_config.mk
CHANGELOG lib_avr32 mkconfig
CHANGELOG-before-U-Boot-1.1.5 lib_blackfin nand_spl
common lib_generic net
config.mk lib_i386 nios2_config.mk
COPYING lib_m68k nios_config.mk
cpu lib_microblaze post
CREDITS lib_mips ppc_config.mk
disk lib_nios README
doc lib_nios2 rtc
drivers lib_ppc rules.mk
dtt m68k_config.mk tools
examples MAINTAINERS
可以看到/arm/u-boot/u-boot-1.1.6目录下的U-Boot源码。
初次编译U-Boot-1.1.6:
不直接在源码上修改,将源码复制一份进行修改:
tzw@tzw-pc:~/arm/u-boot$ mkdir u-boot-mini2440-1.1.6
tzw@tzw-pc:~/arm/u-boot$ cp -r u-boot-1.1.6/* u-boot-mini2440-1.1.6/
查看复制的结果:
tzw@tzw-pc:~/arm/u-boot$ cd u-boot-mini2440-1.1.6/
tzw@tzw-pc:~/arm/u-boot/u-boot-mini2440-1.1.6$ ls
arm_config.mk fs MAKEALL
avr32_config.mk i386_config.mk Makefile
blackfin_config.mk include microblaze_config.mk
board lib_arm mips_config.mk
CHANGELOG lib_avr32 mkconfig
CHANGELOG-before-U-Boot-1.1.5 lib_blackfin nand_spl
common lib_generic net
config.mk lib_i386 nios2_config.mk
COPYING lib_m68k nios_config.mk
cpu lib_microblaze post
CREDITS lib_mips ppc_config.mk
disk lib_nios README
doc lib_nios2 rtc
drivers lib_ppc rules.mk
dtt m68k_config.mk tools
examples MAINTAINERS
mini2440开发板使用Samsung的S3C2440芯片,与U-Boot-1.1.6中已有的smdk2410开发板(采用Samsung S3C2410芯片)相似,因此在smdk2410的基础上进行移植。
首先测试一下源码是否能正常编译:
tzw@tzw-pc:~/arm/u-boot/u-boot-mini2440-1.1.6$ make distclean
tzw@tzw-pc:~/arm/u-boot/u-boot-mini2440-1.1.6$ make smdk2410_config
tzw@tzw-pc:~/arm/u-boot/u-boot-mini2440-1.1.6$ make
make distclean:完全清除所有配置以及生成的文件。
make clean:清除所有生成的文件,会保留配置。
make smdk2410_config:进行smdk2410开发板的配置。
make:根据Makefile生成二进制文件u-boot.bin。
等待一段时间,可以在/u-boot-mini2440-1.1.6目录下看到生成的二进制文件:
tzw@tzw-pc:~/arm/u-boot/u-boot-mini2440-1.1.6$ ls u-boot.bin
u-boot.bin
如果开发板是smdk2410的话,那么将这个二进制文件烧写进开发板,就可以在串口上看到U-Boot的运行输出信息了。
如果make执行过程中出现错误的话,一般是一些依赖的库没有安装,根据报错信息依次安装所需要的库进行了,直到最后生成u-boot.bin这个二进制文件。
移植前的分析:
由上述可知,U-Boot的编译首先需要配置,然后才进行编译:
tzw@tzw-pc:~/arm/u-boot/u-boot-mini2440-1.1.6$ make smdk2410_config --just-print
make smdk2410_config --just-print:仅输出将要执行的语句,但并不执行。
输出信息:
tzw@tzw-pc:~/arm/u-boot/u-boot-mini2440-1.1.6$ make smdk2410_config --just-print
rm -f include/config.h include/config.mk
board/*/config.tmp board/*/*/config.tmp
/home/tzw/arm/u-boot/u-boot-mini2440-1.1.6/mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0
可知首先删除了原先的一些配置相关的文件:
include/config.h
include/config.mk
board/*/config.tmp
board/*/*/config.tmp
即/include目录下的config.h、config.mk,/board目录下所有与配置相关的config.tmp文件。
然后执行:
mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0
mkconfig是/u-boot-mini2440-1.1.6目录下的一个文件,后面是输入的6个参数:
mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0
$0 $1 $2 $3 $4 $5 $6
$0表示所执行的程序的名称;
$1~$6为所执行的程序的输入参数。
从Makefile中可知:
------- Makefile -------
92 MKCONFIG := $(SRCTREE)/mkconfig
93 export MKCONFIG
...
1879 smdk2410_config : unconfig
1880 @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
打开顶层mkconfig文件,进行分析:
默认创建新的配置文件,并将板子的名称置为"":
------- mkconfig -------
11 APPEND=no # Default: Create new config file
12 BOARD_NAME="" # Name to print in make output
判断传入的参数是否含有特殊项,并进行处理,这里并无特殊项:
------- mkconfig -------
14 while [ $# -gt 0 ] ; do
15 case "$1" in
16 --) shift ; break ;;
17 -a) shift ; APPEND=yes ;;
18 -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
19 *) break ;;
20 esac
21 done
$# 所执行的程序的参数的个数;
-gt 大于(greater than);
-eq 等于(equal);
-ne 不等于(not equal);
-ge 大于等于(greater and equal);
-lt 小于(less than);
-le小于等于(less and equal)。
第23行判断开发板名称是否存在,并将其赋值为第一个参数,即BOARD_NAME=smdk2410:
------- mkconfig -------
23 [ "${BOARD_NAME}" ] || BOARD_NAME="$1"
第25、26行对参数个数进行判断,不满足要求则退出:
------- mkconfig -------
25 [ $# -lt 4 ] && exit 1
26 [ $# -gt 6 ] && exit 1
输出配置信息:Configuring for smdk2410 board...
------- mkconfig -------
28 echo "Configuring for ${BOARD_NAME} board..."
第33行到62行新建链接文件:
------- mkconfig -------
33 if [ "$SRCTREE" != "$OBJTREE" ] ; then
34 mkdir -p ${OBJTREE}/include
35 mkdir -p ${OBJTREE}/include2
36 cd ${OBJTREE}/include2
37 rm -f asm
38 ln -s ${SRCTREE}/include/asm-$2 asm
39 LNPREFIX="../../include2/asm/"
40 cd ../include
41 rm -rf asm-$2
42 rm -f asm
43 mkdir asm-$2
44 ln -s asm-$2 asm
45 else
46 cd ./include
47 rm -f asm
48 ln -s asm-$2 asm
49 fi
50
51 rm -f asm-$2/arch
52
53 if [ -z "$6" -o "$6" = "NULL" ] ; then
54 ln -s ${LNPREFIX}arch-$3 asm-$2/arch
55 else
56 ln -s ${LNPREFIX}arch-$6 asm-$2/arch
57 fi
58
59 if [ "$2" = "arm" ] ; then
60 rm -f asm-$2/proc
61 ln -s ${LNPREFIX}proc-armv asm-$2/proc
62 fi
第一个if判断执行45行else分支,进入/include目录,建立链接文件/asm指向/asm-arm。
上一篇:U-Boot-1.1.6移植到MINI2440开发板(3) —— 源码分析第一阶段
下一篇:详解ARM处理寄存器与用户模式
推荐阅读最新更新时间:2024-11-05 11:20
设计资源 培训 开发板 精华推荐
- LT6656BIS6-1.25、1.25V 扩展电源范围电压基准的典型应用
- LTC3218 的典型应用 - 400mA 单线相机 LED 电荷泵
- AM1D-1212SH30-RZ 12V 1W DC-DC 转换器的典型应用
- CY8C4127LQI-BL483 4100_BLE PSoC 可编程片上系统的典型应用
- MAXREFDES1260:具有 3A USB-C 输入的锂电池充电器和监控系统
- 毕设平衡小车
- LTM4620EY 1.2V 和 1V 输出 DC/DC 稳压器的典型应用电路
- L9110S二路驱动板
- REF191 低压差电压基准的典型应用电路,用于低功率应变计电路
- 用于简单时钟振荡器的 NCP301LSN18T1 1.8V 电压检测器的典型应用