【Tiny4412】Tiny4412编译和烧写uboot
00. 目錄
文章目錄
- 00. 目錄
- 01. Uboot簡介
- 02. 安裝交叉編譯器
- 03. 編譯Uboot
- 04. 燒寫Uboot
- 05. 測試Uboot
- 06. 常見問題解決
- 07. 附錄
01. Uboot簡介
1.1 Uboot概述
U-Boot,全稱 Universal Boot Loader,是遵循GPL條款的開放源碼項目。U-Boot的作用是系統引導。U-Boot從FADSROM、8xxROM、PPCBOOT逐步發展演化而來。其源碼目錄、編譯形式與Linux內核很相似,事實上,不少U-Boot源碼就是根據相應的Linux內核源程序進行簡化而形成的,尤其是一些設備的驅動程序
1.2 uboot目錄結構
- api 是uboot提供接口的函數
- arch 是體系架構相關的代碼
- board 目標板相關文件,主要包含SDRAM、FLASH驅動;
- common 獨立于處理器體系結構的通用代碼,如內存大小探測與故障檢測;
- disk 磁盤分區相關代碼
- doc 文檔
- cpu 與處理器相關的文件。如mpc8xx子目錄下含串口、網口、LCD驅動及中斷初始化等文件;
- driver 通用設備驅動,如CFI FLASH驅動(目前對INTEL FLASH支持較好)
- doc U-Boot的說明文檔;
- examples可在U-Boot下運行的示例程序;如hello_world.c,timer.c;
- fs 文件系統目錄 支持嵌入式常見的文件系統
- include U-Boot頭文件;尤其configs子目錄下與目標板相關的配置頭文件是移植過程中經常要修改的文件;
- lib_xxx 處理器體系相關的文件,如lib_ppc, lib_arm目錄分別包含與PowerPC、ARM體系結構相關的文件;
- nand_spl nand存儲器相關代碼
- net 與網絡功能相關的文件目錄,如bootp,nfs,tftp;
- post 上電自檢文件目錄。尚有待于進一步完善;
- rtc RTC驅動程序;
- tools 用于創建U-Boot S-RECORD和BIN鏡像文件的工具;
1.3 工作模式
U-Boot的工作模式有啟動加載模式和下載模式。
啟動加載模式是Bootloader的正常工作模式,嵌入式產品發布時,Bootloader必須工作在這種模式下,Bootloader將嵌入式操作系統從FLASH中加載到SDRAM中運行,整個過程是自動的。
下載模式就是Bootloader通過某些通信手段將內核映像或根文件系統映像等從PC機中下載到目標板的FLASH中。用戶可以利用Bootloader提供的一些命令接口來完成自己想要的操作。
1.4 Uboot啟動流程
大多數BootLoader都分為stage1和stage2兩大部分,U-boot也不例外。依賴于cpu體系結構的代碼(如設備初始化代碼等)通常都放在stage1且可以用匯編語言來實現,而stage2則通常用C語言來實現,這樣可以實現復雜的功能,而且有更好的可讀性和移植性。
1、 stage1(start.s代碼結構)
U-boot的stage1代碼通常放在start.s文件中,它用匯編語言寫成,其主要代碼部分如下:
(1) 定義入口。由于一個可執行的image必須有一個入口點,并且只能有一個全局入口,通常這個入口放在rom(Flash)的0x0地址,因此,必須通知編譯器以使其知道這個入口,該工作可通過修改連接器腳本來完成。
(2)設置異常向量(exception vector)。
(3)設置CPU的速度、時鐘頻率及中斷控制寄存器。
(4)初始化內存控制器 。
(5)將rom中的程序復制到ram中。
(6)初始化堆棧 。
(7)轉到ram中執行,該工作可使用指令ldrpc來完成。
2、 stage2(C語言代碼部分)
lib_arm/board.c中的start armboot是C語言開始的函數,也是整個啟動代碼中C語言的主函數,同時還是整個u-boot(armboot)的主函數,該函數主要完成如下操作:
(1)調用一系列的初始化函數。
(2)初始化flash設備。
(3)初始化系統內存分配函數。
(4)如果目標系統擁有nand設備,則初始化nand設備。
(5)如果目標系統有顯示設備,則初始化該類設備。
(6)初始化相關網絡設備,填寫ip,c地址等。
(7)進入命令循環(即整個boot的工作循環),接受用戶從串口輸入的命令,然后進行相應的工作。
1.5 常用的bootloader
U-Boot
U-Boot(Universal BootLoader)是遵循GPL條款的開放源碼項目,是在PPCBoot以及ARMBoot的基礎上逐步發展和演化而來,現在U-Boot已經能夠支持PowerPC、ARM、X86、MIPS等體系結構的上百種開發板,已經成為功能最多、靈活性最強,并且開發最積極的開放源碼的BootLoader。
vivi
vivi是由韓國Mizi公司開發的一種BootLoader,專門針對ARM9處理器而設計,支持S3C2410x處理器。和所有的BootLoader一樣,vivi有兩種工作模式,即啟動加載模式和下載模式。當vivi處于下載模式時,它為用戶提供一個命令行接口,通過該接口可以使用vivi提供的一些命令。
Blob
Blob(BootLoader Object)是由Jan-Derk Bakker和Erik Mouw發布,專為StrongARM構架下的LART設計的BootLoader。
Blob支持SA1100的LART主板,但用戶也可以自行修改移植。Blob也提供兩種工作模式,在啟動時處于正常的啟動加載模式,但是它會延時10秒等待終端用戶按下任意鍵而將Blob 切換到下載模式。如果在10秒內沒有用戶按鍵,則Blob繼續啟動Linux內核。
ARMboot
ARMboot是一個ARM平臺的開源固件項目,它嚴重依賴于PPCBoot。ARMboot支持的處理器構架有StrongARM,ARM720T,PXA250等,是為基于ARM或者StrongARM CPU的嵌入式系統所設計的。ARMboot的目標是成為通用的、容易使用和移植的引導程序,非常輕便地運用于新的平臺上。總得來說,ARMboot介于大、小型BootLoader之間,相對輕便,基本功能完備,缺點是缺乏后續支持。ARMboot發布的最后版本為ARMboot–1.1.0,2002年終止了ARMboot的維護,其發布網址為:http://sourceforge.net/projects/armboot。
Redboot
RedBoot是標準的嵌入式調試和引導解決方案,是一個專門為嵌入式系統定制的引導工具,最初由Redhat開發,是嵌入式操作系統eCos的一個最小版本,是隨eCos發布的一個BOOT方案,是一個開源項目。現在交由自由軟件組織FSF管理,遵循GPL。集BootLoader、調試、Flash燒寫于一體。支持串口、網絡下載、執行嵌入式應用程序。既可以用在產品的開發階段(調試功能),也可以用在最終的產品上(Flash更新、網絡啟動)。
RedBoot支持的處理器構架有ARM、MIPS、PowerPC、x86等,是一個完善的嵌入式系統BootLoader。
02. 安裝交叉編譯器
交叉編譯器:在宿主機上編譯出能夠在目標機上運行的代碼的工具。咱們的壓縮包為arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz。
2.1 解壓交叉編譯器工具
[root@itcast tools]# tar -xzvf arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz2.2 創建arm目錄
[root@itcast tools]# mkdir /usr/local/arm [root@itcast tools]#2.3 拷貝對應的文件到arm目錄
[root@itcast tools]# cp opt/FriendlyARM/toolschain/4.5.1/ /usr/local/arm/ -rf [root@itcast tools]#2.4 設置環境變量
[root@itcast /]# vim ~/.bash_profile PATH=$PATH:$HOME/bin # 新增加的內容如下 PATH=/usr/local/arm/4.5.1/bin:$PATH2.5 注銷系統
Ctrl + Alt + BackSpace 重新登錄
2.6 測試交叉編譯器
#輸入arm-linux- 按兩下tab鍵 如果出現如下內容表示環境已經設置好 [root@itcast tools]# arm-linux- arm-linux-addr2line arm-linux-cpp arm-linux-gprof arm-linux-populate arm-linux-ar arm-linux-g++ arm-linux-ld arm-linux-ranlib arm-linux-as arm-linux-gcc arm-linux-ldd arm-linux-readelf arm-linux-c++ arm-linux-gcc-4.5.1 arm-linux-nm arm-linux-size arm-linux-cc arm-linux-gccbug arm-linux-objcopy arm-linux-strings arm-linux-c++filt arm-linux-gcov arm-linux-objdump arm-linux-strip03. 編譯Uboot
3.1 解壓uboot
[root@itcast tools]# tar -xjvf uboot_tiny4412-master.tar.bz23.2 配置uboot
[root@itcast tools]# cd uboot_tiny4412-master [root@itcast uboot_tiny4412-master]# make tiny4412_config awk '(NF && $1 !~ /^#/) { print $1 ": " $1 "_config; $(MAKE)" }' boards.cfg > .boards.depend Configuring for tiny4412 board... [root@itcast uboot_tiny4412-master]#3.3 編譯uboot
[root@itcast uboot_tiny4412-master]# make -j4 .... arm-linux-ld: warning: creating a DT_TEXTREL in object. arm-linux-objcopy -O srec u-boot u-boot.srec arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin3.4 生成對應工具
[root@itcast sd_fuse]# ls Makefile sd_fdisk.c tiny4412 V310-EVT1-mkbl2.c [root@itcast sd_fuse]# make gcc -o mkbl2 V310-EVT1-mkbl2.c gcc -o sd_fdisk sd_fdisk.c [root@itcast sd_fuse]#04. 燒寫Uboot
4.1 解掛SD卡
[root@itcast /]# umount /media/* [root@itcast /]#4.2 格式化SD卡
[root@itcast /]# dd if=/dev/zero of=/dev/sdb bs=1024 count=1024 記錄了1024+0 的讀入 記錄了1024+0 的寫出 1048576字節(1.0 MB)已復制,1.79304 秒,585 kB/秒 [root@itcast /]#4.3 燒寫Uboot到SD卡
[root@itcast tiny4412]# pwd /home/tools/uboot_tiny4412-master/sd_fuse/tiny4412 [root@itcast tiny4412]# ./sd_fusing.sh /dev/sdb /dev/sdb reader is identified. --------------------------------------- BL1 fusing 記錄了16+0 的讀入 記錄了16+0 的寫出 8192字節(8.2 kB)已復制,0.0816119 秒,100 kB/秒 --------------------------------------- BL2 fusing 記錄了28+0 的讀入 記錄了28+0 的寫出 14336字節(14 kB)已復制,0.255752 秒,56.1 kB/秒 --------------------------------------- u-boot fusing 記錄了540+1 的讀入 記錄了540+1 的寫出 276932字節(277 kB)已復制,4.6861 秒,59.1 kB/秒 --------------------------------------- TrustZone S/W fusing 記錄了184+0 的讀入 記錄了184+0 的寫出 94208字節(94 kB)已復制,2.49234 秒,37.8 kB/秒 --------------------------------------- U-boot image is fused successfully. Eject SD card and insert it again. [root@itcast tiny4412]#到此,uboot已經燒寫到SD中。
05. 測試Uboot
在Linux平臺我們使用minicom作為串口調試工具。
5.1 安裝minicom(如果沒有安裝minicom的話)
[root@itcast sd_fuse]# yum install minicom.x86_645.2 設置minicom
[root@itcast sd_fuse]# minicom -s # 選擇第三個選項 按下回車按下回車
備注:
115200 波特率
8N1: 8數據位 N 奇校驗 1停止位
保存為默認配置,下次啟動就不需要配置。
5.3 啟動minicom
此時板子上電,從SD卡啟動,輸出如下信息
[root@itcast /]# minicom U-Boot 2010.12 (Jun 04 2020 - 17:01:06) for TINY4412 CPU: S5PC220 [Samsung SOC on SMP Platform Base on ARM CortexA9]APLL = 1400MHz, MPLL = 800MHzBoard: TINY4412 DRAM: 1023 MiBvdd_arm: 1.2 vdd_int: 1.0 vdd_mif: 1.1BL1 version: N/A (TrustZone Enabled BSP)Checking Boot Mode ... SDMMC REVISION: 1.1 MMC Device 0: 7580 MB MMC Device 1: 3728 MB MMC Device 2: N/A *** Warning - using default environmentNet: No ethernet found. Hit any key to stop autoboot: 0 TINY4412 #此時uboot已經啟動了。
06. 常見問題解決
6.1 問題一 沒有那個文件或目錄
[root@itcast uboot_tiny4412-master]# arm-linux-gcc -v bash: /usr/local/arm/4.5.1/bin/arm-linux-gcc: /lib/ld-linux.so.2: bad ELF interpreter: 沒有那個文件或目錄 [root@itcast uboot_tiny4412-master]#解決辦法:
[root@itcast uboot_tiny4412-master]# yum install glibc.i686 [root@itcast uboot_tiny4412-master]# arm-linux-gcc -v Using built-in specs. COLLECT_GCC=arm-linux-gcc6.2 問題二:找不到libz.so動態庫
編譯過程中
解決辦法
[root@itcast uboot_tiny4412-master]# yum install zlib*.i68607. 附錄
7.1 arm-linux-gcc下載:arm-linux-gcc-4.5.1-v6-vfp-20120301.tar.gz
7.2 uboot下載:uboot_tiny4412-master.tar.gz
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的【Tiny4412】Tiny4412编译和烧写uboot的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Tools】TeamViewer安装教
- 下一篇: 【Tiny4412】Tiny4412烧写