訂閱
糾錯(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硬件信息對(duì)應(yīng)的該CPU硬件信息頭文件位于以下位置:include/configs/origen.h

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

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

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

編譯u-boot

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

配置和編譯命令如下:

$ make  distclean
$ make  origen_config

改配置命令會(huì)生成以下文件:

include/config.h

config.h

編譯:

$ make all

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

但是并不會(huì)生成真正適配我們板子的uboot,只是適配參考板,該文件還不能在我們板子上運(yùn)行,我們需要對(duì)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剛啟動(dòng)的時(shí)候,串口沒有來(lái)得及初始化,我們可以通過(guò)點(diǎn)亮LED的方法來(lái)判斷程序是否執(zhí)行到此處。

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

3. 添加三星加密方式

exynos 需要三星提供的初始引導(dǎo)加密后,我們的u-boot,才能被引導(dǎo)運(yùn)行,這其中要用到下面的幾個(gè)命令或三星提供的工具軟件,這些操作的目的就是根據(jù)三星的芯片的啟動(dòng)要求對(duì)uboot.bin 進(jìn)行一些處理,包括在特定長(zhǎng)度的位置加上和校驗(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 三星提供的安全啟動(dòng)方式  ,對(duì)應(yīng)的程序由三星提供。sdfuse_q目錄下的文件是針對(duì)三星堆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,該腳本將自動(dòng)完成添加加密方式。

1 #。痓in/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 腳本方式完成自動(dòng)添加加密方式,編譯生成所需文件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  下一頁(yè)>  
聲明: 本文由入駐維科號(hào)的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

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

暫無(wú)評(píng)論

暫無(wú)評(píng)論

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

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