首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

iore地图映射结构体的有关问题,求教

2013-03-22 
ioremap映射结构体的问题,求教typedef struct tagMSG_STRUC {U8rxU8txU8lnU8nrU8aU8fU8bU8eU8d[28

ioremap映射结构体的问题,求教
typedef struct tagMSG_STRUC {
  U8   rx;
  U8   tx;
  U8   ln;
  U8   nr;
  U8   a;
  U8   f;
  U8   b;
  U8   e;
  U8   d[280];             
} MSG_STRUC;

typedef struct tagDPM_MEMORY {

   MSG_STRUC     tDevMbx;   /* Mailbox PC  --> DEV           (288 Bytes)*/
   U8 HostFlags;            /* DPM communication DEV->PC(PcFlags) (  1 Byte )*/
   U8 DevFlags;             /* DPM communication PC->DEV(CifFlags)(  1 Byte )*/

} DPM_MEMORY;

typedef struct tagDPM_DEFINITION
{
  U8   *pabDpmBase;         /* Base address of the DPM                       */
  U8   *pabSendPData;       /* Mailbox for send process data                 */
  U8   *pabReceivePData;    /* Mailbox for receive process data              */
  DPM_MEMORY     *ptDpmMsg;   /* Highest 1kByte of the DPM              */
  U8   bInitFlag;           /* Init flag                                     */
  U16  usDpmSize;           /* DPM size in bytes                             */
  U16  usIOSize;            /* Size of the process datas in bytes            */
} DPM_DEFINITION;

static  DPM_DEFINITION  tDpm[1];

如果进行下述的映射:
tDpm[0].ptDpmMsg=(DPM_MEMORY *)ioremap(0xe3001c00,290);//0xe3001c00为所要映射的结构体的起始地址。
经过这样的映射后tDpm[0].ptDpmMsg结构体中所有的变量,是不是已经成为了虚拟地址,可以直接操作了呢?

说明:上面的结构体内的变量,都是外设的寄存器。

[解决办法]
不一定,如果你的结构体大小不超过290,就可以,超过的部分无法访问
[解决办法]
顶一个!!!求更多的讨论!!学习中!!!
[解决办法]
ioremap(0xe3001c00,290)
发现个问题,你这个起始地址不是物理地址吧。
------解决方案--------------------


0xe3001c00这个地址如果是某个设备的寄存器的起始地址,那么剩余290B的连续的寄存器都可以访问到了,但是应该写成virtual-baseaddr=ioremap(*,*)的形式,ioremap返回映射后的虚拟起始地址,要访问某个寄存器直接*(virtual-baseadd+offset)=0x******的形式就行了

热点排行