3.移植驅動到3.4內核-移植DM9000C驅動

来源:https://www.cnblogs.com/lifexy/archive/2018/02/06/8421816.html
-Advertisement-
Play Games

在上章-使內核支持燒寫yaffs2,裁剪內核並製作補丁了 本章,便開始移植以前2.6內核的驅動到3.4新內核 1.介紹 首先內核更新,有可能會重新定義新的巨集,去除以前的巨集,以前更改函數名等 所以移植驅動的過程如下: 1)編譯 2)解決錯誤 ->2.1)頭文件不對:去掉或改名 ->2.2)巨集不對:改名 ...


上章-使內核支持燒寫yaffs2,裁剪內核並製作補丁

本章,便開始移植以前2.6內核的驅動到3.4新內核

 


 

1.介紹

首先內核更新,有可能會重新定義新的巨集,去除以前的巨集,以前更改函數名等

所以移植驅動的過程如下:

  • 1)編譯
  • 2)解決錯誤
  • ->2.1)頭文件不對:去掉或改名
  • ->2.2)巨集不對:改名使用新巨集
  • ->2.3)有些函數沒有了:改名使用新函數

2.移植內核自帶的DM9000網卡驅動

machid=16a(mach-smdk2440.c)的內核下輸入ifconfig,發現該板卡的內核不支持DM9000,如下圖所示:

 

 

而在machid= 7cf(mach-mini2440.c)的內核下輸入ifconfig,卻能支持DM9000,如下圖所示:

 

 

2.1這是因為mach-mini2440.c單板文件里支持了內核自帶的DM9000網卡驅動

1)進入內核的驅動文件看看(位於drivers/net/ethernet/davicom/dm9000.c)

首先來看init入口函數,代碼如下:

static struct platform_driver dm9000_driver = {
       .driver     = {
              .name    = "dm9000", 
              .owner    = THIS_MODULE,
              .pm  = &dm9000_drv_pm_ops,
       },
       .probe   = dm9000_probe,                              //.probe函數
       .remove  = __devexit_p(dm9000_drv_remove),
};

static int __init dm9000_init(void)
{
       printk(KERN_INFO "%s Ethernet Driver, V%s\n", CARDNAME, DRV_VERSION);
       return platform_driver_register(&dm9000_driver);            //註冊平臺驅動
}

從上面代碼看到,內核會註冊一個"dm9000"平臺驅動,而再註冊個"dm9000"平臺設備時,內核便會調用上面的probe函數來註冊dm9000驅動.

 

2)然後再來看看mach-mini2440.c單板文件,是如何支持dm9000的,代碼如下:

static struct platform_device mini2440_device_eth = {                           
       .name            = "dm9000",
       .id           = -1,              //id號,一個平臺驅動可以有多個平臺設備,-1表示只有一個平臺設備
       .num_resources      = ARRAY_SIZE(mini2440_dm9k_resource), 
       .resource = mini2440_dm9k_resource,    //資源,保存硬體相關
       .dev        = {
              .platform_data       = &mini2440_dm9k_pdata, 
       },
};
... ...

static struct platform_device *mini2440_devices[] __initdata = {                    
       &s3c_device_ohci,
       &s3c_device_wdt,
       &s3c_device_i2c0,
       &s3c_device_rtc,
       &s3c_device_usbgadget,
       &mini2440_device_eth                 //需要添加的DM9000平臺設備
       ... ...
};
... ...

static void __init mini2440_init(void)                   //init入口函數
{
 ... ...
platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));       //註冊平臺設備
}     

從上面代碼看到,由於mach-mini2440.c註冊了一個name為"dm9000"的平臺設備, 所以內核便會去匹配平臺驅動,從而支持DM9000.c(平臺設備一般保存的是硬體相關代碼,然後平臺驅動根據平臺設備的內容來註冊)

 

2.2然後參考上面平臺設備,修改mach-smdk2440.c(位於arch/arm/mach-s3c24xx/mach-smdk2440.c)

(使它也支持內核自帶的DM9000網卡驅動)

1)添加頭文件

#include <linux/dm9000.h>  

 

2)添加全局變數:

#define MACH_SMDK2440_DM9K_BASE    (S3C2410_CS4 + 0x300)
static struct resource smdk2440_dm9k_resource[] = {
       [0] = {
              .start = MACH_SMDK2440_DM9K_BASE,
              .end   = MACH_SMDK2440_DM9K_BASE + 3,
              .flags = IORESOURCE_MEM
       },
       [1] = {
              .start = MACH_SMDK2440_DM9K_BASE + 4,
              .end   = MACH_SMDK2440_DM9K_BASE + 7,
              .flags = IORESOURCE_MEM
       },
       [2] = {
              .start = IRQ_EINT7,
              .end   = IRQ_EINT7,
              .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
       }
};
/*
 * The DM9000 has no eeprom, and it's MAC address is set by
 * the bootloader before starting the kernel.
 */
static struct dm9000_plat_data SMDK2440_dm9k_pdata = {
       .flags             = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),
};

static struct platform_device smdk2440_device_eth = {
       .name            = "dm9000",
       .id           = -1,
       .num_resources      = ARRAY_SIZE(smdk2440_dm9k_resource),
       .resource = smdk2440_dm9k_resource,
       .dev        = {
              .platform_data       = &SMDK2440_dm9k_pdata,
       },
};

 

3)smdk2440_devices[]數組下添加:

