




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
基于KSZ8081RNB網(wǎng)卡設(shè)備的驅(qū)動程序的開發(fā)設(shè)計目錄TOC\o"1-2"\h\u224671引言 1174071.1嵌入式系統(tǒng)概述 19771.2嵌入式Linux的發(fā)展方向與選型 2221401.3課題的背景及意義 323051.4論文主要內(nèi)容及安排 438582嵌入式開發(fā)環(huán)境的搭建 431852.1Linux硬件開發(fā)平臺 4277272.2Linux軟件開發(fā)環(huán)境 6288552.3本章總結(jié) 8132263驅(qū)動程序框架及工作原理 814703.1網(wǎng)絡(luò)驅(qū)動的工作原理 8236633.2KSZ8081概述 9226613.3KSZ8081驅(qū)動程序的框架描述 10284073.5KSZ8081驅(qū)動程序的加載 13107374基于KSZ8081的以太網(wǎng)程序設(shè)計 15252804.1硬件電路圖 1533424.2KSZ8081驅(qū)動程序編寫 1666865.總結(jié)與展望 23摘要:近幾年嵌入式Linux漸漸走入人們的視野,它不僅運行效率高,而且是開源的且內(nèi)核較小,網(wǎng)絡(luò)功能方面也很強大,逐漸在嵌入式系統(tǒng)以及服務(wù)器,網(wǎng)絡(luò)系統(tǒng)等方面得到了廣泛的運用。目前嵌入式系統(tǒng)的開發(fā)熱點就是掌握在Linux系統(tǒng)下的開發(fā)技術(shù),而目前開發(fā)的難點就在于Linux驅(qū)動程序的開發(fā)。本文主要研究了基于KSZ8081RNB網(wǎng)卡設(shè)備的驅(qū)動程序的開發(fā),并對Linux系統(tǒng)下網(wǎng)絡(luò)設(shè)備驅(qū)動程序的工作原理和運行過程進行了分析,并對嵌入式Linux系統(tǒng)中網(wǎng)絡(luò)設(shè)備驅(qū)動的開發(fā)進行了介紹,最終實現(xiàn)在Ubuntu系統(tǒng)下的KSZ8081RNB網(wǎng)卡驅(qū)動的編程。同時對KSZ8081的初始化、KSZ8081的打開與關(guān)閉函數(shù)、數(shù)據(jù)的傳送和數(shù)據(jù)的接收以及出現(xiàn)超時處理等相關(guān)過程進行了詳細分析。關(guān)鍵詞:Ubuntu系統(tǒng),嵌入式Linux,KSZ8081RNB,網(wǎng)絡(luò)設(shè)備,驅(qū)動程序1引言1.1嵌入式系統(tǒng)概述當前社會信息化飛速發(fā)展,嵌入式系統(tǒng)(EmbeddedSystem)逐漸涉及到我們生活中越來越多的方面,嵌入式系統(tǒng)顧名思義指的是一些設(shè)備被用于控制和監(jiān)測或協(xié)助裝置以及機器和工廠的操作等。由此我們不難看出嵌入式系統(tǒng)具有“嵌入性”、“專用性”和“計算機系統(tǒng)”等主要特征。它主要是把計算機技術(shù)當作工具、將應(yīng)用作為最終目標、實現(xiàn)軟件、硬件可進行裁剪,同時在功能、可靠性、功耗等方面有著更高要求的計算機系統(tǒng)。[1]通過了解嵌入式技術(shù)的發(fā)展史,不難發(fā)現(xiàn)它分為了三個時期,分別是單片機、微控制器以及片上系統(tǒng)。我們依次來介紹,單片微型計算機(SingleChipMicrocomputer),簡稱為單片機,在這個時期,由于大規(guī)模集成電路的流行,能夠?qū)崿F(xiàn)計算機的CPU、RAM和眾多的I/O接口都集成到一塊芯片上。然后是MCU(MicroControllerUnit),即微控制器,它能夠提供豐富的片上外設(shè)和接口,更加凸顯出其智能化控制的能力,成為了目前嵌入式系統(tǒng)應(yīng)用的主要選擇。但大部分時候,SCM和MCU一般都被稱為是“單片機”,因為它們是不會運行操作系統(tǒng)的在一般情況下,而且功能上也顯得較為單一。最后是片上系統(tǒng)SOC(SystemonaChip)它不僅可以大幅地減少電子產(chǎn)品的開發(fā)成本,還能將開發(fā)周期盡可能縮短,主要是因為它使用預(yù)訂制模塊IP(IntellectualProperty)進行集成電路的開發(fā),這使得產(chǎn)品在質(zhì)的上面有了一個提升。不僅超大規(guī)模集成電路的復(fù)雜功能能夠輕松實現(xiàn),還可以在芯片外部進行編程,全部功能系統(tǒng)的微電子產(chǎn)品也能實現(xiàn)集成在一個單芯片上。1.2嵌入式Linux的發(fā)展方向與選型1.2.1發(fā)展方向目前,嵌入式Linux系統(tǒng)開發(fā)得到了廣泛的關(guān)注,許多國內(nèi)外公司都爭先在做嵌入式Linux方面的研發(fā),但是嵌入式Linux面對日益增長的用戶市場需求,還有很長的路要走,如:加強Linux的實時性擴展改變Linux的內(nèi)核架構(gòu)完善Linux的集成開發(fā)環(huán)境1.2.2軟硬件的選擇嵌入式系統(tǒng)不僅涉及了系統(tǒng)硬件的選擇同樣軟件的選擇也一樣重要,因此選擇合適的軟硬件顯得非常重要。ARM系列的處理器被大規(guī)模用于控制、電子、網(wǎng)絡(luò)以及無線通訊等方面主要是因為其具有性能強、功耗小的特點。故硬件上本論文選用了I.MX6ULL開發(fā)板,該開發(fā)板是一款以Cortex-A7為架構(gòu)的開發(fā)板,該開發(fā)板搭載的資源非常豐富,通過郵票孔就引出了I.MX6ULL幾乎所有的資源,接口很多,基本可以應(yīng)對多種應(yīng)用的要求。I.MX6ULL核心板板載資源如下:CPU:采用MCIMX6Y2CVM05AB(工業(yè)級)或MCIMX6Y2CVM08AB(工業(yè)級),主頻為528MHz或800MHz,在實際使用過程中主頻頻率并不能達到800MHz只有792MHz,封裝采用了BGA289。DDR3:K4B4G1646E-BY(M),大小為512MB字節(jié)。EMMC:KLM8G1GET,8GB字節(jié)。郵票孔方式間距為1.0mm并引出了146個引腳。然后就是選擇合適的操作系統(tǒng),選擇一個合適的操作系統(tǒng)會在一定程度上降低產(chǎn)品開發(fā)、后期發(fā)布以及維護的難度,并且它必須支持你硬件的選型,目前嵌入式Linux操作系統(tǒng)有了飛速的發(fā)展,這離不開其源碼向大眾公開以及其強大的功能和便于移植等特點。[2]因此本論文選用了Ubuntu作為我們的操作系統(tǒng),因為Ubuntu有著良好的圖形界面和非常強大的ape-get功能,所以目前一般都是用Ubuntu來進行學(xué)習(xí)和開發(fā)。1.3課題的背景及意義從上述的介紹我們了解到,嵌入式技術(shù)已經(jīng)逐漸涉及到我們生活中越來越多的方面如:工業(yè)控制、消費電子、無線通訊等各個方面,而且目前嵌入式領(lǐng)域研發(fā)的焦點就是嵌入式系統(tǒng)驅(qū)動的開發(fā),如果能夠保證系統(tǒng)的相對穩(wěn)定,如何將設(shè)計的驅(qū)動程序變得更加簡化和穩(wěn)定仍然是嵌入式研發(fā)人員的工作重點。本論文的主要工作就是基于Ubuntu系統(tǒng)下的KSZ8081RNB網(wǎng)卡驅(qū)動程序的設(shè)計,操作系統(tǒng)中內(nèi)核提供的網(wǎng)卡驅(qū)動程序比較繁雜,而本文則設(shè)計了一個更加簡明的驅(qū)動程序并同時兼具穩(wěn)定、高速的數(shù)據(jù)傳輸,來給用戶帶來更加穩(wěn)定的網(wǎng)絡(luò)服務(wù)。1.4論文主要內(nèi)容及安排本文的目標旨在基于I.MX6ULL硬件開發(fā)平臺進行Ubuntu系統(tǒng)的研究,在系統(tǒng)硬件的基礎(chǔ)上完成Ubuntu操作系統(tǒng)的以太網(wǎng)驅(qū)動程序的開發(fā),通過編寫該驅(qū)動程序能夠?qū)崿F(xiàn)用戶數(shù)據(jù)包在網(wǎng)絡(luò)媒介上的發(fā)送和接收,該驅(qū)動程序不僅以特定的媒介訪問控制方式來進行上層協(xié)議傳遞過來的數(shù)據(jù)包的發(fā)送,還把接收到的數(shù)據(jù)包再次遞回到上層協(xié)議。因而能夠提供迅速穩(wěn)定的曝光數(shù)據(jù)的傳輸服務(wù),并為上層應(yīng)用提供穩(wěn)定高效的網(wǎng)絡(luò)傳輸服務(wù)。[3]本文對嵌入式系統(tǒng)的軟硬件平臺以及Linux軟件在開發(fā)過程中所需搭建的環(huán)境進行了相關(guān)闡述,重點闡述了KSZ8081RNB網(wǎng)卡的工作原理和驅(qū)動程序的介紹,著重對Ubuntu系統(tǒng)下以太網(wǎng)驅(qū)動程序的編寫進行了分析,并測試了以太網(wǎng)驅(qū)動程序的相關(guān)功能。章節(jié)安排如下:第一章主要對嵌入式系統(tǒng)的概念和發(fā)展前景以及面臨的問題,并對Ubuntu系統(tǒng)和硬件平臺及研究背景進行了簡單的介紹。第二章主要介紹了本次論文設(shè)計采用的硬件平臺和Linux開發(fā)環(huán)境如何搭建。第三章主要介紹了KSZ8081RNB網(wǎng)卡的工作原理以及其驅(qū)動程序的框架。第四章主要論述了Ubuntu系統(tǒng)下以太網(wǎng)驅(qū)動程序的編寫過程,重點介紹了KSZ8081RNB驅(qū)動程序的設(shè)計方法。第五章對本次設(shè)計進行相關(guān)的總結(jié),并對今后的工作進行了展望。2嵌入式開發(fā)環(huán)境的搭建2.1Linux硬件開發(fā)平臺本次設(shè)計的開發(fā)板采用了I.MX6ULL,它是一個基于Cortex-A7處理器的嵌入式硬件平臺。Cortex-A7處理器是一種能效較高的處理器,是根據(jù)ARMV7-A架構(gòu)搭建由ARM公司推出的可以實現(xiàn)單核多核的微控制器(MCU),制作工藝主要采用了28nm/40nm,主頻為800-1500MHz。該處理器能完美兼容其他的Cortex-A系列處理器的開發(fā)程序,Cortex-A7處理器可以說是Coetex-A15處理器的降階版,它的體系結(jié)構(gòu)和功能集基本都繼承了Cortex-A15,都采用了一系列全新的技術(shù)如虛擬化、大物理地址擴展(LPAE)NEON高級SIMD和AMBA4ACE一致性等。這使得它們在big.LITTLE配置中能夠配合工作,以此來完成高性能的疊加和低功耗的完美組合。差別在于,Cortex-A7處理器更加側(cè)重考慮了性能與功耗之間的平衡,故Cortex-A7處理器的微體系結(jié)構(gòu)能夠提供更好的能效。Cortex-A7處理器主要特性有以下幾個方面:兼具了調(diào)試廣泛的特性,能夠?qū)崿F(xiàn)對實時性要求比較高的應(yīng)用。集成了兩個獨立的外部總線,對多種存儲設(shè)備都兼容,范圍上更加廣泛,同時數(shù)據(jù)的存取也更穩(wěn)定。集成了L2高速緩存控制器,可以給1MB的高速緩存內(nèi)存提供較低的延遲及高帶寬的訪問。在硬件方面支持半精度、單精度及雙精度浮點運算的浮點操作。集成了常用總線的控制器,如CAN、LCD、OTG、JTAG、USB等,簡化了對外設(shè)的操作流程。本次設(shè)計的系統(tǒng)硬件結(jié)構(gòu)Cortex-A7處理器架構(gòu)圖如圖2.1所示。圖2.1Cortex-A7處理器架構(gòu)以ARM7為架構(gòu)的I.MX6ULL應(yīng)用處理器是NXP最新加入的實時處理產(chǎn)品,不僅能提供高性能處理還能優(yōu)化最低功耗。因此本論文選擇以Cortex-A7為架構(gòu)的I.MX6ULL開發(fā)板作為本次論文的硬件開發(fā)平臺。2.2Linux軟件開發(fā)環(huán)境想要在PC上開發(fā)嵌入式Linux軟件,PC就必須安裝Linux操作系統(tǒng),目前最新的Linux發(fā)行版本有Ubuntu21.04、UOSDesktophome20、Deepin20Beta、CentOS7.7等,基于Debian發(fā)行版和GNOME桌面環(huán)境的操作系統(tǒng)叫做Ubuntu系統(tǒng),但Ubuntu系統(tǒng)從11.04版開始,放棄了GNOME桌面環(huán)境,改成了Unity,直到Ubuntu18.04LTS之后,Ubuntu發(fā)行版又重新啟用了GNOME3桌面環(huán)境。Ubuntu系統(tǒng)主要是給用戶創(chuàng)造了一個相對自由的操作系統(tǒng)。[4]因此為了更加容易上手的開發(fā)驅(qū)動程序,本文選擇使用界面簡明、操作容易的Ubuntu系統(tǒng)來搭建Linux軟件的開發(fā)環(huán)境。我在PC上安裝使用的Ubuntu版本號為16.04,Ubuntu16.04版兼容amd64位x86系列、ARM系列和PowerPC系列處理器。安裝Ubuntu16.04的過程相對來說比較簡單,由于我們需要在Windows系統(tǒng)和Ubuntu系統(tǒng)之間傳遞文件,單獨安裝其中一個系統(tǒng)便比較麻煩,所以本文選擇在PC上安裝一個虛擬機軟件,我們可以在安裝的虛擬機軟件上裝載我們需要的系統(tǒng),由于這個軟件是虛擬出的PC,故不會影響我們原系統(tǒng)的使用,而通過VmwareWorkstation15.5Pro軟件的安裝,就可以直接引導(dǎo)Ubuntu16.04鏡像的安裝和啟動。Ubuntu16.04安裝好之后,我們?yōu)榱烁玫呐渲孟到y(tǒng)便需要從網(wǎng)絡(luò)下載一些必要的軟件包,這就需要修改一下系統(tǒng)的網(wǎng)絡(luò)參數(shù),來完成網(wǎng)絡(luò)的連通,我們找到“網(wǎng)絡(luò)適配器”選項,進入修改虛擬機的網(wǎng)絡(luò)配置信息,這里我們配置成“橋接模式”即可,接下來我們驗證一下網(wǎng)絡(luò)是否連通,我們可以打開Ubuntu系統(tǒng)的瀏覽器輸入某個網(wǎng)址進行聯(lián)網(wǎng)測試。網(wǎng)絡(luò)連通成功,我們還要單獨設(shè)置一下Ubuntu軟件源的地址,因為Ubuntu系統(tǒng)在全球各地都建有服務(wù)器站點,這讓全球各地的用戶下載軟件的速度有了保障,體驗感更佳。這里,本文選擇了中國的作為軟件源地址。軟件源選好后,我們就可以開始下載軟件了,首先為了Ubuntu系統(tǒng)使用起來更加方便,我們下載一下簡體中文語言包,點擊Ubuntu任務(wù)欄中SystemSetting下面的LanguageSupport,打開語言設(shè)置界面,首先會檢測到我們沒有安裝語言支持,我們選擇“install”進行安裝,安裝完成會自動打開語言支持界面,然后我們點擊“Install/RemoveLanguages..”按鈕,打開“安裝語言”界面,然后在里面找到“中文簡體”,點擊安裝就會自動下載和安裝簡體中文語言包,同時我們把地區(qū)改成漢語(中國),配置完相應(yīng)的信息,我們需要重啟系統(tǒng),這樣就把系統(tǒng)的語言改成了中文簡體。系統(tǒng)安裝好以后,我們?yōu)榱蓑?qū)動程序的編寫,就必要安裝編譯器,盡管Ubuntu系統(tǒng)默認自帶了gcc編譯器,但對于不同的架構(gòu),gcc并不能完全兼容,gcc編譯器只能編譯X86平臺下的Linux程序,我們學(xué)習(xí)的I.MX6ULL是ARM架構(gòu)的,所以我們就需要使用不僅支持ARM的編譯器并且這個編譯器在X86架構(gòu)下也能運行,我們通常把這種編譯器叫做交叉編譯器。為了簡化操作,我們?nèi)ゾW(wǎng)上下載一個已經(jīng)制作好的編譯器,根據(jù)本論文的需求,我采用了Linaro公司的ARM交叉編譯器作為本次項目的交叉編譯工具,我們把gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz的安裝包下載到本地進行安裝,首先我們在Ubuntu的用戶根目錄下建立一個新文件夾“tools”,用來保存一些開發(fā)用到的工具。然后使用SSH文件傳輸工具將ARM交叉編譯器傳輸?shù)轿覀儎偛旁赨buntu系統(tǒng)下創(chuàng)建的“tools”目錄下,然后打開系統(tǒng)終端輸入“sudomkdir/usr/local/arm”命令創(chuàng)建一個新目錄,然后復(fù)制剛才下載好的交叉編譯器安裝包到“/usr/local/arm”目錄下,然后進入到“/usr/local/arm”目錄下,在終端輸入:“sudotar-vxfgcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz”解壓ARM交叉編譯器,解壓完成后會生成一個名為“gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf”的文件夾,這就是我們要使用的交叉編譯工具,安裝完成后,需要設(shè)置交叉編譯工具的路徑,我們在終端輸入“sudovi/etc/profile”命令,在文件的最后輸入:“exportPATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin”修改一下環(huán)境變量,然后保存并退出,在終端輸入“reboot”命令重新啟動Ubuntu系統(tǒng),這樣交叉編譯環(huán)境就會自動生效。對開發(fā)板進行調(diào)試必須通過串口工具,所以我們還需要在Ubuntu系統(tǒng)上安裝一個串口工具,本文選擇CH340芯片實現(xiàn)了USB轉(zhuǎn)串口的功能,下載好安裝包,直接打開進行安裝,完成后使用USB線將開發(fā)板的串口同電腦連接起來,然后打開Windows系統(tǒng)下的設(shè)備管理器,點擊“設(shè)備管理器”選項,在設(shè)備管理器窗口展開“端口(COM和LPT)”,可以查看到CH340對應(yīng)的串口編號,這說明串口工具已經(jīng)配置成功。安裝好串口驅(qū)動,還需要安裝能夠連接調(diào)試開發(fā)板的軟件,本文采用了Hyperterminal這個軟件來連接開發(fā)板,并對開發(fā)板進行調(diào)試,利用網(wǎng)絡(luò)下載安裝包并直接打開安裝完成后,將開發(fā)板同電腦連接,接著我們看一下Hyperterminal的串口的屬性,我們選擇CH340,點擊選擇屬性,把端口設(shè)置改成115200,因為本文使用的開發(fā)板默認波特率是115200,流控選擇None,設(shè)置好之后我們就可以關(guān)掉電腦的設(shè)備管理器。然后進行一下測試,我們給開發(fā)板通電,如果連接成功,驅(qū)動也沒有問題的話,Hyperterminal便會打印出開發(fā)板的啟動信息。至此,PC和開發(fā)板就可以通過Hyperterminal這個軟件搭建起橋梁,方便我們?nèi)蘸蟮恼{(diào)試與學(xué)習(xí)。2.3本章總結(jié)本章主要對硬件的開發(fā)平臺以及Cortex-A7的架構(gòu)及特性進行了描述,著重分析了軟件開發(fā)環(huán)境如何搭建,特別是對交叉編譯工具如何修改變量及其他操作,開發(fā)環(huán)境的成功搭建為后續(xù)章節(jié)的開展和學(xué)習(xí)做好了鋪墊。3驅(qū)動程序框架及工作原理3.1網(wǎng)絡(luò)驅(qū)動的工作原理在網(wǎng)絡(luò)媒介上發(fā)送和接收用戶數(shù)據(jù)包的設(shè)備叫做網(wǎng)絡(luò)設(shè)備,它不僅以獨有的媒介訪問控制方式將上層協(xié)議傳遞過來的數(shù)據(jù)包發(fā)送出去,當其收到數(shù)據(jù)包后就會重新上傳回上層協(xié)議。Linux驅(qū)動分為字符設(shè)備和塊設(shè)備以及網(wǎng)絡(luò)設(shè)備但它們還是存在一些差別,例如網(wǎng)絡(luò)設(shè)備在/dev目錄下沒有相對應(yīng)的文件,完成設(shè)備接口使用的應(yīng)用程序為套接字(socket)。網(wǎng)卡設(shè)備驅(qū)動在Ubuntu系統(tǒng)下定義了四個層次,分別是網(wǎng)絡(luò)協(xié)議接口層、網(wǎng)絡(luò)設(shè)備接口層、設(shè)備驅(qū)動功能層和網(wǎng)絡(luò)設(shè)備與媒介層。[5]網(wǎng)卡設(shè)備驅(qū)動程序的體系結(jié)構(gòu)圖如下圖3.1所示,這四層的功能分別如下:網(wǎng)絡(luò)協(xié)議接口層是一個收發(fā)接口用于將數(shù)據(jù)包統(tǒng)一傳遞給網(wǎng)絡(luò)協(xié)議層,且不論是ARP或者IP等上層協(xié)議,通過函數(shù)dev_queue_xmit()都能順利完成發(fā)送數(shù)據(jù)的操作,并利用函數(shù)netif_rx()來截獲數(shù)據(jù)。網(wǎng)絡(luò)設(shè)備接口層是具體網(wǎng)絡(luò)設(shè)備及操作結(jié)構(gòu)體由協(xié)議接口層統(tǒng)一提供,該結(jié)構(gòu)體net_device放置了設(shè)備驅(qū)動功能層的各種函數(shù)。在實際操作中,網(wǎng)絡(luò)設(shè)備接口層往往已經(jīng)劃分出硬件設(shè)備驅(qū)動層的結(jié)構(gòu)的詳細操作。設(shè)備驅(qū)動功能層的相關(guān)函數(shù)是結(jié)構(gòu)體net_device的具體填充,該代碼能幫助硬件實現(xiàn)相關(guān)操作,啟動發(fā)送操作是利用hard_start_xmit()函數(shù)來進行的,接收操作是通過中斷觸發(fā)觸發(fā)的。網(wǎng)絡(luò)設(shè)備與媒介層是一個實體以此來實現(xiàn)數(shù)據(jù)包的收發(fā),其中有網(wǎng)絡(luò)適配器及傳輸媒介等,設(shè)備驅(qū)動功能層中的各種函數(shù)能夠?qū)崿F(xiàn)控制網(wǎng)絡(luò)適配器。故對Ubuntu系統(tǒng)來說,網(wǎng)絡(luò)設(shè)備以及媒介都是可以進行模擬的。圖3.1驅(qū)動程序結(jié)構(gòu)圖本文在以太網(wǎng)驅(qū)動程序具體設(shè)計時,主要任務(wù)就是編寫出net_device數(shù)據(jù)結(jié)構(gòu)下設(shè)備驅(qū)動功能層的各個函數(shù),最后將結(jié)構(gòu)體注冊編譯進內(nèi)核中。3.2KSZ8081概述本文采用的是KSZ8081RNB這個PHY芯片,該芯片利用其中一端與開發(fā)板的RGMI接口連通,另一端則與RJ45接口相連接,這樣就形成了一個自協(xié)商、速率在10M/100M的網(wǎng)卡。KSZ8081RNB是3.3V供電快速的集成的單一的以太網(wǎng)物理層收發(fā)器,KSZ8081RNB芯片符合規(guī)定的IEEE802.3規(guī)范,通過兩個差分對使用片上終止電阻和集成穩(wěn)壓器提供的1.2V的核心,以此來降低電路板成本,并簡化電路板的布局。在銅介質(zhì)方面,KSZ8081支持10BASE-T和100BASE-TX,實現(xiàn)傳輸和接收數(shù)據(jù)是利用標準CAT-5UTP,同時為了檢驗和指正直通和交叉電纜,故KSZ8081支持HPAutoMDI/MDI-X。在MAC處理器方面,KSZ8081MNX提供媒體獨立接口(MII),而本文采用的KSZ8081RNB提供的接口則是減少媒體獨立接口(RMII),兩者對與MII/RMII和兼容MII/RMII的以太網(wǎng)MAC處理器和交換機能實現(xiàn)直連。KSZ8081為了便于測試、產(chǎn)品的系統(tǒng)啟動及調(diào)試,還專門搭載了診斷功能。目前,以太網(wǎng)控制器往往都嵌入到嵌入式系統(tǒng)中,以達到提供媒體獨立接口和帶緩沖的DMA接口(BDI)的目的。[6]并且該控制器能在半雙工以及全雙工模式下使以太網(wǎng)連接速度達到10/100Mbps。控制器符合CSMA/CD協(xié)議是在半雙工模式下,那么符合IEEE802.3MAC的協(xié)議就是在全雙工模式下。KSZ8081芯片的原理框圖如圖3.2所示:圖3.2KSZ8081芯片原理圖3.3KSZ8081驅(qū)動程序的框架描述通過上述章節(jié)的分析,我們清楚了Ubuntu系統(tǒng)中網(wǎng)絡(luò)驅(qū)動程序結(jié)構(gòu)可分為四層,分別是網(wǎng)絡(luò)協(xié)議接口層、網(wǎng)絡(luò)設(shè)備接口層、提供實際功能的設(shè)備驅(qū)動功能層,以及網(wǎng)絡(luò)設(shè)備和網(wǎng)絡(luò)媒介層。由上層網(wǎng)絡(luò)設(shè)備接口層定義的net_device數(shù)據(jù)結(jié)構(gòu)體和底層硬件負責了以太網(wǎng)設(shè)備驅(qū)動的主要功能,最主要的函數(shù)就是數(shù)據(jù)的接收及發(fā)送函數(shù)。以太網(wǎng)驅(qū)動程序還包括兩個主要的數(shù)據(jù)結(jié)構(gòu),除了net_device以外,另一個就是sk_buff數(shù)據(jù)結(jié)構(gòu)。通過這個結(jié)構(gòu)體能夠?qū)崿F(xiàn)在不一樣的協(xié)議層TCP/IP之間,和以太網(wǎng)驅(qū)動程序之間完成數(shù)據(jù)包的傳遞,sk_buff結(jié)構(gòu)體主要包括五個方面,分別是傳輸層、網(wǎng)絡(luò)層、連接層需要的變量,決定數(shù)據(jù)區(qū)位置、大小的指針,和發(fā)送接收數(shù)據(jù)包所產(chǎn)生的具體設(shè)備信息等。在Ubuntu系統(tǒng)中sk_buffer被認為是一個起到?jīng)Q定作用的數(shù)據(jù)結(jié)構(gòu),該結(jié)構(gòu)起著很重要的作用在數(shù)據(jù)發(fā)送端以及接收端。該結(jié)構(gòu)是Ubuntu系統(tǒng)下的子系統(tǒng),主要負責管理數(shù)據(jù)的緩沖區(qū)。sk_buff結(jié)構(gòu)在一層層傳遞中時刻變化,并且貫穿系統(tǒng)的整個周期。當我們傳遞這些數(shù)據(jù)時,對應(yīng)的緩沖區(qū)將會被自動創(chuàng)建,然后將數(shù)據(jù)包從這個緩沖區(qū)復(fù)制到用戶的地址空間,不僅要復(fù)制數(shù)據(jù)包還要把他們的屬性也復(fù)制過去,并最終保存在sk_buff結(jié)構(gòu)當中。當我們處理需要的數(shù)據(jù)時,網(wǎng)絡(luò)協(xié)議棧不同層的各個協(xié)議頭信息將被輸入到數(shù)據(jù)包里由不同的協(xié)議層,sk_buff結(jié)構(gòu)中的指針會在這時被進行賦值,協(xié)議頭和賦值往往都是一一對應(yīng)的,這些數(shù)據(jù)在發(fā)到網(wǎng)絡(luò)上之前會先被發(fā)送到網(wǎng)絡(luò)適配器中,同時,sk_buff緩沖區(qū)就會得到釋放。在以太網(wǎng)驅(qū)動程序編寫中,首先我們需要判斷網(wǎng)絡(luò)設(shè)備存在與否,判斷方法就是通過檢測物理設(shè)備的硬件特征,然后才可以考慮是否啟動該設(shè)備。啟動網(wǎng)絡(luò)設(shè)備之后還需要進行相關(guān)資源的配置,最后初始化結(jié)構(gòu)體net_device,該網(wǎng)絡(luò)設(shè)備才能受操作系統(tǒng)驅(qū)動。對KSZ8081網(wǎng)卡驅(qū)動程序來說,首先需要利用內(nèi)核中的檢測函數(shù)來判斷是否安裝了網(wǎng)卡,如若網(wǎng)卡連接上就可以直接使用,那么函數(shù)就會主動找到網(wǎng)卡的參數(shù)。[7]不然,我們就需要先配置好網(wǎng)卡的參數(shù),再進行數(shù)據(jù)的傳輸,在內(nèi)核中調(diào)用發(fā)送函數(shù),將數(shù)據(jù)進行寫入,之后就可以激活發(fā)送函數(shù)。KSZ8081驅(qū)動程序的整體流程圖如下圖3.3所示:圖3.3驅(qū)動程序流程圖KSZ8081網(wǎng)卡驅(qū)動程序編程的重點就在于數(shù)據(jù)包的發(fā)送與接收,檢驗一個網(wǎng)卡的好壞就是看它能否處理好數(shù)據(jù)包發(fā)送和接收。中斷一般發(fā)生在網(wǎng)絡(luò)設(shè)備接收到數(shù)據(jù)后中斷,發(fā)生中斷后,中斷程序?qū)⑻崆吧暾埡脭?shù)據(jù)緩沖區(qū)來存放數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。當KSZ8081網(wǎng)卡在接收、發(fā)送數(shù)據(jù)包或出現(xiàn)報錯時,網(wǎng)卡將自動中斷并調(diào)用中斷函數(shù),分析中斷為何產(chǎn)生,并做出相應(yīng)處理。中斷函數(shù)的過程如圖3.4所示:圖3.4中斷流程圖3.5KSZ8081驅(qū)動程序的加載Ubuntu驅(qū)動程序一般有兩種方式加載:一是動態(tài)加載,即把驅(qū)動程序編譯成模塊的形式,網(wǎng)絡(luò)驅(qū)動程序模塊加載的動態(tài)命令是insmod,卸載的動態(tài)命令即rmmod;二是靜態(tài)編譯,即相對于動態(tài)加載而言,直接對內(nèi)核進行編譯的方式。Linux中獨有的技術(shù)動態(tài)加載使其內(nèi)核更便于拓展,故在設(shè)計設(shè)備驅(qū)動程序時使用動態(tài)加載相對來說更加簡單。而靜態(tài)編譯由于硬件的單一在嵌入式系統(tǒng)的外部設(shè)備中更容易獲得更高的效率。[8]根據(jù)上述分析,顯然動態(tài)模塊能夠更加簡單易操作,避免了重復(fù)編譯內(nèi)核的繁雜,故本文選擇了動態(tài)模塊加載方式,提高編程的效率。動態(tài)模塊的加載如圖3.5所示:圖3.5動態(tài)模塊加載網(wǎng)絡(luò)設(shè)備驅(qū)動程序的加載是從insmod命令開始,接著進行模式的初始化,這里需要利用入口函數(shù)init_module(),同時注冊網(wǎng)絡(luò)設(shè)備,這里要調(diào)用register_netdev()函數(shù)。如果注冊成功,我們就對網(wǎng)絡(luò)設(shè)備進行初始化,初始化函數(shù)是ksz8081_init,之后在dev_base鏈表的末尾插入net_device數(shù)據(jù)結(jié)構(gòu)即可。初始化完成后,打開網(wǎng)絡(luò)設(shè)備需要我們調(diào)用open函數(shù),實現(xiàn)對數(shù)據(jù)包的發(fā)送及接收。當我們想要卸載網(wǎng)絡(luò)模塊時,首先調(diào)用close函數(shù)來關(guān)閉此設(shè)備,然后通過rmmod命令調(diào)用內(nèi)核中的cleanup_module()模塊就可以卸載該網(wǎng)絡(luò)模塊。[9]4基于KSZ8081的以太網(wǎng)程序設(shè)計4.1硬件電路圖KSZ8081RNB的電路連接圖如圖4.1所示,其中讀寫信號為nWAIT,網(wǎng)卡重啟的信號是nRESET。連接以太網(wǎng)需通過HR9111005A接口,且網(wǎng)卡的輸入和輸出采用跳線的工作模式來決定。圖4.1KSZ8081電路圖4.2KSZ8081驅(qū)動程序編寫4.2.1驅(qū)動程序設(shè)計分析通過之前幾章的鋪墊和學(xué)習(xí),我們知道structdevice數(shù)據(jù)結(jié)構(gòu)的填充就是網(wǎng)絡(luò)設(shè)備編程的一個重要部分。在Ubuntu操作系統(tǒng)下,每一個structdevice都能一一對應(yīng)一個物理網(wǎng)絡(luò)設(shè)備。我們將device結(jié)構(gòu)聯(lián)成一張鏈表,讓指針dev_base指向該鏈表的表頭,我們就可以獲取每個接口的信息。[10]以太網(wǎng)驅(qū)動程序的編寫主要包括了網(wǎng)絡(luò)設(shè)備的注冊、初始化與注銷,還有數(shù)據(jù)的接收處理,并在數(shù)據(jù)傳輸出現(xiàn)故障、超時等特殊問題時做出相應(yīng)的判斷及處理辦法。目前來看,網(wǎng)絡(luò)設(shè)備的驅(qū)動已經(jīng)處理的非常成熟,我們完全可以根據(jù)自身的需要根據(jù)通用驅(qū)動進行適當?shù)母膶懀虼耍疚木帉慘SZ8081的網(wǎng)卡驅(qū)動程序就是對模板的填充和適當?shù)母膶懀幊滩襟E如下:填充KSZ8081的私有結(jié)構(gòu)體,該結(jié)構(gòu)體為board_info,它在內(nèi)核的驅(qū)動程序中包含了大量的信息。對KSZ8081網(wǎng)卡進行初始化,并將其注冊進系統(tǒng)的內(nèi)核。下面是具體涉及到的相關(guān)函數(shù)如圖4.2:圖4.2填充網(wǎng)絡(luò)設(shè)備的打開函數(shù)和關(guān)閉函數(shù),KSZ8081的驅(qū)動程序?qū)?yīng)的這三個函數(shù)如下圖4.3:圖4.3補充傳輸數(shù)據(jù)的函數(shù)和發(fā)送超時函數(shù),驅(qū)動中KSZ8081對應(yīng)的這兩個函數(shù)如圖4.4:圖4.4填寫中斷處理函數(shù)和接收數(shù)據(jù)函數(shù),對應(yīng)的函數(shù)如下圖4.5:圖4.5圖4.6是函數(shù)模板與KSZ8081具體實例的關(guān)系。圖4.6KSZ8081驅(qū)動設(shè)計模塊4.2.2初始化網(wǎng)絡(luò)設(shè)備的初始化需要從以下幾個方面來考慮。首先檢查網(wǎng)絡(luò)物理設(shè)備存在與否,若存在,則進行下一步檢測設(shè)備硬件資源。并為軟件接口做準備,對數(shù)據(jù)及指針進行賦值并分配net_device。得到設(shè)備的name、irq等信息并開始初始化各個值。硬件初始化工作進行的同時對net_device結(jié)構(gòu)體和數(shù)據(jù)進行賦值,根據(jù)硬件檢測的結(jié)果來填補net_device結(jié)構(gòu)體和數(shù)據(jù)。KSZ8081設(shè)備驅(qū)動初始化函數(shù)如下圖4.7所示:圖4.7初始化函數(shù)上圖代碼中的ksz8081_hw_init()函數(shù)就是硬件初始化操作的函數(shù)。首先還是要檢測KSZ8081網(wǎng)絡(luò)設(shè)備是否真實存在。接著檢測設(shè)備的具體硬件配置。提前向設(shè)備申請需要的硬件資源,比如申請I/O端口資源就可以使用request_region()函數(shù)來進行。4.2.3網(wǎng)卡驅(qū)動的開、關(guān)函數(shù)打開函數(shù)ksz8081_open()的需實現(xiàn)以下過程:能夠調(diào)用設(shè)備的硬件資源,為I/O注冊區(qū)域并能調(diào)用中斷等。調(diào)用函數(shù)netif_start_queue(),使設(shè)備處于激活狀態(tài)。關(guān)閉函數(shù)ksz8081_close需實現(xiàn)以下過程:調(diào)用函數(shù)netif_stop_queue(),暫停設(shè)備數(shù)據(jù)包的傳遞。釋出緩存占用的I/O區(qū)域并執(zhí)行中斷。Ubuntu內(nèi)核為我們提供了這兩個函數(shù)netif_start_queue()和netif_stop_queue()的原型:voidnetif_start_queue(structnet_device*dev);voidnetif_stop_queue(structnet_device*dev);KSZ8081網(wǎng)卡打開和釋放函數(shù)如下圖4.8所示:圖4.8打開和釋放函數(shù)圖4.9是打開函數(shù)的具體流程圖,圖4.10是關(guān)閉函數(shù)的具體流程圖。圖4.9打開函數(shù)流程圖圖4.10關(guān)閉函數(shù)流
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025光纖通訊供貨合同范本
- 2025二手房購房合同模板
- 學(xué)校聘用清潔工勞動協(xié)議
- 污水處理廠施工合同
- 多間店面出租合同
- 個人股份轉(zhuǎn)讓協(xié)議書
- 多媒體發(fā)布廣告合同
- 學(xué)校委托保潔公司托管合同
- 2025私人借款合同模板
- 2025設(shè)備租賃合同(1)設(shè)備租賃合同
- 國家糧食和物資儲備局招聘考試真題2024
- 部編版六年級語文下冊期中考試卷(有答案)
- 生物-華大新高考聯(lián)盟2025屆高三3月教學(xué)質(zhì)量測評試題+答案
- 【初中地理】《日本》課件-2024-2025學(xué)年湘教版初中地理七年級下冊
- 洛索洛芬鈉口服溶液-藥品臨床應(yīng)用解讀
- 演出經(jīng)紀人資格證常見試題及答案分析
- 2024年河北建投集團招聘工作人員考試真題
- 2025年湖北省八市高三(3月)聯(lián)考物理試卷(含答案詳解)
- 貴州國企招聘2024貴州磷化(集團)有限責任公司招聘89人筆試參考題庫附帶答案詳解
- 《哪吒電影產(chǎn)品的營銷問題及完善對策研究10000字》
- 與信仰對話 課件-2024年入團積極分子培訓(xùn)
評論
0/150
提交評論