关于DM9000 的讨论

发表于:2009-12-08 09:53:10
最近移植bsp发现wince5.0的DM9000A驱动有问题!现在在这个和大家讨论讨论!
首先dm9000大部分驱动是官方的,下面就是一些细节的研究、我首先讲讲我的平台情况。
1.SD0~SD15 -------- LDATA0~LDATA15 数据线和地址线复用
2.CMD -------- LADDR2 唯一的一根地址线用于判断是数据还是地址
3.nCS -------- nGCS3 片选BANK3

下面是注册表主要部分信息:
[HKEY_LOCAL_MACHINE/Comm/DM9CE1/Parms]
"BusNumber"=dword:0
"BusType"=dword:1
"XmitBuffer"=dword:20
"RecvBuffer"=dword:20
;"SysIntr"=dword:26
[color=Red]"IrqNumber"=dword:1A[/color]
[color=Red]"IoAddress"=dword:18000300[/color]
"UseSoftwareMac"=dword:1
"SoftwareMacAddress0"=dword:20
"SoftwareMacAddress1"=dword:04
"SoftwareMacAddress2"=dword:09
"SoftwareMacAddress3"=dword:18
"SoftwareMacAddress4"=dword:00
"SoftwareMacAddress5"=dword:07

红色部分为IO地址和中断号,但是我不知道系统这个怎么确认,现在又个问题是dm9000A的ID读出来了,但是我ping不通127.0.0.1,也无法上网?请教下大家!
 
 
回复次数: 34

 

  • rsgw40用户头像
  • rsgw40
  • (rsgw40)
  • 等 级:
#1楼 得分:0回复于:2009-12-08 13:14:35
能给个联系方式吗?rsgw40@sohu.com
 
#2楼 得分:0回复于:2009-12-08 13:19:57
已发邮件给您~
 
  • rsgw40用户头像
  • rsgw40
  • (rsgw40)
  • 等 级:
#3楼 得分:0回复于:2009-12-08 13:25:39
未收到
 
#4楼 得分:0回复于:2009-12-08 14:42:36
大侠们呢??现在发现我驱动读取ID后出现 Unknow device

