Chinaunix首页 | 论坛 | 博客
  • 博客访问: 281314
  • 博文数量: 59
  • 博客积分: 1346
  • 博客等级: 中尉
  • 技术积分: 461
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-06 17:17
文章分类

全部博文(59)

文章存档

2012年(9)

2011年(50)

分类: LINUX

2011-03-29 20:35:31

DM9000网卡驱动移植
内核版本2.6.29.6
宿主机:
fedora 11

目标机:
utu s3c2440
1.编译内核的时候,在 menuconfig 的配置选项,选中driver-->net-->10/100M net-->DM9000 support
2.在arch/arm/plat-s3c24xx中的devs.c中添加
/**********whs add 2009-3-28 12:06***************************/
static struct resource s3c_dm9000_resource[] = {
        [0] = {
          .start = 0x18000000,   //对应电路图nGCS3
          .end   = 0x18000003,
          .flags = IORESOURCE_MEM,
       },
        [1] = {
          .start = 0x18000004,
          .end   = 0x18000007, //   0x3f
          .flags = IORESOURCE_MEM,
       },
        [2] = {
          .start = IRQ_EINT9,
          .end   = IRQ_EINT9,
          .flags = IORESOURCE_IRQ,
       }

};
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);
/**********whs add 2009-3-28 12:06------end ****************/

3.在arch/arm/plat-s3c24xx/include/plat/devs.h添加声明
/**********whs add 2009-3-28 12:06***************************/
extern struct platform_device s3c_device_dm9000;
/**********whs add 2009-3-28 12:06----end***************/

4.在arch/arm/mach-s3c2440/mach-smdk2440.c中将andy_dm9000_device添加到平台设备列表中
static struct platform_device *smdk2440_devices[] __initdata = {
   &s3c_device_usb,
   &s3c_device_lcd,
   &s3c_device_wdt,
   &s3c_device_i2c,
   &s3c_device_iis,
       &s3c_device_dm9000,/***whs add 2009-3-28 12:06****/
};
5.OK,经过上述努力,Dm9000设备已经成功注册进入驱动核心。下面进入drivers/net/dm9000.C中,
还需要做两方面的工作:设置芯片MAC地址,使能DM9000的中断。
根据2440资料。有几个地方需要设置:
1)设置GPGCON 使GPG1功能设置为EINT9 。
这可以用函数实现:s3c2410_gpio_cfgpin(S3C2410_GPG1, S3C2410_GPF3_EINT9);
2)外部中断EXTINT1 的[6:4]位 置100 上升沿触发中断
代码修改:
在dm9000.C的开始添加如下定义:
/**********whs add 2009-3-28 12:06***************************/
#i nclude
static void *extint1,*intmsk;
#define EINTMASK         (0x560000a4) //外部中断屏蔽  
#define EXTINT1          (0x5600008c) //外部中断方式
#define INTMSK           (0x4A000008) //中断屏蔽
/**********whs add 2009-3-28 12:06----end***************/

在DM9000_probe函数中,register_netdev之前(1400行左右)添加如下
/**********whs add 2009-3-28 12:06***************************/
memcpy(ndev->dev_addr,"\0andy1",6);   //mac地址设置
extint1=ioremap_nocache(EXTINT1,0x0000004); //I/O内存映射
intmsk=ioremap_nocache(INTMSK,4);

s3c2410_gpio_cfgpin(S3C2410_GPG1, S3C2410_GPG1_EINT9); //设置中断
writel(readl(extint1)|0x40,extint1); //rising edge
writel(readl(intmsk)&0xfff1,intmsk);
  
iounmap(intmsk);
iounmap(extint1);
/**********whs add 2009-3-28 12:06------end ****************/
这样就大功告成了啊。

http://blog.csdn.net/baozhongchao/archive/2009/09/10/4538182.aspx
主要参照了http://blog.chinaunix.net/u3/91018/showart_1835810.html,感谢andykuo分享。
http://blog.chinaunix.net/u3/91018/showart_1835810.html
http://blog.mcuol.com/User/lvembededsys/Article/6856_1.htm
http://blog.chinaunix.net/u1/34474/showart_400516.html

确实是成功了,我试了

还有别的版本,但是好像不能成功,也给个网址吧,可以作为参考

http://liuyinqiang5188.blog.163.com/blog/static/47065926200961943033922/

 

阅读(2144) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~