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;
 }