Uboot啟動

(一)uboot 配置編譯分析

u-boot源碼是通過gcc和Makefile組織編譯的,頂層目錄下的Makefile可通過boards.cfg來設置開發板的定義
然后遞歸調用各級子目錄下的Makefile,把編譯過的程序連接成u-boot

boards.cfg文件:
開發板在Makefile下配置定義,例如:

TargetARCHCPUBoard name(開發版名)Vendor(廠商)SoC(具體系列)Options
tiny4412armarmv7tiny4412samsungexynos

make tiny4412_config 表示在當前目錄下的Makefile查找一個tiny4412的目標文件來執行,在Makefile中沒有tiny4412
但有%_config::unconfig %表示匹配模式,可以匹配任意字符

2. U-boot操作過程
  1. 將u-boot-1.3.4.tar.gz復制到Linux系統中,然后解壓縮該u-boot后,打開u-boot文件夾后,點右鍵從終端打開。
  2. 在終端中 輸入:make clobber (清工程文件,范圍大一些,清除原來已經編譯的文件)
                   make clean(清除文件)make xyd2440_config(將xyd2440_config文件導入準備編譯)make all (編譯)
  1. 然后可在文件夾中生成.bin的文件。
  2. 然后通過j-link將生成的.bin文件燒入NORFLASH中。J-LINK的用法詳見附錄3。
  3. 通過串口就可以看到u-boot運行的相關信息(在開始-附錄-通信-超級終端中查看)。

(二) U-boot移植測試過程

  1. 在u-boot添加具體一個開發板,需要添加哪些文件?
    boards.cfg里面添加自己開發板的信息

     	myboard4412     arm    armv7   myboard4412    samsung     exynos編譯:  make myboard4412復制board/samsung/tiny4412/ 一份代碼,修改名字為myboard4412cp board/samsung/tiny4412/ -r board/samsung/myboard4412  -rf復制include/configs/tiny4412.h 一份代碼,修改名字為myboard4412.hcp include/configs/tiny4412.h  include/configs/myboard4412.h
    
  2. 編譯

[root@localhost uboot_tiny4412]# make myboard4412_config
Configuring for myboard4412board...
[root@localhost uboot_tiny4412]# make -j8

提示錯誤:
arm-linux-ld: cannot find board/samsung/tiny4412/libtiny4412.o
make: *** [u-boot] 錯誤 1

錯誤說明:arm-linux-ld是編譯器的鏈接工具,也是就是鏈接時候出錯了,根據出錯信息,是在尋找board/samsung/tiny4412/libtiny4412.o 文件時候出錯了,仔細看一下發現,現在我們的板級文件是xyd4412 ,而不是tiny4412,但是,卻去找這個文件,很明顯,應答是在鏈接文件中指定需要這個文件。所以打開board/samsung/myboard4412/u-boot.lds文件,文件中有這樣的條語句:

board/samsung/tiny4412/libtiny4412.o (.text)

這個語句正是出錯提示的信息,很明顯這個位置要做相應修改,修改如下:

board/samsung/xyd4412/libxyd4412.o (.text)

修改后保存,重新編譯。
[root@localhost uboot_tiny4412]#make -j8

ers/watchdog/libwatchdog.o fs/cramfs/libcramfs.o fs/ext2/libext2fs.o fs/fat/libfat.o fs/fdos/libfdos.o fs/jffs2/libjffs2.o fs/reiserfs/libreiserfs.o fs/ubifs/libubifs.o fs/yaffs2/libyaffs2.o lib/libfdt/libfdt.o lib/libgeneric.o lib/lzma/liblzma.o lib/lzo/liblzo.o net/libnet.o post/libpost.o board/samsung/xyd4412/libxyd4412.o --end-group /media/sdb1/4412/u-boot/uboot_tiny4412/arch/arm/lib/eabi_compat.o -L /usr/local/arm/4.3.2/bin/…/lib/gcc/arm-none-linux-gnueabi/4.3.2 -lgcc -Map u-boot.map -o u-boot
arm-linux-objcopy -O srec u-boot u-boot.srec
arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
[root@localhost uboot_tiny4412]#
編譯正確,會得到 u-boot.bin文件。

(三)U-boot啟動:

程序入口是:arch/arm/cpu/armv7/start.S
由上面的代碼跳轉到C語言代碼,C的入口:arch/arm/lib/board.c

