1. 程式人生 > >UBOOT移植詳細 很全面

UBOOT移植詳細 很全面

一.預備知識: 1.       首先,U-Boot1.3.4還沒有支援s3c2440,移植仍是用2410的檔案稍作修改而成的。 2.       24402410的區別: 24402410的區別主要是2440的主頻更高,增加了攝像頭介面和AC‘97音訊介面;暫存器方面,除了新增模組的暫存器外,移植所要注意的是NAND FlASH控制器的暫存器有較大的變化、晶片的時鐘頻率控制暫存器(晶片PLL的暫存器)有一定的變化。其他暫存器基本是相容的。 3.  你開發板的boot方式是什麼,開發板上電以後是怎麼執行的。 一般來說三星的開發板有三種啟動方式:nandnorram。 具體用那一種方式來啟動決定於CPU
0M[0:1]這兩個引腳,具體請參考S3C2440datasheet nand:對於2440來說,CPU是不給nand-flash分配地址空間的,nand-flash只相當於CPU的一個外設,S3C2440做了一個從nand-flash啟動的機制。開發板一上電,CPU就自動複製       nand-flash裡面的前4K-Bytes內容到S3C2440內部整合的SDRAM,然後把4K內容所在的RAM對映到S3C24400地址,從0地址開始執行。這4K的內容主要負責下面這些工作:初始化中斷向量、設定CPU的工作模式為SVC32模式、遮蔽看門狗、遮蔽中斷、初始化時鐘、把整個u-boot重定向到外部SDRAM
、跳到主要的C函式入口。 nor:  早期的時候利用nor-flash啟動的方式比較多,就是把u-boot燒寫到nor-flash裡面,直接把nor-flash對映到S3C24400地址,上電從0地址開始執行。 ram:  直接把u-boot放到外部SDRAM上跑,這一般debug時候用到。 4.  u-boot程式的入口地址問題 要理解程式的入口地址,自然想到的是連線檔案,首先看看開發板相對於某個開發板的連線檔案"/board/你的開發板/u-boot.lds",看一個2410的例子: ENTRY(_start) SECTIONS {        . = 0x00000000;
       . = ALIGN(4);        .text      :        {          cpu/arm920t/start.o (.text)          *(.text)        }        . = ALIGN(4);        .rodata : { *(.rodata) }        . = ALIGN(4);        .data : { *(.data) }        . = ALIGN(4);        .got : { *(.got) }        __u_boot_cmd_start = .;        .u_boot_cmd : { *(.u_boot_cmd) }        __u_boot_cmd_end = .;        . = ALIGN(4);        __bss_start = .;        .bss : { *(.bss) }        _end = .; } (1) ENTRY(_start)可以看出u-boot的入口函式是_start,這個沒錯 (2) . = 0x00000000也許可以看出_start的地址是0x00000000,事實並不是這樣的,這裡的0x00000000沒效,在連線的時候最終會被TETX_BASE所代替的,具體請參考u-boot根目錄下的config.mk. (3) 網上很多說法是 _start=TEXT_BASE,我想這種說法也是正確的,但沒有說具體原因。 本人的理解是這樣的,TEXT_BASE表示text段的起始地址,而從 .text      : {   cpu/arm920t/start.o (.text)   *(.text) } 看,放在text段的第一個檔案就是start.c編譯後的內容,而start.c中的第一個函式就是 _start,所以 _start應該是放在text段的起始位置,因此說_start=TEXT_BASE也不為過。 5.  一直不明白的U-BOOT是怎樣從4Ksteppingstone跳到RAM中執行的,現在終於明白了。關鍵在於:               ldr   pc, _start_armboot _start_armboot:    .word start_armboot 這兩條語句,ldr       pc, _start_armboot指令把_start_armboot這個標籤的地方存放的內容(也即是start_armboot)移到PC暫存器裡面,start_armboot是一個函式地址,在編譯的時候給分配了一個絕對地址,所以上面語句實際上是完成了一個絕對地址的跳轉。而我一直不明白的為什麼在start.S裡面有很多BL,B跳轉語句都沒有跳出4Ksteppingstone,原因是他們都是相對於PC的便宜的跳轉,而不是絕對地址的跳轉。還有要補充一下LDR,MOV,LDR偽指令的區別。 LDR      R0,0x12345678   //把地址0x12345678存放的內容放到R0裡面 MOV    R0,#x                   //把立即數x放到R0裡面,x必須是一個8 bits的數移到偶數次得到的數。 LDR      R0,=0x12345678        //把立即數0x12345678放到R0裡面 6.  在移植u-boot-1.3.3以上版本的時候要注意:     在u-boot1.3.3及以上版本Makefile有一定的變化,使得對於24x0處理器從nand啟動的遇到問題。也就是網上有人說的:無法執行過lowlevel_init。其實這個問題是由於編譯器將我們自己新增的用於nandboot的子函式nand_read_ll放到了4K之後造成的(到這不理解的話,請仔細看看24x0處理器nandboot原理)。我是在執行失敗後,利用mini2440的4個LED除錯發現u-boot根本沒有完成自我拷貝,然後看了uboot根目錄下的System.map檔案就可知道原因。 解決辦法其實很簡單:
