首要看一下DM9000的引脚和MINI2440的引脚衔接
DM9000
SD0
SD15
CMD
INT
IOR#
IOW#
AEN
能够看出衔接了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的写时序
呢么收拾如下:
然后是S3C2440的写时序,咱们DM9000是衔接在BANK4上的,而BANK的写时序如下
咱们DM9000在MINI2440上只需求片选使能,写指令使能和数据信号,所以咱们不看ADDR和nBE信号,呢么收拾如下
这儿的值以时钟为周期,而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的读时序如下
然后是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 #if #if #if #if |
首要便是碑文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) =
*((volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c;
改为
*((volatile unsigned int *)S3C2410_BWSCON) =
*((volatile unsigned int *)S3C2410_BANKCON4) = 0x3294;
我们喜爱的还能够把
#if defined(CONFIG_ARCH_S3C2410)
改为
#if defined(CONFIG_ARCH_NO2410)
这样就会通过读取DM9000来得到MAC地址,我通过实验,得出的MAC地址为ff:ff:ff:ff:ff:ff
不知道会对TCP/IP协议栈有什么影响
这是运用
*((volatile unsigned int *)S3C2410_BWSCON) =
*((volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c;
时分的推迟
呼应时刻在0.747左右
这是运用
*((volatile unsigned int *)S3C2410_BWSCON) =
*((volatile unsigned int *)S3C2410_BANKCON4) = 0x3294;
时分的推迟
可见呼应时刻有所改善~
所以我们的DM9000挂掉的话不要来找我哈~ 哈哈哈(逃~
咱们对时序剖析也是初度测验~ 所以有写得不对的地方请我们一定要指出,万分感谢 = 3=)/