1)從uboot源碼頂層目錄boards.cfg文件中找到tinny4412配置信息,利用這些信息生成文件
2)根據配置信息在include下創建指向具體架構arm的軟件鏈接,arm芯片是指向arch/arm/include/asm/,
因為后面有文件包含#include<asm/config.h>,編譯時找到對應架構
3、根據配置信息創建include/config.mk,這個文件被頂層Makefie包含,內容
ARCH=arm
CPU=armv7

4、在include創建config.h文件 查看內容
增添了一塊開發板支持需要添加的文件(當前u-boot已經支持CPU)
boards 廠家名 開發板名
include/config 開發板名.h
以上步驟時候以一個最接近的板子為起點,移植到自己的開發板,開發平臺對應的u-boot的第一步,如果自己板子和參考版的最小系統(DDR EMMC CPU )不一樣,那就需要修改兩個開發平臺的硬件參數上的差異,具體的要求知道u-boot啟動的流程,從上電執行了哪些文件的代碼,然后執行代碼,那些是和硬件參數有關,要求相應的修改。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531437.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531437.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531437.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

行列式計算的兩種方法

#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define N 100 using namespace std; int a[N][N]; double aa[N][N]; int n;/**********************************************************/ //求行列式的值&#xff1…

uboot啟動流程分析

Uboot的啟動流程分為兩個階段&#xff0c;第一階段主要是匯編語言編寫&#xff0c;第二階段是C語言編寫&#xff0c;每個階段所做的工作不同&#xff0c;這篇文章分析的是uboot 2010版&#xff0c;以tiny4412的uboot為例。 啟動過程涉及的主要文件&#xff1a; arch/arm/cpu/a…

(一)uboot的移植與制作

目錄&#xff08;一&#xff09;環境&#xff08;二&#xff09;流程分析&#xff08;三&#xff09;具體步驟在裸機啟動流程里涉及到BL1&#xff0c;BL2為系統的加載啟動項&#xff0c;全稱為BootLoader。 Boot Loader 是在操作系統內核運行之前運行的一段小程序。通過這段小程…

jquery ajax(實現單獨提交某個form)

