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 <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;
時候的延遲

 

響應時間在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造成不良影響~

 

轉自:http://blog.chinaunix.net/u1/57901/showart_2023852.html  

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com