2011-11-02 37 views
3

我正在使用嵌入式設備,其中內核映像存儲在閃存的/ dev/mtd4部分內。 我想在沒有Uboot的情況下更新這個內核。通過/ dev/mtd進行內核更新

這怎麼可能? 我試圖撥打:

echo ./kernel.bin > /dev/mtdblock4 

,但它不工作。下次啓動時,存儲的數據不會被識別爲內核。

+3

你可能想'cat'而不是'echo',例如'cat ./kernel.bin>/dev/mtdblock4' –

+0

當然可以。當我發現./kernel.bin sting寫在我的/ dev/mtd中時,我提到它。cat ./kernel.bin>/dev/mtdblock4完美無缺。 –

回答

5

它應該至少是cat kernel.bin > /dev/mtdblock4但這可能不會工作。

這取決於你的內核是如何加載的(什麼是引導程序)。

+0

它的工作原理。當我發現./kernel.bin字符串寫在我的/ dev/mtd中時,我提到了失敗。cat ./kernel.bin>/dev/mtdblock4完美無缺。 –

+1

我不得不-1 -1,對於基於NAND的設備(大多數),你必須在寫入之前擦除閃存;簡單地寫入它不會產生正確的結果。這裏的其他答案描述了正確的方法。 –

+0

這種擦除可能是設備驅動程序的工作。當你看到一個文件系統時,它是不相關的 –

8

,您應該使用mtdutils工具flashcp:

flashcp -v ./kernel.bin /dev/mtd4 

flashcp將採取擦除,寫作和驗證這些貓不會做的照顧。 請注意,它適用於字符驅動程序而不是塊驅動程序。 -v用於詳細操作

+0

在我的NAND閃存中,'flashcp'在'flash_eraseall' +'nandwrite -p'工作的時候破壞了我的rootfs。 - 也許我們應該關心工具描述「將數據複製到NOR閃存中」? –

4

我從來沒有使用過flashcp。我在哪裏可以得到它?我使用flash_erase或flash_eraseall然後nandwrite。如果您沒有這些實用程序,則可以獲取源碼here併爲您的目標構建它們。

要更新我的系統,我使用:

# /usr/bin/flash_erase /dev/mtd3 
# /usr/bin/nandwrite -m -p /dev/mtd3 /uImage 

這是NAND閃存?如果是這樣,我不認爲回聲或貓會爲你正確跳過壞塊。

0

要更新不同的mtd塊,我使用以下程序:

 
# flash_eraseall /dev/mtd3 
# dd if="kernel.bin" of=/dev/mtd3 bs=16k conv=sync 
0

我也有在那裏我更新內核圖像,並使用UBOOT的裝置。 我的工作流程是:

  • 我新的鏡像文件傳輸到設備tmp目錄
  • 我擦除閃存MTD目錄:

    flash_eraseall的/ dev/mtd3

  • 然後我從複製tmp到flash目錄(/ tmp/- >/dev/mtd3)

    flashcp/tmp/uImage/dev/mtd3

我希望這有助於 問候