linux2.6.32移植DM9000驅動程式

來源:互聯網
上載者:User

 轉載自:http://blog.csdn.net/dos5gw/article/details/5824461

http://caiming1987612.blog.163.com/blog/static/118556676200961752714307/

http://blog.chinaunix.net/u1/34474/showart_401078.html

http://hi.baidu.com/%D3%F3%C4%E0%C4%EA%B8%E2/blog/item/6256fea7bfceac98d0435819.html

時序圖和引腳串連 :http://blog.chinaunix.net/u1/57901/showart_2023852.html

(一)開啟arch/arm/mach-s3c2440/mach-test2440.c

添加代碼如下:

#define MACH_TEST2440_DM9K_BASE (S3C2410_CS4 + 0x300)

/*S3C2410_CS4被定義為0x20000000(BANK4基地址),

DM9000在板子的bank4上, 0x20000300

如果在板子的bank1上, 則是0x80000300 */

static struct resource test2440_dm9k_resource[] = {
        [0] = {
                .start = MACH_TEST2440_DM9K_BASE,      //0x20000300, 發送
                .end   = MACH_TEST2440_DM9K_BASE + 3,
                .flags = IORESOURCE_MEM
        },
        [1] = {
                .start = MACH_TEST2440_DM9K_BASE + 4, //0x20000304, 傳輸
                .end   = MACH_TEST2440_DM9K_BASE + 7,
                .flags = IORESOURCE_MEM
        },
        [2] = {
                .start = IRQ_EINT7, /* 中斷號,串連S3C2440的EINT7引腳 */
                .end   = IRQ_EINT7,
                .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE, /*上升沿觸發*/
        }
};

static struct dm9000_plat_data test2440_dm9k_pdata = {
        .flags          = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),
}; //DM9000與開發板相關的資料,指定訪問DM9000時,資料位元寬為16

static struct platform_device test2440_device_eth = {/*註冊平台裝置*/

        .name           = "dm9000",
        .id             = -1,
        .num_resources  = ARRAY_SIZE(test2440_dm9k_resource),
        .resource       = test2440_dm9k_resource,
        .dev            = {
                .platform_data  = &test2440_dm9k_pdata,
        },
};

(二)最後把平台裝置test2440_device_eth 註冊進去:

static struct platform_device *test2440_devices[] __initdata = {
        &s3c_device_usb,
        &s3c_device_lcd,
        &s3c_device_wdt,
        &s3c_device_i2c0,
        &s3c_device_iis,
        &s3c_device_nand,
        //&s3c24xx_uda134x,
        //&s3c_device_sdi,
        //&s3c_device_usbgadget,
        &test2440_device_eth, //這裡添加dm9000網卡裝置
};

(三)修改drivers/net/dm9000.c

1. 開頭增加:

    #if defined(CONFIG_ARCH_S3C2410)
    #include
    #endif

2. 在函數static int __devinit dm9000_probe(struct platform_device *pdev)中,增加了

/* try reading the node address from the attached EEPROM */
       for (i = 0; i < 6; i += 2)
               dm9000_read_eeprom(db, i / 2, ndev->dev_addr+i);

       if (!is_valid_ether_addr(ndev->dev_addr) && pdata != NULL) {
               mac_src = "platform data";
               memcpy(ndev->dev_addr, pdata->dev_addr, 6);
       }

       if (!is_valid_ether_addr(ndev->dev_addr)) {
               /* try reading from mac */

               mac_src = "chip";
               for (i = 0; i < 6; i++)
                       ndev->dev_addr[i] = ior(db, i+DM9000_PAR);
       }

memcpy(ndev->dev_addr, "/x08/x90/x90/x90/x90/x90", 6); //新添加

3. 在函數static int __init dm9000_init(void)中,增加了

     #if defined(CONFIG_ARCH_S3C2410)
      unsigned int oldval_bwscon = *(volatile unsigned int *)S3C2410_BWSCON;
      unsigned int oldval_bankcon4 = *(volatile unsigned int *)S3C2410_BANKCON4;
     *((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;
     #endif

經過驗證,增加的第三部分代碼(當然,包括標頭檔mach/regs-mem.h)影響了網路的效能。那麼,我們來看看這部分代碼的作用是什麼。

    首先,由開發板的原理圖可以看到,dm9000網卡的AEN引腳與S3C2440的nGCS4串連(Bank4)。

回到代碼。

#if defined(CONFIG_ARCH_S3C2410)
    unsigned int oldval_bwscon = *(volatile unsigned int *)S3C2410_BWSCON;
    unsigned int oldval_bankcon4 = *(volatile unsigned int *)S3C2410_BANKCON4;
    *((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;
#endif

位寬&等待狀態寄存器BWSCON(BUS WIDTH&WAIT STATUS CONTROL REGISTER),每四位控制一個memory bank,根據S3C2440手冊,涉及dm9000的4個引腳是16~19。預設值是0x000000。

1. ST4[19]:SRAM是否使用UB/LB(upper byte/lower byte)。0:不使用UB/LB;1:使用UB/LB。

2. WS4[18]:WAIT狀態。0:禁止WAIT;1:使能WAIT。

3. DW4[16:17]:資料匯流排寬度。00:8位;01:16位;10:32位;11:保留。

     接著,BANK4控制寄存器BANKCON4(BANK CONTROL REGISTER),用於控制BANK4外接裝置的訪問時序。預設值是0x0700。

1. Tacs[14:13]:地址建立時間。00:0刻度;01:1刻度;10:2刻度;11:4刻度。

2. Tcos[12:11]:片選建立時間。00:0刻度;01:1刻度;10:2刻度;11:4刻度。

3. Tacc[10:8]:地址周期。000:1刻度;001:2刻度;... 111:14刻度。

4. Tcoh[7:6]:片選保持時間。00:0刻度;01:1刻度;10:2刻度;11:4刻度。

5. Tcah[5:4]:地址保持時間。00:0刻度;01:1刻度;10:2刻度;11:4刻度。

6. Tcap[3:2]:頁模式存取周期。00:2刻度;01:3刻度;10:4刻度;11:6刻度。

7. PMC[1:0]:頁模式配置。00:1 data;01:4 data;10:8 data;11:16 data。

     最後,在arch/arm/mach-s3c2410/include/mach/regs-mem.h中,
#define S3C2410_BWSCON_DW4_16   (1<<16)
#define S3C2410_BWSCON_WS4   (1<<18)
#define S3C2410_BWSCON_ST4   (1<<19)

理解了寄存器BWSCON和BANKCON4的含義之後,上述代碼的作用就很明顯了。

*((volatile unsigned int *)S3C2410_BWSCON) =
    (oldval_bwscon & ~(3<<16)) | S3C2410_BWSCON_DW4_16 | S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4;// 資料匯流排寬度16bits,使用UB/LB,使能WAIT

*((volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c; //修改了訪問dm9000的時序

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.