DM9000驱动在MINI2440上的移植学习笔记

 

想了解一下DM9000的移植修改原理,所以分析了一下时序图和引脚连接

首先看一下DM9000的引脚和MINI2440的引脚连接

DM9000  MINI2440 功能描述
SD0   DATA0  数据信号
 |           |
SD15  DATA15  数据信号
CMD  ADDR2  识别为地址还是数据
INT   EINT7  中断
IOR#   nOE   读命令使能
IOW#  nWE   写命令使能
AEN   nGCS4  片选使能

可以看出连接了16条数据线,1条地址线,而这唯一的一条地址线用于判断数据线传输的是地址还是数据,所以这16条数据线为数据和地址复用

而片选信号使用的BANK4,则访问0x2000 0000 – 0x27FF FFFF这个范围的地址时会激活片选使能信号nGCS4

而在MINI2440提供的内核中,DM9000的地址IO地址为0x2000 0000,数据IO为0x2000 0004
则向地址IO写数据的时候不会激活ADDR2,所以向DM9000传送的数据为地址,而向数据IO写数据的时候会激活ADDR2,所以向DM9000传送的数据为数据

现在看看DM9000和S3C2440的时序信号

DM9000的写时序

 
 
IO16,IO32这两个引脚在MINI2440并没有连接,所以不看这两个引脚的时序
呢么整理如下:
 
还有就是写命令使能结束后到下一个写命令使能需要最少84ns的间隔时间,为T6
然后是S3C2440的写时序,由于DM9000是连接在BANK4上的,而BANK的写时序如下
 
由于DM9000在MINI2440上只需要片选使能,写命令使能和数据信号,所以我们不看ADDR和nBE信号,呢么整理如下
 
呢么这些值为多少呢?~
来看看BANKCON4
 

这里的值以时钟为周期,而BANKCON是接在Memory Controller上的(参考S3C2440A数据手册的表1-4),而Memory Controller使用的是Hclk总线时钟信号(参考S3C2440A数据手册的图7-1,感谢kasim大大指点),根据S3C2440手册,Hclk是由Fclk分频来的,具体的分频比每个板子的设置不一样,所以这里频率的设定要自己根据板子的设置来分析,假设主频为400MHz,然后Fclk,Hclk,Pclk的分频比为1:2:4,呢么Hclk就是200MHz,呢么每个时钟周期就是5ns

开始和DM9000的时序图进行对比,计算
Tcos对应T1,呢么最少应该为5ns,也就是1个clock
Tacc对应T2,呢么最少应该为22ns,呢么我们这里最少也要选6个clock,也就是30ns
Toch对应T5,在这里无设置,不过根据字面意思,我认为Tcoh就是Toch,Toch最少应该为5ns,也就是1个clock
Tcah对应T4,由于之前已经有Toch了,呢么这里可以设置为0ns,也就是0个clock

在S3C2440中,一个写命令使能结束到下一个写命令使能开始的时间间隔为Toch + Tcah + Tacp + Tacs + Tcos
Tacs是地址信号之后片选信号的起始间隔,我们这里先设为0ns,也就是0个clock

Toch + Tcah + Tacp + Tacs + Tcos应该 > 84
5 + 0 + Tacp + 0 + 5 > 84
Tacp > 74
但是Tacp的最大值为6个clock,也就是30ns,还少了44ns,大概9个clock
只要修改Toch Tcah Tacs和Tcos了,虽然我们给的都是最小值,但是为了信号稳定,可以放宽其范围,
将Tcos和Toch设置为4个clock
将Tacs和Tcah设置为2个Clock
这样总时间为 (4 + 2 + 6 + 2 +4)*5 = 90ns

最后DM9000 1个周期只能处理1个数据,所以PMC应该为normal(1data)

写时序分析完了,现在来看看读时序

DM9000的读时序如下

 
 
呢么整理如下:
 
 
读命令使能结束后到下一个读命令使能需要最少80ns的间隔时间,为T6
然后是S3C2440的读时序,时序如下

 
整理如下:
 

Tcos对应T1,呢么最少应该为5ns,也就是1个clock,这里设置为和写操作一样的4个clock
Tacc对应T2,呢么最少应该为22ns,这里设置为和写操作一样的6个clock
Toch对应T5,呢么最少应该为5ns,也就是1个clock,这里设置为和写操作一样的4个clock

其它时间间隔先设置和写操作一样
Tcah为2个clock
Tacp为6个clock
Tacs为2个clock
PMC为normal(1data)
然后看看满足读命令使能结束后到下一个读命令使能的时间间隔80ns不

还是Toch + Tcah + Tacp + Tacs + Tcos
(4 + 1 + 6 + 1 + 4) * 5 = 15 * 5 = 90ns,能符合条件

呢么BANKCON4的设置如下
Tacs = 2个clock = 10
Tcos = 4个clock = 11
Tacc = 6个clock = 100
Tcoh = 4个clock = 11
Tcah = 2个clock = 10
Tacp = 6个clock = 11
PMC = normal(1data) = 00

