主题 : mini2440学习之(二)-------移植DM9000网卡驱动 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 3870
精华: 2
发帖: 20
金钱: 240 两
威望: 240 点
贡献值: 20 点
综合积分: 80 分
注册时间: 2009-02-13
最后登录: 2009-07-31
楼主  发表于: 2009-03-28 17:51

 mini2440学习之(二)-------移植DM9000网卡驱动

管理提醒: 本帖被 qq2440 执行取消置顶操作(2009-08-07)
本驱动移植到linux-2.6.22.2内核上,本人只是成功移植了驱动!
(不敢保证每一步都正确和必须要修改,以后慢慢参详其中的细节原理)
希望版主帮忙解释一下每一步骤的内容


转载请注明-----------------hongshaoone--------------------http://www.aiothome.com

本驱动移植参考文章:
http://blog.chinaunix.net/u1/34474/showart_400516.html
http://blog.mcuol.com/User/lvembededsys/article/6856_1.htm
http://blog.chinaunix.net/u2/86355/showart_1832320.html
http://blog.chinaunix.net/u2/89957/showart_1845645.html


一、硬件情况
DM9000在电路板上的连接中与编程相关的如下:
1)EECS拉高:16bit模式;
2)EECK拉高,INT连接到2440 EINT7:INT脚为高时为有效中断信号,中断线为EINT7
3)cs连接到2440的nGCS2,CMD连接2440地址总线ADDR[2]:INDEX和DATA端口地址分别为0x2000_0000和0x20000004。
二、将DM9000驱动注册到内核
在arch/arm/mach-s3c2440/mach-smdk2440.c 中添加dm9000的platform_device。
//-----------------以下为添加内容

#include <linux/dm9000.h>
static struct resource s3c_dm9000_resource[] = {
        [0] = {
          .start = S3C2410_CS4 + 0x300,
          .end   = S3C2410_CS4 + 0x300 + 0x03,   //
          .flags = IORESOURCE_MEM
},
        [1] = {
          .start = S3C2410_CS4 + 0x300 + 0x04,
          .end   = S3C2410_CS4 + 0x300 + 0x04 + 0x3,  //   0x3f
          .flags = IORESOURCE_MEM
},
        [2] = {
          .start = IRQ_EINT7,
          .end   = IRQ_EINT7,
          .flags = IORESOURCE_IRQ
}
};
片选值S3C2410_CS4,中断线IRQ_EINT7,这些值要根据你的板子电路图来设置。
static struct dm9000_plat_data s3c_device_dm9000_platdata = {
        .flags= DM9000_PLATF_16BITONLY
};
      struct platform_device s3c_device_dm9000 = {
        .name= "dm9000",
        .id= -1,
        .num_resources= ARRAY_SIZE(s3c_dm9000_resource),
        .resource= s3c_dm9000_resource,
        .dev= {
          .platform_data = &s3c_device_dm9000_platdata,
}
};
EXPORT_SYMBOL(s3c_device_dm9000);
extern struct platform_device s3c_device_dm9000;
static struct platform_device *smdk2440_devices[] __initdata = {
       &s3c_device_usb,
       &s3c_device_lcd,
       &s3c_device_wdt,
       &s3c_device_i2c,
       &s3c_device_dm9000, //此为添加内容
    &s3c_device_iis,
};
三、使能中断
修改/driver/net/dm9000.c文件
加入:
#include <linux/irq.h>
#include <asm/arch-s3c2410/map.h>
#include <asm/arch-s3c2410/regs-mem.h>
#include <asm/arch-s3c2410/irqs.h>
#include <asm/arch-s3c2410/hardware.h>
#include <asm/arch-s3c2410/regs-gpio.h>
static char net_mac_addr[]={0x00,0xe0,0x3d,0xf4,0xdd,0xf7};//设置MAC  
#define DM9000_IRQ    IRQ_EINT7
#include <asm-arm/arch-s3c2410/regs-gpio.h>
#define EXTINT0          (0x56000088)
#define EXTINT7_HIGHT  (1<<28)
#define INTMSK           (0x4A000008)
#define EXTINT7_OPEN  (~(1<<4))
#define EINTMASK         (0x560000a4)
//外部中断屏蔽
//外部中断方式


