raiky_wu
驱动牛犊
驱动牛犊
  • 注册日期2004-04-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1287回复:4

急地要命 地址绑定问题

楼主#
更多 发布于:2004-09-14 14:46
现在做一个驱动,用I2C传输数据,但是I2C的物理地址却不能映射到虚拟空间,哪位大侠帮我看看
pI2CReg=NULL;

bainit(
I2C_REGS *pI2CReg
)
{



            if(!(pI2CReg=(volatile I2C_REGS *)VirtualAllol(0,0x1000,
            MEM_RESERVE,PAGE_NOACCESS)))
{
RETAILMSG(1, (TEXT("VirtualAlloc() failed!\r\n")) );

}
else
{
if(!VirtualCopy((PVOID)pI2CReg,(PVOID)                                            I2C_BASE_U_VIRTUAL,0x1000,PAGE_READWRITE|PAGE_NOCACHE))  

           {

           VirtualFree((PVOID)pI2CReg, 0, MEM_RELEASE);
           pI2CReg = NULL;
         RETAILMSG(1, (TEXT("VirtualCopy() failed!\r\n")) );        
                     }
                else
            {
         RETAILMSG(1, (TEXT("VirtualCopy() succeed!\r\n")));

           }
.........  



}
文提出在什么地方???
ziyun
驱动小牛
驱动小牛
  • 注册日期2003-07-28
  • 最后登录2009-05-31
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望109点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-09-14 18:40
你用的什么平台,如果是arm,使用virtualalloccopy函数试试看,而且你也没说出有什么问题啊
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-09-14 22:44
你是想在函数内映射然后返回后用I2C_REGS *pI2CReg来访问?如果是的话传进去的参数应该是I2C_REGS* *pI2CReg
赋值的时候用*pI2CReg = .....然后返回。
根据地的兄弟们,团结就是力量
raiky_wu
驱动牛犊
驱动牛犊
  • 注册日期2004-04-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-09-15 11:14
问题解决了,用virtualallocCopy实现了
我用的是arm41,这有什么关系吗?
wxl_50685330 说用到指针的指针 有这么复杂吗 我记得你在另外一个贴字上发的那个函数示例中也没有说用到指针的指针呀
 
 发表于: 2004/9/10 - 05:52
PVOID MyVirtualMap(PVOID PhyMem, UINT32 size)
{
PVOID pVirtualAddr;
pVirtualAddr = VirtualAlloc( 0, size, MEM_RESERVE, PAGE_NOACCESS );

if(pVirtualAddr == NULL)
{
RETAILMSG(1,(TEXT("MyVirtualMap : pVirtualAddr is not allocatednr")));
return NULL;
}

if( !VirtualCopy(pVirtualAddr, PhyMem, size, PAGE_READWRITE | PAGE_NOCACHE ) )
{
RETAILMSG(1, (TEXT("MyVirtualMap : pVirtualAddr is not mappednr")));
VirtualFree((PVOID)pVirtualAddr, 0, MEM_RELEASE);
return NULL;
}

return pVirtualAddr;
}

用这个函数,把物理地址映射到徐虚拟地址,你给出你要映射的物理地址首址,和大小,返回一个可用的虚拟地址给你的驱动。




 
 
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-09-15 13:16
:)我是把指针作为返回值了
根据地的兄弟们,团结就是力量
游客

返回顶部