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;
}