27.Linux-DM9000C網卡移植(詳解)

来源:http://www.cnblogs.com/lifexy/archive/2017/11/03/7777961.html
-Advertisement-
Play Games

上一節 我們學習了: 網卡驅動介紹以及製作虛擬網卡驅動: http://www.cnblogs.com/lifexy/p/7763352.html 接下來本節,學習網卡晶元DM9000C,如何編寫移植DM9000C網卡驅動程式。 1.首先來看DM9000C原理圖 如下圖所示: (#:表示低電平有效) ...


上一節 我們學習了:  

網卡驅動介紹以及製作虛擬網卡驅動:  http://www.cnblogs.com/lifexy/p/7763352.html

接下來本節,學習網卡晶元DM9000C,如何編寫移植DM9000C網卡驅動程式。

 


 

1.首先來看DM9000C原理圖

如下圖所示:

 

  (#:表示低電平有效)

  • SD0~15: 16位數據線,有CMD引腳決定訪問類型
  • CMD:      命令線,當CMD為高,表示SD 傳輸的是數據,CMD為低表示傳輸的是地址
  • INT:         中斷引腳,接在2440的GPF7腳上
  • IOR#:      讀引腳,接在2440的nOE腳上
  • IOW#:     寫引腳,接在2440的nWE腳上
  • CS#:       片選,放在2440的bank4的片選上面

1.1其中2440手冊的bank4地址區間如下圖:

 

bank4的區間位於: 0X20000000~0X28000000,當我們訪問這個區間的地址,記憶體控制器便會使能網卡DM9000C的使能腳,所以我們的DM9000C的io基地址=0X20000000

其中DM9000C的CMD引腳接在bank4的LADDR2上面

所以當訪問的io基地址=0X2000 0000,表示讀寫的地址里的內容是DM9000C的地址

訪問的io基地址=0X2000 0100,表示讀寫的地址里的內容是DM9000C的數據

 

1.2 DM9000C收發過程

當DM9000C收到外部的數據後,會暫存到內部地址中,然後產生一個上升沿中斷,等待2440讀取數據

當DM9000C將2440的數據轉發出去後,也會產生一個上升沿中斷給2440

如下圖所示,DM9000C的中斷引腳位於pin34腳

 

接在2440的GPF7引腳上,使用的中斷為EINT7

 

接下來便來修改廠家提供的DM9000C源代碼

2.發現它的init_module()入口函數前有個條件編譯

所以要註釋掉 “#ifdef MODULE” 和 “#endif”

3.修改入口出口函數名,並修飾它們(修改函數名避免與內核的其它函數重名)

 

 

4.修改驅動的硬體相異性(設置基地址,寄存器,中斷等)

4.1先來找找代碼在哪裡初始化DM9000C硬體的

進入dm9000c_init()

       -> dmfe_probe()

其中dmfe_probe()函數如下:

struct net_device * __init dmfe_probe(void)
{
struct net_device *dev;

dev= alloc_etherdev(sizeof(struct board_info));          //分配一個net_device結構體
... ...

err = dmfe_probe1(dev);                                 //調用dmfe_probe1()函數
... ...

err = register_netdev(dev);                            //向內核註冊net_device結構體
... ...
}

顯然dmfe_probe1()函數就是用來初始化DM9000C硬體和設置net_device結構體的成員用的

 

4.2 進入dmfe_probe1()函數

如下圖,這個iobase 變數就是我們DM9000C的io基地址0x20000000

 

 

iobase的作用:

如上圖, 讀一次DM9000C的VID低位元組之前,需要先將地址賦為0x20000000,也就是將DM9000C的CMD置0,然後向0x20000000寫入要讀的DM9KS_VID_L地址值

最後再將地址+4,也就是賦為0x20000100,將CMD置1,然後讀出0x20000100的值,也就是DM9000C的VID低位元組

DM9000C的讀寫方式都是這樣的,先將CMD置0,寫入DM9000C的地址,然後再將CMD置1,來讀寫數據

 

4.3所以在init函數中便重新設置iobase 變數,其中iobase是int型

 

併在exit出口函數中,添加iounmp()

 

4.4 繼續進入dmfe_probe1()函數,往下看

如下圖所示,屏蔽紅框里的代碼,該代碼用來核對版本,我們的DM9000C版本號不一樣,所以要屏蔽

4.5 在init函數中,修改中斷名,將irq改為IRQ_EINT7

 

4.6 修改中斷

當使用了register_netdev()註冊了網卡驅動net_device後,在內核中使用ifconfig就會進入net_device->open成員函數申請中斷,激活隊列等

所以我們要修改open成員函數的申請中斷函數,將觸發中斷改為“IRQT_RISING”,上升沿觸發

 

5.接下來便開始設置2440的存儲控制寄存器

設置2440的bank4的硬體位寬,時序,因為不同的硬體,涉及的數據收發都不同,

5.1設置BWSCON匯流排寬度控制寄存器

我們只設置BANK4的內容,所以只有下麵3個(BANK0的位寬由OM[1:0] 硬體設置)

 

設置ST4=0,不使用UB/LB(UB/LB:表示高位元組與低位元組數據是否分開傳輸)

設置WS4=0,其中WAIT引腳為PE4,而我們DM9000C沒有引腳接入PE4,所以禁止

設置DW4=0x01,我們的DM9000C的數據線為16位

5.2設置BANKCON4控制寄存器

 

 設置這些時序之前,首先來看DM9000C晶元手冊時序圖和2440的時序圖

 

參考上圖,得出BANKCON4 寄存器設置如下(HCLK=100MHZ,1個時鐘等於10ns)

設置Tacs=0,CS和CMD信號可以同時進行(CMD腳就是2440的地址引腳)

設置Tcos=T1=0(CS片選使能後維持時間)

設置Tacc=T2=0,要>=10ns(讀寫信號的訪問維持時間)

設置Tcoh=T4=1,要>=3ns(片選結束維持時間)

設置Tcah=T8=0, CS和CMD信號可以同時結束(地址匯流排結束維持時間)

代碼如下圖,在init入口函數中設置

 

 

與硬體相關的部分已經改好了,接下來開始編譯

6.編譯測試

編譯之前,首先添加該驅動需要的內核頭文件:

#include <asm/delay.h>
#include <asm/irq.h>
#include <linux/irq.h>
#include <asm/io.h>
#include <asm/arch-s3c2410/regs-mem.h>

 

編譯無誤後,便開始測試DM9000C驅動程式:

1) 把dm9dev9000c.c放到內核的drivers/net目錄下,來替換原來內核的DM9000C

