訂閱
糾錯(cuò)
加入自媒體

如何從0編譯和移植uboot、增加串口?

繼續(xù)更新兩篇ARM專題文章,該系列匯總?cè)缦拢?/p>

《從0學(xué)ARM》

本文主要目的是如何從0編譯和移植uboot,增加串口、網(wǎng)絡(luò)、emmc等功能,讓他支持exynos4412開發(fā)板。

一、移植步驟

1. Uboot配置指定交叉編譯工具鏈進(jìn)入uboot代碼根目錄$ cd  u-boot-2013.01

修改 Makefile在

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

下添加

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

交叉編譯工具

在這里插入圖片描述指定產(chǎn)品CPU我們產(chǎn)品用的CPU是 exynos 4412;

查看u-boot源碼:

arch/arm/cpu/armv7/exynos/

可見U-boot已支持該CPU。

指定產(chǎn)品BOARD三星公司已經(jīng)為exynos 4412發(fā)布了初始化的程序:

origencpu硬件信息對應(yīng)的該CPU硬件信息頭文件位于以下位置:include/configs/origen.h

該文件定義了uboot啟動必須關(guān)于exynos 4412必須的一些資源信息。

boards.cfg在uboot-2013-01中,頂層目錄下的boards.cfs文件中查看它支持的開發(fā)板和相應(yīng)的信息,后續(xù)的編譯過程需要根據(jù)配置名檢索到相應(yīng)的信息。文件格式如下:

和以前的老版本比,配置更加規(guī)范化了,其實(shí)這些就是相關(guān)文件分類的一個(gè)文件夾的描述。依照這個(gè)層次關(guān)系,我們可以很方便的對我們開發(fā)板進(jìn)行配置。

編譯u-boot

不同版本的uboot的配置命令可能是不同的,源碼包的文件README通常會有相應(yīng)的配置命令【其他版本的uboot會不一樣】:

配置和編譯命令如下:

$ make  distclean
$ make  origen_config

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

include/config.h

config.h

編譯:

$ make all

編譯完成后生成的u-boot.bin就是可執(zhí)行的鏡像文件。

但是并不會生成真正適配我們板子的uboot,只是適配參考板,該文件還不能在我們板子上運(yùn)行,我們需要對u-boot源代碼進(jìn)行相應(yīng)的修改。

2. 確認(rèn)第一條指令有運(yùn)行到  (點(diǎn)燈法)

在arch/arm/cpu/armv7/start.S  134 行后添加點(diǎn)燈程序

#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

因?yàn)閡boot剛啟動的時(shí)候,串口沒有來得及初始化,我們可以通過點(diǎn)亮LED的方法來判斷程序是否執(zhí)行到此處。

代碼詳解參考《十、LED匯編、C語言驅(qū)動編寫》

3. 添加三星加密方式

exynos 需要三星提供的初始引導(dǎo)加密后,我們的u-boot,才能被引導(dǎo)運(yùn)行,這其中要用到下面的幾個(gè)命令或三星提供的工具軟件,這些操作的目的就是根據(jù)三星的芯片的啟動要求對uboot.bin 進(jìn)行一些處理,包括在特定長度的位置加上和校驗(yàn)信息以及插入一些文件段。

$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 三星提供的安全啟動方式  ,對應(yīng)的程序由三星提供。sdfuse_q目錄下的文件是針對三星堆uboot.bin文件格式要求進(jìn)行加密編寫的文件。

修改根目錄Makefile,實(shí)現(xiàn)sdfuse_q的編譯在

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

下添加

@#./mkuboot
@split  -b  14336  u-boot.bin  bl2
@m(xù)ake -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鍵縮進(jìn)的,否則makefile編譯報(bào)錯(cuò)注意如果執(zhí)行了make distclean 需重新拷貝CodeSign4SecureBoot

為方便起見,在根目錄下創(chuàng)建編譯腳本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. 實(shí)現(xiàn)串口輸出

修改lowlevel_init.S文件

$vim  board/samsung/origen/lowlevel_init.S

a) 添加臨時(shí)棧,在

41 lowlevel_init:

后添加

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

b) 添加關(guān)閉看門狗代碼:在

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  下一頁>  
聲明: 本文由入駐維科號的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報(bào)。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個(gè)字

您提交的評論過于頻繁,請輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號