u32 nv_writeEx(u32 modem_id,u32 itemid,u32 offset,u8* pdata,u32 datalen) { u32 ret = NV_ERROR; struct nv_file_list_info_stru file_info = {0}; struct nv_ref_data_info_stru ref_info = {0}; if((NULL == pdata)||(0 == datalen)) { ret = BSP_ERR_NV_INVALID_PARAM; goto nv_writeEx_err; } ret = nv_search_byid(itemid,(u8*)NV_GLOBAL_CTRL_INFO_ADDR,&ref_info,&file_info); if(ret) { goto nv_writeEx_err; } if((datalen + offset) >ref_info.nv_len) { ret = BSP_ERR_NV_ITEM_LEN_ERR; goto nv_writeEx_err; } if(modem_id <= ref_info.modem_num) { ref_info.nv_off += (modem_id - NV_USIMM_CARD_1)*ref_info.nv_len; } else { ret = BSP_ERR_NV_INVALID_PARAM; goto nv_writeEx_err; } ret = nv_write_to_mem(pdata,datalen,file_info.file_id,ref_info.nv_off+offset); if(ret) { goto nv_writeEx_err; } ret = nv_write_to_file(&ref_info); if(ret) { goto nv_writeEx_err; } return NV_OK; nv_writeEx_err: return ret; }
u32 nv_writeEx(u32 modem_id,u32 itemid,u32 offset,u8* pdata,u32 datalen) { u32 ret = NV_ERROR; struct nv_file_list_info_stru file_info = {0}; struct nv_ref_data_info_stru ref_info = {0}; struct nv_global_ddr_info_stru* ddr_info = (struct nv_global_ddr_info_stru*)NV_GLOBAL_INFO_ADDR; u32 nv_offset = 0;/*nv数据相对于ctrl start的偏移*/ nv_debug(NV_FUN_WRITE_EX,0,itemid,modem_id,datalen); if((NULL == pdata)||(0 == datalen)) { nv_debug(NV_FUN_WRITE_EX,1,itemid,datalen,0); ret = BSP_ERR_NV_INVALID_PARAM; /*lint -save -e801*/ goto nv_writeEx_err; /*lint -restore*/ } ret = nv_search_byid(itemid,(u8*)NV_GLOBAL_CTRL_INFO_ADDR,&ref_info,&file_info); if(ret) { nv_debug(NV_FUN_WRITE_EX,2,itemid,datalen,ret); return BSP_ERR_NV_NO_THIS_ID; } /*lint -save -e578 -e530 -e515 -e516*/ nv_debug_trace(pdata, datalen); /*lint -restore*/ if((datalen + offset) >ref_info.nv_len) { ret = BSP_ERR_NV_ITEM_LEN_ERR; nv_debug(NV_FUN_WRITE_EX,3,itemid,datalen,ref_info.nv_len); /*lint -save -e801*/ goto nv_writeEx_err; /*lint -restore*/ } if(modem_id <= ref_info.modem_num) { ref_info.nv_off += (modem_id - NV_USIMM_CARD_1)*ref_info.nv_len; } else { #if (FEATURE_OFF == FEATURE_MULTI_MODEM) ret = BSP_ERR_NV_INVALID_PARAM; nv_debug(NV_FUN_WRITE_EX,4,itemid,ret,modem_id); /*lint -save -e801*/ goto nv_writeEx_err; /*lint -restore*/ #endif } nv_offset = ddr_info->file_info[file_info.file_id - 1].offset+offset+ref_info.nv_off; /*IPC锁保护,防止在校验CRC时写NV 操作还没有完成*/ nv_ipc_sem_take(IPC_SEM_NV_CRC, IPC_SME_TIME_OUT); ret = nv_check_nv_data_crc(nv_offset, datalen); nv_ipc_sem_give(IPC_SEM_NV_CRC); if(ret) { nv_debug(NV_FUN_WRITE_EX,5,itemid,datalen,0); ret = nv_resume_ddr_from_img(); if(ret) { nv_debug(NV_FUN_WRITE_EX,6,itemid,datalen,ret); /*lint -save -e801*/ goto nv_writeEx_err; /*lint -restore*/ } } ret = nv_write_to_mem(pdata,datalen,file_info.file_id,ref_info.nv_off+offset); if(ret) { nv_debug(NV_FUN_WRITE_EX,7,itemid,datalen,0); /*lint -save -e801*/ goto nv_writeEx_err; /*lint -restore*/ } ret = nv_write_to_file(&ref_info); if(ret) { nv_debug(NV_FUN_WRITE_EX,8, itemid,datalen,ret); /*lint -save -e801*/ goto nv_writeEx_err; /*lint -restore*/ } nv_AddListNode(itemid); return NV_OK; nv_writeEx_err: /*lint -save -e515 -e516*/ printf_nv("\n[%s]:[0x%x]:[%d]\n",__FUNCTION__,itemid,modem_id); /*lint -restore*/ nv_help(NV_FUN_WRITE_EX); return ret; }