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; }
/***************************************************************************** 函 数 名 : 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); }
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; }
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; }
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; }