您的位置:首页 > 其它

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

2013-10-27 21:00 387 查看
转自:http://blog.chinaunix.net/uid-13321460-id-2902457.html

[align=left]想了解一下DM9000的移植修改原理,所以分析了一下时序图和引脚连接[/align]
首先看一下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的写时序



[align=center][/align]
[align=left][/align]
IO16,IO32这两个引脚在MINI2440并没有连接,所以不看这两个引脚的时序

呢么整理如下:



[align=center][/align]
还有就是写命令使能结束后到下一个写命令使能需要最少84ns的间隔时间,为T6

然后是S3C2440的写时序,由于DM9000是连接在BANK4上的,而BANK的写时序如下



[align=left][/align]
由于DM9000在MINI2440上只需要片选使能,写命令使能和数据信号,所以我们不看ADDR和nBE信号,呢么整理如下



[align=center][/align]
[align=left]呢么这些值为多少呢?~ [/align]
[align=left]来看看BANKCON4
[/align]



[align=center][/align]
这里的值以时钟为周期,而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的读时序如下



[align=center][/align]
[align=left][/align]
[align=left]呢么整理如下:[/align]
[align=left][/align]



[align=center][/align]
读命令使能结束后到下一个读命令使能需要最少80ns的间隔时间,为T6

然后是S3C2440的读时序,时序如下



[align=left][/align]
[align=left]整理如下:[/align]
[align=left][/align]



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;

时候的延迟



[align=center][/align]
响应时间在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;

时候的延迟



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

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

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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: