linux裝置驅動 DM9000移植

2021-07-27 05:52:09 字數 3441 閱讀 5873

一、開發環境

1、核心:

linux

2.6.22.6;

2、jz2440

3、ubuntu9.10

二、移植過程

1、新增標頭檔案在核心目錄下的/arch/arm/plat-s3c24xx/commom-smdk.c檔案中新增

#if defined (config_dm9000) || defined (config_dm9000_module)

#include

#endif

2、新增dm9000平台裝置結構。

核心目錄下的

/arch/arm/plat-s3c24xx/commom-smdk.c檔案中新增

/* dm9000 device */

#if defined (config_dm9000) || defined (config_dm9000_module)

static struct resource s3c_dm9k_resource = ,

[1] = ,

[2] =

};static struct dm9000_plat_data s3c_m9k_platdata=;

struct platform_device s3c_device_dm9k = ,

};export_symbol(s3c_device_dm9k);

#endif          /* dm9000 device */

3、加入核心裝置列表。

static struct platform_device __initdata *smdk_devs = ;

4、修改原始碼/drivers/net/dm9000.c。

(1)新增標頭檔案

#if defined(config_arch_s3c2410)

#include

#endif

(2)修改/drivers/net/dm9000.c。設定儲存控制器使bank4可用。

在dm9000_probe()函式中,新增

u32 id_val;

#if defined(config_arch_s3c2410)

unsigned int oldval_bwscon;

unsigned int oldval_bankcon4;

#endif

/* init network device */

ndev = alloc_etherdev(sizeof (struct board_info));

printk2("dm9000_probe()");

#if defined(config_arch_s3c2410)

oldval_bwscon = *((volatile unsigned int *)s3c2410_bwscon);

*((volatile unsigned int *)s3c2410_bwscon) = (oldval_bwscon & ~(3<<16)) | s3c2410_bwscon_dw4_16 |\

s3c2410_bwscon_ws4 | s3c2410_bwscon_st4;

oldval_bankcon4 = *((volatile unsigned int *)s3c2410_bankcon4);

*((volatile unsigned int *)s3c2410_bankcon4) = 0x1f7c;

#endif

printk("%s: not found (%d).\n", cardname, ret);

#if defined(config_arch_s3c2410)

*((volatile unsigned int *)s3c2410_bwscon) = oldval_bwscon;

*((volatile unsigned int *)s3c2410_bankcon4) = oldval_bankcon4;

#endif

printk2("entering dm9000_open\n");

#if defined(config_arch_s3c2410)

if (request_irq(dev->irq, &dm9000_interrupt, irqf_shared|irqf_trigger_rising, dev->name, dev))

#else

if (request_irq(dev->irq, &dm9000_interrupt, irqf_shared, dev->name, dev))

#endif

return -eagain;

if (!is_valid_ether_addr(ndev->dev_addr)){

printk("%s: invalid ethernet mac address.  please "

"set using ifconfig\n", ndev->name);

#if defined(config_arch_s3c2410)

printk("now use the default mac address: 08:90:90:90:90:90 \n");

ndev->dev_addr[0] = 0x08;

ndev->dev_addr[1] = 0x90;

ndev->dev_addr[2] = 0x90;

ndev->dev_addr[3] = 0x90;

ndev->dev_addr[4] = 0x90;

ndev->dev_addr[5] = 0x90;

#endif

printk("%s: not found (%d).\n", cardname, ret);

#if defined(config_arch_s3c2410)

*((volatile unsigned int *)s3c2410_bwscon) = oldval_bwscon;

*((volatile unsigned int *)s3c2410_bankcon4) = oldval_bankcon4;

#endif

5、配置核心支援dm9000。

在核心目錄下執行make menuconfig。依次選device drives-->network device support-->[*]network device support --> ethernet (10 or 100mbit)-->dm9000 support。如圖

6、在核心目錄下執行make uimage。在arch/arm/boot/下生成支援dm9000的uimage。

可惜這樣能夠識別出dm9000,也能設定ip,但並不能ping通。檢視資料才知道,jz2440v3使用的是dm9000c,不能直接使用核心裡帶的dm9000.c,需要

使用廠家提供的dm9dev9000c.c移植,見《

linux核心移植-dm9000c移植筆記》

linux網路裝置驅動DM9000驅動分析(4)

14 接受資料 在中斷函式中,我們可以看到呼叫了dm9000 rx 接收資料並存入 skbuff 並提交協議上一層。1 首先看看下面這個結構體,這個結構體按照 dm9000 的接收格式封裝了 dm9000 接收的資料報資訊 struct dm9000 rxhdr packed 2 接收函式dm900...

網絡卡(dm9000)驅動移植

網絡卡 dm9000 驅動移植 看到網上有很多的部落格分享,比如 在此,描述一下自己的製作過程 1.修改arch arm plat s3c24xx common smdk.c檔案 在包含標頭檔案的區域增加以下 在smdk devs結構體之前新增以下 if defined config dm9000 ...

驅動 DM9000網絡卡驅動分析

preface 核心原始碼版本 linux 2.6.18 網絡卡驅動 linux核心網路分層結構 dm9000晶元 dm9000是一款高度整合低功耗快速乙太網處理器,該晶元整合了mac和phy。dm9000可以和cpu直接連線,支援8位 16位和32位資料匯流排寬度。該晶元支援10m和100m自適應...