U Boot在S3C2410上的移植

2021-04-14 00:49:22 字數 3777 閱讀 6763

摘 要:在嵌入式系統的開發中,首先移植乙個穩定且功能強大的

u-boot 對後續軟體的開發至關重要。本文將詳細介紹

u-boot 在

s3c2410 開發板上的移植與執行。

u-boot ;移植

引言

u-boot 是用於初始化目標板硬體,為嵌入式作業系統提供目標板硬體配置資訊,完成嵌入式作業系統裝載、引導和執行的韌體程式。它能夠將系統的軟硬體緊密銜接在一起。 s3c2410 是三星公司的一款基於arm920t核的嵌入式通用處理器。本文將詳細介紹 u-boot 在 s3c2410 開發板上的移植與執行。

u-boot簡介u-boot移植步驟

為了使 u-boot 支援新的開發板,一種簡便的做法是在 u-boot 已經支援的開發板中選擇一種和目標板接近的,並在其基礎上進行修改。**修改的步驟如下:

在 board 目錄下建立 **dk2410 目錄,新增 **dk2410.c 、 flash.c 、 memsetup.s 、 u-boot.lds 和 config.mk 等;

在 cpu 目錄下建立 arm920t 目錄,主要包含 start.s 、 interrupts.c 、 cpu.c 、 serial.c 和 speed.c 等檔案;

在 include/configs 目錄下新增 **dk2410.h ,它定義了全域性的巨集定義等;

修改 u-boot 根目錄下的 makefile 檔案:

**dk2410_config : unconfig@./mkconfig $(@:_config=) arm arm920t **dk2410

執行 make **dk2410_config ,如果沒有錯誤,就可以開始進行與硬體相關的**移植工作。由於這部分**與硬體緊密相關,所以要熟悉開發板的硬體配置,可參考各晶元的使用者手冊。

u-boot 啟動過程

u-boot 的啟動過程可以分成 3 個階段。首先在 flash 中執行匯程式設計序,將 flash 中的啟動**部分複製到 sdram 中,同時創造環境準備執行 c 程式;然後在 sdram 中執行,對硬體進行初始化;最後設定核心引數的標記列表,複製映象檔案,進入核心的入口函式。

程式首先在 flash 中執行 cpu 入口函式 /cpu/arm920t/start.s 。具體工作包括:設定異常的入口位址和異常處理函式;配置 pllcon 暫存器,確定系統的主頻;遮蔽看門狗和中斷;初始化 i/o 暫存器;關閉 mmu 功能;呼叫 /board/**dk2410 中的 memsetup.s ,初始化儲存器空間,設定重新整理頻率;將 u-boot 的內容複製到 sdram 中;設定堆疊的大小, ldr pc, _start_armboot 。

board/s 3c 2410 中 config.mk 檔案 (text_base = 0x 31f 00000) 用於設定程式編譯連線的起始位址,在程式中要特別注意與位址相關指令的使用。

當程式在 flash 中執行時,執行程式跳轉時必須要使用跳轉指令,而不能使用絕對位址的跳轉 ( 即直接對 pc 操作 ) 。如果使用絕對位址,那麼,程式的取指是相對於當前 pc 位置向前或者向後的 32mb 空間內,而不會跳入 sdram 中。

裝載模式下系統將執行 do_bootm_linux() 函式, 0x30008000 是核心在 sdram 中的起始位址; 0x30800000 是 ramdisk 在 sdram 中的起始位址; 0x40000 是核心在 flash 中的位置, 0x100000 是資料塊的大小; 0x140000 是 ramdisk 在 flash 中的位置, 0x440000 是資料塊的大小。系統呼叫 memcpy() 函式將核心從 flash 和 ramdisk 複製到 sdram 中,具體如下:

memcpy((void *)0x30008000, (void *)0x40000, 0x100000) ; // 複製資料塊

memcpy((void *)0x30800000, (void *)0x140000, 0x440000) ; // 複製資料塊

通常,將核心引數傳遞給 linux 作業系統有兩種方法:採用 struct param_struct 結構體或標記列表。本系統中採用了第二種方法。

乙個合法的標記列表開始於 atag_core ,結束於 atag_none 。 atag_core 可以為空,乙個空的 atag_core 的 size 欄位設為 「 2」 (0x00000002) 。 atag_none 的 size 字段必須設為 「 0」 。標記列表可以有任意多的標記 (tag) 。在嵌入式 linux 系統中,通常由 u-boot 設定的啟動引數有: atag_core 、 atag_mem 、 atag_cmdline 、 atag_ramdisk 、 atag_initrd 等。

在本系統中,傳遞引數時分別呼叫了以下 tag :

setup_start_tag(bd) ; // 標記列表開始

setup_memory_tags(bd); // 設定記憶體的起始位置和大小

setup_commandline_tag(bd, commandline); /*linux 核心在啟動時可以命令列引數的形式來接收資訊,利用這一點可以向核心提供那些核心不能檢測的硬體引數資訊,或者過載 (override) 核心檢測到的資訊,這裡 char *commandline "initrd=0x30800000,0x440000 root=/dev/ram init=/linuxrc console=ttys0" ; */

