예제 #1
0
/*****************************************************************************
* 函 数 名  : bsp_efuse_Write
*
* 功能描述  : 烧写Efsue
*
* 输入参数  : pBuf:待烧写的EFUSE值
*                 group,Efuse地址偏移
*                 len,烧写长度
* 输出参数  :
*
* 返 回 值  :
*
* 其它说明  :
*
*****************************************************************************/
int bsp_efuse_write( u32 *pBuf, const u32 group, const u32 len)
{
    int length = 0;
    u32 chan_id = ICC_CHN_IFC << 16 | IFC_RECV_FUNC_EFUSE;
    EFUSE_DATA_STRU msg ;

    if((0 == len) || (group + len > EFUSE_MAX_SIZE) || (NULL == pBuf))
    {
        efuse_print_error(" parameter error, group=%d, len=%d, pBuf=0x%x.\n", group, len, pBuf);
        return EFUSE_ERROR;
    }

    memcpy(msg.buf, pBuf, EFUSE_GROUP_SIZE * len);
    msg.start = group;
    msg.len = len;
    msg.opt = (u32)EFUSE_WRITE;

    osl_sem_down(&efuse_queue_sem_id);
    length = bsp_icc_send(ICC_CPU_APP, chan_id, (unsigned char*)&msg, sizeof(EFUSE_DATA_STRU));
    if((unsigned int)length != sizeof(EFUSE_DATA_STRU))
    {
        osl_sem_up(&efuse_queue_sem_id);
        efuse_print_error("send len(%x) != expected len(%x).\n", length, sizeof(EFUSE_DATA_STRU));
        return EFUSE_ERROR;
    }

    /* coverity[lock] */
    osl_sem_down(&efuse_sem_id);

    if(0 != efuse_ret)
    {
        osl_sem_up(&efuse_queue_sem_id);
        efuse_print_error("efuse icc write is fail, err= %d.\n", efuse_ret);
        /* coverity[missing_unlock] */
        return EFUSE_ERROR;
    }

    osl_sem_up(&efuse_queue_sem_id);
    /* coverity[missing_unlock] */
    return EFUSE_OK;
}
/*****************************************************************************
 函数    : bsp_fem_power_up
 功能    : RF 上电打桩
 输入    : 无
 输出    : 无
 返回    : rf电源开关状态
*****************************************************************************/
int bsp_fem_power_up(PWC_COMM_MODE_E mode, PWC_COMM_MODEM_E modem, PWC_COMM_CHANNEL_E chn)
{
    int ret = 0;

    osl_sem_down(&rf_pwr_sem[SEM_FEM]);

    ret = balong_fem_power_on(mode, modem, chn);

    osl_sem_up(&rf_pwr_sem[SEM_FEM]);

    return ret;
}
int bsp_om_buf_sem_take(void)
{
    if(g_bsp_om_socp_chan_info.init_state == BSP_OM_SOCP_CHAN_INIT_SUCC)
    {
        osl_sem_down(&om_buf_sem);
    }
    else
    {
        return -1;
    }

    return BSP_OK;

}
/*******************************************************************************
* 函 数 名      : cshell_send_thread
*
* 功能描述  : cshell A核至PC核发送线程
*
* 输入参数  : 无
*
* 输出参数  : 无
*
* 返 回 值  : 无
*
*******************************************************************************/
int cshell_send_thread(void *arg)
{
    cshell_ctx_t*        cshell_ctx      = &g_cshell_ctx;
    cshell_mem_handle_t* cshell_send_mem = &cshell_ctx->send_mem[0];
    int                  ret             = (int) CSHELL_OK;


    printk("A:cshell_send_thread enter\n");

    /* coverity[no_escape] */
    while (1)
    {
        osl_sem_down(&(cshell_ctx->cshell_send_sem));
        /* 读buffer中有数据或者发送buffer中有剩余数据 */
        while ((cshell_send_mem->buf_valid) && (cshell_send_mem->buf_size))
        {
            cshell_send_mem->buf_valid = 0;

            /* 数据复制到USB打印buffer中 */
            if(cshell_get_bit(USB_CSHELL) && (cshell_ctx->cshell_acm_fd != 0))
            {
                write_data_usb_buf(cshell_send_mem);
            }
            (void)a_cshell_write((int)(cshell_send_mem->buf_size), cshell_send_mem->buf,(int)(cshell_send_mem->buf_size), 1);
            if(cshell_get_bit(AUART_CSHELL))
            {
                print_to_auart(cshell_send_mem);
            }

            ret = (int)cshell_send_mem->buf_size;
            if(ret >= 0)
            {
                /* 当前处理的buffer为正在写的buffer,则开始使用下一个buffer */
                if (cshell_ctx->cshell_send_index == cshell_send_mem->index)
                {
                    /* 考虑在此加锁保护 */
                    cshell_ctx->cshell_send_index = cshell_send_mem->next->index;
                }
                cshell_send_mem->buf_size = 0;
                cshell_send_mem->buf_valid = 1;
                cshell_send_mem = cshell_send_mem->next;
            }
            else
            {
                cshell_send_mem->buf_valid = 1;
                printk("A: cshell_send_thread send data to acm fail ret [%d],buf_size[%d]\n", ret,cshell_send_mem->buf_size);
            }
        }
    }
}
예제 #5
0
/*****************************************************************************
 函 数 名  : bsp_start_mode_get
 功能描述  : 用于C核获取开机模式,通过核间调用, 启动的时候不允许获取
 输入参数  :
 输出参数  : 无
 返 回 值  :
 调用函数  :
 被调函数  :
*****************************************************************************/
int  bsp_start_mode_get( void )
{
    int rt = 0;
    u32 channel_id = ICC_CHN_IFC << 16 | IFC_RECV_FUNC_ONOFF;
    DRV_START_MODE start_mode = DRV_START_MODE_NORMAL;
    stCtrlMsg msg = g_pwrctrl.curr;

    if(!g_pwrctrl.is_init)
        return start_mode;

    if (g_start_mode != (int)DRV_START_MODE_BUILT)
        return g_start_mode;

    msg.pwr_type = E_POWER_ON_MODE_GET;
    msg.mode = DRV_START_MODE_NORMAL;

    osl_sem_down(&(g_pwrctrl.pwr_sem));

    rt = bsp_icc_send(ICC_CPU_APP, channel_id, (u8*)&msg,
        sizeof(stCtrlMsg)); //lint !e40
    if(rt != (int)sizeof(stCtrlMsg))
    {
        osl_sem_up(&(g_pwrctrl.pwr_sem));
        bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_ONOFF,"[onoff]onoff icc send error, rt=0x%x\n", rt);
        return start_mode;
    }

    /*coverity[lock] */
    osl_sem_down(&g_sem_mode);

    start_mode = (DRV_START_MODE)g_start_mode;

    osl_sem_up(&(g_pwrctrl.pwr_sem));

    /*coverity[missing_unlock] */
    return start_mode;
}
int bsp_fem_power_down(PWC_COMM_MODE_E mode, PWC_COMM_MODEM_E modem, PWC_COMM_CHANNEL_E chn)
{
    int ret        = 0;

    osl_sem_down(&rf_pwr_sem[SEM_FEM]);

    ret = balong_fem_power_off(mode, modem, chn);
    if(ret){
        rf_print_error("rfic power down faild\n");
        ret = RFFE_ERROR;
    }

    osl_sem_up(&rf_pwr_sem[SEM_FEM]);

    return ret;
}
/*****************************************************************************
 函 数 名  : uart_send
 功能描述  : uart send
 输入参数  : UART_HW_PORT* uart_port
             BSP_U8 *pbuf
             BSP_U32 size
 输出参数  : 无
 返 回 值  : BSP_S32
*****************************************************************************/
int dual_modem_send_bytes(UART_PORT* uart_port,u8* pbuf,u32 size)
{
	u8 * pu8Buffer = NULL;
	u32  regval = 0;
	
    pu8Buffer = pbuf;
 
    osl_sem_down(&uart_port->send_mutex);	
	
	g_dm_dump_info->send_mutex_cnt++;
	g_dm_dump_info->tx_cur_size = size;
	g_dm_dump_info->tx_total_size += size;

	g_dm_dump_info->send_time_stamp = bsp_get_slice_value();
	if(g_dm_dump_info->tx_cur_offset + 4 > DUAL_DUMP_TX_BUFF_SIZE)
	{
		g_dm_dump_info->tx_cur_offset = 0;
	}
	(void)memcpy_s((void *)(g_dm_dump_info->tx_dump_addr + g_dm_dump_info->tx_cur_offset), sizeof(u32), 
		(void *)&g_dm_dump_info->send_time_stamp, sizeof(u32));
	g_dm_dump_info->tx_cur_offset += 4;

	if(g_dual_modem_ctrl.log_flag == 1)
	{	
		dm_debug_print("TxCurSize %d,TxTotalSize %d\n",g_dm_dump_info->tx_cur_size,g_dm_dump_info->tx_total_size);
		(void)dm_print_info(pu8Buffer ,size);	/* lint !e532 */
	}	
	while(size)
	{
		regval = readl(uart_port->base_addr+ UART_REGOFFSET_FR);
		if(0 == (regval & UART_FR_TX_FIFO_FULL))
    	{
			writel(*pu8Buffer, uart_port->base_addr + UART_REGOFFSET_THR);
			(void)memcpy_s((void *)(g_dm_dump_info->tx_dump_addr + g_dm_dump_info->tx_cur_offset), 1, (void *)pu8Buffer, 1);
			g_dm_dump_info->tx_cur_offset++;
			if(g_dm_dump_info->tx_cur_offset > DUAL_DUMP_TX_BUFF_SIZE)
			{
				g_dm_dump_info->tx_cur_offset = 0;
			}
			pu8Buffer++;
			size--;
      	}
	}
	
	osl_sem_up(&uart_port->send_mutex);
	return OK;
}
/*测试唤醒源软timer申请和加入链表重复10次,每次都在回调函数修改超时时间*/
s32 st_softtimer_test_case03(void)
{
	
	my_softtimer.func = for_softtimer_test_3;	
	my_softtimer.para = 2;
	my_softtimer.timeout = 10;
	my_softtimer.wake_type=SOFTTIMER_WAKE;
	osl_sem_init(0,&sem3);
	if (bsp_softtimer_create(&my_softtimer))
	{
		bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_SOFTTIMER,"create error\n");
		return ERROR;
	}
	bsp_softtimer_add(&my_softtimer);
	osl_sem_down(&sem3);
	osl_sema_delete(&sem3);
	return OK;
}
s32 k3_adp_test_case02(void)
{
    s32 ret = 0;
    osl_sem_init(SEM_EMPTY,&sem);
    ret = DRV_TIMER_START(TIMER_ACPU_OSA_ID,func,0,1000,0,TIMER_UNIT_MS);
    if(ret!=0)
    {
        bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_HARDTIMER,"DRV_TIMER_START fail\n");
        return ERROR;
    }
    osl_sem_down(&sem);
    ret = DRV_TIMER_STOP(TIMER_ACPU_OSA_ID);
    if(ret!=0)
    {
        bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_HARDTIMER,"DRV_TIMER_START fail\n");
        return ERROR;
    }
    osl_sema_delete(&sem);
    return OK;
}
int bsp_om_send_task(void * para)
{
    void* send_addr = 0;
    u32 buf_len = 0;
    u32 ret;

    osl_sem_init(SEM_EMPTY,&send_task_sem);
    /* coverity[no_escape] */
    for(;;)
    {
        /* 清理RD*/
        bsp_om_clean_rd();
        /* coverity[check_return] */
        osl_sem_down(&send_task_sem);

        bsp_om_send_log_buf(BSP_OM_LOG_BUF_TYPE,BSP_PRINT_BUF_LEN);

        do
        {
            bsp_om_get_head_from_list(&send_addr,&buf_len);

            if((send_addr != 0)&&(buf_len != 0))
            {
                ret =  bsp_om_send_coder_src(send_addr,buf_len);

                if(ret == BSP_OK)
                {
                    bsp_om_del_head_froms_list();
                }
                else
                {
                    break;
                }
            }

        }while((send_addr != 0)&&(buf_len != 0));
    }
    /*lint -save -e527 */
    return 0;
    /*lint -restore +e527 */
}
void bsp_om_send_task(void)
{
    u32 send_addr = 0;
    u32 buf_len = 0;
    u32 ret;

    osl_sem_init(SEM_EMPTY,&send_task_sem);

    /* coverity[no_escape] */
    for(;;)
    {
        /* 清理RD*/
        bsp_om_clean_rd();

        //osl_sem_downtimeout(&send_task_sem,3000);
        osl_sem_down(&send_task_sem);

        bsp_om_send_log_buf(BSP_OM_LOG_BUF_TYPE,BSP_PRINT_BUF_LEN);

        do
        {
            bsp_om_get_head_from_list(&send_addr,&buf_len);

            if((send_addr != 0)&&(buf_len != 0))
            {
                ret =  bsp_om_send_coder_src((u8*)send_addr,buf_len);

                if(ret == BSP_OK)
                {
                    bsp_om_del_head_froms_list();
                }
                else
                {
                    break;
                }
            }

        }while((send_addr != 0)&&(buf_len != 0));
    }
}
예제 #12
0
/* 任务处理函数,读取通道里的数据 */
s32 icc_read_task_entry(void *obj)
{
	u32 channel_id  = (u32)obj;
	u32 channel_idx = GET_CHN_ID(channel_id);
	u32 sub_chn_idx = GET_FUNC_ID(channel_id);
	s32 read_len    = 0;
	u32 start       = 0;
	u8  confirm     = (u8)ICC_RECV_OK;
	s32 i           = 0;
	u8 buf[ICC_NEW_DATA_LEN]    = {0};

	icc_print_debug("enter!!!");

	for(;g_icc_test.recv_task_flag;)
	{
		osl_sem_down(&g_icc_test.recv_task_sem);

		read_len = bsp_icc_read(channel_id, buf, ICC_NEW_DATA_LEN);
		if(read_len < 0 || read_len > ICC_NEW_DATA_LEN)
		{
			confirm = (u8)ICC_RECV_ERR;
		}
		else
		{
			for(i = 0; i < read_len; i++)
			{
				if(((u8)i + start) != buf[i])
				{
					confirm = (u8)ICC_RECV_ERR;
				}
			}
			confirm = ICC_CONF_MSG_TYPE2;
		}

		icc_print_debug("channel_id=0x%x, confirm=0x%x\n", channel_id, confirm);
		bsp_icc_send(g_icc_dbg.send_cpu_id, (channel_idx << 16) | (sub_chn_idx - 1), &confirm, sizeof(confirm));
	}

	return 0;
}
int modem_reset_task(void *arg)
{
	u16 action = 0;
	unsigned long flags = 0;

	for( ; ;)
	{
		osl_sem_down(&(g_modem_reset_ctrl.task_sem));
		action = (u16)g_modem_reset_ctrl.modem_action;
		reset_print_debug("(%d)has taken task_sem, action=%d\n", ++g_reset_debug.main_stage, action);

		if (MODEM_POWER_OFF == action)
		{
			(void)do_power_off(action);
		}
		else if (MODEM_POWER_ON == action)
		{
			(void)do_power_on(action);
		}
		else if (MODEM_RESET == action)
		{
			(void)do_reset(action);
			reset_print_err("reset count: %d\n", ++g_modem_reset_ctrl.reset_cnt);
		}
		if (action == g_modem_reset_ctrl.modem_action)
		{
			spin_lock_irqsave(&g_modem_reset_ctrl.action_lock, flags);
			g_modem_reset_ctrl.modem_action = MODEM_NORMAL;
			spin_unlock_irqrestore(&g_modem_reset_ctrl.action_lock, flags);
		}
		wake_unlock(&(g_modem_reset_ctrl.wake_lock));

		g_modem_reset_ctrl.exec_time = get_timer_slice_delta(g_modem_reset_ctrl.exec_time, bsp_get_slice_value());
		reset_print_debug("execute done, elapse time %d\n", g_modem_reset_ctrl.exec_time);
	}

}
/*****************************************************************************
 函数    : bsp_rffe_cfg_on_power_down
 功能    : 开机时mipi和线控配置
 输入    : 无
 输出    : 无
 返回     : mipi配置是否成功,0为成功,1为失败
*****************************************************************************/
int bsp_rffe_cfg_on_power_down(PWC_COMM_MODE_E mode, PWC_COMM_MODEM_E modem, PWC_COMM_CHANNEL_E chn)
{
    u64  cur_state  = 0;
    u32  vote_bit   = 0;
    int  ret        = 0;
    int  power_flag = 0;

    vote_bit = RF_PWR_MODE_NUM * modem + mode;

    osl_sem_down(&rf_pwr_sem[SEM_FEM]);

    cur_state      = rffe_cfg.vote[chn];
    rffe_cfg.vote[chn] &= ~((u64)1 << vote_bit);

    if((0 == rffe_cfg.vote[chn]) && cur_state){
        ret = balong_rf_config_by_mipi_modem_off(chn);
        ret |= balong_rf_config_anten_poweroff(chn);

        rffe_cfg.true_pwroff_cnt[chn]++;
        rffe_cfg.true_pwroff_time_stamp[chn] = bsp_get_slice_value();
    }

    power_flag = balong_fem_power_status(mode,modem, chn);
    if(!power_flag){
        ret  = balong_rf_config_by_mipi_allmodem_off();
        ret |= balong_rf_config_anten_allpoweroff();
        rffe_cfg.true_alloff_cnt++;
        rffe_cfg.true_alloff_time_stamp = bsp_get_slice_value();
    }
    rffe_cfg.pwroff_cnt[chn]++;
    rffe_cfg.pwroff_time_stamp[chn] = bsp_get_slice_value();

    osl_sem_up(&rf_pwr_sem[SEM_FEM]);

    return ret;

}
예제 #15
0
/*****************************************************************************
* 函 数 名     :  cshell_io_send
*
* 功能描述  :  发送数据到A核
*
* 输入参数  :  SHELL_IO_CHAN *ptr_shell :shell指针
* 输出参数  :  无
*
* 返 回 值     :  无
*
* 修改记录  :
*****************************************************************************/
void cshell_io_send(void)
{
	SHELL_IO_CHAN *ptr_shell = &shell_io_channel;
	unsigned int data_size = 0;
	unsigned int len_send2icc = 0;
	int wr_len = 0;
	int ret = 0;

	cshell_print_debug("enter handler\n");
	/* coverity[no_escape] */
	for(;;)
	{
		//semTake(ptr_shell->cshell_recv_sem, WAIT_FOREVER);
		osl_sem_down(&(ptr_shell->cshell_recv_sem));

		/* 有数据, 要处理 */
		while (OK == (ret = (ptr_shell->get_tx_char)(ptr_shell->get_tx_arg, (ptr_shell->ptr_send_buf + ptr_shell->send_rd))))
		{
			(void)dmesg_write((const char *)(ptr_shell->ptr_send_buf + ptr_shell->send_rd), sizeof(char));
			/* buffer满, 抛掉旧数据 */
			if(((ptr_shell->send_rd + 1) & (IO_BUFFER_MAX*2 - 1)) == ptr_shell->send_wt)
			{
				ptr_shell->send_wt = ptr_shell->send_wt + 1;
				ptr_shell->send_wt &= (IO_BUFFER_MAX*2 - 1);
				++g_cshell_dbg.lost_data_cnt;
			}
			++ptr_shell->send_rd;
			ptr_shell->send_rd &= (IO_BUFFER_MAX*2 - 1);
		}

		/* 超过水位线, 调用icc发送接口将数据发给acore ACM */
		data_size = (ptr_shell->send_rd + IO_BUFFER_MAX*2 - ptr_shell->send_wt) & (IO_BUFFER_MAX*2 - 1);

		while(data_size && ptr_shell->cshell_send_permission)
		{
			len_send2icc = min(data_size, CSHELL_ICC_FIFO_DEPTH);
			if (ptr_shell->send_rd < ptr_shell->send_wt)
			{
				len_send2icc = min(len_send2icc, (unsigned int)(IO_BUFFER_MAX*2 - ptr_shell->send_wt));
			}
			wr_len = bsp_icc_send(ICC_CPU_APP, ptr_shell->icc_channel_id, 
					ptr_shell->ptr_send_buf + ptr_shell->send_wt, len_send2icc);

			if(wr_len < 0) /* 发送失败 */
			{
				++g_cshell_dbg.send_fail_cnt;
				break;
			}
			else if(wr_len < (s32)len_send2icc) /* icc通道不顺畅,暂时退出发送 */
			{
				++g_cshell_dbg.send_busy_cnt;
				ptr_shell->send_wt = (ptr_shell->send_wt + wr_len) & (IO_BUFFER_MAX*2 - 1);
				data_size -= (unsigned int)wr_len;/* [false alarm]:误报 */
				break;
			}
			else if(wr_len == (s32)len_send2icc) /* 顺利将所有数据发送走 */
			{
				++g_cshell_dbg.send_succ_cnt;
				ptr_shell->send_wt = (ptr_shell->send_wt + wr_len) & (IO_BUFFER_MAX*2 - 1);
				data_size -= (unsigned int)wr_len;
			}
		}
	}
}
/*
* Function   : sc_icc_task
* Discription: c core nv init,this phase build upon the a core kernel init,
*              this phase after icc init,this phase ensure to use all nv api normal
*              start at this phase ,ops global ddr need spinlock
* Parameter  : none
* Output     : result
* History    : 
*/
void sc_icc_task(void)
{
    s32 ret         = -1;
    s32 icc_len     = 0;
    sc_icc_stru icc_trans;

    /* coverity[no_escape] */
    for(;;)
    {
        osl_sem_down(&g_sc_stat.sc_tsk_sem);

        sc_debug_printf("icc task, recv from acore ok, chanid :0x%x\n",SC_ICC_CHAN_ID);

        icc_len = bsp_icc_read(SC_ICC_CHAN_ID, (u8 * )&icc_trans, sizeof(sc_icc_stru));
        if((icc_len > sizeof(sc_icc_stru)))
        {
            sc_error_printf("bsp icc read error, chanid :0x%x opt_len :0x%x\n",SC_ICC_CHAN_ID,icc_len);
            osl_sem_up(&g_sc_stat.sc_tsk_sem);
            continue;
        }
        else if(0 >= icc_len)
        {
            sc_debug_printf("bsp icc read error, length is 0!\n");
            continue ;
        }
        
        g_sc_stat.sc_ram_len = icc_trans.sc_total_len;
        sc_debug_printf("len is 0x%x\n", g_sc_stat.sc_ram_len);
        
        
        icc_trans.sc_cnf_ret = SC_OK;
        /* get buffer */
        g_sc_stat.sc_ram_addr = (u8* )osl_malloc(icc_trans.sc_total_len);
        if(!g_sc_stat.sc_ram_addr)
        {
            sc_error_printf("bsp icc read error, chanid :0x%x ret :0x%x\n",SC_ICC_CHAN_ID,ret);
            icc_trans.sc_cnf_ret = BSP_ERR_SC_MALLOC_FAIL;
            goto confirm;
        }
        else
        {
            sc_debug_printf("malloc ok!\n");
        }

        if(MISC_SC_OPT_WRITE== icc_trans.sc_opt_type)
        {
            if(SC_OK != sc_bakup(g_sc_stat.sc_ram_addr, g_sc_stat.sc_ram_len))
            {
                icc_trans.sc_cnf_ret = BSP_ERR_SC_WRITE_FILE_FAIL;
            }
        }
        else
        {
            if(SC_OK != sc_restore(g_sc_stat.sc_ram_addr, g_sc_stat.sc_ram_len))
            {
                icc_trans.sc_cnf_ret = BSP_ERR_SC_READ_FILE_FAIL; 
            }
        }
        osl_free(g_sc_stat.sc_ram_addr);
        
        
confirm:
        /* send pkt to modem */
        icc_len = bsp_icc_send(ICC_CPU_MODEM, SC_ICC_CHAN_ID, (u8*)&icc_trans, sizeof(sc_icc_stru));
        if(icc_len != sizeof(sc_icc_stru))
        {
            sc_error_printf("send to modem failed 0,icc_len is 0x%x!\n",icc_len);
        }
        else
        {
            sc_debug_printf("send to mdoem ok,icc_len is 0x%x!\n",icc_len);
        }
        
        continue;
    }
        
}
/*****************************************************************************
 函 数 名  : dual_modem_uart_recv_task
 功能描述  : 调用回调函数,向上层发送数据
 输入参数  : UART_PORT * uart_port_add 端口地址
 输出参数  : 无
 返 回 值  : void
*****************************************************************************/
void dual_modem_uart_recv_task(UART_PORT *uart_port_addr)
{
	s32 ret = 0;
	volatile u32 ulwrite = 0;
	volatile u32 this_size = 0;
    UART_PORT *uart_port = NULL;
	RECV_STR *recvStr = NULL;

	recvStr = &g_dual_modem_ctrl.uart_port.circ_buf;

    if(NULL == uart_port_addr)
    {
        dm_print_err("uart_port_addr is null\n");
        return ;
    }
    uart_port = uart_port_addr;

   	while(1)
    {
		osl_sem_down(&g_dual_modem_ctrl.recv_mutex);
		cpcp_msg_count_record(&g_dm_dump_info->rtask_SemTake_cnt, "RtaskSemTakecnt");

		ulwrite = recvStr->ulWrite;
		bsp_softtimer_delete(&g_dual_modem_ctrl.sleep_timer);
		dual_modem_restart_timer(&g_dual_modem_ctrl.hold_wake_timer);
		g_dual_modem_ctrl.wakeup_3rdmodem_flag = NOT_WAKEUP_V3;
        if(NULL != uart_port->recv_callback)
		{
			if(recvStr->ulRead  == ulwrite)
        	{
             	dual_modem_restart_timer(&g_dual_modem_ctrl.sleep_timer);
                continue;
        	}
			if(recvStr->ulRead < ulwrite)
			{
				this_size = ulwrite - recvStr->ulRead;
				
				if((g_dm_dump_info->rx_cur_offset + this_size + 4) > DUAL_DUMP_RX_BUFF_SIZE)
				{
					g_dm_dump_info->rx_cur_offset = 0;
				}
				(void)memcpy_s((void *)(g_dm_dump_info->rx_dump_addr + g_dm_dump_info->rx_cur_offset), sizeof(u32), 
					(void *)&g_dm_dump_info->recv_time_stamp, sizeof(u32));
				g_dm_dump_info->rx_cur_offset += 4;			
				(void)memcpy_s((g_dm_dump_info->rx_dump_addr + g_dm_dump_info->rx_cur_offset) ,this_size,(recvStr->ucData + recvStr->ulRead), this_size);
				g_dm_dump_info->rx_cur_offset += this_size;

        		ret = uart_port->recv_callback(CBP_UART_PORT_ID,(recvStr->ucData + recvStr->ulRead),this_size);	/* [false alarm]:误报 */		

				g_dm_dump_info->rx_cur_size = this_size;
				g_dm_dump_info->rx_total_size += this_size;
				if(g_dual_modem_ctrl.log_flag == 1)
				{
					dm_debug_print("RecvCurSize %d\n",this_size);				
					dm_print_info((recvStr->ucData + recvStr->ulRead),this_size);
				}
			}
			else 
			{
				this_size = UART_RECV_BUF_SIZE - recvStr->ulRead;

				if((g_dm_dump_info->rx_cur_offset + this_size + 4) > DUAL_DUMP_RX_BUFF_SIZE)
				{
					g_dm_dump_info->rx_cur_offset = 0;
				}
				(void)memcpy_s((void *)(g_dm_dump_info->rx_dump_addr + g_dm_dump_info->rx_cur_offset), sizeof(u32), 
					(void *)&g_dm_dump_info->recv_time_stamp, sizeof(u32));
				g_dm_dump_info->rx_cur_offset += 4;
				(void)memcpy_s((g_dm_dump_info->rx_dump_addr + g_dm_dump_info->rx_cur_offset) ,this_size,(recvStr->ucData + recvStr->ulRead), this_size);
				g_dm_dump_info->rx_cur_offset += this_size;

				ret = uart_port->recv_callback(CBP_UART_PORT_ID,(recvStr->ucData + recvStr->ulRead),this_size);		/* [false alarm]:误报 */	

				g_dm_dump_info->rx_cur_size = this_size + ulwrite;
				g_dm_dump_info->rx_total_size += this_size;	

				if(g_dual_modem_ctrl.log_flag == 1)
				{
					dm_debug_print("RecvCurSize %d\n",g_dm_dump_info->rx_cur_size);
					dm_print_info((recvStr->ucData + recvStr->ulRead),this_size);
				}
				if(ulwrite)
				{
					this_size = ulwrite;

					if((g_dm_dump_info->rx_cur_offset + this_size + 4) > DUAL_DUMP_RX_BUFF_SIZE)
					{
						g_dm_dump_info->rx_cur_offset = 0;
					}
					(void)memcpy_s((void *)(g_dm_dump_info->rx_dump_addr + g_dm_dump_info->rx_cur_offset), sizeof(u32), 
						(void *)&g_dm_dump_info->recv_time_stamp, sizeof(u32));
					g_dm_dump_info->rx_cur_offset += 4;				
					(void)memcpy_s((g_dm_dump_info->rx_dump_addr + g_dm_dump_info->rx_cur_offset),this_size ,recvStr->ucData , this_size);
					g_dm_dump_info->rx_cur_offset += this_size;

					ret = uart_port->recv_callback(CBP_UART_PORT_ID,recvStr->ucData,this_size);	   /* [false alarm]:误报 */

					g_dm_dump_info->rx_total_size += this_size;

					if(g_dual_modem_ctrl.log_flag == 1)
					{
						dm_print_info(recvStr->ucData,this_size);
					}
				}
			}
			recvStr->ulRead = ulwrite;
			if(OK != ret)
			{
				dm_print_err("recv error!!\n");

			}
		}
		else 
		{
			dm_print_err("callback is null\n");
			g_dm_dump_info->callback_fail_cnt++;
			recvStr->ulRead = ulwrite;
		}
		dual_modem_restart_timer(&g_dual_modem_ctrl.sleep_timer);
    }
}
예제 #18
0
FILE* nv_emmc_open(const s8* path,const s8* mode)
{

    u32 ret = NV_ERROR;
    u32 i = 0;
    struct nv_emmc_file_header_stru* fd = NULL;
    u32 offset = 0;
    u32 len = 0;
    struct mtd_info* mtd = NULL;

    nv_file_debug(NV_FILE_OPEN_API,0,0,0,0);

    for(i=0; i<NV_FILE_BUTT; i++)
    {
        if(0 == strcmp(path,g_nv_file[i].path))
        {
            fd = &g_nv_file[i];
            mtd = get_mtd_device_nm(fd->name);
            if(IS_ERR(mtd))
            {
                printf("[%s]:get mtd device err! %s\n",__func__,fd->name);
                return NULL;
            }
            g_nv_file[i].mtd = mtd;
            break;
        }
    }
    if(NULL == fd)
    {
        nv_file_debug(NV_FILE_OPEN_API,1,0,0,0);
        return NULL;
    }
    osl_sem_down(&fd->file_sem);
    switch(fd->emmc_type)
    {
        case NV_FILE_DLOAD:
            ret = nv_get_nvbin_info(mode,&offset,&len);
            break;
        case NV_FILE_BACKUP:
            ret = nv_sec_file_info_init(g_nv_file[NV_FILE_BACKUP].name,&g_emmc_info.bak_sec);
            ret |= nv_get_back_info(mode,&offset,&len);
            break;
        case NV_FILE_XNV_CARD_1:
            ret = nv_get_xnv_info(NV_USIMM_CARD_1,&offset,&len);
            break;
        case NV_FILE_CUST_CARD_1:
            ret = nv_get_cust_info(NV_USIMM_CARD_1,&offset,&len);
            break;
        case NV_FILE_XNV_CARD_2:
            ret = nv_get_xnv_info(NV_USIMM_CARD_2,&offset,&len);
            break;
        case NV_FILE_CUST_CARD_2:
            ret = nv_get_cust_info(NV_USIMM_CARD_2,&offset,&len);
            break;
        case NV_FILE_SYS_NV:
            ret = nv_get_sys_nv_info(mode,&offset,&len);
            break;
        case NV_FILE_DEFAULT:
            ret = nv_get_default_info(mode,&offset,&len);
            break;
        case NV_FILE_XNV_MAP_CARD_1:
            ret = nv_get_xnv_map_info(NV_USIMM_CARD_1,&offset,&len);
            break;
        case NV_FILE_XNV_MAP_CARD_2:
            ret = nv_get_xnv_map_info(NV_USIMM_CARD_2,&offset,&len);
            break;
        default:
            ret = BSP_ERR_NV_INVALID_PARAM;
    }

    if(NV_OK != ret)
    {
        put_mtd_device(fd->mtd);
        osl_sem_up(&fd->file_sem);
        nv_file_debug(NV_FILE_OPEN_API,3,fd->emmc_type,ret,0);
        return NULL;
    }

    fd->ops ++;
    fd->seek   = 0;
    fd->length = len;
    fd->off    = offset;
    fd->fp     = fd;

    return fd;
}
u32 bsp_om_send_coder_src(u8 *send_data_virt, u32 send_len)
{
    SOCP_BUFFER_RW_STRU                 bd_buf = {0};
    u32                          ulBDNum;
    SOCP_BD_DATA_STRU          bd_data = {0};
    u32                          send_data_phy = 0;
    u32                         ret;

    osl_sem_down(&socp_opt_sem);

    /*  将用户虚拟地址转换成物理地址*/
    send_data_phy = bsp_om_virt_phy((void *)send_data_virt);

    if(send_data_phy == 0)
    {
        ret =  BSP_ERR_OMS_INVALID_PARAM;
        goto fail;
    }

    bsp_socp_get_write_buff(g_bsp_om_socp_chan_info.en_src_chan_id, &bd_buf);

    /* 计算空闲BD的值 */
    ulBDNum = (bd_buf.u32Size + bd_buf.u32RbSize)/ sizeof(SOCP_BD_DATA_STRU);

    /* 判断是否还有空间 */
    if (1 >= ulBDNum)
    {
        bsp_om_debug(BSP_LOG_LEVEL_ERROR," GET BD fail,ulBDNum = %d\n",ulBDNum);
        ret =  BSP_ERR_OMS_SOCP_GET_BD_NUM_ERR;
        goto fail;
    }

    /*SOCP给出的是物理地址*/
    if(NULL == bd_buf.pBuffer )
    {
        bsp_om_debug(BSP_LOG_LEVEL_ERROR," GET BD fail,pBuffer = NULL \n");
        ret =  BSP_ERR_OMS_SOCP_BD_ADDR_ERR;
        goto fail;
    }

    bd_data.pucData    = send_data_phy;
    bd_data.usMsgLen   = (BSP_U16)send_len;
    bd_data.enDataType = SOCP_BD_DATA;

    memcpy((void *)bsp_om_phy_virt(((uintptr_t)bd_buf.pBuffer)),(void*)&bd_data,sizeof(SOCP_BD_DATA_STRU));
    /*lint -save -e713*/
    dma_map_single(NULL, (void*)bsp_om_phy_virt(((uintptr_t)bd_buf.pBuffer)), sizeof(SOCP_BD_DATA_STRU), DMA_TO_DEVICE);
    dma_map_single(NULL, (void *)(send_data_virt), send_len, DMA_TO_DEVICE);
    /*lint -restore*/
    ret =  (u32)bsp_socp_write_done(g_bsp_om_socp_chan_info.en_src_chan_id, sizeof(SOCP_BD_DATA_STRU)) ;  /* 当前数据写入完毕 */

    if(ret != BSP_OK)
    {
        goto fail;
    }
    else
    {
        ret = BSP_OK;
        goto successful;
    }

fail:
    osl_sem_up(&socp_opt_sem);
    return ret;
successful:
    osl_sem_up(&socp_opt_sem);
    return ret;
}
/*****************************************************************************
 函 数 名  : mdrv_loadas
 功能描述  : 对外提供的镜像加载接口
 输入参数  : rat_mode 镜像类型
 输出参数  : 成功返回0,失败返回非0
*****************************************************************************/
int mdrv_loadas ( DRV_RAT_MODE_ENUM rat_mode )
{

    s32 ret = BSP_OK;
    loadps_msg loadps_msg;
    u32 elapsed;
    int overlay_index = 0;
    int magic =0 ;
    int page_left=0;
    struct loadps_header *pheader;
    struct ovly_addr_info *pRat_addr_info, *pOvly_addr_info;

    /*保证一次只有一个任务执行loadps*/
    osl_sem_down ( &loadps_mutex );
    g_loadps_debuginfo.call_cnt++;
    loadps_trace(BSP_LOG_LEVEL_INFO ,"rat_mode  %d\n" ,rat_mode);
    g_loadps_debuginfo.mdrv_start_ms = bsp_get_elapse_ms();

    if ((DRV_RAT_MODE_UMTS_FDD != rat_mode) && (DRV_RAT_MODE_UMTS_TDD != rat_mode))
    {
        loadps_trace(BSP_LOG_LEVEL_ERROR ,"rat_mode ERROR! %d\n" ,rat_mode);
        ret = -1;
        goto sem_up;
    }
    /*判断一下加载的镜像*/
    if (rat_mode == DRV_RAT_MODE_UMTS_TDD)
    {
        overlay_index = 1;
        magic = 0x00736174;
    }
    else if (rat_mode == DRV_RAT_MODE_UMTS_FDD)
    {
        overlay_index = 2;
        magic = 0x00736177;
    }
    g_loadps_debuginfo.rat_mode = rat_mode;
    pRat_addr_info  = _ovly_table + overlay_index;
    pOvly_addr_info = _ovly_table;
    (void)memset_s(&loadps_msg, sizeof(loadps_msg), 0x0, sizeof(loadps_msg));
    loadps_msg.rat_mode = rat_mode;
    /*加载到内存中的地址*/
    loadps_msg.addr = pRat_addr_info->addr;
    g_loadps_debuginfo.load_addr = loadps_msg.addr;
    loadps_trace(BSP_LOG_LEVEL_INFO ,"loadps_msg.addr  0x%x\n" ,loadps_msg.addr);

    loadps_msg.size = pRat_addr_info->size;
    loadps_trace(BSP_LOG_LEVEL_INFO ,"loadps_msg.size  0x%x\n" ,loadps_msg.size);

    ret = bsp_icc_send( ICC_CPU_APP, LOADPS_ICC_IFC_ID, (u8*)(&loadps_msg), sizeof(loadps_msg));

    if (sizeof(loadps_msg) != ret )
    {
        loadps_trace(BSP_LOG_LEVEL_ERROR ,"msg_size != ret: msg_size = 0x%x, ret = 0x%x\n", sizeof(loadps_msg), ret);
        ret = -1;
        goto sem_up;
    }
    g_loadps_debuginfo.send_icc_cnt++;
    /*把任务挂起,等待A核把镜像搬运的工作完成*/
    osl_sem_down ( &loadps_wait_complete_mutex );

    /*C核的任务被唤醒后执行*/
    g_loadps_debuginfo.recv_icc_cnt++;
    g_loadps_debuginfo.mdrv_wakeup_byacore_ms = bsp_get_elapse_ms();
    elapsed = g_loadps_debuginfo.mdrv_wakeup_byacore_ms - g_loadps_debuginfo.mdrv_start_ms;

    loadps_trace(BSP_LOG_LEVEL_INFO ,"loadps result = 0x%x and icc complete time %d ms\n", g_loadps_status.result,elapsed);
    ret = g_loadps_status.result;
    if(ret != 0)
    {
        loadps_trace(BSP_LOG_LEVEL_ERROR ,"loadps result = 0x%x\n", ret);
        ret = -1;
        goto sem_up;
    }
    loadps_trace(BSP_LOG_LEVEL_INFO ,"loadps SRE_ICacheInv addr = 0x%x  size= 0x %x\n", pOvly_addr_info->addr, pOvly_addr_info->size);
    ret = SRE_ICacheInv((VOID *)pOvly_addr_info->addr, (UINT32)pOvly_addr_info->size, TRUE);
    if(ret != 0)
    {
        loadps_trace(BSP_LOG_LEVEL_ERROR ,"SRE_ICacheInv error = 0x%x\n", ret);
        ret = -1;
        goto sem_up;
    }
    loadps_trace(BSP_LOG_LEVEL_INFO ,"loadps SRE_DCacheInv addr = 0x%x  size= 0x %x\n", pOvly_addr_info->addr, pOvly_addr_info->size);
    ret = SRE_DCacheInv((VOID *)pOvly_addr_info->addr, (UINT32)pOvly_addr_info->size, TRUE);
    if(ret != 0)
    {
        loadps_trace(BSP_LOG_LEVEL_ERROR ,"SRE_DCacheInv error = 0x%x\n", ret);
        ret = -1;
        goto sem_up;
    }
    pheader = (struct loadps_header *)pRat_addr_info->addr;

    if (pheader->magic != magic)
    {
        loadps_trace(BSP_LOG_LEVEL_ERROR ,"pheader->magic error = 0x%x\n", pheader->magic);
        ret = -1;
        goto sem_up;
    }
    loadps_trace(BSP_LOG_LEVEL_INFO ,"loadps pheader->text_start= 0x%x  pheader->text_size= 0x %x\n", pheader->text_start, pheader->text_size);
    /*设置代码段只读可执行属性*/
    ret = SRE_MmuStateSet(pheader->text_start, pheader->text_size, 0, LOADPS_TEXT_MMU_ATTR);
    if(ret != 0)
    {
        loadps_trace(BSP_LOG_LEVEL_ERROR ,"SRE_MmuStateSet TEXT error = 0x%x\n", ret);
        ret = -1;
        goto sem_up;
    }
    loadps_trace(BSP_LOG_LEVEL_INFO,"loadps pheader->data_start= 0x%x  pheader->data_size= 0x %x\n", pheader->data_start, pheader->data_size);
    if( pheader->data_size % PAGE_SIZE)
    {
        page_left = pheader->data_size % PAGE_SIZE;
        page_left = PAGE_SIZE - page_left;

    }
    /*设置数据段可读写属性*/
    ret = SRE_MmuStateSet(pheader->data_start, pheader->data_size+page_left, 0, LOADPS_DATA_MMU_ATTR);
    if(ret != 0)
    {
        loadps_trace(BSP_LOG_LEVEL_ERROR ,"SRE_MmuStateSet data error = 0x%x\n", ret);
        ret = -1;
        goto sem_up;
    }
    loadps_trace(BSP_LOG_LEVEL_INFO ,"loadps pheader->bss_start= 0x%x  pheader->bss_size= 0x %x\n", pheader->bss_start, pheader->bss_size);
    /*清除bss段的内容*/
    memset_s((void*)pheader->bss_start, pheader->bss_size, 0x0, pheader->bss_size);

    /*Unwind信息的添加,方便打印私有镜像的调用栈信息*/
    loadps_trace(BSP_LOG_LEVEL_INFO ,"loadps pheader->unwind_start= 0x%x  pheader->unwind_size= 0x %x\n", pheader->unwind_start, pheader->unwind_size);
    ret = SRE_UnwindTableAdd(pheader->unwind_start, pheader->unwind_start + pheader->unwind_size,\
                          pheader->text_start, pheader->text_start + pheader->text_size);
    if(ret != 0)
    {
        loadps_trace(BSP_LOG_LEVEL_ERROR ,"SRE_UnwindTableAdd error = 0x%x\n", ret);
        ret = -1;
        goto sem_up;
    }
    /*符号表信息增加*/
    loadps_trace(BSP_LOG_LEVEL_INFO ,"loadps pheader->symbol_start= 0x%x  pheader->symbol_size= 0x %x\n", pheader->symbol_start, (pheader->symbol_size)/sizeof(OS_SYMBOL_NODE_S));
    /* Add Symbol table for this overlay section */
    ret = SRE_SymbolTableAdd((OS_SYMBOL_NODE_S*)pheader->symbol_start, (pheader->symbol_size)/sizeof(OS_SYMBOL_NODE_S), \
                          pRat_addr_info->addr, pRat_addr_info->addr + pRat_addr_info->size);
    if(ret != 0)
    {
        loadps_trace(BSP_LOG_LEVEL_ERROR ,"SRE_SymbolTableAdd error = 0x%x\n", ret);
        ret = -1;
        goto sem_up;
    }

sem_up:
    osl_sem_up ( &loadps_mutex );
    g_loadps_debuginfo.mdrv_SymbolTableAdd_ms = bsp_get_elapse_ms();
    elapsed = g_loadps_debuginfo.mdrv_SymbolTableAdd_ms - g_loadps_debuginfo.mdrv_start_ms;
    loadps_trace(BSP_LOG_LEVEL_ERROR ,"loadps total load time %d ms ret = %d\n", elapsed, ret);
    g_loadps_debuginfo.mdrv_total_elapsed_ms = elapsed;
    if(!ret)
    {
        g_loadps_debuginfo.succ_cnt++;
    }
    return ret;
}
* 函 数 名  : bsp_om_socp_clean_rd_buf
*
* 功能描述  :清理SOCP的RD缓存
*
* 输入参数  :chan_id :socp 的通道ID
*                       rd_stru: 入参
*
* 输出参数  :无
*
* 返 回 值  : BSP_OK 成功; 其他 失败
*****************************************************************************/

