阅读:1185回复:17
wxl_50685330请教!
wxl_50685330请教一个问题:
在isa总线上挂了一片ram,处理器采用x86,跑wince4。1,isa的io端口操作都调通了,但对ram的操作有问题,ram映射在内存的e0000-effff段,我用了TransbusAddrToVirtual将0x80cd0000映射到虚拟地址,在对虚拟地址操作,但用示波器看isa的smemw始终为高,不知wince下对isa是否还有什么其它的操作? 部分代码: PHYSICAL_ADDRESS InAddr; ULONG AddressSpace; PVOID pGpioPtr; UCHAR DATA; unsigned char *pData; AddewssSpace=0X0; TransBusAddrToVirtual(Isa,0,InAddr,1024,&AddressSpace,&pGpioPtr) pData=(unsigned char *)pGpioPtr; *pData=data; 运行后,总线上的/smemw不起作用。 还发现一个问题,就是对映射后的地址(内存)写一个数,再读出来 始终是0xff,我怀疑写错了地址,用mmmapiospace及VirtualAlloc, VirtualCopy结果都一样,不知什么原因? 请指教!谢谢! |
|
沙发#
发布于:2004-11-24 20:08
补充一点:
对映射的虚拟地址写一个数,再读出来是对的,但用相同的物理地址 映射后,再读出来始终是0xff。 非常感谢! |
|
板凳#
发布于:2004-11-25 10:22
还请wxl_50685330帮帮忙,已经搞了几天了,交不了差啊。
备注:我的应用程序是通过网口拷贝到目标板上的,编译是加的标准的sdk,不是定制的sdk,不知有没有关系,我觉得驱动主要是ddk。 谢谢! |
|
论坛版主
|
地板#
发布于:2004-11-25 13:21
慢慢来,慢慢来,我都觉得离胜利不远了:)
你的isa是用cpld扩展的? 你说:“对映射的虚拟地址写一个数,再读出来是对的,但用相同的物理地址映射后,再读出来始终是0xff。” 虚拟地址指的是什么?物理地址又是什么? 是映射的0x80cd0000后操作正常了吗? |
|
地下室#
发布于:2004-11-25 14:01
终于等到你了,谢谢wxl_50685330!
isa总线是直接从x86的数据线,地址线,读写信号线拉出来的,中间没接任何接口芯片。 我的操作是这样的: 接上次的。 unsigned short f; if(TransBusAddrToVirtualIsa,0,InAddr,1024,&AddressSpace,&rawbuf)) { pData=(unsigned char *)rawbuf; *pData=0x8f; f=*pData; //f的值是0X8F MmUnmapIoSpace( rawbuf, 0x01 ); } else { AfxMessageBox(_T("hhhh")); } if(TransBusAddrToVirtual(Isa,0,InAddr,0x01,&AddressSpace,&rawbuf)) { pData=(unsigned char *)rawbuf; f=*pData; str.Format(_T("%d"),f); //f的值是0XFF MmUnmapIoSpace( rawbuf, 1024 ); } else { AfxMessageBox(_T("hhhh")); } 两次f的值不同。 |
|
5楼#
发布于:2004-11-25 14:02
终于等到你了,谢谢wxl_50685330!
isa总线是直接从x86的数据线,地址线,读写信号线拉出来的,中间没接任何接口芯片。 我的操作是这样的: 接上次的。 unsigned short f; if(TransBusAddrToVirtualIsa,0,InAddr,1024,&AddressSpace,&rawbuf)) { pData=(unsigned char *)rawbuf; *pData=0x8f; f=*pData; //f的值是0X8F MmUnmapIoSpace( rawbuf, 1024 ); } else { AfxMessageBox(_T("hhhh")); } if(TransBusAddrToVirtual(Isa,0,InAddr,0x01,&AddressSpace,&rawbuf)) { pData=(unsigned char *)rawbuf; f=*pData; str.Format(_T("%d"),f); //f的值是0XFF MmUnmapIoSpace( rawbuf, 1024 ); } else { AfxMessageBox(_T("hhhh")); } 两次f的值不同。 |
|
6楼#
发布于:2004-11-25 14:09
我怀疑,地址映射到了一个空的地址区域(此区域并不是ram的地址区)。
|
|
论坛版主
|
7楼#
发布于:2004-11-25 14:19
...你是说执行两次,第一次正确,第二次不行?不是地址问题了?你第二次为什么给length是1呢?
|
|
8楼#
发布于:2004-11-25 14:28
应该还是1024,帖上去的时候出了点问题。
确实像你说的,第一次是对的,第二次不对, 但我看了两次映射后的虚拟地址都是0x70000啊。 非常感谢! |
|
9楼#
发布于:2004-11-25 17:47
有做了这样的试验:
变量设置如上, if(TransBusAddrToVirtual(Isa,0,InAddr,1024,&AddressSpace,&rawbuf)) { pData=(unsigned char *)rawbuf; *pData=0x8f; pData++; *pData=0x0; pData--; f=*pData; str.Format(_T("%d"),f); AfxMessageBox(str); //f为0x0 pData++; f=*pData; str.Format(_T("%d"),f); AfxMessageBox(str); //f为0xff MmUnmapIoSpace( rawbuf, 1024 ); } 唉!越来越迷茫! 请点拨点拨!谢谢! |
|
10楼#
发布于:2004-11-26 08:56
我怀疑你的地址映射有问题。问一下:
在函数 TransBusAddrToVirtual(Isa,0,InAddr,1024,&AddressSpace,&rawbuf)中,InAddr的值是多少? 我觉得应该是InAddr=0x80cd0。你试试看! |
|
|
11楼#
发布于:2004-11-26 10:52
非常感谢wwei_wang,正如您所说的,现在可以对内存正常读写了,
为什么这样?是因为要4k对齐吗?pb的help没有解释。 但isa总线的/SMEMW写信号还是不起作用,但这根信号线是和cpu的 写信号直接相连的啊,是不是要为之专门做个驱动,而不能直接在应用程序操作? 再次感谢!因为有你和wxl_50685330这样的热心人,才使这个网人气火爆。 |
|
12楼#
发布于:2004-11-26 11:33
问题解决了,谢谢各位!
|
|
论坛版主
|
13楼#
发布于:2004-11-26 13:32
昨天不好意思,突然连不上了,搞定了?厉害:)
作虚拟映射的地址确实要4k对齐,帮助上是没有。对了,你说些信号没有反应是不是你示波器频率调得太低了?或者你的示波器频率不够,你写一个死循环不停地读写再测一下呢,不可能没有的啊,要不怎么会写进去呢:) 有逻辑笔吗用这个试试 good luck |
|
14楼#
发布于:2004-11-26 14:17
谢谢!
不好意思,信号串的电阻虚焊,第一次做wince驱动,说实话挺狼狈的,而且觉得支持不是很好,多亏了这个网,还有网上热心的朋友, 以后有问题还要不耻下问哦。 有空到深圳请你吃饭,喝咖啡。 下午不想上班了,准备出去玩玩。 再次感谢! |
|
论坛版主
|
15楼#
发布于:2004-11-26 15:59
哈哈哈哈哈,行,一定要不耻“下问”
哈哈,开个玩笑:) 那兄弟们就等下次到深圳找兄弟你了喔:) |
|
16楼#
发布于:2004-11-27 10:55
没问题,把mail留给我,把手机号给你。
再请教一下,4k对齐映射后的虚拟地址,应该不需要左移12bit把4k补齐吧,直接对映射后的地址操作或加个偏移量操作就行了吧?不知x86在这块的机制是怎样的? 谢谢! |
|
论坛版主
|
17楼#
发布于:2004-11-29 13:24
恩,映射后的地址直接用,偏移自己算就行,good luck
|
|