2014年1月23日 星期四

用軟體產生 flash image。

一般來說,要得到 flash 的 image 檔,應該是把你要的資料先用軟體的方式寫進去。全部寫完之後,再把 flash 拿到燒錄機去,用燒錄機讀出來。

但是這過程中,如果板子上沒有 socket 那就要解焊,解焊當然也是有風險。而且像我自己不會弄就要求助於人。然後我們公司燒錄機都在硬體部門,就要去借用,還可能要排隊。

因此,如果能用軟體就產生這樣的 image 會比較方便。
要完成這樣的目的,需要幾個步驟:
  1. 先有要燒錄的資料的 binary 檔。(必需要是可以直接寫入的檔案,如果寫入過程還要處理的,就不適用了)
  2. 產生一個全部是 0xFF 的檔案。(因為 flash 裡面通常用 0xFF 當作空的狀態)
  3. 再把你的資料填入想要的位置。
第一點,就不多說了,你應該知道要怎麼得到。

第二點可以參考 如何產生都是 0xFF 的檔案

第三點就使用 dd 的 seek 參數。

假設,你有 2MB 的 flash,前 256KB 是 bootcode (假設檔名是:u-boot.bin),而後面 1792KB 是 Linux kernel (假設檔名是:linux.img)

這樣只需要利用:
~# awk 'BEGIN { while (1) printf("%c", 255) }' | dd of=flash.img bs=1K count=2048
~# dd if=u-boot.bin of=flash.img bs=1k conv=notrunc
~# dd if=linux.img of=flash.img bs=1k seek=256 conv=notrunc

應該就可以得到我們所需要的 flash.img

4 則留言:

  1. 您好,我參考您的方式來產生 0xff 的檔案,但不知道是不是 shell 環境的不同,同樣的指令我卻是產生 bfc3 的檔案,所以我又找了另外一篇
    https://www.linuxquestions.org/questions/linux-software-2/writing-0xff-with-the-dd-command-845232/
    不過我還不清楚為什麼 tr 要用 8 進制來表示,不過照這個方式確實是可以產生 0xFF 的檔案

    回覆刪除
    回覆
    1. 你會變成 bfc3 的原因,我不太清楚,我在現在的 Ubuntu 18.04 仍然是正常的。
      不過你找到的那篇方法也不錯。
      雖然我也不太了解 tr 為什麼要這樣用。

      刪除
    2. 不明白 tr 設計時為什麼要用八進制?但 man 裡面就說要用八進制…

      刪除
    3. 原來如此,是我漏看了,只看到後面一堆正規表示式的說明 :P
      BTW, 我的環境是 Ubuntu 14

      刪除