[dm9: EDeviceRegisterIoSpace Chip signature is 90000A46
[dm9:Unknown device  
这是什么原因呀??各位帮忙看看呀??
 
  • OneOnce用户头像
  • OneOnce
  • (走别人的路,让别人无路可走)
  • 等 级:
#5楼 得分:25回复于:2009-12-08 15:28:53
引用 4 楼 xuefeng_baggio 的回复:
大侠们呢??现在发现我驱动读取ID后出现Unknow device

[dm9: EDeviceRegisterIoSpace Chip signature is 90000A46
[dm9:Unknown device 
这是什么原因呀??各位帮忙看看呀??


这个是DM9000里面读出来的,具体是多少要看程序的,我之前6410读出来的也是不对的,后来发现时读高地位反得原因。

你似乎没有提到DM9000的中断脚,难道没有连?
 
#6楼 得分:0回复于:2009-12-08 16:50:21
谢谢楼上的回复?那个Unknow device 问题解决了!我的中断脚接的是EINT9,但是在wince中驱动我没看到这么设置这个中断的?现在还在纳闷呢??
"SysIntr"=dword:26
"IrqNumber"=dword:1A

现在就知道这里是设置中断的 但是程序中没看到相关程序?还请指点下!
 
#7楼 得分:0回复于:2009-12-08 16:53:16
#define IRQ_EINT9 37
这个是我bsp中EINT9中断号?但是我跟不不知道驱动在怎么申请这个中断的?
 
  • OneOnce用户头像
  • OneOnce
  • (走别人的路,让别人无路可走)
  • 等 级:
#8楼 得分:0回复于:2009-12-08 16:59:24
你到OEM.c(5.0在OEM.c中,6.0在mcp.c中有关于终端注册等问题,5.0我很少用不知道能不能动态注册终端,6.0可以动态注册终端)里面去看看关于硬件中断映射到系统中断部分,对于DM9000只要映射好这个终端就可以了。以后这个终端就不需要你来管了。
 
  • OneOnce用户头像
  • OneOnce
  • (走别人的路,让别人无路可走)
  • 等 级:
#9楼 得分:0回复于:2009-12-08 17:00:02
终端 改为-> 中断
 
  • OneOnce用户头像
  • OneOnce
  • (走别人的路,让别人无路可走)
  • 等 级:
#10楼 得分:0回复于:2009-12-08 17:02:59
还有打错字,为了不误导到家再改一次
mcp.c 改为 map.c
 
#11楼 得分:0回复于:2009-12-08 17:26:52
大哥5.0的是 oem.c??我的是官方的2440bsp?我怎么没找到呢??
 
  • OneOnce用户头像
  • OneOnce
  • (走别人的路,让别人无路可走)
  • 等 级:
#12楼 得分:0回复于:2009-12-08 17:31:18
Intr.c

1、在BSPIntrInit函数中添加:
  (1) GPIO寄存器进行配置,配置引脚为中断及中断方式和中断电平等;
  (2) OALIntrStaticTranslate(SysIntr, IrqNumber);//物理中断号与系统中断号进行映射

2、在BSPIntrEnableIrq函数中对使用到的中断脚进行使能寄存器等;
3、在BSPIntrDoneIrq函数中对使用到的中断进行禁能寄存器等;
4、对中断脚中断电平或边沿(电平还是边沿中断)的配置要根据具体的硬件来定;
 
  • yamafe用户头像
  • yamafe
  • (yamafe)
  • 等 级:
#13楼 得分:0回复于:2009-12-09 11:32:03
网卡移植前段时间刚做完,应该比较简单,需要注意几个地方即可
1. 保证硬件连接无误,注意中断脚连到系统EINT几
2. platform.reg中IOBaseAddress,IrqNumber
3. 中断配置
 
#14楼 得分:0回复于:2009-12-09 12:08:51
引用 13 楼 yamafe 的回复:
网卡移植前段时间刚做完,应该比较简单,需要注意几个地方即可
1. 保证硬件连接无误,注意中断脚连到系统EINT几
2. platform.reg中IOBaseAddress,IrqNumber
3. 中断配置


您好!我的中断脚是EINT9 但是我现在不知道DM9000中断是怎么产生的?因为得下载的驱动中没有申请中断的地方??能详细的指点下吗??
 
#15楼 得分:0回复于:2009-12-09 12:20:06
应该是读注册表得到的系统中断号吧
估计你这个不是动态申请的
所以应该有个地方应该OALIntrStaticTranslate(SYSINTR_ENT9,IRQ_ENT9)
把系统中断号SYSINTR_ENT9("SysIntr"=dword:26 )跟物理中断号(IRQ_ENT9)绑定

这样就映射到你的BSP中的ISR中了

注:以上纯属猜测......
 
#16楼 得分:0回复于:2009-12-09 13:42:42
谢谢王鑫,我也是像你这样想的?但是我驱动中没有OALIntrStaticTranslate(),还有我现在是移植dm9000驱动,但是不知道驱动本身有没有问题?我就是没发现这个驱动怎么申请中断的》可是偏偏
void C_DM9000::DeviceEnableInterrupt(void)
{
RETAILMSG(1, (TEXT("[dm9: +++++DeviceEnableInterrupt+++++/r/n")));
DeviceWritePort(DM9_IMR,((1<<7)|(1<<3)|(1<<2)|(1<<1)|(1<<0)));
}
他这个函数还是在不停地调用?对这个Dm9000的驱动一点都不知道怎么实现的??郁闷呐???
 
#17楼 得分:0回复于:2009-12-09 14:02:47
哦这个简单
你可以把注册表中的去掉先看看这个中断函数还调用不调用了
还有你在CASE IRQ_EINT9那加些打印信息
看看你的中断到底进入ISR了没,貌似没有OALIntrStaticTranslate这个的话除非你直接传进来
IRQ_EINT9否则应该是不会进入case IRE_EINT9这里

再就是你看看驱动中有没有GetIsrInfo或者GetWindowInfo 或者DDKReg_GetIsrInfo 这类的API 
或者读注册表的API
这几个是从注册表读取中断号的API

 
#18楼 得分:0回复于:2009-12-09 15:08:27
恩!现在可以确认就是中断问题了?我现在只在我的bsp(官方2440)中查到
BSPIntrRequestIrqs()这个函数中有关于IRQ_EINT9的语句。
switch (pDevLoc->IfcType) {
  case Internal:
  switch ((ULONG)pDevLoc->LogicalLoc) {
  case BSP_BASE_REG_PA_DM9000_IOBASE:

RETAILMSG(1, (TEXT("+BSP_BASE_REG_PA_DM9000_IOBASE./r/n")));

  pIrqs[0] = IRQ_EINT9;
  *pCount = 1;
  rc = TRUE;
  break;
  }
  break;
  }
还有王鑫您讲的OALIntrStaticTranslate(SYSINTR_ENT9,IRQ_ENT9)这个我也没看到?我想问下这个Dm9000a的中断是怎么申请的呢??我整个bsp中断都是动态分配的?就是用KernelIoControl()申请的。但是Dm9000这没看到这样的??这块不是很懂?还请指点下?
 
#19楼 得分:25回复于:2009-12-09 15:36:28
DM9000我没做过
也不知道是怎么申请中断的
但是:
1、首先你这个驱动是从别的地方移植过来的,那么有可能那个可用DM9000的驱动中有静态申请中断的部分
  而你的BSP没有,那么就要你添加上了,一般就是你的驱动中用到系统中断号SYSINTR
  而不是用KernelIoControl申请的,那你就要在OAL中加OALIntrStaticTranslate
2、如果你的DM9000中没用到KernelIoControl动态申请,那么驱动一般有几种方式获得系统中断号
  1)直接赋值给InterruptInitialize()中的参数
  2)从注册表中读取一个系统中断号
  3)GetIsrInfo或者GetWindowInfo 或者DDKReg_GetIsrInfo 这几个API,你看看驱动中有没有
  其他方式我就不知道了 
3、你低层需要对IRQ_EINT9进行处理
  wince50 你就找找BSPIntrEnableIrq 、 BSPIntrDisableIrq 、BSPIntrDone
  你需要在这个下面添加一些 case IRQ_EINT9:
  他们应该是被OALIntrEnableIrqs OALIntrDisableIrqs OALIntrDoenIrqs调用的
  后者又被OEMInterruptDisable OEMInterruptDone OEMInterruptEnable调用
  大概是这样,你需要找个成熟的BSP屡一下他们的顺序
  然后自己把这个地方的ISR处理添加上
 
 
#20楼 得分:0回复于:2009-12-09 16:06:24
看了一下DM9000的驱动
没看到驱动中在哪获得的外部中断
要不我把我的BSP传给你 你自己研究吧
 
#21楼 得分:0回复于:2009-12-09 16:55:55
引用 20 楼 wangxin_801115 的回复:
看了一下DM9000的驱动
没看到驱动中在哪获得的外部中断
要不我把我的BSP传给你 你自己研究吧

谢谢你了 我邮箱是baggio_xuefeng@163.com
我现在在dm9000驱动中发现EDeviceRegisterInterrupt()这个函数。按help意思这个是申请中断的?
if((status=NdisMRegisterInterrupt(
&m_InterruptHandle,
m_pUpper->GetNdisHandle(),
m_szConfigures[CID_IRQ_NUMBER], // or say, irq vector
m_szConfigures[CID_IRQ_LEVEL], // irql level
TRUE, // request ISR
(BOOLEAN)m_szConfigures[CID_IRQ_SHARED], // shared interrupt
(KINTERRUPT_MODE)m_szConfigures[CID_IRQ_GEN_TYPE])) != NDIS_STATUS_SUCCESS)
RETAILMSG(1, (TEXT("[dm9: Error in registering interrupt is %X/r/n"), status));
THROW((ERR_STRING("Error in registering interrupt"),status));

但是我调试这个没有注册成功??不知道为什么?? m_szConfigures[CID_IRQ_NUMBER], // or say, irq vector
这里不知道填什么 ??我配置是这样的
CONFIG_PARAMETER g_szDm9ConfigParams[] =
{
{ CID_CONNECTION_TYPE, -1, NDIS_STRING_CONST("ConnectionType") },
{ CID_SLOT_NUMBER, -1, NDIS_STRING_CONST("SlotNumber")},
{ CID_BUFFER_PHYSICAL_ADDRESS, 0, NDIS_STRING_CONST("BufferPhysicalAddress")},
{ CID_TXBUFFER_NUMBER, 0x20, NDIS_STRING_CONST("XmitBuffer")},
{ CID_RXBUFFER_NUMBER, 0x10, NDIS_STRING_CONST("RecvBuffer")},
{ CID_ADAPTER_NUMBER, 0, NDIS_STRING_CONST("AdapterNumber")},
{ CID_IO_BASE_ADDRESS, 0x18000300, NDIS_STRING_CONST("IoAddress")},
{ CID_IO_RANGE, 0x10, NDIS_STRING_CONST("IoRange")},
{ CID_IRQ_NUMBER, 9, NDIS_STRING_CONST("IrqNumber")},
{ -1,-1,NULL}
};
很奇怪 不知道怎么和注册表关联起来??看样子这个dm9000不是很简单呀??
 
#22楼 得分:0回复于:2009-12-09 18:15:08
你这个DM9000是从别的地方移植过来的.....
要不你先别处理这部分了
你先看一下硬件上是否用EINT9做中断
如果是得话就先处理ISR部分
不管是怎么传进来的,总之它是传进来了
你要处理的就是把你BSP中的IRQ_EINT9做相应处理(Enable disable done)
你还得注意DM9000驱动中想要的是一个系统中断号还是物理中断号
(不知道在驱动中直接用物理中断号行不行,貌似不管怎么申请,都得用系统中断号吧??)
 
  • OneOnce用户头像
  • OneOnce
  • (走别人的路,让别人无路可走)
  • 等 级:
#23楼 得分:0回复于:2009-12-10 09:22:49
首先要确定你的DM9000是用了那个CSn,有没对这个CSn进行初始化,有没有在g_oalAddressTable里面映射内存,中断注册方法就按照我在3楼说的做,为什么会找不到呢,太奇怪了,你就去intr.c文件去跟踪下去。
 
#24楼 得分:0回复于:2009-12-10 09:44:36
恩,我现在发现原因了,我的bsp中没有对EINT9进行初始化,也就是没有申请这个中断。搞了好久 希望今天有结果!还有楼上的你说 “有没有在g_oalAddressTable里面映射内存,”这是什么意思呢??我的ID已经读出来了。我接的nCSn3 地址应该是0x18000000, 这张表哪里要改呀》指点下??
 
  • OneOnce用户头像
  • OneOnce
  • (走别人的路,让别人无路可走)
  • 等 级:
#25楼 得分:0回复于:2009-12-10 11:15:33
在Oemaddrtab_cfg.inc里面
 
#26楼 得分:0回复于:2009-12-10 11:34:06
引用 25 楼 oneonce 的回复:
在Oemaddrtab_cfg.inc里面

您是想说这个吗??
  DCD 0x86000000, 0x18000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 3
现在我在OAL层已经加了中断EINT9了,而且调试信息看已经成功了!
在Intr.c的BSPIntrInit()中加入
 OALIntrStaticTranslate(SYSINTR_OHCI, IRQ_EINT9);
  value = IRQ_EINT9;
  OALIntrEnableIrqs(1, &value);
在common/intr OALIntrEnableIrqs()中加入
 else if (irq <= IRQ_EINT9) { //
RETAILMSG(1, (TEXT("[dm9: OALIntrEnableIrqs IRQ_EINT9++++/r/n")));

mask = 1 << (irq - IRQ_EINT4 + 4);
  OUTREG32(&g_pPortRegs->EINTPEND, mask);
  CLRREG32(&g_pPortRegs->EINTMASK, mask);
  mask = 1 << IRQ_EINT8_23;
  if ((INREG32(&g_pIntrRegs->INTPND) & mask) != 0) {
  OUTREG32(&g_pIntrRegs->INTPND, mask);
  }
  CLRREG32( &g_pIntrRegs->INTMSK, 1 << IRQ_EINT8_23);
}

不知道这样加了 还有什么注意的?现在网卡灯都亮了!中断调试信息也有了
[dm9: +++++EDeviceInitialize+++++
[dm9: Chip signature is 90000A46
[dm9: +++++DeviceEnableInterrupt+++++
+OALIntrDoneIrqs(1, 0x8201eefc)
+BSPIntrDoneIrq(37).
[dm9: +++++EDeviceInitialize+++++
[dm9: Chip signature is 90000A46
[dm9: +++++DeviceEnableInterrupt+++++
+OALIntrDoneIrqs(1, 0x8201eefc)
+BSPIntrDoneIrq(37).

但是还是不能ping通??请教下是怎么回事呀??
 
  • OneOnce用户头像
  • OneOnce
  • (走别人的路,让别人无路可走)
  • 等 级:
#27楼 得分:0回复于:2009-12-10 12:20:42
还要对SROM进行初始化BANK3
 
  • OneOnce用户头像
  • OneOnce
  • (走别人的路,让别人无路可走)
  • 等 级:
#28楼 得分:0回复于:2009-12-10 12:42:46
OALIntrEnableIrqs不是调用了BSPIntrEnableIrq么?为什么要再OAL里面加?不过在这里加也没问题,主要是规范的问题。
 
#29楼 得分:0回复于:2009-12-10 13:09:22
引用 27 楼 oneonce 的回复:
还要对SROM进行初始化BANK3

srom初始化??还请大侠讲明白点?我的srom在eboot的startup.s中初始化的?
; Bank 3

B3_Tacs EQU (0x0) ; 0clk
B3_Tcos EQU (0x0) ; 0clk
B3_Tacc EQU (0x7) ; 14clk
B3_Tcoh EQU (0x0) ; 0clk
B3_Tah EQU (0x0) ; 0clk
B3_Tacp EQU (0x0)  
B3_PMC EQU (0x0) ; normal


还要在哪初始化呢??
 
#30楼 得分:0回复于:2009-12-10 13:11:08
引用 28 楼 oneonce 的回复:
OALIntrEnableIrqs不是调用了BSPIntrEnableIrq么?为什么要再OAL里面加?不过在这里加也没问题,主要是规范的问题。

这是很好的建议!我一定注意!谢谢了!呵呵
 
  • OneOnce用户头像
  • OneOnce
  • (走别人的路,让别人无路可走)
  • 等 级:
#31楼 得分:0回复于:2009-12-10 13:42:05
引用 29 楼 xuefeng_baggio 的回复:
引用 27 楼 oneonce 的回复:
还要对SROM进行初始化BANK3

srom初始化??还请大侠讲明白点?我的srom在eboot的startup.s中初始化的?
; Bank 3

B3_Tacs    EQU    (0x0)    ; 0clk
B3_Tcos    EQU    (0x0)    ; 0clk
B3_Tacc    EQU    (0x7)    ; 14clk
B3_Tcoh    EQU    (0x0)    ; 0clk
B3_Tah      EQU    (0x0)    ; 0clk
B3_Tacp    EQU    (0x0)   
B3_PMC      EQU    (0x0)    ; normal


还要在哪初始化呢??



不知道你有没有init.c在OAL的OEMinit函数里面,
 
  • OneOnce用户头像
  • OneOnce
  • (走别人的路,让别人无路可走)
  • 等 级:
#32楼 得分:0回复于:2009-12-10 13:42:40
或者PlatformInit里面都行
 
#33楼 得分:0回复于:2009-12-10 13:59:17
引用 31 楼 oneonce 的回复:
引用 29 楼 xuefeng_baggio 的回复:
引用 27 楼 oneonce 的回复:
还要对SROM进行初始化BANK3

srom初始化??还请大侠讲明白点?我的srom在eboot的startup.s中初始化的?
; Bank 3

B3_Tacs    EQU    (0x0)    ; 0clk
B3_Tcos    EQU    (0x0)    ; 0clk
B3_Tacc    EQU    (0x7)    ; 14clk
B3_Tcoh    EQU    (0x0)    ; 0clk
B3_Tah      EQU    (0x0)    ; 0clk
B3_Tacp    EQU    (0x0)   
B3_PMC      EQU    (0x0)    ; normal


还要在哪初始化呢??



不知道你有没有init.c在OAL的OEMinit函数里面,

不明白您讲的??
 
  • OneOnce用户头像
  • OneOnce
  • (走别人的路,让别人无路可走)
  • 等 级:
#34楼 得分:0回复于:2009-12-10 19:02:47
引用 33 楼 xuefeng_baggio 的回复:
引用 31 楼 oneonce 的回复:
引用 29 楼 xuefeng_baggio 的回复:
引用 27 楼 oneonce 的回复:
还要对SROM进行初始化BANK3

srom初始化??还请大侠讲明白点?我的srom在eboot的startup.s中初始化的?
; Bank 3

B3_Tacs    EQU    (0x0)    ; 0clk
B3_Tcos    EQU    (0x0)    ; 0clk
B3_Tacc    EQU    (0x7)    ; 14clk
B3_Tcoh    EQU    (0x0)    ; 0clk
B3_Tah      EQU    (0x0)    ; 0clk
B3_Tacp    EQU    (0x0)   
B3_PMC      EQU    (0x0)    ; normal


还要在哪初始化呢??


不知道你有没有init.c在OAL的OEMinit函数里面,

不明白您讲的??


你要对SROM进行配置,2440应该都有这个寄存器的,
SROM_BW寄存器(2440是不是叫这个名字我就不知道了)
SROM_BC3寄存器(2440是不是叫这个名字我就不知道了)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值