WINCE eboot和OS之间通过指定内存块传递数据的问题
eboot.bib和config.bib对此预留内存块的指定一致,如下所示:
ARGS 80020800 00000800 RESERVED
此内存块对应的结构体定义如下:
typedef struct {
OAL_ARGS_HEADER header;
UINT8 deviceId[16]; // Device identification
OAL_KITL_ARGS kitl;
UINT8 uuid[16];
BOOL bUpdateMode; // TRUE = Enter update mode on reboot.
BOOL bHiveCleanFlag; // TRUE = Clean hive at boot
BOOL bCleanBootFlag; // TRUE = Clear RAM, hive, user store at boot
BOOL bFormatPartFlag; // TRUE = Format partion when mounted at boot
DWORD nfsblk;
HANDLE g_SDCardDetectEvent; //kim
DWORD g_SDCardState ;
DWORD LcdTypeValue;
} BSP_ARGS, *PBSP_ARGS;
我想要的效果就是在eboot中根据显示屏的类型来设置LcdTypeValue变量,然后在电池驱动中读取此变量的值,可是不管eboot中怎么设置,在电池驱动中读取出来的都是0,下面进一步描述我的动作:
1.在eboot的OEMPlatformInit函数中做下面赋值的动作:
#define pBSPArgs ((BSP_ARGS *) IMAGE_SHARE_ARGS_UA_START)
pBSPArgs->LcdTypeValue = LcdType; (这里我设置为2)
2.在电池驱动的BatteryPDDGetStatus函数中读取此变量的值
BSP_ARGS *pArgs;
pArgs = (BSP_ARGS*)IMAGE_SHARE_ARGS_UA_START;
RETAILMSG(1, (TEXT("BatteryPDDGetStatus: pArgs->LcdTypeValue=%d\r\n"), pArgs->LcdTypeValue));
为什么一直输出的是0,麻烦大家帮忙看看并分享自己的理解,先谢谢了。
[解决办法]
在bootloader中,你访问的是物理地址,在OS中,访问的是虚拟地址,做下物理到虚拟地址的转换:
PHYSICAL_ADDRESS BspArgsPA = { IMAGE_SHARE_ARGS_PA_START, 0 };
g_pBspArgs = (BSP_ARGS *) MmMapIoSpace(BspArgsPA, sizeof(BSP_ARGS), FALSE);
[解决办法]
1楼的意思是,在EBOOT,NK的时候你要用物理地址去访问,到了驱动中你就得用虚拟地址去访问,这个虚拟地址是从物理地址映射过来的
[解决办法]
我的可以呀,eboot和驱动间可以正常的传输数据。
pBSPArgs = ((BSP_ARGS *)IMAGE_SHARE_ARGS_UA_START);
if(pBSPArgs->dwLCDType==LCD_MODULE_TD043){
这样就好
[解决办法]
通常KERNEL起來時, 會判斷 BSP_ARGS 的 signature, 若是不正確會將其 BSP_ARGS 清為0, 當然這跟 BSP 實作有關.
建議 LZ 在 OEMInit 結束之前, 將其值印出來看看正不正確.
Paul, Chao @ Techware