阅读:2641回复:27
关于寄存器访问的问题
各位老大,我现在对一个pci芯片的寄存器进行访问,这个芯片是内存映射的,我的访问方式是
pBuffer->length=(*(volatile UINT8 *)(cantemp->Baseaddress+Message15+Messagecon))>>DLC_Shift;这段地址我用VirtualCopy转换过了,参数是 PAGE_READWRITE |PAGE_NOCACHE|PAGE_PHYSICAL,现在的情况是当我访问一次的时候读出的数据是0xff或者0x00,只有多读几遍才可以正确的读出数据,但是我在调试的时候用pb带的看mem的窗口看就我的那段内存的数据就是正确的,不知道为什么我在程序中读这个内存的值就是错的, |
|
论坛版主
|
沙发#
发布于:2004-12-10 14:19
你在用virtualcoyp之前给的那个地址是不是给成可cache的了
|
|
板凳#
发布于:2004-12-10 14:30
老大,我的语句如下:
pDevDesc->adwMemBase[dwIndex] =(DWORD) VirtualAlloc( 0,pDevDesc->Info.Window.memWindows[dwIndex].dwLen, MEM_RESERVE, PAGE_NOACCESS ); if( !pDevDesc->adwMemBase[dwIndex] ) { DEBUGMSG(ZONE_INIT | ZONE_ERROR, (TEXT("*MapCard() Error allocating ressources for %d\n\r"), dwIndex)); goto Exit; } // map ressources bRes = VirtualCopy( (LPVOID)pDevDesc->adwMemBase[dwIndex], (LPVOID)((pDevDesc->Info.Window.memWindows[dwIndex].dwBase)>>8), pDevDesc->Info.Window.memWindows[dwIndex].dwLen, PAGE_READWRITE |PAGE_NOCACHE|PAGE_PHYSICAL ); |
|
论坛版主
|
地板#
发布于:2004-12-10 14:39
pDevDesc->Info.Window.memWindows[dwIndex].dwBase这个值是多少?应该大于0xa0000000的喔,不要用物理地址,你需要明确指定成不可cache的ce内核地址
|
|
地下室#
发布于:2004-12-10 14:52
不要用物理地址,你需要明确指定成不可cache的ce内核地址 ?? 什么意思。老大我的这个东西很急,麻烦你多看看
|
|
5楼#
发布于:2004-12-10 15:00
而且为什么用pb带的那个看内存的工具就可以看见我那个地址的值,而且还是正确的,我的虚拟地址是0x00200000,物理地址是0xe8000000
|
|
论坛版主
|
6楼#
发布于:2004-12-10 15:04
:)慌啥子嘛,慢慢来三,革命马上就要成功了
用0xe8000000你在映射的时候不要指定PAGE_PHYSICAL ,也不用〉〉8 |
|
7楼#
发布于:2004-12-10 15:08
但是我看ce的说明里说这个这么写也可以呀,我试试
|
|
8楼#
发布于:2004-12-10 15:30
老大,我改完后pDevDesc->adwMemBase[dwIndex],用变吗
|
|
9楼#
发布于:2004-12-10 15:33
怎么寄存器的值都没有反映了
|
|
10楼#
发布于:2004-12-10 16:02
老大,不对呀我的那段虚拟内存都是0xff了
|
|
11楼#
发布于:2004-12-10 16:36
老大,我换成了 bRes = VirtualCopy( (LPVOID)pDevDesc->adwMemBase[dwIndex],
(LPVOID)(pDevDesc->Info.Window.memWindows[dwIndex].dwBase), pDevDesc->Info.Window.memWindows[dwIndex].dwLen,PAGE_READWRITE | PAGE_NOCACHE );但是这个虚拟内存里的东西都是0xff了,不对了 |
|
论坛版主
|
12楼#
发布于:2004-12-10 17:05
:),好像有点儿不对,你的物理地址多少?0xe8000000?这个地址有问题,超过范围了喔,你的这个地址怎么来的?这段是你的芯片内部寄存器地址?你的芯片手册上是多少?看看
|
|
13楼#
发布于:2004-12-10 17:14
老大,我是pci设备,cpu是x86,0xe8000000是我的bios分配的
|
|
论坛版主
|
14楼#
发布于:2004-12-10 17:17
你需要找到你所使用的物理地址对应的ce内核不可缓存虚拟地址,然后映射的时候用ce内核不可缓存虚拟地址来做,你可以找bsp里面的OEMAddressTable表来确定这个对应关系.
|
|
论坛版主
|
15楼#
发布于:2004-12-10 17:26
哇,没看到这句,你用的是这个地址是pci使用的内存空间,还是pci总线空间
|
|
论坛版主
|
16楼#
发布于:2004-12-10 17:32
好像应该是mem中的位置:),你刚说你用pb看了,那用MmMapIoSpace来映射
|
|
17楼#
发布于:2004-12-10 17:35
好像应该是mem中的位置,老大这是什么意思,还有我现在的空间不是io空间,所以我没有用MmMapIoSpace函数,我的这个地址是真正的mem地址,我的表达不是很好,也不知道你能明白吗
|
|
论坛版主
|
18楼#
发布于:2004-12-10 17:45
MmMapIoSpace这个不是指用来映射i/o空间的的意思,这个和HalTranslateBusAddress一起用来映射总线空间到虚拟mem空间,你的作了第一步,现在用MmMapIoSpace映射一次就行了。你试试
|
|
19楼#
发布于:2004-12-11 10:28
老大,我现在是用 pDevDesc->adwMemBase[dwIndex] =(DWORD) VirtualAlloc( 0,pDevDesc->Info.Window.memWindows[dwIndex].dwLen, MEM_RESERVE, PAGE_NOACCESS );和VirtualCopy( (LPVOID)pDevDesc->adwMemBase[dwIndex],
(LPVOID)((pDevDesc->Info.Window.memWindows[dwIndex].dwBase)>>8), pDevDesc->Info.Window.memWindows[dwIndex].dwLen, PAGE_READWRITE |PAGE_NOCACHE|PAGE_PHYSICAL );来映射我的pci内存地址,也是可以访问我的寄存器的,我有一个情况没有说就是我的pci设备接的串口和can控制器,串口寄存器访问正常,can的一部分寄存器访问就出现上面我说的情况 |
|
上一页
下一页