文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>十四.CS8900A驱动程序移植

十四.CS8900A驱动程序移植

时间:2009-03-20  来源:chenkuizhong

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

地址:0x19000000

中断号: EINT9

 

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

#elif defined(CONFIG_ARCH_S3C2410)

#include<asm/irq.h>

#include<asm/arch-s3c2410/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=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>

相关阅读 更多 +
排行榜 更多 +
魔方仆从冲刺

魔方仆从冲刺

休闲益智 下载
跑山越野摩托

跑山越野摩托

体育竞技 下载
新概念英语课本通

新概念英语课本通

学习教育 下载