【正文】
另外一部分就是數(shù)據(jù)包收發(fā)所占用的緩存空間,這部分空間雖然對(duì)于網(wǎng)絡(luò)應(yīng)用算是小的了 ,但是對(duì)于 RAM 只有 32K 的 PIC單片機(jī)來(lái)說(shuō)是非常有限的,所以在配置的時(shí)候要是。 c) 此文件中實(shí)現(xiàn)了 LWIP 協(xié)議棧的入口程序,包括網(wǎng)卡的裝載以及協(xié)議棧的初始化 ,LWIP 支持多網(wǎng)卡,這里 RT73 無(wú)線網(wǎng)卡會(huì)裝載到 LWIP 的網(wǎng)卡鏈表中。 b) 網(wǎng)絡(luò)接口層 , LWIP 作者已實(shí)現(xiàn)了程序框架,只要進(jìn)行修改即可。 LWIP 協(xié)議棧的移植 LWIP 的作者已經(jīng)為移植提供了框架和接口,移植需要改動(dòng)以下的文件: a) 這個(gè)文件中實(shí)現(xiàn)了操作系統(tǒng)模擬層, LWIP 可以被配置為在 RTOS 中運(yùn)行,它內(nèi)部會(huì)有一個(gè)核心 TCP/IP 線程,這個(gè) TCP/IP 線程在沒(méi)有數(shù)據(jù)包收到時(shí)處于阻塞狀態(tài),一旦有數(shù)據(jù)包收到,此時(shí)網(wǎng)卡接口層會(huì)向 TCP/IP 線程發(fā)送數(shù)據(jù)包的指針, TCP/IP 線程接收到數(shù)據(jù)包指針開(kāi)始處理收到的數(shù)據(jù)幀。 根據(jù)系統(tǒng)的需要和系統(tǒng)資源的限制,對(duì) LWIP 進(jìn)行了裁剪和配置。 采用 RTOS 的缺點(diǎn)是 RTOS 本身就占用了一定的資源,所以 RTOS 一般用在資源相對(duì)豐富的嵌入式系統(tǒng)中。前后臺(tái)程序,中斷處理程序?yàn)榍芭_(tái)程序, main 函數(shù)中的循環(huán)為后臺(tái)程序,當(dāng)有數(shù)據(jù)中斷主循環(huán)時(shí),系統(tǒng)會(huì)跳至中斷程序中對(duì)中斷數(shù)據(jù)進(jìn)行處理,中斷程序會(huì)設(shè)置全局變量通知主循環(huán)中的函數(shù)對(duì)數(shù)據(jù)進(jìn)行處理,所以從數(shù)據(jù)中斷產(chǎn)生到對(duì)數(shù)據(jù)進(jìn)行處理之間有一個(gè)延遲,這個(gè)延遲決定于主循環(huán)的時(shí)間,如果主循環(huán)循環(huán)一次時(shí)間較長(zhǎng),或者有類似延時(shí)的阻塞代碼,此時(shí)響應(yīng)時(shí)間會(huì)大大增加 。 這 里并沒(méi)有進(jìn)行數(shù)據(jù)的拷貝,主要是效率的考慮,直接利用 USBIN 傳輸?shù)慕邮站彌_區(qū),所以在以太網(wǎng)幀封裝好后立即進(jìn)行 TCP/IP 層的處理。 當(dāng)收到 beacon 幀或 probe response 幀后,如果無(wú)線 網(wǎng)卡處于 SCAN 狀態(tài)下,會(huì)將處理后的 beacon 幀結(jié)果傳入 scan_callback 回調(diào)函數(shù)中,在這個(gè)回調(diào)函數(shù)中,單片機(jī)會(huì)發(fā)送 association 幀,最終會(huì)和無(wú)線 AP 建立鏈路層的連接。圖 是接收幀的 整體處理 流程 P r o t o c o l S t a c k _ 8 0 2 1 1處 理 接 收 幀 主 函 數(shù)判 斷 數(shù) 據(jù) 校 驗(yàn)i e e e 8 0 2 1 1 _ i n p u t實(shí) 際 的 幀 處 理 函 數(shù)O K數(shù) 據(jù) 幀 處 理 管 理 幀 處 理 控 制 幀 處 理 圖 處理程序根據(jù)不同的幀的類型轉(zhuǎn)到了不同的處理函數(shù)中 ,見(jiàn)圖 i e e e 8 0 2 1 1 _ i n p u t _ m g t管 理 幀 數(shù) 據(jù) 進(jìn) 入具 體 幀 類 型 的 判 定P r o b e r e s p o n s e幀B e a c o n 幀A s s o c i a t e r e s p o n s e 幀獲 取 A P 的 基 本 信息 , 加 密 模 式 , 支持 的 速 率 , B S S I D ,S S I D 等處 于 S C A N 狀 態(tài) ?S C A N 回 調(diào) 函 數(shù)是切 換 為 R U N 狀 態(tài) 圖 管理幀處理 進(jìn)入 ieee80211_input_mgt 處理后,首先根據(jù) subtype 域判定收到的幀狀態(tài),根據(jù) 本 科 畢 業(yè) 設(shè) 計(jì) 第 25 頁(yè) 共 47 頁(yè) 不同的幀狀態(tài)執(zhí)行不同的處理。 具體的接收流程如圖 : 等 待R T 7 3 初 始 化 ?8 0 2 . 1 1 協(xié) 議 棧 初 始 化 ?連 接 A P ?啟 動(dòng) 一 次 B U L K I N 傳 輸否是返 回 數(shù) 據(jù) 幀8 0 2 . 1 1 協(xié) 議 棧 處 理拷 貝 上 層 數(shù) 據(jù)完 成返 回 N A K 包沒(méi) 有 數(shù) 據(jù)發(fā) 送 I N 令 牌等 待 s o f 包得 到 數(shù) 據(jù)沒(méi) 有 數(shù) 據(jù)T C P / I P 上 層 處 理 圖 本 科 畢 業(yè) 設(shè) 計(jì) 第 24 頁(yè) 共 47 頁(yè) 當(dāng)經(jīng)過(guò) 協(xié)議棧處理后,如果是管理幀,則我們直接進(jìn)行管理幀的封裝然后發(fā)送出去進(jìn)行響應(yīng),當(dāng)是網(wǎng)絡(luò)數(shù)據(jù)包時(shí),需要將數(shù)據(jù)包暫存起來(lái)然后經(jīng)由 TCP/IP 層協(xié)議處理 。 c) 幀數(shù)據(jù)的接收 和數(shù)據(jù)幀的發(fā)送相比, 數(shù)據(jù)幀的接收 比較復(fù)雜,因?yàn)閿?shù)據(jù)幀的發(fā)送本質(zhì)上是異步的,當(dāng)有數(shù)據(jù)幀需要發(fā)送時(shí),隨即調(diào)用發(fā)送函數(shù)將數(shù)據(jù)幀發(fā)送出去,而數(shù)據(jù)幀的接收本質(zhì)是一個(gè)中斷的過(guò)程,而 USB 總線的特點(diǎn)是主機(jī)輪詢,所以當(dāng)有數(shù)據(jù)幀放入基帶芯片的緩沖區(qū)中時(shí), 基帶芯片不能主動(dòng)通知 PIC32,而需要 PIC32 主動(dòng)試探,當(dāng)沒(méi)有數(shù)據(jù)時(shí),基帶芯片返回 NAK 握手包,直到有數(shù)據(jù)才返回?cái)?shù)據(jù), 這樣 PIC32 的輪詢頻率就是一個(gè)關(guān)鍵的變量,輪詢的時(shí)間間隔不能過(guò)小,過(guò)小會(huì)導(dǎo)致 CPU 負(fù)荷較重,也不能間隔過(guò)大,過(guò)大會(huì)使數(shù)據(jù)通信延遲 變大 , 綜合考慮將 BULKIN,傳輸設(shè)置為 1ms 進(jìn)行一次, 也就是每次 sof包后立即進(jìn)行一次 BULKIN 傳輸。 將所有數(shù)據(jù)裝填好后,就可以調(diào)用 USB 發(fā)送函數(shù)發(fā)送數(shù)據(jù)了,真正的發(fā)送過(guò)程在中斷中啟動(dòng),并在中斷中確認(rèn)結(jié)束,這里可以選用兩種方案進(jìn)行 USB 發(fā)送過(guò)程, 一種是等待 USB發(fā)送過(guò)程的結(jié)束,一種是發(fā)送完畢后通知主程序。8 0 2 . 1 1 地 址 ;L L C 層 ;填 充r t 2 5 0 1 _ m a k e _ t x _ d es c r i p t o r發(fā) 送 描 述 符 填 充結(jié) 束r t 2 5 0 1 _ t x執(zhí) 行 B U L K O U T 傳 輸結(jié) 束( 回 調(diào) 函 數(shù) 可 選 ) 圖 程 上層封裝好的數(shù)據(jù)包一般是以太網(wǎng)數(shù)據(jù)包, 因?yàn)樯蠈右话闶且粋€(gè) TCP/IP 協(xié)議棧,故這里需要對(duì)以太網(wǎng)數(shù)據(jù)包進(jìn)行轉(zhuǎn)換, 首先需去掉以太網(wǎng)幀頭,只保留 IP 包數(shù)據(jù),然后根據(jù)此時(shí)連接的模式和網(wǎng)絡(luò)配置進(jìn)行對(duì) 幀頭的封裝, 幀頭比較重要的 本 科 畢 業(yè) 設(shè) 計(jì) 第 23 頁(yè) 共 47 頁(yè) 有兩個(gè)域,一是加密模式,因?yàn)榧用苣J降牟煌瑫?huì)影響許多域的設(shè)置,這里只實(shí)現(xiàn)了簡(jiǎn)單的無(wú)加密模式的封裝方式,二是地址域的裝填, addr1 裝填關(guān)聯(lián)到的路由的 MAC地址,addr2 裝填 RT73 無(wú)線網(wǎng)卡的 MAC 地址 (源地址 ), addr3 裝填以太幀中的目的地址。W E P 1 2 8 。 數(shù)據(jù) 幀發(fā)送的一般流程: 上 層 封 裝 好 的 數(shù) 據(jù)一 般 為 以 太 網(wǎng) 幀r t 2 5 0 1 _ s e n d執(zhí) 行 對(duì) 數(shù) 據(jù) 幀 的 封 裝是 否 已 連接 到 A P開(kāi) 始加 密 模 式 ?( 未 實(shí) 現(xiàn) )N O N E 。 b) 幀數(shù)據(jù)的發(fā)送 根據(jù) 幀的類型的不同,可以分為控制幀,管理幀,和數(shù)據(jù)幀,其中管理幀和數(shù)據(jù)幀是必須使用到的,所以驅(qū)動(dòng)程序必須實(shí)現(xiàn)對(duì)管理幀和數(shù)據(jù)幀的處理。 rt2501_switch_channel 進(jìn)行初步的信道選擇 ,不進(jìn)行此步驟也可以,這僅僅用來(lái)測(cè)試。 初 始 化 開(kāi) 始RT73SetupRT73SetupEEpromrt2501_switch_channelieee80211_init初 始 化 結(jié) 束 圖 單片機(jī)網(wǎng)卡初始化流程圖 本 科 畢 業(yè) 設(shè) 計(jì) 第 22 頁(yè) 共 47 頁(yè) RT73Setup 進(jìn)行 RT2571 基帶芯片本身初始化, 包括固件下載, 這里的固件是被放在一個(gè) const 型的數(shù)組中的,所以直接調(diào)用 此數(shù)組發(fā)送到 RT2571 芯片即可 ;等待基帶芯片正常運(yùn)行,通過(guò)反復(fù)檢測(cè)一個(gè)狀態(tài)寄存器進(jìn)行;初始化基帶芯片控制寄存器為默認(rèn)值。 默認(rèn)情況下,剛剛初始化完畢的驅(qū)動(dòng)程序處于 IDLE 狀態(tài) ,此時(shí)用戶發(fā)出一個(gè) SCAN 本 科 畢 業(yè) 設(shè) 計(jì) 第 21 頁(yè) 共 47 頁(yè) 指令,此時(shí) PIC32 會(huì)發(fā)出 probe requset 幀,無(wú)線 AP 收到 probe 幀后,會(huì)返回 probe response 幀, 當(dāng)收到 需要連接到的 AP 的 response 幀后, PIC32 會(huì)發(fā)出 association request 幀, 相應(yīng)的 AP 會(huì)發(fā)出 association response 幀, PIC32 收到 response 幀后轉(zhuǎn)為 CONNECTED 狀態(tài)。 RT73 無(wú)線網(wǎng)卡驅(qū)動(dòng)程序整體結(jié)構(gòu) : 整個(gè)軟件分為底層的 USB部分和 協(xié)議處理部分, USB 部分主要處理 RT73 無(wú)線網(wǎng)卡的初始化和 BULK 數(shù)據(jù)傳輸, 部分處理和整個(gè)協(xié)議相關(guān)的功能,主要有連接 AP和 封裝數(shù)據(jù)幀的功能。 b) 實(shí)現(xiàn) RT73 無(wú)線網(wǎng)卡基本數(shù)據(jù)幀的收發(fā)操作,對(duì)一些重要而根本的 幀進(jìn)行解析。 另外兩個(gè)核心的內(nèi)核線程 MLMEthread 和 CMDthread 主要是完成一些管理操作,這里不去深究,因?yàn)檎n題主要的目標(biāo)是實(shí)現(xiàn)底層的通信移植。 Urb 傳輸完畢后,內(nèi)核會(huì)調(diào)用 RTUSBBulkRxComplete 函數(shù),此函數(shù)會(huì)檢測(cè)此次 urb是否成功,然后重新裝載 tasklet。 接收數(shù)據(jù)流程: u s b _ r t u s b _ i n i t _ d e v i c e初 始 化 接 收 軟 中 斷 軟 中 斷 函 數(shù) : R T U S B B u l k R x H a n d l eR T U S B B u l k R x H a n d l e初 始 化 接 收 接 收在 系 統(tǒng) 空 閑 時(shí) , 安 全 的 運(yùn) 行R T U S B B u l k R x H a n d l e 函 數(shù)R T U S B B u l k R e c e i v e實(shí) 際 的 U S B I N 傳 輸設(shè) 置 接 收 回 調(diào) 函 數(shù)U S B I N 傳 輸 結(jié) 束R T U S B B u l k R x C o m p l e t e判 斷 此 次 U S B 傳 輸 成 功 與 否調(diào) 用 回 調(diào) 函 數(shù)R T U S B R x P a c k e t8 0 2 . 1 1 協(xié) 議 處 理 , 數(shù) 據(jù) 包 拷 貝到 上 層u r b 已 完 成調(diào) 用u r b 未 完 成調(diào) 用處 理 完 后 調(diào) 用t a s k l e t _ s c h e d u l e重 新 調(diào) 度 圖 接收數(shù)據(jù)流程圖 接收過(guò)程,采用了 tasklet 機(jī)制 ,這是 一種比較常見(jiàn)的機(jī)制,通常用于減少中斷處理的時(shí)間, 為了最大程度的避免中斷處理時(shí)間過(guò)長(zhǎng)而導(dǎo)致中斷丟失,有時(shí)候內(nèi)核需要把一些在中斷處理中不是非常 緊急的任務(wù)放在后面執(zhí)行,而讓中斷處理程序盡快返回 將本應(yīng)該是在中斷服務(wù)程序中完成的任務(wù)轉(zhuǎn)化成軟中斷完成。 DataByteCnt 域,指明數(shù)據(jù)幀的長(zhǎng)度。不過(guò)一般而言上層的 TCP/IP 協(xié)議可以設(shè)置網(wǎng)絡(luò)包最大長(zhǎng)度,所以可以將 TCP/IP 包最大長(zhǎng)度設(shè)置為一個(gè) 數(shù)據(jù)幀最大長(zhǎng)度之內(nèi),這樣就消除了數(shù)據(jù)分片的可 能性。 _TXD_STRUC 結(jié)構(gòu)體說(shuō)明了 RT73 發(fā)送描述符, RT73 發(fā)送描述符一共占用 6 個(gè)字節(jié),它處于整個(gè)發(fā)送幀的最前面。 這里比較重要的函數(shù)是 RTUSBHardTransmit 函數(shù),此函數(shù)完成了 幀頭,和RT73 發(fā)送描述符的封裝,也就是說(shuō)要搞清楚 RT73 無(wú)線網(wǎng)卡的工作原理,這個(gè)函數(shù)提供了詳細(xì)的信息 。 驅(qū)動(dòng)程序?qū)崿F(xiàn)了幾個(gè)發(fā)送隊(duì)列,當(dāng) 內(nèi)核調(diào)用網(wǎng)卡的發(fā)送函數(shù)后, 送入的 skb網(wǎng)絡(luò)數(shù)據(jù) 將被傳入不同的發(fā)送隊(duì)列,這里的發(fā)送函數(shù)本身是異步的,是可以被內(nèi)核重入的,也就是說(shuō)操作系統(tǒng)中運(yùn)行的不同函數(shù)有可能會(huì)“同時(shí)”調(diào)用發(fā)送函數(shù),所以這些由內(nèi)核發(fā)送來(lái)的 skb數(shù)據(jù)包就會(huì)安放在發(fā)送隊(duì)列里等待發(fā)送,由上流程圖可以看出,每次 skb 數(shù)據(jù)包放入發(fā)送隊(duì)列后,隨即調(diào)用出列函數(shù) RTMPDeQueuePacket,此函數(shù)除了直接被 RTMPSendPacket 函數(shù)調(diào)用外,還會(huì)被發(fā)送完成的 回調(diào) 函數(shù)調(diào)用, 來(lái)檢測(cè)是否有未發(fā)送完的數(shù)據(jù)。 Mlme 線程用于連接路由的操作,本身是一個(gè)復(fù)雜的狀態(tài)機(jī), Cmd 線程是命令隊(duì)列線程,這個(gè)線程會(huì)將用戶的操作轉(zhuǎn)換為命令發(fā)送到 Mlme 線程中,來(lái)改變網(wǎng)絡(luò)運(yùn)行狀態(tài)。 無(wú)論是發(fā)送和接收網(wǎng)卡驅(qū)動(dòng)都實(shí)現(xiàn)了一些數(shù)據(jù)結(jié)構(gòu)來(lái)維護(hù)需要發(fā)送的數(shù)據(jù),這樣可以保證數(shù)據(jù)發(fā)送的輕重緩急,更有效的進(jìn)行數(shù)據(jù)通信。 無(wú)線網(wǎng)卡的配置信息一般來(lái)自于用戶的配置文件,當(dāng)然也會(huì)有一些 默認(rèn)的配置。 課題關(guān)注的是網(wǎng)卡的初始化過(guò)程, 網(wǎng)卡的基帶芯片是一個(gè) 8051 核的微控制器,為了保證處理速度,網(wǎng)卡的內(nèi)置程序并沒(méi)有固化在基帶芯片中,而是需要在每一次上電后由 USB 的 Control 傳輸下載到 基帶芯片中的 SRAM 中,所以網(wǎng)卡初始化的第一步就是下載固化程序,而基帶芯片的工作狀態(tài)和配置信息都存放在特定的控制寄存器中,所以控制寄存器也是初始化的重點(diǎn)。 usb_rtusb_init_device 函數(shù)是 RT73 模塊真正的初始化過(guò)程,一些配置信息和核心線程都是在這個(gè)函數(shù)中實(shí)現(xiàn)的。 本 科 畢 業(yè) 設(shè) 計(jì) 第 17 頁(yè) 共 47 頁(yè) PRTMP_ADAPTER