嵌入式Linux之我行——深入理解DM9000在mini2440上的驅(qū)動(dòng)
DM9000
SD0
SD15
CMD
INT
IOR#
IOW#
AEN
可以看出連接了16條數(shù)據(jù)線,1條地址線,而這唯一的一條地址線用于判斷數(shù)據(jù)線傳輸?shù)氖堑刂愤€是數(shù)據(jù),所以這16條數(shù)據(jù)線為數(shù)據(jù)和地址復(fù)用
而片選信號(hào)使用的BANK4,則訪問0x2000 0000 – 0x27FF FFFF這個(gè)范圍的地址時(shí)會(huì)激活片選使能信號(hào)nGCS4
而在MINI2440提供的內(nèi)核中,DM9000的地址IO地址為0x2000 0000,數(shù)據(jù)IO為0x2000 0004
則向地址IO寫數(shù)據(jù)的時(shí)候不會(huì)激活A(yù)DDR2,所以向DM9000傳送的數(shù)據(jù)為地址,而向數(shù)據(jù)IO寫數(shù)據(jù)的時(shí)候會(huì)激活A(yù)DDR2,所以向DM9000傳送的數(shù)據(jù)為數(shù)據(jù)
現(xiàn)在看看DM9000和S3C2440的時(shí)序信號(hào)
DM9000的寫時(shí)序
呢么整理如下:
然后是S3C2440的寫時(shí)序,由于DM9000是連接在BANK4上的,而BANK的寫時(shí)序如下
這里的值以時(shí)鐘為周期,而BANKCON是接在Memory Controller上的(參考S3C2440A數(shù)據(jù)手冊的表1-4),而Memory Controller使用的是Hclk總線時(shí)鐘信號(hào)(參考S3C2440A數(shù)據(jù)手冊的圖7-1,感謝kasim大大指點(diǎn)),根據(jù)S3C2440手冊,Hclk是由Fclk分頻來的,具體的分頻比每個(gè)板子的設(shè)置不一樣,所以這里頻率的設(shè)定要自己根據(jù)板子的設(shè)置來分析,假設(shè)主頻為400MHz,然后Fclk,Hclk,Pclk的分頻比為1:2:4,呢么Hclk就是200MHz,呢么每個(gè)時(shí)鐘周期就是5ns
開始和DM9000的時(shí)序圖進(jìn)行對比,計(jì)算
Tcos對應(yīng)T1,呢么最少應(yīng)該為5ns,也就是1個(gè)clock
Tacc對應(yīng)T2,呢么最少應(yīng)該為22ns,呢么我們這里最少也要選6個(gè)clock,也就是30ns
Toch對應(yīng)T5,在這里無設(shè)置,不過根據(jù)字面意思,我認(rèn)為Tcoh就是Toch,Toch最少應(yīng)該為5ns,也就是1個(gè)clock
Tcah對應(yīng)T4,由于之前已經(jīng)有Toch了,呢么這里可以設(shè)置為0ns,也就是0個(gè)clock
在S3C2440中,一個(gè)寫命令使能結(jié)束到下一個(gè)寫命令使能開始的時(shí)間間隔為Toch + Tcah + Tacp + Tacs + Tcos
Tacs是地址信號(hào)之后片選信號(hào)的起始間隔,我們這里先設(shè)為0ns,也就是0個(gè)clock
Toch + Tcah + Tacp + Tacs + Tcos應(yīng)該 > 84
5 + 0 + Tacp + 0 + 5 > 84
Tacp > 74
但是Tacp的最大值為6個(gè)clock,也就是30ns,還少了44ns,大概9個(gè)clock
只要修改Toch Tcah Tacs和Tcos了,雖然我們給的都是最小值,但是為了信號(hào)穩(wěn)定,可以放寬其范圍,
將Tcos和Toch設(shè)置為4個(gè)clock
將Tacs和Tcah設(shè)置為2個(gè)Clock
這樣總時(shí)間為 (4 + 2 + 6 + 2 +4)*5 = 90ns
最后DM9000 1個(gè)周期只能處理1個(gè)數(shù)據(jù),所以PMC應(yīng)該為normal(1data)
寫時(shí)序分析完了,現(xiàn)在來看看讀時(shí)序
DM9000的讀時(shí)序如下
然后是S3C2440的讀時(shí)序,時(shí)序如下
Tcos對應(yīng)T1,呢么最少應(yīng)該為5ns,也就是1個(gè)clock,這里設(shè)置為和寫操作一樣的4個(gè)clock
Tacc對應(yīng)T2,呢么最少應(yīng)該為22ns,這里設(shè)置為和寫操作一樣的6個(gè)clock
Toch對應(yīng)T5,呢么最少應(yīng)該為5ns,也就是1個(gè)clock,這里設(shè)置為和寫操作一樣的4個(gè)clock
其它時(shí)間間隔先設(shè)置和寫操作一樣
Tcah為2個(gè)clock
Tacp為6個(gè)clock
Tacs為2個(gè)clock
PMC為normal(1data)
然后看看滿足讀命令使能結(jié)束后到下一個(gè)讀命令使能的時(shí)間間隔80ns不
還是Toch + Tcah + Tacp + Tacs + Tcos
(4 + 1 + 6 + 1 + 4) * 5 = 15 * 5 = 90ns,能符合條件
呢么BANKCON4的設(shè)置如下
Tacs = 2個(gè)clock = 10
Tcos = 4個(gè)clock = 11
Tacc = 6個(gè)clock = 100
Tcoh = 4個(gè)clock = 11
Tcah = 2個(gè)clock = 10
Tacp = 6個(gè)clock = 11
PMC = normal(1data) = 00
也就是0x5CEC
再來看BWSCON,這個(gè)寄存器負(fù)責(zé)配置BANK的帶寬和等待狀態(tài)
我們接的是nGCS4,呢么主要就看ST4,WS4和DW4這幾個(gè)字段
DW4的描述為BANK4的帶寬,DM9000接了16條地址線,呢么帶寬就是16,這里選01
WS4的描述為是否為BANK4使用等待狀態(tài),DM9000沒有接WAIT引腳,所以可以不管這個(gè)字段
ST4的描述為是否為BANK4使用UB/LB(寫高/低字節(jié)使能),DM9000沒有接nWBE[3:0]這4個(gè)引腳,所以也不管這個(gè)字段
現(xiàn)在看看友善的Linux下DM9000驅(qū)動(dòng)為適應(yīng)S3C2440做了什么修改
#if
|
主要就是執(zhí)行3個(gè)功能
修改BWSCON寄存器
修改BANKCON4寄存器
修改MAC信息
以前看別人移植UBoot給MINI2440,Fclk,Hclk,Pclk的分頻比1:4:8
呢么MINI2440上的Hclk就是100MHz,也就是1個(gè)時(shí)鐘10ns,剛好比上面分析的大2倍,
呢么我們就可以將時(shí)鐘數(shù)/2
Tacs = 1個(gè)clock = 01
Tcos = 2個(gè)clock = 10
Tacc = 3個(gè)clock = 010
Tcoh = 2個(gè)clock = 10
Tcah = 1個(gè)clock = 01
Tacp = 3個(gè)clock = 01
PMC = normal(1data) = 00
也就是0x3294
這里要注意的是使用WAIT信號(hào)的時(shí)候Tacc要大于等于4個(gè)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)
這樣就會(huì)通過讀取DM9000來得到MAC地址,我經(jīng)過試驗(yàn),得出的MAC地址為ff:ff:ff:ff:ff:ff
不知道會(huì)對TCP/IP協(xié)議棧有什么影響
這是使用
*((volatile unsigned int *)S3C2410_BWSCON) =
*((volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c;
時(shí)候的延遲
響應(yīng)時(shí)間在0.747左右
這是使用
*((volatile unsigned int *)S3C2410_BWSCON) =
*((volatile unsigned int *)S3C2410_BANKCON4) = 0x3294;
時(shí)候的延遲
可見響應(yīng)時(shí)間有所改善~
所以大家的DM9000掛掉的話不要來找我哈~ 哈哈哈(逃~
由于對時(shí)序分析也是初次嘗試~ 所以有寫得不對的地方請大家一定要指出,萬分感謝 = 3=)/
評論