国产肉体XXXX裸体137大胆,国产成人久久精品流白浆,国产乱子伦视频在线观看,无码中文字幕免费一区二区三区 国产成人手机在线-午夜国产精品无套-swag国产精品-国产毛片久久国产

新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 嵌入式Linux網(wǎng)絡(luò)驅(qū)動(dòng)程序的開(kāi)發(fā)及實(shí)現(xiàn)原理

嵌入式Linux網(wǎng)絡(luò)驅(qū)動(dòng)程序的開(kāi)發(fā)及實(shí)現(xiàn)原理

作者: 時(shí)間:2009-12-29 來(lái)源:網(wǎng)絡(luò) 收藏
2.2.2 主要的操作方法
int (*init)(struct net_device *dev); 設(shè)備初始化和向系統(tǒng)注冊(cè)的函數(shù),僅調(diào)用一次;
int (*open)(struct net_device *dev);設(shè)備打開(kāi)接口函數(shù),當(dāng)用ifconfig激活設(shè)備時(shí)被調(diào)用,注冊(cè)所用的系統(tǒng)資源(I/O端口,IRQ,DMA等)同時(shí)激活硬件并增加使用計(jì)數(shù);
int (*stop)(struct net_device *dev);執(zhí)行open方法的反操作;
*hard_start_xmit;初始化數(shù)據(jù)包傳輸?shù)暮瘮?shù);
*hard_header;該函數(shù)(在hard_start_xmit前被調(diào)用)根據(jù)先前檢索到的源和目標(biāo)硬件地址建立硬件頭。 eth_header是以太網(wǎng)類(lèi)型接口的默認(rèn)函數(shù);
2.3的編寫(xiě)及
系統(tǒng)各個(gè)層次之間的數(shù)據(jù)傳送都是通過(guò)套接字緩沖區(qū)sk_buff完成的,sk_buff數(shù)據(jù)結(jié)構(gòu)是各層協(xié)議數(shù)據(jù)處理的對(duì)象。sk_buff與網(wǎng)絡(luò)之間交換數(shù)據(jù)的媒介,向網(wǎng)絡(luò)發(fā)送數(shù)據(jù)時(shí),必須從其中獲取數(shù)據(jù)源和數(shù)據(jù)長(zhǎng)度;驅(qū)動(dòng)程序從網(wǎng)絡(luò)上接收到數(shù)據(jù)后也要將數(shù)據(jù)保存到sk_buff中才能交給上層協(xié)議處理。
對(duì)于實(shí)際以太網(wǎng)驅(qū)動(dòng)程序,可以參照內(nèi)核源碼樹(shù)中的相應(yīng)模板程序,重點(diǎn)理解網(wǎng)絡(luò)驅(qū)動(dòng)的和程序的結(jié)構(gòu)框架,然后針對(duì)的特定硬件改寫(xiě)代碼,相應(yīng)的操作函數(shù)。下面結(jié)合作者利用2.6.18內(nèi)核在深圳優(yōu)龍公司的FS2410板(SAMSUNG S3C2410處理器)上移植編寫(xiě)CS8900A網(wǎng)卡驅(qū)動(dòng)程序的實(shí)例,說(shuō)明網(wǎng)絡(luò)驅(qū)動(dòng)程序的實(shí)現(xiàn)。
2.3.1網(wǎng)絡(luò)設(shè)備初始化
網(wǎng)絡(luò)設(shè)備的初始化是由net_device結(jié)構(gòu)中的init函數(shù)實(shí)現(xiàn)的,內(nèi)核加載網(wǎng)絡(luò)驅(qū)動(dòng)模塊后,就會(huì)調(diào)用初始化過(guò)程。實(shí)例中初始化函數(shù)_init cs8900_probe中主要完成的工作:
a.調(diào)用內(nèi)核中通用的設(shè)置以太網(wǎng)接口的函數(shù)ether_setup();
b.填充net_device結(jié)構(gòu)體變量dev中其它大部分成員;
c.調(diào)用check_mem_region()檢測(cè)I/O地址空間,然后調(diào)用request_mem_region()申請(qǐng)以dev->base_addr為起始地址的16個(gè)連續(xù)的 I/O地址空間;
d.通過(guò)cs8900_read()探測(cè)網(wǎng)卡CS8900A,讀取ID信息;
e.設(shè)置CS8900A的INTRQ0作為中斷信號(hào)輸出引腳;
f.將MAC地址寫(xiě)入CS8900A的IA寄存器中;
g.通過(guò)register_netdev()將CS8900A注冊(cè)到全局網(wǎng)絡(luò)設(shè)備鏈表中;
2.3.2打開(kāi)(或關(guān)閉)網(wǎng)絡(luò)設(shè)備
系統(tǒng)響應(yīng)ifconfig命令時(shí),打開(kāi)(關(guān)閉)一個(gè)網(wǎng)絡(luò)接口。ifconfig命令開(kāi)始會(huì)調(diào)用ioctl(SIOCSIFADDR)來(lái)將地址賦予接口。響應(yīng)SIOCSIFADDR由內(nèi)核來(lái)完成,與設(shè)備無(wú)關(guān)。接著,ifconfig命令會(huì)調(diào)用ioctl(SIOCSIFFLAGS)設(shè)置dev->flag的IFF_UP位來(lái)打開(kāi)設(shè)備,這個(gè)調(diào)用會(huì)使設(shè)備的open方法得到調(diào)用。(當(dāng)ifconfig調(diào)用ioctl(SIOCSIFFLAGS)清除dev->flag的IFF_UP位時(shí),設(shè)備的stop方法將被調(diào)用)
實(shí)例中利用cs8900_start()函數(shù)打開(kāi)網(wǎng)絡(luò)設(shè)備,主要完成的工作:
a.通過(guò)set_irq_type()向內(nèi)核注冊(cè)網(wǎng)絡(luò)設(shè)備的中斷處理程序;
b.通過(guò)cs8900_set()設(shè)置CS8900A網(wǎng)卡中各控制寄存器和配置寄存器;
c.通過(guò)內(nèi)核中netif_start_queue()函數(shù)開(kāi)啟網(wǎng)絡(luò)接口的數(shù)據(jù)傳輸隊(duì)列;
2.3.3網(wǎng)絡(luò)數(shù)據(jù)包的發(fā)送
數(shù)據(jù)包的發(fā)送和接收是網(wǎng)絡(luò)驅(qū)動(dòng)程序中實(shí)現(xiàn)的兩個(gè)最重要的任務(wù)。當(dāng)網(wǎng)絡(luò)設(shè)備被激活時(shí),net_device結(jié)構(gòu)中的open方法被調(diào)用,它負(fù)責(zé)打開(kāi)設(shè)備并調(diào)用net_device結(jié)構(gòu)中的hard_header函數(shù)指針建立硬件幀頭信息。最后通過(guò)函數(shù)dev_queue_xmit()來(lái)調(diào)用net_device結(jié)構(gòu)中的hard_start_xmit方法把存放在sk_buff中的數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)物理設(shè)備。如果發(fā)送成功,則在hard_start_xmit中釋放sk_buff并返回0;如果硬件設(shè)備忙暫時(shí)無(wú)法處理,則返回1。網(wǎng)絡(luò)硬件在發(fā)送完數(shù)據(jù)包后會(huì)產(chǎn)生中斷,把dev->tbusy置0,通知系統(tǒng)可以再次發(fā)送。
實(shí)例中,hard_start_xmit方法即為網(wǎng)絡(luò)設(shè)備數(shù)據(jù)發(fā)送函數(shù)cs8900_send_start(),該函數(shù)實(shí)現(xiàn)把數(shù)據(jù)發(fā)送到以太網(wǎng)上,由網(wǎng)絡(luò)協(xié)議接口層函數(shù)dev_queue_xmit()對(duì)其調(diào)用。cs8900_send_start()中主要完成的工作:
a.發(fā)送數(shù)據(jù)前關(guān)閉中斷,中止網(wǎng)絡(luò)設(shè)備的數(shù)據(jù)傳輸隊(duì)列;
b.向CS8900A寄存器TxCMD中寫(xiě)入傳送數(shù)據(jù)命令控制字,向寄存器TxLength中寫(xiě)入待發(fā)送數(shù)據(jù)幀長(zhǎng)度;
c.通過(guò)cs8900_read()反復(fù)讀取CS8900A總線(xiàn)狀態(tài)寄存器BusST信息,直到其已經(jīng)準(zhǔn)備好接收來(lái)自主機(jī)的數(shù)據(jù);
d.調(diào)用cs8900_frame_write()將待發(fā)數(shù)據(jù)送入CS8900A的sk_buff中,硬件設(shè)備會(huì)將數(shù)據(jù)幀發(fā)送到以太網(wǎng)上;
e.記錄數(shù)據(jù)幀的發(fā)送時(shí)刻,打開(kāi)中斷,釋放sk_buff緩存,函數(shù)返回0;
linux操作系統(tǒng)文章專(zhuān)題:linux操作系統(tǒng)詳解(linux不再難懂)


評(píng)論


相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