微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM-Linux驱动--DM9000网卡驱动分析(一)

ARM-Linux驱动--DM9000网卡驱动分析(一)

时间:11-20 来源:互联网 点击:
硬件平台:FL2440(s3c2440

内核版本:2.6.35

主机平台:Ubuntu11.04

内核版本:2.6.39

原创作品,转载请标明出处http://blog.csdn.net/yming0221/article/details/6609742

1、下图是DM9000的引脚图

2、这里我们结合具体的开发板FL2440

下面是FL2440和DM9000的引脚链接图

本人移植DM9000的时候将设备的资源定义放在了arch/arm/plat-s3c24xx/devs.c中,详情点击上一篇博文linux内核移植-移植2.6.35.4内核到s3c2440

下面是设备的资源定义

view plainprint?

static struct resource s3c_dm9000_resource[] = {

[0] = {

.start = S3C24XX_PA_DM9000,

.end = S3C24XX_PA_DM9000+ 0x3,

.flags = IORESOURCE_MEM

},

[1]={

.start = S3C24XX_PA_DM9000 + 0x4, //CMD pin is A2 0x20000304

.end = S3C24XX_PA_DM9000 + 0x4 + 0x7c, // 0x20000380

.flags = IORESOURCE_MEM

},

[2] = {

.start = IRQ_EINT7,

.end = IRQ_EINT7,

.flags = IORESOURCE_IRQ

},

};

这里可以看到,DM9000网卡使用的地址空间资源在nGCS4地址区域,所以上图的DM9000地址使能引脚连接nGCS4引脚。中断使用的是EINT7外部中断。

接着定义平台数据和平台设备,代码如下:

view plainprint?

static struct dm9000_plat_data s3c_device_dm9000_platdata = {

.flags= DM9000_PLATF_16BITONLY,

};

struct platform_device s3c_device_dm9000 = {

.name= "dm9000", //设备名,该名称与平台设备驱动中的名称一致

.id= 0,

.num_resources= ARRAY_SIZE(s3c_dm9000_resource),

.resource= s3c_dm9000_resource, //定义设备的资源

.dev= {

.platform_data = &s3c_device_dm9000_platdata, //定义平台数据

}

};

最后导出函数符号,保存函数地址和名称

view plainprint?

EXPORT_SYMBOL(s3c_device_dm9000);

3、设备启动的初始化过程

view plainprint?

MACHINE_START(S3C2440, "SMDK2440")

.phys_io = S3C2410_PA_UART,

.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,

.boot_params = S3C2410_SDRAM_PA + 0x100,

.init_irq = s3c24xx_init_irq,

.map_io = smdk2440_map_io,

.init_machine = smdk2440_machine_init,//定义设备的初始化函数

.timer = &s3c24xx_timer,

MACHINE_END

而后会执行下面函数

view plainprint?

static void __init smdk2440_machine_init(void)

{

s3c24xx_fb_set_platdata(&smdk2440_fb_info);

s3c_i2c0_set_platdata(NULL);

s3c24xx_ts_set_platdata(&smdk2410_ts_cfg);

platform_add_devices(smdk2440_devices, ARRAY_SIZE(smdk2440_devices));

smdk_machine_init();

}

下面是具体的设备列表

view plainprint?

static struct platform_device *smdk2440_devices[] __initdata = {

&s3c_device_ohci,

&s3c_device_lcd,

&s3c_device_wdt,

&s3c_device_i2c0,

&s3c_device_iis,

&s3c_device_rtc,

&s3c24xx_uda134x,

&s3c_device_dm9000,

&s3c_device_adc,

&s3c_device_ts,

};

这样系统启动时,会给设备列表中的设备分配资源(地址资源和中断资源等)。

4、信息传输中的信息封装结构

4.1、sk_buff结构,定义在include/linux/skbuff.h中

view plainprint?

struct sk_buff {

struct sk_buff *next;

struct sk_buff *prev;

ktime_t tstamp;

struct sock *sk;

struct net_device *dev;

char cb[48] __aligned(8);

unsigned long _skb_refdst;

#ifdef CONFIG_XFRM

struct sec_path *sp;

#endif

unsigned int len,

data_len;

__u16 mac_len,

hdr_len;

union {

__wsum csum;

struct {

__u16 csum_start;

__u16 csum_offset;

};

};

__u32 priority;

kmemcheck_bitfield_begin(flags1);

__u8 local_df:1,

cloned:1,

ip_summed:2,

nohdr:1,

nfctinfo:3;

__u8 pkt_type:3,

fclone:2,

ipvs_property:1,

peeked:1,

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top