利用mtd工具實現嵌入式設備在線升級

 

目錄(?)[+]web

 

主要思路是:經過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">app

</p>函數

</form>工具

 

這部分主要是將待升級的文件上傳給服務器(交給update.cgi)處理.post

注意表單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

相關文章
相關標籤/搜索