將__LIBS := $(subst $(obj),,$(LIBS)) $(subst $(obj),,$(LIBBOARD))
改為__LIBS := $(subst $(obj),,$(LIBBOARD)) $(subst $(obj),,$(LIBS)) 7.   然後說一下跳轉指令。ARM有兩種跳轉方式。1)mov pc <跳轉地址〉 這種向程式計數器PC直接寫跳轉地址,能在4GB連續空間內任意跳轉。 (2)通過B BL BLX BX可以完成在當前指令向前或者向後32MB的地址空間的跳轉(為什麼是32MB呢?暫存器是32位的,此時的值是24位有符號數,所以32MB)。 B是最簡單的跳轉指令。要注意的是,跳轉指令的實際值不是絕對地址,而是相對地址——是相對當前PC值的一個偏移量,它的值由彙編器計算得出。 BL非常常用。它在跳轉之前會在暫存器LR(R14)中儲存PC的當前內容。BL的經典用法如下:    bl NEXT  ; 跳轉到NEXT        ……     NEXT        ……        mov pc, lr   ; 從子程式返回。 二.開始上機移植:(紅色字型為新增的內容,藍色字型為修改的內容,下同) 給自己的開發板取名為qljt24401.       隨便找個目錄解壓u-boot$tar –xjvf u-boot-1.3.4.tar.gz2 2.       進入u-boot目錄修改Makefile (你要編譯u-boot那當然少不了配置啦) $cd u-boot-1.3.4 [[email protected] u-boot-1.3.4]$ vim Makefile  修改內容如下: __LIBS := $(subst $(obj),,$(LIBS)) $(subst $(obj),,$(LIBBOARD))
改為 __LIBS := $(subst $(obj),,$(LIBBOARD)) $(subst $(obj),,$(LIBS)) sbc2410x_config: unconfig @$(MKCONFIG) $(@:_config=) arm arm920t sbc2410x NULL s3c24x0 qljt2440_config : unconfig @$(MKCONFIG) $(@:_config=) arm arm920t qljt2440 qljt s3c24x0 /* 各項的意思如下:        qljt2440_config : 這個名字是將來你配置板子時候用到的名字,參見make qljt2440_config命令。 arm: CPU的架構(ARCH) arm920t: CPU的型別(CPU),其對應於cpu/arm920t子目錄。 qljt2440: 開發板的型號(BOARD),對應於board/qljt/qljt2440目錄。 qljt: 開發者/或經銷商(vender) s3c24x0: 片上系統(SOC)*/ 4. /board子目錄中建立自己的開發板qljt2440目錄 由於我在上一步板子的開發者/或經銷商(vender)中填了 qljt ,所以開發板qljt2440目錄一定要建在/board子目錄中的qljt目錄下,否則編譯會出錯。 [[email protected] u-boot-1.3.4]$ cd board [[email protected] board]$ mkdir qljt qljt/qljt2440 [[email protected] board]$ cp -arf sbc2410x/* qljt/qljt2440/ [[email protected] board]$ cd qljt/qljt2440/ [[email protected] qljt2440]$ mv sbc2410x.c qljt2440.c [[email protected] qljt2440]$ ls 可以看到下面這些檔案:        config.mk  flash.c  lowlevel_init.s   Makefile   qljt2440.c  u-boot.lds [[email protected] qljt2440]$ vim Makefile        COBJS := qljt2440.o flash.o 5.  include/configs/ 中建立開發板所需要的配置標頭檔案 [[email protected] qljt2440]$ cd ../../.. [[email protected] u-boot-1.3.4]$ cp include/configs/sbc2410x.h include/configs/qljt2440.h 6. 測試交叉編譯能否成功 (1)配置        [[email protected] u-boot-1.3.4]$ make qljt2440_config        Configure for qljt2440 board… (2)測試編譯        [[email protected] u-boot-1.3.4]$ make 詳細資訊如下: 編譯資訊最後兩行:        arm-linux-objcopy --gap-fill=0xff -O srec u-boot u-boot.srec arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin 到此交叉編譯成功。 三.開始針對自己的開發板移植 1.修改/cpu/arm920t/start.S 1.1 修改暫存器地址定義 #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)   
/* turn off the watchdog */
#if defined(CONFIG_S3C2400)
# define pWTCON        0x15300000
# define INTMSK        0x14400008    /* Interupt-Controller base addresses */
# define CLKDIVN    0x14800014    /* clock divisor register */
#else # define pWTCON        0x53000000     /*該地址用來遮蔽看門狗*/
# define INTMSK        0x4A000008    /* Interupt-Controller base addresses 該地址用來遮蔽中斷*/
# define INTSUBMSK    0x4A00001C  /*該地址用來遮蔽子中斷*/
# define CLKDIVN    0x4C000014    /* clock divisor register 該地址用來決定FCLKHCLKPCLK的比例
*/ #define CLK_CTL_BASE        0x4c000000  /* qljt S3C2440A.pdf中可以看出該暫存器是存放MpllUpllP254 */#if defined(CONFIG_S3C2440)       #define MDIV_405       0x7f << 12   /* qljt  參見P255表,同時要知道本開發板的Fin12MHz,需要的Fclk(也就 Mpll)405MHz*/#define PSDIV_405       0x21       /* qljt 同上,同時設定PDIVSDIV的值,PDIVSDIV參見S3C2440A.pdf*/
#endif
#endif 1.2  修改中斷禁止部分
  # if defined(CONFIG_S3C2410)
    ldr    r1, =0x7ff   //根據2410晶片手冊,INTSUBMSK11位可用,
                       //vivi也是0x7ff,不知為什麼UBoot一直沒改過來。但是由於晶片復位預設 //所有的終端都是被遮蔽的,所以這個不影響工作
    ldr    r0, =INTSUBMSK
    str    r1, [r0]
