中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

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

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

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

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

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

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

        而片選信號使用的BANK4,則訪問0x2000 0000 – 0x27FF FFFF這個范圍的地址時會激活片選使能信號nGCS4

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

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

        DM9000的寫時序

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

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

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

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

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

        最后DM9000 1個周期只能處理1個數(shù)據(jù),所以PMC應(yīng)該為normal(1data)

        寫時序分析完了,現(xiàn)在來看看讀時序

        DM9000的讀時序如下

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

        整理如下:

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

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

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

        呢么BANKCON4的設(shè)置如下
        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,這個寄存器負責(zé)配置BANK的帶寬和等待狀態(tài)
        我們接的是nGCS4,呢么主要就看ST4,WS4和DW4這幾個字段
        DW4的描述為BANK4的帶寬,DM9000接了16條地址線,呢么帶寬就是16,這里選01
        WS4的描述為是否為BANK4使用等待狀態(tài),DM9000沒有接WAIT引腳,所以可以不管這個字段
        ST4的描述為是否為BANK4使用UB/LB(寫高/低字節(jié)使能),DM9000沒有接nWBE[3:0]這4個引腳,所以也不管這個字段

        現(xiàn)在看看友善的Linux下DM9000驅(qū)動為適應(yī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
        //然后設(shè)置帶寬為16位
        //啟用BANK4的WAIT狀態(tài)
        //啟用BANK4的SRAM的寫高低字節(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個功能
        修改BWSCON寄存器
        修改BANKCON4寄存器
        修改MAC信息

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

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

        呢么我們就可以將時鐘數(shù)/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:90n");
        改為
        #if defined(CONFIG_ARCH_NO2410)
        printk("Now use the default MAC address: 08:90:90:90:90:90n");

        這樣就會通過讀取DM9000來得到MAC地址,我經(jīng)過試驗,得出的MAC地址為ff:ff:ff:ff:ff:ff
        不知道會對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;
        時候的延遲

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

        可見響應(yīng)時間有所改善~ 不過我沒有示波儀,所以不知道這樣的設(shè)置會不會對DM9000造成不良影響~

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

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



        關(guān)鍵詞: LinuxDM9000mini244

        評論


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

        關(guān)閉