订阅
纠错
加入自媒体

如何从0编译和移植uboot、增加串口?

2021-04-01 14:59
一口Linux
关注

继续更新两篇ARM专题文章,该系列汇总如下:

《从0学ARM》

本文主要目的是如何从0编译和移植uboot,增加串口、网络、emmc等功能,让他支持exynos4412开发板。

一、移植步骤

1. Uboot配置指定交叉编译工具链进入uboot代码根目录$ cd  u-boot-2013.01

修改 Makefile在

ifeq ($(HOSTARCH),$(ARCH))
  CROSS_COMPILE ?=
endif

下添加

ifeq   (arm,$(ARCH))
  CROSS_COMPILE ?= arm-none-linux-gnueabi-
endif

交叉编译工具

在这里插入图片描述指定产品CPU我们产品用的CPU是 exynos 4412;

查看u-boot源码:

arch/arm/cpu/armv7/exynos/

可见U-boot已支持该CPU。

指定产品BOARD三星公司已经为exynos 4412发布了初始化的程序:

origencpu硬件信息对应的该CPU硬件信息头文件位于以下位置:include/configs/origen.h

该文件定义了uboot启动必须关于exynos 4412必须的一些资源信息。

boards.cfg在uboot-2013-01中,顶层目录下的boards.cfs文件中查看它支持的开发板和相应的信息,后续的编译过程需要根据配置名检索到相应的信息。文件格式如下:

和以前的老版本比,配置更加规范化了,其实这些就是相关文件分类的一个文件夹的描述。依照这个层次关系,我们可以很方便的对我们开发板进行配置。

编译u-boot

不同版本的uboot的配置命令可能是不同的,源码包的文件README通常会有相应的配置命令【其他版本的uboot会不一样】:

配置和编译命令如下:

$ make  distclean
$ make  origen_config

改配置命令会生成以下文件:

include/config.h

config.h

编译:

$ make all

编译完成后生成的u-boot.bin就是可执行的镜像文件。

但是并不会生成真正适配我们板子的uboot,只是适配参考板,该文件还不能在我们板子上运行,我们需要对u-boot源代码进行相应的修改。

2. 确认第一条指令有运行到  (点灯法)

在arch/arm/cpu/armv7/start.S  134 行后添加点灯程序

#if 1
 ldr r0, =0x11000c40 @GPX2_7 led2
 ldr r1, [r0]
 bic r1, r1, #0xf0000000
 orr r1, r1, #0x10000000
 str r1, [r0]

 ldr r0, =0x11000c44
 mov r1,#0xff
 str r1, [r0]
#endif

因为uboot刚启动的时候,串口没有来得及初始化,我们可以通过点亮LED的方法来判断程序是否执行到此处。

代码详解参考《十、LED汇编、C语言驱动编写》

3. 添加三星加密方式

exynos 需要三星提供的初始引导加密后,我们的u-boot,才能被引导运行,这其中要用到下面的几个命令或三星提供的工具软件,这些操作的目的就是根据三星的芯片的启动要求对uboot.bin 进行一些处理,包括在特定长度的位置加上和校验信息以及插入一些文件段。

$cp  sdfuse_q  u-boot-2013.01  -rf
$ chmod  777  u-boot-2013.01/sdfuse_q  -R      
$cp  CodeSign4SecureBoot  u-boot-2013.01  -rf    

注:CodeSign4SecureBoot 三星提供的安全启动方式  ,对应的程序由三星提供。sdfuse_q目录下的文件是针对三星堆uboot.bin文件格式要求进行加密编写的文件。

修改根目录Makefile,实现sdfuse_q的编译在

$(obj)u-boot.bin: $(obj)u-boot
 $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
 $(BOARD_SIZE_CHECK)

下添加

@#./mkuboot
@split  -b  14336  u-boot.bin  bl2
@make -C sdfuse_q/
@#cp u-boot.bin u-boot-4212.bin
@#cp u-boot.bin u-boot-4412.bin
@#./sdfuse_q/add_sign
@./sdfuse_q/chksum
@./sdfuse_q/add_padding
@rm bl2a*
@echo

注意是tab键缩进的,否则makefile编译报错注意如果执行了make distclean 需重新拷贝CodeSign4SecureBoot

为方便起见,在根目录下创建编译脚本build.sh,该脚本将自动完成添加加密方式。

1 #!/bin/sh
 2
 3 sec_path="CodeSign4SecureBoot/"
 4 CPU_JOB_NUM=$(grep processor /proc/cpuinfo | awk '{field=$NF};END{print field+1}')
 5 ROOT_DIR=$(pwd)
 6 CUR_DIR=${ROOT_DIR##}
 7
 8 case "$1" in
 9     clean)
10         echo make clean
11         make mrproper
12         ;;
13     *)
14
15         if [ ! -d $sec_path ]
16         then
17             echo "**********************************************"
18             echo "[ERR]please get the CodeSign4SecureBoot first"
19             echo "**********************************************"
20             return
21         fi    
22
23         make origen_config
24
25         make -j$CPU_JOB_NUM
26
27         if [ ! -f checksum_bl2_14k.bin ]
28         then
29             echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
30             echo "There are some error(s) while building uboot, please use command make to check."
31             echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
32             exit 0
33         fi
34
35         cp -rf checksum_bl2_14k.bin $sec_path
36         cp -rf u-boot.bin $sec_path
37         rm checksum_bl2_14k.bin
38
39         cd $sec_path
40         cat E4412_N.bl1.SCP2G.bin bl2.bin all00_padding.bin u-boot.bin tzsw_SMDK4412_SCP_2GB.bin > u-boot-origen.bin
41         mv u-boot-origen.bin $ROOT_DIR
42
43         rm checksum_bl2_14k.bin
44         rm u-boot.bin
45
46         echo
47         echo
48         ;;
49
50 esac

编译脚本

$ chmod   777  u-boot-2013.01/ build.sh
$ ./buildsh

注:build.sh 脚本方式完成自动添加加密方式,编译生成所需文件u-boot_origen.bin

root@ubuntu:/home/peng/uboot/u-boot-2013.01# ls
api                  config.mk  examples     Makefile  sdfuse_q         u-boot.bin
arch                 COPYING    fs           mkconfig  snapshot.commit  u-boot.map
board                CREDITS    helper.mk    nand_spl  spl              u-boot-origen.bin
boards.cfg           disk       include      net       System.map       u-boot.srec
build.sh             doc        lib          post      test
CodeSign4SecureBoot  drivers    MAINTAINERS  README    tools
common               dts        MAKEALL      rules.mk  u-boot

u-boot_origen.bin4. 实现串口输出

修改lowlevel_init.S文件

$vim  board/samsung/origen/lowlevel_init.S

a) 添加临时栈,在

41 lowlevel_init:

后添加

ldr  sp,=0x02060000 @use iRom stack in bl2

b) 添加关闭看门狗代码:在

67     beq wakeup_reset  

后添加

#if 1 for close watchdog    
     PS-Hold high
 ldr r0, =0x1002330c
 ldr r1, [r0]
 orr r1, r1, #0x300
 str r1, [r0]        
 ldr     r0, =0x11000c08
 ldr r1, =0x0
 str r1, [r0]
Clear  MASK_WDT_RESET_REQUEST  
 ldr r0, =0x1002040c
 ldr r1, =0x00
 str r1, [r0]
#endif  

1  2  3  下一页>  
声明: 本文由入驻维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。

发表评论

0条评论,0人参与

请输入评论内容...

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

文章纠错
x
*文字标题:
*纠错内容:
联系邮箱:
*验 证 码:

粤公网安备 44030502002758号