加急~~新手面前有个坎!!!关于wince6.0 下的dm9000a驱动

jw1975   2008-10-17 18:12 楼主
如题,新手面前有个不小的坎,希望能有老手帮忙指点,谢谢啦~~~~~

这两天一直在做6400上的dm9000a的驱动,是在以前的2440的源码基础上修改的

这个板子的DM9000的CS#接在mpu的Xm0nCs4上,INT#接在XEINT9即af19引脚上,我查了下技术手册ncs4对应的地址是0x3000_0000,所以我在头文件中定义了它的基地址:

#define BSP_BASE_REG_PA_DM9000A_IOBASE         0x30000000
#define BSP_BASE_REG_PA_DM9000A_MEMBASE        0x30000000

不知道这样对不对,这里使用的地址应该还是物理地址吧,还有那个MEMBASE该如何确定,是不是与IOBASE一致?

我又将IRQ设为9:
CONFIG_PARAMETER g_szDm9ConfigParams[] =
{
                   。
                      。
                      。
{ CID_IRQ_NUMBER, 9, NDIS_STRING_CONST("IrqNumber")},
                   。
                      。
                      。
};

再后来按照readme修改project.bib和project.reg。下面是我的改的reg:

[HKEY_LOCAL_MACHINE\Windows CE Tools]
  "Platform"="{a6e36254-01d9-408b-ac00-a0e76270fcd2}"
  
         [HKEY_LOCAL_MACHINE\Comm\DM9CE]
             "DisplayName"="DM9000 ISA Fast Ethernet Adapter"
             "Group"="NDIS"
             "ImagePath"="dm9isa.dll"

         [HKEY_LOCAL_MACHINE\Comm\DM9CE\Linkage]
             "Route"=multi_sz:"DM9CE1"

         [HKEY_LOCAL_MACHINE\Comm\DM9CE1]
             "DisplayName"="DM9000 ISA Fast Ethernet Adapter"
             "Group"="NDIS"
             "ImagePath"="dm9isa.dll"

         [HKEY_LOCAL_MACHINE\Comm\Tcpip\Linkage]
             "Bind"="dm9ce1"

         [HKEY_LOCAL_MACHINE\Comm\DM9CE1\Parms]
                         "BusNumber"=dword:0
                         "BusType"=dword:1
             "XmitBuffer"=dword:20
             "RecvBuffer"=dword:20
"IrqNumber"=dword:64
                         "SysIntr"=dword:19
"IoAddress"=dword:30000000

         [HKEY_LOCAL_MACHINE\Comm\DM9CE1\Parms\TcpIp]
             "EnableDHCP"=dword:1
             "UseZeroBroadcast"=dword:0
             "DefaultGateway"="192.168.1.1"
             "IpAddress"="192.168.1.119"
             "Subnetmask"="255.255.255.0"
             "DNS"="210.21.196.6"
             "WINS"=""
[HKEY_LOCAL_MACHINE\Comm\DM9CE1\Parms]
"MACAddress"="00-11-22-33-44-55"

接着就是编译,下载,但老是说它是unknown device

dm9000 init.
vals are C8E0C8E0
val1  = DeviceReadPort(DM9_VIDL); is
         8
val1 |= ((DeviceReadPort(DM9_VIDH)<<8)-0x100); is
        808
val2  = DeviceReadPort(DM9_PIDL); is
            A
val2 |= ((DeviceReadPort(DM9_PIDH)<<8)-0x100); is
          A0A
Unknown device
[dm9]: Chip signature is 808 A0A
[dm9]: IRQ= 0x64
MAC address:00-11-22-33-44-55
-OALIntrRequestSysIntr(irq = 100, sysIntr = 22)
Where am I???????????[UFNPDD] USB Serial Function Class Enabled
[USB] dii.dwIrq = 96

-OALIntrRequestSysIntr(irq = 96, sysIntr = 23)
Where am I???????????Current Client "Serial_Class"
[UFNPDD] USB Serial Function Class Enabled
[UFNPDD] OTG Cable Attached

