1. 获取UUID的方法
同一个APP,调用GetDeviceUniqueId()获取UUID,传递的应用参数一样。
调用GetDeviceUniqueID(),最后会调用到底层的OALIoCtlHalGetDeviceInfo()--->GetUUID()--->OALArgsQuery(OAL_ARGS_QUERY_UUID)
在OALArgsQuery函数中把下面的值传递出去
pData = &pArgs->uuid;
pArgs->uuid指向的值在OEMInit()函数中会调用OALArgsInit((BSP_ARGS*) IMAGE_SHARE_ARGS_UA_START)函数来初始化化,代码如下:
VOID OALArgsInit(BSP_ARGS* pArgs) { OALMSG(1,(TEXT("+OALArgsInit()\r\n"))); // Check the BSP Args area // if (pArgs->header.signature !=OAL_ARGS_SIGNATURE || pArgs->header.oalVersion != OAL_ARGS_VERSION || pArgs->header.bspVersion != BSP_ARGS_VERSION) { S3C2450_IOPORT_REG *v_IOPRegs; DWORD count, code, j; UCHAR d; // Zero out the current contents of the structure memset(pArgs, 0, sizeof(BSP_ARGS)); // Setup header pArgs->header.signature = OAL_ARGS_SIGNATURE; pArgs->header.oalVersion = OAL_ARGS_VERSION; pArgs->header.bspVersion = BSP_ARGS_VERSION; //Set-up dummy uuid for SMDK2450. Actually, uuid can be acquired fromNAND id. pArgs->uuid[0] = (UCHAR)0x00; pArgs->uuid[1] = (UCHAR)0x11; pArgs->uuid[2] = (UCHAR)0x22; pArgs->uuid[3] = (UCHAR)0x33; pArgs->uuid[4] = (UCHAR)0x44; pArgs->uuid[5] = (UCHAR)0x55; pArgs->uuid[6] = (UCHAR)0x66; pArgs->uuid[7] = (UCHAR)0x77; pArgs->uuid[8] = (UCHAR)0x88; pArgs->uuid[9] = (UCHAR)0x99; pArgs->uuid[10] = (UCHAR)0xaa; pArgs->uuid[11] = (UCHAR)0xbb; pArgs->uuid[12] = (UCHAR)0xcc; pArgs->uuid[13] = (UCHAR)0xdd; pArgs->uuid[14] = (UCHAR)0xee; pArgs->uuid[15] = (UCHAR)0xff; ……….. // Can Add code for cleanboot, hiveclean, formatpartion OALMSG(1,(TEXT("Arguments area is initialized.\r\n"))); } else { RETAILMSG(1,(TEXT("Arguments area has some values.\r\n"))); } OALMSG(1,(TEXT("-OALArgsInit()\r\n"))); return; }
2. GetDeviceUniqueId()获取的UUID不一样
客户要求我们采用CPU为S3C2451的设备调用GetDeviceUniqueId()获取的ID是一样的,现在我们这个设备做了升级,改为采用飞思卡尔的CPU I.MX515,他们也要求升级后的设备取出的ID和S3C2451的一样。
S3C2451和I.MX515上面的实现是一样的,但实际上S3C2451平台下读取出来的是C26….,在I.MX515平台上读出来的是8f9…,
3. 问题的解决
后来一时找不到原因,就在各自平台的OALArgsQuery()打印uuid的值,发现S3C2451的都是0,但I.MX515平台上的却不全是,下面的信息是I.MX515平台的。
OALArgsQuery() pArgs->uuid[0]=0x0 OALArgsQuery() pArgs->uuid[1]=0x0 OALArgsQuery() pArgs->uuid[2]=0x0 OALArgsQuery() pArgs->uuid[3]=0x0 OALArgsQuery() pArgs->uuid[4]=0x0 OALArgsQuery() pArgs->uuid[5]=0x0 OALArgsQuery() pArgs->uuid[6]=0x0 OALArgsQuery() pArgs->uuid[7]=0x0 OALArgsQuery() pArgs->uuid[8]=0x0 OALArgsQuery() pArgs->uuid[9]=0x0 OALArgsQuery() pArgs->uuid[10]=0x0 OALArgsQuery() pArgs->uuid[11]=0x1 OALArgsQuery() pArgs->uuid[12]=0x8 OALArgsQuery() pArgs->uuid[13]=0x0 OALArgsQuery() pArgs->uuid[14]=0x8 OALArgsQuery() pArgs->uuid[15]=0x48
但是查看了整个BSP并没有看到有对uuid做这些初始化,为什么会有这不同的值呢?暂时还没有找出原因,
另外我们要注意,OALArgsInit()函数要对uuid做初始化,是要满足下面的条件,而这个就要注意在不同平台下的eboot或是OAL部分的设置了。
if (pArgs->header.signature != OAL_ARGS_SIGNATURE || pArgs->header.oalVersion != OAL_ARGS_VERSION || pArgs->header.bspVersion != BSP_ARGS_VERSION)
但为了解决这个问题,我在两个平台的代码中都重新初始化为0x00,如下:
for(i=0; i<16; i++) { pArgs->uuid[i]= (UCHAR)0x00; }
这样就确保调用GetDeviceUniqueId()在两个平台上获取UUID一样的问题了。