免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1517 | 回复: 0
打印 上一主题 下一主题

十四.CS8900A驱动程序移植 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-20 14:43 |只看该作者 |倒序浏览

一.   根据原理图,确认网卡的地址和中断号
地址: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 & ~(33C2410_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. #if !defined(CONFIG_MACH_IXDP2351) && !defined(CONFIG_ARCH_IXDP2X01) && !defined(CONFIG_ARCH_PNX010X) && !defined(CONFIG_ARCH_S3C2410)
              if (((1 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=::::::


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/93882/showart_1869908.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP