天天看點

嵌入式系統燒寫uboot/bootloader/kernel的一般方法

嵌入式系統燒寫uboot/bootloader/kernel的一般方法

本文介紹了在嵌入式系統中燒寫uboot/bootloader/kernel 的一般方法,以及如果uboot或者核心出現錯誤,  www.2cto.com  

引導失敗等情況時如何重新燒寫uboot/kernel.

燒寫uboot/kernel的方式一般有兩種,一種是在linux本身(shell中),直接将uboot/kernel的影像檔案(二進制檔案)使用操作燒寫flash的指令燒寫到flash特定分區上,

例子如下:

//一,在linux的shell中燒寫uboot/kernel

mtd write指令是自定義的燒寫flash指令。

//燒寫uboot ,/dev/mtd0 是bootloader 的特定分區

 mtd write u-boot.bin /dev/mtd0 

//燒寫kernel, mtd1 是kernel的特定分區

mtd write vmlinux.elf /dev/mtd1

//重新開機

reboot 

//二,在uboot界面中燒寫uboot/kernel,以kernel為例子

//在bootloader 界面中

//本機uboot 的ip位址

setenv ipaddr 10.10.167.10

//伺服器ip位址

setenv serverip 10.10.167.249

//下載下傳linux核心vmlinux52

tftpboot 0 vmlinux52

// 燒寫到flash 上。

// 0x20000000 是vmlinux52的存貯位置。 

// +0x600000是檔案長度

upgrade 0x20000000 0x1dd00000 +0x600000

// 重新開機linux

bootoctliux

*************************************** **

如果因為uboot或者核心有錯誤而導緻啟動失敗,出現卡死狀态等,那麼需要判斷問題是出在uboot階段還是linux階段,這可以通過觀察啟動過程中的debug資訊來判斷,

如果uboot出現問題是比較麻煩的,因為這需要有一個裝有正确的uboot/bootloader的flash晶片作為引導,

将系統重新開機至uboot界面中,之後再重新燒寫uboot到系統本身的flash中,進而燒寫核心(如有必要)。 

一,重新燒寫uboot

首先需要一個特定的PCLL(flash晶片),這個PCLL上固化了一個正确的bootloader, 通過這個bootloader可以成功進入bootloader界面, 在此條件下重新燒寫uboot/bootloader。

使用此PLCC的步驟是:

在系統下電情況下, 使用跳線/撥碼開關等将此系統的啟動方式變從外部flash(即PLCC)引導,

之後将系統上電, 這時會從PLCC 啟動。

啟動成功後,進入uboot界面,  即指令行顯示Dream 5220# #(類似指令行提示符)

此時将版卡的啟動方式變為 從 nor flash 啟動。  之後重新燒寫uboot到此nor flash 上。  

再用 kermit  來操作。

Kermit是一個序列槽服務工具,類似與minicom ,功能比minicom 多。

//kermit/usb0.cfg  是kermit 的配置檔案, 在其中可以配置 /dev/ttyUSB0 等路徑

kermit -y kermit/usb0.cfg

-y kermit/usb0.cfg   指定配置檔案。

該檔案内容如下:

/*

set line /dev/ttyUSB0                                                                                                                

set speed 115200

set carrier-watch off 

set hardshake none

set flow-control none

robust

set file type bin 

set file name lit 

set rec pack 1000

set send pack 1000

set window 5

*/

将此檔案儲存在主目錄下, 命名為:kermit/usb0.cfg(可自定義)

執行後進入kermit 界面, 按 c 

進入 序列槽界面(就是裝置的界面)

切換回kermit 界面快捷鍵:Ctrl + \  , 之後再按 c  。

執行:

Dream 5220# # detect  

顯示:

Checking for NOR flash...

Flash detect 33554432Mb

這說明flash狀态良好。

//讓序列槽進入接受狀态。

Dream 5220# # loadb 

進入kermit 界面: ctrl + \  按 c

send  uboot.bin

就是将目前目錄下的uboot.bin 檔案發送給序列槽。

完成後,進入序列槽界面。

Dream 5220# # upgrade 0x20000000 0x1dc00000 +0xe0000

0x20000000 是 kermit 執行 send  後 将檔案send 到的預設位址。

再将檔案寫到nor flash 的首位址:0x1dc00000  +0xe0000為寫的長度。

執行:reset。讓系統重新開機。

至此,新的uboot燒寫完成,reset後, 如果還是不成功的話,那麼問題肯定出在linux的的啟動階段或者新的uboot還是有問題,這可以通過啟動過程中的debug資訊看出來

一,如果核心有問題,導緻linux沒有進入shell界面,要重新進入Uboot環境,就是在reset 之後,一直按 ctrl + c  ,這樣在uboot啟動完成後, 不會進入kernel的啟動階段,而是停留在uboot的指令行中,

在這個uboot 環境下,燒寫新核心, 配置ipaddr,serverip等,同最開始的例子中操作是一樣的。

// 在伺服器的tftpboot目錄下存在相應檔案,搭建到tftp服務環境

// 0x1dd00000 是系統核心的起始位置(每個裝置位置不同), 

在reset 之前,一般還要設定一下環境變量。

比如

setenv linux_args mtdparts=octeon_nor0:1m(BOOT),7m(LINUX),21m(CONFIG),3m(MD)

setenv bootcmd 'bootoctlinux 0x1dd00000 coremask=0x3 mem=700'

//儲存

saveenv

二 ,如果新燒寫的uboot本身有問題,那麼修改uboot代碼,編譯通過後, 使用PLCC重複上述燒寫過程。

繼續閱讀