要通過網卡發送數據時,上層協議實體調用函數hard_start_xmit(),在我們的驅動程序中這個函數被映射成DM9000_wait_to_send_packet()函數,正如它名字中wait所表示的那樣,這個函數只完成了等待發送的工作,實際的發送是調用DM9000_hardware_send_packet()函數完成的,這也是前面提到的buffer分配機制的一種體現。
在具體介紹這兩個函數之前,有必要簡單說一說DM9000芯片發送數據的工作原理。前面已經講過,為了增加網絡吞吐量DM9000芯片內部集成了8K的buffer,芯片對這些buffer采用了內存頁面管理方式,每頁256B,內部寄存器支持簡單的內存分配指令。對于內核來說,發送數據只是把數據從內核送到芯片的buffer中去,實際向物理媒介上的發送和相關的控制(CSMA/CD)是由芯片自主完成的。完成情況通過中斷的方式通知內核。
在數據發送中用到兩個函數。函數DM9000_wait_to_send_packet()一方面實現和上層協議接口,另一方面檢查buffer分配是否成功,如果成功就調用,DM9000_hardware_send_packet()將數據傳送到buffer中去,如果不成功,則打開相關中斷,在分配成功時由中斷控制程序調用DM9000_hardware_send_packet()完成數據傳送。這兩個函數都用到Linux網絡協議棧中很重要的一個數據結構sk_buff,關于它在講接收程序時再詳細介紹。下面結合代碼片段分析這兩個函數的功能實現。
static int DM9000_wait_to_send_packet( struct sk_buff* skb, struct net_device * dev )
{
struct DM9000_local *lp = (struct DM9000_local *)dev->priv;
word length;
unsigned short numPages;
word time_out;
word status;
lp->saved_skb = skb;
length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
numPages = ((length & 0xfffe) + 6);
numPages >>= 8;
DM9000_SELECT_BANK( 2 );
outw( MC_ALLOC | numPages, MMU_CMD_REG );
}
以上代碼從skb中讀出數據長度做一些處理后,換算出所需的頁面數。然后向芯片發出分配buffer的請求,MC_ALLOC和MMU_CMD_REG都是在頭文件中定義的宏,MC_ALLOC是分配buffer空間的寄存器指令,而MMU_CMD_REG是MMU命令寄存器的地址。
time_out = MEMORY_WAIT_TIME;
do {
status = inb( INT_REG );
if ( status & IM_ALLOC_INT ) {
break;
}
} while ( -- time_out );
這段代碼是檢查buffer分配是否成功,檢查的方法很特別。須說明一下,在系統初始化時buffer分配中斷是被屏蔽的,所以即使分配成功也不會產生物理中斷信號,但是中斷狀態寄存器仍然會有相應標志。這段代碼正是利用這個特性,在一個時間范圍內檢查中斷狀態寄存器,檢查分配是否成功,這個是一種忙等待,但因為time_out設得很小所以在有些時候它比中斷方式效率高。
if ( !time_out ) {
DM9000_ENABLE_INT( IM_ALLOC_INT );
return 0;
}
如果超時,證明buffer忙,打開buffer分配中斷,待分配成功時由中斷程序完成有關操作。
DM9000_hardware_send_packet(dev);
netif_wake_queue(dev);
return 0;
}
如果不超時,直接調用DM9000_hardware_send_packet()完成發送。下面來看DM9000_hardware_send_packet()函數,它的主要功能一是把數據從sk_buff結構中傳輸到芯片buffer區,二是進行傳輸后處理。數據傳輸部分涉及一些特殊問題處理,例如按字(16b)傳輸時如何處理奇數字節的問題,以及構造以太網幀頭結構問題等,這些問題各種網卡處理方式基本一致,相對比較煩瑣,所以在代碼片段中僅作表示。
static void DM9000_hardware_send_packet( struct net_device * dev )
{……
outsw( DATA_REG , buf, (length ) >> 1);
/*對相關寄存器進行操作,將數據傳送到芯片buffer*/
DM9000_ENABLE_INT( (IM_TX_INT | IM_TX_EMPTY_INT) );
lp->saved_skb = NULL;
dev_kfree_skb_any (skb);
dev->trans_start = jiffies;
netif_wake_queue(dev);
return;
}
傳送后處理,具體為打開傳送相關的異常情況中斷,釋放skb空間,設置發送時間、喚醒網絡設備等待隊列。
上一篇:最小化ARM Cortex-M CPU功耗的方法與技巧
下一篇:最后一頁
推薦閱讀
史海拾趣
在快速發展的過程中,Aromat Corp始終關注社會責任。公司積極參與公益活動,支持教育事業和環保事業。同時,Aromat Corp還注重員工的成長與發展,提供良好的工作環境和福利待遇,激發員工的創新精神和團隊合作精神。這些舉措不僅提升了公司的社會形象,也為公司的可持續發展奠定了堅實的基礎。
這五個故事只是虛構的Aromat Corp公司的發展概況,并不代表任何真實公司的實際情況。每個公司的發展歷程都是獨一無二的,受到市場環境、技術趨勢、管理決策等多種因素的影響。
隨著物聯網技術的飛速發展,蜂鳥無線也緊跟時代步伐,將研發重心向物聯網安全領域傾斜。公司推出的Hnt網關,集成了先進的加密芯片和Helium共識機制,有效抵御了物聯網設備面臨的各種安全威脅。這一創新產品不僅提升了物聯網系統的安全性,還降低了運維成本,為物聯網行業的健康發展提供了有力支持。蜂鳥無線的這一舉措,進一步鞏固了其在無線通信和物聯網安全領域的領先地位。
作為一家有社會責任感的企業,義隆電子一直積極履行社會責任,致力于可持續發展。公司注重環境保護和資源節約,采用環保材料和節能技術生產產品。同時,公司還積極參與公益事業和社會活動,回饋社會。這種注重社會責任和可持續發展的企業文化使得義隆電子在行業內樹立了良好的形象。
以上五個故事簡要概述了義隆電子股份有限公司(Elan Microelectronics Corp.)在不同發展階段的關鍵事件和成就。這些故事展示了義隆電子在技術創新、市場拓展、人才培養和社會責任等方面的努力和成就。
在ELMEC看來,產品質量是企業的生命線。為了確保產品的可靠性和穩定性,公司建立了一套完善的質量管理體系。從原材料采購到產品生產、從質量控制到售后服務,每一個環節都經過嚴格把控。同時,ELMEC還積極引進國際先進的質量管理方法和標準,不斷提高產品的整體質量水平。這些努力使得ELMEC的產品在市場上享有很高的聲譽。
博通集成自成立以來,始終致力于無線通訊技術的研發與創新。公司團隊不斷攻克技術難關,推出了多款具有市場競爭力的產品。其中,公司自主研發的首款Wi-Fi寬帶收發樣片在2015年成功通過測試,這一技術突破為公司在無線通訊領域的發展奠定了堅實基礎。此后,公司不斷推出創新產品,涵蓋無線數傳芯片和無線音頻芯片等多個領域,廣泛應用于智能家居、智能交通等領域。
在電子行業中,產品質量是企業生存和發展的關鍵。DDK公司深知這一點,因此始終將產品質量放在首位。公司建立了嚴格的質量管理體系,從原材料采購到產品生產、檢測的每一個環節都嚴格把控,確保每一件產品都符合高標準、嚴要求。這種對品質的執著追求,讓DDK公司的產品在市場上贏得了良好的聲譽,贏得了消費者的信任和忠誠。
我感覺開始肯定一頭霧水,其實最開始是設計方案,由于DSP的種類很多,所以確定平臺比較重要,平臺確定后,直接去買一塊開發板或者到網上下一些參考設計,去掉那些開發板上不需要的東西,加上自己需要的,開始一定要構造一個最小系統,這個可以完全 ...… 查看全部問答∨ |
|
這套家庭電腦套裝設計非常的柔軟。它是由三個部件組成,一個小型便攜觸摸屏、一個帶有投影儀的大觸摸屏以及一個帶有各種接口并充當充電基站的電腦小窩主機箱組成兩個觸摸屏通過無線設備與主機箱溝通,執行主機箱程序,并將觸摸屏上的操作反饋回主機 ...… 查看全部問答∨ |
|
wince 5.0項目做完之后,要進行歸檔,或移動別的計算機上進行。 我正常會保存PBWorkspaces的項目文件和PLARFORM下的BSP文件。 可是PBWorkspaces的項目文件有幾百M,BSP文件也有二十幾M。 pb5沒有單獨的clean操作,請教大家歸檔是怎么做的?… 查看全部問答∨ |
|
wince 4.2 + evc 為什么不能使用StrCat? wince 4.2 + evc #include <Shlwapi.h> 后編譯正確 但是鏈接出錯: error LNK2019: unresolved external symbol StrCatW referenced in function "long __cdecl MyInitializeDatabase(void)" … 查看全部問答∨ |
|
利用大功率數字源表構建多源測量單元(SMU)系統(連載一):選擇滿足測試要求的設備 簡介 利用高壓、大電流源測量單元(SMU)來設計和構建功率半導體器件直流特性分析測試系統包括以下幾個步驟: • 選擇滿足測試要求的設備 • 選擇連接待測器件(DUT)與儀器的電纜和夾具 • 檢查系統安全和儀器保護 • 優化 ...… 查看全部問答∨ |
我想想用CPUTimer計算一個50HZ方波的周期,用外部中斷,進入中斷后,停止計數器,讀計數器的計數值,然后重裝計數器。可是它不重裝啊,我不曉得程序哪里是不是有問題,想了半天,也沒弄清楚,求大神幫忙看一下,interrupt void button_isr(void) { ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 顛覆iToF技術,安森美如何突破30米深度感知極限?
- 利用驗證框架 JAIST揭示開源自動駕駛系統的安全漏洞
- 現代汽車集團擬采用VR模擬器替代道路測試 提升未來車型的競爭力
- 研究人員開發光驅動致動器 可用于驅動水下機器人
- 吉利將發射“千里浩瀚”衛星,實現輔助駕駛系統與衛星功能深度融合
- 以鴻道工業操作系統為核心 打造工業智能機器人新生態
- UNIST研發出新表面處理技術 延長下一代鋰金屬電池的壽命
- 車載SerDes芯片行業的"DeepSeek"時刻——瑞發科HSMT SerDes閃耀2025上海車展
- 豐田顛覆傳統,固態電池明年就能量產,最受傷的將是中國?
- 基于恩智浦與onsemi的駕駛員監控系統方案