MAILBOX_LOCAL int mailbox_request_channel( struct mb *mb, struct mb_buff ** mb_buf, unsigned int mailcode) { struct mb_head *head = MAILBOX_NULL; struct mb_queue *queue = MAILBOX_NULL; struct mb_buff *mbuff = MAILBOX_NULL; int ret_val = MAILBOX_OK; *mb_buf = MAILBOX_NULL; mbuff = mailbox_get_channel_handle(mb, mailcode); if (MAILBOX_NULL == mbuff) { ret_val = (int)MAILBOX_ERRO; goto request_erro;/*lint --e{801}*/ } /*通过判断通道保护字,检查通道有没有初始化*/ head = (struct mb_head*)mbuff->config->head_addr; if (( (MAILBOX_PROTECT1 != head->ulProtectWord1) ) || (MAILBOX_PROTECT2 != head->ulProtectWord2) ||(MAILBOX_PROTECT1 != head->ulProtectWord3) || (MAILBOX_PROTECT2 != head->ulProtectWord4)) { /*保护字不正确,说明邮箱未初始化,或者内存被踩,报错。*/ ret_val = mailbox_logerro_p1(MAILBOX_NOT_READY, mailcode); goto request_erro;/*lint --e{801}*/ } if(mailbox_get_src_id(mailcode) == mb->local_id) { /* 不允许在中断中发邮件*/ if (MAILBOX_TRUE == mailbox_int_context()) { //TODO:接下来的开发(IFC for 低功耗)可能需要支持在中断中发送邮件,这里就需要锁中断。 ret_val = mailbox_logerro_p1(MAILBOX_ERR_GUT_SEND_MAIL_IN_INT_CONTEXT, mailcode); goto request_erro;/*lint --e{801}*/ } else { if (MAILBOX_OK != mailbox_mutex_lock(&mbuff->mutex)) { /*非中断发送,需要资源保护,获取当前通道资源。*/ ret_val = mailbox_logerro_p1(MAILBOX_CRIT_GUT_MUTEX_LOCK_FAILED, mailcode); goto request_erro;/*lint --e{801}*/ } } } mbuff->mailcode = mailcode; /*共享内存队列,需要依据邮箱头信息对队列操作符进行填充*/ queue = &mbuff->mail_queue; queue->front = queue->base + head->ulFront * sizeof(unsigned int); queue->rear = queue->base + head->ulRear * sizeof(unsigned int); mbuff->mb = mb; *mb_buf = mbuff; return MAILBOX_OK; request_erro: //mailbox_out(("###mailbox_request_channel ERR!"RT)); return ret_val; }
/***************************************************************************** 函 数 名 : mailbox_release_channel 接口类型 : 对内接口 功能描述 : 关闭邮箱,释放资源。 输入参数 : mb_buff* mbuff - 邮箱通道缓存操作符 输出参数 : 无 返 回 值 : 邮箱关闭是否成功 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2012年9月27日 作 者 : 莫南 00176101 修改内容 : 新生成函数 *****************************************************************************/ MAILBOX_LOCAL long mailbox_release_channel(struct mb *mb, struct mb_buff *mbuff) { unsigned long channel_id = mbuff->channel_id; /*需要区分是读还是写*/ if (mb->local_id == mailbox_get_src_id(channel_id)) { if (MAILBOX_TRUE == mailbox_int_context()) { /*TODO:接下来的开发(IFC for 低功耗)可能需要支持在中断中发送邮件, 这里就需要解锁中断。*/ } else { mailbox_mutex_unlock(&mbuff->mutex); } } return MAILBOX_OK; }
MAILBOX_EXTERN unsigned long mailbox_send_msg( unsigned long mailcode, void *data, unsigned long length) { unsigned long ret_val; unsigned long try_go_on = MAILBOX_TRUE; unsigned long try_times = 0; extern bool hifi_is_loaded(void); if (!hifi_is_loaded()) { return MAILBOX_TARGET_NOT_READY; } ret_val= BSP_CPU_StateGet(mailbox_get_dst_id(mailcode)); if(!ret_val) { return MAILBOX_TARGET_NOT_READY; } ret_val = mailbox_try_send_msg(mailcode, data, length); if (MAILBOX_FALSE == mailbox_int_context()) { /*发送满等待轮询尝试*/ while (MAILBOX_FULL == ret_val) { mailbox_delivery(mailbox_get_channel_id(mailcode)); try_go_on = mailbox_scene_delay(MAILBOX_DELAY_SCENE_MSG_FULL, &try_times); if (MAILBOX_TRUE == try_go_on) { ret_val = mailbox_try_send_msg(mailcode, data, length); } else { break; } } } if (MAILBOX_OK != ret_val) { mailbox_show(mailcode,0); mailbox_assert(ret_val); if (MAILBOX_FULL != ret_val) { ret_val = MAILBOX_ERRO; } return ret_val; } return ret_val; }
/***************************************************************************** 函 数 名 : mailbox_send_msg 功能描述 : 提供给各模块进行核间数据发送的接口。 输入参数 : unsigned int mailcode -- 邮件的id号, 逻辑通道号。 unsigned char *data -- 指向邮件数据的指针。 unsigned int length/byte -- 数据或者消息总长度 字节为单位。 输出参数 : 无 返 回 值 : unsigned int 成功OK, 异常返回值 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2012年9月28日 作 者 : 莫南 00176101 修改内容 : 新生成函数 *****************************************************************************/ MAILBOX_EXTERN unsigned int mailbox_send_msg( unsigned int mailcode, void *data, unsigned int length) { int ret_val = MAILBOX_OK; unsigned int try_go_on = MAILBOX_TRUE; int try_times = 0; ret_val= BSP_CPU_StateGet(mailbox_get_dst_id(mailcode)); if(!ret_val) { return MAILBOX_TARGET_NOT_READY; } ret_val = (int)mailbox_try_send_msg(mailcode, data, length); if (MAILBOX_FALSE == mailbox_int_context()) { /*发送满等待轮询尝试*/ while ((int)MAILBOX_FULL == ret_val) { mailbox_delivery(mailbox_get_channel_id(mailcode)); try_go_on = (unsigned int)mailbox_scene_delay(MAILBOX_DELAY_SCENE_MSG_FULL, &try_times); if (MAILBOX_TRUE == try_go_on) { ret_val = (int)mailbox_try_send_msg(mailcode, data, length); } else { break; } } } if (MAILBOX_OK != ret_val) { /*mailbox_show(mailcode,0);*/ /*mailbox_assert(ret_val);*/ if ((int)MAILBOX_FULL != ret_val) { ret_val = (int)MAILBOX_ERRO; } return (unsigned int)ret_val; } return (unsigned int)ret_val; }
MAILBOX_LOCAL long mailbox_request_channel( struct mb *mb, struct mb_buff ** mb_buf, unsigned long mailcode) { struct mb_head *head = MAILBOX_NULL; struct mb_queue *queue = MAILBOX_NULL; struct mb_buff *mbuff = MAILBOX_NULL; long ret_val = MAILBOX_OK; mailbox_dpm_device_get(); *mb_buf = MAILBOX_NULL; mbuff = mailbox_get_channel_handle(mb, mailcode); if (MAILBOX_NULL == mbuff) { ret_val = MAILBOX_ERRO; goto request_erro; } /*通过判断通道保护字,检查通道有没有初始化*/ head = (struct mb_head*)mbuff->config->head_addr; if (( (MAILBOX_PROTECT1 != head->ulProtectWord1) ) || (MAILBOX_PROTECT2 != head->ulProtectWord2) ||(MAILBOX_PROTECT1 != head->ulProtectWord3) || (MAILBOX_PROTECT2 != head->ulProtectWord4)) { #if 1/*k3 modify 保护字不正确重新初始化一下邮箱头,不要return影响通信流程,后续再找根因*/ /*保护字不正确,说明邮箱未初始化,或者内存被踩,报错。*/ /* do not check cause hifi maybe not pwr on when the first ipc message send */ mailbox_init_mem(mbuff->config); mailbox_logerro_p1(MAILBOX_NOT_READY, mailcode); #endif } if(mailbox_get_src_id(mailcode) == mb->local_id) { /* 不允许在中断中发邮件*/ if (MAILBOX_TRUE == mailbox_int_context()) { //TODO:接下来的开发(IFC for 低功耗)可能需要支持在中断中发送邮件,这里就需要锁中断。 ret_val = mailbox_logerro_p1(MAILBOX_ERR_GUT_SEND_MAIL_IN_INT_CONTEXT, mailcode); goto request_erro; } else { if (MAILBOX_OK != mailbox_mutex_lock(&mbuff->mutex)) { /*非中断发送,需要资源保护,获取当前通道资源。*/ ret_val = mailbox_logerro_p1(MAILBOX_CRIT_GUT_MUTEX_LOCK_FAILED, mailcode); goto request_erro; } } } mbuff->mailcode = mailcode; /*共享内存队列,需要依据邮箱头信息对队列操作符进行填充*/ queue = &mbuff->mail_queue; queue->front = queue->base + head->ulFront * sizeof(unsigned long); queue->rear = queue->base + head->ulRear * sizeof(unsigned long); mbuff->mb = mb; *mb_buf = mbuff; return MAILBOX_OK; request_erro: mailbox_out(("###mailbox_request_channel ERR! \n")); mailbox_dpm_device_put(); return ret_val; }