网卡驱动(2)——移植DM9000驱动

时间:2021-02-17 17:12:48

移植DM9000驱动:

1、找出相异性,修改

2、设置memory controller(位宽、时序等)


修改驱动:

(1)增加头文件

#include <asm/delay.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/arch-s3c2410/regs-mem.h>

(2)注释掉版本信息判断

 //if((db->chip_revision!=0x1A) || ((chip_info&(1<<5))!=0) || ((chip_info&(1<<2))!=1)) return -ENODEV;

(3)修改中断方式(static int dmfe_open(struct net_device *dev)函数中)

    if (request_irq(dev->irq,&dmfe_interrupt,0,dev->name,dev))

改为

    if (request_irq(dev->irq,&dmfe_interrupt, IRQF_TRIGGER_RISING,dev->name,dev))

(4)修改iobase

    iobase = (int)ioremap(0x20000000, 1024); 

(5)修改中断号

    irq    = IRQ_EINT7;

(6)设置memory controller,设置位宽、时序

    volatile unsigned long *bwscon; // 0x48000000
    volatile unsigned long *bankcon4; // 0x48000014
    unsigned long val;

    /* 设置S3C2440的memory controller */
    bwscon   = ioremap(0x48000000, 4);
    bankcon4 = ioremap(0x48000014, 4);

    /* DW4[17:16]: 01-16bit
     * WS4[18]   : 0-WAIT disable
     * ST4[19]   : 0 = Not using UB/LB (The pins are dedicated nWBE[3:0])
     */
    val = *bwscon;
    val &= ~(0xf<<16);
    val |= (1<<16);
    *bwscon = val;

    /*
     * Tacs[14:13]: 发出片选信号之前,多长时间内要先发出地址信号
     *                     DM9000C的片选信号和CMD信号可以同时发出,
     *                     所以它设为0
     * Tcos[12:11]: 发出片选信号之后,多长时间才能发出读信号nOE
     *                     DM9000C的T1>=0ns,
     *                     所以它设为0
     * Tacc[10:8] : 读写信号的脉冲长度,
     *                    DM9000C的T2>=10ns,
     *                    所以它设为1, 表示2个hclk周期,hclk=100MHz,就是20ns
     * Tcoh[7:6]  : 当读信号nOE变为高电平后,片选信号还要维持多长时间
     *                    DM9000C进行写操作时, nWE变为高电平之后, 数据线上的数据还要维持最少3ns
     *                    DM9000C进行读操作时, nOE变为高电平之后, 数据线上的数据在6ns之内会消失
     *                    我们取一个宽松值: 让片选信号在nOE放为高电平后,再维持10ns,
     *                    所以设为01
     * Tcah[5:4]  : 当片选信号变为高电平后, 地址信号还要维持多长时间
     *                    DM9000C的片选信号和CMD信号可以同时出现,同时消失
     *                    所以设为0
     * PMC[1:0]   : 00-正常模式
     *
     */
    *bankcon4 = (1<<8)|(1<<6);    /* 对于DM9000C可以设Tacc为1, 对于DM9000E,Tacc要设大一点,比如最大值7  */
    //*bankcon4 = (7<<8)|(1<<6);  /* MINI2440使用DM9000E,Tacc要设大一点 */

    iounmap(bwscon);
    iounmap(bankcon4);

测试:

1. 把dm9dev9000c.c放到内核的drivers/net目录下
2. 修改drivers/net/Makefile

obj-$(CONFIG_DM9000) += dm9000.o
改为
obj-$(CONFIG_DM9000) += dm9dev9000c.o
3. make uImage
   使用新内核启动
4. 使用NFS启动,能启动说网络驱动是对的;
或者,nand flash启动,
ifconfig eth0 192.168.1.17
ping 192.168.1.1