setup_ramdisk_tag(bd); // 表示核心解壓後 ramdisk 的大小

setup_initrd_tag(bd, initrd_start, initrd_end); // 設定 ramdisk 的大小和物理起始位址

setup_end_tag(bd); // 標記列表結束

其中 bd_t *bd = gd->bd 是指向 bd_t 結構體的指標,在該結構體中存放了關於開發板配置的基本資訊。標記列表應該放在核心解壓和 initrd 的 bootp 程式都不會覆蓋的記憶體區域,同時又不能和異常處理的入口位址相衝突。建議放在 ram 起始的 16k 大小處 , 在本系統中即為 0x30000100 處。

u-boot 呼叫 linux 核心的方法是直接跳轉到核心的第一條指令處,也即直接跳轉到 mem_start + 0x8000 位址處。在跳轉時,要滿足下列條件:

a) cpu 暫存器的設定: r0 = 0 ; r1 =機器型別 id ,本系統的機器型別 id = 193 。 r2 =啟動引數標記列表在 ram 中的起始基位址;

b) cpu 模式:必須禁止中斷 (irqs 和 fiqs) ; cpu 必須工作在 svc 模式;

c) cache 和 mmu 的設定: mmu 必須關閉;指令 cache 可以開啟也可以關閉;資料 cache 必須關閉。

系統採用下列**來進入核心函式:

thekernel = (void (*)(int, int))ntohl(hdr->ih_ep);

thekernel(0, bd->bi_arch_number); 其中, hdr 是 image_header_t 型別的結構體, hdr->ih_ep 指向核心的第一條指令位址,即 linux 作業系統下的 /kernel/arch/arm/boot/compressed/head.s 匯程式設計序。 thekernel() 函式呼叫應該不會返回,如果該呼叫返回,則說明出錯。

結語

本文總結介紹了 u-boot 在 s3c2410 上的移植,移植完成後, u-boot 能夠穩定地執行在開發板上,為後續的軟體開發打下較好的基礎。

VxWorks在S3C2410上的BSP設計

1 引言 vxworks是美國windriver公司設計開發的一款嵌入式實時作業系統。能支援多種微處理器 powerpc,x86,mips,arm,sparc等。它採用微核心結構,具有高可靠性 實時性 豐富的網路協議 良好的相容性以及可裁減性等特點,同時具有友好的使用者開發環境。其中vxworks很...

S3C2410讀寫Nand Flash分析

2009 01 15 16 51 321人閱讀 收藏舉報 s3c2410讀寫nand flash分析 一 結構分析 s3c2410處理器整合了8位nandflash控制器。目前市場上常見的8位nandflash有三星公司的k9f1208 k9f1g08 k9f2g08等。k9f1208 k9f1g0...

s3c2410的nand flash的驅動分析

以前都是把別人寫好的 直接拿過來用,而沒有去關心裡面到底怎麼實現的,昨晚對照著samsung 2410和k 9f1208的晶元資料把這些 讀了一遍,終於明白了對nand flash的操作一步步是怎麼實現的了。以下的這些 可以在vivi或者kernel裡面找到 對乙個nand flash的操作,總體上...