/* Description: when user used insmod to add module, system invoked init_module() to initilize and register. */ int __init init_module(void) { switch(mode) { case DM9KS_10MHD: case DM9KS_100MHD: case DM9KS_10MFD: case DM9KS_100MFD: media_mode = mode; break; default: media_mode = DM9KS_AUTO; } dmfe_dev = dmfe_probe(); if(IS_ERR(dmfe_dev)) return PTR_ERR(dmfe_dev); return 0; }
/* Description: when user used insmod to add module, system invoked init_module() to initilize and register. */ int __init dm9000c_init(void) { volatile unsigned long *bwscon; // 0x48000000 volatile unsigned long *bankcon4; // 0x48000014 unsigned long val; iobase = (int)ioremap(0x20000000, 1024); /* [email protected] */ irq = IRQ_EINT7; /* [email protected] */ /* 设置S3C2440的memory controller */ bwscon = ioremap(0x48000000, 4); bankcon4 = ioremap(0x48000014, 4); /* DW4[17:16]: 01-16bit * WS4[18] : 0-WAIT disable * ST4[19] : 0 = Not using UB/LB (The pins are dedicated nWBE[3:0]) */ val = *bwscon; val &= ~(0xf<<16); val |= (1<<16); *bwscon = val; /* * Tacs[14:13]: 发出片选信号之前,多长时间内要先发出地址信号 * DM9000C的片选信号和CMD信号可以同时发出, * 所以它设为0 * Tcos[12:11]: 发出片选信号之后,多长时间才能发出读信号nOE * DM9000C的T1>=0ns, * 所以它设为0 * Tacc[10:8] : 读写信号的脉冲长度, * DM9000C的T2>=10ns, * 所以它设为1, 表示2个hclk周期,hclk=100MHz,就是20ns * Tcoh[7:6] : 当读信号nOE变为高电平后,片选信号还要维持多长时间 * DM9000C进行写操作时, nWE变为高电平之后, 数据线上的数据还要维持最少3ns * DM9000C进行读操作时, nOE变为高电平之后, 数据线上的数据在6ns之内会消失 * 我们取一个宽松值: 让片选信号在nOE放为高电平后,再维持10ns, * 所以设为01 * Tcah[5:4] : 当片选信号变为高电平后, 地址信号还要维持多长时间 * DM9000C的片选信号和CMD信号可以同时出现,同时消失 * 所以设为0 * PMC[1:0] : 00-正常模式 * */ // *bankcon4 = (1<<8)|(1<<6); /* 对于DM9000C可以设Tacc为1, 对于DM9000E,Tacc要设大一点,比如最大值7 */ *bankcon4 = 0x1f7c; //*bankcon4 = (7<<8)|(1<<6); /* MINI2440使用DM9000E,Tacc要设大一点 */ iounmap(bwscon); iounmap(bankcon4); switch(mode) { case DM9KS_10MHD: case DM9KS_100MHD: case DM9KS_10MFD: case DM9KS_100MFD: media_mode = mode; break; default: media_mode = DM9KS_AUTO; } dmfe_dev = dmfe_probe(); if(IS_ERR(dmfe_dev)) return PTR_ERR(dmfe_dev); return 0; }