dsps部分跟AP端是采用共享内存的方式来交换信息的,对于打印来说,如果把所有的字符串都传到AP端,那么就非常占用共享的内存,所有采用了传递整型数标签的方式。首先在dsps和AP端都约定好,比如:dsps传递0,在AP端就代表"MAG8975: Initializing"这么一个字符串。

在dsps代码部分,在sns_debug_str.h文件中,定义了不同等级,不同参数个数的打印函数:

......

#define SNS_PRINTF_STRING_ID_HIGH_0(mod_id,str_id)

#define SNS_PRINTF_STRING_ID_HIGH_1(mod_id,str_id,parameter1)

......

我们在使用的时候,根据情况调用不同的函数进行打印,这里的几个参数,从字面意思上可以看到,他们分别是模块对于的ID号,模块里面对应的字符串的ID号,后面就是参数。这里说的ID,就是上面讲到的传递的整型数标签,下面就讲讲模块ID和字符串ID。

这个模块ID,在dsps部分的代码和AP端的代码都有定义,而且他们肯定是一样的,这样才是一种约定,在sns_debug_api.h有如下定义(AP端代码也有):

typedef enum {SNS_DBG_MOD_APPS_SMR,SNS_DBG_MOD_APPS_DIAG,SNS_DBG_MOD_APPS_ACM,SNS_DBG_MOD_APPS_INIT,SNS_DBG_MOD_DSPS_SMGR,SNS_DBG_MOD_DSPS_SAM,SNS_DBG_MOD_DSPS_SMR,SNS_DBG_MOD_DSPS_DD_ACCEL,SNS_DBG_MOD_DSPS_DD_GYRO,SNS_DBG_MOD_DSPS_DD_ALSPRX,SNS_DBG_MOD_DSPS_DD_MAG8975,SNS_DBG_MOD_APPS_MAIN,SNS_DBG_MOD_EM,SNS_DBG_MOD_APPS_PWR,SNS_DBG_MOD_APPS_SAM,SNS_DBG_MOD_DSPS_SCM,SNS_DBG_MOD_APPS_SCM,SNS_DBG_MOD_MDM_SMR,SNS_DBG_MOD_MDM_DIAG,SNS_DBG_MOD_MDM_ACM,SNS_DBG_MOD_MDM_INIT,SNS_DBG_MOD_MDM_MAIN,SNS_DBG_MOD_MDM_PWR,SNS_DBG_MOD_DSPS_DAL,SNS_DBG_MOD_DSPS_DDF,SNS_DBG_MOD_APPS_REG,SNS_DBG_MOD_APPS_TIME,SNS_DBG_MOD_DSPS_DIAG,SNS_DBG_MOD_DSPS_PWR,/* Last module ID */SNS_DBG_NUM_MOD_IDS
} sns_debug_module_id_e;

可以看到他们就是枚举类型,比如对于接近和光感模块,可以采用ID: SNS_DBG_MOD_DSPS_DD_ALSPRX,

那么对于字符串ID呢,在dsps会定义很多ID,然后在AP端的代码里面,会对不同的ID,定义不同的字符串,在dsps的sns_debug_api.h中截取一段光感模块的字符串ID定义:

#define DBG_DD_ALSPRX_WR_CMD2_REG_ERR                 0
#define DBG_DD_ALSPRX_WR_CMD1_REG_ERR                 1
#define DBG_DD_ALSPRX_DEV_STATE_PEND                  2
#define DBG_DD_ALSPRX_PRX_STATE_PEND                  3
#define DBG_DD_ALSPRX_ALS_RES_INVALID                 4
#define DBG_DD_ALSPRX_ALS_RNG_INVALID                 5
...

在AP端的sns_string_db.h文件里面有定义,对不同的ID定义不同的字符串,下面是截取的一部分:

