Linux驱动笔记(八): DM9000网卡驱动

DM9000硬件连接分析
s3c2440与DM9000的连接关系如下:

在这里插入图片描述

在这里插入图片描述

从上图可得出下面几个关键点:

1.中断线与GPF7相连,对应IRQ_EINT7
2.片选与nGCS4相连,基地址对应0x2000_0000
3.CMD线与地址线ADDR2相连,意味着要使CMD高电平,需要ADDR2 = 1,所以往0x20000004中写数据就会拉高CMD。(基地址0x2000_0000,偏移地址0x4,对应二进制"100“,所以此时地址ADDR2=1)
从DM9000数据手册可知:
当CMD为高时,DM9000认为传输的是数据;当CMD为低时,DM9000认为传输的是寄存器地址。
所以在控制DM9000时,往0x20000004地址写命令,往0x20000000地址写寄存器地址。
DM9000时序分析与S3C2440存储控制器分析
DM9000读取时序图

DM9000写时序图:

BWSCON寄存器

ST4 : UB/LB是指一个u16的数据分高低字节两次发送,由于我们是16位数据线可一次发送,所以ST4 = 0
WS4: 硬件没有连接。所以WS4 = 0
DW4: 16位数据线,所以DW4 = 01

BANKCON寄存器
通过分析DM9000读写时序图,设置参数如下:(HCLK=100MHZ, 1个时钟等于10ns)
Tacs :nGCSn前的地址建立时间,观察到DM9000的CS#与CMD为同一根线,所以Tacs = 0
Tcos:发送读命令前的片选建立时间,DM9000C的T1>=0ns,所以Tcos = 0
Tacc:读写信号脉冲时间,DM9000C的T2>=10ns = 1 clock,所以Tacc = 1
Tcoh:当读写信号(IOR# / IOW#)变为高电平后,片选信号还要维持多长时间:
写DM9000C时, IOW#变为高电平之后, 数据线上的数据最小维持3ns,T4 = 3
读DM9000C时, IOR#变为高电平之后, 数据线上的数据最大位置6ns,T4 = 6
所以Tcoh = 1 clock = 10ns
Tcah: nGCS变为高电平后,地址信号维持时间,理由同Tacs。所以Tcah = 0
Tcap: page模式下访问周期,不是用page模式,所以Tcap = 0
PMC:正常模式

网卡驱动框架
1.通过alloc_etherdev()函数分配,初始化net_device,同时分配一段私有数据空间,通过netdev_priv函数指向board_info结构体
2.设置net_device结构体
3.设置board_info结构体,以及MII接口

/* Structure/enum declaration ------------------------------- /
typedef struct board_info {
u32 io_addr; /
Register I/O base address,命令寄存器IO基地址 /
u32 io_data; /
Data I/O address ,数据寄存器IO地址*/
u8 op_mode; /* PHY operation mode ,PHY操作模式*/
u8 io_mode; /* 0:word, 2:byte ,IO模式,0位字,而2为字节*/
u8 Speed; /* current speed,当前的速度 /
u8 chip_revision;
int rx_csum; /
0:disable, 1:enable,接收计数使能,0为不使能,1为使能 */

u32 reset_counter;   /* counter: RESET */ 
u32 reset_tx_timeout;/* 发送数据超时 */
int tx_pkt_cnt;                     /* 传输包计数 */
int cont_rx_pkt_cnt;                /* 当前接受的数据包计数*/
struct net_device_stats stats;      /* 设备传输统计 */

struct timer_list timer;            /* 时间列表 */
unsigned char srom[128];
spinlock_t lock;                    /* 自旋锁 */
struct mii_if_info mii;             /* MII总线信息 */

} board_info_t;
4.实现ethtool_ops结构体,该结构体为net_device结构体中的ethtool_ops成员

static struct ethtool_ops dmfe_ethtool_ops = {
.get_drvinfo = dmfe_get_drvinfo,
.get_settings = dmfe_get_settings,
.set_settings = dmfe_set_settings,
.get_link = dmfe_get_link,
.nway_reset = dmfe_nway_reset,
};
5.实现net_device_ops结构体,该结构体为net_device结构体中的netdev_ops成员

static const struct net_device_ops dm9k_netdev_ops = {
.ndo_open = dmfe_open, //打开DM9000调用的函数
.ndo_stop = dmfe_stop,
.ndo_start_xmit = dmfe_start_xmit, //发送包函数
.ndo_tx_timeout = dmfe_timeout, //当watchdog超时时调用该函数。
.ndo_set_rx_mode = dm9000_hash_table,//设置DM9000的组播地址
.ndo_do_ioctl = dmfe_do_ioctl,//dm9000的ioctl实际上是使用了mii的ioctl
.ndo_change_mtu = eth_change_mtu,
.ndo_get_stats = dmfe_get_stats,
.ndo_validate_addr = eth_validate_addr,
.ndo_set_mac_address = eth_mac_addr,
};
6.注册net_device结构体:register_netdev()

DM9000发包分析

DM9000共16k的SRAM中,地址0x0000~0x0BFF(3k)是TX Buffer, 地址0x0C00~0x3FFF(13k)是RX Buffer。发送一个包的具体步骤如下:
Step 1: 检查存储数据宽度。通过读取中断状态寄存器(ISR)的bit[7:6]来确定是8bit,16bit还是32bit。
Step 2: 写数据到TX SRAM中。
Step 3: 写传输长度到TXPLL和TXPLH寄存器中。
Step 4: 设置TXCR寄存器的bit[0]TXREQ来开始发送一个包。

配置使用内核自带DM9000驱动
内核配置
-> Device Drivers
-> Network device support
-> Ethernet driver support
-> DM9000 support

arch/arm/mach-s3c24xx/mach-smdk2440.c 添加资源与平台设备。
#include <linux/dm9000.h>
#define MACH_SMDK2440_DM9K_BASE (S3C2410_CS4 + 0x300)
static struct resource smdk2440_dm9k_resource[] = {
[0] = {
.start = MACH_SMDK2440_DM9K_BASE,
.end = MACH_SMDK2440_DM9K_BASE + 3,
.flags = IORESOURCE_MEM
},
[1] = {
.start = MACH_SMDK2440_DM9K_BASE + 4,
.end = MACH_SMDK2440_DM9K_BASE + 7,
.flags = IORESOURCE_MEM
},
[2] = {
.start = IRQ_EINT7,
.end = IRQ_EINT7,
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
}
};
/*

  • The DM9000 has no eeprom, and it’s MAC address is set by
  • the bootloader before starting the kernel.
    */
    static struct dm9000_plat_data SMDK2440_dm9k_pdata = {
    .flags = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),
    };