function submitTaskScore(formid) {//formid表示的是表單的id$.ajax({type:"post",url:"companyAndDistributeAction!scoreTask",//后臺處理程序data:$(formid).serialize(),success:function(){document.getElementById("hjzggContent").inner…

(二)linux內核鏡像制作

&#xff08;一&#xff09;目的 在進行嵌入式開發的時候&#xff0c;我們往往會先在電腦上安裝交叉編譯器&#xff0c;然后編譯目標板上的代碼&#xff0c;最后把代碼下載到電路板中&#xff0c;嵌入式系統組成包括&#xff1a;BootLoaderkernelfilesystemapplication&#x…

js+css實現骰子的隨機轉動

網上找的例子&#xff0c;然后增添了新的東西&#xff0c;在這里展示一下...... 效果圖預覽&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html x…

linux安裝交叉編譯環境

&#xff08;一&#xff09;交叉編譯器的簡介 &#xff08;1&#xff09;本地編譯 在了解交叉編譯之前我們首先介紹一下另一個概念&#xff1a;本地編譯 之前所做的C開發屬于本地編譯&#xff0c;即在當前PC下&#xff08;x86的CPU下&#xff09;&#xff0c;直接編譯出可以運…

jsp實現郵件的發送

如果程序出現 454 Authentication failed, please open smtp flag first! 錯誤&#xff0c;那么一般是郵箱沒有開通POP3/SMTP服務&#xff0c;登錄郵箱&#xff0c;在設置中開啟該服務即可 &#xff01; 另外需要的jar包如下: imap.jar, mail.jar, smtp.jar, 可以自己在網上下…

linux的mount和umount指令使用

mount即掛在操作&#xff0c;磁盤或分區創建好文件系統后需要掛載到一個目錄&#xff08;一般mount在/mnt下&#xff09;才能使 用&#xff0c;和winsdows不同的是在linux下需要手動掛載。 用法&#xff1a;mount [-t文件系統] [選項] 設備目錄注意&#xff1a;[ ]為可選項…

斐波那契的四種求法

首先看一下斐波那契的矩陣表示&#xff1a; 數列的遞推公式為&#xff1a;f(1)1&#xff0c;f(2)2&#xff0c;f(n)f(n-1)f(n-2)(n>3) 用矩陣表示為&#xff1a; 進一步&#xff0c;可以得出直接推導公式&#xff1a; #include<iostream> #include<cstring> #i…

利用STM32制作紅外測溫儀之軟件設計(MLX90614)

目錄&#xff08;一&#xff09;工程目錄如圖&#xff1a;&#xff08;二&#xff09;main函數實現&#xff1a;&#xff08;三&#xff09;MLX90614測溫代碼實現前面介紹了使用 STM32制作紅外測溫儀硬件設計,今天來說一下軟件的實現&#xff0c;具體的程序&#xff0c;完整的k…

Windows下使用Dev-C++開發基于pthread.h的多線程程序

一、下載Windows版本的pthread 目前最新版本是&#xff1a;pthreads-w32-2-9-1-release.zip。 二、解壓pthread到指定目錄 我選擇的目錄是&#xff1a;E:\DEV-CPP\Pthread完成后&#xff0c;該目錄會多出三個文件夾&#xff1a;Pre-built.2&#xff0c;pthreads.2&#xff0c;Q…

(三)linux之根文件系統的制作

&#xff08;一&#xff09;準備工作 Ubuntu 16.04系統linux-3.5內核:linux-3.5-20190929交叉編譯工具arm-linux-gcc-4.5.1-v6-vfp-20120301.rarbusybox源碼包&#xff1a;busybox-1.21.1.rar &#xff08;二&#xff09;工具介紹 &#xff08;1&#xff09;交叉編譯器 這個…

c/c++多線程模擬系統資源分配(并通過銀行家算法避免死鎖產生)

銀行家算法數據結構 &#xff08;1&#xff09;可利用資源向量Available 是個含有m個元素的數組&#xff0c;其中的每一個元素代表一類可利用的資源數目。如果Available[j]K&#xff0c;則表示系統中現有Rj類資源K個。 &#xff08;2&#xff09;最大需求矩陣Max 這是一個nm的…

(四)Linux內核模塊化編程

目錄&#xff08;一&#xff09;模塊化編程簡介&#xff08;二&#xff09;安裝卸載模塊命令.&#xff08;三&#xff09;將自定義功能添加到內核三種方法&#xff08;1&#xff09;修改Kconfig和Makefile&#xff08;2&#xff09;直接修改功能對應目錄下的Makefile文件&#…

基于X86平臺的PC機通過網絡發送一個int(32位)整數的字節順序

1.字節順序  字節順序是指占內存多于一個字節類型的數據在內存中的存放順序&#xff0c;通常有小端、大端兩種字節順序。小端字節序指低字節數據存放在內存低地址處&#xff0c;高字節數據存放在內存高地址處&#xff1b;大端字節序是高字節數據存放在低地址處&#xff0c;低字…

Linux內核空間和用戶空間

在Linux系統中存在進程的概念&#xff1a; 進程的分類&#xff1a; 用戶進程&#xff1a;運行在用戶空間的進程被稱為用戶進程 內核進程:運行在內核空間的進程被稱為內核進程 進程的空間&#xff1a; 系統會為每一個進程分0-4G的虛擬尋址空間&#xff0c;在4G的空間中 0-3G&…

codeforces Round #320 (Div. 2) C. A Problem about Polyline(數學) D. Or Game(暴力,數學)

解題思路&#xff1a;就是求數 n 對應的二進制數中有多少個 1 #include <iostream> #include<cstdio> using namespace std; int main(){int n;cin>>n;int ans 0; // while(n){//這也是一種好的方法 // n n&(n-1); // ans; // }while(n…

(五)Linux之設備驅動模型

目錄&#xff08;一&#xff09;Linux內核驅動簡介&#xff08;二&#xff09;雜項設備驅動模型&#xff08;1&#xff09;相關接口&#xff08;2&#xff09;雜項設備注冊過程&#xff08;三&#xff09;早期經典字符設備驅動模型&#xff08;1&#xff09;相關接口&#xff0…

操作系統頁面置換算法(opt,lru,fifo,clock)實現

選擇調出頁面的算法就稱為頁面置換算法。好的頁面置換算法應有較低的頁面更換頻率&#xff0c;也就是說&#xff0c;應將以后不會再訪問或者以后較長時間內不會再訪問的頁面先調出。 常見的置換算法有以下四種&#xff08;以下來自操作系統課本&#xff09;。 1. 最佳置換算法(…