DM9000和MINI2440深入理解.docx
- 文档编号:7240605
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:11
- 大小:554.53KB
DM9000和MINI2440深入理解.docx
《DM9000和MINI2440深入理解.docx》由会员分享,可在线阅读,更多相关《DM9000和MINI2440深入理解.docx(11页珍藏版)》请在冰豆网上搜索。
DM9000和MINI2440深入理解
首先看一下DM9000的引脚和MINI2440的引脚连接
DM9000 MINI2440 功能描述
SD0 DATA0 数据信号
| |
SD15 DATA15 数据信号
CMD ADDR2 识别为地址还是数据
INT EINT7 中断
IOR# nOE 读命令使能
IOW# nWE 写命令使能
AEN nGCS4 片选使能
可以看出连接了16条数据线,1条地址线,而这唯一的一条地址线用于判断数据线传输的是地址还是数据,所以这16条数据线为数据和地址复用
而片选信号使用的BANK4,则访问0x20000000–0x27FFFFFF这个范围的地址时会激活片选使能信号nGCS4
而在MINI2440提供的内核中,DM9000的地址IO地址为0x20000000,数据IO为0x20000004
则向地址IO写数据的时候不会激活ADDR2,所以向DM9000传送的数据为地址,而向数据IO写数据的时候会激活ADDR2,所以向DM9000传送的数据为数据
现在看看DM9000和S3C2440的时序信号
DM9000的写时序
IO16,IO32这两个引脚在MINI2440并没有连接,所以不看这两个引脚的时序
呢么整理如下:
还有就是写命令使能结束后到下一个写命令使能需要最少84ns的间隔时间,为T6
然后是S3C2440的写时序,由于DM9000是连接在BANK4上的,而BANK的写时序如下
由于DM9000在MINI2440上只需要片选使能,写命令使能和数据信号,所以我们不看ADDR和nBE信号,呢么整理如下
呢么这些值为多少呢?
~
来看看BANKCON4
这里的值以时钟为周期,而BANKCON是接在MemoryController上的(参考S3C2440A数据手册的表1-4),而MemoryController使用的是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
只要修改TochTcahTacs和Tcos了,虽然我们给的都是最小值,但是为了信号稳定,可以放宽其范围,
将Tcos和Toch设置为4个clock
将Tacs和Tcah设置为2个Clock
这样总时间为(4+2+6+2+4)*5=90ns
最后DM90001个周期只能处理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做了什么修改
#ifdefined(CONFIG_ARCH_S3C2410)
#include
#endif
#ifdefined(CONFIG_ARCH_S3C2410)
//取得带宽及等待状态控制寄存器的地址
unsignedintoldval_bwscon=*(volatileunsignedint*)S3C2410_BWSCON;
//取得4号BANK的控制寄存器的地址
unsignedintoldval_bankcon4=*(volatileunsignedint*)S3C2410_BANKCON4;
#endif
#ifdefined(CONFIG_ARCH_S3C2410)
//先清除BWSCON上的DW4为0
//然后设置带宽为16位
//启用BANK4的WAIT状态
//启用BANK4的SRAM的写高低字节使能
*((volatileunsignedint*)S3C2410_BWSCON)=
(oldval_bwscon&~(3<<16))|S3C2410_BWSCON_DW4_16|S3C2410_BWSCON_WS4|S3C2410_BWSCON_ST4;
//设置PMC-Pagemodeconfiguration-1data
//Tacp-Pagemodeaccesscycle@Pagemode-6clocks
//Tcah-AddressholdtimeafternGCSn-4clocks
//Tcoh-ChipselectionholdtimeafternOE-1clock
//Tacc-Accesscycle-14clocks
//Tcos-Chipselectionset-uptimebeforenOE-4clocks
//Tacs-Addressset-uptimebeforenGCSn-0clock
*((volatileunsignedint*)S3C2410_BANKCON4)=0x1f7c;
#endif
#ifdefined(CONFIG_ARCH_S3C2410)
printk("NowusethedefaultMACaddress:
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
#ifdefined(CONFIG_ARCH_S3C2410)
*(volatileunsignedint*)S3C2410_BWSCON=oldval_bwscon;
*(volatileunsignedint*)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
所以将
*((volatileunsignedint*)S3C2410_BWSCON)=
(oldval_bwscon&~(3<<16))|S3C2410_BWSCON_DW4_16|S3C2410_BWSCON_WS4|S3C2410_BWSCON_ST4;
*((volatileunsignedint*)S3C2410_BANKCON4)=0x1f7c;
改为
*((volatileunsignedint*)S3C2410_BWSCON)=
(oldval_bwscon&~(3<<16|S3C2410_BWSCON_WS4|S3C2410_BWSCON_ST4))|S3C2410_BWSCON_DW4_16;
*((volatileunsignedint*)S3C2410_BANKCON4)=0x3294;
大家喜欢的还可以把
#ifdefined(CONFIG_ARCH_S3C2410)
printk("NowusethedefaultMACaddress:
08:
90:
90:
90:
90:
90\n");
改为
#ifdefined(CONFIG_ARCH_NO2410)
printk("NowusethedefaultMACaddress:
08:
90:
90:
90:
90:
90\n");
这样就会通过读取DM9000来得到MAC地址,我经过试验,得出的MAC地址为ff:
ff:
ff:
ff:
ff:
ff
不知道会对TCP/IP协议栈有什么影响
这是使用
*((volatileunsignedint*)S3C2410_BWSCON)=
(oldval_bwscon&~(3<<16))|S3C2410_BWSCON_DW4_16|S3C2410_BWSCON_WS4|S3C2410_BWSCON_ST4;
*((volatileunsignedint*)S3C2410_BANKCON4)=0x1f7c;
时候的延迟
响应时间在0.747左右
这是使用
*((volatileunsignedint*)S3C2410_BWSCON)=
(oldval_bwscon&~(3<<16|S3C2410_BWSCON_WS4|S3C2410_BWSCON_ST4))|S3C2410_BWSCON_DW4_16;
*((volatileunsignedint*)S3C2410_BANKCON4)=0x3294;
时候的延迟
可见响应时间有所改善~ 不过我没有示波仪,所以不知道这样的设置会不会对DM9000造成不良影响~
所以大家的DM9000挂掉的话不要来找我哈~哈哈哈(逃~
由于对时序分析也是初次尝试~所以有写得不对的地方请大家一定要指出,万分感谢=3=)/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DM9000 MINI2440 深入 理解