180 likes | 419 Views
BootLoader 實驗 . 實驗. 一.實驗目的 掌握在 BootLoder 增加一個功能的流程 瞭解 BootLoader 在嵌入式系統中的作用 二.實驗內容 向 BootLoder 增加一個功能模組. BootLoader 的撰寫. 使用 ADS (ARM Developer Suite) 編譯 提供親善的 IDE 界面及穩定的編譯器 以 C 語言及少量的組合語言寫作 完整簡單的原始碼方便進一步修改及發展. BootLoader 的介紹. 是在作業系統內核或用戶應用程式 執行之前執行的一段小程式 ARM 系統中重置時
E N D
實驗 • 一.實驗目的 • 掌握在BootLoder增加一個功能的流程 • 瞭解BootLoader在嵌入式系統中的作用 • 二.實驗內容 • 向BootLoder增加一個功能模組
BootLoader 的撰寫 • 使用 ADS (ARM Developer Suite) 編譯 • 提供親善的 IDE 界面及穩定的編譯器 • 以 C 語言及少量的組合語言寫作 • 完整簡單的原始碼方便進一步修改及發展
BootLoader的介紹 • 是在作業系統內核或用戶應用程式 • 執行之前執行的一段小程式 • ARM系統中重置時 • 都從位址0x00000000開始執行 • 依賴於硬體而實現的,特別是在嵌入式系統中 • 不同的硬體需求不同的bootloader • 大多數bootloader都包含兩種模式 • “啟動載入”模式 • “下載”模式
一般BootLoader的功用 • 初始化部份的電路 • CPU,SDRAM,Flash,UART,USB等等 • 整備快閃記憶體內的影像檔 • 清除快閃記憶體 • 存入影像檔 • 載入作業系統 • 從快閃記憶體轉存作業系統核心至 SDRAM • 傳送啟動參數及 CPU 代碼等資訊給核心 • 轉換系統控制權給作業系統核心
BootLoader的模式 • 啟動載入模式 • 這種模式也稱為“自主”模式 • 即bootloader從目的機上的某個Flash上將作業系統載入到RAM中執行 • 整個過程沒有用戶的介入 • 下載模式 • 在這種模式下,目的設備上的bootloader將通過串列埠或者網路連接或者其他通信手段從主機下載檔 • 先被bootloader保存到目的設備的RAM中 • 然後被bootloader寫到目的設備上的FLASH中
BootLoader的啟動階段 • Booloader分為兩個階段 • 階段1 • 用組合語言 • 初始化CPU及存儲設備 • 直接在FLASH中執行 • 階段2 • 一般用C語言來實現 • 一般的流程以及對硬體的一些驅動支援 • 這部分會被複製到RAM中執行
BootLoader的啟動步驟 • 階段1的步驟(以執行的先後順序) • 一些基本硬體的初始化工作 • 為載入鏡像2準備RAM空間(RAM足夠的情況下可以省略) • 把鏡像2複製到RAM空間 • 跳轉到鏡像2的入口點(一般是C入口點) • 階段2的步驟(以執行的先後順序) • 繼續初始化相關硬體和相關功能性函數 • 進入命令行模式,等待功能性命令的輸入來執行相應的功能 • 比如網路下載,啟動作業系統內核
BootLoader的功能介紹 • BootLoader的功能 • Please select function : • 0 : tftp download • 1 : Write Nand flash with download file • 2 : Updata Bootloader with download file • 3 : boot uClinux • 說明 • 功能1:利用TFTP網路傳輸程式,包括Linux內核和隻檔案系統 • 功能2:將下載的程式燒寫到NAND FLASH相應的分區中 • 功能3:bootloader的自我更新,bootloader主要保存在Nor Flash中 • 功能4:啟動Linux
bootloader的命令結構介紹 • struct { • void (*fun)(void); • char *tip; • }CmdTip[] = { • {tftp_down, "tftp download"}, • {NandWrite, "Write Nand flash with download file"}, • {UpdateBootLoader,"Updata Bootloader with download file"}, • {NandLoadRun, "boot linux"}, • {0, 0} • };
系統啟動程式SysInit.s • SysInit.s主要是實驗Bootloader的stage1階段的功能 • InitSystem • ldr r0,=WTCON ;watch dog disable • ldr r1,=0x0 • str r1,[r0] • ldr r0,=INTMSK • ldr r1,=0xffffffff ;all interrupt disable • str r1,[r0] • ldr r0,=INTSUBMSK • ldr r1,=0x3ff ;all sub interrupt disable • str r1,[r0] • ;To reduce PLL lock time, adjust the LOCKTIME register. • ldr r0,=LOCKTIME • ldr r1,=0xffffff • str r1,[r0] • ….
tftp下載功能 • void tftp_down(void) • { • printf("Now download file from net to 0x%x...\n", DOWNLOAD_ADDR); • eth_init(); //乙太網路硬體初始化 • arp_init(); • download_len=-1; • download_addr=DOWNLOAD_ADDR; • NetLoadFile(download_addr,LOCAL_IP_ADDR,0,0);//調用TFTP網路下載程式 • if ( download_len == -1 ) • printf("Tftp Download Aborted!\n"); • else • printf("\nReceived %x bytes success\n", download_len); • printf("TFTP Download Test OK\n"); • }
Nand Flash燒寫功能 void NandWrite(void) { InitNandFlash(); //初始化NAND FLASH WrFileToNF(); //將下載的程式寫入相應的NAND FLASH分區 DsNandFlash(); //disable nand flash interface }
Bootloader自我更新功能 • void UpdateBootLoader(void) • { • NorFlashInit(); //Nor Flash初始化 • NorFlashStatusRep(); //讀取Nor Flash的相關資訊 • if(support){ • if(download_len>0) • { • NorFlashProg(0x0,download_addr,download_len); • //進行BootLoader的更新 • } • }
啟動Linux功能 • 該功能主要由NandLoadRun()函數實驗,主要用來啟動Linux,並向Linux內核傳遞參數。 • 主要程式如下: void NandLoadRun(void) { InitNandFlash(); //初始化NAND FLASH LoadRun(); //裝載並啟動Linux }