999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

設計以太網驅動

2006-07-27 10:49:50潘曉嵐王海花
計算機世界·技術與應用 2006年21期
關鍵詞:程序

潘曉嵐 楊 斌 王海花

文章以S3C4510B的以太網驅動程序為例,給出了驅動程序的一般設計方法,具體描述了驅動程序的初始化,數據接收和數據發送過程。

本文設計了基于S3C4510B的以太網驅動程序,并通過串口輸出。文章給出了對一般性網卡驅動程序的編寫,但在調試中,有兩點需要注意:一是ARM板是處于大端方式還是小端方式;二是注意字符串的定義,如設備名等。本文適用于所有與NE2000兼容的以太網控制器在uclinux操作系統上驅動程序的開發,并可以供嵌入式系統中驅動程序的開發者參考。

S3c4510b內嵌一個以太網控制器,支持媒體獨立接口(Media Independent Interface MII)和帶緩沖DMA接口(Buffer DMA Interface,BDI)。可在半雙工或全雙工模式下提供10M/100Mbps的以太網接入。在半雙工模式下,控制器支持CSMA/CD協議,在全雙工模式下支持IEEE802.3MAC控制層協議。

因此,S3C4510B內部實際上已經包含了以太網MAC控制,但并未提供物理層接口,因此,需外接一片物理芯片以提供以太網的接入通道。在該系統中,使用RTL8201作為以太網的物理層接口。

以太幀格式

以太網采用廣播機制,所有與網絡連接的工作站都可以看到網絡上傳遞的數據。它們通過查看包含在幀中的目標地址,確定是否進行接受或放棄。如果確定數據是發給自己的,工作站就會接受數據并傳遞給高層協議進行處理。

標準IEEE802.3幀結構由以下幾部分組成:幀頭(Preamble)、幀的起始定界標志(SFD-Start of Frame Delimiter)、目的地址(Destination)、源地址(source)、數據長度(Length)、數據(Data)和幀校驗序列(FCS)

在幀結構中,除了數據域的長度不固定外,其他域的長度都是固定不變的。在數據發送時,幀頭、幀起始定界符與校驗和都是由NIC自動填加的。在接收數據過程中,幀頭和幀起始定界符將由NIC跳過,即NIC一旦檢測到有效幀頭和幀起始定界符,就認為有效數據開始,并將有效數據存入接收緩沖環。存入接收緩沖環的數據包括:目的地址、源地址、數據域長度、數據域及校驗和。

幀頭是62位的1、0交替的位序列,即1010101010……10共62位。使用這一序列的目的是為了取得接收的串行數據的位同步信號。提取位同步信號的功能由SNI完成。

當發送禎時,每一禎都包含了62位的幀頭,在接收禎時,幀頭的62位1、0序列則跳過。即使在網絡數據傳輸時丟掉一些1、0序列,也不會影響有效數據的正確接收。

禎起始定界符負責檢測有效幀的字節起始位置,由連續2位1組成。一旦NIC的定界邏輯檢測到兩個連續的1,就認為有效幀已到,把接收到的串行數據以字節方式計數,并將數據送入FIFO(First In First Out)先入先出寄存器。

在網絡上傳輸數據時,由于某種原因,使幀頭中的某一位由0變為1,NIC就會接收到錯誤的幀(由CRC校驗邏輯完成),從而拒絕接收該幀數據。

下面定義了兩個結構體來描述以太幀頭和以太網幀。

/*以太網幀頭*/

typedef struct {

BYTE dest[MACLEN];

BYTE srce[MACLEN];

WORD ptype;

}ETHERHDR;

/*以太網接收幀的最大長度,包括校驗和CRC在內*/

#define MAXFRAMEC 1518 /*最大幀長度(包括CRC)*/

#define MINFRAMEC 64 /*最小幀長度(包括CRC)*/

/*高層驅動采用以太網的幀長度減去幀頭和校驗和的長度*/

#define ETHERMTU (MAXFRAME-sizeof(ETHERHDR)) //數據長度

type struct {

ETHERHDR h; /*幀頭*/

BYTE data[ETHERMTU]; /*數據*/

LWORD crc; /*CRC*/

}ETHERFRAME;

