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******的形式就行了