读书人

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

发布时间: 2013-03-22 09:49:50 作者: rapoo

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=—PM_MEMORY *)ioremap(0xe3001c00,290);//0xe3001c00为所要映射的结构体的起始地址。
经过这样的映射后tDpm[0].ptDpmMsg结构体中所有的变量,是不是已经成为了虚拟地址,可以直接操作了呢?

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

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


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

读书人网 >驱动开发

热点推荐