<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

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

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接
    燒寫uboot/kernel
    
    本文介紹了在嵌入式系統中燒寫uboot/bootloader/kernel 的一般方法,以及如果uboot或者內核出現錯誤,
    引導失敗等情況時如何重新燒寫uboot/kernel.
    
    燒寫uboot/kernel的方式一般有兩種,一種是在linux本身(shell中),直接將uboot/kernel的影像文件(二進制文件)使用操作燒寫flash的命令燒寫到flash特定分區上,
    
    另一種是在uboot界面上,通過配置serverip,ipaddr,使用tftp命令下載uboot/kernel到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的存貯位置。 
    // 0x1dd00000 是系統內核的起始位置(每個設備位置不同), 
    // +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等,同最開始的例子中操作是一樣的。
    
    
    //本機uboot 的ip地址
    setenv ipaddr 10.10.167.10
    
    //服務器ip地址
    setenv serverip 10.10.167.249
    
    //下載linux內核vmlinux52
    // 在服務器的tftpboot目錄下存在相應文件,搭建到tftp服務環境
    tftpboot 0 vmlinux52
    
    // 燒寫到flash 上。
    // 0x20000000 是vmlinux52的存貯位置。 
    // 0x1dd00000 是系統內核的起始位置(每個設備位置不同), 
    // +0x600000是文件長度
    upgrade 0x20000000 0x1dd00000 +0x600000
    
    在reset 之前,一般還要設置一下環境變量。
    
    比如
    
    setenv linux_args mtdparts=octeon_nor0:1m(BOOT),7m(LINUX),21m(CONFIG),3m(MD)
    
    	setenv bootcmd 'bootoctlinux 0x1dd00000 coremask=0x3 mem=700'
    
    //保存
    saveenv
    
    bootoctliux
    
    
    二 ,如果新燒寫的uboot本身有問題,那么修改uboot代碼,編譯通過后, 使用PLCC重復上述燒寫過程。
    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全