static struct platform_device smdk2440_device_eth = {
.name = “dm9000”,
.id = -1,
.num_resources = ARRAY_SIZE(smdk2440_dm9k_resource),
.resource = smdk2440_dm9k_resource,
.dev = {
.platform_data = &SMDK2440_dm9k_pdata,
},
};
将定义好的平台设备添加到初始化数组当中
static struct platform_device *smdk2440_devices[] __initdata = {

&smdk2440_device_eth, //添加该句

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
dm9000最详细的中文数据手册 最全的中文 DM9000A数据手册 目 录 1. 概述 5 2. 模块图 5 3. 特性 5 4. 引脚配置 6 4.1(16位模式) 6 4.2(8位模式) 7 5. 引脚描述 7 5.1处理器接口 7 5.1.1 8位模式引脚 8 5.2 EEPROM接口 8 5.3时钟引脚 9 5.4 LED接口 9 5.5 10/100 PHY/Fiber 9 5.6其他 10 5.7电源引脚 10 5.8捆绑引脚列表(Strap pins table) 10 6. 控制和状态寄存器列表 10 6.1网络控制寄存器(NCR) 12 6.2网络状态寄存器(NSR) 13 6.3发送控制寄存器(TCR) 13 6.4数据包1发送状态寄存器1(TSR I) 13 6.5数据包2发送状态寄存器2(TSR II) 14 6.6接收控制寄存器(RCR) 14 6.7接收状态寄存器(RSR) 15 6.8接收溢出计数寄存器(ROCR) 15 6.9背压阈值寄存器(BPTR) 15 6.10流控制阈值寄存器(FCTR) 16 6.11接收/发送流控制寄存器(RTFCR) 16 6.12 EEPROM与PHY控制寄存器(EPCR) 17 6.13 EEPROM与PHY地址寄存器(EPAR) 17 6.14 EEPROM与PHY数据寄存器(EPDRL/EPDRH) 18 6.15唤醒控制寄存器(WCR) 18 6.16物理地址(MAC)寄存器(PAR) 18 6.17多播地址寄存器(MAR) 19 6.18通用目的控制寄存器(GPCR) 19 6.19通用目的寄存器(GPR) 19 6.20 TX SRAM读指针地址寄存器(TRPAL/TRPAH) 20 6.21 RX SRAM写指针地址寄存器(RWPAL/RWPAH) 20 6.22厂家ID寄存器(VID) 20 6.23产品ID寄存器(PID) 20 6.24芯片版本寄存器(CHIPR) 20 6.25发送控制寄存器2(TCR2) 20 6.26操作测试控制寄存器(OCR) 21 6.27特殊模式控制寄存器(SMCR) 21 6.28即将发送控制/状态寄存器(ETXCSR) 22 6.29校验和控制寄存器(TCSCR) 22 6.30接收校验和控制状态寄存器(RCSCSR) 22 6.31内存数据预取读命令寄存器(地址不加1)(MRCMDX) 23 6.32内存数据读命令寄存器(地址不加1)(MRCMDX1) 23 6.33内存数据读命令寄存器(地址加1)(MRCMD) 23 6.34内存数据读地址寄存器(MRRL/ MRRH) 23 6.35内存数据写命令寄存器(地址不加1)(MWCMDX) 23 6.36内存数据写命令寄存器(地址加1)(MWCMD) 24 6.37内存数据写地址寄存器(MWRL/ MWRH) 24 6.38发送数据包长度寄存器(TXPLL/TXPLH) 24 6.39中断状态寄存器 (ISR) 24 6.40中断屏蔽寄存器(IMR) 24 7.EEPROM格式 25 8.PHY寄存器描述 26 8.1基本模式控制寄存器(BMCR) 27 8.2基本模式状态寄存器(BMSR) 28 8.3 PHY ID标识符寄存器#1(PHYID1) 29 8.4 PHY ID标识符寄存器#2(PHYID1) 29 8.5自动协商通知寄存器(ANAR) 30 8.6自动协商连接对象寄存器(ANLPAR) 31 8.7自动协商扩展寄存器(ANER) 32 8.8 DAVICOM指定配置寄存器(DSCR) 33 8.9 DAVICOM指定配置和状态寄存器(DSCSR) 34 8.10 10BASE-T配置/状态(10BTCSR) 36 8.11掉电控制寄存器(PWDOR) 36 8.12指定配置寄存器(SCR) 37 9. 功能描述 38 9.1 主机接口(HI) 38 9.2 直接内存访问控制(DMAC) 38 9.3 数据包发送(PT) 38 9.4 数据包接收(PR) 39 9.5 100Base-TX操作 39 9.5.1 4B5B编码器 39 9.5.2扰频器(Scrambler) 39 9.5.3 并--串转换 39 9.5.4 NRZ码到NRZI码转换 39 9.5.5 NRZI码到MLT-3码转换 39 9.5.6 MLT-3驱动 40 9.5.7 4B5B编码 40 9.6 100Base-TX接收器 40 9.6.1 信号检测 41 9.6.2 自适应补偿 41 9.6.3 MLT-3到NRZI解码 41 9.6.4 时钟复原模块 41 9.6.5 NRZI 到NRZ 41 9.6.6 串-并转换 41 9.6.7 扰频器 41 9.6.8 编码组对齐模块 42 9.6.9 4B5B解码 42 9.7 10Base-T操作 42 9.8 冲突检测 42 9.9 载波检测 42 9.10 自动协商 42 9.11 省电模式 42 9.11.1 掉电模式 43 9.11.2 降低发送损耗模式 43 10 DC与AC电器特性 43 10.1 最大绝对额定值 43 10.1.1 工作条件 43 10.2 DC电器特性(VDD=3.3V) 44 10.3 AC电器特性与时序 44 10.3.1 TP接口 44 10.3.2 晶振/振荡时钟 44 10.3.3 I/O读时序 45 10.3.4 I/O写时序 45 10.3.5 EEPROM接口时序 46 11应用说明 46 11.1网络接口信号接线 46 11.2 10Base-T/100Base-TX自动MDIX应用 47 11.3 10Base-T/100Base-TX无自动MDIX变压器应用 47 11.4电源退偶电容 47 11.5地平面布局 48 11.6电源平面分割 49 11.7铁氧体磁珠选择指导 50 11.8晶振选择指导 50 12封装信息 50 13订购信息 52

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小薛1988

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值