您的位置 首页 基础

嵌入式Linux之我行——深化了解DM9000在mini2440上的驱动

首先看一下DM9000的引脚和MINI2440的引脚连接DM9000MINI2440功能描述SD0DATA0数据信号

首要看一下DM9000的引脚和MINI2440的引脚衔接

DM9000MINI2440功用描绘
SD0DATA0数据信号
| |
SD15DATA15数据信号
CMDADDR2识别为地址仍是数据
INTEINT7中止
IOR#nOE读指令使能
IOW#nWE写指令使能
AENnGCS4片选使能

能够看出衔接了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做了什么修正

#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 – 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
*((volatileunsignedint*)S3C2410_BANKCON4)=0x1f7c;
#endif

#ifdefined(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

#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
所以将
*((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=)/

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/jichu/264575.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部