




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第第7章章 嵌入式系統網絡接口嵌入式系統網絡接口7.1 以太網接口以太網接口n嵌入式系統通常使用的以太網協議是IEEE802.3標準。從硬件的角度看,802.3模型層間結構如圖7.1.1所示,以太網接口電路主要由媒質接入控制MAC控制器和物理層接口(Physical Layer,PHY)兩大部分構成。圖7.1.1 802.3模型層間結構n1傳輸編碼傳輸編碼n在802.3版本的標準中,沒有采用直接的二進制編碼(即用0V表示“0”,用5V表示“1”),而是采用曼徹斯特編碼(Manchester Encoding)或者差分曼徹斯特編碼(Differential Manchester Encoding
2、),不同編碼形式如圖7.1.2所示。圖7.1.2 不同編碼形式n其中:曼徹斯特編碼的規律是:每位中間有一個電平跳變,從高到低的跳變表示為“0”,從低到高的跳變表示為“1”。n差分曼徹斯特編碼的規律是:每位的中間也有一個電平跳變,但不用這個跳變來表示數據,而是利用每個碼元開始時有無跳變來表示“0”或“1”,有跳變表示“0”,無跳變表示“1”。n曼徹斯特編碼和差分曼徹斯特編碼相比,前者編碼簡單,后者能提供更好的噪聲抑制性能。在802.3系統中,采用曼徹斯特編碼,其高電平為+0.85V,低電平信號為-0.85V,這樣指令信號電壓仍然是0V。n2802.3Mac層的幀層的幀n802.3 Mac層的以太
3、網的物理傳輸幀如表7.1.1所示。n表7.1.1 802.3幀的格式n PR:同步位,用于收發雙方的時鐘同步,同時也指明了傳輸的速率,是56位的的二進制數101010101010,最后2位是10。 SD:分隔位,表示下面跟著的是真正的數據而不是同步時鐘,為8位的10101011。 DA:目的地址,以太網的地址為48位(6個字節)二進制地址,表明該幀傳輸給哪個網卡。如果為FFFFFFFFFFFF,則是廣播地址。廣播地址的數據可以被任何網卡接收到。 SA:源地址,48位,表明該幀的數據是哪個網卡發的,即發送端的網卡地址,同樣是6個字節。n TYPE:類型字段,表明該幀的數據是什么類型的數據,不同協
4、議的類型字段不同。如:0800H表示數據為IP包,0806H表示數據為ARP包,814CH是SNMP包,8137H為IPX/SPX包。小于0600H的值是用于IEEE802的,表示數據包的長度。n DATA:數據段,該段數據不能超過1500B。因為以太網規定整個傳輸包的最大長度不能超過1514E(14B為DA,SA,TYPE)。n PAD:填充位。由于以太網幀傳輸的數據包最小不能小于60B,除去(DA、SA、TYPE的14B),還必須傳輸46B的數據,當數據段的數據不足46B時,后面通常是補0(也可以補其他值)。n FCS:32位數據校驗位。32位的CRC校驗,該校驗由網卡自動計算,自動生成,
5、自動校驗,自動在數據段后面填入。不需要軟件管理。n 通常,PR、SD、PAD、FCS這幾個數據段都是網卡(包括物理層和Mac層的處理)自動產生的,剩下的DA、SA、TYPE、DATA這4個段的內容是由上層的軟件控制的。n3以太網數據傳輸的特點以太網數據傳輸的特點n 所有數據位的傳輸由低位開始,傳輸的位流是用曼徹斯特編碼。n 以太網是基于沖突檢測的總線復用方法,沖突退避算法是由硬件自動執行的。n 以太網傳輸的數據段的長度,DA+SA+TYPE+DATA+PAD最小為60B,最大為1514B。n 通常的以太網卡可以接收3種地址的數據,一個是廣播地址,一個是多播地址(或者叫組播地址,在嵌入式系統中很
6、少用到),一個是它自己的地址。但有時,用于網絡分析和監控,網卡也可以設置為接收任何數據包。n 任何兩個網卡的物理地址都是不一樣的,是世界上唯一的,網卡地址由專門機構分n配。不同廠家使用不同地址段,同一廠家的任何兩個網卡的地址也是唯一的。根據網卡的地址段(網卡地址的前3個字節)可以知道網卡的生產廠家。n7.1.2 嵌入式以太網接口的實現方法n在嵌入式系統中增加以太網接口,通常有如下兩種方法實現:n(1)嵌入式處理器網卡芯片n這種方法只要把以太網芯片連接到嵌入式處理器的總線上即可。此方法通用性強,對嵌入式處理器沒有特殊要求,不受處理器的限制,但是,嵌入式處理器和網絡數據交換通過外部總線(通常是并行
7、總線)交換數據,速度慢,可靠性不高,電路板走線復雜。目前常見的以太網接口芯片,如CS8900、RTL8019/8029/8039、DM9008及DWL650無線網卡等。n(2)帶有以太網接口的嵌入式處理器n帶有以太網接口的嵌入式處理器通常是面向網絡應用而設計的,要求嵌入式處理器有通用的網絡接口(比如:MII接口),處理器和網絡數據交換通過內部總線,速度快。n7.1.3 在嵌入式系統中主要處理的以太網協議nTCP/IP是一個分層的協議,包含有用于層、傳輸層、網絡層、數據鏈路層、物理層等。每一層實現一個明確的功能,對應一個或者幾個傳輸協議。每層相對于它的下層都作為一個獨立的數據包來實現。典型的分層
8、和每層上的協議如表7.1.2所示。n表7.1.2 TCP/IP協議的典型分層和協議n1ARP(Address Resolation Protocol,地址解析協議),地址解析協議)n網絡層用32位的地址來標識不同的主機(即IP地址),而鏈路層使用48位的物理(MAC)地址來標識不同的以太網或令牌環網接口。只知道目的主機的IP地址并不能發送數據幀給它,必須知道目的主機網絡接口的物理地址才能發送數據幀。nARP的功能就是實現從IP地址到對應物理地址的轉換。源主機發送一份包含目的主機IP地址的ARP請求數據幀給網上的每個主機,稱作ARP廣播,目的主機的ARP收到這份廣播報文后,識別出這是發送端在詢問
9、它的IP地址,于是發送一個包含目的主機IP地址及對應的物理地址的ARP回答給源主機。n為了加快ARP協議解析的數據,每臺主機上都有一個ARP cache存放最近的IP地址到硬件地址之間的映射記錄。其中每一項的生存時間(一般為20分鐘),這樣當在ARP的生存時間之內連續進行ARP解析的時候,不需要反復發送ARP請求了。n2ICMP(Internet Control Messages Protocol,網絡控制,網絡控制報文協議)報文協議)nICMP是IP層的附屬協議,IP層用它來與其他主機或路由器交換錯誤報文和其他重要控制信息。ICMP報文是在IP數據包內部被傳輸的。在Linux或者Window
10、s中,兩個常用的網絡診斷工具ping和traceroute(Windows下是Tracert),其實就是ICMP協議。n3IP (Internet Protocol,網際協議),網際協議)nIP工作在網絡層,是TCP/IP協議族中最為核心的協議。所有的TCP、UDP、ICMP及IGMP數據都以IP數據包格式傳輸(IP封裝在IP數據包中)。IP數據包最長可達65535字節,其中報頭占32位。還包含各32位的源IP地址和32位的目的IP地址。nTTL(time-to-live,生存時間字段)指定了IP數據包的生存時間(數據包可以經過的最多路由器數)。TTL的初始值由源主機設置,一旦經過一個處理它的
11、路由器,它的值就減去1。當該字段的值為0時,數據包就被丟棄,并發送ICMP報文通知源主機重發。nIP提供不可靠、無連接的數據包傳送服務,高效、靈活。n不可靠(unreliable)的意思是它不能保證IP數據包能成功地到達目的地。如果發生某種錯誤,IP有一個簡單的錯誤處理算法:丟棄該數據包,然后發送ICMP消息報給信源端。任何要求的可靠性必須由上層來提供(如TCP)。n無連接(connectionless )的意思是IP并不維護任何關于后續數據包的狀態信息。每個數據包的處理是相互獨立的。IP數據包可以不按發送順序接收。如果一信源向相同的信宿發送兩個連續的數據包(先是A,然后是B),每個數據包都是
12、獨立地進行路由選擇,可能選擇不同的路線,因此B可能在A到達之前先到達。nIP的路由選擇:源主機 IP接收本地TCP、UDP、ICMP、GMP的數據,生成IP數據包,如果目的主機與源主機在同一個共享網絡上,那么IP數據包就直接送到目的主機上。否則就把數據包發往一默認的路由器上,由路由器來轉發該數據包。最終經過數次轉發到達目的主機。IP路由選擇是逐跳(hop-by-hop)進行的。所有的IP路由選擇只為數據包傳輸提供下一站路由器的IP地址。n4TCP(Transfer Control Protocol,傳輸控制協議),傳輸控制協議)nTCP協議是一個面向連接的可靠的傳輸層協議。TCP為兩臺主機提供
13、高可靠性的端到端數據通信。它所做的工作包括:n 發送方把應用程序交給它的數據分成合適的小塊,并添加附加信息(TCP頭),包括順序號,源、目的端口,控制、糾錯信息等字段,稱為TCP數據包。并將TCP數據包交給下面的網絡層處理。n 接受方確認接收到的TCP數據包,重組并將數據送往高層。n5UDP(User Datagram Protocol,用戶數據包協議),用戶數據包協議)nUDP協議是一種無連接不可靠的傳輸層協議。它只是把應用程序傳來的數據加上UDP頭(包括端口號,段長等字段),作為UDP數據包發送出去,但是并不保證它們能到達目的地??煽啃杂蓱脤觼硖峁因為協議開銷少,和TCP協議相比,U
14、DP更適用于應用在低端的嵌入式領域中。很多場合如網絡管理SNMP,域名解析DNS,簡單文件傳輸協議TFTP,大都使用UDP協議。n6. 端口端口 nTCP和UDP采用16位的端口號來識別上層的TCP用戶,即上層應用協議,如FTP和TELNET等。常見的TCP/IP服務都用眾所周知的1255之間的端口號。例如FTP服務的TCP端口號都是21,Telnet服務的TCP端口號都是23。TFTP(簡單文件傳輸協議)服務的UDP端口號都是69。2561023之間的端口號通常都是提供一些特定的UNIX服務。TCP/IP臨時端口分配10245 000之間的端口號。n7.1.4 網絡編程接口nBSD套接字(B
15、SD Sockets)使用的最廣泛的網絡程序編程方法,主要用于應用程序的編寫,用于網絡上主機與主機之間的相互通信。n很多操作系統都支持BSD套接字編程。例如,UNIX、Linux、VxWorks、Windows的Winsock基本上是來自BSD Sockets。n套接字(Sockets)分為Stream Sockets和Data Sockets。Stream Sockets是可靠性的雙向數據傳輸,對應使用TCP協議傳輸數據;Data Sockets是不可靠連接,對應使用UDP協議傳輸數。n下面給出一個使用套接字接口的UDP通信的流程。nUDP服務器端和一個UDP客戶端通信的程序過程:n(1)創
16、建一個Socket:nsFd =socket(AF_INET,SOCK_DGRAM,0)n(2)把Socket和本機的IP,UDP口綁定:nbind (sFd,(struct sockaddr*)& serverAddr,sockAddrSize)n(3)循環等待,接收(recvfrom)或者發送(sendfrom)信息。n(4)關閉Socket,通信終止:nclose(sFd)n7.1.5 以太網的物理層接口及編程n大多數ARM都內嵌一個以太網控制器,支持媒體獨立接口(Media Independent Interface MII)和帶緩沖DMA接口(Buffered DMA Int
17、erface,BDI),可在半雙工或全雙工模式下提供10M/100Mbps的以太網接入。在半雙工模式下,控制器支持CSMA/CD協議;在全雙工模式下,支持IEEE802.3MAC控制層協議。ARM內部雖然包含了以太網MAC控制,但并未提供物理層接口,因此,需外接一片物理層芯片以提供以太網的接入通道。n常用的單口10M/100Mbps高速以太網物理層接口器件均提供MII接口和傳統7線制網絡接口,可方便地與ARM接口。以太網物理層接口器件主要功能一般包括:物理編碼子層、物理媒體附件、雙絞線物理媒體子層、10BASE-TX編碼解碼器和雙絞線媒體訪問單元等。如CS8900、RTL8019/8029/8
18、039等。nCS8900A是Cirrus Logic公司生產的16位以太網控制器,芯片內嵌片內RAM10BASE-T收發濾波器,直接ISA總線接口。該芯片的物理層接口、數據傳輸模式和工作模式等都能根據需要而動態調整,通過內部寄存器的設置來適應不同的應用環境。nCS8900A采用3V供電電壓,最大工作電流55mA,具有全雙工通信方式,可編程發送功能,數據碰撞自動重發,自動打包及生成CRC校驗碼,可編程接收功能,自動切換于DMA和片內RAM,提前產生中斷便于數據幀預處理,數據流可降低CPU消耗,自動阻斷錯誤包,可跳線控制EEPROM功能,啟動編程支持無盤系統,邊沿掃描和回環測試,待機和睡眠模式,支
19、持廣泛的軟件驅動,工業級溫度范圍,LED指示連接狀態和網絡活動情況等特點。采用TQFP-100封裝。CS8900A內部結構方框圖如圖7.1.3所示。圖7.1.3 CS8900A內部結構方框圖n1CS8900A工作原理工作原理nCS8900A有兩種工作模式:和I/O模式。當配置成MEMORY MODE模式操作時,CS8900A的內部寄存器和幀緩沖區映射到主機內存中連續的4KB的塊中,主機可以通過這個塊直接訪問CS8900A的內部寄存器和幀緩沖區。MEMORY 模式需要硬件上多根地址線和網卡相連。而在I/O MODE模式,對任何寄存器操作均要通過I/O端口0寫入或讀出。I/O MODE模式在硬件上
20、實現比較方便,而且這也是芯片的默認模式。在I/O模式下,PacketPage存儲器被映射到CPU的8個16位的I/O端口上。在芯片被加電后,I/O基地址的默認值被置為300H。n使用CS8900A作為以太網的物理層接口,在收到由主機發來的數據報后(從目的地址域到數據域),偵聽網絡線路。如果線路忙,它就等到線路空閑為止,否則,立即發送該數據幀。在發送過程中,首先它添加以太網幀頭(包括前導字段和幀開始標志),然后生成CRC校驗碼,最后將此數據幀發送到以太網上。n在接收過程中,它將從以太網收到的數據幀在經過解碼、去幀頭和地址檢驗等步驟后緩存在片內。在CRC校驗通過后,它會根據初始化配置情況,通知主機
21、CS8900A收到了數據幀,最后,用某種傳輸模式(FO模式、Memory模式、DMA模式)傳到主機的存儲區中。n2CS 8900A引腳端和功能引腳端和功能nCS 8900A的ISA總線接口引腳端和功能如表7.1.3所示,EEPROM和引導編程接口引腳端和功能如表7.1.4所示,IOBASE-T接口引腳端和功能如表7.1.5所示,附加單元接口AUD引腳端和功能如表7.1.6所示,通用引腳端和功能如表7.1.7所示。引腳類型功能SA0:19I地址總線SD0:15I/O雙向數據總線,三態輸出RESETI復位輸入端,高電平有效(至少保持400ns)AEN I地址使能,高電平有效MEMRI存儲器讀信號,
22、低電平有效MEMWI存儲器寫信號,低電平有效MEMCS 16O存儲器16位選擇信號,OC(集電極開路)輸出REFRESHI刷新信號,低電平有效。當REFRESH為低電平時,MEMR,MEMW,IOR,IOW,DMACK0,DMACKl和DMACK2都被忽略表7.1.3 ISA總線接口引腳端和功能IORII/O讀信號,低電平有效IOWII/O寫信號,低電平有效IOCS 16I16位I/O片選信號,低電平有效IOCHRDYOI/O通道就緒信號,OC(集電極開路)輸出SBHEI系統總線高位使能信號,低電平有效INTRQ0:2O中斷請求信號,三態輸出DMARQ0:2ODMA請求信號,三態輸出DMACK
23、0:2IDMA應答信號,低電平有效CHIPSELI片選信號,低電平有效表7.1.4 EEPROM和引導編程接口引腳端和功能引腳類型功能EESKIEEPROM時鐘輸入信號EECSIEEPROM片選輸入信號,低電平有效EEDataINIEEPROM數據輸入,內部上拉ELCSI外部邏輯片選信號,內部上拉EEDataOUTOEEPROM數據輸出CSOUTO外部引導編程選擇信號輸出,低電平有效表7.1.5 IOBASE-T接口引腳端引腳類型功能TXD+/TXDO數據發送,差分對管輸出RXD/RXDI數據接收,差分對管輸入表7.1.6 附加單元接口引腳端和功能引腳類型功能DO/DOOAUI數據輸出,差分對
24、管輸出DI/DIIAUI數據輸入,差分對管輸入CI/CIIAUI振動輸入,差分對管輸入表7.1.7 通用引腳端和功能引腳類型功能XTAL 1:2I/O晶體振蕩器輸入輸出SLEEPI硬件睡眠控制輸入信號,低電平有效,內部上拉LINKLED/HCOO線路正常輸出信號或主控制器輸出0信號,低電平有效,OC(集電極開路)輸出BSTAUTS/HC1O總線狀態輸出信號或主控制器輸出1信號,低電平有效,OC(集電極開路)輸出LANLEDO網絡狀態指示輸出信號,OC(集電極開路)輸出TESTI測試輸入使能信號,低電平有效,內部上拉RESI基準電阻輸入端 DVDD 1:4I數字電路電源DVSS1:4I數字電路地
25、AVDD 1:4I模擬電路電源AVSS1:4I模擬電路地3電路連接電路連接采用CS 8900A與S3C2410A連接構成的以太網接口電路如圖7.1.4所示。n4CS8900A的以太網接口驅動程序的以太網接口驅動程序于明于明n(1)初始化函數n初始化函數完成設備的初始化功能,由數據結構device中的init函數指針來調用。加載網絡驅動模塊后,就會調用初始化過程。首先通過檢測物理設備的硬件特征來檢測網絡物理設備是否存在,之后配置設備所需要的資源。比如,中斷。這些配置完成之后就要構造設備的數據結構device,用檢測到的數據初始化device中的相關變量,最后向Linux內核中注冊該設備并申請內存
26、空間。函數定義為:nstatic int _init init_cs8900a_s3c2410(void)n n struct net_local *lp;n int ret = 0;n dev_cs89x0.irq = irq;n dev_cs89x0.base_addr = io;n dev_cs89x0.init = cs89x0_probe;n dev_cs89x0.priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);nif (dev_cs89x0.priv = = 0) nn printk(KERN_ERR cs89x0.c: O
27、ut of memory.n);n return -ENOMEM;n n memset(dev_cs89x0.priv, 0, sizeof(struct net_local);n nlp = (struct net_local *)dev_cs89x0.priv;n request_region(dev_cs89x0.base_addr, NETCARD_IO_EXTENT, cs8900a);nspin_lock_init(&lp-lock);n /* boy, theyd better get these right */n if (!strcmp(media, rj45)n l
28、p-adapter_cnf = A_CNF_MEDIA_10B_T | A_CNF_10B_T;n else if (!strcmp(media, aui)n lp-adapter_cnf = A_CNF_MEDIA_AUI | A_CNF_AUI;n else if (!strcmp(media, bnc)n lp-adapter_cnf = A_CNF_MEDIA_10B_2 | A_CNF_10B_2;n elsen lp-adapter_cnf = A_CNF_MEDIA_10B_T | A_CNF_10B_T;nif (duplex= = 1)n lp-auto_neg_cnf =
29、AUTO_NEG_ENABLE;n if (io = = 0) n printk(KERN_ERR cs89x0.c: Module autoprobing not allowed.n);n printk(KERN_ERR cs89x0.c: Append io=0 xNNNn);n ret = -EPERM;n goto out;n n if (register_netdev(&dev_cs89x0) != 0) n printk(KERN_ERR cs89x0.c: No card found at 0 x%xn, io);n ret = -ENXIO;n goto out;n n
30、out:n if (ret)n kfree(dev_cs89x0.priv);n return ret;nn在這個網絡設備驅動程序中,設備的數據結構device就是dev_cs89x0。探測網絡物理設備是否存在,利用cs89x0_probe函數實現,通過調用register_netdrv(struct net_device*dev)函數進行注冊。n與init函數相對應的cleanup函數在模塊卸載時運行,主要完成資源的釋放工作,如取消設備注冊、釋放內存、釋放端口等。函數定義為:nstatic void _exit cleanup_cs8900a_s3c2410(void) n if (dev_
31、cs89x0.priv != NULL) n /* Free up the private structure, or leak memory :-) */n unregister_netdev(&dev_cs89x0);n outw(PP_ChipID, dev_cs89x0.base_addr + ADD_PORT);n kfree(dev_cs89x0.priv);n dev_cs89x0.priv = NULL;/* gets re-allocated by cs89x0_probe1 */n /* If we dont do this, we cant re-insmod i
32、t later. */n release_region(dev_cs89x0.base_addr, NETCARD_IO_EXTENT);n nn(2)打開函數n打開函數在網絡設備驅動程序中是在網絡設備被激活時調用,即設備狀態由down至up。函數定義為:nstatic int net_open(struct net_device *dev)nn struct net_local *lp = (struct net_local *)dev-priv;nint ret;n writereg(dev, PP_BusCTL, readreg(dev, PP_BusCTL) & ENABLE_
33、IRQ);n ret = request_irq(dev-irq, &net_interrupt, SA_SHIRQ, cs89x0, dev);n if (ret) n printk(%s: request_irq(%d) failedn, dev-name, dev-irq);n goto bad_out;nnif (lp-chip_type = = CS8900)nwritereg(dev, PP_CS8900_ISAINT, 0);nelse nwritereg(dev, PP_CS8920_ISAINT, 0);nwritereg(dev, PP_BusCTL, MEMORY
34、_ON);nlp-linectl = 0;n writereg(dev, PP_LineCTL,n readreg(dev, PP_LineCTL) | SERIAL_RX_ON | SERIAL_TX_ON);nlp-rx_mode = 0;n writereg(dev, PP_RxCTL, DEF_RX_ACCEPT);n lp-curr_rx_cfg = RX_OK_ENBL | RX_CRC_ERROR_ENBL;nif (lp-isa_config & STREAM_TRANSFER) nlp-curr_rx_cfg |= RX_STREAM_ENBL;nwritereg(d
35、ev, PP_RxCFG, lp-curr_rx_cfg);n writereg(dev, PP_TxCFG,n TX_LOST_CRS_ENBL | TX_SQE_ERROR_ENBL | TX_OK_ENBL |n TX_LATE_COL_ENBL | TX_JBR_ENBL |n TX_ANY_COL_ENBL | TX_16_COL_ENBL);n writereg(dev, PP_BufCFG,n READY_FOR_TX_ENBL | RX_MISS_COUNT_OVRFLOW_ENBL |n TX_COL_COUNT_OVRFLOW_ENBL | TX_UNDERRUN_ENBL
36、);nwritereg(dev, PP_BusCTL, readreg(dev, PP_BusCTL) | ENABLE_IRQ);n enable_irq(dev-irq);n netif_start_queue(dev);n DPRINTK(1, cs89x0: net_open() succeededn);n return 0;nbad_out:n return ret;n n打開函數中對寄存器操作使用了兩個函數:readreg和writereg。readreg函數用來讀取寄存器內容,writereg函數用來寫寄存器。函數定義為:ninline int readreg(struct ne
37、t_device *dev, int portno)nnoutw(portno, dev-base_addr + ADD_PORT);nreturn inw(dev-base_addr + DATA_PORT);nninline void writereg(struct net_device *dev, int portno, int value) nnoutw(portno, dev-base_addr + ADD_PORT);noutw(value, dev-base_addr + DATA_PORT);nn(3)關閉函數n關閉函數釋放資源減少系統負擔,設備狀態有up轉為down時被調用。
38、函數定義為:nstatic int net_close(struct net_device *dev)nnnetif_stop_queue(dev);nwritereg(dev, PP_RxCFG, 0);nwritereg(dev, PP_TxCFG, 0);nwritereg(dev, PP_BufCFG, 0);nwritereg(dev, PP_BusCTL, 0);nfree_irq(dev-irq, dev);n/* Update the statistics here. */nreturn 0;nn(4)發送函數n首先,在網絡設備驅動加載時,通過device域中的init函數指針
39、調用網絡設備的初始化函數對設備進行初始化,如果操作成功,就可以通過device域中的open函數指針調用網絡設備的打開函數打開設備,再通過device域中的包頭函數指針hard_header來建立硬件包頭信息。最后,通過協議接口層函數dev_queue_xmit調用device域中的hard_start_xmit函數指針來完成數據包的發送。n如果發送成功,hard_start_xmit釋放sk_buff,返回0。如果設備暫時無法處理,比如,硬件忙,則返回l。此時如果dev-tbusy置為非0,則系統認為硬件忙,要等到dev-tbusy置0以后才會再次發送。tbusy的置0任務一般由中斷完成。硬
40、件在發送結束會產生中斷,這時可以把tbusy置0,然后用mark_bh()調用通知系統可以再次發送。n在CS8900A驅動程序中,網絡設備的傳輸函數dev-hard_start_xmit定義為net_send_ packet:nstatic int net_send_packet(struct sk_buff *skb, struct net_device *dev)nn struct net_local *lp = (struct net_local *)dev-priv;n writereg(dev, PP_BusCTL, 0 x0);n writereg(dev, PP_BusCTL,
41、readreg(dev, PP_BusCTL) | ENABLE_IRQ);n DPRINTK(3, %s: sent %d byte packet of type %xn,n dev-name, skb-len,n (skb-dataETH_ALEN+ETH_ALEN dataETH_ALEN+ETH_ALEN+1);n spin_lock_irq(&lp-lock);n netif_stop_queue(dev);n /* initiate a transmit sequence */n writeword(dev, TX_CMD_PORT, lp-send_cmd);n writ
42、eword(dev, TX_LEN_PORT, skb-len);n /* Test to see if the chip has allocated memory for the packet */nif (readreg(dev, PP_BusST) & READY_FOR_TX_NOW) = 0)nn spin_unlock_irq(&lp-lock);n DPRINTK(1, cs89x0: Tx buffer not free!n);n return 1;n n /* Write the contents of the packet */n writeblock(de
43、v, skb-data, skb-len);n spin_unlock_irq(&lp-lock);n dev-trans_start = jiffies;n dev_kfree_skb (skb); n return 0;n n(5)中斷處理和接收函數n網絡設備接收數據通過中斷實現,當數據收到后,產生中斷,在中斷處理程序中驅動程序申請一塊sk_buff(skb),從硬件讀出數據放置到申請好的緩沖區里。接下來,填充sk_buff中的一些信息。處理完后,如果是獲得數據包,則執行數據接收子程序,該函數被中斷服務程序調用。函數定義:nstatic void net_rx(struct net
44、_device *dev) nn struct net_local *lp = (struct net_local *)dev-priv;n struct sk_buff *skb;n int status, length;n int ioaddr = dev-base_addr;n status = inw(ioaddr + RX_FRAME_PORT);nif (status & RX_OK) = 0)nn count_rx_errors(status, lp);n return;n n length = inw(ioaddr + RX_FRAME_PORT);n /* Mallo
45、c up new buffer. */n skb = dev_alloc_skb(length + 2);nif (skb = NULL) nn lp-stats.rx_dropped+;n return;n n skb_reserve(skb, 2),/* longword align L3 header */n skb-len = length;n skb-dev = dev;n readblock(dev, skb-data, skb-len);n DPRINTK(3, %s: received %d byte packet of type %xn,n dev-name, length,
46、n (skb-dataETH_ALEN+ETH_ALENdataETH_ALEN+ETH_ALEN+1);n skb-protocol=eth_type_trans(skb,dev);n netif_rx(skb);n dev-last_rx = jiffies;n lp-stats.rx_packets+;n lp-stats.rx_bytes += length;n n在net_rx()函數中調用netif_rx()把數據傳送到協議層。netif_rx()函數把數據放入處理隊列,然后返回,真正的處理是在中斷返回以后,這樣可以減少中斷時間。調用netif_rx()后,驅動程序不能再存取數據緩
47、沖區if_rx()函數在net/core/dev.c中定義為:nint netif_rx(struct sk_buff *skb)nnint this_cpu = smp_processor_id();nstruct softnet_data *queue;nunsigned long flags;nif (skb-stamp.tv_sec = = 0) ndo_gettimeofday(&skb-stamp);nqueue = &softnet_datathis_cpu;nlocal_irq_save(flags);nnetdev_rx_statthis_cpu
48、.total+;nif (queue-input_pkt_queue.qlen input_pkt_queue.qlen) nnif (queue-throttle)goto drop;nenqueue:ndev_hold(skb-dev);n_skb_queue_tail(&queue-input_pkt_queue,skb);ncpu_raise_softirq(this_cpu, NET_RX_SOFTIRQ);nlocal_irq_restore(flags);n#ifndef OFFLINE_SAMPLEnget_sample_stats(this_cpu);n#endifn
49、return softnet_datathis_g_level;n nif (queue-throttle)nnqueue-throttle = 0;n#ifdef CONFIG_NET_HW_FLOWCONTROLnif (atomic_dec_and_test(&netdev_dropping) netdev_wakeup();n#endifnngoto enqueue;nnif (queue-throttle = 0)nnqueue-throttle = 1;nnetdev_rx_statthis_cpu.throttled+;n#ifdef CONFIG_NET_HW_FLOW
50、CONTROLnatomic_inc(&netdev_dropping);n#endifnndrop:netdev_rx_statthis_cpu.dropped+;nlocal_irq_restore(flags);nkfree_skb(skb);nreturn NET_RX_DROP; nn中斷函數net_interrupt在打開函數中申請,中斷發生后,首先驅動中斷管腳為高電平,然后主機讀取CS8900A中的中斷申請序列ISQ值,以確定事件類型,根據事件類型做出響應。函數定義為:nstatic void net_interrupt(int irq, void *dev_id, st
51、ruct pt_regs * regs)nn struct net_device *dev = dev_id;n struct net_local *lp;n int ioaddr, status;n ioaddr = dev-base_addr;n lp = (struct net_local *)dev-priv;n nwhile (status = readword(dev, ISQ_PORT)nn DPRINTK(4, %s: event=%04xn, dev-name, status);n switch(status & ISQ_EVENT_MASK) nn case ISQ
52、_RECEIVER_EVENT:n/* Got a packet(s). */nnet_rx(dev);nbreak;n case ISQ_TRANSMITTER_EVENT:nlp-stats.tx_packets+;nnetif_wake_queue(dev);/* Inform upper layers. */nif (status & (TX_OK |nTX_LOST_CRS | TX_SQE_ERROR |nTX_LATE_COL | TX_16_COL) != TX_OK) nnif (status & TX_OK) = 0) lp-stats.tx_errors+
53、;nif (status & TX_LOST_CRS) lp-stats.tx_carrier_errors+;nif (status & TX_SQE_ERROR) lp-stats.tx_heartbeat_errors+;nif (status & TX_LATE_COL) lp-stats.tx_window_errors+;nif (status & TX_16_COL) lp-stats.tx_aborted_errors+;nnbreak;n case ISQ_BUFFER_EVENT:nif (status & READY_FOR_TX)
54、nn netif_wake_queue(dev);/* Inform upper layers. */nnif (status & TX_UNDERRUN)nnDPRINTK(1, %s: transmit underrunn, dev-name);nlp-send_underrun+;nif (lp-send_underrun = 3)lp-send_cmd = TX_AFTER_381;nelse if (lp-send_underrun = 6)lp-send_cmd = TX_AFTER_ALL;nnetif_wake_queue(dev);/* Inform upper la
55、yers. */nnbreak;ncase ISQ_RX_MISS_EVENT:nlp-stats.rx_missed_errors += (status 6);nbreak;ncase ISQ_TX_COL_EVENT:nlp-stats.collisions += (status 6);nbreak;nnn 7.2 CAN總線接口總線接口n7.2.1 CAN總線概述nCAN(Controller Area Network,控制器局域網)是德國Bosch公司于1983年為汽車應用而開發的,它是一種現場總線(FieldBus),能有效支持分布式控制和實時控制的串行通信網絡。1993年11月,I
56、SO正式頒布了控制器局域網CAN國際標準(IS011898)。n一個理想的由CAN總線構成的單一網絡中可以掛接任意多個節點,實際應用中節點數目受網絡硬件的電氣特性所限制。例如:當使用Philips P82C250作為CAN收發器時,同一網絡中允許掛接110個節點。CAN可提供1 Mb/s的數據傳輸速率。CAN總線是一種多主方式的串行通信總線。基本設計規范要求有高的位速率,高抗電磁干擾性,并可以檢測出產生的任何錯誤。當信號傳輸距離達到10Km時CAN總線仍可提供高達50Kb/s的數據傳輸速率。CAN總線具有很高的實時性能,已經在汽車工業、航空工業、工業控制、安全防護等領域中得到了廣泛應用。nCA
57、N總線的通信介質可采用雙絞線、同軸電纜和光導纖維,最常用的是雙絞線。通信距離與波特率有關,最大通信距離可達10km,最大通信波特率可達1Mbps。CAN總線仲裁采用11位標識和非破壞性位仲裁總線結構機制,可以確定數據塊的優先級,保證在網絡節點沖突時最高優先級節點不需要沖突等待。CAN總線采用了多主競爭式總線結構,具有多主站運行和分散仲裁的串行總線以及廣播通信的特點。CAN總線上任意節點可在任意時刻主動向網絡上其他節點發送信息而不分主次,因此可在各節點之間實現自由通信。nCAN總線信號使用差分電壓傳送,兩條信號線被稱為CAN_H和CAN_L,靜態時均是2.5V左右,此時狀態表示為邏輯1,也可以叫
58、做“隱性”。采用CAN_H比CAN_L高表示邏輯0,稱為“顯性”,通常電壓值為CAN_H=3.5V和CAN_L=1.5V。當“顯性”位和“隱性”位同時發送的時候,最后總線數值將為“顯性”。nCAN總線的一個位時間可以分成四個部分:同步段,傳播時間段,相位緩沖段1和相位緩沖段2。每段的時間份額的數目都是可以通過CAN總線控制器編程控制,而時間份額的大小tq由系統時鐘tsys和波特率預分頻值BRP決定:tq=BRP/tsys。圖7.2.1說明了CAN總線的一個位時間的各個組成部分。圖7.2.1 CAN總線的一個位時間n 同步段:用于同步總線上的各個節點,在此段內期望有一個跳變沿出現(其長度固定)。
59、如果跳變沿出現在同步段之外,那么沿與同步段之間的長度叫做沿相位誤差。采樣點位于相位緩沖段1的末尾和相位緩沖段2開始處。n 傳播時間段:用于補償總線上信號傳播時間和電子控制設備內部的延遲時間。因此,要實現與位流發送節點的同步,接收節點必須移相。CAN總線非破壞性仲裁規定,發送位流的總線節點必須能夠收到同步于位流的CAN總線節點發送的顯性位。n 相位緩沖段1:重同步時可以暫時延長。n 相位緩沖段2:重同步時可以暫時縮短。n 同步跳轉寬度:長度小于相位緩沖段。n同步段,傳播時間段,相位緩沖段1和相位緩沖段2的設定和CAN總線的同步、仲裁等信息有關。其主要思想是要求各個節點在一定誤差范圍內保持同步。必
60、須考慮各個節點時鐘(振蕩器)的誤差和總線的長度帶來的延遲(通常每米延遲為5.5ns)。正確設置CAN總線各個時間段,是保證CAN總線良好工作的關鍵。n7.2.2 在嵌入式處理器上擴展CAN總線接口n一些面向工業控制的嵌入式處理器本身就集成了一個或者多個CAN總線控制器。例如:韓國現代公司的hms30c7202(ARM720T內核)帶有兩個CAN總線控制器; Phillips公司的LPC2194和LPC2294(ARM7TDMI內核)帶有4個CAN總線控制器。CAN總線控制器主要是完成時序邏輯轉換等工作,要在電氣特性上滿足CAN總線標準,還需要一個CAN總線的物理層芯片,用它來實現TTL電平到CAN總線電平特性的轉換,即CAN收發器。n實際上,多數嵌入式處理器都不帶CAN總線控制器。通常的解決方案是在嵌入式處理器的外部總線上擴展CAN總線接口芯片,例如:Phillips公司的SJ
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 畜產品加工與畜產品質量安全保障考核試卷
- 紙容器新型材料開發與應用考核試卷
- 紙制品行業供應鏈管理創新與實踐考核試卷
- 液壓系統在高海拔地區的適應性考核試卷
- 生態農業與綠色食品經濟考核試卷
- 油料作物種植園農業信息化建設考核試卷
- 生態補償機制考核試卷
- 石棉在油氣加工中的應用考核試卷
- 玻璃制品可靠性測試考核試卷
- 玉米加工過程中的智能檢測與故障排除考核試卷
- 鞘內注射化療護理課件
- 兒科護理質量專項改善課件
- 郵政社區團購怎么做流程
- 刮痧類中醫醫療技術相關感染預防與控制指南
- 錢大媽計劃書
- 建筑施工電動運輸車輛進場驗收表
- Unit2Let'sCelebrate!Developingideas作業設計-2023-2024學年高中英語(精修版)
- 醫療器械投標方案(技術標)
- 《愛彌兒》讀書分享會
- 房地產公司財務部人員配備及職責分工方案
- 預后的研究與評價
評論
0/150
提交評論