示例#1
0
/*****************************************************************************
 函 数 名  : hifi_misc_async_write
 功能描述  : Hifi MISC 设备异步发送接口,将异步消息发给Hifi,非阻塞接口
 输入参数  :
             unsigned char *arg  :需要下发的数据buff指针
             unsigned int len    :下发的数据长度
 输出参数  : 无
 返 回 值  : int
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   : 2012年8月1日
    作    者   : 夏青 00195127
    修改内容   : 新生成函数

*****************************************************************************/
int hifi_misc_async_write(unsigned char *arg, unsigned int len)
{
    int ret =0;

    IN_FUNCTION;

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

    logd("len=%d, arg=0x%p\n", len, arg);

    /*调用核间通信接口发送数据*/
    ret = DRV_MAILBOX_SENDMAIL(MAILBOX_MAILCODE_ACPU_TO_HIFI_MISC, arg, len);

    if ( OK != ret )
    {
        loge("msg send to hifi fail,ret is %d\n", ret);
        return ERROR;
    }
    logd("SendMail ret=%d\n", ret);

    OUT_FUNCTION;

    return OK;
}
s32 send_msg_to_hifi(DRV_RESET_CALLCBFUN_MOMENT stage)
{
	s32 ret = RESET_ERROR;
	AP_HIFI_CCPU_RESET_REQ_STRU hifi_mailbox = {0};

	reset_print_debug("(%d) stage%d,ID_AP_HIFI_CCPU_RESET_REQ=%d\n", ++g_reset_debug.main_stage, (s32)stage, (s32)ID_AP_HIFI_CCPU_RESET_REQ);

	if (DRV_RESET_CALLCBFUN_RESET_BEFORE == stage)
	{
		/*消息ID*/
		hifi_mailbox.uhwMsgId = ID_AP_HIFI_CCPU_RESET_REQ;
		ret = DRV_MAILBOX_SENDMAIL(MAILBOX_MAILCODE_ACPU_TO_HIFI_CCORE_RESET_ID, (void *)(&hifi_mailbox), sizeof(hifi_mailbox)); /*lint !e713 */
		if(MAILBOX_OK != ret)
		{
			reset_print_err("fail to send msg to hifi\n");
			return RESET_ERROR;
		}
	}

	/* 如果有必要,其他阶段也通知hifi */
	return RESET_OK;
}
示例#3
0
    ret = down_trylock(&g_misc_data.sync_sem);
    if (!ret){
        loge("some msg need to be cleaned enter\n");
        spin_lock_bh(&g_misc_data.recv_sync_lock);
        while(!list_empty(&recv_sync_work_queue_head)){
            recv = list_entry(recv_sync_work_queue_head.next, struct recv_request, recv_node);
            list_del(&recv->recv_node);
            kfree(recv->rev_msg.mail_buff);
            kfree(recv);
            recv = NULL;
        }
        spin_unlock_bh(&g_misc_data.recv_sync_lock);
        loge("some msg need to be cleaned exist\n");
    }
    /*调用核间通信接口发送数据,得到返回值ret*/
    ret = DRV_MAILBOX_SENDMAIL(MAILBOX_MAILCODE_ACPU_TO_HIFI_MISC, buff, len);
    if ( OK != ret )
    {
        loge("msg send to hifi fail,ret is %d\n", ret);
        return ERROR;
    }
    logd("sendmail ret=%d\n", ret);

    logd("down_timeout B, mb_ret=%d\n", ret);

    /*等待同步信号量*/
    ret = down_timeout(&g_misc_data.sync_sem, msecs_to_jiffies(2000));

    logd("down_timeout L, down_ret=%d\n", ret);
    g_misc_data.sn++;
    if (unlikely(g_misc_data.sn & 0x10000000)){