degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:2641回复:27

关于寄存器访问的问题

楼主#
更多 发布于:2004-12-10 11:55
各位老大,我现在对一个pci芯片的寄存器进行访问,这个芯片是内存映射的,我的访问方式是
 pBuffer->length=(*(volatile UINT8 *)(cantemp->Baseaddress+Message15+Messagecon))>>DLC_Shift;这段地址我用VirtualCopy转换过了,参数是   PAGE_READWRITE |PAGE_NOCACHE|PAGE_PHYSICAL,现在的情况是当我访问一次的时候读出的数据是0xff或者0x00,只有多读几遍才可以正确的读出数据,但是我在调试的时候用pb带的看mem的窗口看就我的那段内存的数据就是正确的,不知道为什么我在程序中读这个内存的值就是错的,
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-10 14:19
你在用virtualcoyp之前给的那个地址是不是给成可cache的了
根据地的兄弟们,团结就是力量
degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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 );
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-10 14:39
pDevDesc->Info.Window.memWindows[dwIndex].dwBase这个值是多少?应该大于0xa0000000的喔,不要用物理地址,你需要明确指定成不可cache的ce内核地址
根据地的兄弟们,团结就是力量
degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-12-10 14:52
不要用物理地址,你需要明确指定成不可cache的ce内核地址 ?? 什么意思。老大我的这个东西很急,麻烦你多看看
degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-12-10 15:00
而且为什么用pb带的那个看内存的工具就可以看见我那个地址的值,而且还是正确的,我的虚拟地址是0x00200000,物理地址是0xe8000000
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-12-10 15:04
:)慌啥子嘛,慢慢来三,革命马上就要成功了

用0xe8000000你在映射的时候不要指定PAGE_PHYSICAL ,也不用〉〉8
根据地的兄弟们,团结就是力量
degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-12-10 15:08
但是我看ce的说明里说这个这么写也可以呀,我试试
degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-12-10 15:30
老大,我改完后pDevDesc->adwMemBase[dwIndex],用变吗
degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-12-10 15:33
怎么寄存器的值都没有反映了
degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-12-10 16:02
老大,不对呀我的那段虚拟内存都是0xff了
degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
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了,不对了
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-12-10 17:05
:),好像有点儿不对,你的物理地址多少?0xe8000000?这个地址有问题,超过范围了喔,你的这个地址怎么来的?这段是你的芯片内部寄存器地址?你的芯片手册上是多少?看看
根据地的兄弟们,团结就是力量
degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-12-10 17:14
老大,我是pci设备,cpu是x86,0xe8000000是我的bios分配的
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-12-10 17:17
你需要找到你所使用的物理地址对应的ce内核不可缓存虚拟地址,然后映射的时候用ce内核不可缓存虚拟地址来做,你可以找bsp里面的OEMAddressTable表来确定这个对应关系.
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-12-10 17:26
哇,没看到这句,你用的是这个地址是pci使用的内存空间,还是pci总线空间
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-12-10 17:32
好像应该是mem中的位置:),你刚说你用pb看了,那用MmMapIoSpace来映射
根据地的兄弟们,团结就是力量
degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-12-10 17:35
好像应该是mem中的位置,老大这是什么意思,还有我现在的空间不是io空间,所以我没有用MmMapIoSpace函数,我的这个地址是真正的mem地址,我的表达不是很好,也不知道你能明白吗
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-12-10 17:45
MmMapIoSpace这个不是指用来映射i/o空间的的意思,这个和HalTranslateBusAddress一起用来映射总线空间到虚拟mem空间,你的作了第一步,现在用MmMapIoSpace映射一次就行了。你试试
根据地的兄弟们,团结就是力量
degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
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的一部分寄存器访问就出现上面我说的情况
上一页
游客

返回顶部