2440官方bsp的DM9000A驱动问题!

hanxiao007   2009-12-8 09:53 楼主
最近移植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,也无法上网?请教下大家!

回复评论 (34)

能给个联系方式吗?rsgw40@sohu.com
点赞  2009-12-8 13:14
已发邮件给您~
点赞  2009-12-8 13:19
未收到
点赞  2009-12-8 13:25
大侠们呢??现在发现我驱动读取ID后出现Unknow device

[dm9: EDeviceRegisterIoSpace Chip signature is 90000A46
[dm9:Unknown device  
这是什么原因呀??各位帮忙看看呀??
点赞  2009-12-8 14:42
引用: 引用 4 楼 xuefeng_baggio 的回复:
大侠们呢??现在发现我驱动读取ID后出现Unknow device

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


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

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

现在就知道这里是设置中断的 但是程序中没看到相关程序?还请指点下!
点赞  2009-12-8 16:50
#define IRQ_EINT9           37
这个是我bsp中EINT9中断号?但是我跟不不知道驱动在怎么申请这个中断的?
点赞  2009-12-8 16:52

9楼 yun 

你到OEM.c(5.0在OEM.c中,6.0在mcp.c中有关于终端注册等问题,5.0我很少用不知道能不能动态注册终端,6.0可以动态注册终端)里面去看看关于硬件中断映射到系统中断部分,对于DM9000只要映射好这个终端就可以了。以后这个终端就不需要你来管了。
点赞  2009-12-8 16:59
终端 改为-> 中断
点赞  2009-12-8 16:59
还有打错字,为了不误导到家再改一次
mcp.c 改为 map.c
点赞  2009-12-8 17:02
大哥5.0的是 oem.c??我的是官方的2440bsp?我怎么没找到呢??
点赞  2009-12-8 17:26
Intr.c

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

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

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

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

注:以上纯属猜测......
点赞  2009-12-9 12:19
谢谢王鑫,我也是像你这样想的?但是我驱动中没有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的驱动一点都不知道怎么实现的??郁闷呐???
点赞  2009-12-9 13:42
哦这个简单
你可以把注册表中的去掉先看看这个中断函数还调用不调用了
还有你在CASE IRQ_EINT9那加些打印信息
看看你的中断到底进入ISR了没,貌似没有OALIntrStaticTranslate这个的话除非你直接传进来
IRQ_EINT9否则应该是不会进入case IRE_EINT9这里

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

点赞  2009-12-9 14:02
恩!现在可以确认就是中断问题了?我现在只在我的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这没看到这样的??这块不是很懂?还请指点下?
点赞  2009-12-9 15:08
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处理添加上
   
点赞  2009-12-9 15:36
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复