高通8926平台通过get和set attr来控制sensor,所有的attr由下面的enum列举。
typedef enum
{SNS_DDF_ATTRIB_POWER_INFO,
SNS_DDF_ATTRIB_POWER_STATE,
SNS_DDF_ATTRIB_DELAYS,
SNS_DDF_ATTRIB_RANGE,
SNS_DDF_ATTRIB_RESOLUTION_ADC,
SNS_DDF_ATTRIB_RESOLUTION,
SNS_DDF_ATTRIB_LOWPASS,
SNS_DDF_ATTRIB_MOTION_DETECT,
SNS_DDF_ATTRIB_DRIVER_INFO,
SNS_DDF_ATTRIB_DEVICE_INFO,
SNS_DDF_ATTRIB_THRESHOLD,
SNS_DDF_ATTRIB_ACCURACY,
SNS_DDF_ATTRIB_BIAS,
SNS_DDF_ATTRIB_ODR,
SNS_DDF_ATTRIB_SUPPORTED_ODR_LIST,
SNS_DDF_ATTRIB_REGISTRY_GROUP,
SNS_DDF_ATTRIB_IO_REGISTER,
SNS_DDF_ATTRIB_FIFO,
SNS_DDF_ATTRIB_ODR_TOLERANCE
} sns_ddf_attribute_e;
下面由本人结合代码简要说明,如有错误,请指正。
每个驱动必备的,都是set,没有get;
2. SNS_DDF_ATTRIB_MOTION_DETECT:
都是set,没有get;通过sns_smgr_set_hw_md_int()调用,这里只设置accel sensor,但gyro中也有对此attr的处理。
设置中断相关寄存器。
3. SNS_DDF_ATTRIB_THRESHOLD:
主要用于get光传感器和接近传感器的THRESHOLD
4. SNS_DDF_ATTRIB_ACCURACY:
主要用于get光传感器和接近传感器的精确度。代码里2771的prox的accuracy是40,手册里没找到,不知怎么得到的
5. SNS_DDF_ATTRIB_SUPPORTED_ODR_LIST:
sns_smgr_dd_init会调用sns_smgr_init_odr_tables来get device driver的odr list。
6. SNS_DDF_ATTRIB_REGISTRY_GROUP:
多用于ALS/PROX初始化时,通过sns_ddf_smgr_notify_event(SNS_DDF_EVENT_UPDATE_REGISTRY_GROUP),更新nv
7. SNS_DDF_ATTRIB_ODR_TOLERANCE:
只有accel lis3dsh的get attr中包含此attr,但实际没有地方进行get。
下面的属性以sns_dd_akm8975_get_attr为例:
1. SNS_DDF_ATTRIB_POWER_INFO:
需要将sns_ddf_power_info_s结构体赋值,它包含active_current和lowpower_current俩个成员,查看datasheet的
Electrical Characteristics-->>DC Characteristics-->>Current consumption
2. SNS_DDF_ATTRIB_RANGE:
需要将sns_ddf_range_s结构体赋值,它包含min和max俩个成员,查看datasheet的
Electrical Characteristics-->>Analog Circuit Characteristics-->>Magnetic sensor measurement range
3. SNS_DDF_ATTRIB_RESOLUTION_ADC:
需要将sns_ddf_resolution_adc_s结构体赋值,它包含bit_len和max_freq俩个成员,
bit_len:查看datasheet的Electrical Characteristics-->>Analog Circuit Characteristics-->>Measurement data output bit
max_freq:根据代码中注释,他是驱动在bit_len下合适的最大频率。AKM8975是50,不知怎么算的???
4. SNS_DDF_ATTRIB_RESOLUTION:
需要将sns_ddf_resolution_t类型变量赋值,它实际类型为q16_t,
查看datasheet的Overview-->>Output data resolution:13 bit (0.3 μT / LSB),经公式FX_FLTTOFIX_Q16(0.3 * TESLA_TO_GAUSS / 1000000)转换
5. SNS_DDF_ATTRIB_DELAYS:
需要将sns_ddf_delays_s结构体赋值,它包含time_to_active和time_to_data俩个成员,
查看datasheet的Electrical Characteristics-->>Analog Circuit Characteristics-->>Time for measurement
6. SNS_DDF_ATTRIB_DRIVER_INFO:
给sns_ddf_driver_info_s赋值
7. SNS_DDF_ATTRIB_DEVICE_INFO:
给sns_ddf_device_info_s赋值
下面的属性以sns_dd_acc_bma2x2_get_attr为例:
1. SNS_DDF_ATTRIB_LOWPASS:
需要将sns_ddf_lowpass_freq_t类型变量赋值,它实际类型为q16_t,
查看datasheet的Table 8: Bandwidth configuration
2. SNS_DDF_ATTRIB_IO_REGISTER:
虽然是get,但传入的value是有值的,driver根据这个值来读取指定寄存器,在把值赋值给value传给SMGR
需要将sns_ddf_io_register_s结构体赋值。
3. SNS_DDF_ATTRIB_BIAS:
轴偏差,没有偏差就是0
4. SNS_DDF_ATTRIB_ODR:
就是将之前set的odr反馈给smgr,可配置的值查看datasheet的Table 8: Bandwidth configuration
5. SNS_DDF_ATTRIB_FIFO:
将sns_ddf_fifo_attrib_get_s结构体赋值,值不知道是怎么来的。set的时候是写了两个reserved的寄存器,不知道什么用。