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
恐怖犯罪刑事訴訟程序的完善
主站蜘蛛池模板: 一级黄色网站在线免费看| 国产精品v欧美| 激情国产精品一区| 91在线播放国产| 99久久99这里只有免费的精品| 亚洲国产精品久久久久秋霞影院| 国产精品第一区在线观看| 视频二区欧美| 日韩二区三区无| 热思思久久免费视频| 狠狠色丁香婷婷| 一边摸一边做爽的视频17国产| 欧美五月婷婷| 久久香蕉国产线| 久久精品人人做人人爽| 精品久久国产综合精麻豆| lhav亚洲精品| 国产成人综合日韩精品无码首页| 日韩美女福利视频| 全色黄大色大片免费久久老太| 国产人在线成免费视频| 成年人福利视频| 无码专区第一页| 91网址在线播放| 亚洲制服丝袜第一页| 日本一本在线视频| 99热这里只有精品在线观看| 欧洲亚洲欧美国产日本高清| 国产白浆视频| 亚洲精品你懂的| 精品国产香蕉伊思人在线| 国产高清在线丝袜精品一区| 国产在线观看高清不卡| 欧美激情福利| 中国毛片网| 免费不卡视频| 伊人AV天堂| 日本在线视频免费| 伊大人香蕉久久网欧美| 国产免费精彩视频| 亚洲AV人人澡人人双人| 狠狠做深爱婷婷久久一区| 永久免费无码成人网站| 欧美成人二区| a色毛片免费视频| 国产极品粉嫩小泬免费看| 91精品在线视频观看| 国产jizzjizz视频| 久久不卡精品| 精品综合久久久久久97| 人妻中文久热无码丝袜| 九九线精品视频在线观看| 天堂成人在线| 26uuu国产精品视频| 亚洲精品天堂自在久久77| 久久婷婷人人澡人人爱91| 亚洲综合香蕉| 潮喷在线无码白浆| 欧美不卡视频在线| 久久人妻系列无码一区| 国产亚洲精品自在线| 亚洲精品无码av中文字幕| 欧美成一级| 最新亚洲人成无码网站欣赏网 | 国产人免费人成免费视频| 久久国产av麻豆| 久久免费看片| 国产一区二区影院| 中文字幕欧美成人免费| 亚洲国产看片基地久久1024| 国产精品大白天新婚身材| 日本精品中文字幕在线不卡| 国产精品成人啪精品视频| 扒开粉嫩的小缝隙喷白浆视频| 日韩美毛片| 国产亚洲欧美日韩在线观看一区二区| 岛国精品一区免费视频在线观看| 高清码无在线看| 好紧好深好大乳无码中文字幕| 玖玖免费视频在线观看| 日韩在线第三页| 日本黄网在线观看|