当前位置: 代码迷 >> WinCE >> WINCE eboot和OS之间通过指定内存块传递数据的有关问题
  详细解决方案

WINCE eboot和OS之间通过指定内存块传递数据的有关问题

热度:70   发布时间:2016-04-28 12:58:34.0
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
  相关解决方案