2) 修改drivers/net/Makefile 


obj-$(CONFIG_DM9000) += dm9000.o
改為(如下圖所示)
obj-$(CONFIG_DM9000) += dm9dev9000c.o

 

 

3) make uImage

如下圖,說明新的驅動已編譯進內核

 

 

4) 使用新內核啟動

ifconfig eth0 192.168.2.107

ping 192.168.2.1

如下圖,可以ping通,說明移植成功

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • find ./ -name "*.sql" | awk '{ cmd_str="\""$0"\""; print cmd_str}' | xargs grep -rn IFUSEDESTROUTE dir /v8t/ngtf/server/trade_server:$cdir:$cwdbreak c ...
  • init 6是重啟或者rebootinit 0是關機shutdown三種網路模式:橋接模式:虛擬機和宿主機是兄弟關係,統一由宿主機連接的路由器分發ipNAT模式:虛擬機和宿主機是父子關係,宿主機的vmnet8虛擬網卡充當路由器分發ip 由於虛擬網卡也要占用一個ip所以虛擬網關是從2開始的僅主機模式: ...
  • 問題導讀: 1.zookeeper在kafka的作用是什麼? 2.kafka中幾乎不允許對消息進行“隨機讀寫”的原因是什麼? 3.kafka集群consumer和producer狀態信息是如何保存的? 4.partitions設計的目的的根本原因是什麼? 一、入門 1、簡介 Kafka is a d ...
  • using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;u ...
  • Linux BSP 開發的基礎就是和GPIO打交道, 下麵總結下這幾天對某家開發板的GPIO控制的知識。 公司的開發板用的是 DTB 模式 ,首先,進入 dts,dtsi文件查看關於GPIO 的模塊。 可以看到 GPIO 節點 掛在 SOC node 下 ,手上這塊開發板 把GPIO分成了8個 ba ...
  • logstash中配置的GeoIP的資料庫解析ip了,這裡是用了開源的ip數據源,用來分析客戶端的ip歸屬地。官網在這裡:MAXMIND 下載GeoLiteCity資料庫 修改配置文件(自己定義的config/logstash.conf) 在 filter中添加 在kibana中展示的效果 ...
  • 第1章 Nginx 1.1 nginx的概念 Nginx("engine x")是一個開源的、支持高性能、高併發的WWW服務和代理服務軟體,具有高開發(特別是靜態資源),占用系統資源少等特性。 Nginx可以運行在Unix、Linux、BSD、Mac OSX、Solaris,以及Microsoft ...
  • 1》判斷輸入為數字,字元或其他 腳本代碼: 檢測結果: 2》求平均數: 測試效果: 3》自減輸出: 腳本代碼: 測試效果: 4》在文件中添加首碼: 腳本代碼: 效果顯示: 5》批量測試文件是否存在: 腳本代碼: 測試結果; 6》用指定大小文件填充硬碟 用指定大小文件格式化後掛載: 腳本代碼: 效果顯 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...