u32 bsp_om_socp_clean_rd_buf(u32 chan_id,SOCP_BUFFER_RW_STRU *rd_stru)
{
    u32             ret;
    SOCP_BUFFER_RW_STRU    rd_buf_stru = {0};

    osl_sem_down(&socp_opt_sem);

    ret = (u32)bsp_socp_get_rd_buffer(chan_id,&rd_buf_stru);

    if(BSP_OK != ret)
    {
        ret  = BSP_ERR_OMS_SOCP_GET_RD_ERR;

        goto fail;
    }

    /* 无RD需要释放*/
    if( (0 ==rd_buf_stru.u32Size)&&(0 == rd_buf_stru.u32RbSize))
    {
         ret  = BSP_OK;
         goto successful;
    }

    /* 获取到的RD数据异常*/
    if((rd_buf_stru.u32Size + rd_buf_stru.u32RbSize) > BSP_OM_CODER_SRC_RDSIZE)
    {
        ret  = BSP_ERR_OMS_SOCP_CLEAN_RD_ERR;
        goto fail;
    }

    if(0 != (rd_buf_stru.u32Size / sizeof(SOCP_RD_DATA_STRU)))
    {
        rd_stru->pBuffer = rd_buf_stru.pBuffer;
        rd_stru->u32Size = rd_buf_stru.u32Size;
        (void)cacheInvalidate(DATA_CACHE, rd_buf_stru.pBuffer, rd_buf_stru.u32Size);
    }
    else
    {
        ret  = BSP_ERR_OMS_SOCP_CLEAN_RD_ERR;

        goto fail;
    }

    ret = (u32)bsp_socp_read_rd_done(chan_id, rd_buf_stru.u32Size);  /* 释放rd缓存 */
    if( BSP_OK !=ret)
    {
        goto fail;
    }
    else
    {
        ret  = BSP_OK;
        goto successful;
    }

fail:
    osl_sem_up(&socp_opt_sem);
    return ret;
successful:
    osl_sem_up(&socp_opt_sem);
    return ret;
}
u32 bsp_om_socp_clean_rd_buf(u32 chan_id,SOCP_BUFFER_RW_STRU *rd_stru)
{
    u32             ret;
    SOCP_BUFFER_RW_STRU    rd_buf_stru = {0};

    osl_sem_down(&socp_opt_sem);

    ret = (u32)bsp_socp_get_rd_buffer(chan_id,&rd_buf_stru);

    if(BSP_OK != ret)
    {
        ret  = BSP_ERR_OMS_SOCP_GET_RD_ERR;

        goto fail;
    }

    /* 无RD需要释放*/
    if( (0 ==rd_buf_stru.u32Size)&&(0 == rd_buf_stru.u32RbSize))
    {
         ret  = BSP_OK;
         goto successful;
    }

    /* 获取到的RD数据异常*/
    if((rd_buf_stru.u32Size + rd_buf_stru.u32RbSize) > BSP_OM_CODER_SRC_RDSIZE)
    {
        ret  = BSP_ERR_OMS_SOCP_CLEAN_RD_ERR;
        goto fail;
    }

    if(0 != (rd_buf_stru.u32Size / sizeof(SOCP_RD_DATA_STRU)))
    {
        /*lint -save -e713*/
        dma_map_single(NULL, (void *)bsp_om_phy_virt(((uintptr_t)rd_buf_stru.pBuffer)), rd_buf_stru.u32Size, DMA_FROM_DEVICE);
        /*lint -restore*/
        rd_stru->pBuffer = (char *)bsp_om_phy_virt(((uintptr_t)rd_buf_stru.pBuffer));
        rd_stru->u32Size = rd_buf_stru.u32Size;
    }
    else
    {
        ret  = BSP_ERR_OMS_SOCP_CLEAN_RD_ERR;

        goto fail;
    }

    ret = (u32)bsp_socp_read_rd_done(chan_id, rd_buf_stru.u32Size);  /* 释放rd缓存 */
    if( BSP_OK !=ret)
    {
        goto fail;
    }
    else
    {
        ret = BSP_OK;
        goto successful;
    }

fail:
    osl_sem_up(&socp_opt_sem);
    return ret;
successful:
    osl_sem_up(&socp_opt_sem);
    return ret;
}
예제 #23
0
/* 新增mcore后, 三核共用的测试代码开始 2012/06/13*/
s32 bsp_icc_mcore_test_init(void)
{
	u32 mcoore_test_channel_size = 0;
	u32 channel_idx[2]={0};
	s32 ret = ICC_OK;
	u32 i = 0;
	
	if(ICC_TEST_CASE_INITILIZED == g_icc_test.mcore_test_state)
	{
		icc_print_error("icc mcore test has initilized\n");
		return ICC_OK;
	}

	icc_print_debug("icc mcore test initilizing\n");

#ifdef __KERNEL__
	mcoore_test_channel_size = 1;
	channel_idx[0] = ICC_CHN_MCORE_ACORE;
#elif defined( __VXWORKS__)
	mcoore_test_channel_size = 1;
	channel_idx[0] = ICC_CHN_MCORE_CCORE;
#elif defined(__CMSIS_RTOS) /* rtx(cm3 os) */
	mcoore_test_channel_size = 2;
	channel_idx[0] = ICC_CHN_MCORE_CCORE;
	channel_idx[1] = ICC_CHN_MCORE_ACORE;
#endif

	for(i = 0; i < mcoore_test_channel_size; i++)
	{
		/* 20个子通道, 现有16个子通道的基础上再分配4个 */
		ret = icc_test_channel_reinit(channel_idx[i], ICC_TEST_MCORE_CHN_SIZE);
		if(ICC_OK != ret)
		{
			icc_print_error("icc_test_channel_reinit error\n");
			return ICC_ERR;
		}

		/* 使用后4个子通道进行测试 */
		ret = icc_test_sub_chn_init(channel_idx[i], ICC_TEST_USE_CHN_SIZE, ICC_TEST_MCORE_START_CHN);
		if(ICC_OK != ret)
		{
			icc_print_error("icc_test_sub_chn_init error\n");
			return ICC_ERR;
		}
	}
	
#ifdef __CMSIS_RTOS
		g_icc_test.channels[ICC_CHN_MCORE_CCORE].sub_channels[16].confirm_sem = osl_sem_init(1, confirm_sem01);/*lint !e416 !e831*/
		g_icc_test.channels[ICC_CHN_MCORE_CCORE].sub_channels[18].confirm_sem = osl_sem_init(1, confirm_sem02);/*lint !e416 !e831*/
		g_icc_test.channels[ICC_CHN_MCORE_ACORE].sub_channels[16].confirm_sem = osl_sem_init(1, confirm_sem03);/*lint !e416 !e831*/
		g_icc_test.channels[ICC_CHN_MCORE_ACORE].sub_channels[18].confirm_sem = osl_sem_init(1, confirm_sem04);/*lint !e416 !e831*/

		osl_sem_down(&(g_icc_test.channels[ICC_CHN_MCORE_CCORE].sub_channels[16].confirm_sem));/*lint !e416 !e831*/
		osl_sem_down(&(g_icc_test.channels[ICC_CHN_MCORE_CCORE].sub_channels[18].confirm_sem));/*lint !e416 !e831*/
		osl_sem_down(&(g_icc_test.channels[ICC_CHN_MCORE_ACORE].sub_channels[16].confirm_sem));/*lint !e416 !e831*/
		osl_sem_down(&(g_icc_test.channels[ICC_CHN_MCORE_ACORE].sub_channels[18].confirm_sem));/*lint !e416 !e831*/
#endif

#ifdef ICC_HAS_DEBUG_FEATURE
	/* 测试打开打印开关 */
	icc_dbg_print_sw(0);
#endif

	/* 状态最后更新 */
	g_icc_test.mcore_test_state = ICC_TEST_CASE_INITILIZED;

	return ICC_OK;
}