3477|5

74

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

eboot 中DM9000的初始化,链接 [复制链接]

EBOOT中在初始化DM9000之前读取其ID一直返回错误,下面是程序:

  1. uint8 ReadReg(uint8 offset)
  2. {
  3.         *((volatile uint8 *)(IOBase)) = (uint8)(offset);
  4.         return ((uint8)*((volatile uint8 *)(DataBase)));
  5. }

  6. static BOOL Probe(void)
  7. {
  8.         BOOL r = FALSE;
  9.         DWORD id_val;
  10.        
  11.         id_val = READ_REG1(0x28);
  12.         id_val |= READ_REG1(0x29) << 8;
  13.         id_val |= READ_REG1(0x2a) << 16;
  14.         id_val |= READ_REG1(0x2b) << 24;

  15.         EdbgOutputDebugString ( "id_val = %x\r\n", id_val);
  16.         if (id_val == DM9000_ID) {
  17.                 RETAILMSG(1, (TEXT("INFO: Probe: DM9000 is detected.\r\n")));
  18.                 DM9000_rev = READ_REG1(0x2c);
  19.                
  20.                 r = TRUE;
  21.         }
  22.         else {
  23.                 RETAILMSG(1, (TEXT("ERROR: Probe: Can not find DM9000.\r\n")));
  24.         }
  25.         //这里id应该是0x90000A46
  26.         return r;
  27. }

复制代码


出错信息如下:

id_val = E0B0E0E0
ERROR: Probe: Can not find DM9000.
DM9000: MAC Address: 0:0:0:0:0:0
ERROR: InitEthDevice: Failed to initialize Ethernet controller.
ERROR: OEMPlatformInit: Failed to initialize Ethernet controller.


刚开始弄这个,有点摸不着头脑。
想问一下这个读取DM9000的错误是怎么回事?怎么修改?
还有和DM9000相关的控制寄存器是那些?在那里看呢?
我的平台是wince5.0+S3C2440.


最新回复

恩,你说的对。 惭愧,看代码不仔细,我以前一直以为pfnEDbgInit是DM9000DBG_Init返回值的类型, 刚看了一下,发现它原来是个函数指针,明白了!谢谢你了!  详情 回复 发表于 2008-12-17 16:03
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
1,看看CS、时序等的配置正确不正确,我强烈怀疑这点;
2,如果上面都是正确的话,看看寄存器的地址有没有写错、定义错
3,看看虚拟地址:IOBASE/DATABASE是不是正确映射了


我想问题大概只有上面三条吧,再检查检查吧
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
学习一下,DM9000还没有玩过呢!!!标识一下
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 1 楼 Seven_zhangxw 的回复:
1,看看CS、时序等的配置正确不正确,我强烈怀疑这点;
2,如果上面都是正确的话,看看寄存器的地址有没有写错、定义错
3,看看虚拟地址:IOBASE/DATABASE是不是正确映射了


我想问题大概只有上面三条吧,再检查检查吧


恩,确实是地址映射有问题,cs是接在bank4,的bank4的基址影视被我改过,
改回来就可以连接上了!谢谢了!

但是还有些不明白:

pfnEDbgInit      = DM9000DBG_Init;
pfnEDbgGetFrame  = DM9000DBG_GetFrame;
pfnEDbgSendFrame = DM9000DBG_SendFrame;

这里DM9000DBG_Init等参数是怎么传递的?

DM9000DBG_Init定义如下:


  1. BOOL DM9000DBG_Init(BYTE *iobase, ULONG membase, USHORT MacAddr[3])
  2. {
  3.         BOOL r = FALSE;

  4.         bIsPacket         = FALSE;
  5.         dwEthernetIOBase  = (DWORD)iobase;
  6.         dwEthernetDataPort = dwEthernetIOBase + 4;
  7.         dwEthernetMemBase = membase;
  8.    
  9.        r = Probe();        //Detect DM9000
  10.        .
  11.        .
  12.        .
  13. }
复制代码
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

5
 
pfnEDbgInit      = DM9000DBG_Init;
pfnEDbgGetFrame  = DM9000DBG_GetFrame;
pfnEDbgSendFrame = DM9000DBG_SendFrame

因为没有源代码,所以我不好说。你看看能否搜到pfnEDbgInit、pfnEDbgGetFrame的调用的地方,如果搜索到了,你就可以看到参数传递的方式了;如果搜索不到,那说明肯定是NDIS调用的,你可以看MS的文档,上面会有很详细的描述的。
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 4 楼 Seven_zhangxw 的回复:
pfnEDbgInit      = DM9000DBG_Init;
pfnEDbgGetFrame  = DM9000DBG_GetFrame;
pfnEDbgSendFrame = DM9000DBG_SendFrame

因为没有源代码,所以我不好说。你看看能否搜到pfnEDbgInit、pfnEDbgGetFrame的调用的地方,如果搜索到了,你就可以看到参数传递的方式了;如果搜索不到,那说明肯定是NDIS调用的,你可以看MS的文档,上面会有很详细的描述的。


恩,你说的对。
惭愧,看代码不仔细,我以前一直以为pfnEDbgInit是DM9000DBG_Init返回值的类型,
刚看了一下,发现它原来是个函数指针,明白了!谢谢你了!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表