vivi系統引導程式的網路功能擴充套件

2021-04-13 08:02:52 字數 3429 閱讀 6209

摘要vivibootloadertftp協議 網路功能擴充套件

隨著嵌入式的發展,基於arm的系統越來越流行。在開發arm系統時,第一步就是要選擇一種合適的bootloader。目前網路上可得到的bootloader很多,一般幾十kb,所以除非要求把bootloader限制在幾kb以內,否則沒有必要自己去寫乙個bootloaderbootloader一般存放在flash中。當前主流的flash分為nor flash和nand flash。前者**比後者高出很多,而效能相差無幾。如果系統採用的是nand flash,那麼vivi可能會是乙個好的選擇。

1  u-bootvivi的比較

uboot是由armboot和ppcboot結合而組成的,因為其支援的面比較廣,功能強大,支援網路,因而被廣泛採用;但是它主要針對那些以nor flash 啟動的系統。nor flash可以直接被系統定址,整個flash都在系統的定址空間內,所以在其啟動時的彙編**中是直接把bootloader拷貝到ram中去的。如果系統採用的是便宜的nand flash,那麼它是不能直接被系統定址的,對它的讀寫需要專門的操作。此時採用uboot需要修改太多的**,而vivi則針對nand flash作了特別處理。

2vivi網路功能的擴充套件

arch/目錄存放的是平台相關的**,主要是系統啟動時的彙編**,vivi執行的第一程式head.s就是放在這裡。

include/存放的是系統的標頭檔案

driver/存放的是flash和串列埠等的讀寫操作程式

lib/提供了整個vivi所共用的庫函式

script/提供配置介面的程式

util/nand flash操作的相關程式

documention/ 檔案的說明

3  tftp協議簡介

tftp(trivial file transfer protocol)是一種傳輸檔案的簡單協議,是基於udp協議實現的。它有3種傳輸模式。這裡採用第二種「octet」,就是8位源資料型別。任何傳輸起自乙個讀取或寫入檔案的請求,這個請求也是連線請求。如果伺服器批准此請求,則伺服器開啟連線,資料以定長512位元組傳輸,每個資料報包括一塊資料,伺服器發出下乙個資料報以前必須得到客戶對上乙個資料報的確認。如果乙個資料報小於512位元組,則表示傳輸結束。所以最後乙個資料報為0~511位元組。如果資料報在傳輸過程中丟失,發出方會在超時後重新傳輸最後乙個未被確認的資料報。通訊的雙方都是資料的發出者與接收者,伺服器傳輸資料接收應答,另一方發出應答接收資料。大部分的錯誤會導致連線中斷。出錯後伺服器會發出乙個出錯資訊包,這個包不會被確認,也不會被重新傳送。

tftp支援5種型別的包:

①  read request(讀請求包)

②  write request(寫請求包)

讀/寫請求包格式為:

讀請求opcode(操作號)為1,寫請求opcode(操作號)為2;filename為要從伺服器上讀/寫的檔名;mode域指資料傳輸模式串一般為「octet」。

③  data(資料報)

資料報格式為:

資料報opcode(操作號)為3;block#(塊號)是從1開始的自然數;data域指資料長度,通常為512位元組,最後乙個包資料長為0~512位元組。

④  acknowledgment(確認包)

確認包格式為:

確認包opcode(操作號)為4;block#為收到的最後乙個正確包的塊號。

⑤  error(出錯資訊包)

出錯資訊包格式為:

出錯資訊opcode(操作號)為4;errorcode為出錯**;errmsg是伺服器給出的出錯資訊提示。

4  如何給vivi增加一條命令

vivi的命令介面是通過乙個結構體來實現的:

typedef struct user_command user_command_t;

其中:name是命令的名稱;(*cmdfunc)(int argc,const char**)是實現該命令的具體函式;*next_cmd是指向下一條命令的指標;helpstr是命令的使用說明。

user_command_t tftp_cmd=/t/t/t--get file form tftp server to ram/flash"

};圖1  tftp主程式流程

圖2  資料接收迴圈

cs8900讀寫程式的編寫可參考資料手冊。cs8900有兩種主要的訪問方式:一種是i/o空間;另一種是記憶體空間。前者系統把cs8900當成i/o口一樣訪問,所有的暫存器操作都是通過幾個指定的位址來完成;後者系統可直接定址其暫存器。前者是cs8900的預設工作方式, 這

裡也採用前者。 在呼叫傳送和接收程式之前, 首先呼叫eth_halt(),停止cs8900的收/髮器(如果不停止將無法進行初始化),然後eth_init()來初始化。初始化過程中會讀取晶元識別號,看是否為0x630e。若不為此值,則說明系統沒有找到cs8900晶元,然後設定mac位址,啟動收/髮器,禁止發出中斷訊號。這裡沒有用到中斷。因為用中斷不便於移植,所以在傳送完畢之後,直接呼叫eth_rx()接收即可。

cs8900傳送資料的流程如下:

①  設定為收到完整frame後開始傳送;

②  設定frame的長度,告訴給cs8900;

③  檢視cs8900是否已為frame分配好空間;

④  如果沒有分配好就返回等待;

⑤  如果已分配好空間,就把packter位址處的資料寫入cs8900中;

⑥  設定時間,等待frame 傳送完畢;

⑦  檢查傳送是否成功。

最後還需要修改include/platform下的**dk2410.h中的

#define vbwscon0x221ed112

#define vbankcon30x00007ffc

這樣可以使sc2410 可定址到cs8900。

結語

本文討論擴充套件vivi的一般方法,給vivi增加一條網路下的命令,使得vivi的功能更加完善,完全可以和uboot等著名引導程式相媲美。

參考文獻

[1]  cirrus logic cs8900a 資料手冊.

[2]  中國協議分析網. tftp協議簡介.

[3]  孫天澤,袁文菊,張海峰. 嵌入式設計及linux驅動開發指南. 北京:電子工業出版社,2005.

vivi系統引導程式的網路功能擴充套件

摘要vivibootloadertftp協議 網路功能擴充套件 隨著嵌入式的發展,基於arm的系統越來越流行。在開發arm系統時,第一步就是要選擇一種合適的bootloader。目前網路上可得到的bootloader很多,一般幾十kb,所以除非要求把bootloader限制在幾kb以內,否則沒有必要...

作業系統引導程式總體功能

當 pc 的電源開啟後,80x86 結構的cpu 將自動進入實模式,並從位址 0xffff0 開始自動執行程式 這個位址通常是 rom bios 中的位址。pc 機的 bios 將執行系統的某些硬體檢測和診斷功能,並在實體地址 0 處開始設定和初始化中斷向量。此後,它將可啟動裝置的第乙個扇區 磁碟引...

作業系統如何引導程式

1.使用者編寫完 後,通過編譯器將編譯為資料段 段 堆疊段 bss段,由鏈結器鏈結為裝入模組 2.使用者通知作業系統要執行的程式 3.作業系統根據路徑找到對應的程式,檢測程式的頭部,找到 段和資料段的位置 4.檔案系統根據這些段的位置找到對應的磁碟塊 5.作業系統建立程序 建立執行環境 並將要執行的...