里面有部分输出是我自己添加的,用来查看val。下面是是我修改的这部分代码:

  1. void        C_DM9000::EDeviceRegisterIoSpace(void)
  2. {       
  3.         RETAILMSG(1,(TEXT("\r\ndm9000 init.\r\n")));
  4.         NIC_DEVICE_OBJECT::EDeviceRegisterIoSpace();
  5.        
  6.         U16        val1,val2,t_v1;//t_v2;
  7.         #ifdef TEST
  8.                 RETAILMSG(1,(TEXT("vals are %0X%4X\r\n"), val1,val2));//0xc900  0xc900
  9.         #endif
  10.        
  11.         val1  = DeviceReadPort(DM9_VIDL);                //
  12.         #ifdef TEST
  13.                 RETAILMSG(1,(TEXT("val1  = DeviceReadPort(DM9_VIDL); is\n\t %0X\r\n"), val1));
  14.         #endif
  15.        
  16.         //t_v1 = DeviceReadPort(DM9_VIDH)<<8;
  17.         //RETAILMSG(1,(TEXT("t_v1 loop 8:%0X\r\n"), t_v1));
  18.         val1 |= ((DeviceReadPort(DM9_VIDH)<<8)-0x100);//
  19.         //val1 -=0x100;
  20.         #ifdef TEST
  21.                 RETAILMSG(1,(TEXT("val1 |= ((DeviceReadPort(DM9_VIDH)<<8)-0x100); is\n\t%0X\r\n"), val1));
  22.         #endif
  23.        
  24.         val2  = DeviceReadPort(DM9_PIDL);        //

  25.         #ifdef TEST
  26.                 RETAILMSG(1,(TEXT("val2  = DeviceReadPort(DM9_PIDL); is\n\t %4X\r\n"), val2));
  27.         #endif
  28.        
  29.         val2 |= ((DeviceReadPort(DM9_PIDH)<<8)-0x100);        //
  30.         //val2 -=0x100;
  31.         #ifdef TEST
  32.                 RETAILMSG(1,(TEXT("val2 |= ((DeviceReadPort(DM9_PIDH)<<8)-0x100); is\n\t %4X\r\n"), val2));
  33.         #endif
  34.         if( (val1 != DM9000_VID) ||        (val2 != DM9000_PID))
  35.         {
  36.                 RETAILMSG(1,(TEXT("Unknown device\r\n")));
  37.                 RETAILMSG(1,(TEXT("[dm9]: Chip signature is %0X%4X\r\n"), val1,val2));
  38.                 RETAILMSG(1,(TEXT("[dm9]: IRQ= 0x%02X\r\n"), m_szConfigures[CID_IRQ_NUMBER]));
  39.         }
  40. }



上面代码中减去0x100是因为我认为之前的版本(val2 |= DeviceReadPort(DM9_PIDH)<<8;)并没有达到将val中存储的8位数据自身复制组成U16类型的目的,就是说把0x08转换成0x808。

最终结果是,DNW 输出unknown device,系统中却又网络图标,但是接上网络,接头上的等不闪。

回复评论 (4)

因为才开始接触wince ,所以问题问的很菜,还请大侠们不要唾弃,帮帮小生

点赞  2008-10-17 18:16
在问一个,那个sysint是由什么决定的

再有,有哪位大侠能推荐一些wince驱动的书籍、资料这些,我想尽快的对wince系统 和驱动编写有个系统的认识。

如有电子书那最好不过了,可以的话请发到我的邮箱: zhouwenbin5@163.com

在下不胜感激。
点赞  2008-10-17 18:26
首先database=iobase+0x300;
至于eint9对应的sysint是多少,看下你的bsp oal层中intr.c之类的文件。
点赞  2008-10-19 09:38

5楼 cc1 

mem地址还要根据你的cmd使用哪个地址线决定偏移量
点赞  2008-11-10 15:28
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复