有关DM9000驱动问题

  
1. #define CONFIG_DM9000_BASE            0x20000000
这个地址到底是怎么定义,按我的理解因为是nGCS4控制,因该是0x20000000,但网上很多人说是0x20000300,这个0x300是如何来的,至今没一个人能够清楚的说明

如果你看过DM9000的datasheet( http://pdfdata.datasheetsite.com/web/29472/DM9000.pdf)就会知道,是0x20000000还是0x20000300或者别的什么, 取决于DM9000的PIN#92 CMD的连接。
92 CMD I Command Type
When high, the access of this command cycle is DATA port
When low, the access of this command cycle is ADDRESS port

也就是说,可以认为DM9000只有两个地址,一个用来写address,一个用来写data, 两个地址的区别只有一个bit(CMD PIN连接的那个地址PIN)。
在Mini2440上,DM9000的片选接的是CS4,CMDpin接的是ADDR2,所以address地址是0x20000000 (ADDR2 = 0), data地址是0x20000004 (ADDR2 = 1)。
至于网络上流传的0x20000300, 应该是某块开发板上,DM9000的CMD PIN接到了ADDR9或者ADDR8上。
很有趣的一点是,DM9000只受这一根地址PIN的影响,因此0x20000304和0x20000004对它来说是没有区别的。



有关DM9000驱动问题_第1张图片
 

二.DM9000的驱动问题

考虑Eboot的架构,MS默认使用cs8900作为网络芯片,其源代码存放在C:\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\ETHDBG\CS8900\目录下,通过友善之臂的电路原理图,发现DM9000接在片选信号nGCS4(nLAN_CS)上的。这样我们需要在C:\WINCE500\PLATFORM\SMDK2440A\Src\Inc\s2440.h中修改网络芯片的映射地址。

#define CS8900DBG_IOBASE               (0xa9000300)

#define CS8900DBG_MEMBASE                  (0xa8000000)

这两个地址只能有一个起作用,通过dm9000dbg.c中的宏定义区分:

#define DM9000_MEM_MODE

如果宏得到定义,则选择CS8900DBG_MEMBASE方式对网络芯片进行初始化,或者则采用CS8900DBG_IOBASE的方式。

(0xa8000000)的值是从oemaddrtab_cfg.inc文件中得到的。

g_oalAddressTable

        DCD     0x80000000, 0x30000000, 64      ; 32 MB DRAM BANK 6

        DCD     0x84000000, 0x10000000, 32      ; nGCS2: PCMCIA/PCCARD

        DCD     0x86000000, 0x18000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 3

        DCD     0x88000000, 0x20000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 4

        DCD     0x8A000000, 0x28000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 5

这里是0x88000000,这是因为地址空间0x8000,0000~0x9fff,ffff和0xa000,0000~0xbfff,ffff映射的物理地址完全相同,它们之间的唯一区别是后者不带缓存。由于要操作的是DM9000芯片控制器,如果带缓存,容易引起内存数据得不到及时刷新导致系统异常。

在OEMPlatformInit中存在这样的语句:

BOOL InitEthDevice(PBOOT_CFG  pBootCfg)

{                           

         pfnEDbgInit = DM9000DBG_Init;

ipfnEDbgInit(CS8900DBG_IOBASE,  CS8900DBG_MEMBASE, wMAC)

}

通过这样的方式将映射地址作为参数传送给DM9000DBG_Init()。修改dm9000dbg.c中的网络芯片ID。

#define DM9000_ID  0x90000A46

dm9000.dbg.c需要修改的地方很多,不再给出源代码,存放在C:\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\ETHDBG\CS8900\目录下,修改sources文件SOURCES=dm9000dbg.c,然后build –c即可。

下载eboot到nor flash运行就可以了,网卡初始化成功了。然后使用ping命令对网络进行测试,发现以致出现Request time out信息。

于是使用局域网查看工具(Lansee),进行主机巡测,发现10.0.1.200(开发板的IP地址)所对应的MAC地址为0,0,0,0,0,0。很显然mac地址没有设置成功。

在dm9000.c中设置mac的函数为dm9000_hash_table,其实就是操作0x10~0x15这六个寄存器。

 然后打开Platform Builder 连接上网之后,就可以下载了。

注意不要妄图通过ping 命令来检测网线是否连通,因为Eboot仅仅支持IP, UDP协议,不支持ARP协议。

 

 

 

 

 

 

我过去在盟石科技调试网口的经验,供大家参考,当然,大家说过的我就不说了。什么IOBase,IP地址我就不说了,我说点别的。
1. DM9000 not found!
   有可能芯片没焊好;还有一种可能,买的芯片是坏的,我们经常遇到,通常换一个芯片就好了。
2. 下载过程中出现Link down,下载过程中中断
    一般原因都是芯片坏的,直接换芯片
3. 上面两项都没问题,串口能出:Sent bootME to 255.255.255.255,但VS2005始终连不上,Sniffer嗅探探测不到发给PC机网卡的数据包,但网口显示已连接。
    可能1:PC机上有无线网卡+有线网卡,产生冲突
    可能2:CE设备和PC机IP不在一个网段
    可能3:我们遇到过的一种情况:CPU与物理层芯片的16条数据线有两条短路。
以上供大家参考,希望对后来者有用!!!!



你可能感兴趣的:(网络,command,cmd,Access,Build,WinCE)