以太網卡初始化

驅動程序必須有一個初始化方法。在把驅動程序載入系統的時候會調用這個初始化程序。它做以下幾方面的工作:檢測設備,在初始化程序里可以根據硬件的特征檢查硬件是否存在,然后決定是否啟動這個驅動程序。配置和初始化硬件,在初始化程序可以完成對硬件資源的配置配置或協商好硬件占用的資源以后,就可以向系統申請這些資源。有些資源是可以和別的設備共享的,如中斷。有些是不能共享的,如IO、DMA。接下來要初始化device結構中的變量。最后,可以讓硬件正式開始工作。

為了使網卡處于在線工作狀態,能夠接收或發送數據,首先必須對相關的寄存器進行初始化。這些寄存器包括BDMATXCON、BDMARXCON、BDMATXPTR、BDMARXPTR、BDMARXLST、BDMASTAT、CAM、BDMATXBUF、BDMARXBUF等。

首先對以太網卡的寄存器進行初始化,并設置以太物理地址,參考程序如下:

int s3c4510_eth_init(unsigned char *mac_addr)

{

int i;

// reset BDMA and MAC

outl(BRxRS, BDMARXCON);

outl(BTxRS, BDMATXCON);

outl(MaxRxFrameSize, BDMARXLSZ);

outl(Reset, MACON);

outl(gMACCON, MACON);

s3c4510_eth_fd_init();

for(i = 0; i < 4; i++)

CAM_Reg(0) = (CAM_Reg(0) < < 8) | mac_addr[i];

for(i = 4; i < 6; i++)

CAM_Reg(1) = (CAM_Reg(1) < < 8) | mac_addr[i];

CAM_Reg(1) = (CAM_Reg(1) < < 16);

outl(0x0001, CAMEN);

outl(gCAMCON, CAMCON);

outl(gBDMATXCON, BDMATXCON);

outl(gMACTXCON, MACTXCON);

outl(gBDMARXCON, BDMARXCON);

outl(gMACRXCON, MACRXCON);

return 0;

}

數據發送

在網絡中,數據傳輸的過程是,發送方將待發送的數據按幀格式要求封裝成幀,然后通過網卡將幀發送到網絡的傳輸線上,接收方根據接收到的幀的目的地址來確定時候將該幀提交給上層應用程序。本地DMA通道使用緩沖環結構(Buffer Ring Structure)來提供對接收的幀進行緩存。該緩沖環由一系列固定長度的緩沖區組成,每一個緩沖區的長度位256字節,并將它稱為一頁。因此,也可以說緩沖環是由一系列的頁組成,每頁的容量為256字節。緩沖環用來存放接收到的幀。接收緩沖環的地址可以由起始頁(PAGE STAR)和終止頁(PAGE STOP)寄存器來指定。為了將待發送的幀送入網卡的發送緩沖區,必須使用NIC的遠程DMA寫操作來完成。

幀的發送是指將待發送的數據以幀的形式發送到網絡傳輸線上的過程,因此,數據的發送過程應包括以下幾個大步驟:得到Tx幀描述符;裝入以太幀;發送以太幀;改變BDMA所有權,能夠接收下一個幀。其流程如圖所示。參考程序如下:

int s3c4510_eth_send(unsigned char *data, int len)

{

struct frame_desc_struct *fd_ptr;

volatile unsigned long *fb_ptr;

unsigned char *fb_data;

int i;

// 1. Get Tx frame descriptor & data pointer

fd_ptr = (struct frame_desc_struct *)gtx_ptr;

fb_ptr = (unsigned long *)&fd;_ptr-> frame_data_ptr;

fb_data = (unsigned char *)fd_ptr->frame_data_ptr;

// 2. Check BDMA ownership

if(*fb_ptr & BDMA_owner)

return -1;

// 3. Prepare Tx Frame data to Frame buffer

memcpy(fb_data, data, len);

if (len < 60) {

for (i = len; i < 60; i++)

fb_data[i] = 0x00;

len = 60;

}

// 4. Set Tx Frame flag & Length Field

fd_ptr->reserved = (Padding | CRCMode | FrameDataPtrInc | LittleEndian | WA00 | MACTxIntEn);

fd_ptr->status_and_frame_lenght = (len & 0xFFFF);

// 5. Change ownership to BDMA

fd_ptr->frame_data_ptr |= BDMA_owner;

// 6. Enable MAC and BDMA Tx control register

outl(gBDMATXCON, BDMATXCON);

outl(gMACTXCON, MACTXCON);

// 7. Change the Tx frame descriptor for next use

gtx_ptr = (unsigned long)(fd_ptr-> next_frame_desc);

return 0;

}