#define DD_ALPRX_STR_DB \
{ {DBG_DD_ALSPRX_WR_CMD2_REG_ERR, "ALSPRX: Write to command2 register failed"  },  /*Id 0*/ \{DBG_DD_ALSPRX_WR_CMD1_REG_ERR, "ALSPRX: Write to command1 register failed"  },  /*Id 1*/ \{DBG_DD_ALSPRX_DEV_STATE_PEND, "ALSPRX: PRX/ALS read already pending"        },  /*Id 2*/ \{DBG_DD_ALSPRX_PRX_STATE_PEND, "ALSPRX: PRX read already pending"            },  /*Id 3*/ \{DBG_DD_ALSPRX_ALS_RES_INVALID, "ALSPRX: Invalid resolution: %d"             },  /*Id 4*/ \{DBG_DD_ALSPRX_ALS_RNG_INVALID, "ALSPRX: Invalid range: %d"                  },  /*Id 5*/ \
...

OK,当dsps传入2,那么AP端就会打印“ALSPRX: PRX/ALS read already pending”这样一句字符串。上面我们已经对不同的模块ID和字符串ID在两个系统间的约定已经进行了说明。如果自己需要添加新模块的打印信息,可以在这些文件中,在两边进行同步的更改。那么,是不是定了的就一定会打印出来呢,其实不然,AP端对需要处理的模块还放到了一个数组里面,只有定义在这个数组里面的模块才会打印。在sns_debug_str.c文件中:

/* Pointer to debug string databases of sensor modules */
static const db_list_s sensor_dbg_db_ptrs[] = {// DIAG module{SNS_DBG_MOD_APPS_DIAG, diag_debug_str_db,(sizeof(diag_debug_str_db)/sizeof(diag_debug_str_db[0]))},//SAM DSPS Module{SNS_DBG_MOD_DSPS_SAM, sam_debug_str_db,(sizeof(sam_debug_str_db)/sizeof(sam_debug_str_db[0]))},//SAM Apps Module{SNS_DBG_MOD_APPS_SAM, sam_debug_str_db,(sizeof(sam_debug_str_db)/sizeof(sam_debug_str_db[0]))},//SMGR Module{SNS_DBG_MOD_DSPS_SMGR, smgr_debug_str_db,(sizeof(smgr_debug_str_db)/sizeof(smgr_debug_str_db[0]))},//SMR Apps Module{SNS_DBG_MOD_APPS_SMR, smr_debug_str_db,(sizeof(smr_debug_str_db)/sizeof(smr_debug_str_db[0]))},//SMR DSPS Module{SNS_DBG_MOD_DSPS_SMR, smr_debug_str_db,(sizeof(smr_debug_str_db)/sizeof(smr_debug_str_db[0]))},//ALS Proximity Device Driver Module{SNS_DBG_MOD_DSPS_DD_ALSPRX, dd_alsprx_debug_str_db,(sizeof(dd_alsprx_debug_str_db)/sizeof(dd_alsprx_debug_str_db[0]))},//AKM8975 Magnetometer Device Driver Module{SNS_DBG_MOD_DSPS_DD_MAG8975, dd_mag8975_debug_str_db,(sizeof(dd_mag8975_debug_str_db)/sizeof(dd_mag8975_debug_str_db[0]))},//Accel Device Driver Module{SNS_DBG_MOD_DSPS_DD_ACCEL, dd_accel_debug_str_db,(sizeof(dd_accel_debug_str_db)/sizeof(dd_accel_debug_str_db[0]))},//Gyro Device Driver Module{SNS_DBG_MOD_DSPS_DD_GYRO, dd_gyro_debug_str_db,(sizeof(dd_gyro_debug_str_db)/sizeof(dd_gyro_debug_str_db[0]))},//SCM Module{SNS_DBG_MOD_DSPS_SCM, scm_debug_str_db,(sizeof(scm_debug_str_db)/sizeof(scm_debug_str_db[0]))}
};

在dsps传入模块ID之后,他会在这个数组里面进行搜寻,如果没有包含,就会在log里面打印出db ptr NULL OR string ID not valid (%d)这样一句话。

dsps内容比较多,未完待续。。。

高通dsps部分的打印相关推荐

  1. QXDM打印高通sensor 日志问题总结

    在使用QXDM打印高通sensor日志的时候,经常会发现有些赋予已经权限很高的log居然打印不出来,这就个代码的追踪带来了一系列困难,鉴于此,我研究了一下高通中log打印问题,给大家今后的使用带来一些 ...

  2. linux驱动由浅入深系列:高通sensor架构实例分析之一

    点击打开链接 本系列导航: linux驱动由浅入深系列:高通sensor架构实例分析之一(整体概览+AP侧代码分析) linux驱动由浅入深系列:高通sensor架构实例分析之二(adsp驱动代码结构 ...

  3. 高通 MSM8K bootloader : SBL1 .

    一. MSM8K Boot Flow 图1: 高通MSM8K平台bootloader启动流程基本类似,但具体各平台,比如MSM8974.MSM8916.MSM8994等,会有微小区别. 从上图,可以看 ...

  4. 高通android开发摘要

    一部分是开源的,可以从codeaurora.org上下载,还有一部分是高通产权的,需要从高通的网站上下载. 将高通产权的代码放到:vendor/qcom/proprietary 1. 设置bms一些参 ...

  5. 高通Android平台硬件调试之Camera篇

    之前一段时间有幸在高通android平台上调试2款camera sensor,一款是OV的5M YUV sensor,支持jpeg out,同时也支持AF,调试比较比较简单,因为别的项目已经在使用了, ...

  6. 【CV】一文讲懂图像处理中的低通、高通、带阻和带通滤波器

    空间域和频域滤波器通常分为四种类型的滤波器--低通.高通.带阻和带通滤波器.在本文中,我们为每一种滤波器提供了注释.代码示例和图像输出. 滤波器类型 低通滤波器:只允许通过低频细节,衰减高频细节.例如 ...

  7. Android 指纹调试流程(高通、MTK均适用)

    前言:指纹调试我们只需要关注kernel.hal.ta就可以将其点亮,高通使用自己的tee环境,MTK则需要使用第三方tee OS,三方tee的集成调试一般会有厂家配合,主要是调试spi ta,在此就 ...

  8. 高通LCD的pwm背光驱动

    发生异常的现象: msm8953 lcd在快速亮灭的情况下背光概率性休眠不灭:测量高通pwm,发现正常的时候pwm的管脚LCM_BL_PWM为低电平,失败的时候为高电平: 根据原理图: mpp是什么? ...

  9. 高通8X25Q wifi BT 调试文档

    1.蓝牙调试 主要是蓝牙的I2C地址跟 地磁仪的I2C地址冲突,被地磁仪给占用了,改回来就好了. --- a/android-lte/kernel/arch/arm/mach-msm/msm8x25/ ...

最新文章

  1. 【C#】集合_哈希表_字典_泛型_文件
  2. 2021-03-13
  3. RDS用户如何优化报警规则
  4. CircleDisplay
  5. oracle 存储过程字符替换,Oracle存储过程常用字符串处理函数整理
  6. java ftp 判断目录存在_java判断ftp目录是否存在的方法
  7. Azure夜校培训第二场2月22日18:00 正式盛情开幕
  8. 智能推荐系统的终极目标:“让你成为更好的自己”
  9. 一些意想不到的bug
  10. PDF阅读器哪个好用?看完这篇文章就可以不用再问了
  11. 中文同义词近义词库 vs 词向量
  12. 等级保护--云计算安全扩展要求
  13. mfc通过com控制AutoCAD导出jpg文件
  14. 极化码自适应CA-SCL译码(极化码译码)
  15. 基于opencv的手眼标定算法详解一-----------opencv之相机标定函数calibrateCamera()介绍
  16. JavaScript键盘鼠标事件处理
  17. 2016推免面试经历纪实——四川大学计算机学院
  18. python xlrd使用_在Python中使用xlrd以文本形式读取数值Excel数据
  19. OKR是上下同欲的载体
  20. html四种选择器的特点,css四种选择器总结

热门文章

  1. 从SCTF看JWT安全 (附SCTF web writeup)
  2. 几行代码实现c++/qt程序进程单例(文件锁)
  3. vue ssr 报错 ReferenceError: window is not defined
  4. E路航GPS LH900 使用
  5. 查看用户锁表和对表解锁的 sql 语句
  6. 本地电脑文件共享服务器,服务器和电脑文件的共享
  7. hping3工具介绍
  8. python 参数后面加冒号:, 函数后面的添加箭头 None
  9. JS简单粗暴地实现浅克隆
  10. taro框架 Switch组件不兼容android手机