static struct platform_device *smdk2440_devices[] __initdata = {
       &s3c_device_ohci,
       &s3c_device_lcd,
       &s3c_device_wdt,
       &s3c_device_i2c0,
       &s3c_device_iis,
       &smdk2440_device_eth,                     //添加該句
};

 

2.3 然後編譯燒寫

在uboot下輸入:

nfs  30000000 192.168.2.106:/work/nfs_root/uImage       //下載剛剛編譯好的uImage
set machid 16a
bootm 30000000

啟動內核後,便可以ping通,如下圖所示:

 

 

3.移植廠家提供的DM9000C驅動

3.1我們發現內核自帶的DM9000驅動版本只有1.31

如下圖所示(位於drivers/net/ethernet/davicom/dm9000.c):

 

 而我們板子的網卡硬體比較新,已經是dm9000c了,所以我們去移植廠家提供的DM9000C驅動

在之前學習2.6內核的驅動時,我們便移植過了廠家提供的DM9000C驅動了,鏈接入口:http://www.cnblogs.com/lifexy/p/7777961.html

文件名為dm9dev9000c.c,由於2.6內核和3.4內核有很多不一樣的地方,所以編譯dm9dev9000c.c會出現很多錯誤,解決錯誤的具體辦法如下:

  • 1)通過搜索,來閱讀錯誤的變數的用途,然後參考dm9000.c來修改dm9dev9000c.c
  • 2)將只有定義而沒用到的錯誤變數,刪除掉

最終修改好的dm9dev9000c.c,鏈接入口:https://github.com/lifeyx/dm9000c

 

將修改好的dm9dev9000c.c也放在drivers/net/ethernet/davicom/目錄下

並修改Makefile:

#obj-$(CONFIG_DM9000) += dm9000.o
obj-$(CONFIG_DM9000) += dm9dev9000c.o

 

3.2編譯燒寫

1)啟動內核後,試驗,如下圖所示,可以ping通:

 

 

2)然後測試下使用nfs文件系統

在uboot設置bootargs參數:

set  bootargs root=/dev/nfs console=ttySAC0,115200 nfsroot=192.168.2.106:/work/nfs_root/fs_mini_mdev_new  ip=192.168.2.105:192.168.2.106:192.168.2.1:255.255.255.0::eth0:off   

然後啟動nfs成功,如下圖所示:

 

 

 

未完待續,下章再來移植其它驅動~


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

-Advertisement-
Play Games
更多相關文章
  • 實例產品基於asp.net mvc 5.0框架,源碼下載地址:http://www.jinhusns.com/Products/Download View里所有以@開頭或@(/*代碼*)的部分代碼都會被ASP.NET引擎進行處理。在@{/*代碼體}內的代碼每一行都必須以";"結束如: 而@xxx則不 ...
  • 實例產品基於asp.net mvc 5.0框架,源碼下載地址:http://www.jinhusns.com/Products/Download 在Asp.net Mvc中當你有以下及類似以下需求時你可以使用Filter功能 判斷登錄與否或用戶許可權 決策輸出緩存 防盜鏈 防蜘蛛 本地化與國際化設置 ...
  • 一、原始配置文件的問題 我們在做開發時,不管是B/S還是C/S,現在幾乎所有的項目都會碰到使用配置文件,簡單點的如鏈接字元串、上傳路徑啊,一些API的介面地址等等。複雜點就更多了,如ActiveMQ的配置信息(地址、埠、用戶名、密碼)等等。 在.Net開發中已經在(Web.config/App.c ...
  • 前言 Hi, 大家好,還是星期五,還是Rector,又在圖享網準時和大家見面了。 今天給大家帶來系列教程《一步一步創建ASP.NET MVC5程式[Repository+Autofac+Automapper+SqlSugar]》的第八期了,不知道你有沒有按照教程將前七期的都實際練習一篇呢?如果是,你 ...
  • shell腳本 函數 函數介紹 定義函數 函數使用 互動式環境下定義和使用函數 腳本中定義和使用函數 函數在使用前須先被定義,所以在腳本中使用函數是,必須在腳本開始前定義函數。 調用函數僅使用其函數名即可 示例: cat func1 !/bin/bash func1 hello() { echo " ...
  • shell腳本 基礎 編程基礎 shell腳本說明 變數介紹 變數的作用: 數據暫存 參與運算 表示數據範圍 強類型變數: 變數不經過強制轉換,它永遠是這個數據類型,不允許隱式的類型轉換。 一般定義變數時必須指定類型、參與運算必須符合類型要求。 調用未聲明變數會產生錯誤。 如 java,c 的變數 ...
  • ASoC被分為Machine、Platform和Codec三大部分,其中的Machine驅動負責Platform和Codec之間的耦合以及部分和設備或板子特定的代碼,再次引用上一節的內容:Machine驅動負責處理機器特有的一些控制項和音頻事件(例如,當播放音頻時,需要先行打開一個放大器);單獨的Pl ...
  • 所有有系統都一樣,都是一種軟體被安裝於某個硬體之上,這個硬體無外非是一種存儲設備,通常操作系統都是安裝在磁碟中,所以Linux系統也是一樣,都是安裝在磁碟中,但是它與Windows系統不一樣,因為Linux都是需要創建文件系統才可以使用。 1、 磁碟分類 目前市場上的磁碟分類有:IDE磁碟(多用於P ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...