AP侧 :

sensor1_handle_s *hndl1;//创建clients_mutex等互斥锁
sensor1_init()
/*
* 1. 首先获取Adsp的客户端;
* 2. 创建2个线程,一个线程waiting_thread首先等待获取Adsp的客户端,一个线程client_thread建立Adsp的Response的客户端处理线程;
*/
sensor1_open( hndl_ptr,notify_data_cb,(intptr_t)hndl_ptr );{sensor1_msg_header_s smgr_ver_req_hdr;sns_common_version_req_msg_v01 *smgr_version_req = NULL;//构造smgr_version_req的结构error = sensor1_alloc_msg_buf( hndl1,sizeof(sns_common_version_req_msg_v01),(void**)&smgr_version_req );//为smgr_ver_req_hdr 分配空间alloc_smgr_smgr_ver_req(&smgr_ver_req_hdr );//通过sensor1_write调用QMI接口Call到Adsp去send_req( hndl1, (void *)smgr_version_req, smgr_ver_req_hdr );while(1);}

Adsp构造的消息如下

  void alloc_smgr_smgr_ver_req(sensor1_msg_header_s *msg_hdr )
{msg_hdr->service_number = SNS_SMGR_SVC_ID_V01;msg_hdr->msg_id = SNS_SMGR_VERSION_REQ_V01;msg_hdr->msg_size = sizeof(sns_common_version_req_msg_v01);msg_hdr->txn_id = 0;
}

send_req函数实现如下:

void send_req( sensor1_handle_s *hndl, void *req, sensor1_msg_header_s msg_hdr )
{error = sensor1_write( hndl,&msg_hdr,req );if( SENSOR1_SUCCESS != error ) {printf("\nsensor1_write returned %d\n", error);if( SENSOR1_EWOULDBLOCK != error ) {exit(error);}}// Make sure we get a responseerror = 0;pthread_mutex_lock( &my_mutex );clock_gettime( CLOCK_REALTIME, &ts );while( (my_txn_id != msg_hdr.txn_id) && error == 0 ) {ts.tv_sec += 100000000; // wait 100msecerror = pthread_cond_timedwait( &my_cond, &my_mutex, &ts );}my_txn_id = 0;pthread_mutex_unlock( &my_mutex );if( 0 != error ) {printf("\nError while waiting for response message %d\n", error);exit(error);} else {//printf("\nGot response to message\n");}
}

消息发送后,Adsp返回的信息会通过client_thread线程调用notify_data_cb的方式返回,如下:

void notify_data_cb( intptr_t data,sensor1_msg_header_s *msg_hdr_ptr,sensor1_msg_type_e msg_type,void *msg_ptr )
{uint32_t smgr_version;sns_common_version_resp_msg_v01* respMsgPtr;if( NULL == msg_hdr_ptr ) {printf("\nreceived NULL msg_hdr_ptr!\n");} else {printf("hdr.service_number: %u\n\thdr.msg_id: %d\n\t""hdr.msg_type: %d\n\thdr.msg_size: %d\n\thdr.txn_id: %d\n",msg_hdr_ptr->service_number,msg_hdr_ptr->msg_id,msg_type,msg_hdr_ptr->msg_size,msg_hdr_ptr->txn_id );}if( msg_type == SENSOR1_MSG_TYPE_RESP && NULL != msg_hdr_ptr ) {printf("received RESP\n");if( msg_hdr_ptr->service_number == SNS_SMGR_SVC_ID_V01 ) {switch (msg_hdr_ptr->msg_id) {case SNS_SMGR_VERSION_RESP_V01:     printf("received smgr version resp\n");respMsgPtr = (sns_common_version_resp_msg_v01 *)msg_ptr;if (respMsgPtr->resp.sns_result_t == 0) {smgr_version = respMsgPtr->interface_version_number;printf("%s: SMGR version=%d \n", __FUNCTION__, smgr_version);}else{printf("SMGR Get Response Failed\n");}break;        case SNS_SMGR_ALL_SENSOR_INFO_RESP_V01:handle_smgr_all_sensor_info_resp(msg_ptr );break;case SNS_SMGR_SINGLE_SENSOR_INFO_RESP_V01:handle_smgr_single_sensor_info_resp( msg_ptr );break;case SNS_SMGR_REPORT_RESP_V01:handle_smgr_report_resp();break;default:break;}}pthread_mutex_lock( &my_mutex );my_txn_id = msg_hdr_ptr->txn_id;pthread_cond_signal( &my_cond );pthread_mutex_unlock( &my_mutex );} else if( msg_type == SENSOR1_MSG_TYPE_IND ) {printf("*");fflush(NULL);pthread_mutex_lock( &my_mutex );num_indications++;pthread_cond_signal( &my_cond );pthread_mutex_unlock( &my_mutex );} else if( msg_type == SENSOR1_MSG_TYPE_BROKEN_PIPE ) {printf("\nreceived BROKEN_PIPE!!!\n");} else {printf( "\nreceived INVALID MSG type: %i!!!\n", msg_type );}if( NULL != msg_ptr ) {sensor1_free_msg_buf( *((sensor1_handle_s**)data), msg_ptr );}
}

Adsp的流程如下:

adsp_proc\sensors\smgr\src\sns_rh_main.c

SMGR_STATIC sns_err_code_e sns_rh_process_external_smgr_request(sns_rh_mr_req_q_item_s** msg_ptr_ptr)
{...case SNS_SMGR_VERSION_REQ_V01:err_code = sns_rh_process_version_request(*msg_ptr_ptr);break;...
}

sns_rh_process_version_request调用如下:

adsp_proc\sensors\smgr\src\sns_rh_main.c

/*=========================================================================*/
SMGR_STATIC sns_err_code_e sns_rh_process_version_request(const sns_rh_mr_req_q_item_s* msg_ptr)
{sns_err_code_e err_code = SNS_ERR_NOMEM;sns_common_version_resp_msg_v01* resp_ptr =SMGR_ALLOC_STRUCT(sns_common_version_resp_msg_v01);/* -------------------------------------------------------------------- */if ( resp_ptr != NULL ){sns_rh_mr_header_s resp_msg_header = msg_ptr->header;resp_ptr->max_message_id = SNS_SMGR_SVC_V01_MAX_MESSAGE_ID;resp_ptr->interface_version_number = SNS_SMGR_SVC_V01_IDL_MINOR_VERS+1;resp_msg_header.msg_id   = SNS_SMGR_VERSION_RESP_V01;resp_msg_header.body_len = sizeof(sns_common_version_resp_msg_v01);resp_ptr->resp.sns_result_t = SNS_RESULT_SUCCESS_V01;resp_ptr->resp.sns_err_t    = SENSOR1_SUCCESS;sns_rh_mr_send_resp(&resp_msg_header, (void**)&resp_ptr);SNS_SMGR_PRINTF0(HIGH, "Jon smgr response");err_code = SNS_SUCCESS;}return err_code;
}

高通ADSP和AP间的通讯过程相关推荐

  1. 高通成功测试首款5G通讯模组,我们离使用5G网络还远吗?

    如今的4G网络的无线数据传输每秒可以达到450M-650M,5G通信标准承诺为智能手机用户带来5G的传输速度.尽管这听起来有点儿令人难以置信,但是高通公司已经宣布在骁龙X50 5G通讯模组芯片上第一次 ...

  2. 高通平台dtb文件的加载过程

    高通平台dtb文件的加载过程 高通平台对dts的两种打包方式 zImage-dtb dt.img zImage-dtb方式 zImage-dtb的编译 二进制文件查看 lk的加载过程代码分析 dt.i ...

  3. 高通ADSP抓取sensor init log

    高通平台adsp sensor的驱动log需要使用QXDM抓取,sensor init是sensor初始化的log信息,这时候QXDM还没有识别到diag口,无法直接获取. 高通支持如下两种获取ads ...

  4. 高通atheros ar93xx AP软件体系结构

    AP软件体系结构包括两部分: 1.WLAN上层应用工具,包括iwconfig/iwpriv/hostapd等,用于配置和调试无线内核驱动 2.WLAN驱动.是WLAN软件的核心部件 进一步,WLAN驱 ...

  5. 高通 ADSP sensor SSC

    1.添加入口函数: adsp\sensors\dd\qcom\inc\sns_dd.h extern sns_ddf_driver_if_s sns_dd_<new_sensor_model&g ...

  6. Android9.0删除高通ADsp固件(二十六)

    android audio 生产者与消费者 简介 全面接触生产者/消费者问题是在操作系统原理中,并发性原理讨论的问题 生产者/消费者问题.最近的工作偏向音频,接着上一篇文章,用生产者,消费者模型来理解 ...

  7. 高通ATHEROS AR93XX AP无线驱动介绍2

    无线处理上下文 1.ISR中断处理:ath_isr ath_attach时,即注册中断号和中断处理函数ath_isr. 同时注册软中断函数ath_tasklet去执行下半部. 2.软中断:ath_ta ...

  8. 数字音频接口(二) 高通平台MI2S总线调试

    硬件平台:高通SM6125 基线代码:LA.UM.8.11.1.c1 git clone https://git.codelinaro.org/clo/la/platform/vendor/opens ...

  9. 【转载】高通msm8996平台的ASOC音频路径分析(基于androidN及linux3.1x)

    高通msm8996平台的ASOC音频路径分析(基于androidN及linux3.1x) tags : msm8996 sound linux android 原文:高通msm8996平台的ASOC音 ...

最新文章

  1. HBase存储剖析与数据迁移
  2. flex 换主轴后子元素占满_css flex justify-content属性,子元素在主轴上的对齐方式。...
  3. JQuery源码解析(一)
  4. pl/sql developer导入导出
  5. 最小硬盘实现单原子信息存储 超现有硬盘500倍
  6. SAP ui5 xml view parse and control creation point
  7. 读源码,对程序员重要吗?
  8. React开发(185):ant design table控制居中和宽度
  9. 875. Koko Eating Bananas
  10. 数据字典表Truncate丢失将招致数据库不可用
  11. SpringMVC框架第一天
  12. 第1章 数据可视化概述
  13. RBG-D深度相机的相关资料
  14. maxscale mysql_安装maxscale MySql读写分离
  15. P3369 普通平衡树模板 treap
  16. 微信Wifi物联架构---机智云/云智易如何接入微信硬件平台
  17. 【AI框架】MMDetection3D 使用指南
  18. ios animation 动画效果实现
  19. openstack 云计算平台 mitaka 搭建
  20. 2020 - 2021 年 Web 前端最新导航 - 前端学习资源分享前端面试资源汇总

热门文章

  1. orale创建视图sql
  2. Matlab 中 global 函数实例解析
  3. js中增加标签删除标签和input修改获取内容
  4. GO语言 go build -ldflags Windows 打包精简方式
  5. 计算高中数学的计算机在线使用,利用计算机进行数学实验案例设计
  6. 【空气质量数据分析专题七】污染物浓度月变化分析
  7. WindbgPreview虚拟机双机内核调试
  8. JAVA 获取今天,7天前,一个月前,今年起始日期,同比日期 各种时间段的方法归结
  9. 时间序列预测 | Python实现LSTM多变量时间序列数据预测
  10. js--事件--事件代理