2440官方bsp的DM9000A驱动问题!

xuefeng_baggio 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
"IrqNumber"=dword:1A
"IoAddress"=dword:18000300
"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,也无法上网?请教下大家!
...全文
549 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
OneOnce 2009-12-10
  • 打赏
  • 举报
回复
OALIntrEnableIrqs不是调用了BSPIntrEnableIrq么?为什么要再OAL里面加?不过在这里加也没问题,主要是规范的问题。
OneOnce 2009-12-10
  • 打赏
  • 举报
回复
还要对SROM进行初始化BANK3
xuefeng_baggio 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 oneonce 的回复:]
在Oemaddrtab_cfg.inc里面
[/Quote]
您是想说这个吗??
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 2009-12-10
  • 打赏
  • 举报
回复
在Oemaddrtab_cfg.inc里面
xuefeng_baggio 2009-12-10
  • 打赏
  • 举报
回复
恩,我现在发现原因了,我的bsp中没有对EINT9进行初始化,也就是没有申请这个中断。搞了好久 希望今天有结果!还有楼上的你说 “有没有在g_oalAddressTable里面映射内存,”这是什么意思呢??我的ID已经读出来了。我接的nCSn3 地址应该是0x18000000, 这张表哪里要改呀》指点下??
OneOnce 2009-12-10
  • 打赏
  • 举报
回复
首先要确定你的DM9000是用了那个CSn,有没对这个CSn进行初始化,有没有在g_oalAddressTable里面映射内存,中断注册方法就按照我在3楼说的做,为什么会找不到呢,太奇怪了,你就去intr.c文件去跟踪下去。
OneOnce 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 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函数里面,

不明白您讲的??
[/Quote]

你要对SROM进行配置,2440应该都有这个寄存器的,
SROM_BW寄存器(2440是不是叫这个名字我就不知道了)
SROM_BC3寄存器(2440是不是叫这个名字我就不知道了)
xuefeng_baggio 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 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函数里面,
[/Quote]
不明白您讲的??
OneOnce 2009-12-10
  • 打赏
  • 举报
回复
或者PlatformInit里面都行
OneOnce 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 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


还要在哪初始化呢??
[/Quote]


不知道你有没有init.c在OAL的OEMinit函数里面,
xuefeng_baggio 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 oneonce 的回复:]
OALIntrEnableIrqs不是调用了BSPIntrEnableIrq么?为什么要再OAL里面加?不过在这里加也没问题,主要是规范的问题。
[/Quote]
这是很好的建议!我一定注意!谢谢了!呵呵
xuefeng_baggio 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 oneonce 的回复:]
还要对SROM进行初始化BANK3
[/Quote]
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


还要在哪初始化呢??
WangXin_CE 2009-12-09
  • 打赏
  • 举报
回复
应该是读注册表得到的系统中断号吧
估计你这个不是动态申请的
所以应该有个地方应该OALIntrStaticTranslate(SYSINTR_ENT9,IRQ_ENT9)
把系统中断号SYSINTR_ENT9("SysIntr"=dword:26 )跟物理中断号(IRQ_ENT9)绑定

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

注:以上纯属猜测......
xuefeng_baggio 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 yamafe 的回复:]
网卡移植前段时间刚做完,应该比较简单,需要注意几个地方即可
1. 保证硬件连接无误,注意中断脚连到系统EINT几
2. platform.reg中IOBaseAddress,IrqNumber
3. 中断配置

[/Quote]
您好!我的中断脚是EINT9 但是我现在不知道DM9000中断是怎么产生的?因为得下载的驱动中没有申请中断的地方??能详细的指点下吗??
yamafe 2009-12-09
  • 打赏
  • 举报
回复
网卡移植前段时间刚做完,应该比较简单,需要注意几个地方即可
1. 保证硬件连接无误,注意中断脚连到系统EINT几
2. platform.reg中IOBaseAddress,IrqNumber
3. 中断配置
wangxin_801115 2009-12-09
  • 打赏
  • 举报
回复
你这个DM9000是从别的地方移植过来的.....
要不你先别处理这部分了
你先看一下硬件上是否用EINT9做中断
如果是得话就先处理ISR部分
不管是怎么传进来的,总之它是传进来了
你要处理的就是把你BSP中的IRQ_EINT9做相应处理(Enable disable done)
你还得注意DM9000驱动中想要的是一个系统中断号还是物理中断号
(不知道在驱动中直接用物理中断号行不行,貌似不管怎么申请,都得用系统中断号吧??)
xuefeng_baggio 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 wangxin_801115 的回复:]
看了一下DM9000的驱动
没看到驱动中在哪获得的外部中断
要不我把我的BSP传给你 你自己研究吧
[/Quote]
谢谢你了 我邮箱是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不是很简单呀??
wangxin_801115 2009-12-09
  • 打赏
  • 举报
回复
看了一下DM9000的驱动
没看到驱动中在哪获得的外部中断
要不我把我的BSP传给你 你自己研究吧
wangxin_801115 2009-12-09
  • 打赏
  • 举报
回复
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处理添加上
xuefeng_baggio 2009-12-09
  • 打赏
  • 举报
回复
恩!现在可以确认就是中断问题了?我现在只在我的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这没看到这样的??这块不是很懂?还请指点下?
加载更多回复(14)

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