二.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条数据线有两条短路。
以上供大家参考,希望对后来者有用!!!!