高通dsps部分的打印

来源:互联网 发布:漂亮老婆 知乎 编辑:程序博客网 时间:2024/06/05 07:42

链接地址:高通dsps部分的打印

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端代码也有):

[cpp] view plain copy
  1. typedef enum {  
  2.    SNS_DBG_MOD_APPS_SMR,  
  3.    SNS_DBG_MOD_APPS_DIAG,  
  4.    SNS_DBG_MOD_APPS_ACM,  
  5.    SNS_DBG_MOD_APPS_INIT,  
  6.    SNS_DBG_MOD_DSPS_SMGR,  
  7.    SNS_DBG_MOD_DSPS_SAM,  
  8.    SNS_DBG_MOD_DSPS_SMR,  
  9.    SNS_DBG_MOD_DSPS_DD_ACCEL,  
  10.    SNS_DBG_MOD_DSPS_DD_GYRO,  
  11.    SNS_DBG_MOD_DSPS_DD_ALSPRX,  
  12.    SNS_DBG_MOD_DSPS_DD_MAG8975,  
  13.    SNS_DBG_MOD_APPS_MAIN,  
  14.    SNS_DBG_MOD_EM,  
  15.    SNS_DBG_MOD_APPS_PWR,  
  16.    SNS_DBG_MOD_APPS_SAM,  
  17.    SNS_DBG_MOD_DSPS_SCM,  
  18.    SNS_DBG_MOD_APPS_SCM,  
  19.   
  20.    SNS_DBG_MOD_MDM_SMR,  
  21.    SNS_DBG_MOD_MDM_DIAG,  
  22.    SNS_DBG_MOD_MDM_ACM,  
  23.    SNS_DBG_MOD_MDM_INIT,  
  24.    SNS_DBG_MOD_MDM_MAIN,  
  25.    SNS_DBG_MOD_MDM_PWR,  
  26.   
  27.    SNS_DBG_MOD_DSPS_DAL,  
  28.    SNS_DBG_MOD_DSPS_DDF,  
  29.   
  30.    SNS_DBG_MOD_APPS_REG,  
  31.    SNS_DBG_MOD_APPS_TIME,  
  32.    SNS_DBG_MOD_DSPS_DIAG,  
  33.    SNS_DBG_MOD_DSPS_PWR,  
  34.    /* Last module ID */  
  35.    SNS_DBG_NUM_MOD_IDS  
  36. } sns_debug_module_id_e;  
可以看到他们就是枚举类型,比如对于接近和光感模块,可以采用ID: SNS_DBG_MOD_DSPS_DD_ALSPRX,

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

[cpp] view plain copy
  1. #define DBG_DD_ALSPRX_WR_CMD2_REG_ERR                 0  
  2. #define DBG_DD_ALSPRX_WR_CMD1_REG_ERR                 1  
  3. #define DBG_DD_ALSPRX_DEV_STATE_PEND                  2  
  4. #define DBG_DD_ALSPRX_PRX_STATE_PEND                  3  
  5. #define DBG_DD_ALSPRX_ALS_RES_INVALID                 4  
  6. #define DBG_DD_ALSPRX_ALS_RNG_INVALID                 5  
  7. ...  

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