u32 id_val;
//------------------------dm9000_probe(struct platform_device *pdev)中加入:(以下内容为添加内容)
static void *extint0,*intmsk,*eintmsk;  
unsigned int value=0;
value = __raw_readl(S3C2410_BWSCON);
value &= ~(S3C2410_BWSCON_WS4|S3C2410_BWSCON_ST4|
                             S3C2410_BWSCON_DW4_32);
value |= (S3C2410_BWSCON_ST4|S3C2410_BWSCON_DW4_16);
       __raw_writel(value, S3C2410_BWSCON);
       value=0;
value = (S3C2410_BANKCON_Tacs4   |S3C2410_BANKCON_Tcos4|
                     S3C2410_BANKCON_Tacc14 |S3C2410_BANKCON_Tcoh4|
                     S3C2410_BANKCON_Tcah4   |S3C2410_BANKCON_Tacp6|
                     S3C2410_BANKCON_PMCnorm);
__raw_writel(value,S3C2410_BANKCON4);
//-------------------------------------------修改MAC (此为修改内容)
for (i = 0; i < 6; i++)
  ndev->dev_addr = char net_mac_addr;
//-------------------------------------------
//--------------------------------配制总线不然会100% loss (以下内容均为添加内容)
s3c2410_gpio_cfgpin(S3C2410_GPF7, S3C2410_GPF7_EINT7); //设定GPF7为中断所用(由于GPF7多功能脚所以配制)
extint0=ioremap_nocache(EXTINT0,4);
//设定外部中断7为高电平 (要以板子而定)
writel((readl(extint0)&0x8fffffff)|EXTINT7_HIGHT,extint0);
intmsk=ioremap_nocache(INTMSK,4);
writel(readl(intmsk)&(~(1<<4)),intmsk); //    
eintmsk=ioremap_nocache(EINTMASK,4);
writel(readl(intmsk)&(~(1<<7)),eintmsk);//
iounmap(intmsk);
iounmap(extint0);
iounmap(eintmsk);
ndev = alloc_etherdev(sizeof (struct board_info));
[ 此帖被hongshaoone在2009-04-01 19:19重新编辑 ]
级别: 新手上路
UID: 3087
精华: 0
发帖: 9
金钱: 90 两
威望: 90 点
贡献值: 0 点
综合积分: 18 分
注册时间: 2008-12-26
最后登录: 2009-11-10
1楼  发表于: 2009-03-28 21:56
绝对要顶
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
2楼  发表于: 2009-03-28 22:45
三、使能中断
修改/driver/net/dm9000.c文件
加入:
#include <linux/irq.h>
#include <asm/arch-s3c2410/map.h>
#include <asm/arch-s3c2410/regs-mem.h>
#include <asm/arch-s3c2410/irqs.h>
#include <asm/arch-s3c2410/hardware.h>
#include <asm/arch-s3c2410/regs-gpio.h>
static char net_mac_addr[]={0x00,0xe0,0x3d,0xf4,0xdd,0xf7};//设置MAC  
#define DM9000_IRQ    IRQ_EINT7
#include <asm-arm/arch-s3c2410/regs-gpio.h>
#define EXTINT0          (0x56000088)
#define EXTINT7_HIGHT  (1<<28)
#define INTMSK           (0x4A000008)
#define EXTINT7_OPEN  (~(1<<4))
#define EINTMASK         (0x560000a4)
//外部中断屏蔽
//外部中断方式
...


driver/net/dm9000.c是通用的DM9000驱动, 不要再里面加入任何和特定硬件平台相关的东西, 针对mini2440的GPIO, 中断类型配置这些动作应该在mini2440的板级初始化函数里完成,比如init_machine函数指针指向的函数。

3)cs连接到2440的nGCS2,CMD连接2440地址总线ADDR[2]:INDEX和DATA端口地址分别为0x2000_0000和0x20000004

这是根据S3C2440的memory map和DM9000的使用手册得出的结论, 希望你能把得出这一结论的分析过程分享给大家。

