在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

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

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

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

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

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

            可以看出連接了16條數(shù)據(jù)線,1條地址線,而這唯一的一條地址線用于判斷數(shù)據(jù)線傳輸?shù)氖堑刂愤€是數(shù)據(jù),所以這16條數(shù)據(jù)線為數(shù)據(jù)和地址復(fù)用

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

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

            現(xiàn)在看看DM9000和S3C2440的時(shí)序信號(hào)

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

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

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

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

            在S3C2440中,一個(gè)寫(xiě)命令使能結(jié)束到下一個(gè)寫(xiě)命令使能開(kāi)始的時(shí)間間隔為T(mén)och + 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)

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

            DM9000的讀時(shí)序如下

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

            整理如下:

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

            其它時(shí)間間隔先設(shè)置和寫(xiě)操作一樣
            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

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

            現(xiàn)在看看友善的Linux下DM9000驅(qū)動(dòng)為適應(yīng)S3C2440做了什么修改

            #ifdefined(CONFIG_ARCH_S3C2410)
            #include
            #endif

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


            #ifdefined(CONFIG_ARCH_S3C2410)
            //先清除BWSCON上的DW4為0
            //然后設(shè)置帶寬為16位
            //啟用BANK4的WAIT狀態(tài)
            //啟用BANK4的SRAM的寫(xiě)高低字節(jié)使能
            *((volatileunsignedint*)S3C2410_BWSCON)=
            (oldval_bwscon&~(3<<16))|S3C2410_BWSCON_DW4_16|S3C2410_BWSCON_WS4|S3C2410_BWSCON_ST4;
            //設(shè)置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

            主要就是執(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) =
            (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ò)試驗(yàn),得出的MAC地址為ff:ff:ff:ff:ff:ff
            不知道會(huì)對(duì)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í)候的延遲

            響應(yīng)時(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)響應(yīng)時(shí)間有所改善~ 不過(guò)我沒(méi)有示波儀,所以不知道這樣的設(shè)置會(huì)不會(huì)對(duì)DM9000造成不良影響~

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

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



            關(guān)鍵詞: LinuxDM9000mini244

            評(píng)論


            技術(shù)專區(qū)

            關(guān)閉