Chinaunix首页 | 论坛 | 博客
  • 博客访问: 46594
  • 博文数量: 21
  • 博客积分: 855
  • 博客等级: 准尉
  • 技术积分: 230
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-20 14:19
文章分类
文章存档

2011年(1)

2009年(20)

我的朋友
最近访客

分类: LINUX

2009-03-20 14:43:32

一.   根据原理图,确认网卡的地址和中断号

地址:0x19000000

中断号: EINT9

 

二.   修改drivers/net/cs89x0.c,指定CS8900A使用的资源

#elif defined(CONFIG_ARCH_S3C2410)

#include

#include3c2410/regs-mem.h>

#define S3C24XX_PA_CS8900   0x19000000

static unsigned int netcard_portlist[] __initdate = {0, 0};

static unsigned int cs8900_irq_map[] = {IRQ_EINT9, 0, 0, 0};

#else

 

三.   修改入口函数cs89x0_probe

1.       定义变量,用来保存寄存器的值:

       int irq;

       int io;

 

#if defined(CONFIG_ARCH_S3C2410)

       unsigned int oldval_bwscon;

       unsigned int oldval_bankcon3;

#endif

 

2.       设置MAC,总线宽度等:

       io = dev->base_addr;

       irq = dev->irq;

 

#if defined(CONFIG_ARCH_S3C2410)

       if(netcard_portlist[0])

              return -ENODEV;

 

       netcard_portlist[0] = (unsigned int)ioremap(S3C24XX_PA_CS8900, SZ_1M)+0x300;

       dev->dev_addr[0] = 0x08;

       dev->dev_addr[1] = 0x89;

       dev->dev_addr[2] = 0x89;

       dev->dev_addr[3] = 0x89;

       dev->dev_addr[4] = 0x89;

       dev->dev_addr[5] = 0x89;

 

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

       *((volatile unsigned int *)S3C2410_BWSCON) = (oldval_bwscon & ~(3<<12)) | S3C2410_BWSCON_DW3_16 | S3C2410_BWSCON_WS3 | S3C2410_BWSCON_ST3;

 

       oldval_bankcon3 = *((volatile unsigned int *)S3C2410_BANKCON3);

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

#endif

 

       if (net_debug)

              printk("cs89x0:cs89x0_probe(0x%x)\n", io);

 

3.       出错退出

out:

#if defined(CONFIG_ARCH_S3C2410)

       iounmap(netcard_portlist[0]);

       netcard_portlist[0] = 0;

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

        *((volatile unsigned int *)S3C2410_BANKCON3) = oldval_bankcon3;

#endif

 

       free_netdev(dev);

 

四.   注册中断处理程序,指定中断触发方式,修改net_open函数

#if 0

              writereg(dev, PP_BusCTL, ENABLE_IRQ | MEMORY_ON);

#endif

              write_irq(dev, lp->chip_type, dev->irq);

 

#if defined(CONFIG_ARCH_S3C2410)

              ret = request_irq(dev->irq, &net_interrupt, IRQF_TRIGGER_RISING, dev->name, dev);

#else

              ret = request_irq(dev->irq, &net_interrupt, 0, dev->name, dev);

#endif

 

五.   drivers/net/cs89x0.c中适当的位置加上CONFIG_ARCH_S3C2410宏编译开关,可以参考CONFIG_ARCH_PNX010X:

1. net_open(struct net_device *dev)

{

       struct net_local *lp = netdev_priv(dev);

       int result = 0;

       int i;

       int ret;

 

#if !defined(CONFIG_SH_HICOSH4) && !defined(CONFIG_ARCH_PNX010X) && !defined(CONFIG_ARCH_S3C2410) /* uses irq#1, so this won't work */

       if (dev->irq < 2) {

 

2. #if !defined(CONFIG_MACH_IXDP2351) && !defined(CONFIG_ARCH_IXDP2X01) && !defined(CONFIG_ARCH_PNX010X) && !defined(CONFIG_ARCH_S3C2410)

              if (((1 << dev->irq) & lp->irq_map) == 0) {

                     printk(KERN_ERR "%s: IRQ %d is not in our map of allowable IRQs, which is %x\n",

                               dev->name, dev->irq, lp->irq_map);

                     ret = -EAGAIN;

                     goto bad_out;

              }

#endif

 

3. #if defined(CONFIG_ARCH_PNX010X) || defined(CONFIG_ARCH_S3C2410)

       result = A_CNF_10B_T;

#endif

 

六.   全局变量static int io;改为static unsigned int io;

 

七.   内核配置文件修改:

修改drivers/net/kconfig中的描述

config CS89x0

       tristate "CS89x0 support"

       depends on (NET_PCI && (ISA || MACH_IXDP2351 || ARCH_IXDP2X01 || ARCH_PNX010X)) || ARCH_S3C2410

 

八.   使用CS8900A网卡,在内核目录下执行make menuconfig,选中

九.   设置从NFS启动:

ckz24x0 > set bootargs noinitrd root=/dev/nfs console=ttySAC0 nfsroot=192.168.6.240:/home/ckz/work/src/fs_mini ip=192.168.6.239:192.168.6.240:192.168.6.1:255.255.255.0::eth0:off

以上的命令意思:

Ip=::::::

阅读(977) | 评论(1) | 转发(0) |
0

上一篇:十三.中断驱动程序

下一篇:十五.USB配置

给主人留下些什么吧!~~

chinaunix网友2009-06-17 16:25:56

谢谢!好!