diff --git a/vendor/ess/lib/sis8300drvbcm.c b/vendor/ess/lib/sis8300drvbcm.c index 957c7625d98763acf67b23990f1fff4940ec9ffd..b3d1ade4d692a74dbe83d3d81fc1dd82cac4b904 100644 --- a/vendor/ess/lib/sis8300drvbcm.c +++ b/vendor/ess/lib/sis8300drvbcm.c @@ -50,6 +50,8 @@ const sis8300drv_Qmn sis8300drvbcm_Qmn_diff_fast_window_width = { .int_bits_m = 1, .frac_bits_n = 15, .is_signed = 1 }; const sis8300drv_Qmn sis8300drvbcm_Qmn_diff_medium_window_width = { .int_bits_m = 1, .frac_bits_n = 23, .is_signed = 1 }; +const sis8300drv_Qmn sis8300drvbcm_Qmn_leaky_coefficient = + { .int_bits_m = 9, .frac_bits_n = 23, .is_signed = 1 }; // default sampling frequency @@ -1769,13 +1771,18 @@ int sis8300drvbcm_get_calibration_sample(sis8300drv_usr *sisuser, unsigned int c int sis8300drvbcm_set_channel_leaky_coefficient(sis8300drv_usr *sisuser, unsigned int channel, double leaky_coefficient) { + double error; + unsigned int value; + int ret = sis8300drv_double_2_Qmn(leaky_coefficient, sis8300drvbcm_Qmn_leaky_coefficient, &value, &error); + if (ret) { + return ret; + } unsigned int reg = SIS8300BCM_CHANNEL_BLOCK_BASE + \ (SIS8300BCM_CHANNEL_BLOCK_SIZE * channel) + \ SIS8300BCM_ACCT_BANK_OFF + \ SIS8300BCM_ACCT_X_ADC_LEAKY_COFF_REG; - // register takes 32-bit value (Q9.23 format 2^23 = 8388608) - int value = (int)(leaky_coefficient * 8388608.0); - int ret = sis8300drv_reg_write(sisuser, reg, (unsigned)value); + // register takes Q9.23 value + ret = sis8300drv_reg_write(sisuser, reg, (unsigned)value); return ret; } @@ -1785,13 +1792,13 @@ int sis8300drvbcm_get_channel_leaky_coefficient(sis8300drv_usr *sisuser, unsigne (SIS8300BCM_CHANNEL_BLOCK_SIZE * channel) + \ SIS8300BCM_ACCT_BANK_OFF + \ SIS8300BCM_ACCT_X_ADC_LEAKY_COFF_REG; - // register takes 32-bit value (Q9.23 format 2^23 = 8388608) + // register takes Q9.23 value int value; int ret = sis8300drv_reg_read(sisuser, reg, (unsigned *)&value); if (ret) { return ret; } - *leaky_coefficient = (double)value / 8388608.0; + ret = sis8300drv_Qmn_2_double(value, sis8300drvbcm_Qmn_leaky_coefficient, leaky_coefficient); return ret; }