數據接收

數據接收是指將網絡上的數據幀接收并緩存于網卡的接收緩沖環中,然后由主機程序將緩存環的幀讀走并存入內存中以備程序使用。從中可以看出,幀的接收過程分成兩步:第一步通過本地DMA將幀存入接收緩沖環;第二步是通過遠程DMA并在主機的配合下將接收緩沖環中的幀讀入內存。

一般設備收到數據后都會產生一個中斷,在中斷處理程序中驅動程序申請一塊sk_buff(skb),從硬件讀出數據放置到申請好的緩沖區里。接下來填充sk_buff中的一些信息。skb->dev = dev,判斷收到幀的協議類型,填入skb->protocol(多協 議的支持)。把指針skb->mac.raw指向硬件數據然后丟棄硬件幀頭(skb_pull)。還要設置skb->pkt_type,標明第二層(鏈路層)數據類型。可以是以下類型:PACKET_BROADCAST,鏈路層廣播;PACKET_MULTICAST,鏈路層組播;PACKET_SELF,發給自己的幀;PACKET_OTHERHOST,發給別人的幀(監聽模式時會有這種幀);最后調用netif_rx()把數據傳送給協議層。netif_rx()里數據放入處理隊列然后返回,真正的處理是在中斷返回以后,這樣可以減少中斷時間 (下面的參考程序只是中斷之后的部分程序)。部分參考程序如下:

int s3c4510_eth_rcv(unsigned char *data, int *len)

{

struct frame_desc_struct *fd_ptr;

unsigned long rx_status;

unsigned long bdma_status;

unsigned char *tmp;

// 1. Get Rx Frame Descriptor

fd_ptr = (struct frame_desc_struct *)grx_ptr;

if (fd_ptr->frame_data_ptr & BDMA_owner)

return -1;

rx_status = (fd_ptr->status_and_frame_lenght >> 16) & 0xffff;

// 2. Get current frame descriptor and status

bdma_status = inl(BDMASTAT);

// 3. Clear BDMA status register bit by write 1

outl(bdma_status | S_BRxRDF, BDMASTAT);

// 4. If Rx frame is good, then process received frame

*len = 0;

if (rx_status & Good) {

*len = (fd_ptr->status_and_frame_lenght & 0xffff) - 4;

tmp = (unsigned char *)fd_ptr->frame_data_ptr + 2;

// 6. Get received frame to memory buffer

memcpy(data, tmp, *len);

}

// 5. Change ownership to BDMA for next use

fd_ptr->frame_data_ptr |= BDMA_owner;

// Save Current Status and Frame Length field, and clear

fd_ptr->status_and_frame_lenght = 0x0;

// 6. Get Next Frame Descriptor pointer to process

grx_ptr = (unsigned long)(fd_ptr->next_frame_desc);

// 7. Check Notowner status

if (inl(BDMASTAT) & S_BRxNO) {

outl(S_BRxNO, BDMASTAT);

}

if ((inl(MACRXSTAT) & 0x400) == 0x400) {

outl(gBDMARXCON, BDMARXCON);

outl(gMACRXCON, MACRXCON);

}

return 0;

}

到此程序設計部分已經基本完成。

燒寫入內核

