/***************************************************************************** 函 数 名 : DRV_MAILBOX_READMAILDATA 功能描述 : 邮箱用户在数据接收回调函数中调用, 从邮箱中读取一封最先到达的邮件 输入参数 : MailHandle -- 邮箱句柄, 数据接收回调函数入参 pData -- 保存待读出数据的缓存地址 *pSize -- 缓存长度, 单位byte, 需要大于待读取邮件长度 输出参数 : *pSize -- 实际读取长度, 单位byte 返 回 值 : 正确:MAILBOX_OK / 错误:MAILBOX_ERRO或者其他错误码 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2012年10月26日 作 者 : 莫南 00176101 修改内容 : 新生成函数 *****************************************************************************/ unsigned int DRV_MAILBOX_READMAILDATA( void *MailHandle, unsigned char *pData, unsigned int *pSize) { return mailbox_read_msg_data(MailHandle, (char *)pData, pSize); }
/***************************************************************************** 函 数 名 : test_hifi_mail_handle 功能描述 : 邮箱回调函数 输入参数 : 无 输出参数 : 无 返 回 值 : int 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2013年5月25日 作 者 : 路由切换 修改内容 : 新生成函数 *****************************************************************************/ void test_hifi_handle_mail( void *usr_para, void *mail_handle, unsigned int mail_len ) { int ret_mail = OK; unsigned int *pmail_value; unsigned char *mail_buff; /* 邮箱数据接收的buff */ printk("test_hifi_handle_mail\n"); mail_buff = (unsigned char *)kmalloc(mail_len, GFP_ATOMIC); /* 将剩余内容copy透传到buff中 */ ret_mail = mailbox_read_msg_data(mail_handle, (unsigned char*)mail_buff, (unsigned long *)&mail_len); pmail_value =(unsigned int *) mail_buff; if (NULL != pmail_value) { printk("mail reture value %x \n",*pmail_value); } if (NULL != mail_buff) { kfree(mail_buff); } }
MCA_LOCAL void mca_rsp_isr(void *UserHandle, void *MailHandle, unsigned long MailLen) { #if 0 struct mca_frame frame = {0}; struct mca_sdata sdata = {0}; unsigned long frame_size; if(mailbox_read_msg_data(MailHandle, (unsigned char*)&frame, &frame_size) != MAILBOX_OK) return; if(frame.cmd_id != MCA_CMD_RSP) return; if(mca_read_session(frame.sid, &sdata)) return; if(frame.stype == MCA_SESSION_SYNC) { // check if session expired. if(mca_is_session_locked(frame.sid)) { *sdata.p_rsp = frame.udata; mca_unlock_session(frame.sid); } else mca_remove_session(frame.sid); } else if(frame.stype == MCA_SESSION_ASYN) { if(sdata.post_cb) sdata.post_cb(frame.udata, sdata.private_data); mca_remove_session(frame.sid); } #endif }
/***************************************************************************** 函 数 名 : hifi_misc_handle_mail 功能描述 : Hifi MISC 设备双核通信接收中断处理函数 约定收到HIIF邮箱消息的首4个字节是MSGID 输入参数 : void *usr_para : 注册时传递的参数 void *mail_handle : 邮箱数据参数 unsigned int mail_len : 邮箱数据长度 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2012年8月1日 作 者 : 夏青 00195127 修改内容 : 新生成函数 *****************************************************************************/ static void hifi_misc_handle_mail(void *usr_para, void *mail_handle, unsigned int mail_len) { unsigned int ret_mail = 0; struct recv_request *recv = NULL; HIFI_CHN_CMD *cmd_para = NULL; IN_FUNCTION; if (NULL == mail_handle) { loge("mail_handle is NULL.\n"); goto END; } if (mail_len <= SIZE_CMD_ID) { loge("mail_len is less than SIZE_CMD_ID(%d).\n", mail_len); goto END; } recv = (struct recv_request *)kmalloc(sizeof(struct recv_request), GFP_ATOMIC); if (NULL == recv) { loge("recv kmalloc failed.\n"); goto ERR; } memset(recv, 0, sizeof(struct recv_request)); /* 设定SIZE */ recv->rev_msg.mail_buff_len = mail_len; /* 分配总的空间 */ recv->rev_msg.mail_buff = (unsigned char *)kmalloc(SIZE_LIMIT_PARAM, GFP_ATOMIC); if (NULL == recv->rev_msg.mail_buff) { loge("recv->rev_msg.mail_buff kmalloc failed.\n"); goto ERR; } memset(recv->rev_msg.mail_buff, 0, SIZE_LIMIT_PARAM); /* 将剩余内容copy透传到buff中 */ #ifdef PLATFORM_HI3XXX ret_mail = mailbox_read_msg_data(mail_handle, (char*)(recv->rev_msg.mail_buff), (unsigned int *)(&(recv->rev_msg.mail_buff_len))); #endif #ifdef PLATFORM_HI6XXX ret_mail = DRV_MAILBOX_READMAILDATA(mail_handle, (char*)recv->rev_msg.mail_buff, (unsigned int *)&recv->rev_msg.mail_buff_len); #endif if ((ret_mail != MAILBOX_OK) || (recv->rev_msg.mail_buff_len <= 0)) { loge("Empty point or data length error! ret=0x%x, mail_size: %d.\n", (unsigned int)ret_mail, recv->rev_msg.mail_buff_len); goto ERR; } logd("ret_mail=%d, mail_buff_len=%d, msgID=0x%x.\n", ret_mail, recv->rev_msg.mail_buff_len, *((unsigned int *)(recv->rev_msg.mail_buff + mail_len - SIZE_CMD_ID))); if (recv->rev_msg.mail_buff_len > mail_len) { loge("ReadMailData mail_size(%d) > mail_len(%d).\n", recv->rev_msg.mail_buff_len, mail_len); goto ERR; } /* 约定,前4个字节是cmd_id */ cmd_para = (HIFI_CHN_CMD *)(recv->rev_msg.mail_buff + mail_len - SIZE_CMD_ID); /* 赋予不同的接收指针,由接收者释放分配空间 */ if (HIFI_CHN_SYNC_CMD == cmd_para->cmd_type) { if (s_misc_data.sn == cmd_para->sn) { #ifdef PLATFORM_HI6XXX wake_lock_timeout(&s_misc_data.hifi_misc_wakelock, HZ / 2); #endif spin_lock_bh(&s_misc_data.recv_sync_lock); list_add_tail(&recv->recv_node, &recv_sync_work_queue_head); spin_unlock_bh(&s_misc_data.recv_sync_lock); complete(&s_misc_data.completion); } else { loge("s_misc_data.sn !== cmd_para->sn: %d, %d.\n", s_misc_data.sn, cmd_para->sn); } goto END; } else if ((HIFI_CHN_READNOTICE_CMD == cmd_para->cmd_type) && (ACPU_TO_HIFI_ASYNC_CMD == cmd_para->sn)) { #ifdef PLATFORM_HI3XXX if (HIFI_CHN_READNOTICE_CMD == cmd_para->cmd_type) { wake_lock_timeout(&s_misc_data.hifi_misc_wakelock, 5*HZ); } #endif #ifdef PLATFORM_HI6XXX wake_lock_timeout(&s_misc_data.hifi_misc_wakelock, HZ); #endif spin_lock_bh(&s_misc_data.recv_proc_lock); list_add_tail(&recv->recv_node, &recv_proc_work_queue_head); s_misc_data.wait_flag++; spin_unlock_bh(&s_misc_data.recv_proc_lock); wake_up(&s_misc_data.proc_waitq); goto END; } else { loge("unknown msg comed from hifi .\n"); } ERR: if (recv) { if (recv->rev_msg.mail_buff) { kfree(recv->rev_msg.mail_buff); } kfree(recv); } END: OUT_FUNCTION; return; }