<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>
  • 網站首頁 > 物聯資訊 > 技術分享

    【詳解】嵌入式開發中固件的燒錄方式

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    版本:v1.2

     

    Crifan Li

    摘要

    本文主要介紹了嵌入式開發過程中,將固件從PC端下載到開發板中的各種方式,主要包括NFS掛載,Nand Flash和Nor Flash,USB,RS232,網卡NIC等方式。

    [提示] 本文提供多種格式供: 在線閱讀 HTML HTMLs PDF CHM TXT RTF WEBHELP 下載(7zip壓縮包) HTML HTMLs PDF CHM TXT RTF WEBHELP

    HTML版本的在線地址為:

    http://www.crifan.com/files/doc/docbook/firmware_download/release/html/firmware_download.html

    有任何意見,建議,提交bug等,都歡迎去討論組發帖討論:

    http://www.crifan.com/bbs/categories/firmware_download/

    2013-12-15

    修訂歷史 修訂 1.2 2013-12-15 crl
    1. 通過Docbook發布
    2. 添加了xml:id,添加了一些細節提示
    修訂 1.0 2011-08-25 crl
    1. 解釋了嵌入式開發中的固件下載方式

    本文章遵從:署名-非商業性使用 2.5 中國大陸(CC BY-NC 2.5)


    目錄

    1. 背景介紹
    2. 名詞解釋
    2.1. 固件
    2.2. 燒寫
    2.3. 存儲介質
    2.4. USB Host和USB Device
    2.5. NIC
    3. 固件燒寫方式
    3.1. 開發前期或者開發過程中,固件的燒寫方式
    3.1.1. 不需要燒寫kernel和rootfs的方式
    3.1.2. 將kernel,rootfs,uboot等燒寫到存儲介質上的方式
    3.1.2.1. 一步到位:直接通過工具燒寫文件到對應存儲介質上
    3.1.2.1.1. Nor Flash
    3.1.2.1.2. Nand Flash
    3.1.2.2. 兩步到位:先寫到內存,再用uboot的命令寫到存儲介質上
    3.1.2.2.1. 如何把文件或數據下載到內存中
    3.1.2.2.1.1. USB
    3.1.2.2.1.2. RS232
    3.1.2.2.1.3. NIC/network
    3.1.2.2.1.4. SD/MMC
    3.1.2.2.1.5. JTAG == debug tool
    3.1.2.2.2. 如何把內存中的數據,寫入到對應存儲設備上
    3.1.2.2.2.1. Nand Flash
    3.1.2.2.2.2. Nor Flash
    3.1.2.2.2.3. USB
    3.1.2.2.2.4. SD/MMC
    3.2. 產品發布后:通過操作設備節點實現動態升級固件
    參考書目

    表格清單

    3.1. 嵌入式開發中固件燒錄的方式
    3.2. 將文件下載到Uboot中的方式
    3.3. 如何把Uboot的內存中數據寫入到存儲設備上

    第 1 章 背景介紹

    摘要

    目前在嵌入式開發中,經常要實現將對應的固件,燒寫到開發板中,然后開發板才能運行我們的程序。

    嵌入式開發,很多用的是Linux系統,也有用WinCE和其他系統,但此文只介紹Linux系統下面的情況。

    Linux系統中,多數為bootloader+ kernel + rootfs的模式。

    其中,所用的bootloader,多為uboot。負責初始化硬件和設置好軟件環境,

    然后加載kernel,運行kernel,kernel運行后,再去加載rootfs,之后就是你所看到的運行的Linux了。

    其中,在開發過程中,常常會遇到,需要把某個文件,比如U-boot.bin,uImage,rootfs等文件

    從PC上,下載到Uboot的SDRAM,即內存中,

    然后再用對應命令或工具,將數據寫入到某存儲介質中。

    其中,有時候也需要在發布產品之后,在系統運行的情況下,動態升級整個系統的固件的。

    此文就是主要探討,此嵌入式Linux中,開發過程中和產品發布后,相關的固件燒寫方式。

    第 2 章 名詞解釋

    目錄

    2.1. 固件
    2.2. 燒寫
    2.3. 存儲介質
    2.4. USB Host和USB Device
    2.5. NIC

    摘要

    2.1. 固件

    固件,firmware

    所謂固件,就是文件,固化在存儲介質上的文件,而文件,其實就是數據。

    嵌入式開發中,尤其是Linux開發,常見的方式是,從板子(個人用的是arm的板子)上啟動,會允許Uboot,然后Uboot去加載kernel內核,個人常用的kernel是uImage,然后Linux運行后,去加載根文件系統rootfs,個人常用到的yaffs2文件系統。

    前后系統運行所需要的文件,總的來說,就是這三個:

    • Uboot,比如u-boot.bin
    • Kernel,比如uImage
    • Rootfs,比如yaffs2.rootfs.arm

    而大家一直說的固件,在系統是Linux系統的情況下,常常就是指的是這些文件。

    2.2. 燒寫

    所謂燒寫,就是寫數據,把文件(固件/數據)寫到存儲介質(Nand Flash, Nor Flash等)上。

    而對于燒寫這個詞,說法很多,常見的有:

    燒寫=燒錄=flash=編程=program=programming

    下面另外提到的,更新固件,其實也指的是將新的固件燒寫進去,即所謂更新固件,更新系統。

    2.3. 存儲介質

    存儲介質,此處主要是指,嵌入式中存放firmware的地方,多數是Nor Flash加上Nand Flash的組合。其他的,也有單獨是Nor Flash,單獨是Nand Flash,單獨是SD/MMC卡等方式。

    2.4. USB Host和USB Device

    USB Host,即對于開發板來說,USB是Host端,所以,此時可以去插上一個U盤,對應的是USB Mass Storage的用法,所以,可以理解為:

    開發板是USB Host = USB Mass Storage =開發板可以外接 U盤

    而USB Device,即對于開發板來說,自己是作為USB的Device端。

    而USB Device端,相對于USB Host來說,也叫USB Slave端。

    此時的UBS Host就是PC端了,然后PC端連出一根USB線,接上開發板,然后開發板就是USB Device=USB Slave端了,就可以當做U盤用了。

    即:

    開發板是USB Slave = USB Device = 開發板自己是PC上的U盤。

    更多關于USB方面的基本概念和邏輯,可以參考:

    USB基礎知識概論

    2.5. NIC

    NIC,Network Interface Card,網絡接口卡,即網卡。

    NIC這個叫法,是之前在學習網絡方面的知識的時候,遇到的,覺得雖然有點拗口,但是意義表述很明確,所以此處才用此NIC來表示網卡的。

    第 3 章 固件燒寫方式

    目錄

    3.1. 開發前期或者開發過程中,固件的燒寫方式
    3.1.1. 不需要燒寫kernel和rootfs的方式
    3.1.2. 將kernel,rootfs,uboot等燒寫到存儲介質上的方式
    3.1.2.1. 一步到位:直接通過工具燒寫文件到對應存儲介質上
    3.1.2.1.1. Nor Flash
    3.1.2.1.2. Nand Flash
    3.1.2.2. 兩步到位:先寫到內存,再用uboot的命令寫到存儲介質上
    3.1.2.2.1. 如何把文件或數據下載到內存中
    3.1.2.2.1.1. USB
    3.1.2.2.1.2. RS232
    3.1.2.2.1.3. NIC/network
    3.1.2.2.1.4. SD/MMC
    3.1.2.2.1.5. JTAG == debug tool
    3.1.2.2.2. 如何把內存中的數據,寫入到對應存儲設備上
    3.1.2.2.2.1. Nand Flash
    3.1.2.2.2.2. Nor Flash
    3.1.2.2.2.3. USB
    3.1.2.2.2.4. SD/MMC
    3.2. 產品發布后:通過操作設備節點實現動態升級固件

    摘要

    固件開發方式,這里討論的主要有兩種。

    一種是開發過程中,產品發布之前,用到的一些方式。

    另外一種是,產品發布之后,產品已經運行了系統了,此時,如何在線動態地更新固件,實現系統升級的功能。

    先列出不同的分類:

    表 3.1. 嵌入式開發中固件燒錄的方式

    開發過程中,固件燒寫方式 不需要燒寫kernel和rootfs的方式 即直接通過tftp,nfs等方式掛在kernel和rootfs的方式 將kernel,rootfs,uboot等燒寫到存儲介質上的方式 一步到位的方式(直接通過工具燒寫文件到對應存儲介質上) 兩步到位的方式(先將數據先寫入到Uboot中,再用uboot中的命令把數據寫到存儲介質上) 產品發布后,動態升級系統的方式 即,通過讀寫對應的Linux下的設備節點,實現更新固件

    下面就詳細討論這兩種過程中所用到的固件升級方式。

    3.1. 開發前期或者開發過程中,固件的燒寫方式

    此處介紹的是,在開發過程中,如何實現固件更新,開發調試,根據是否一定要將新版的固件,燒寫到存儲介質上,可以分兩種:

    • 一種是不需要燒寫kernel和rootfs的方式;
    • 另外一種是,需要把新版本的固件,即uboot,kernel,rootfs,燒寫到存儲介質上的。

    3.1.1. 不需要燒寫kernel和rootfs的方式

    此種做法,在實際開發中,還是有一些人會用到的。

    其背景是,嵌入式開發中,相對普通上層軟件開發,每次新編譯出一個版本的軟件,都要很麻煩地燒錄到對應的存儲介質,比如Nor Flash上,然后給開發板上電,繼續開始調試開發,而不能像開發上層PC端軟件,在IDE中,編譯一下,點擊運行,即可看到最新結果。

    所以,嵌入式開發中,開發的效率顯得很低,其中一個方法,可以先對避開此問題,避免每次都要重新燒寫新編譯的程序的問題,那就是,對于新版本的kernel和rootfs,分別通過tftp或NFS掛在kernel,通過NFS掛在rootfs,的方式,重新編譯一個新版本的kernel或者是rootfs時,每次都不用重新燒寫,只需要把對應的文件,放到對應的tftp或者NFS的文件夾下面即可。

    此法詳細做法相關的部分內容,下面會涉及,故此處不做太多探討。而且真的詳細討論的話,超出了此文的范疇。

    此處,只是對于此法進行概要說明:

    1. 目標

      實現kernel通過tftp掛載,rootfs通過nfs掛載的方式,實現高效率的嵌入式開發

    2. 前提
      1. 硬件
        1. 開發板上有網卡
        2. 網卡已連接到一個路由或交換機,并且PC端,即提供tftp和nfs的服務器端,也連到此網絡,開發板和PC端,同屬于一個局域網段。
      2. 軟件
        1. PC端運行了tftp服務,新編譯的kernel文件,放在tftp的根目錄下
        2. PC端運行了nfs服務,所用的Linux內涵,也設置并啟用了對應的nfs服務,編譯好的rootfs,放在nfs服務的根目錄下。
    3. 如何操作
      1. uboot中,通過tftp mem_addr kernel_file的方式去加載內核
      2. 內核運行起來后,通過NFS去掛在rootfs
      3. 正常加載rootfs后,就可以像普通的Linux開發一樣,通過串口,輸入命令操作Linux了
    4. 優缺點
      • 優點

        免去了每次新編譯的kernel和rootfs,都要重新燒寫這一麻煩的事情

      • 缺點
        • 很明顯,如果開發中,涉及到對應的網絡驅動的調試等,內核的NFS服務的調試等,即本身所用到的網絡功能都是要調試的對象,那就不能用此法了
        • 另外,網絡加載文件的速度,一般都是不錯的,但是也不排除,有時候會受其他PC端某個網絡資源占用太多的程序的影響
        • 而網絡加載文件的穩定性,不同的環境,差異很大。多數情況下,都是很穩定的,但是也有人遇到各種原因,導致不穩定的,所以此時此法即使可用,但用起來也會很郁悶

    3.1.2. 將kernel,rootfs,uboot等燒寫到存儲介質上的方式

    需要將對應的文件,燒寫到存儲介質上,此時,有兩種方法:

    • 一種是一步到位的方式,即直接通過某工具將文件寫入到存儲介質上。
    • 另外一種是兩步到位的方式,先通過某種方式把文件下載到Uboot中,再通過Uboot中的命令,去把數據寫入到存儲介質上。

    3.1.2.1. 一步到位:直接通過工具燒寫文件到對應存儲介質上

    目前常見的存儲介質,主要有Nor Flash和Nand Flash,所以下面主要講解如何燒寫Nor Flash還是Nand Flash。

    另外,還有一些存儲介質是SD/MMC卡等,其燒寫數據,我用過的燒寫數據方式是,一種是在Uboot中,把下載到內存中的數據,寫入到SD/MMC卡中,或者在板子已經跑起來了Linux的環境下,把數據寫入到SD/MMC卡中。

    3.1.2.1.1. Nor Flash

    由于Nor Flash接口比較常見和通用,而且有專門的規范定義了對應的操作命令,所以,目前有很多工具,只要你板子上的Nor Flash是常見的Nor Flash,那么這些工具,多數都可以直接拿過來用,直接將文件燒寫到Nor Flash中。

    1. 目標

      通過某些工具,連接上開發板或直接接上對應的硬件芯片Nor Flash,直接通過工具燒寫文件到目標存儲介質(即對應的硬件芯片)上。即不需要開發板上面運行Uboot或者Linux系統。用工具直接操作即可。

    2. 前提
      • 硬件
        • 你所使用的Nor Flash,如果是那種通用的(其實大多數都是通用的),工具所支持的
        • 開發板具有對應的硬件接口,比如JTAG接口
        • 你自己有對應的硬件工具,比如JLink硬件
      • 軟件
        • 對應的軟件工具支持對應的Nor Flash芯片,比如J-Flash,支持很多種常見Nor Flash的燒寫
    3. 如何操作

      個人接觸比較多的是,Jlink硬件 + 軟件工具J-Flash ARM。其如何操作,參見:[4]

    3.1.2.1.2. Nand Flash

    由于Nand Flash沒有一個統一的規范,和本身操作起來就比較復雜,所以,雖然存在一些工具,可以支持直接燒寫Nand Flash,但是相對比較少,使用起來所要求的限制條件也比較多。

    此外,是有專門的Nand Flash的燒錄器的,一般叫做Nand Flash Programmer,直接將對應的文件,燒寫到對應的Nand Flash上的,不過個人沒怎么用過,不多解釋。

    3.1.2.2. 兩步到位:先寫到內存,再用uboot的命令寫到存儲介質上

    3.1.2.2.1. 如何把文件或數據下載到內存中

    下表簡單總結了,如何將數據通過硬件接口+相關軟件,下載到Uboot中的方式:

    表 3.2. 將文件下載到Uboot中的方式

    開發板上的硬件接口軟件協議相關軟件或Uboot中的命令說明 USB USB Host – USB Mass Storage
    Fatls usb 0
    fatload usb addr file

    USB cable
    Board has USB Host

    USB Slave/Device DNW

    USB cable
    Board has USB Slave

    RS232 Kermit/Ymodem loadb/loady RS232 Cable NIC Tftp tftp file

    network interface card
    Server has tftp service

    NFS NFS

    network interface card
    Server has NFS service
    Network cable
    switch

    SD/MMC SD/MMC
    Fatls mmc 0
    Fatload mmc 0 addr file
      JTAG JTAG IDE tool

    Hardware debug tool
    IDE support Load file into Memory


    下面,對每一種方式進行詳細的闡述:

    3.1.2.2.1.1. USB

    關于USB Host和USB Device,上面已經名詞解釋過了,此處不再贅述。

    現在很多開發板上,都有USB的Host和USB的Device的接口。

    所以,對應著,可以實現,外接U盤到開發板上,或者將開發板作為U盤連到PC上

    然后操作U盤,把文件拷貝到U盤里,實現對應的把文件數據傳輸到開發板上這一功能。

    1. USB Host = USB Mass Storage = U Disk

    1. 目標

      把插在開發板上的U盤中的文件,拷貝Uboot的內存中

    2. 前提
      • 硬件
        • 開發板上有USB Host芯片和接口

          以我這里的TQ2440的板子為例,用的CPU是三星的S3C2440,其中包含了一個OHCI的USB Host主控制器。

          板子上也有USB Host接口。

        • 自己有U盤
      • 軟件
        • Uboot中已經實現了USB Host Controller的驅動

          如果Uboot中沒有你的板子上的USB Host Controller的驅動的話,需要自己移植,甚至從頭實現的話,這個工作量和難度,還是不小的。

          以此處的S3C2440的驅動為例,此處已經把新的版本的Uboot中的相關代碼,移植到了TQ2440的1.1.6的uboot中,實現了對應的S3C2440的OHCI的驅動。

          相關過程和源碼,參考:[5]

        • U盤的文件系統是FAT格式的

          如果你的U盤是NTFS等其他格式,那么要重新格式化為FAT16/FAT32格式。

          當然,如果是其他的文件系統,比如ext2等,也是可以的,下面對應的命令就是ext2lsext2load了。

    3. 如何操作

      在Uboot中使用對應命令來操作U盤:

      1. usb rescan

        去初始化usb host。關于usb 子系統更多的相關的命令,可以通過

        help usb

        看到更多的幫助信息。

      2. fatls usb 0

        將你U盤的FAT文件系統中的文件列出來,以確保USB現在可以正常工作,和知道你當前U盤里面有哪些文件,此時應該可以看到你所要拷貝的文件,如果你是把文件放在根目錄的話。(一般都是把u-boot.bin等文件,放到U盤根目錄的)

      3. fatload usb 0 mem_addr file_name

        去將U盤中的文件file_name載入到內存中mem_addr的位置。

    2. USB Slave = USB Device

    1. 目標

      將PC端的文件,通過USB線,傳輸到作為USB Device端的開發板上的Uboot的內存中

    2. 前提
      • 硬件
        • 板子上有對應的USB Device功能的controller和對應的USB Device接口
      • 軟件
        • PC端已經安裝了對應的USB相關驅動
        • PC端需要有對應的DNW軟件
        • Uboot中實現了對應的命令

          以TQ2440為例,其中已經有了usb slave 相關功能和命令

    3. 如何操作

      具體的操作,相對比較麻煩,此處只列出主要步驟:

      1. 去Uboot端執行對應的usb slave命令

        以等待PC主機端傳輸文件

      2. 去PC端用DNW去傳輸文件

        USB Port -> Transmit -> 選擇要傳輸的文件

        然后對應的文件就可以傳輸到對應的Uboot中的內存中去了。

      更多的細節,如何操作,請參看TQ2440的手冊:[1]

      在此,免費為天嵌的TQ2440宣傳一句,其資料和相關文檔,做的是蠻不錯的,東西很全,很詳細,尤其適合初學者。

    3.1.2.2.1.2. RS232

    RS232的連接方式,是最常見的。

    即,開發板上有串口接口,然后接了根RS232線,連到PC端,然后PC端用一個串口終端程序,連接開發板,比如常見的Windows XP系統自帶的超級終端Hyper Terminal,功能強大的SecureCRT,以及Putty等等,都是不錯的串口工具。

    其中關于如何在Win7下面使用超級終端(Hyper Terminal),不了解的可以去參考:[11]

    1. Kermit

    Kermit是一種協議,廣泛使用的協議,用來傳輸文件和數據的協議,很早之前就有了此協議,所以現在很多地方都已實現和支持此協議。

    關于Kermit和Ymodem的詳情,去看我轉的帖子:[2]

    而關于Kermit,XModem,Ymodem和Zmodem之間的區別和聯系,可以去看:[6]

    1. 目標

      通過Kermit協議,將文件通過RS232接口傳送到Uboot的內存中

    2. 前提
      • 硬件
        • 開發板中有RS232接口,并且已連接到PC端
      • 軟件
        • Uboot中已經實現kermit協議的loadb命令

          這個,一般的uboot中都已實現。

          此處說一個詭異的事情,之前遇到過,即使help中沒有看到loadb的命令,但是實際也是支持loadb的,估計是uboot開發者,把此命令注釋掉了,但是實際kermit協議用途太廣泛,而uboot本身程序中早已經實現了,所以loadb還是已經在uboot中的了。

    3. 如何操作
      1. 在uboot中,輸入loadb
      2. 在PC端使用串口程序去傳送文件

        以windows XP下的串口工具超級終端為例:

        選擇Transfer ⇒ Send File ⇒ Protocol選擇Kermit,FileName選擇你所要傳送的文件->點擊確定即可。然后就是慢慢傳送文件了。

      至于文件數據傳輸后,放在uboot的內存中的哪個位置,是由你uboot中的環境變量loadaddr決定,我這里的是loadaddr=0x800000。

      當然,你也可以在執行loady的時候,后面加上你要的地址,比如:

      loadb 0x1000000

      Kermit協議,數據傳輸速度比較慢,我這里傳輸了個8MB的文件,大概要40分鐘左右的。

    2. Ymodem

    關于Ymodem協議,是從之前的Xmodem協議演化出來的,之后還有Zmodem。

    簡單的說就是,一個數據包大小為1KB的數據傳輸協議。

    更多的解釋,參見上面已經提到的[6]

    1. 目標

      通過Ymodem協議,將文件通過RS232接口傳送到Uboot的內存中

    2. 前提
      • 硬件
        • 開發板中有RS232接口,并且已連接到PC端
      • 軟件
        • Uboot中已經實現Ymodem協議的loady命令
    3. 如何操作
      1. 在uboot中,輸入loady
      2. 在PC端使用串口程序去傳送文件

      以windows XP下的串口工具超級終端為例:

      選擇Transfer ⇒ Send File ⇒ Protocol選擇Ymodem,FileName選擇你所要傳送的文件->點擊確定即可。然后就是慢慢傳送文件了。

    4. 示例
      Bootldr> loady
      ## Ready for binary (ymodem) download to 0x00800000 at 115200 bps...
      CCCxyzModem - CRC mode, 2(SOH)/8192(STX)/0(CAN) packets, 5 retries
      ## Total Size      = 0x00800000 = 8388608 Bytes
                                      
    3.1.2.2.1.3. NIC/network

    多數開發板上,也都帶有網卡接口,然后通過網線,連接到一個路由或者交換機上,另外一個PC也連接到此路由或交換機上,然后通過網線,將PC上的文件數據,傳輸到板子上。

    1. tftp

    1. 目標

      將文件通過tftp方式,從PC端,下載到Uboot的內存中

    2. 前提
      • 硬件
        • 硬件板子上有網卡
        • 板子通過網線連到路由或交換機上,PC也連到該路由或交換機上,共處同一個網段
      • 軟件
        • PC端設置好tftp服務

          關于PC端安裝了tftp服務(TFTP service),詳情可以參考:[7]

        • 安裝好tftp服務后,把對應的u-boot.bin等文件,放到tftp的根目錄下
        • Uboot中,首先肯定是已經實現了網卡驅動,以及添加了對應的tftp命令

          此兩個前提,一般開發板都已經具有此條件

    3. 如何操作

      在Uboot中,執行命令

      tftp mem_addr file_name

      就可以將文件file_name傳送到Uboot的內存地址mem_addr中了。

    4. 示例
      EmbedSky> tftp 0x30010000 u-boot.bin
      dm9000 i/o: 0x20000300, id: 0x90000a46 
      MAC: 0a:1b:2c:3d:4e:5f
      TFTP from server 192.168.1.101; our IP address is 192.168.1.120
      Filename 'u-boot.bin'.
      Load address: 0x30010000
      Loading: T ###############
      done
      Bytes transferred = 207396 (32a24 hex)
                                      

    2. NFS

    1. 目標

      將文件通過NFS命令,從PC端,通過網絡,傳送到Uboot的內存中去

    2. 前提
      • 硬件
        • 硬件板子上有網卡
        • 板子通過網線連到路由或交換機上,PC也連到該路由或交換機上,共處同一個網段
      • 軟件
        • PC端設置好NFS服務
        • Uboot中實現了網卡驅動和nfs命令
        • Uboot中設置好了ip地址,ip掩碼mask,網關gateway
    3. 如何操作

      Uboot中執行:

      nfs mem_addr IP:path/file
    4. 示例
      nfs 0x30008000 192.168.0.3:/home/nfs/uImage
                                      
    3.1.2.2.1.4. SD/MMC

    1. tftp

    1. 目標

      將文件從SD/MMC卡中,拷貝到Uboot的內存中

    2. 前提
      • 硬件
        • 開發板有SD/MMC的controller,有對應的SD/MMC插槽
        • 自己有SD或MMC卡
      • 軟件
        • Uboot中實現了對應的SD/MMC驅動及對應的命令

          關于uboot中,把新版本的mmc驅動,移植到舊的上,可以參考:[8]

        • SD/MMC卡是FAT文件系統

          當然,如果是其他的文件系統,比如ext2等,也是可以的,下面對應的命令就是ext2lsext2load了。

    3. 如何操作
      1. mmcinitmmc rescan

        即初始化mmc,舊版本的uboot的是mmcinit,新版本的uboot是mmc rescan

      2. fatls mmc 0

        將mmc卡中的文件列出來,確保mmc卡工作正常和知道里面有哪些文件

      3. fatload mmc 0 mem_addr file_name

        將mmc卡中的file_name文件拷貝到內存mem_addr處。

    4. 示例
      EmbedSky> mmcinit
      mmc: Probing for SDHC ...
      mmc: SD 2.0 or later card found
      trying to detect SD Card...
      Manufacturer: 0x02, OEM "TM"
      Product name: "SA04G", revision 0.5
      Serial number: 2621440179
      Manufacturing date: 7/2010
      CRC: 0x73, b0 = 1
      READ_BL_LEN=15, C_SIZE_MULT=0, C_SIZE=365
      size = 0
      SD Card detected RCA: 0x1234 type: SDHC
      EmbedSky> md 30000000
      30000000: 00000000 00000000 00000000 00000000 ................
      30000010: 00000000 00000000 00000000 00000000 ................
      。。。
      300000f0: 00000000 00000000 00000000 00000000 ................
      EmbedSky> fatls mmc 0
      512 nikon001.dsc 
      misc/
      dcim/
      194 error.html 
      
      2 file(s), 2 dir(s)
      
      EmbedSky> help fatload 
      fatload <interface> <dev[:part]> <addr> <filename> [bytes]
      - load binary file 'filename' from 'dev' on 'interface'
      to address 'addr' from dos filesystem
      
      EmbedSky> fatload mmc 0 30000000 error.html
      reading error.html
      
      194 bytes read
      EmbedSky> md 30000000
      30000000: 4d54483c 423c3e4c 3e59444f 6e6f7257 <HTML><BODY>Wron
      30000010: 50492067 7263733c 3e747069 646e6977 g IP<script>wind
      。。。
      300000f0: 00000000 00000000 00000000 00000000 ................
      EmbedSky>
                                      

      上述md(memory display)命令,只是為了顯示內存中的內容,用以表示,拷貝文件前后內存中數據的變化。

    3.1.2.2.1.5. JTAG == debug tool

    1. tftp

    1. 目標

      在開發板運行程序的情況下,比如Uboot中,通過debug工具,將文件下載到Uboot的內存中

    2. 前提
      • 硬件
        • 開發板上有JTAG等debug接口,連接上對應的Jlink等硬件
      • 軟件
        • 對應的debug 工具支持載入文件到內存的功能

          一般debug工具,都是IDE集成開發環境,對應的IDE里面會有對應的功能。

          比如ARM的RVDS,里面就有對應的load file到memory的功能。

    3. 如何操作

      在IDE工具中,找到對應的功能選項,然后把文件load載入到開發板的內存中,即可。

    3.1.2.2.2. 如何把內存中的數據,寫入到對應存儲設備上

    前面的操作,是把數據從外部傳輸到Uboot的內存中,接下來,就要把對應的數據,寫入到對應的存儲介質中去。

    常見的存儲介質以及Uboot中相關的命令,分類如下:

    表 3.3. 如何把Uboot的內存中數據寫入到存儲設備上

    存儲介質Uboot中相關命令說明 Nand Flash

    nand erase
    nand write

    先擦除才能再寫入數據 Nor Flash

    erase
    cp.b

    先擦除才能再寫入數據 USB usb write   SD/MMC mmc write  

    下面分別介紹,在Uboot中,對于每種存儲設備,如何用相關的命令,把數據寫入到對應存儲設備中。

    3.1.2.2.2.1. Nand Flash
    1. 目標

      把Uboot中內存中數據,寫入到Nand Flash中去

    2. 前提
      • 軟件
        • Uboot中,已經實現了nand erasenand write命令了
    3. 如何操作
      • nand erase

        需要先用nand的erase命令,去擦出對應的區域

      • nand write

        然后再用nand write,把內存中的數據,寫入到nand 中。

    3.1.2.2.2.2. Nor Flash

    關于Nor Flash,需要額外說明一些事情。

    本身Flash這個名詞,在存儲領域方面,包括了Nand Flash和Nor Flash。

    而由于Nor Flash出現最早,應用很廣泛,所以Uboot中,對于單獨說Flash這個詞,是指的是Nor Flash。

    所以,會有對應的命令:

    flinfo = Flash Info = Nor Flash Info

    而又由于Nor Flash的很多操作,很像SDRAM等設備,可以直接讀,(寫操作需要特定的命令),但是可以把Nor Flash的操作,兼容統一到cp拷貝這個命令中去。

    所以,很多時候,你會發現,好像沒有單獨的Nor Flash的讀寫的命令,其實是包含在了cp這個命令中了。

    另外,對于cp命令本身,其有三種方式:

    • cp.b單位為b=byte=字節的方式,去拷貝數據
    • cp.w單位為w=word=字的方式,去拷貝數據
    • cp.l單位為l=long=長整型的方式,去拷貝數據

    不過,對于eeprom,也有單獨的一套eeprom的命令的,比如eeprom write,用于將數據寫入到eeprom中去。

    1. 目標

      把Uboot中內存中數據,寫入到Nor Flash中去

    2. 前提
      • 軟件
        • Uboot中,已經實現了Nor flash 相關的命令了,包括erase和cp命令支持了Nor Flash了
    3. 如何操作

      在Uboot中,執行下列命令:

      • protect off

        只有在你當前需要重新寫入新數據的Nor Flash的Block是已經被寫保護的情況下,才需要此步驟去解除鎖定。

        一般情況下,都不需要此步驟的。

      • erase

        去擦出Nor Flash中的數據

      • cpeeprom write

        將內存中的數據,寫入到Nor Flash中。

    3.1.2.2.2.3. USB
    1. 目標

      將Uboot中的內存中的數據,寫入到USB設備中

    2. 前提
      • 軟件
        • Uboot中已經實現了對應的usb write命令
    3. 如何操作

      在Uboot中,執行下列命令:

      • usb write

        將對應的內存中的數據,寫入到Usb設備中。

    3.1.2.2.2.4. SD/MMC
    1. 目標

      將Uboot中的內存中的數據,寫入到SD/MMC設備中。

    2. 前提
      • 軟件
        • Uboot中已經實現了對應的mmc write命令
    3. 如何操作

      在Uboot中,執行下列命令:

      • mmc write

        將對應的內存中的數據,寫入到SD/MMC設備中。

    3.2. 產品發布后:通過操作設備節點實現動態升級固件

    除了開發過程中,去燒寫固件之外,在發布產品后,很多廠商,希望在系統運行的情況下,實時地,可以去更新對應的固件,比如kernel的uImage或者rootfs等,此時,多數系統,往往是不太容易這樣去升級的,不過還是有可能實現這樣的在線升級系統的。

    基本的思路是,在運行的Linux中,通過操作對應的設備節點,比如:

    1. 對于Nand Flash或者Nor Flash,通過MTD的工具,即mtd-util中的nandwrite等,操作/dev/mtdN將新的固件寫入進去

      具體實現方法,參見另外一篇文章:[9]

    2. 對于SD/MMC,通過操作/dev/mmc設備,將新的固件寫入進去

      以此實現在線升級固件。

      相關實現方式,參考:[10]

    參考書目

    [1] TQ2440開發板使用手冊

    [2] 【轉】xmodem與kermit協議

    [3] uboot 用 nfs 掛載 linux kernel 和 fs

    [4] 使用破解版的JLink實現對開發板上的外部Nor Flash的燒寫 + JLink V4.08k 下載地址

    [5] 【記錄】在TQ2440的uboot中添加SD/MMC支持 + 添加USB Mass Storage支持 + 解決fatls亂碼問題

    [6] 【整理】Kermit Xmodem Xmodem-1K Ymodem Ymodem-G Ymodem-1K Zmodem

    [7] 【已成功】Ubuntu 10.10下安裝TFTP的步驟 tftp-hpa版本

    [8] 【記錄】將Uboot 2011.06中mmc驅動移植到uboot 1.1.6的過程

    [9] 在Linux運行期間升級Linux系統(Uboot+kernel+Rootfs)

    [10] 【經驗記錄】Linux驅動中如何給SD/MMC卡加多個分區 How to add multi partition for SD/MMC card

    [11] 【整理】如何在Win7中安裝使用超級終端Hyper Terminal

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全