利用mtd工具實現嵌入式設備在線升級
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
主要思路是:通過web post方式將升級文件交給CGI程序處理,然后通過mtd工具實現設備在線升級.
1.頁面部分
<form target="_blank" enctype="multipart/form-data" method="POST" action="./update.cgi">
<p>選擇升級文件:
<input type="file" value="" name="file">
<input type="submit" value="確認" name="savebasesetting">
</p>
</form>
這部分主要是將待升級的文件上傳給服務器(交給update.cgi)處理.
注意表單form屬性:
1必需的 action 屬性規定當提交表單時,向何處發送表單數據。
2 enctype屬性規定在發送到服務器之前應該如何對表單數據進行編碼。
值
描述
application/x-www-form-urlencoded
在發送前編碼所有字符(默認)
multipart/form-data
不對字符編碼。
text/plain
空格轉換為 "+" 加號,但不對特殊字符編碼。
3 method屬性規定如何發送表單數據(表單數據發送到 action 屬性所規定的頁面)。
表單數據可以作為 URL 變量(method="get")或者 HTTPpost (method="post")的方式來發送。
method屬性
瀏覽器使用method 屬性設置的方法將表單中的數據傳送給服務器進行處理。共有兩種方法:POST 方法和 GET 方法。
如果采用 POST 方法,瀏覽器將會按照下面兩步來發送數據。首先,瀏覽器將與 action 屬性中指定的表單處理服務器建立聯系,一旦建立連接之后,瀏覽器就會按分段傳輸的方法將數據發送給服務器。
在服務器端,一旦 POST 樣式的應用程序開始執行時,就應該從一個標志位置讀取參數,而一旦讀到參數,在應用程序能夠使用這些表單值以前,必須對這些參數進行解碼。用戶特定的服務器會明確指定應用程序應該如何接受這些參數。
另一種情況是采用 GET 方法,這時瀏覽器會與表單處理服務器建立連接,然后直接在一個傳輸步驟中發送所有的表單數據:瀏覽器會將數據直接附在表單的action URL 之后。這兩者之間用問號進行分隔。
一般瀏覽器通過上述任何一種方法都可以傳輸表單信息,而有些服務器只接受其中一種方法提供的數據。可以在<form> 標簽的 method (方法)屬性中指明表單處理服務器要用方法來處理數據,使 POST 還是 GET。
POST還是 GET?
如果表單處理服務器既支持 POST 方法又支持 GET 方法,那么你該選擇哪種方法呢?下面是有關這方面的一些規律:
· 如果希望獲得最佳表單傳輸性能,可以采用 GET 方法發送只有少數簡短字段的小表單。
· 一些服務器操作系統在處理可以立即傳遞給應用程序的命令行參數時,會限制其數目和長度,在這種情況下,對那些有許多字段或是很長的文本域的表單來說,就應該采用 POST 方法來發送。
· 如果你在編寫服務器端的表單處理應用程序方面經驗不足,應該選擇 GET 方法。如果采用 POST 方法,就要在讀取和解碼方法做些額外的工作,也許這并不很難,但是也許你不太愿意去處理這些問題。
· 如果安全性是個問題,那么我們建議選用 POST 方法。GET 方法將表單參數直接放在應用程序的 URL 中,這樣網絡窺探者可以很輕松地捕獲它們,還可以從服務器的日志文件中進行摘錄。如果參數中包含了信用卡帳號這樣的敏感信息,就會在不知不覺中危及用戶的安全。而 POST 應用程序就沒有安全方面的漏洞,在將參數作為單獨的事務傳輸給服務器進行處理時,至少還可以采用加密的方法。
· 如果想在表單之外調用服務器端的應用程序,而且包括向其傳遞參數的過程,就要采用 GET 方法,因為該方法允許把表單這樣的參數包括進來作為 URL 的一部分。而另一方面,使用 POST 樣式的應用程序卻希望在 URL 后還能有一個來自瀏覽器額外的傳輸過程,其中傳輸的內容不能作為傳統<a> 標簽的內容。
2 mtd工具介紹:
mtd-util,即mtd的utilities,是mtd相關的很多工具的總稱,包括常用的mtdinfo,flash_erase, flash_eraseall,nanddump, nandwrite等,每一個工具,基本上都對應著一個同文件名的C文件。
mtd-util,由mtd官方維護更新,開發這一套工具,目的是為了Linux的MTD層提供一系列工具,方便管理維護mtd分區。mtd工具對應的源碼,叫做mtd-utils,隨著時間更新,發布了很多版本。
Mtd 工具源碼下載: http://git.infradead.org/,
Mtd: 官方網站: http://git.infradead.org/,
3 升級前準備:
對flash 進行分區規劃,通過uboot將信息傳遞給kernel:
setenv bootargs 'mem=64Mconsole=ttyAMA0,115200 root=/dev/mtdblock3 rootfstype=cramfsmtdparts=hi_sfc:512k(boot),512k(bootargs),3M(kernel),13M(rootfs),13M(app),2M(config)'
分區的目前是便于管理,在升級時可以單獨升級rootfs,或者只升級App.等.
4.升級代碼
升級代碼主要分為4個部分.
1主要是獲取上傳文件的信息,如文件名,文件長度. 函數GetFileInfo()
2 主要是將上傳的文件保存至內存中.函數: SaveFileToLocal
3 主要是對上傳的文件進行crc校驗: TestCrc,針對的是cramfs文件系統
4利用mtd工具進行升級:
源文件:
5升級注意事項:
1 由于用的是boa web服務器,上傳時臨時文件會用到目錄/tmp,所以必須保證這個目錄是可以讀寫的.由于cramfs是只讀文件系統.所以可以采用把/tmp設置為tmpfs文件系統.(相當于內存).
設置/etc/fstab文件
tmpfs /tmp tmpfs size=16m
2 重新分區后,每次啟動需要掛載,所以可以在rcS文件中添加
mount -t cramfs /dev/mtdblock4/opt
mount -t jffs2 /dev/mtdblock5/mnt/nand
3升級時間有時會過長,導致web頁面無法正常返回.可以修改boa.conf,及defines.h
#define REQUEST_TIMEOUT 60
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成