<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 嵌入式Linux之我行——深入理解DM9000在mini2440上的驅動(dòng)

嵌入式Linux之我行——深入理解DM9000在mini2440上的驅動(dòng)

作者: 時(shí)間:2016-11-20 來(lái)源:網(wǎng)絡(luò ) 收藏
首先看一下DM9000的引腳和MINI2440的引腳連接

DM9000MINI2440功能描述
SD0DATA0數據信號
| |
SD15DATA15數據信號
CMDADDR2識別為地址還是數據
INTEINT7中斷
IOR#nOE讀命令使能
IOW#nWE寫(xiě)命令使能
AENnGCS4片選使能

本文引用地址:http://dyxdggzs.com/article/201611/319006.htm

可以看出連接了16條數據線(xiàn),1條地址線(xiàn),而這唯一的一條地址線(xiàn)用于判斷數據線(xiàn)傳輸的是地址還是數據,所以這16條數據線(xiàn)為數據和地址復用

而片選信號使用的BANK4,則訪(fǎng)問(wèn)0x2000 0000 – 0x27FF FFFF這個(gè)范圍的地址時(shí)會(huì )激活片選使能信號nGCS4

而在MINI2440提供的內核中,DM9000的地址IO地址為0x2000 0000,數據IO為0x2000 0004
則向地址IO寫(xiě)數據的時(shí)候不會(huì )激活ADDR2,所以向DM9000傳送的數據為地址,而向數據IO寫(xiě)數據的時(shí)候會(huì )激活ADDR2,所以向DM9000傳送的數據為數據

現在看看DM9000和S3C2440的時(shí)序信號

DM9000的寫(xiě)時(shí)序

IO16,IO32這兩個(gè)引腳在MINI2440并沒(méi)有連接,所以不看這兩個(gè)引腳的時(shí)序
呢么整理如下:
還有就是寫(xiě)命令使能結束后到下一個(gè)寫(xiě)命令使能需要最少84ns的間隔時(shí)間,為T(mén)6
然后是S3C2440的寫(xiě)時(shí)序,由于DM9000是連接在BANK4上的,而B(niǎo)ANK的寫(xiě)時(shí)序如下
由于DM9000在MINI2440上只需要片選使能,寫(xiě)命令使能和數據信號,所以我們不看ADDR和nBE信號,呢么整理如下
呢么這些值為多少呢?~
來(lái)看看BANKCON4

這里的值以時(shí)鐘為周期,而B(niǎo)ANKCON是接在Memory Controller上的(參考S3C2440A數據手冊的表1-4),而Memory Controller使用的是Hclk總線(xiàn)時(shí)鐘信號(參考S3C2440A數據手冊的圖7-1,感謝kasim大大指點(diǎn)),根據S3C2440手冊,Hclk是由Fclk分頻來(lái)的,具體的分頻比每個(gè)板子的設置不一樣,所以這里頻率的設定要自己根據板子的設置來(lái)分析,假設主頻為400MHz,然后Fclk,Hclk,Pclk的分頻比為1:2:4,呢么Hclk就是200MHz,呢么每個(gè)時(shí)鐘周期就是5ns

開(kāi)始和DM9000的時(shí)序圖進(jìn)行對比,計算
Tcos對應T1,呢么最少應該為5ns,也就是1個(gè)clock
Tacc對應T2,呢么最少應該為22ns,呢么我們這里最少也要選6個(gè)clock,也就是30ns
Toch對應T5,在這里無(wú)設置,不過(guò)根據字面意思,我認為T(mén)coh就是Toch,Toch最少應該為5ns,也就是1個(gè)clock
Tcah對應T4,由于之前已經(jīng)有Toch了,呢么這里可以設置為0ns,也就是0個(gè)clock

在S3C2440中,一個(gè)寫(xiě)命令使能結束到下一個(gè)寫(xiě)命令使能開(kāi)始的時(shí)間間隔為T(mén)och + Tcah + Tacp + Tacs + Tcos
Tacs是地址信號之后片選信號的起始間隔,我們這里先設為0ns,也就是0個(gè)clock

Toch + Tcah + Tacp + Tacs + Tcos應該 > 84
5 + 0 + Tacp + 0 + 5 > 84
Tacp > 74
但是Tacp的最大值為6個(gè)clock,也就是30ns,還少了44ns,大概9個(gè)clock
只要修改Toch Tcah Tacs和Tcos了,雖然我們給的都是最小值,但是為了信號穩定,可以放寬其范圍,
將Tcos和Toch設置為4個(gè)clock
將Tacs和Tcah設置為2個(gè)Clock
這樣總時(shí)間為 (4 + 2 + 6 + 2 +4)*5 = 90ns