[cpp] view plain copy
  1. #define DD_ALPRX_STR_DB \  
  2. { {DBG_DD_ALSPRX_WR_CMD2_REG_ERR, "ALSPRX: Write to command2 register failed"  },  /*Id 0*/ \  
  3.   {DBG_DD_ALSPRX_WR_CMD1_REG_ERR, "ALSPRX: Write to command1 register failed"  },  /*Id 1*/ \  
  4.   {DBG_DD_ALSPRX_DEV_STATE_PEND, "ALSPRX: PRX/ALS read already pending"        },  /*Id 2*/ \  
  5.   {DBG_DD_ALSPRX_PRX_STATE_PEND, "ALSPRX: PRX read already pending"            },  /*Id 3*/ \  
  6.   {DBG_DD_ALSPRX_ALS_RES_INVALID, "ALSPRX: Invalid resolution: %d"             },  /*Id 4*/ \  
  7.   {DBG_DD_ALSPRX_ALS_RNG_INVALID, "ALSPRX: Invalid range: %d"                  },  /*Id 5*/ \  
  8. ...  
OK,当dsps传入2,那么AP端就会打印“ALSPRX: PRX/ALS read already pending”这样一句字符串。上面我们已经对不同的模块ID和字符串ID在两个系统间的约定已经进行了说明。如果自己需要添加新模块的打印信息,可以在这些文件中,在两边进行同步的更改。那么,是不是定了的就一定会打印出来呢,其实不然,AP端对需要处理的模块还放到了一个数组里面,只有定义在这个数组里面的模块才会打印。在sns_debug_str.c文件中:

[cpp] view plain copy
  1. /* Pointer to debug string databases of sensor modules */  
  2. static const db_list_s sensor_dbg_db_ptrs[] = {  
  3.   // DIAG module  
  4.   {SNS_DBG_MOD_APPS_DIAG, diag_debug_str_db,  
  5.    (sizeof(diag_debug_str_db)/sizeof(diag_debug_str_db[0]))},  
  6.   //SAM DSPS Module  
  7.   {SNS_DBG_MOD_DSPS_SAM, sam_debug_str_db,  
  8.    (sizeof(sam_debug_str_db)/sizeof(sam_debug_str_db[0]))},  
  9.   //SAM Apps Module  
  10.   {SNS_DBG_MOD_APPS_SAM, sam_debug_str_db,  
  11.    (sizeof(sam_debug_str_db)/sizeof(sam_debug_str_db[0]))},  
  12.   //SMGR Module  
  13.   {SNS_DBG_MOD_DSPS_SMGR, smgr_debug_str_db,  
  14.    (sizeof(smgr_debug_str_db)/sizeof(smgr_debug_str_db[0]))},  
  15.   //SMR Apps Module  
  16.   {SNS_DBG_MOD_APPS_SMR, smr_debug_str_db,  
  17.    (sizeof(smr_debug_str_db)/sizeof(smr_debug_str_db[0]))},  
  18.   //SMR DSPS Module  
  19.   {SNS_DBG_MOD_DSPS_SMR, smr_debug_str_db,  
  20.    (sizeof(smr_debug_str_db)/sizeof(smr_debug_str_db[0]))},  
  21.   //ALS Proximity Device Driver Module  
  22.   {SNS_DBG_MOD_DSPS_DD_ALSPRX, dd_alsprx_debug_str_db,  
  23.    (sizeof(dd_alsprx_debug_str_db)/sizeof(dd_alsprx_debug_str_db[0]))},  
  24.   //AKM8975 Magnetometer Device Driver Module  
  25.   {SNS_DBG_MOD_DSPS_DD_MAG8975, dd_mag8975_debug_str_db,  
  26.    (sizeof(dd_mag8975_debug_str_db)/sizeof(dd_mag8975_debug_str_db[0]))},  
  27.   //Accel Device Driver Module  
  28.   {SNS_DBG_MOD_DSPS_DD_ACCEL, dd_accel_debug_str_db,  
  29.    (sizeof(dd_accel_debug_str_db)/sizeof(dd_accel_debug_str_db[0]))},  
  30.   //Gyro Device Driver Module  
  31.   {SNS_DBG_MOD_DSPS_DD_GYRO, dd_gyro_debug_str_db,  
  32.    (sizeof(dd_gyro_debug_str_db)/sizeof(dd_gyro_debug_str_db[0]))},  
  33.   //SCM Module  
  34.   {SNS_DBG_MOD_DSPS_SCM, scm_debug_str_db,  
  35.     (sizeof(scm_debug_str_db)/sizeof(scm_debug_str_db[0]))}  
  36. };  
在dsps传入模块ID之后,他会在这个数组里面进行搜寻,如果没有包含,就会在log里面打印出db ptr NULL OR string ID not valid (%d)这样一句话。


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


0 0