最后,我把程序燒寫入內核來驗證本次設計。首先將上述文件拷貝到drivers/net,然后編譯uClinux內核: 鍵入命令:make menuconfig,內核配置; 鍵入命令:make dep,來尋找依存關系;鍵入命令:make clean, 清除以前構造內核時生成的所有目標文件,模塊文件和一些臨時文件; 鍵入命令:make lib_only,編輯庫文件;鍵入命令:make user_only,編輯用戶應用程序;鍵入命令:make romfs,生成rom文件;鍵入命令:make image ,做到這一步的時候可能會出現錯誤的信息提示,這是因為第一次編譯時還沒有romfs.o,所以出錯,等romfs.o編譯好了以后,如果再進行內核的編譯,就不會出現這個錯誤信息了,它完全不影響內核的編譯,可以完全不必理會這個錯誤信息,繼續進行編譯工作; 鍵入命令:make,通過各個目錄的Makefile文件進行,會在各目錄下生成一大堆目標文件。

上述步驟完成后,就完成了對uClinux源碼的編譯工作。

猜你喜歡
程序
給Windows添加程序快速切換欄
電腦愛好者(2020年6期)2020-05-26 09:27:33
試論我國未決羈押程序的立法完善
人大建設(2019年12期)2019-05-21 02:55:44
失能的信仰——走向衰亡的民事訴訟程序
“程序猿”的生活什么樣
英國與歐盟正式啟動“離婚”程序程序
環球時報(2017-03-30)2017-03-30 06:44:45
基于VMM的程序行為異常檢測
偵查實驗批準程序初探
我國刑事速裁程序的構建
創衛暗訪程序有待改進
中國衛生(2015年3期)2015-11-19 02:53:32
恐怖犯罪刑事訴訟程序的完善
主站蜘蛛池模板: 亚洲中文无码h在线观看| 97久久免费视频| 久久精品亚洲中文字幕乱码| 免费观看国产小粉嫩喷水 | 午夜色综合| 少妇高潮惨叫久久久久久| 国产精品lululu在线观看| 全免费a级毛片免费看不卡| 国产成人精品午夜视频'| 精品免费在线视频| 欧美狠狠干| 欧美精品在线观看视频| 人妻无码中文字幕第一区| 亚洲成aⅴ人在线观看| 国产精品冒白浆免费视频| 欧洲成人免费视频| 天堂成人在线视频| 色哟哟国产成人精品| 国产粉嫩粉嫩的18在线播放91 | 丁香六月激情综合| 色成人亚洲| 国产精品专区第1页| 日韩精品一区二区三区中文无码| 久草性视频| 九色综合伊人久久富二代| 国产一级在线播放| 日韩精品无码免费一区二区三区| 啪啪免费视频一区二区| 亚洲色成人www在线观看| 亚洲91在线精品| 欧美精品xx| 国内黄色精品| 国产精品久久久久鬼色| 亚国产欧美在线人成| 第九色区aⅴ天堂久久香| 国产欧美在线| 亚洲视频免费播放| 国产综合另类小说色区色噜噜| 久久久国产精品免费视频| 国产精品午夜电影| 久久久久亚洲Av片无码观看| 久久美女精品国产精品亚洲| 2020国产精品视频| 国产精品人人做人人爽人人添| 国产精品自在线天天看片| 91视频精品| 久久99国产精品成人欧美| 欧洲欧美人成免费全部视频| 亚洲伦理一区二区| 亚洲综合在线最大成人| 99999久久久久久亚洲| 四虎影视国产精品| 啪啪永久免费av| 日韩麻豆小视频| 五月天天天色| 中文字幕伦视频| 日韩美一区二区| 91综合色区亚洲熟妇p| 亚洲色图欧美在线| 无码日韩精品91超碰| 茄子视频毛片免费观看| 国产 在线视频无码| 国产亚卅精品无码| 国产91线观看| 天堂亚洲网| 国产在线八区| 在线观看国产精美视频| 在线不卡免费视频| 亚洲av无码成人专区| 亚洲IV视频免费在线光看| 国产h视频免费观看| 91美女视频在线| 成人亚洲天堂| 午夜福利视频一区| 在线观看亚洲精品福利片| 毛片最新网址| 亚洲91精品视频| 国产人妖视频一区在线观看| 欧美在线一级片| 国产免费精彩视频| 欧美日韩v| 国产日韩欧美黄色片免费观看|