int mca_post(int cmd_id, union mca_udata_req req_data, mca_post_cb post_cb, void* private_data, int time_out)
{
    int sid;
    struct mca_sdata sdata = {0};
    struct mca_frame frame = {0};

    if(post_cb)
    {
        sid = mca_create_session();
        if(sid < 0)
            return -1;

        sdata.post_cb      = post_cb;
        sdata.private_data = private_data;

        if(mca_save_session(sid, sdata))
            goto ERR_DESTROY_EXIT;

        memset(&frame, 0, sizeof(struct mca_frame));
        frame.sid    = sid;
        frame.stype  = MCA_SESSION_ASYN;
        frame.cmd_id = cmd_id;
        frame.udata  = req_data;
        if(MAILBOX_OK != mailbox_send_msg(
                BSP_MAILBOX_CHANNEL_ACPU_TO_MCU_MCA_CH,
                &frame,
                sizeof(struct mca_frame)))
            goto ERR_DESTROY_EXIT;
    }
    else
    {
        memset(&frame, 0, sizeof(struct mca_frame));
        frame.stype  = MCA_SESSION_NRSP;
        frame.cmd_id = cmd_id;
        frame.udata  = req_data;
        if(MAILBOX_OK != mailbox_send_msg(
                BSP_MAILBOX_CHANNEL_ACPU_TO_MCU_MCA_CH,
                &frame,
                sizeof(struct mca_frame)))
            return -1;
    }

    //FIXME: time_out not use. session may never destroy.
    return 0;

ERR_DESTROY_EXIT:

    mca_remove_session(sid);

    return -1;
}
Exemplo n.º 2
0
/*****************************************************************************
 函 数 名  : DRV_MAILBOX_SENDMAIL
 功能描述  : 邮箱用户发送邮件数据
 输入参数  : MailCode   -- 邮编, 指定邮件发送目标
             pData      -- 指向邮件数据的指针
             Length     -- 待发送数据长度, 单位byte
 输出参数  : 无
 返 回 值  : 正确:MAILBOX_OK / 错误:MAILBOX_ERRO或者其他错误码
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   : 2012年9月28日
    作    者   : 莫南 00176101
    修改内容   : 新生成函数

*****************************************************************************/
unsigned int DRV_MAILBOX_SENDMAIL(
                unsigned int           MailCode,
                void                   *pData,
                unsigned int           Length)
{
    return mailbox_send_msg(MailCode, pData, Length);
}
Exemplo n.º 3
0
int test_send_encap_msg(unsigned char  *buff, unsigned long len)
{
    int ret = OK;

    /*调用核间通信接口发送数据*/
    ret = mailbox_send_msg(MAILBOX_MAILCODE_ACPU_TO_HIFI_AUDIO, buff, len);
    if ( OK != ret )
    {
        printk("mailbox_send_msg error\n");
        return ERROR;
    }

    return ret;
}
Exemplo n.º 4
0
static int hifi_misc_sync_write(unsigned char  *buff, unsigned int len)
{
	int ret = OK;

	IN_FUNCTION;

	if (NULL == buff) {
		loge("input arg is NULL\n");
		ret = ERROR;
		goto END;
	}

	INIT_COMPLETION(g_misc_data.completion);

	/*调用核间通信接口发送数据,得到返回值ret*/
	ret = mailbox_send_msg(MAILBOX_MAILCODE_ACPU_TO_HIFI_MISC, buff, len);
	if (OK != ret) {
		loge("msg send to hifi fail,ret is %d\n", ret);
		ret = ERROR;
		goto END;
	}

	ret = wait_for_completion_timeout(&g_misc_data.completion, msecs_to_jiffies(2000));
	g_misc_data.sn++;
	if (unlikely(g_misc_data.sn & 0x10000000)){
		g_misc_data.sn = 0;
	}

	if (!ret) {
		loge("wait completion timeout!\n");
		up(&k3log_dsp_sema);
		ret = ERROR;
		goto END;
	} else {
		ret = OK;
	}

END:
	OUT_FUNCTION;
	return ret;
}
Exemplo n.º 5
0
static int hifi_misc_async_write(unsigned char *arg, unsigned int len)
{
	int ret = OK;

	IN_FUNCTION;

	if (NULL == arg) {
		loge("input arg is NULL\n");
		ret = ERROR;
		goto END;
	}

	/*调用核间通信接口发送数据*/
	ret = mailbox_send_msg(MAILBOX_MAILCODE_ACPU_TO_HIFI_MISC, arg, len);
	if (OK != ret) {
		loge("msg send to hifi fail,ret is %d\n", ret);
		ret = ERROR;
		goto END;
	}

END:
	OUT_FUNCTION;
	return ret;
}
int mca_send_no_use(int cmd_id, union mca_udata_req req_data, union mca_udata_rsp* p_rsp_data, int time_out)
{
    int sid;
    struct mca_sdata sdata = {0};
    struct mca_frame frame = {0};

    // If user need response data, p_rsp_data != NULL
    if(p_rsp_data)
    {
        sid = mca_create_session();
        if(sid < 0)
            return -1;

        sdata.p_rsp = p_rsp_data;

        if(mca_save_session(sid, sdata))
            goto ERR_DESTROY_EXIT;

        memset(&frame, 0, sizeof(struct mca_frame));
        frame.sid    = sid;
        frame.stype  = MCA_SESSION_SYNC;
        frame.cmd_id = cmd_id;
        frame.udata  = req_data;
        if(MAILBOX_OK != mailbox_send_msg(
                BSP_MAILBOX_CHANNEL_ACPU_TO_MCU_MCA_CH,
                &frame,
                sizeof(struct mca_frame)))
            goto ERR_DESTROY_EXIT;

        // wait for response.
        if(mca_lock_session(sid, time_out) != 0)
        {
            // may response hare after time_out.
            mca_lock_irq();

            // check if responsed after time_out.
            if(mca_is_session_locked(sid))
                mca_unlock_session(sid); /* session shoud be kept untill rsp. */
            else
                mca_remove_session(sid); /* destroy if responsed. */

            mca_unlock_irq();

            return -1;
        }

        // if all ok.
        mca_remove_session(sid);
    }
    else /* If p_rsp_data == NULL, we'll think user needn't response.  */
    {
        memset(&frame, 0, sizeof(struct mca_frame));
        frame.stype  = MCA_SESSION_NRSP;
        frame.cmd_id = cmd_id;
        frame.udata  = req_data;
        if(MAILBOX_OK != mailbox_send_msg(
                BSP_MAILBOX_CHANNEL_ACPU_TO_MCU_MCA_CH,
                &frame,
                sizeof(struct mca_frame)))
            return -1;
    }

    return 0;

ERR_DESTROY_EXIT:

    mca_remove_session(sid);

    return -1;
}