1. 程式人生 > >一,Linux-3.19內核移植DM9000驅動(JZ2440)

一,Linux-3.19內核移植DM9000驅動(JZ2440)

aud codec load flags 結構 nal mini -m void

文檔時間:2018-08-25

交叉編譯器:arm-linux-gcc-4.3.2

Ubuntu版本:16.04

kernel版本:linux-3.19

1,移植內核自帶的 DM9000 網卡驅動

使用之前制作的 uboot,kernel 和 文件系統,在 uboot 終端把 machid 設置為 0x16a (SMDK2440),啟動內核,然後輸入 ifconfig 命令,發現不支持 DM9000,如下圖所示:

技術分享圖片

而如果把 machid 設置為 0x7cf (MINI2440),執行同樣的操作,發現其能支持 DM9000 網卡驅動,結果如下:

技術分享圖片

說明在 mach-mini2440.c 單板文件裏有對 DM9000 的支持,查看 mach-mini2440.c(/home/aaron/work/kernel/linux-3.19/arch/arm/mach-s3c24xx目錄下

)文件,看看是如何支持 DM9000 驅動的:

先查找 "dm9000" 關鍵字找到 mini2440_device_eth 結構,然後查找 mini2440_device_eth 找到 mini2440_device 結構裏調用,查找 mini2440_device_eth 找到在 mini2440_init 函數裏調用,如下:

static struct platform_device mini2440_device_eth = {    //創建 dm9000 平臺設備
    .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平臺設備添加到數組裏 &mini2440_led1, &mini2440_led2, &mini2440_led3, &mini2440_led4, &mini2440_button_device, &s3c_device_nand, &s3c_device_sdi, &s3c_device_iis, &uda1340_codec, &mini2440_audio, }; .............. static void __init mini2440_init(void)    //單板初始化函數 { ................. platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices)); if (features.count) /* the optional features */ platform_add_devices(features.optional, features.count);    //註冊添加的平臺設備 }

如果與所用板子硬件原理圖上 DM9000 引腳不匹配,可以通過查找 "mini2440_dm9k_resource" 來進行修改。

下面仿照上面代碼,修改 mach-smdk2440.c(home/aaron/work/kernel/linux-3.19/arch/arm/mach-s3c24xx目錄下) 文件,使其能夠支持DM9000驅動,修改代碼如下(紅色為修改部分):

#include <linux/dm9000.h>        //添加頭文件

/* DM9000AEP 10/100 ethernet controller */            //添加相關宏
static struct resource smdk2440_dm9k_resource[] = {
    [0] = DEFINE_RES_MEM(MACH_SMDK2440_DM9K_BASE, 4),
    [1] = DEFINE_RES_MEM(MACH_SMDK2440_DM9K_BASE + 4, 4),
    [2] = DEFINE_RES_NAMED(IRQ_EINT7, 1, NULL, IORESOURCE_IRQ                         | IORESOURCE_IRQ_HIGHEDGE),
};
//添加smdk2440相關結構定義
/*
 * 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,
    },
};

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,       /在數組裏添加該結構 
};

make uImage 進行內核編譯,在 uboot 中輸入以下命令燒寫新內核:

nfs 32000000 192.168.2.110:/home/aaron/work/kernel/linux-3.19/arch/arm/boot/uImage
set machid 0x16a
bootm 32000000

內核啟動成功後,輸入以下命令驗證:

ifconfig eth0 192.168.2.90        //配置
ifconfig        //查看

結果如下:

技術分享圖片

出現如上圖所示結果,表示 DM9000 網卡驅動移植成功。

(PS:drivers/net/ethernet/davicom/dm9000.c 和 dm9000.h文件一般不用修改)

一,Linux-3.19內核移植DM9000驅動(JZ2440)