最近移植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,也无法上网?请教下大家!
大侠们呢??现在发现我驱动读取ID后出现Unknow device
[dm9: EDeviceRegisterIoSpace Chip signature is 90000A46
[dm9:Unknown device
这是什么原因呀??各位帮忙看看呀??
引用: 引用 4 楼 xuefeng_baggio 的回复:
大侠们呢??现在发现我驱动读取ID后出现Unknow device
[dm9: EDeviceRegisterIoSpace Chip signature is 90000A46
[dm9:Unknown device?
这是什么原因呀??各位帮忙看看呀??
这个是DM9000里面读出来的,具体是多少要看程序的,我之前6410读出来的也是不对的,后来发现时读高地位反得原因。
你似乎没有提到DM9000的中断脚,难道没有连?
谢谢楼上的回复?那个Unknow device 问题解决了!我的中断脚接的是EINT9,但是在wince中驱动我没看到这么设置这个中断的?现在还在纳闷呢??
"SysIntr"=dword:26
"IrqNumber"=dword:1A
现在就知道这里是设置中断的 但是程序中没看到相关程序?还请指点下!
#define IRQ_EINT9 37
这个是我bsp中EINT9中断号?但是我跟不不知道驱动在怎么申请这个中断的?
你到OEM.c(5.0在OEM.c中,6.0在mcp.c中有关于终端注册等问题,5.0我很少用不知道能不能动态注册终端,6.0可以动态注册终端)里面去看看关于硬件中断映射到系统中断部分,对于DM9000只要映射好这个终端就可以了。以后这个终端就不需要你来管了。
还有打错字,为了不误导到家再改一次
mcp.c 改为 map.c
大哥5.0的是 oem.c??我的是官方的2440bsp?我怎么没找到呢??
Intr.c
1、在BSPIntrInit函数中添加:
(1) GPIO寄存器进行配置,配置引脚为中断及中断方式和中断电平等;
(2) OALIntrStaticTranslate(SysIntr, IrqNumber);//物理中断号与系统中断号进行映射
2、在BSPIntrEnableIrq函数中对使用到的中断脚进行使能寄存器等;
3、在BSPIntrDoneIrq函数中对使用到的中断进行禁能寄存器等;
4、对中断脚中断电平或边沿(电平还是边沿中断)的配置要根据具体的硬件来定;
网卡移植前段时间刚做完,应该比较简单,需要注意几个地方即可
1. 保证硬件连接无误,注意中断脚连到系统EINT几
2. platform.reg中IOBaseAddress,IrqNumber
3. 中断配置
引用: 引用 13 楼 yamafe 的回复:
网卡移植前段时间刚做完,应该比较简单,需要注意几个地方即可
1. 保证硬件连接无误,注意中断脚连到系统EINT几
2. platform.reg中IOBaseAddress,IrqNumber
3. 中断配置
您好!我的中断脚是EINT9 但是我现在不知道DM9000中断是怎么产生的?因为得下载的驱动中没有申请中断的地方??能详细的指点下吗??
应该是读注册表得到的系统中断号吧
估计你这个不是动态申请的
所以应该有个地方应该OALIntrStaticTranslate(SYSINTR_ENT9,IRQ_ENT9)
把系统中断号SYSINTR_ENT9("SysIntr"=dword:26 )跟物理中断号(IRQ_ENT9)绑定
这样就映射到你的BSP中的ISR中了
注:以上纯属猜测......
谢谢王鑫,我也是像你这样想的?但是我驱动中没有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的驱动一点都不知道怎么实现的??郁闷呐???
哦这个简单
你可以把注册表中的去掉先看看这个中断函数还调用不调用了
还有你在CASE IRQ_EINT9那加些打印信息
看看你的中断到底进入ISR了没,貌似没有OALIntrStaticTranslate这个的话除非你直接传进来
IRQ_EINT9否则应该是不会进入case IRE_EINT9这里
再就是你看看驱动中有没有GetIsrInfo或者GetWindowInfo 或者DDKReg_GetIsrInfo 这类的API
或者读注册表的API
这几个是从注册表读取中断号的API
恩!现在可以确认就是中断问题了?我现在只在我的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这没看到这样的??这块不是很懂?还请指点下?
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处理添加上