也就是0x5CEC

再来看BWSCON,这个寄存器负责配置BANK的带宽和等待状态
我们接的是nGCS4,呢么主要就看ST4,WS4和DW4这几个字段
DW4的描述为BANK4的带宽,DM9000接了16条地址线,呢么带宽就是16,这里选01
WS4的描述为是否为BANK4使用等待状态,DM9000没有接WAIT引脚,所以可以不管这个字段
ST4的描述为是否为BANK4使用UB/LB(写高/低字节使能),DM9000没有接nWBE[3:0]这4个引脚,所以也不管这个字段

现在看看友善的Linux下DM9000驱动为适应S3C2440做了什么修改

#if defined(CONFIG_ARCH_S3C2410)
#include <mach/regs-mem.h>
#endif

#if defined(CONFIG_ARCH_S3C2410)
 
//取得带宽及等待状态控制寄存器的地址
 unsigned int oldval_bwscon = *(volatile unsigned int *)S3C2410_BWSCON;
 
//取得4号BANK的控制寄存器的地址
 unsigned int oldval_bankcon4 = *(volatile unsigned int *)S3C2410_BANKCON4;
#endif


#if defined(CONFIG_ARCH_S3C2410)
 
//先清除BWSCON上的DW4为0
 
//然后设置带宽为16位
 
//启用BANK4的WAIT状态
 
//启用BANK4的SRAM的写高低字节使能
 *((volatile unsigned int *)S3C2410_BWSCON) =
   (oldval_bwscon & ~(3<<16)) | S3C2410_BWSCON_DW4_16 | S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4;
 
//设置PMC - Page mode configuration - 1 data
 
// Tacp - Page mode access cycle @ Page mode - 6 clocks
 
// Tcah - Address hold time after nGCSn - 4 clocks
 
// Tcoh - Chip selection hold time after nOE - 1 clock
 
// Tacc - Access cycle - 14 clocks
 
// Tcos - Chip selection set-up time before nOE - 4 clocks
 
// Tacs - Address set-up time before nGCSn - 0 clock
 *((volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c;
#endif

#if defined(CONFIG_ARCH_S3C2410)
 printk("Now use the default MAC address: 08:90:90:90:90:90\n");
 mac_src = "friendly-arm";
 ndev->dev_addr[0] = 0x08;
 ndev->dev_addr[1] = 0x90;
 ndev->dev_addr[2] = 0x90;
 ndev->dev_addr[3] = 0x90;
 ndev->dev_addr[4] = 0x90;
 ndev->dev_addr[5] = 0x90;
#else

#if defined(CONFIG_ARCH_S3C2410)
    *(volatile unsigned int *)S3C2410_BWSCON = oldval_bwscon;
    *(volatile unsigned int *)S3C2410_BANKCON4 = oldval_bankcon4;
#endif

主要就是执行3个功能
修改BWSCON寄存器
修改BANKCON4寄存器
修改MAC信息

以前看别人移植UBoot给MINI2440,Fclk,Hclk,Pclk的分频比1:4:8

呢么MINI2440上的Hclk就是100MHz,也就是1个时钟10ns,刚好比上面分析的大2倍,

呢么我们就可以将时钟数/2
Tacs = 1个clock = 01
Tcos = 2个clock = 10
Tacc = 3个clock = 010
Tcoh = 2个clock = 10
Tcah = 1个clock = 01
Tacp = 3个clock = 01
PMC = normal(1data) = 00

也就是0x3294
这里要注意的是使用WAIT信号的时候Tacc要大于等于4个clock
所以将
*((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;

改为
*((volatile unsigned int *)S3C2410_BWSCON) =
   (oldval_bwscon & ~(3<<16 | S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4 )) | S3C2410_BWSCON_DW4_16;
*((volatile unsigned int *)S3C2410_BANKCON4) = 0x3294;


大家喜欢的还可以把
#if defined(CONFIG_ARCH_S3C2410)
 printk("Now use the default MAC address: 08:90:90:90:90:90\n");
改为
#if defined(CONFIG_ARCH_NO2410)
 printk("Now use the default MAC address: 08:90:90:90:90:90\n");

这样就会通过读取DM9000来得到MAC地址,我经过试验,得出的MAC地址为ff:ff:ff:ff:ff:ff
不知道会对TCP/IP协议栈有什么影响

这是使用
*((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;
时候的延迟

 

响应时间在0.747左右

这是使用
*((volatile unsigned int *)S3C2410_BWSCON) =
   (oldval_bwscon & ~(3<<16 | S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4 )) | S3C2410_BWSCON_DW4_16;
*((volatile unsigned int *)S3C2410_BANKCON4) = 0x3294;
时候的延迟

 

可见响应时间有所改善~  不过我没有示波仪,所以不知道这样的设置会不会对DM9000造成不良影响~

所以大家的DM9000挂掉的话不要来找我哈~ 哈哈哈(逃~

由于对时序分析也是初次尝试~ 所以有写得不对的地方请大家一定要指出,万分感谢 = 3=)/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值