




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第第7章章 嵌入式系統(tǒng)網(wǎng)絡(luò)接口嵌入式系統(tǒng)網(wǎng)絡(luò)接口7.1 以太網(wǎng)接口以太網(wǎng)接口n嵌入式系統(tǒng)通常使用的以太網(wǎng)協(xié)議是IEEE802.3標(biāo)準(zhǔn)。從硬件的角度看,802.3模型層間結(jié)構(gòu)如圖7.1.1所示,以太網(wǎng)接口電路主要由媒質(zhì)接入控制MAC控制器和物理層接口(Physical Layer,PHY)兩大部分構(gòu)成。圖7.1.1 802.3模型層間結(jié)構(gòu)n1傳輸編碼傳輸編碼n在802.3版本的標(biāo)準(zhǔn)中,沒有采用直接的二進(jìn)制編碼(即用0V表示“0”,用5V表示“1”),而是采用曼徹斯特編碼(Manchester Encoding)或者差分曼徹斯特編碼(Differential Manchester Encoding
2、),不同編碼形式如圖7.1.2所示。圖7.1.2 不同編碼形式n其中:曼徹斯特編碼的規(guī)律是:每位中間有一個電平跳變,從高到低的跳變表示為“0”,從低到高的跳變表示為“1”。n差分曼徹斯特編碼的規(guī)律是:每位的中間也有一個電平跳變,但不用這個跳變來表示數(shù)據(jù),而是利用每個碼元開始時有無跳變來表示“0”或“1”,有跳變表示“0”,無跳變表示“1”。n曼徹斯特編碼和差分曼徹斯特編碼相比,前者編碼簡單,后者能提供更好的噪聲抑制性能。在802.3系統(tǒng)中,采用曼徹斯特編碼,其高電平為+0.85V,低電平信號為-0.85V,這樣指令信號電壓仍然是0V。n2802.3Mac層的幀層的幀n802.3 Mac層的以太
3、網(wǎng)的物理傳輸幀如表7.1.1所示。n表7.1.1 802.3幀的格式n PR:同步位,用于收發(fā)雙方的時鐘同步,同時也指明了傳輸?shù)乃俾剩?6位的的二進(jìn)制數(shù)101010101010,最后2位是10。 SD:分隔位,表示下面跟著的是真正的數(shù)據(jù)而不是同步時鐘,為8位的10101011。 DA:目的地址,以太網(wǎng)的地址為48位(6個字節(jié))二進(jìn)制地址,表明該幀傳輸給哪個網(wǎng)卡。如果為FFFFFFFFFFFF,則是廣播地址。廣播地址的數(shù)據(jù)可以被任何網(wǎng)卡接收到。 SA:源地址,48位,表明該幀的數(shù)據(jù)是哪個網(wǎng)卡發(fā)的,即發(fā)送端的網(wǎng)卡地址,同樣是6個字節(jié)。n TYPE:類型字段,表明該幀的數(shù)據(jù)是什么類型的數(shù)據(jù),不同協(xié)
4、議的類型字段不同。如:0800H表示數(shù)據(jù)為IP包,0806H表示數(shù)據(jù)為ARP包,814CH是SNMP包,8137H為IPX/SPX包。小于0600H的值是用于IEEE802的,表示數(shù)據(jù)包的長度。n DATA:數(shù)據(jù)段,該段數(shù)據(jù)不能超過1500B。因?yàn)橐蕴W(wǎng)規(guī)定整個傳輸包的最大長度不能超過1514E(14B為DA,SA,TYPE)。n PAD:填充位。由于以太網(wǎng)幀傳輸?shù)臄?shù)據(jù)包最小不能小于60B,除去(DA、SA、TYPE的14B),還必須傳輸46B的數(shù)據(jù),當(dāng)數(shù)據(jù)段的數(shù)據(jù)不足46B時,后面通常是補(bǔ)0(也可以補(bǔ)其他值)。n FCS:32位數(shù)據(jù)校驗(yàn)位。32位的CRC校驗(yàn),該校驗(yàn)由網(wǎng)卡自動計(jì)算,自動生成,
5、自動校驗(yàn),自動在數(shù)據(jù)段后面填入。不需要軟件管理。n 通常,PR、SD、PAD、FCS這幾個數(shù)據(jù)段都是網(wǎng)卡(包括物理層和Mac層的處理)自動產(chǎn)生的,剩下的DA、SA、TYPE、DATA這4個段的內(nèi)容是由上層的軟件控制的。n3以太網(wǎng)數(shù)據(jù)傳輸?shù)奶攸c(diǎn)以太網(wǎng)數(shù)據(jù)傳輸?shù)奶攸c(diǎn)n 所有數(shù)據(jù)位的傳輸由低位開始,傳輸?shù)奈涣魇怯寐鼜厮固鼐幋a。n 以太網(wǎng)是基于沖突檢測的總線復(fù)用方法,沖突退避算法是由硬件自動執(zhí)行的。n 以太網(wǎng)傳輸?shù)臄?shù)據(jù)段的長度,DA+SA+TYPE+DATA+PAD最小為60B,最大為1514B。n 通常的以太網(wǎng)卡可以接收3種地址的數(shù)據(jù),一個是廣播地址,一個是多播地址(或者叫組播地址,在嵌入式系統(tǒng)中很
6、少用到),一個是它自己的地址。但有時,用于網(wǎng)絡(luò)分析和監(jiān)控,網(wǎng)卡也可以設(shè)置為接收任何數(shù)據(jù)包。n 任何兩個網(wǎng)卡的物理地址都是不一樣的,是世界上唯一的,網(wǎng)卡地址由專門機(jī)構(gòu)分n配。不同廠家使用不同地址段,同一廠家的任何兩個網(wǎng)卡的地址也是唯一的。根據(jù)網(wǎng)卡的地址段(網(wǎng)卡地址的前3個字節(jié))可以知道網(wǎng)卡的生產(chǎn)廠家。n7.1.2 嵌入式以太網(wǎng)接口的實(shí)現(xiàn)方法n在嵌入式系統(tǒng)中增加以太網(wǎng)接口,通常有如下兩種方法實(shí)現(xiàn):n(1)嵌入式處理器網(wǎng)卡芯片n這種方法只要把以太網(wǎng)芯片連接到嵌入式處理器的總線上即可。此方法通用性強(qiáng),對嵌入式處理器沒有特殊要求,不受處理器的限制,但是,嵌入式處理器和網(wǎng)絡(luò)數(shù)據(jù)交換通過外部總線(通常是并行
7、總線)交換數(shù)據(jù),速度慢,可靠性不高,電路板走線復(fù)雜。目前常見的以太網(wǎng)接口芯片,如CS8900、RTL8019/8029/8039、DM9008及DWL650無線網(wǎng)卡等。n(2)帶有以太網(wǎng)接口的嵌入式處理器n帶有以太網(wǎng)接口的嵌入式處理器通常是面向網(wǎng)絡(luò)應(yīng)用而設(shè)計(jì)的,要求嵌入式處理器有通用的網(wǎng)絡(luò)接口(比如:MII接口),處理器和網(wǎng)絡(luò)數(shù)據(jù)交換通過內(nèi)部總線,速度快。n7.1.3 在嵌入式系統(tǒng)中主要處理的以太網(wǎng)協(xié)議nTCP/IP是一個分層的協(xié)議,包含有用于層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層、物理層等。每一層實(shí)現(xiàn)一個明確的功能,對應(yīng)一個或者幾個傳輸協(xié)議。每層相對于它的下層都作為一個獨(dú)立的數(shù)據(jù)包來實(shí)現(xiàn)。典型的分層
8、和每層上的協(xié)議如表7.1.2所示。n表7.1.2 TCP/IP協(xié)議的典型分層和協(xié)議n1ARP(Address Resolation Protocol,地址解析協(xié)議),地址解析協(xié)議)n網(wǎng)絡(luò)層用32位的地址來標(biāo)識不同的主機(jī)(即IP地址),而鏈路層使用48位的物理(MAC)地址來標(biāo)識不同的以太網(wǎng)或令牌環(huán)網(wǎng)接口。只知道目的主機(jī)的IP地址并不能發(fā)送數(shù)據(jù)幀給它,必須知道目的主機(jī)網(wǎng)絡(luò)接口的物理地址才能發(fā)送數(shù)據(jù)幀。nARP的功能就是實(shí)現(xiàn)從IP地址到對應(yīng)物理地址的轉(zhuǎn)換。源主機(jī)發(fā)送一份包含目的主機(jī)IP地址的ARP請求數(shù)據(jù)幀給網(wǎng)上的每個主機(jī),稱作ARP廣播,目的主機(jī)的ARP收到這份廣播報文后,識別出這是發(fā)送端在詢問
9、它的IP地址,于是發(fā)送一個包含目的主機(jī)IP地址及對應(yīng)的物理地址的ARP回答給源主機(jī)。n為了加快ARP協(xié)議解析的數(shù)據(jù),每臺主機(jī)上都有一個ARP cache存放最近的IP地址到硬件地址之間的映射記錄。其中每一項(xiàng)的生存時間(一般為20分鐘),這樣當(dāng)在ARP的生存時間之內(nèi)連續(xù)進(jìn)行ARP解析的時候,不需要反復(fù)發(fā)送ARP請求了。n2ICMP(Internet Control Messages Protocol,網(wǎng)絡(luò)控制,網(wǎng)絡(luò)控制報文協(xié)議)報文協(xié)議)nICMP是IP層的附屬協(xié)議,IP層用它來與其他主機(jī)或路由器交換錯誤報文和其他重要控制信息。ICMP報文是在IP數(shù)據(jù)包內(nèi)部被傳輸?shù)?。在Linux或者Window
10、s中,兩個常用的網(wǎng)絡(luò)診斷工具ping和traceroute(Windows下是Tracert),其實(shí)就是ICMP協(xié)議。n3IP (Internet Protocol,網(wǎng)際協(xié)議),網(wǎng)際協(xié)議)nIP工作在網(wǎng)絡(luò)層,是TCP/IP協(xié)議族中最為核心的協(xié)議。所有的TCP、UDP、ICMP及IGMP數(shù)據(jù)都以IP數(shù)據(jù)包格式傳輸(IP封裝在IP數(shù)據(jù)包中)。IP數(shù)據(jù)包最長可達(dá)65535字節(jié),其中報頭占32位。還包含各32位的源IP地址和32位的目的IP地址。nTTL(time-to-live,生存時間字段)指定了IP數(shù)據(jù)包的生存時間(數(shù)據(jù)包可以經(jīng)過的最多路由器數(shù))。TTL的初始值由源主機(jī)設(shè)置,一旦經(jīng)過一個處理它的
11、路由器,它的值就減去1。當(dāng)該字段的值為0時,數(shù)據(jù)包就被丟棄,并發(fā)送ICMP報文通知源主機(jī)重發(fā)。nIP提供不可靠、無連接的數(shù)據(jù)包傳送服務(wù),高效、靈活。n不可靠(unreliable)的意思是它不能保證IP數(shù)據(jù)包能成功地到達(dá)目的地。如果發(fā)生某種錯誤,IP有一個簡單的錯誤處理算法:丟棄該數(shù)據(jù)包,然后發(fā)送ICMP消息報給信源端。任何要求的可靠性必須由上層來提供(如TCP)。n無連接(connectionless )的意思是IP并不維護(hù)任何關(guān)于后續(xù)數(shù)據(jù)包的狀態(tài)信息。每個數(shù)據(jù)包的處理是相互獨(dú)立的。IP數(shù)據(jù)包可以不按發(fā)送順序接收。如果一信源向相同的信宿發(fā)送兩個連續(xù)的數(shù)據(jù)包(先是A,然后是B),每個數(shù)據(jù)包都是
12、獨(dú)立地進(jìn)行路由選擇,可能選擇不同的路線,因此B可能在A到達(dá)之前先到達(dá)。nIP的路由選擇:源主機(jī) IP接收本地TCP、UDP、ICMP、GMP的數(shù)據(jù),生成IP數(shù)據(jù)包,如果目的主機(jī)與源主機(jī)在同一個共享網(wǎng)絡(luò)上,那么IP數(shù)據(jù)包就直接送到目的主機(jī)上。否則就把數(shù)據(jù)包發(fā)往一默認(rèn)的路由器上,由路由器來轉(zhuǎn)發(fā)該數(shù)據(jù)包。最終經(jīng)過數(shù)次轉(zhuǎn)發(fā)到達(dá)目的主機(jī)。IP路由選擇是逐跳(hop-by-hop)進(jìn)行的。所有的IP路由選擇只為數(shù)據(jù)包傳輸提供下一站路由器的IP地址。n4TCP(Transfer Control Protocol,傳輸控制協(xié)議),傳輸控制協(xié)議)nTCP協(xié)議是一個面向連接的可靠的傳輸層協(xié)議。TCP為兩臺主機(jī)提供
13、高可靠性的端到端數(shù)據(jù)通信。它所做的工作包括:n 發(fā)送方把應(yīng)用程序交給它的數(shù)據(jù)分成合適的小塊,并添加附加信息(TCP頭),包括順序號,源、目的端口,控制、糾錯信息等字段,稱為TCP數(shù)據(jù)包。并將TCP數(shù)據(jù)包交給下面的網(wǎng)絡(luò)層處理。n 接受方確認(rèn)接收到的TCP數(shù)據(jù)包,重組并將數(shù)據(jù)送往高層。n5UDP(User Datagram Protocol,用戶數(shù)據(jù)包協(xié)議),用戶數(shù)據(jù)包協(xié)議)nUDP協(xié)議是一種無連接不可靠的傳輸層協(xié)議。它只是把應(yīng)用程序傳來的數(shù)據(jù)加上UDP頭(包括端口號,段長等字段),作為UDP數(shù)據(jù)包發(fā)送出去,但是并不保證它們能到達(dá)目的地。可靠性由應(yīng)用層來提供。n因?yàn)閰f(xié)議開銷少,和TCP協(xié)議相比,U
14、DP更適用于應(yīng)用在低端的嵌入式領(lǐng)域中。很多場合如網(wǎng)絡(luò)管理SNMP,域名解析DNS,簡單文件傳輸協(xié)議TFTP,大都使用UDP協(xié)議。n6. 端口端口 nTCP和UDP采用16位的端口號來識別上層的TCP用戶,即上層應(yīng)用協(xié)議,如FTP和TELNET等。常見的TCP/IP服務(wù)都用眾所周知的1255之間的端口號。例如FTP服務(wù)的TCP端口號都是21,Telnet服務(wù)的TCP端口號都是23。TFTP(簡單文件傳輸協(xié)議)服務(wù)的UDP端口號都是69。2561023之間的端口號通常都是提供一些特定的UNIX服務(wù)。TCP/IP臨時端口分配10245 000之間的端口號。n7.1.4 網(wǎng)絡(luò)編程接口nBSD套接字(B
15、SD Sockets)使用的最廣泛的網(wǎng)絡(luò)程序編程方法,主要用于應(yīng)用程序的編寫,用于網(wǎng)絡(luò)上主機(jī)與主機(jī)之間的相互通信。n很多操作系統(tǒng)都支持BSD套接字編程。例如,UNIX、Linux、VxWorks、Windows的Winsock基本上是來自BSD Sockets。n套接字(Sockets)分為Stream Sockets和Data Sockets。Stream Sockets是可靠性的雙向數(shù)據(jù)傳輸,對應(yīng)使用TCP協(xié)議傳輸數(shù)據(jù);Data Sockets是不可靠連接,對應(yīng)使用UDP協(xié)議傳輸數(shù)。n下面給出一個使用套接字接口的UDP通信的流程。nUDP服務(wù)器端和一個UDP客戶端通信的程序過程:n(1)創(chuàng)
16、建一個Socket:nsFd =socket(AF_INET,SOCK_DGRAM,0)n(2)把Socket和本機(jī)的IP,UDP口綁定:nbind (sFd,(struct sockaddr*)& serverAddr,sockAddrSize)n(3)循環(huán)等待,接收(recvfrom)或者發(fā)送(sendfrom)信息。n(4)關(guān)閉Socket,通信終止:nclose(sFd)n7.1.5 以太網(wǎng)的物理層接口及編程n大多數(shù)ARM都內(nèi)嵌一個以太網(wǎng)控制器,支持媒體獨(dú)立接口(Media Independent Interface MII)和帶緩沖DMA接口(Buffered DMA Int
17、erface,BDI),可在半雙工或全雙工模式下提供10M/100Mbps的以太網(wǎng)接入。在半雙工模式下,控制器支持CSMA/CD協(xié)議;在全雙工模式下,支持IEEE802.3MAC控制層協(xié)議。ARM內(nèi)部雖然包含了以太網(wǎng)MAC控制,但并未提供物理層接口,因此,需外接一片物理層芯片以提供以太網(wǎng)的接入通道。n常用的單口10M/100Mbps高速以太網(wǎng)物理層接口器件均提供MII接口和傳統(tǒng)7線制網(wǎng)絡(luò)接口,可方便地與ARM接口。以太網(wǎng)物理層接口器件主要功能一般包括:物理編碼子層、物理媒體附件、雙絞線物理媒體子層、10BASE-TX編碼解碼器和雙絞線媒體訪問單元等。如CS8900、RTL8019/8029/8
18、039等。nCS8900A是Cirrus Logic公司生產(chǎn)的16位以太網(wǎng)控制器,芯片內(nèi)嵌片內(nèi)RAM10BASE-T收發(fā)濾波器,直接ISA總線接口。該芯片的物理層接口、數(shù)據(jù)傳輸模式和工作模式等都能根據(jù)需要而動態(tài)調(diào)整,通過內(nèi)部寄存器的設(shè)置來適應(yīng)不同的應(yīng)用環(huán)境。nCS8900A采用3V供電電壓,最大工作電流55mA,具有全雙工通信方式,可編程發(fā)送功能,數(shù)據(jù)碰撞自動重發(fā),自動打包及生成CRC校驗(yàn)碼,可編程接收功能,自動切換于DMA和片內(nèi)RAM,提前產(chǎn)生中斷便于數(shù)據(jù)幀預(yù)處理,數(shù)據(jù)流可降低CPU消耗,自動阻斷錯誤包,可跳線控制EEPROM功能,啟動編程支持無盤系統(tǒng),邊沿掃描和回環(huán)測試,待機(jī)和睡眠模式,支
19、持廣泛的軟件驅(qū)動,工業(yè)級溫度范圍,LED指示連接狀態(tài)和網(wǎng)絡(luò)活動情況等特點(diǎn)。采用TQFP-100封裝。CS8900A內(nèi)部結(jié)構(gòu)方框圖如圖7.1.3所示。圖7.1.3 CS8900A內(nèi)部結(jié)構(gòu)方框圖n1CS8900A工作原理工作原理nCS8900A有兩種工作模式:和I/O模式。當(dāng)配置成MEMORY MODE模式操作時,CS8900A的內(nèi)部寄存器和幀緩沖區(qū)映射到主機(jī)內(nèi)存中連續(xù)的4KB的塊中,主機(jī)可以通過這個塊直接訪問CS8900A的內(nèi)部寄存器和幀緩沖區(qū)。MEMORY 模式需要硬件上多根地址線和網(wǎng)卡相連。而在I/O MODE模式,對任何寄存器操作均要通過I/O端口0寫入或讀出。I/O MODE模式在硬件上
20、實(shí)現(xiàn)比較方便,而且這也是芯片的默認(rèn)模式。在I/O模式下,PacketPage存儲器被映射到CPU的8個16位的I/O端口上。在芯片被加電后,I/O基地址的默認(rèn)值被置為300H。n使用CS8900A作為以太網(wǎng)的物理層接口,在收到由主機(jī)發(fā)來的數(shù)據(jù)報后(從目的地址域到數(shù)據(jù)域),偵聽網(wǎng)絡(luò)線路。如果線路忙,它就等到線路空閑為止,否則,立即發(fā)送該數(shù)據(jù)幀。在發(fā)送過程中,首先它添加以太網(wǎng)幀頭(包括前導(dǎo)字段和幀開始標(biāo)志),然后生成CRC校驗(yàn)碼,最后將此數(shù)據(jù)幀發(fā)送到以太網(wǎng)上。n在接收過程中,它將從以太網(wǎng)收到的數(shù)據(jù)幀在經(jīng)過解碼、去幀頭和地址檢驗(yàn)等步驟后緩存在片內(nèi)。在CRC校驗(yàn)通過后,它會根據(jù)初始化配置情況,通知主機(jī)
21、CS8900A收到了數(shù)據(jù)幀,最后,用某種傳輸模式(FO模式、Memory模式、DMA模式)傳到主機(jī)的存儲區(qū)中。n2CS 8900A引腳端和功能引腳端和功能nCS 8900A的ISA總線接口引腳端和功能如表7.1.3所示,EEPROM和引導(dǎo)編程接口引腳端和功能如表7.1.4所示,IOBASE-T接口引腳端和功能如表7.1.5所示,附加單元接口AUD引腳端和功能如表7.1.6所示,通用引腳端和功能如表7.1.7所示。引腳類型功能SA0:19I地址總線SD0:15I/O雙向數(shù)據(jù)總線,三態(tài)輸出RESETI復(fù)位輸入端,高電平有效(至少保持400ns)AEN I地址使能,高電平有效MEMRI存儲器讀信號,
22、低電平有效MEMWI存儲器寫信號,低電平有效MEMCS 16O存儲器16位選擇信號,OC(集電極開路)輸出REFRESHI刷新信號,低電平有效。當(dāng)REFRESH為低電平時,MEMR,MEMW,IOR,IOW,DMACK0,DMACKl和DMACK2都被忽略表7.1.3 ISA總線接口引腳端和功能IORII/O讀信號,低電平有效IOWII/O寫信號,低電平有效IOCS 16I16位I/O片選信號,低電平有效IOCHRDYOI/O通道就緒信號,OC(集電極開路)輸出SBHEI系統(tǒng)總線高位使能信號,低電平有效INTRQ0:2O中斷請求信號,三態(tài)輸出DMARQ0:2ODMA請求信號,三態(tài)輸出DMACK
23、0:2IDMA應(yīng)答信號,低電平有效CHIPSELI片選信號,低電平有效表7.1.4 EEPROM和引導(dǎo)編程接口引腳端和功能引腳類型功能EESKIEEPROM時鐘輸入信號EECSIEEPROM片選輸入信號,低電平有效EEDataINIEEPROM數(shù)據(jù)輸入,內(nèi)部上拉ELCSI外部邏輯片選信號,內(nèi)部上拉EEDataOUTOEEPROM數(shù)據(jù)輸出CSOUTO外部引導(dǎo)編程選擇信號輸出,低電平有效表7.1.5 IOBASE-T接口引腳端引腳類型功能TXD+/TXDO數(shù)據(jù)發(fā)送,差分對管輸出RXD/RXDI數(shù)據(jù)接收,差分對管輸入表7.1.6 附加單元接口引腳端和功能引腳類型功能DO/DOOAUI數(shù)據(jù)輸出,差分對
24、管輸出DI/DIIAUI數(shù)據(jù)輸入,差分對管輸入CI/CIIAUI振動輸入,差分對管輸入表7.1.7 通用引腳端和功能引腳類型功能XTAL 1:2I/O晶體振蕩器輸入輸出SLEEPI硬件睡眠控制輸入信號,低電平有效,內(nèi)部上拉LINKLED/HCOO線路正常輸出信號或主控制器輸出0信號,低電平有效,OC(集電極開路)輸出BSTAUTS/HC1O總線狀態(tài)輸出信號或主控制器輸出1信號,低電平有效,OC(集電極開路)輸出LANLEDO網(wǎng)絡(luò)狀態(tài)指示輸出信號,OC(集電極開路)輸出TESTI測試輸入使能信號,低電平有效,內(nèi)部上拉RESI基準(zhǔn)電阻輸入端 DVDD 1:4I數(shù)字電路電源DVSS1:4I數(shù)字電路地
25、AVDD 1:4I模擬電路電源AVSS1:4I模擬電路地3電路連接電路連接采用CS 8900A與S3C2410A連接構(gòu)成的以太網(wǎng)接口電路如圖7.1.4所示。n4CS8900A的以太網(wǎng)接口驅(qū)動程序的以太網(wǎng)接口驅(qū)動程序于明于明n(1)初始化函數(shù)n初始化函數(shù)完成設(shè)備的初始化功能,由數(shù)據(jù)結(jié)構(gòu)device中的init函數(shù)指針來調(diào)用。加載網(wǎng)絡(luò)驅(qū)動模塊后,就會調(diào)用初始化過程。首先通過檢測物理設(shè)備的硬件特征來檢測網(wǎng)絡(luò)物理設(shè)備是否存在,之后配置設(shè)備所需要的資源。比如,中斷。這些配置完成之后就要構(gòu)造設(shè)備的數(shù)據(jù)結(jié)構(gòu)device,用檢測到的數(shù)據(jù)初始化device中的相關(guān)變量,最后向Linux內(nèi)核中注冊該設(shè)備并申請內(nèi)存
26、空間。函數(shù)定義為: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在這個網(wǎng)絡(luò)設(shè)備驅(qū)動程序中,設(shè)備的數(shù)據(jù)結(jié)構(gòu)device就是dev_cs89x0。探測網(wǎng)絡(luò)物理設(shè)備是否存在,利用cs89x0_probe函數(shù)實(shí)現(xiàn),通過調(diào)用register_netdrv(struct net_device*dev)函數(shù)進(jìn)行注冊。n與init函數(shù)相對應(yīng)的cleanup函數(shù)在模塊卸載時運(yùn)行,主要完成資源的釋放工作,如取消設(shè)備注冊、釋放內(nèi)存、釋放端口等。函數(shù)定義為: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)打開函數(shù)n打開函數(shù)在網(wǎng)絡(luò)設(shè)備驅(qū)動程序中是在網(wǎng)絡(luò)設(shè)備被激活時調(diào)用,即設(shè)備狀態(tài)由down至up。函數(shù)定義為: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打開函數(shù)中對寄存器操作使用了兩個函數(shù):readreg和writereg。readreg函數(shù)用來讀取寄存器內(nèi)容,writereg函數(shù)用來寫寄存器。函數(shù)定義為: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)關(guān)閉函數(shù)n關(guān)閉函數(shù)釋放資源減少系統(tǒng)負(fù)擔(dān),設(shè)備狀態(tài)有up轉(zhuǎn)為down時被調(diào)用。
38、函數(shù)定義為: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)發(fā)送函數(shù)n首先,在網(wǎng)絡(luò)設(shè)備驅(qū)動加載時,通過device域中的init函數(shù)指針
39、調(diào)用網(wǎng)絡(luò)設(shè)備的初始化函數(shù)對設(shè)備進(jìn)行初始化,如果操作成功,就可以通過device域中的open函數(shù)指針調(diào)用網(wǎng)絡(luò)設(shè)備的打開函數(shù)打開設(shè)備,再通過device域中的包頭函數(shù)指針hard_header來建立硬件包頭信息。最后,通過協(xié)議接口層函數(shù)dev_queue_xmit調(diào)用device域中的hard_start_xmit函數(shù)指針來完成數(shù)據(jù)包的發(fā)送。n如果發(fā)送成功,hard_start_xmit釋放sk_buff,返回0。如果設(shè)備暫時無法處理,比如,硬件忙,則返回l。此時如果dev-tbusy置為非0,則系統(tǒng)認(rèn)為硬件忙,要等到dev-tbusy置0以后才會再次發(fā)送。tbusy的置0任務(wù)一般由中斷完成。硬
40、件在發(fā)送結(jié)束會產(chǎn)生中斷,這時可以把tbusy置0,然后用mark_bh()調(diào)用通知系統(tǒng)可以再次發(fā)送。n在CS8900A驅(qū)動程序中,網(wǎng)絡(luò)設(shè)備的傳輸函數(shù)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)中斷處理和接收函數(shù)n網(wǎng)絡(luò)設(shè)備接收數(shù)據(jù)通過中斷實(shí)現(xiàn),當(dāng)數(shù)據(jù)收到后,產(chǎn)生中斷,在中斷處理程序中驅(qū)動程序申請一塊sk_buff(skb),從硬件讀出數(shù)據(jù)放置到申請好的緩沖區(qū)里。接下來,填充sk_buff中的一些信息。處理完后,如果是獲得數(shù)據(jù)包,則執(zhí)行數(shù)據(jù)接收子程序,該函數(shù)被中斷服務(wù)程序調(diào)用。函數(shù)定義: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()函數(shù)中調(diào)用netif_rx()把數(shù)據(jù)傳送到協(xié)議層。netif_rx()函數(shù)把數(shù)據(jù)放入處理隊(duì)列,然后返回,真正的處理是在中斷返回以后,這樣可以減少中斷時間。調(diào)用netif_rx()后,驅(qū)動程序不能再存取數(shù)據(jù)緩
47、沖區(qū)if_rx()函數(shù)在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中斷函數(shù)net_interrupt在打開函數(shù)中申請,中斷發(fā)生后,首先驅(qū)動中斷管腳為高電平,然后主機(jī)讀取CS8900A中的中斷申請序列ISQ值,以確定事件類型,根據(jù)事件類型做出響應(yīng)。函數(shù)定義為: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,控制器局域網(wǎng))是德國Bosch公司于1983年為汽車應(yīng)用而開發(fā)的,它是一種現(xiàn)場總線(FieldBus),能有效支持分布式控制和實(shí)時控制的串行通信網(wǎng)絡(luò)。1993年11月,I
56、SO正式頒布了控制器局域網(wǎng)CAN國際標(biāo)準(zhǔn)(IS011898)。n一個理想的由CAN總線構(gòu)成的單一網(wǎng)絡(luò)中可以掛接任意多個節(jié)點(diǎn),實(shí)際應(yīng)用中節(jié)點(diǎn)數(shù)目受網(wǎng)絡(luò)硬件的電氣特性所限制。例如:當(dāng)使用Philips P82C250作為CAN收發(fā)器時,同一網(wǎng)絡(luò)中允許掛接110個節(jié)點(diǎn)。CAN可提供1 Mb/s的數(shù)據(jù)傳輸速率。CAN總線是一種多主方式的串行通信總線?;驹O(shè)計(jì)規(guī)范要求有高的位速率,高抗電磁干擾性,并可以檢測出產(chǎn)生的任何錯誤。當(dāng)信號傳輸距離達(dá)到10Km時CAN總線仍可提供高達(dá)50Kb/s的數(shù)據(jù)傳輸速率。CAN總線具有很高的實(shí)時性能,已經(jīng)在汽車工業(yè)、航空工業(yè)、工業(yè)控制、安全防護(hù)等領(lǐng)域中得到了廣泛應(yīng)用。nCA
57、N總線的通信介質(zhì)可采用雙絞線、同軸電纜和光導(dǎo)纖維,最常用的是雙絞線。通信距離與波特率有關(guān),最大通信距離可達(dá)10km,最大通信波特率可達(dá)1Mbps。CAN總線仲裁采用11位標(biāo)識和非破壞性位仲裁總線結(jié)構(gòu)機(jī)制,可以確定數(shù)據(jù)塊的優(yōu)先級,保證在網(wǎng)絡(luò)節(jié)點(diǎn)沖突時最高優(yōu)先級節(jié)點(diǎn)不需要沖突等待。CAN總線采用了多主競爭式總線結(jié)構(gòu),具有多主站運(yùn)行和分散仲裁的串行總線以及廣播通信的特點(diǎn)。CAN總線上任意節(jié)點(diǎn)可在任意時刻主動向網(wǎng)絡(luò)上其他節(jié)點(diǎn)發(fā)送信息而不分主次,因此可在各節(jié)點(diǎn)之間實(shí)現(xiàn)自由通信。nCAN總線信號使用差分電壓傳送,兩條信號線被稱為CAN_H和CAN_L,靜態(tài)時均是2.5V左右,此時狀態(tài)表示為邏輯1,也可以叫
58、做“隱性”。采用CAN_H比CAN_L高表示邏輯0,稱為“顯性”,通常電壓值為CAN_H=3.5V和CAN_L=1.5V。當(dāng)“顯性”位和“隱性”位同時發(fā)送的時候,最后總線數(shù)值將為“顯性”。nCAN總線的一個位時間可以分成四個部分:同步段,傳播時間段,相位緩沖段1和相位緩沖段2。每段的時間份額的數(shù)目都是可以通過CAN總線控制器編程控制,而時間份額的大小tq由系統(tǒng)時鐘tsys和波特率預(yù)分頻值BRP決定:tq=BRP/tsys。圖7.2.1說明了CAN總線的一個位時間的各個組成部分。圖7.2.1 CAN總線的一個位時間n 同步段:用于同步總線上的各個節(jié)點(diǎn),在此段內(nèi)期望有一個跳變沿出現(xiàn)(其長度固定)。
59、如果跳變沿出現(xiàn)在同步段之外,那么沿與同步段之間的長度叫做沿相位誤差。采樣點(diǎn)位于相位緩沖段1的末尾和相位緩沖段2開始處。n 傳播時間段:用于補(bǔ)償總線上信號傳播時間和電子控制設(shè)備內(nèi)部的延遲時間。因此,要實(shí)現(xiàn)與位流發(fā)送節(jié)點(diǎn)的同步,接收節(jié)點(diǎn)必須移相。CAN總線非破壞性仲裁規(guī)定,發(fā)送位流的總線節(jié)點(diǎn)必須能夠收到同步于位流的CAN總線節(jié)點(diǎn)發(fā)送的顯性位。n 相位緩沖段1:重同步時可以暫時延長。n 相位緩沖段2:重同步時可以暫時縮短。n 同步跳轉(zhuǎn)寬度:長度小于相位緩沖段。n同步段,傳播時間段,相位緩沖段1和相位緩沖段2的設(shè)定和CAN總線的同步、仲裁等信息有關(guān)。其主要思想是要求各個節(jié)點(diǎn)在一定誤差范圍內(nèi)保持同步。必
60、須考慮各個節(jié)點(diǎn)時鐘(振蕩器)的誤差和總線的長度帶來的延遲(通常每米延遲為5.5ns)。正確設(shè)置CAN總線各個時間段,是保證CAN總線良好工作的關(guān)鍵。n7.2.2 在嵌入式處理器上擴(kuò)展CAN總線接口n一些面向工業(yè)控制的嵌入式處理器本身就集成了一個或者多個CAN總線控制器。例如:韓國現(xiàn)代公司的hms30c7202(ARM720T內(nèi)核)帶有兩個CAN總線控制器; Phillips公司的LPC2194和LPC2294(ARM7TDMI內(nèi)核)帶有4個CAN總線控制器。CAN總線控制器主要是完成時序邏輯轉(zhuǎn)換等工作,要在電氣特性上滿足CAN總線標(biāo)準(zhǔn),還需要一個CAN總線的物理層芯片,用它來實(shí)現(xiàn)TTL電平到CAN總線電平特性的轉(zhuǎn)換,即CAN收發(fā)器。n實(shí)際上,多數(shù)嵌入式處理器都不帶CAN總線控制器。通常的解決方案是在嵌入式處理器的外部總線上擴(kuò)展CAN總線接口芯片,例如:Phillips公司的SJ
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《機(jī)器學(xué)習(xí)技術(shù)應(yīng)用》課件-pro1-2-1校園消費(fèi)數(shù)據(jù)的讀取與查看
- 《移動通信技術(shù)》課件-主題5 移動通信的編碼技術(shù)
- 先天性鼻咽部狹窄及閉鎖的臨床護(hù)理
- OPT美膚的臨床護(hù)理
- 手外傷的臨床護(hù)理
- 2025【合同范本】簡化版租約協(xié)議示例
- 企業(yè)招聘2025內(nèi)蒙古方鼎金榮集團(tuán)派駐聯(lián)通數(shù)字科技有限公司內(nèi)蒙古分公司招聘53人筆試參考題庫附帶答案詳解
- 《2025合同違約金預(yù)先扣除的法律后果》
- 2025陜西西鳳露酒有限公司招聘(38人)筆試參考題庫附帶答案詳解
- 2025《數(shù)據(jù)中心升級改造合同》
- 人教版三年級數(shù)學(xué)下冊暑假作業(yè)
- GB/T 44555-2024電子憑證會計(jì)檔案封裝技術(shù)要求
- 國企會計(jì)崗位筆試試題
- DL∕T 1475-2015 電力安全工器具配置與存放技術(shù)要求
- 杠桿CA1340自動車床
- 食材配送服務(wù)方案投標(biāo)方案(技術(shù)方案)
- 西方文明史導(dǎo)論智慧樹知到期末考試答案2024年
- JBT 11699-2013 高處作業(yè)吊籃安裝、拆卸、使用技術(shù)規(guī)程
- 24春國家開放大學(xué)《離散數(shù)學(xué)》大作業(yè)參考答案
- 汽車發(fā)動機(jī)原理(第5版) 課件 第三章 柴油機(jī)混合氣形成和燃燒
- 中央廚房項(xiàng)目計(jì)劃書
評論
0/150
提交評論