# endif
# if  defined(CONFIG_S3C2440)
    ldr    r1, =0x7fff   //根據2440晶片手冊,INTSUBMSK15位可用

    ldr    r0, =INTSUBMSK
    str    r1, [r0]
# endif 1.3 修改時鐘設定 /*時鐘控制邏輯單元能夠產生s3c2440需要的時鐘訊號,包括CPU使用的主頻FCLK,AHB匯流排使用的HCLK,APB匯流排裝置使用的PCLK2440裡面的兩個鎖相環(PLL),其中一個對應FCLKHCLKPCLK,另外一個對應UCLK(48MHz)*/ /*注意:AHPAPB匯流排的簡介參見“AHBAPB匯流排.doc */ /* FCLK:HCLK:PCLK = 1:4:8 */
    ldr    r0, =CLKDIVN
    mov    r1, #5
    str    r1, [r0]
/*這三條協處理器命令確實不知道什麼意思,在ATXJGYBC_ql.pdf中搜p15c1,只知道它們執行以後會把協處理器p15的暫存器c1的最高兩位置1,但c1的最高兩位是沒有意義啊,弄不懂它的真正意思
不過我卻知道這三條語句是從哪裡出來的,詳細請參考s3c2440datasheets3c2440datasheet中的R1_nFR1_iA.doc */
    mrc    p15, 0, r1, c1, c0, 0        /*read ctrl register   qljt*/    orr    r1, r1, #0xc0000000       /*Asynchronous  qljt 改變匯流排模式為非同步模式網上某位朋友說不知到在哪裡看到過 如果FCLKHCLK不同的話就要選擇這種模式的 */
    mcr    p15, 0, r1, c1, c0, 0      /*write ctrl register qljt*/#if defined(CONFIG_S3C2440)   // 2440的主頻可達533MHz,但聽說設到533MHz時系統 //很不穩定,不知是不是SDRAM和匯流排配置的影響,所以現在先設到//405MHz,以後在改進。)
    /*now, CPU clock is 405.00 Mhz   qljt*/
    mov    r1, #CLK_CTL_BASE    /* qljt*/    mov    r2, #MDIV_405                   /* mpll_405mhz    qljt*/    add    r2, r2, #PSDIV_405             /* mpll_405mhz    qljt*/    str    r2, [r1, #0x04]               /* MPLLCON qljt實際上是設定暫存器CLK_CTL_BASE+0x04=0x4c000004的值 */