最后DM9000 1個(gè)周期只能處理1個(gè)數據,所以PMC應該為normal(1data)

寫(xiě)時(shí)序分析完了,現在來(lái)看看讀時(shí)序

DM9000的讀時(shí)序如下

呢么整理如下:
讀命令使能結束后到下一個(gè)讀命令使能需要最少80ns的間隔時(shí)間,為T(mén)6
然后是S3C2440的讀時(shí)序,時(shí)序如下

整理如下:

Tcos對應T1,呢么最少應該為5ns,也就是1個(gè)clock,這里設置為和寫(xiě)操作一樣的4個(gè)clock
Tacc對應T2,呢么最少應該為22ns,這里設置為和寫(xiě)操作一樣的6個(gè)clock
Toch對應T5,呢么最少應該為5ns,也就是1個(gè)clock,這里設置為和寫(xiě)操作一樣的4個(gè)clock

其它時(shí)間間隔先設置和寫(xiě)操作一樣
Tcah為2個(gè)clock
Tacp為6個(gè)clock
Tacs為2個(gè)clock
PMC為normal(1data)
然后看看滿(mǎn)足讀命令使能結束后到下一個(gè)讀命令使能的時(shí)間間隔80ns不

還是Toch + Tcah + Tacp + Tacs + Tcos
(4 + 1 + 6 + 1 + 4) * 5 = 15 * 5 = 90ns,能符合條件

呢么BANKCON4的設置如下
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

再來(lái)看BWSCON,這個(gè)寄存器負責配置BANK的帶寬和等待狀態(tài)
我們接的是nGCS4,呢么主要就看ST4,WS4和DW4這幾個(gè)字段
DW4的描述為BANK4的帶寬,DM9000接了16條地址線(xiàn),呢么帶寬就是16,這里選01
WS4的描述為是否為BANK4使用等待狀態(tài),DM9000沒(méi)有接WAIT引腳,所以可以不管這個(gè)字段
ST4的描述為是否為BANK4使用UB/LB(寫(xiě)高/低字節使能),DM9000沒(méi)有接nWBE[3:0]這4個(gè)引腳,所以也不管這個(gè)字段

現在看看友善的Linux下DM9000驅動(dòng)為適應S3C2440做了什么修改

#ifdefined(CONFIG_ARCH_S3C2410)
#include
#endif

#ifdefined(CONFIG_ARCH_S3C2410)
//取得帶寬及等待狀態(tài)控制寄存器的地址
unsignedintoldval_bwscon=*(volatileunsignedint*)S3C2410_BWSCON;
//取得4號BANK的控制寄存器的地址
unsignedintoldval_bankcon4=*(volatileunsignedint*)S3C2410_BANKCON4;
#endif


#ifdefined(CONFIG_ARCH_S3C2410)
//先清除BWSCON上的DW4為0
//然后設置帶寬為16位
//啟用BANK4的WAIT狀態(tài)
//啟用BANK4的SRAM的寫(xiě)高低字節使能
*((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:90n");
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個(gè)功能
修改BWSCON寄存器
修改BANKCON4寄存器
修改MAC信息

以前看別人移植UBoot給MINI2440,Fclk,Hclk,Pclk的分頻比1:4:8

呢么MINI2440上的Hclk就是100MHz,也就是1個(gè)時(shí)鐘10ns,剛好比上面分析的大2倍,

呢么我們就可以將時(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信號的時(shí)候Tacc要大于等于4個(gè)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:90n");
改為
#if defined(CONFIG_ARCH_NO2410)
printk("Now use the default MAC address: 08:90:90:90:90:90n");

這樣就會(huì )通過(guò)讀取DM9000來(lái)得到MAC地址,我經(jīng)過(guò)試驗,得出的MAC地址為ff:ff:ff:ff:ff:ff
不知道會(huì )對TCP/IP協(xié)議棧有什么影響

這是使用
*((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;
時(shí)候的延遲

響應時(shí)間在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;
時(shí)候的延遲

可見(jiàn)響應時(shí)間有所改善~ 不過(guò)我沒(méi)有示波儀,所以不知道這樣的設置會(huì )不會(huì )對DM9000造成不良影響~

所以大家的DM9000掛掉的話(huà)不要來(lái)找我哈~ 哈哈哈(逃~

由于對時(shí)序分析也是初次嘗試~ 所以有寫(xiě)得不對的地方請大家一定要指出,萬(wàn)分感謝 = 3=)/



關(guān)鍵詞: LinuxDM9000mini244

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>