linux2.6.32 内核移植s3c2440 - DM9000网卡驱动移植

发布时间:2024-07-29  

参考:

http://caiming1987612.blog.163.com/blog/static/118556676200961752714307/

http://blog.chinaunix.net/u1/34474/showart_401078.html

http://hi.baidu.com/%D3%F3%C4%E0%C4%EA%B8%E2/blog/item/6256fea7bfceac98d0435819.html

时序图和引脚连接 :http://blog.chinaunix.net/u1/57901/showart_2023852.html

(一)打开arch/arm/mach-s3c2440/mach-test2440.c

添加代码如下:

#define MACH_TEST2440_DM9K_BASE (S3C2410_CS4 + 0x300)

/*S3C2410_CS4被定义为0x20000000(BANK4基地址),

DM9000在板子的bank4上, 0x20000300

如果在板子的bank1上, 则是0x80000300 */

static struct resource test2440_dm9k_resource[] = {
        [0] = {
                .start = MACH_TEST2440_DM9K_BASE,      //0x20000300, 发送
                .end   = MACH_TEST2440_DM9K_BASE + 3,
                .flags = IORESOURCE_MEM
        },
        [1] = {
                .start = MACH_TEST2440_DM9K_BASE + 4, //0x20000304, 传输
                .end   = MACH_TEST2440_DM9K_BASE + 7,
                .flags = IORESOURCE_MEM
        },
        [2] = {
                .start = IRQ_EINT7, /* 中断号,连接S3C2440的EINT7引脚 */
                .end   = IRQ_EINT7,
                .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE, /*上升沿触发*/
        }
};

static struct dm9000_plat_data test2440_dm9k_pdata = {
        .flags          = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),
}; //DM9000与开发板相关的数据,指定访问DM9000时,数据位宽为16

static struct platform_device test2440_device_eth = { /*注册平台设备*/
        .name           = "dm9000",
        .id             = -1,
        .num_resources  = ARRAY_SIZE(test2440_dm9k_resource),
        .resource       = test2440_dm9k_resource,
        .dev            = {
                .platform_data  = &test2440_dm9k_pdata,
        },
};

(二)最后把平台设备test2440_device_eth 注册进去:

static struct platform_device *test2440_devices[] __initdata = {
        &s3c_device_usb,
        &s3c_device_lcd,
        &s3c_device_wdt,
        &s3c_device_i2c0,
        &s3c_device_iis,
        &s3c_device_nand,
        //&s3c24xx_uda134x,
        //&s3c_device_sdi,
        //&s3c_device_usbgadget,
        &test2440_device_eth, //这里添加dm9000网卡设备
};

(三)修改drivers/net/dm9000.c

1. 开头增加:

    #if defined(CONFIG_ARCH_S3C2410)
    #include
    #endif

2. 在函数static int __devinit dm9000_probe(struct platform_device *pdev)中,增加了

/* try reading the node address from the attached EEPROM */
       for (i = 0; i < 6; i += 2)
               dm9000_read_eeprom(db, i / 2, ndev->dev_addr+i);

       if (!is_valid_ether_addr(ndev->dev_addr) && pdata != NULL) {
               mac_src = "platform data";
               memcpy(ndev->dev_addr, pdata->dev_addr, 6);
       }

       if (!is_valid_ether_addr(ndev->dev_addr)) {
               /* try reading from mac */

               mac_src = "chip";
               for (i = 0; i < 6; i++)
                       ndev->dev_addr[i] = ior(db, i+DM9000_PAR);
       }

memcpy(ndev->dev_addr, "/x08/x90/x90/x90/x90/x90", 6); //新添加

3. 在函数static int __init dm9000_init(void)中,增加了

     #if defined(CONFIG_ARCH_S3C2410)
      unsigned int oldval_bwscon = *(volatile unsigned int *)S3C2410_BWSCON;
      unsigned int oldval_bankcon4 = *(volatile unsigned int *)S3C2410_BANKCON4;
     *((volatile unsigned int *)S3C2410_BWSCON) =
         (oldval_bwscon & ~(3<<16)) | S3C2410_BWSCON_DW4_16 | S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4;
      *((volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c;
     #endif

经过验证,增加的第三部分代码(当然,包括头文件mach/regs-mem.h)影响了网络的性能。那么,我们来看看这部分代码的作用是什么。

    首先,由开发板的原理图可以看到,dm9000网卡的AEN引脚与S3C2440的nGCS4连接(Bank4)。

回到代码。

#if defined(CONFIG_ARCH_S3C2410)
    unsigned int oldval_bwscon = *(volatile unsigned int *)S3C2410_BWSCON;
    unsigned int oldval_bankcon4 = *(volatile unsigned int *)S3C2410_BANKCON4;
    *((volatile unsigned int *)S3C2410_BWSCON) =
            (oldval_bwscon & ~(3<<16)) | S3C2410_BWSCON_DW4_16 | S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4;
    *((volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c;
#endif

位宽&等待状态寄存器BWSCON(BUS WIDTH&WAIT STATUS CONTROL REGISTER),每四位控制一个memory bank,根据S3C2440手册,涉及dm9000的4个引脚是16~19。默认值是0x000000。

1. ST4[19]:SRAM是否使用UB/LB(upper byte/lower byte)。0:不使用UB/LB;1:使用UB/LB。

2. WS4[18]:WAIT状态。0:禁止WAIT;1:使能WAIT。

3. DW4[16:17]:数据总线宽度。00:8位;01:16位;10:32位;11:保留。

     接着,BANK4控制寄存器BANKCON4(BANK CONTROL REGISTER),用于控制BANK4外接设备的访问时序。默认值是0x0700。

1. Tacs[14:13]:地址建立时间。00:0时钟周期;01:1时钟周期;10:2时钟周期;11:4时钟周期。

2. Tcos[12:11]:片选建立时间。00:0时钟周期;01:1时钟周期;10:2时钟周期;11:4时钟周期。

3. Tacc[10:8]:地址周期。000:1时钟周期;001:2时钟周期;... 111:14时钟周期。

4. Tcoh[7:6]:片选保持时间。00:0时钟周期;01:1时钟周期;10:2时钟周期;11:4时钟周期。

5. Tcah[5:4]:地址保持时间。00:0时钟周期;01:1时钟周期;10:2时钟周期;11:4时钟周期。

6. Tcap[3:2]:页模式存取周期。00:2时钟周期;01:3时钟周期;10:4时钟周期;11:6时钟周期。

7. PMC[1:0]:页模式配置。00:1 data;01:4 data;10:8 data;11:16 data。

     最后,在arch/arm/mach-s3c2410/include/mach/regs-mem.h中,
#define S3C2410_BWSCON_DW4_16   (1<<16)
#define S3C2410_BWSCON_WS4   (1<<18)
#define S3C2410_BWSCON_ST4   (1<<19)

理解了寄存器BWSCON和BANKCON4的含义之后,上述代码的作用就很明显了。

*((volatile unsigned int *)S3C2410_BWSCON) =
    (oldval_bwscon & ~(3<<16)) | S3C2410_BWSCON_DW4_16 | S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4;// 数据总线宽度16bits,使用UB/LB,使能WAIT

*((volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c; //修改了访问dm9000的时序


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>