Linux之所以强大是在于它开放源代码, 希望你能将你的成果, 也就是源代码的补丁(可以用diff工具生成patch)提出来和大家分享, 谢谢!
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 2225
精华: 0
发帖: 23
金钱: 225 两
威望: 77 点
贡献值: 0 点
综合积分: 46 分
注册时间: 2008-11-04
最后登录: 2017-09-13
3楼  发表于: 2009-05-07 10:51
cs连接到2440的nGCS2,CMD连接2440地址总线ADDR[2]:INDEX和DATA端口地址分别为0x2000_0000和0x20000004

应该是NGCS4吧
还有那个地址为什么要加0x300啊
级别: 新手上路
UID: 5733
精华: 0
发帖: 5
金钱: 50 两
威望: 50 点
贡献值: 0 点
综合积分: 10 分
注册时间: 2009-05-06
最后登录: 2009-05-16
4楼  发表于: 2009-05-14 09:05
请问S3C2410_CS4, IORESOURCE_MEM 这些是在哪里定义的?我在头文件里面没有找到
级别: 新手上路
UID: 34076
精华: 0
发帖: 3
金钱: 20 两
威望: 4 点
贡献值: 0 点
综合积分: 6 分
注册时间: 2010-12-10
最后登录: 2011-04-22
5楼  发表于: 2011-03-28 12:03
深圳市爱欣文科技有限公司是台湾联杰国际(DAVICOM) 股份有限公司﹑台湾磁威公司等诸多公司长期真诚合作,是IC(芯片)产品在中国大陆总代理商,为我公司更好地于服务客户,提供了可靠的保证增强了后备支持。主营以太网芯片及配套元器件。
在产品生产过程中如果贵公司遇到技术上的问题我们可以免费为贵公司提供:
1.提供完整的开发资料及强大的技术支援,成熟可靠的产品方案.
2.芯片的数据手册,原理图,驱动.
3.Layoeut(布板指南).
4.编程指南.可以提供各种产品方案,由原厂工程师解决各种技术问题.
2.应用案例:
1) IPSTB(机顶盒):ST系列(5516、5100、5514、5517、7100、7109)+网卡芯片
(DM9000AE/DM9161AE);NEC(61110/6114)+网卡芯片(DM9000AE);
2) VOD ; EM8511+DM9000E/DM9000AE;
3) DVR: ARM9200+DM9000AE/DM9161AE;
4) 工控主板:S3C2410+DM9000AE;
5) 有线电视服务器:S3C2410+DM9000AE;
6)无线路由器:RDC+DM562AP;
7) 门禁机:8051+DM9000AE;
8) 税控机:LPC2210+DM9000E;
9) 一卡通:LPC2212+DM9000AE;
10) 数据采集:ARM9200+DM9616E;S3C4480+DM9000AE;
11)液晶广告机:EM8511+DM9000E;
12)MID:TCC8900(8902)+dm9000AEP(DM9000CEP)
       rockchip2818+DM9621
…………………………………………………..
3. 技术支持:
1)芯片的数据手册,原理图.
2)Layoeut PCB(布板指南).
3) 中文编程指南,原厂FAE解决各种技术问题
4)Drives:
Linux drive/wince drive/vxworks/neucleus/.c/csos

[联系我们]:如需开发资料的请与我联系,谢谢!
电话:0755-86677600 传真:0755-86677606  地址:深圳南山区高新北区新西路2号东方信息港综合楼5楼503号
联系人:沈先生   电话:18665815539   在线QQ:1608310420   E-Mail:leo_shen@axwdragon.com
DM9000/DM9161系列网卡芯片大陆代理商
级别: 新手上路
UID: 47103
精华: 0
发帖: 28
金钱: 140 两
威望: 28 点
贡献值: 0 点
综合积分: 56 分
注册时间: 2011-05-19
最后登录: 2011-10-27
6楼  发表于: 2011-10-12 21:06
标记学习。。
级别: 新手上路
UID: 51998
精华: 0
发帖: 39
金钱: 195 两
威望: 39 点
贡献值: 0 点
综合积分: 78 分
注册时间: 2011-07-10
最后登录: 2014-12-04
7楼  发表于: 2011-11-16 18:38
可以研究研究一下方法