#endif

#endif    /* CONFIG_S3C2400 || CONFIG_S3C2410|| CONFIG_S3C2440 */ 1.4 將從Flash啟動改成從NAND Flash啟動。(特別注意:這和2410的程式有不同,不可混用!!!是拷貝vivi的程式碼。)
將以下UBoot的重定向語句段:
@#if ndef         CONFIG_AT91RM9200 #if  0
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate:                /* relocate U-Boot to RAM        */
    adr    r0, _start        /* r0 <- current position of code   */
    ldr    r1, _TEXT_BASE        /* test if we run from flash or RAM */
    cmp     r0, r1                /* don't reloc during debug         */

相關推薦

UBOOT移植詳細 全面

一.預備知識: 1.       首先,U-Boot1.3.4還沒有支援s3c2440,移植仍是用2410的檔案稍作修改而成的。 2.       2440和2410的區別: 2440和2410的區別主要是2440的主頻更高,增加了攝像頭介面和AC‘

第一次使用Git上傳本地專案到github上,下載、安裝、上傳(詳細全面

我覺得學習github的人基本上已經快要脫離了小白的標籤,雖然我一直喜歡自稱為小白。對於程式設計師原來說應該都聽說過GitHub,GitHub有許多開源的的專案和一些前沿的技術。因為自己在第一次使用過Git和github時遇到過不少的坑,所以,想對第一次使用Gi

Matlab繪圖-詳細全面

Matlab繪圖 強大的繪圖功能是Matlab的特點之一,Matlab提供了一系列的繪圖函式,使用者不需要過多的考慮繪圖的細節,只需要給出一些基本引數就能得到所需圖形,這類函式稱為高層繪圖函式。此外,Matlab還提供了直接對圖形控制代碼進行操作的低層繪圖操作。這類操作將圖

Android系統架構的詳細解析——全面

Android 是Google開發的基於Linux平臺的開源手機作業系統。它包括作業系統、使用者介面和應用程式 —— 行動電話工作所需的全部軟體,而且不存在任何以往阻礙移動產業創新的專有權障礙。Android採用WebKit瀏覽器引擎,具備觸控式螢幕、高階圖形顯示和上網功能

2440超詳細uboot移植筆記(七)------去掉 "-pie"選項

你好!這裡是風箏的部落格,歡迎和我一起交流。 如果本篇部落格對您有幫助,或許可以在下方評論給我留個言。 此時uboot裡是存在“pie”選項的,比較麻煩,現在我們把它去掉: a.輸入命令:

Matlab繪圖-詳細全面(包含各種標示符的輸入方法)

Matlab繪圖 強大的繪圖功能是Matlab的特點之一,Matlab提供了一系列的繪圖函式,使用者不需要過多的考慮繪圖的細節,只需要給出一些基本引數就能得到所需圖形,這類函式稱為高層繪圖函式。此外,Matlab還提供了直接對圖形控制代碼進行操作的低層繪圖操作。這類操作將圖形的每個圖形元素(如座標軸、曲線、

HDU1542-Atlantis【離散化&線段樹&掃描線】個人認為全面的詳解

不同 橫線 高度 scanf style mage 上大 hdu 排序 剛上大一的時候見過這種題,感覺好牛逼哇,這都能算 如今已經不打了,不過適當寫寫題保持思維活躍度還是不錯的,又碰到這種題了,想把它弄出來 說實話,智商不夠,看了很多解析,花了4、5個小時才弄明白 網上好多

uboot裁剪詳細步驟

uboot 裁剪 1.uboot裁剪前準備在進行uboot裁剪前,我們需要準備對應板卡的uboot源碼,uboot交叉編譯工具,uboot編譯說明文檔和uboot鏡像燒錄文檔。建議在進行uboot裁剪前,先確認原先的uboot編譯生成的鏡像能在板卡上正常運行。 2.uboot裁剪2.1獲取對應板卡的配置文件u

[bug]cxf: cvc-complex-type.2.4.c: 通配符的匹配全面, 但無法找到元素 ' 'jaxws:server' 的聲明,問題處理

alt 運行 提示頁面 題解 src 配置信息 圖片 image 原因 問題原因: 未知,因個人環境不同,無法保證都適用 問題解決方法: 將cxf在spring的配置信息調整到最前方 原配置信息頭: 運行時錯誤提示: 調

第一節:FreeRTOS (MDK)系統移植 (詳細)

移植總結: 第一步準備素材:如何在官網上下載原始檔 第二步移植程式碼:包括兩步:①從原始碼中提需需要的檔案②將程式碼新增到工程中 第三步修改程式碼:最關鍵的一步使程式碼能夠執行起來。 移植例程程式碼DEMO https://download.csdn.net/download/z

uboot移植時原始碼的三種來源

要把uboot移植到自己的硬體平臺上來作為啟動程式碼啟動linux核心,首先要尋找合適的uboot原始碼作為藍本,在此基礎上進行修改以使其能支援自己的硬體平臺。 一般uboot原始碼主要有三種來源:uboot官方、soc官方、硬體開發板官方。 其移植難度依次減小。 1.uboot官方原始

20181102 Uboot移植

第一步 移植Uboot http://processors.wiki.ti.com/index.php/AM335x_U-Boot_User%27s_Guide(官方文件僅供參考,與實際編譯有出入,總體內容豐富,涵蓋了所有啟動方法的介紹,請詳細閱讀)。 在AM335x中,ROM程式碼充當引導

檔案包含姿勢 較詳細全面

https://chybeta.github.io/2017/10/08/php%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E/ 基本 相關函式 php中引發檔案包含漏洞的通常是以下四個函式: include()

剛哥的mysql5.6安裝總結,全面

0、解除安裝老版本MySQL 查詢並刪除mysql有關的檔案 find / -name mysql rm -rf 上邊查詢到的路徑,多個路徑用空格隔開 #或者下邊一條命令即可 find / -name mysql|xargs rm -rf 在安裝包存放目錄下執行

各種亂碼問題及原理,全面

一、編碼程序 【01編碼】——很久很久以前,為了表示二極體的通、分,我們引入的高電平、低電平,之後又引入的1、0編碼進行代替   【ASCII編碼】——很久以前,也就是上個世紀60年代,美國佬為了把計算機的“0101010”編碼與文字進行對應起來,制定了一套ASCII編碼方案。

資料整理——Oracle版本歷史(全面)(Releases and versions of Oracle Database)

資料來源: https://en.wikipedia.org/wiki/Oracle_Database Oracle Database Version Initial Release Version Initial Release Date

二..linux開發之uboot移植(二)——網路命令ping開發搭建使用&tftp伺服器的安裝&nfs網路伺服器的安裝

2018/01/05 19:48 - 網路命令搭建開發板uboot和虛擬機器ubuntu互相ping通記錄 1. uboot可以通過網路來傳輸檔案到開發

四.linux開發之uboot移植(四)——uboot初體驗記錄

一.X210官方uboot配置編譯實踐 將整個BSP打包檔案弄到linux的源生目錄中去解壓分析,不要在windows中的共享資料夾中解壓開。( 除非

五.linux開發之uboot移植(五)——uboot配置和編譯過程詳解

一.uboot主Makefile分析1 1、uboot version確定(Makefile的24-29行) Makefile程式碼部分 (1)uboo

十.linux開發之uboot移植(十)——uboot原始碼分析4-uboot的命令體系

一、uboot命令體系簡介 1、uboot命令體系實現程式碼在哪裡 uboot命令體系的實現程式碼在uboot/common/cmd_xxx.c中。有若干個.c檔案和命令體系有關。(還有command.c main.c也是和命令有關的)。 uboot實