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

发布者:Harmonious88最新更新时间:2024-07-29 来源: cnblogs关键字:linux2  6  内核移植  s3c2440  DM9000  网卡驱动 手机看文章 扫描二维码
随时随地手机看文章

参考:

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的时序


关键字:linux2  6  内核移植  s3c2440  DM9000  网卡驱动 引用地址:linux2.6.32 内核移植s3c2440 - DM9000网卡驱动移植

上一篇:u-boot-2012.04移植
下一篇:linux - 驱动中如何访问CPU中的寄存器?

推荐阅读最新更新时间:2026-03-23 10:58

Linux2.6.32移植到MINI2440(4)移植+分析DM9000网卡驱动
开发环境: 主机:fedora 14 虚拟机:vmware workstation 10 交叉编译工具:arm-linux-gcc 4.3.2 开发板:mini2440(2m nor ,64m sdram,256m nand) 内核版本:linux2.6.32.2 上一篇帖子的uImage可以起yaffs2文件系统,但是起不了nfs,我的yaffs2使用nfs打包来的,换一个内核可以起,bootargs也没有问题,可能是这里网卡没有移植造成的,移植结束之后再看能不能起,因为nfs对后面做驱动开发优势比较大,方便调试看现象,不需要每次都烧写进去,所以还是需要能够起nfs的。DM9000内核
[单片机]
Linux2.6.<font color='red'>32</font><font color='red'>移植</font>到MINI2440(4)<font color='red'>移植</font>+分析<font color='red'>DM9000</font><font color='red'>网卡</font><font color='red'>驱动</font>
ARM-Linux驱动--DM9000网卡驱动分析(三)
ARM-Linux驱动--DM9000网卡驱动分析(二)硬件平台:FL2440(s3c2440) 内核版本:2.6.35 主机平台:Ubuntu11.04 内核版本:2.6.39 交叉编译器:arm-linuc-gcc4.3.2 原创作品,转载请标明出处http://blog.csdn.net/yming0221/article/details/6615027 本文接上文 ARM-Linux驱动--DM9000网卡驱动分析(一) ARM-Linux驱动--DM9000网卡驱动分析(二) 下面开始看网卡设备的打开、关闭函数和操作函数 view plainprint? static const struct net_
[单片机]
ARM-Linux<font color='red'>驱动</font>--<font color='red'>DM9000</font><font color='red'>网卡</font><font color='red'>驱动</font>分析(三)
基于S3C2440的Linux内核移植和yaffs2文件系统制作-- 配置Linux内核
1.3.3 配置Linux内核 1、 进入Linux-2.6.29.1内核主目录,通过以下命令将2410的默认配置文件写到当前目录下的.config。S3C2410的配置和S3C2440差不多,,在这基础上进行修改。 make s3c2410_defconfig 2、 配置内核模块的功能,有几种方式可以进行界面选择: make menuconfig(文本选单的配置方式,在有字符终端下才能使用) make xconfig(图形窗口模式的配置方式,图形窗口的配置比较直观,必须支持Xwindow下才能使用) make oldconfig(文本配置方式,在原内核配置的基础修改时使用) 这里使用make menuconfi
[单片机]
linux-2.6.26内核移植S3C2440平台
备知识: Linux支持多种平台架构。在其源码的arch目录下,已经将各种支持的平台架构的源码分门别类。为了配置方便,在各种平台架构的目录下,一般都配有一个名为configs的目录。其中,放置着许多已经初步配置好的defconfig文件。通过这些defconfig文件,加快了我们配置内核的速度。 比如我所用的是一个arm架构的s3c2440板,那我就可以从arch/arm/configs/中找到s3c2410_defconfig,这是目前最匹配2440的一个默认配置文件了。使用: $ make s3c2410_defconfig 或 $ cp arch/arm/configs/s3c2410_defconfig ./.
[单片机]
imx6ull之linux内核移植
开发板:飞凌 OKMX6ULL-S + 7寸电阻屏 交叉编译工具链:gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf linux内核:linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 一、内核编译   1、将内核通过ftp上传至linux虚拟机,解压:tar -jxvf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2   2、修改Makefile     cd linux-imx-rel_imx_4.1.15_2.1.0_ga/     vi Makefile     跳至252行(252G),复制2行(
[单片机]
imx<font color='red'>6</font>ull之linux<font color='red'>内核</font><font color='red'>移植</font>
dm9000网卡 S3C2440
配置U-Boot支持dm9000网卡 原理图 # vi drivers/net/Makefileobj-$(CONFIG_DRIVER_NET_CS8900) += cs8900.o obj-$(CONFIG_DRIVER_NET_SMC911X) += smc911x.o obj-$(CONFIG_DRIVER_NET_DM9000) += dm9000.o obj-$(CONFIG_DRIVER_NET_NETX) += netx_eth.o obj-$(CONFIG_DRIVER_NET_AT91_ETHER) += at91_ether.o obj-$(CONFIG_DRIVER_NE
[单片机]
<font color='red'>dm9000</font><font color='red'>网卡</font> <font color='red'>S3C2440</font>
06-S3C2440学习之移植2012u-boot到S3C2440(移植过程四)支持Nand Flash+支持DM9000网卡
一、支持nand读写 移植 uboot到S3C2440(移植过程一)新建单板+修改时钟+SDRAM+UART(←点击查看)过程中,为了避免当时编译出现的错误,我们屏蔽了 include/configs/smdk2440.h: //#defineCONFIG_CMD_NAND (1)取消#defineCONFIG_CMD_NAND的注释,编译出现如下错误: (2)因为include/configs/smdk2440.h中: CONFIG_S3C2410改为了CONFIG_S3C2440,所以下面的定义没了 (3)分析下nand是如何发命令 数据 地址的。 CLE高:命令 ALE高:地址 (4)把d
[单片机]
06-S3C2440学习之<font color='red'>移植</font>2012u-boot到<font color='red'>S3C2440</font>(<font color='red'>移植</font>过程四)支持Nand Flash+支持<font color='red'>DM9000</font><font color='red'>网卡</font>
I.MX6Q(TQIMX6Q/TQE9)学习笔记——新版BSP之网卡驱动移植
由于对网卡这块不是很熟悉,误以为网卡驱动也可以简单的配置下DTS就可以正常工作了,实际移植中遇到了些问题。闲话少说,下面开始tqimx6q的网卡驱动移植。 DTS编写 首先在我们的DTS中添加网卡配置,参考sabrelite的DTS,我们可以如下编写: &fec { pinctrl-names = default ; pinctrl-0 = &pinctrl_enet_1 ; phy-mode = rgmii ; status = okay ; }; 开始以为添加以上内容后编译并烧写DTB就可以正常工作了,实则不然,还需要添加PHY相关的配置代码。 PHY配置 打开arch/arm/mach-imx
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved