int bsp_sci_cfg_init(void)
{
    unsigned int i = 0;
    unsigned int init_func_num;
    /* coverity[assign] */
    int *p_init_start = (int *)&_sci_init_data_start;
    int call_addr;
    NV_SCI_CFG_UNION nv_sci;
    SCI_INIT_FUNCP p_func_sci_init;
    int card_type = 0;
#if (FEATURE_ON == FEATURE_MULTI_MODEM)
    /*读取NV_SCI的值*/
    (void)bsp_sci_get_nv(&nv_sci.value);
#else
    nv_sci.value = g_SciNVValue;
#endif
    /*解析NV_SCI*/
    if (BSP_ERROR == bsp_sci_parse_nv(&nv_sci)) 
	{
		sci_print_error("parse nv failed!\n");
        return BSP_ERROR;
    }
    init_func_num = &_sci_init_data_end - &_sci_init_data_start;

    card_type = ((NV_SCI_CFG_UNION *)&g_SciNVValue)->cfg.card_num; 
    if(SCI_SINGLE == card_type)
    {
        init_func_num= 1;
    }
    else if (SCI_SINGLE_MODLEM1 == card_type)
    {
         init_func_num= 1;
         /* coverity[ptr_arith] */
         p_init_start++;
    }
    
    sci_print_debug("init_func_num %d  start_add_opp 0x%0x\r\n", init_func_num,(p_init_start-(int*)&_sci_init_data_start));
        
    /*调用SCI的初始化*/
    for (i = 0; i < init_func_num; i++) 
	{
        call_addr = *(volatile int *)p_init_start;
        p_func_sci_init = (SCI_INIT_FUNCP)call_addr;
        sci_print_debug("call init function of card%d, address is 0x%x\r\n",i, call_addr);
        p_func_sci_init();
        /* coverity[ptr_arith] */
        p_init_start++;
    }

    return BSP_OK;
}
/*****************************************************************************
 函 数 名  : bsp_sci_get_nv
 功能描述  : 获取SCI的NV项值
 输入参数  : 
 输出参数  : 无
 返 回 值  : int
 调用函数  :
 被调函数  :

 修改历史      :

*****************************************************************************/
int bsp_sci_get_nv(unsigned int *value)
{
    /*调用NV读接口*/
    if(BSP_OK == bsp_nvm_read(NV_ID_DRV_SCI_DSDA_SELECT, (u8*)&g_SciNVValue, NV_SCI_LEN)) 
    {
#if (FEATURE_ON==FEATURE_MULTI_MODEM)
        if(0x802 !=g_SciNVValue && 0x102 !=g_SciNVValue)
        {
            g_SciNVValue = 0x802;
        }
#endif
        /*读取成功*/
        *value = g_SciNVValue;
        
        sci_print_debug("nv value:0x%x\r\n",g_SciNVValue);
        return BSP_OK;
    }
    else 
	{
#if (FEATURE_ON==FEATURE_MULTI_MODEM)
        *value = 0x802;
#else 
        /*读取失败,默认是单卡0*/
        *value = 0x0;
#endif
        sci_print_error("default value is 0x%x\r\n", 0);
        return BSP_ERROR;
    }
    
}
int bsp_sci_get_nv(unsigned int *value)
{
    /*调用NV读接口*/
    if(BSP_OK == bsp_nvm_read(NV_ID_DRV_SCI_DSDA_SELECT, (u8*)&g_SciNVValue, NV_SCI_LEN)) 
    {
        bsp_sci_set_default_nv();

        /*读取成功*/
        *value = g_SciNVValue;  
        sci_print_debug("nv value:0x%x\r\n",g_SciNVValue);
        return BSP_OK;
    }
    else 
	{    
	    *value = g_SciNVValue;
        sci_print("read nv error use default val %x\n",g_SciNVValue);
        return BSP_ERROR;
    }
    
}
int bsp_sci_parse_nv(NV_SCI_CFG_UNION * nv)
{
    NV_SCI_CFG_UNION *p_nv_sci = nv;

    if (SCI_SINGLE == p_nv_sci->cfg.card_num) 
	{
        /*单卡0场景*/
        if (p_nv_sci->cfg.card0 <= CARD_CONNECT_SCI1) 
        {
            sci_print_debug("card0 connect sci%d\r\n",p_nv_sci->cfg.card0);
            if(BSP_OK != bsp_sci_cfg(CARD0, p_nv_sci->cfg.card0))
            {
            	sci_print_error("cfg sci%d failed! \r\n",p_nv_sci->cfg.card0);
				return BSP_ERROR;
			}
        }
        else 
		{
            /*暂不支持多卡*/
			sci_print_error("do not support multi card! case 1\n");
            return ERROR;
        }
    }
    else if(SCI_SINGLE_MODLEM1 == p_nv_sci->cfg.card_num)
    { /*单卡1场景*/
        if (p_nv_sci->cfg.card1 <= CARD_CONNECT_SCI1) 
        {
            sci_print_debug("SCI_SINGLE_MODLEM1  connect sci%d\r\n",p_nv_sci->cfg.card1);
			if(BSP_OK != bsp_sci_cfg(CARD1, p_nv_sci->cfg.card1))
            {
            	sci_print_error("cfg sci%d failed! \r\n",p_nv_sci->cfg.card1);
				return BSP_ERROR;
			}
        }
        else 
		{
            /*暂不支持多卡*/
			sci_print_error("do not support multi card! case 2\n");
            return ERROR;
        }
    }
    else if (SCI_DUAL == p_nv_sci->cfg.card_num) 
    {
        /*双卡场景*/
        if ((p_nv_sci->cfg.card0 <= CARD_CONNECT_SCI1) &&
            (p_nv_sci->cfg.card1 <= CARD_CONNECT_SCI1) &&
            (p_nv_sci->cfg.card0 != p_nv_sci->cfg.card1)) 
        {
            sci_print_debug("dual cards, card0 connect sci%d,card1 connect sci%d\r\n",p_nv_sci->cfg.card0, p_nv_sci->cfg.card1);
			if(BSP_OK != bsp_sci_cfg(CARD0, p_nv_sci->cfg.card0))
            {
            	sci_print_error("bsp_sci_parse_nv, total cfg sci%d failed! \r\n",p_nv_sci->cfg.card0);
				return BSP_ERROR;
			}
			if(BSP_OK != bsp_sci_cfg(CARD1, p_nv_sci->cfg.card1))
            {
            	sci_print_error(" total cfg sci%d failed! \r\n",p_nv_sci->cfg.card1);
				return BSP_ERROR;
			}
        }
        else 
		{
            /*暂不支持多卡*/
			sci_print_error("do not support multi card! case 3\n");
            return BSP_ERROR;
        }
    }
    else 
	{
        /*暂不支持多卡*/
		sci_print_error(" do not support multi card! case 4\n");
        return BSP_ERROR;
    }

    return BSP_OK;
}