Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}