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

发布者:trendsetter10最新更新时间:2016-12-05 来源: eefocus关键字: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 
#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驱动  MINI2440  移植 引用地址:DM9000驱动在MINI2440上的移植学习笔记

上一篇:Linux-2.6.30.4在2440上的移植之触摸屏驱动
下一篇:linux2.6.32.2移植到ARM平台(mini2440)

推荐阅读最新更新时间:2024-03-16 15:23

Arm linux 内核移植及系统初始化过程分析
本文主要介绍内核移植过程中涉及文件的分布及其用途,以及简单介绍系统的初始化过程。整个arm linux内核的启动可分为三个阶段:第一阶段主要是进行cpu和体系结构的检查、cpu本身的初始化以及页表的建立等;第二阶段主要是对系统中的一些基础设施进行初始化;最后则是更高层次的初始化,如根设备和外部设备的初始化。了解系统的初始化过程,有益于更好地移植内核。 1. 内核移植2. 涉及文件分布介绍 2.1. 内核移植2.2. 涉及的头文件 /linux-2.6.18.8/include # tree -L 1 . |-- Kbuild |-- acpi |-- asm - asm-arm |-- asm-alpha |-- asm-
[单片机]
MiniGUI在OMAP5912上的移植
1OMAP5912开发板简介 OMAP5912处理器是由TI应用最为广泛的TMS320C55X DSP内核(192 MHz)与低功耗、增强型ARM926EJ-S微处理器(192 MHz)组成的双核应用处理器,采用O.13μm CMOS工艺制造。C55xDSP可提供对低功耗应用的实时多媒体处理的支持;ARM926EJ-S MPU可满足控制和接口方面的处理需要。基于双核结构的OMAP5912具有极强的运算能力和极低的功耗,采用开放式、易于开发的软件设施,支持广泛的操作系统。 2 图形用户界面MiniGUI简介 与几种主流嵌入式GUI相比,MiniGUI具有以下显著特点:占用资源少,高性能,高可靠性,可配置。MiniGUl采
[单片机]
MiniGUI在OMAP5912上的<font color='red'>移植</font>
mini2440存储器的理解和使用
S3C2440是32位的处理器理论寻址范围为2^32即4G,S3C2440使用 作为地址线,寻址范围128M,使用 作为bank选择信号,所以S3C2440可以连接8个外设,如果全部连接存储器就可以达到1GB的内存。在S3C2440中内存为64MB,它使用了第6和第7个bank连接两片32MB的SDAM。由于外设多种多样其位宽也不尽相同,所以每个bank的数据宽度是可以软件编程控制的。 为什么下载程时要下载到0x30000000地址单元执行,或下载文件到0x30000000地址单元再通过写操作写到NAND FLASH? 因为两片SDARM在bank6和bank7上面连接,通过 的信号决定选择那块bank,所以bank6的起
[单片机]
对<font color='red'>mini2440</font>存储器的理解和使用
Linux2.6.32移植MINI2440(1)初步移植
根据友善之臂提供的手册——《MINI2440 Linux移植开发实战指南-内核部分-2010.9.9》以及网络上一些帖子,在此对他们的工作表示感谢,基本过程大都一致,主要是为了熟悉内核的基本移植方法,目的是为了能够生成一个MINI2440上可用的内核。 开发环境: 主机:fedora 14 虚拟机:vmware workstation 10 交叉编译工具:arm-linux-gcc 4.3.2 开发板:mini2440(2m nor ,64m sdram,256m nand) 一、下载源码包解压到指定位置 下载地址:http://www.kernel.org/pub/l
[单片机]
CanFestival移植到STM32F103
1.创建工程 2.将CanFestival源码,拷贝到工程目录 3.删除其它架构和编译器的代码 查看include文件夹发现没有cortex-m3架构,因此我们这里借鉴AVR架构进行修改 将AVR文件夹重命名为STM32,并删除其它架构文件夹 打开STM32文件夹,将里面avr相关的文件删除,我们用的开发环境是MDK,因此将iar相关文件也删了 打开src文件夹,将其它架构、编译器和系统的文件给删了 4.将CanFestival文件添加进工程 添加好之后,编译出现错误,config文件中包含了很多iar相关头文件 将这些头文件删除 重新编译,依然存在错误,提
[单片机]
CanFestival<font color='red'>移植</font>到STM32F103
FreeRTOS的简介&移植FreeRTOS到STM32平台
I.说明 作者:WXP(翱翔云端的鸟) 联系方式:328452854@qq.com || 13100610853(联系请注明CSDN) 申明:个人原创,转载请先经过本人同意! 要说的话:个人水平有限,不足之处,还请指正!有疑问欢迎大家联系我交流探讨! ============================================================================================================================= ========================================================
[单片机]
FreeRTOS的简介&<font color='red'>移植</font>FreeRTOS到STM32平台
RyanMqtt移植指南
测试环境:stm32F401RCT6、RT-Thread版本: v4.1.0、RT-Thread Studio版本: 2.2.6、网络硬件使用ec800m移植at_socket使用sal框架。 1、移植介绍 RyanMqtt 库希望应用程序为以下接口提供实现: system 接口 RyanMqtt 需要 RTOS 支持,必须实现如下接口才可以保证 mqtt 客户端的正常运行 network 接口 RyanMqtt 依赖于底层传输接口 API,必须实现该接口 API 才能在网络上发送和接收数据包 MQTT 协议要求基础传输层能够提供有序的、可靠的、双向传输(从客户端到服务端 和从服务端到客户端)的字节流 time 接口
[单片机]
RyanMqtt<font color='red'>移植</font>指南
网络通信之UIP在STM32上的移植
1、什么是UIP协议栈: UIP是一种适用于小型嵌入式通信的TCP/IP协议栈,由瑞典计算机科学院的人开发编写的,它去掉了完整的TCP/IP中不常用的功能,简化了通讯过程,但其保留了网络通信中必须使用的协议,把设计重点放在IP、TCP和ARP协议的实现上。简单易用、占用资源少是它的设计特点。 2、协议栈接口 UIP协议栈通过一系列接口函数与底层函数和上层应用程序通信,在两者之中,UIP接口函数处于中间。 其中UIP提供两个个接口函数给底层系统。分别是 (1)uip_input() 当网卡驱动收到一个输入包时,将放入全局缓冲区uip_buf中,包的大小由全局变量uip_len约束。同时将调用 uip_input() 函数,这个函
[单片机]
网络通信之UIP在STM32上的<font color='red'>移植</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved