DM9000驱动中,如何得到"IoAddress"=dword:20000300?

luck2001   2010-2-23 23:56 楼主
如题,我的cpu是s3c2440,芯片连接的片选是nGCS4,这样地址就应该是0x20000000。但是驱动下面偏移地址使用的是0x20000300,这个是怎么得到的,恳请大家知道的给以解惑!

回复评论 (23)

引用: 引用楼主 halfboy 的回复:
如题,我的cpu是s3c2440,芯片连接的片选是nGCS4,这样地址就应该是0x20000000。但是驱动下面偏移地址使用的是0x20000300,这个是怎么得到的,恳请大家知道的给以解惑!


貌似改成0x20000000也是可以,一直没注意多了个0x300的问题,我的也有。
点赞  2010-2-24 09:07
eboot里面的IoAddress也是0x20000300吗??我的片选也是nGCS4,设置的是0x20000000,我在dm9000_init中打印出来时0xAA000000(是虚拟地址,uncache,映射过去的)。

但是我现在dm9000a的id一直检测不到(貌似DHCP可以获得地址),很奇怪

0x20000300也试过,也不行


点赞  2010-2-24 09:51
你修改过下面的代码没?

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, 0x30000300, NDIS_STRING_CONST("IoAddress")},
        { CID_IO_RANGE, 0x10, NDIS_STRING_CONST("IoRange")},
        { CID_IRQ_NUMBER, 12, NDIS_STRING_CONST("IrqNumber")},
        { -1,-1,NULL}
};
点赞  2010-2-24 09:53
引用: 引用 3 楼 oneonce 的回复:
你修改过下面的代码没?

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, 0x30000300, NDIS_STRING_CONST("IoAddress")},
        { CID_IO_RANGE, 0x10, NDIS_STRING_CONST("IoRange")},
        { CID_IRQ_NUMBER, 12, NDIS_STRING_CONST("IrqNumber")},
        { -1,-1,NULL}
};


修改过的,就是用0x20000300。我的是可以读出ID号的,所以我才觉得奇怪。不知道怎么个映射法
点赞  2010-2-24 10:34
引用: 引用 2 楼 luixing67 的回复:
eboot里面的IoAddress也是0x20000300吗??我的片选也是nGCS4,设置的是0x20000000,我在dm9000_init中打印出来时0xAA000000(是虚拟地址,uncache,映射过去的)。

但是我现在dm9000a的id一直检测不到(貌似DHCP可以获得地址),很奇怪

0x20000300也试过,也不行

dm9000a不知道,没有用过。你看一下数据手册,看看驱动定义的ID寄存器偏移是否正确吧
点赞  2010-2-24 10:35
中断号(CID_IRQ_NUMBER)有没有错?
点赞  2010-2-24 10:36
引用: 引用 1 楼 oneonce 的回复:
引用楼主 halfboy 的回复:
如题,我的cpu是s3c2440,芯片连接的片选是nGCS4,这样地址就应该是0x20000000。但是驱动下面偏移地址使用的是0x20000300,这个是怎么得到的,恳请大家知道的给以解惑!

貌似改成0x20000000也是可以,一直没注意多了个0x300的问题,我的也有。

你把你的地址设为不使用注册表的读取的地址值看看,或者把注册表的值也修改了,使得下面的输出地址也变成0x2000000:
[dm9: Tries to map io space with 20000300

这样是否还可以读出ID值呢?
点赞  2010-2-24 10:38
引用: 引用 6 楼 oneonce 的回复:
中断号(CID_IRQ_NUMBER)有没有错?

这个跟终端号有什么关系吗?偏移地址应该跟这个无关吧。系统中断号应该可以随便设置吧,只要能跟设备中断映射起来就可以了吧
点赞  2010-2-24 10:43
引用: 引用 8 楼 halfboy 的回复:
引用 6 楼 oneonce 的回复:中断号(CID_IRQ_NUMBER)有没有错?
这个跟终端号有什么关系吗?偏移地址应该跟这个无关吧。系统中断号应该可以随便设置吧,只要能跟设备中断映射起来就可以了吧


系统中断号是可以随便一个,但是,必须和实际硬件中断号对应起来,否则也是空谈。
点赞  2010-2-24 10:45
引用: 引用 9 楼 oneonce 的回复:
引用 8 楼 halfboy 的回复:
引用 6 楼 oneonce 的回复:中断号(CID_IRQ_NUMBER)有没有错?
这个跟终端号有什么关系吗?偏移地址应该跟这个无关吧。系统中断号应该可以随便设置吧,只要能跟设备中断映射起来就可以了吧

系统中断号是可以随便一个,但是,必须和实际硬件中断号对应起来,否则也是空谈。

系统中断跟实际中断怎么对应?我并没有看到网上说的什么Translate的函数。不过在OEMInterruptHandler()函数里面会在外部中断7(DM9000接的是外部中断7)发生的时候返回系统中断号,这个算不算是对应起来呢?
        else if (IntPendVal == INTSRC_EINT4_7)
        {
                DWORD dwSubMask = s2440IOP->rEINTPEND & (~s2440IOP->rEINTMASK);

                if ( dwSubMask & (1 << 7))        // 0x80 EINT7 : DM9000
                {
                        s2440IOP->rEINTMASK |= 0x80;
                        s2440IOP->rEINTPEND = 0x80;
                        s2440INT->rSRCPND = BIT_EINT4_7;        
                        if (s2440INT->rINTPND & BIT_EINT4_7) s2440INT->rINTPND = BIT_EINT4_7;
                       
                       RETAILMSG(1,(TEXT("DM9000 interrupt----\r\n")));       
                              return SYSINTR_DM9000 ;
                }
        }
点赞  2010-2-24 10:50
BOOL BSPIntrInit():
OALIntrStaticTranslate(SYSINTR_DM9000AP, IRQ_EINT0);

我没看到你是怎么映射的。
点赞  2010-2-24 10:53
引用: 引用 11 楼 oneonce 的回复:
BOOL BSPIntrInit():
OALIntrStaticTranslate(SYSINTR_DM9000AP, IRQ_EINT0);

我没看到你是怎么映射的。

这个我也看网上介绍过了,不过,我搜索了整个BSP包,都没有看到有BSPIntrInit()函数。这个也是疑惑之一,另外,OneOnce能解答一下偏移地址的问题吗?谢谢
点赞  2010-2-24 10:58
引用: 引用 12 楼 halfboy 的回复:
引用 11 楼 oneonce 的回复:BOOL BSPIntrInit(): OALIntrStaticTranslate(SYSINTR_DM9000AP, IRQ_EINT0); 我没看到你是怎么映射的。
这个我也看网上介绍过了,不过,我搜索了整个BSP包,都没有看到有BSPIntrInit()函数。这个也是疑惑之一,另外,OneOnce能解答一下偏移地址的问题吗?谢谢


BSPIntrInit()函数在intr.c中,至于偏移地址我也是不太理解,只是一直都是这样大家移植下来的,我下次可以去问下之前老大,最早2440是他移植的。
点赞  2010-2-24 11:03
感觉我的bsp包结构跟你的不一样,并没有这个文件呀!
点赞  2010-2-24 11:11
一般都会有哈,2440的BSP包没接触过。

你可以用KernelIoControl动态注册中断
点赞  2010-2-24 11:13
这个确实是没有的,bsp包是前人留下的,已经无从闻讯。另外,我看了一下s2440.h的头文件,我发现它映射地址也很奇怪,如下:
#define IOP_BASE      0xB1600000 // 0x56000000
看cpu的datasheet,应该是被注释掉的那个才是正确的的呀。又不知道是怎么映射的了。关于中断的注册,我再看看,是否能够接受到中断吧。
点赞  2010-2-24 11:21
楼主可不可以贴一下与IoAddress有关的log信息,我看dm9000与dm9000a基本是一样的
点赞  2010-2-24 11:35
引用: 引用 17 楼 luixing67 的回复:
楼主可不可以贴一下与IoAddress有关的log信息,我看dm9000与dm9000a基本是一样的

另个地方,一个是驱动里面,一个是注册表里面。驱动里面如下:
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, 0x20000300, NDIS_STRING_CONST("IoAddress")},
注册表如下:
[HKEY_LOCAL_MACHINE\Comm\DM9CE1\Parms]
        "BusNumber"=dword:0
        "BusType"=dword:1
        "XmitBuffer"=dword:20
        "RecvBuffer"=dword:20
        "SysIntr"=dword:26
        "IrqNumber"=dword:26
        "IoAddress"=dword:20000300
你要看一下你的驱动是不是开始的时候读取注册表获得这个地址信息,我的是读取注册表信息的,驱动代码如下:
void        NIC_DEVICE_OBJECT::DeviceRetriveConfigurations(
        NDIS_HANDLE                hConfig)
{
        NDIS_STATUS        status;
        RETAILMSG(DM9000_DEBUG, (TEXT("DM9000 DeviceRetriveConfigurations\r\n")));
        PCONFIG_PARAMETER        pconfig;
       
        PNDIS_CONFIGURATION_PARAMETER        param;

        for(pconfig=DeviceConfigureParameters();
                (pconfig->uId != (U32)-1);
                pconfig++)
        {
                NdisReadConfiguration(
                        &status,
                        ¶m,
                        hConfig,
                        &(pconfig->szName),
                        NdisParameterHexInteger);
                if(status == NDIS_STATUS_SUCCESS)
                        m_szConfigures[pconfig->uId] =
                                param->ParameterData.IntegerData;
                else
                        m_szConfigures[pconfig->uId] = pconfig->uDefValue;
        }

调试的时候,日志输出如下所示:
09:42:45.671 C_DM9000::EDeviceRegisterIoSpace
09:42:45.671 [dm9: Tries to map io space with 20000300
09:42:45.687 [dm9: The mapped address is 380300
09:42:45.687 DM9000ReadPort:Address=0x28,value=0x46
09:42:45.687 DM9000ReadPort:Address=0x29,value=0xa
09:42:45.687 DM9000ReadPort:Address=0x2a,value=0x0
09:42:45.687 DM9000ReadPort:Address=0x2b,value=0x90
09:42:45.703 [dm9000: Chip signature is 90000A46
点赞  2010-2-24 11:48
我是在EBOOT里面的,没有注册表之类的
The mapped address is 380300 ??这个地址是什么
另外你是直接操作这个地址的吗?没有虚拟地址?
点赞  2010-2-24 12:45
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复