Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
MAX77658.cpp
00001 /******************************************************************************* 00002 * Copyright(C) Analog Devices Inc., All Rights Reserved. 00003 * 00004 * Permission is hereby granted, free of charge, to any person obtaining a 00005 * copy of this software and associated documentation files(the "Software"), 00006 * to deal in the Software without restriction, including without limitation 00007 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 00008 * and/or sell copies of the Software, and to permit persons to whom the 00009 * Software is furnished to do so, subject to the following conditions: 00010 * 00011 * The above copyright notice and this permission notice shall be included 00012 * in all copies or substantial portions of the Software. 00013 * 00014 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 00015 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 00016 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 00017 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES 00018 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 00019 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 00020 * OTHER DEALINGS IN THE SOFTWARE. 00021 * 00022 * Except as contained in this notice, the name of Analog Devices Inc. 00023 * shall not be used except as stated in the Analog Devices Inc. 00024 * Branding Policy. 00025 * 00026 * The mere transfer of this software does not imply any licenses 00027 * of trade secrets, proprietary technology, copyrights, patents, 00028 * trademarks, maskwork rights, or any other form of intellectual 00029 * property whatsoever. Analog Devices Inc.retains all ownership rights. 00030 ******************************************************************************* 00031 */ 00032 00033 #include <Thread.h> 00034 #include "MAX77658.h" 00035 #include <math.h> 00036 00037 #define POST_INTR_WORK_SIGNAL_ID 0x1 00038 #define TO_UINT8 0xFF 00039 #define TO_UINT16 0xFFFF 00040 00041 MAX77658::MAX77658(I2C *i2c, PinName IRQPin) 00042 { 00043 if (i2c == NULL) 00044 return; 00045 00046 i2c_handler = i2c; 00047 00048 interrupt_handler_list = new handler[INT_CHG_END] {}; 00049 00050 if (IRQPin != NC) { 00051 irq_disable_all(); 00052 post_intr_work_thread = new Thread(); 00053 post_intr_work_thread->start(Callback<void()>(this, &MAX77658::post_interrupt_work)); 00054 00055 this->irq_pin = new InterruptIn(IRQPin); 00056 this->irq_pin->fall(Callback<void()>(this, &MAX77658::interrupt_handler)); 00057 this->irq_pin->enable_irq(); 00058 } else { 00059 this->irq_pin = NULL; 00060 } 00061 } 00062 00063 MAX77658::~MAX77658() 00064 { 00065 if (post_intr_work_thread) 00066 delete post_intr_work_thread; 00067 00068 if (irq_pin) 00069 delete irq_pin; 00070 00071 if (interrupt_handler_list) 00072 delete [] interrupt_handler_list; 00073 } 00074 00075 int MAX77658::read_register(uint8_t reg, uint8_t *value) 00076 { 00077 int rtn_val; 00078 00079 if (value == NULL) 00080 return MAX77658_VALUE_NULL; 00081 00082 rtn_val = i2c_handler->write(MAX77658_I2C_ADDRESS_PMIC_1, (const char *)®, 1, true); 00083 if (rtn_val != 0) 00084 return MAX77658_WRITE_DATA_FAILED; 00085 00086 rtn_val = i2c_handler->read(MAX77658_I2C_ADDRESS_PMIC_1, (char *) value, 1, false); 00087 if (rtn_val < 0) 00088 return MAX77658_READ_DATA_FAILED; 00089 00090 return MAX77658_NO_ERROR; 00091 } 00092 00093 int MAX77658::write_register(uint8_t reg, const uint8_t *value) 00094 { 00095 int rtn_val; 00096 unsigned char local_data[2]; 00097 00098 if (value == NULL) 00099 return MAX77658_VALUE_NULL; 00100 00101 local_data[0] = reg; 00102 00103 memcpy(&local_data[1], value, 1); 00104 00105 rtn_val = i2c_handler->write(MAX77658_I2C_ADDRESS_PMIC_1, (const char *)local_data, sizeof(local_data)); 00106 if (rtn_val != MAX77658_NO_ERROR) 00107 return MAX77658_WRITE_DATA_FAILED; 00108 00109 return MAX77658_NO_ERROR; 00110 } 00111 00112 int MAX77658::read_fg_register(uint8_t reg, uint8_t *value) 00113 { 00114 int rtn_val; 00115 00116 if (value == NULL) 00117 return MAX77658_VALUE_NULL; 00118 00119 rtn_val = i2c_handler->write(MAX77658_I2C_ADDRESS_FG, (const char *)®, 1, true); 00120 if (rtn_val != 0) 00121 return MAX77658_WRITE_DATA_FAILED; 00122 00123 rtn_val = i2c_handler->read(MAX77658_I2C_ADDRESS_FG, (char *) value, 2, false); 00124 if (rtn_val < 0) 00125 return MAX77658_READ_DATA_FAILED; 00126 00127 return MAX77658_NO_ERROR; 00128 } 00129 00130 int MAX77658::write_fg_register(uint8_t reg, const uint8_t *value) 00131 { 00132 int rtn_val; 00133 unsigned char local_data[3]; 00134 00135 if (value == NULL) 00136 return MAX77658_VALUE_NULL; 00137 00138 local_data[0] = reg; 00139 00140 memcpy(&local_data[1], value, 2); 00141 00142 rtn_val = i2c_handler->write(MAX77658_I2C_ADDRESS_FG, (const char *)local_data, sizeof(local_data)); 00143 if (rtn_val != MAX77658_NO_ERROR) 00144 return MAX77658_WRITE_DATA_FAILED; 00145 00146 return MAX77658_NO_ERROR; 00147 } 00148 00149 #define SET_BIT_FIELD(address, reg_name, bit_field_name, value) \ 00150 int ret_val; \ 00151 ret_val = read_register(address, (uint8_t *)&(reg_name)); \ 00152 if (ret_val) { \ 00153 return ret_val; \ 00154 } \ 00155 bit_field_name = value; \ 00156 ret_val = write_register(address, (uint8_t *)&(reg_name)); \ 00157 if (ret_val) { \ 00158 return ret_val; \ 00159 } 00160 00161 00162 00163 #define SET_FG_BIT_FIELD(address, reg_name, bit_field_name, value) \ 00164 int ret_val_fg; \ 00165 ret_val_fg = read_fg_register(address, (uint8_t *)&(reg_name)); \ 00166 if (ret_val_fg) { \ 00167 return ret_val_fg; \ 00168 } \ 00169 bit_field_name = value; \ 00170 ret_val_fg = write_fg_register(address, (uint8_t *)&(reg_name)); \ 00171 if (ret_val_fg) { \ 00172 return ret_val_fg; \ 00173 } 00174 00175 int MAX77658::get_ercflag(reg_bit_ercflag_t bit_field, uint8_t *flag) 00176 { 00177 int ret; 00178 reg_ercflag_t reg_ercflag = {0}; 00179 00180 ret = read_register(ERCFLAG, (uint8_t *)&(reg_ercflag)); 00181 if (ret != MAX77658_NO_ERROR) return ret; 00182 00183 switch (bit_field) 00184 { 00185 case ERCFLAG_TOVLD: 00186 *flag = (uint8_t)reg_ercflag.bits.tovld; 00187 break; 00188 case ERCFLAG_SYSOVLO: 00189 *flag = (uint8_t)reg_ercflag.bits.sysovlo; 00190 break; 00191 case ERCFLAG_SYSUVLO: 00192 *flag = (uint8_t)reg_ercflag.bits.sysuvlo; 00193 break; 00194 case ERCFLAG_MRST_F: 00195 *flag = (uint8_t)reg_ercflag.bits.mrst_f; 00196 break; 00197 case ERCFLAG_SFT_OFF_F: 00198 *flag = (uint8_t)reg_ercflag.bits.sft_off_f; 00199 break; 00200 case ERCFLAG_SFT_CRST_F: 00201 *flag = (uint8_t)reg_ercflag.bits.sft_crst_f; 00202 break; 00203 case ERCFLAG_WDT_OFF: 00204 *flag = (uint8_t)reg_ercflag.bits.wdt_off; 00205 break; 00206 case ERCFLAG_WDT_RST: 00207 *flag = (uint8_t)reg_ercflag.bits.wdt_rst; 00208 break; 00209 default: 00210 ret = MAX77658_INVALID_DATA; 00211 break; 00212 } 00213 00214 return ret; 00215 } 00216 00217 int MAX77658::get_stat_glbl(reg_bit_stat_glbl_t bit_field, uint8_t *status) 00218 { 00219 int ret; 00220 reg_stat_glbl_t reg_stat_glbl = {0}; 00221 00222 ret = read_register(STAT_GLBL, (uint8_t *)&(reg_stat_glbl)); 00223 if (ret != MAX77658_NO_ERROR) return ret; 00224 00225 switch (bit_field) 00226 { 00227 case STAT_GLBL_STAT_IRQ: 00228 *status = (uint8_t)reg_stat_glbl.bits.stat_irq; 00229 break; 00230 case STAT_GLBL_STAT_EN: 00231 *status = (uint8_t)reg_stat_glbl.bits.stat_en; 00232 break; 00233 case STAT_GLBL_TJAL1_S: 00234 *status = (uint8_t)reg_stat_glbl.bits.tjal1_s; 00235 break; 00236 case STAT_GLBL_TJAL2_S: 00237 *status = (uint8_t)reg_stat_glbl.bits.tjal2_s; 00238 break; 00239 case STAT_GLBL_DOD1_S: 00240 *status = (uint8_t)reg_stat_glbl.bits.dod1_s; 00241 break; 00242 case STAT_GLBL_DOD0_S: 00243 *status = (uint8_t)reg_stat_glbl.bits.dod0_s; 00244 break; 00245 case STAT_GLBL_BOK: 00246 *status = (uint8_t)reg_stat_glbl.bits.bok; 00247 break; 00248 case STAT_GLBL_DIDM: 00249 *status = (uint8_t)reg_stat_glbl.bits.didm; 00250 break; 00251 default: 00252 ret = MAX77658_INVALID_DATA; 00253 break; 00254 } 00255 00256 return ret; 00257 } 00258 00259 int MAX77658::set_interrupt_mask(reg_bit_int_mask_t bit_field, uint8_t maskBit) 00260 { 00261 int ret; 00262 uint8_t reg_addr; 00263 reg_int_m_chg_t reg_int_m_chg = {0}; 00264 reg_intm_glbl0_t reg_intm_glbl0 = {0}; 00265 reg_intm_glbl1_t reg_intm_glbl1 = {0}; 00266 00267 //INT_M_CHG (0x07), INTM_GLBL0 (0x08) and INTM_GLBL1 (0x09) 00268 reg_addr = (uint8_t)floor((static_cast<uint8_t>(bit_field)) / 8) + 0x07; 00269 00270 if (reg_addr == INT_M_CHG) 00271 ret = read_register(INT_M_CHG, (uint8_t *)&(reg_int_m_chg)); 00272 else if (reg_addr == INTM_GLBL0) 00273 ret = read_register(INTM_GLBL0, (uint8_t *)&(reg_intm_glbl0)); 00274 else if (reg_addr == INTM_GLBL1) 00275 ret = read_register(INTM_GLBL1, (uint8_t *)&(reg_intm_glbl1)); 00276 else 00277 return MAX77658_INVALID_DATA; 00278 00279 if (ret != MAX77658_NO_ERROR) return ret; 00280 00281 switch (bit_field) 00282 { 00283 case INT_M_CHG_THM_M: 00284 reg_int_m_chg.bits.thm_m = maskBit; 00285 break; 00286 case INT_M_CHG_CHG_M: 00287 reg_int_m_chg.bits.chg_m = maskBit; 00288 break; 00289 case INT_M_CHG_CHGIN_M: 00290 reg_int_m_chg.bits.chgin_m = maskBit; 00291 break; 00292 case INT_M_CHG_TJ_REG_M: 00293 reg_int_m_chg.bits.tj_reg_m = maskBit; 00294 break; 00295 case INT_M_CHG_CHGIN_CTRL_M: 00296 reg_int_m_chg.bits.chgin_ctrl_m = maskBit; 00297 break; 00298 case INT_M_CHG_SYS_CTRL_M: 00299 reg_int_m_chg.bits.sys_ctrl_m = maskBit; 00300 break; 00301 case INT_M_CHG_SYS_CNFG_M: 00302 reg_int_m_chg.bits.sys_cnfg_m = maskBit; 00303 break; 00304 case INT_M_CHG_DIS_AICL: 00305 reg_int_m_chg.bits.dis_aicl = maskBit; 00306 break; 00307 case INTM_GLBL0_GPI0_FM: 00308 reg_intm_glbl0.bits.gpi0_fm = maskBit; 00309 break; 00310 case INTM_GLBL0_GPI0_RM: 00311 reg_intm_glbl0.bits.gpi0_rm = maskBit; 00312 break; 00313 case INTM_GLBL0_nEN_FM: 00314 reg_intm_glbl0.bits.nen_fm = maskBit; 00315 break; 00316 case INTM_GLBL0_nEN_RM: 00317 reg_intm_glbl0.bits.nen_rm = maskBit; 00318 break; 00319 case INTM_GLBL0_TJAL1_RM: 00320 reg_intm_glbl0.bits.tjal1_rm = maskBit; 00321 break; 00322 case INTM_GLBL0_TJAL2_RM: 00323 reg_intm_glbl0.bits.tjal2_rm = maskBit; 00324 break; 00325 case INTM_GLBL0_DOD1_RM: 00326 reg_intm_glbl0.bits.dod1_rm = maskBit; 00327 break; 00328 case INTM_GLBL0_DOD0_RM: 00329 reg_intm_glbl0.bits.dod0_rm = maskBit; 00330 break; 00331 case INTM_GLBL1_GPI1_FM: 00332 reg_intm_glbl1.bits.gpi1_fm = maskBit; 00333 break; 00334 case INTM_GLBL1_GPI1_RM: 00335 reg_intm_glbl1.bits.gpi1_rm = maskBit; 00336 break; 00337 case INTM_GLBL1_SBB0_FM: 00338 reg_intm_glbl1.bits.sbb0_fm = maskBit; 00339 break; 00340 case INTM_GLBL1_SBB1_FM: 00341 reg_intm_glbl1.bits.sbb1_fm = maskBit; 00342 break; 00343 case INTM_GLBL1_SBB2_FM: 00344 reg_intm_glbl1.bits.sbb2_fm = maskBit; 00345 break; 00346 case INTM_GLBL1_LDO0_M: 00347 reg_intm_glbl1.bits.ldo0_m = maskBit; 00348 break; 00349 case INTM_GLBL1_LDO1_M: 00350 reg_intm_glbl1.bits.ldo1_m = maskBit; 00351 break; 00352 case INTM_GLBL1_RSVD: 00353 reg_intm_glbl1.bits.rsvd = maskBit; 00354 break; 00355 default: 00356 return MAX77658_INVALID_DATA; 00357 break; 00358 } 00359 00360 if (reg_addr == INT_M_CHG) 00361 return write_register(INT_M_CHG, (uint8_t *)&(reg_int_m_chg)); 00362 else if (reg_addr == INTM_GLBL0) 00363 return write_register(INTM_GLBL0, (uint8_t *)&(reg_intm_glbl0)); 00364 else if (reg_addr == INTM_GLBL1) 00365 return write_register(INTM_GLBL1, (uint8_t *)&(reg_intm_glbl1)); 00366 } 00367 00368 int MAX77658::get_interrupt_mask(reg_bit_int_mask_t bit_field, uint8_t *maskBit) 00369 { 00370 int ret; 00371 uint8_t reg_addr; 00372 reg_int_m_chg_t reg_int_m_chg = {0}; 00373 reg_intm_glbl0_t reg_intm_glbl0 = {0}; 00374 reg_intm_glbl1_t reg_intm_glbl1 = {0}; 00375 00376 //INT_M_CHG (0x07), INTM_GLBL0 (0x08) and INTM_GLBL1 (0x09) 00377 reg_addr = (uint8_t)floor((static_cast<uint8_t>(bit_field)) / 8) + 0x07; 00378 00379 if (reg_addr == INT_M_CHG) 00380 ret = read_register(INT_M_CHG, (uint8_t *)&(reg_int_m_chg)); 00381 else if (reg_addr == INTM_GLBL0) 00382 ret = read_register(INTM_GLBL0, (uint8_t *)&(reg_intm_glbl0)); 00383 else if (reg_addr == INTM_GLBL1) 00384 ret = read_register(INTM_GLBL1, (uint8_t *)&(reg_intm_glbl1)); 00385 else 00386 return MAX77658_INVALID_DATA; 00387 00388 if (ret != MAX77658_NO_ERROR) return ret; 00389 00390 switch (bit_field) 00391 { 00392 case INT_M_CHG_THM_M: 00393 *maskBit = (uint8_t)reg_int_m_chg.bits.thm_m; 00394 break; 00395 case INT_M_CHG_CHG_M: 00396 *maskBit = (uint8_t)reg_int_m_chg.bits.chg_m; 00397 break; 00398 case INT_M_CHG_CHGIN_M: 00399 *maskBit = (uint8_t)reg_int_m_chg.bits.chgin_m; 00400 break; 00401 case INT_M_CHG_TJ_REG_M: 00402 *maskBit = (uint8_t)reg_int_m_chg.bits.tj_reg_m; 00403 break; 00404 case INT_M_CHG_CHGIN_CTRL_M: 00405 *maskBit = (uint8_t)reg_int_m_chg.bits.chgin_ctrl_m; 00406 break; 00407 case INT_M_CHG_SYS_CTRL_M: 00408 *maskBit = (uint8_t)reg_int_m_chg.bits.sys_ctrl_m; 00409 break; 00410 case INT_M_CHG_SYS_CNFG_M: 00411 *maskBit = (uint8_t)reg_int_m_chg.bits.sys_cnfg_m; 00412 break; 00413 case INT_M_CHG_DIS_AICL: 00414 *maskBit = (uint8_t)reg_int_m_chg.bits.dis_aicl; 00415 break; 00416 case INTM_GLBL0_GPI0_FM: 00417 *maskBit = (uint8_t)reg_intm_glbl0.bits.gpi0_fm; 00418 break; 00419 case INTM_GLBL0_GPI0_RM: 00420 *maskBit = (uint8_t)reg_intm_glbl0.bits.gpi0_rm; 00421 break; 00422 case INTM_GLBL0_nEN_FM: 00423 *maskBit = (uint8_t)reg_intm_glbl0.bits.nen_fm; 00424 break; 00425 case INTM_GLBL0_nEN_RM: 00426 *maskBit = (uint8_t)reg_intm_glbl0.bits.nen_rm; 00427 break; 00428 case INTM_GLBL0_TJAL1_RM: 00429 *maskBit = (uint8_t)reg_intm_glbl0.bits.tjal1_rm; 00430 break; 00431 case INTM_GLBL0_TJAL2_RM: 00432 *maskBit = (uint8_t)reg_intm_glbl0.bits.tjal2_rm; 00433 break; 00434 case INTM_GLBL0_DOD1_RM: 00435 *maskBit = (uint8_t)reg_intm_glbl0.bits.dod1_rm; 00436 break; 00437 case INTM_GLBL0_DOD0_RM: 00438 *maskBit = (uint8_t)reg_intm_glbl0.bits.dod0_rm; 00439 break; 00440 case INTM_GLBL1_GPI1_FM: 00441 *maskBit = (uint8_t)reg_intm_glbl1.bits.gpi1_fm; 00442 break; 00443 case INTM_GLBL1_GPI1_RM: 00444 *maskBit = (uint8_t)reg_intm_glbl1.bits.gpi1_rm; 00445 break; 00446 case INTM_GLBL1_SBB0_FM: 00447 *maskBit = (uint8_t)reg_intm_glbl1.bits.sbb0_fm; 00448 break; 00449 case INTM_GLBL1_SBB1_FM: 00450 *maskBit = (uint8_t)reg_intm_glbl1.bits.sbb1_fm; 00451 break; 00452 case INTM_GLBL1_SBB2_FM: 00453 *maskBit = (uint8_t)reg_intm_glbl1.bits.sbb2_fm; 00454 break; 00455 case INTM_GLBL1_LDO0_M: 00456 *maskBit = (uint8_t)reg_intm_glbl1.bits.ldo0_m; 00457 break; 00458 case INTM_GLBL1_LDO1_M: 00459 *maskBit = (uint8_t)reg_intm_glbl1.bits.ldo1_m; 00460 break; 00461 case INTM_GLBL1_RSVD: 00462 *maskBit = (uint8_t)reg_intm_glbl1.bits.rsvd; 00463 break; 00464 default: 00465 return MAX77658_INVALID_DATA; 00466 break; 00467 } 00468 00469 return MAX77658_NO_ERROR; 00470 } 00471 00472 int MAX77658::set_cnfg_glbl(reg_bit_cnfg_glbl_t bit_field, uint8_t config) 00473 { 00474 int ret; 00475 reg_cnfg_glbl_t reg_cnfg_glbl = {0}; 00476 00477 ret = read_register(CNFG_GLBL, (uint8_t *)&(reg_cnfg_glbl)); 00478 if (ret != MAX77658_NO_ERROR) return ret; 00479 00480 switch (bit_field) 00481 { 00482 case CNFG_GLBL_SFT_CTRL: 00483 reg_cnfg_glbl.bits.sft_ctrl = config; 00484 break; 00485 case CNFG_GLBL_DBEN_nEN: 00486 reg_cnfg_glbl.bits.dben_nen = config; 00487 break; 00488 case CNFG_GLBL_nEN_MODE: 00489 reg_cnfg_glbl.bits.nen_mode = config; 00490 break; 00491 case CNFG_GLBL_SBIA_LPM: 00492 reg_cnfg_glbl.bits.sbia_lpm = config; 00493 break; 00494 case CNFG_GLBL_T_MRST: 00495 reg_cnfg_glbl.bits.t_mrst = config; 00496 break; 00497 case CNFG_GLBL_PU_DIS: 00498 reg_cnfg_glbl.bits.pu_dis = config; 00499 break; 00500 default: 00501 return MAX77658_INVALID_DATA; 00502 break; 00503 } 00504 00505 return write_register(CNFG_GLBL, (uint8_t *)&(reg_cnfg_glbl)); 00506 } 00507 00508 int MAX77658::get_cnfg_glbl(reg_bit_cnfg_glbl_t bit_field, uint8_t *config) 00509 { 00510 int ret; 00511 reg_cnfg_glbl_t reg_cnfg_glbl = {0}; 00512 00513 ret = read_register(CNFG_GLBL, (uint8_t *)&(reg_cnfg_glbl)); 00514 if (ret != MAX77658_NO_ERROR) return ret; 00515 00516 switch (bit_field) 00517 { 00518 case CNFG_GLBL_SFT_CTRL: 00519 *config = (uint8_t)reg_cnfg_glbl.bits.sft_ctrl; 00520 break; 00521 case CNFG_GLBL_DBEN_nEN: 00522 *config = (uint8_t)reg_cnfg_glbl.bits.dben_nen; 00523 break; 00524 case CNFG_GLBL_nEN_MODE: 00525 *config = (uint8_t)reg_cnfg_glbl.bits.nen_mode; 00526 break; 00527 case CNFG_GLBL_SBIA_LPM: 00528 *config = (uint8_t)reg_cnfg_glbl.bits.sbia_lpm; 00529 break; 00530 case CNFG_GLBL_T_MRST: 00531 *config = (uint8_t)reg_cnfg_glbl.bits.t_mrst; 00532 break; 00533 case CNFG_GLBL_PU_DIS: 00534 *config = (uint8_t)reg_cnfg_glbl.bits.pu_dis; 00535 break; 00536 default: 00537 ret = MAX77658_INVALID_DATA; 00538 break; 00539 } 00540 00541 return ret; 00542 } 00543 00544 int MAX77658::set_cnfg_gpio(reg_bit_cnfg_gpio_t bit_field, uint8_t channel, uint8_t config) 00545 { 00546 int ret; 00547 reg_cnfg_gpio0_t reg_cnfg_gpio0 = {0}; 00548 reg_cnfg_gpio1_t reg_cnfg_gpio1 = {0}; 00549 reg_cnfg_gpio2_t reg_cnfg_gpio2 = {0}; 00550 00551 if (channel == 0) 00552 { 00553 ret = read_register(CNFG_GPIO0, (uint8_t *)&(reg_cnfg_gpio0)); 00554 if (ret != MAX77658_NO_ERROR) return ret; 00555 00556 switch (bit_field) 00557 { 00558 case CNFG_GPIO_DIR: 00559 reg_cnfg_gpio0.bits.gpo_dir = config; 00560 break; 00561 case CNFG_GPIO_DI: 00562 reg_cnfg_gpio0.bits.gpo_di = config; 00563 break; 00564 case CNFG_GPIO_DRV: 00565 reg_cnfg_gpio0.bits.gpo_drv = config; 00566 break; 00567 case CNFG_GPIO_DO: 00568 reg_cnfg_gpio0.bits.gpo_do = config; 00569 break; 00570 case CNFG_GPIO_DBEN_GPI: 00571 reg_cnfg_gpio0.bits.dben_gpi = config; 00572 break; 00573 case CNFG_GPIO_ALT_GPIO: 00574 reg_cnfg_gpio0.bits.alt_gpio = config; 00575 break; 00576 case CNFG_GPIO_RSVD: 00577 default: 00578 return MAX77658_INVALID_DATA; 00579 break; 00580 } 00581 00582 return write_register(CNFG_GPIO0, (uint8_t *)&(reg_cnfg_gpio0)); 00583 } 00584 else if (channel == 1) 00585 { 00586 ret = read_register(CNFG_GPIO1, (uint8_t *)&(reg_cnfg_gpio1)); 00587 if (ret != MAX77658_NO_ERROR) return ret; 00588 00589 switch (bit_field) 00590 { 00591 case CNFG_GPIO_DIR: 00592 reg_cnfg_gpio1.bits.gpo_dir = config; 00593 break; 00594 case CNFG_GPIO_DI: 00595 reg_cnfg_gpio1.bits.gpo_di = config; 00596 break; 00597 case CNFG_GPIO_DRV: 00598 reg_cnfg_gpio1.bits.gpo_drv = config; 00599 break; 00600 case CNFG_GPIO_DO: 00601 reg_cnfg_gpio1.bits.gpo_do = config; 00602 break; 00603 case CNFG_GPIO_DBEN_GPI: 00604 reg_cnfg_gpio1.bits.dben_gpi = config; 00605 break; 00606 case CNFG_GPIO_ALT_GPIO: 00607 reg_cnfg_gpio1.bits.alt_gpio = config; 00608 break; 00609 case CNFG_GPIO_RSVD: 00610 default: 00611 return MAX77658_INVALID_DATA; 00612 break; 00613 } 00614 00615 return write_register(CNFG_GPIO1, (uint8_t *)&(reg_cnfg_gpio1)); 00616 } 00617 else if (channel == 2) 00618 { 00619 ret = read_register(CNFG_GPIO2, (uint8_t *)&(reg_cnfg_gpio2)); 00620 if (ret != MAX77658_NO_ERROR) return ret; 00621 00622 switch (bit_field) 00623 { 00624 case CNFG_GPIO_DIR: 00625 reg_cnfg_gpio2.bits.gpo_dir = config; 00626 break; 00627 case CNFG_GPIO_DI: 00628 reg_cnfg_gpio2.bits.gpo_di = config; 00629 break; 00630 case CNFG_GPIO_DRV: 00631 reg_cnfg_gpio2.bits.gpo_drv = config; 00632 break; 00633 case CNFG_GPIO_DO: 00634 reg_cnfg_gpio2.bits.gpo_do = config; 00635 break; 00636 case CNFG_GPIO_DBEN_GPI: 00637 reg_cnfg_gpio2.bits.dben_gpi = config; 00638 break; 00639 case CNFG_GPIO_ALT_GPIO: 00640 reg_cnfg_gpio2.bits.alt_gpio = config; 00641 break; 00642 case CNFG_GPIO_RSVD: 00643 default: 00644 return MAX77658_INVALID_DATA; 00645 break; 00646 } 00647 00648 return write_register(CNFG_GPIO2, (uint8_t *)&(reg_cnfg_gpio2)); 00649 } 00650 else { 00651 return MAX77658_INVALID_DATA; 00652 } 00653 } 00654 00655 int MAX77658::get_cnfg_gpio(reg_bit_cnfg_gpio_t bit_field, uint8_t channel, uint8_t *config) 00656 { 00657 int ret; 00658 reg_cnfg_gpio0_t reg_cnfg_gpio0 = {0}; 00659 reg_cnfg_gpio1_t reg_cnfg_gpio1 = {0}; 00660 reg_cnfg_gpio2_t reg_cnfg_gpio2 = {0}; 00661 00662 if (channel == 0) 00663 { 00664 ret = read_register(CNFG_GPIO0, (uint8_t *)&(reg_cnfg_gpio0)); 00665 if (ret != MAX77658_NO_ERROR) return ret; 00666 00667 switch (bit_field) 00668 { 00669 case CNFG_GPIO_DIR: 00670 *config = (uint8_t)reg_cnfg_gpio0.bits.gpo_dir; 00671 break; 00672 case CNFG_GPIO_DI: 00673 *config = (uint8_t)reg_cnfg_gpio0.bits.gpo_di; 00674 break; 00675 case CNFG_GPIO_DRV: 00676 *config = (uint8_t)reg_cnfg_gpio0.bits.gpo_drv; 00677 break; 00678 case CNFG_GPIO_DO: 00679 *config = (uint8_t)reg_cnfg_gpio0.bits.gpo_do; 00680 break; 00681 case CNFG_GPIO_DBEN_GPI: 00682 *config = (uint8_t)reg_cnfg_gpio0.bits.dben_gpi; 00683 break; 00684 case CNFG_GPIO_ALT_GPIO: 00685 *config = (uint8_t)reg_cnfg_gpio0.bits.alt_gpio; 00686 break; 00687 case CNFG_GPIO_RSVD: 00688 default: 00689 return MAX77658_INVALID_DATA; 00690 break; 00691 } 00692 } 00693 else if (channel == 1) 00694 { 00695 ret = read_register(CNFG_GPIO1, (uint8_t *)&(reg_cnfg_gpio1)); 00696 if (ret != MAX77658_NO_ERROR) return ret; 00697 00698 switch (bit_field) 00699 { 00700 case CNFG_GPIO_DIR: 00701 *config = (uint8_t)reg_cnfg_gpio1.bits.gpo_dir; 00702 break; 00703 case CNFG_GPIO_DI: 00704 *config = (uint8_t)reg_cnfg_gpio1.bits.gpo_di; 00705 break; 00706 case CNFG_GPIO_DRV: 00707 *config = (uint8_t)reg_cnfg_gpio1.bits.gpo_drv; 00708 break; 00709 case CNFG_GPIO_DO: 00710 *config = (uint8_t)reg_cnfg_gpio1.bits.gpo_do; 00711 break; 00712 case CNFG_GPIO_DBEN_GPI: 00713 *config = (uint8_t)reg_cnfg_gpio1.bits.dben_gpi; 00714 break; 00715 case CNFG_GPIO_ALT_GPIO: 00716 *config = (uint8_t)reg_cnfg_gpio1.bits.alt_gpio; 00717 break; 00718 case CNFG_GPIO_RSVD: 00719 default: 00720 return MAX77658_INVALID_DATA; 00721 break; 00722 } 00723 } 00724 else if (channel == 2) 00725 { 00726 ret = read_register(CNFG_GPIO2, (uint8_t *)&(reg_cnfg_gpio2)); 00727 if (ret != MAX77658_NO_ERROR) return ret; 00728 00729 switch (bit_field) 00730 { 00731 case CNFG_GPIO_DIR: 00732 *config = (uint8_t)reg_cnfg_gpio2.bits.gpo_dir; 00733 break; 00734 case CNFG_GPIO_DI: 00735 *config = (uint8_t)reg_cnfg_gpio2.bits.gpo_di; 00736 break; 00737 case CNFG_GPIO_DRV: 00738 *config = (uint8_t)reg_cnfg_gpio2.bits.gpo_drv; 00739 break; 00740 case CNFG_GPIO_DO: 00741 *config = (uint8_t)reg_cnfg_gpio2.bits.gpo_do; 00742 break; 00743 case CNFG_GPIO_DBEN_GPI: 00744 *config = (uint8_t)reg_cnfg_gpio2.bits.dben_gpi; 00745 break; 00746 case CNFG_GPIO_ALT_GPIO: 00747 *config = (uint8_t)reg_cnfg_gpio2.bits.alt_gpio; 00748 break; 00749 case CNFG_GPIO_RSVD: 00750 default: 00751 return MAX77658_INVALID_DATA; 00752 break; 00753 } 00754 } 00755 else { 00756 return MAX77658_INVALID_DATA; 00757 } 00758 00759 return ret; 00760 } 00761 00762 int MAX77658::get_cid(void) { 00763 char rbuf[1]; 00764 int ret; 00765 00766 ret = read_register(CID, (uint8_t *)&(rbuf)); 00767 if (ret != MAX77658_NO_ERROR) return ret; 00768 00769 return *rbuf; 00770 } 00771 00772 int MAX77658::set_cnfg_wdt(reg_bit_cnfg_wdt_t bit_field, uint8_t config) 00773 { 00774 int ret; 00775 reg_cnfg_wdt_t reg_cnfg_wdt = {0}; 00776 00777 ret = read_register(CNFG_WDT, (uint8_t *)&(reg_cnfg_wdt)); 00778 if (ret != MAX77658_NO_ERROR) return ret; 00779 00780 switch (bit_field) 00781 { 00782 case CNFG_WDT_WDT_LOCK: 00783 reg_cnfg_wdt.bits.wdt_lock = config; 00784 break; 00785 case CNFG_WDT_WDT_EN: 00786 reg_cnfg_wdt.bits.wdt_en = config; 00787 break; 00788 case CNFG_WDT_WDT_CLR: 00789 reg_cnfg_wdt.bits.wdt_clr = config; 00790 break; 00791 case CNFG_WDT_WDT_MODE: 00792 reg_cnfg_wdt.bits.wdt_mode = config; 00793 break; 00794 case CNFG_WDT_WDT_PER: 00795 reg_cnfg_wdt.bits.wdt_per = config; 00796 break; 00797 case CNFG_WDT_RSVD: 00798 default: 00799 return MAX77658_INVALID_DATA; 00800 break; 00801 } 00802 00803 return write_register(CNFG_WDT, (uint8_t *)&(reg_cnfg_wdt)); 00804 } 00805 00806 int MAX77658::get_cnfg_wdt(reg_bit_cnfg_wdt_t bit_field, uint8_t *config) 00807 { 00808 int ret; 00809 reg_cnfg_wdt_t reg_cnfg_wdt = {0}; 00810 00811 ret = read_register(CNFG_WDT, (uint8_t *)&(reg_cnfg_wdt)); 00812 if (ret != MAX77658_NO_ERROR) return ret; 00813 00814 switch (bit_field) 00815 { 00816 case CNFG_WDT_WDT_LOCK: 00817 *config = (uint8_t)reg_cnfg_wdt.bits.wdt_lock; 00818 break; 00819 case CNFG_WDT_WDT_EN: 00820 *config = (uint8_t)reg_cnfg_wdt.bits.wdt_en; 00821 break; 00822 case CNFG_WDT_WDT_CLR: 00823 *config = (uint8_t)reg_cnfg_wdt.bits.wdt_clr; 00824 break; 00825 case CNFG_WDT_WDT_MODE: 00826 *config = (uint8_t)reg_cnfg_wdt.bits.wdt_mode; 00827 break; 00828 case CNFG_WDT_WDT_PER: 00829 *config = (uint8_t)reg_cnfg_wdt.bits.wdt_per; 00830 break; 00831 case CNFG_WDT_RSVD: 00832 default: 00833 return MAX77658_INVALID_DATA; 00834 break; 00835 } 00836 00837 return MAX77658_NO_ERROR; 00838 } 00839 00840 int MAX77658::get_stat_chg_a(reg_bit_stat_chg_a_t bit_field, uint8_t *status) 00841 { 00842 int ret; 00843 reg_stat_chg_a_t reg_stat_chg_a = {0}; 00844 00845 ret = read_register(STAT_CHG_A, (uint8_t *)&(reg_stat_chg_a)); 00846 if (ret != MAX77658_NO_ERROR) return ret; 00847 00848 switch (bit_field) 00849 { 00850 case STAT_CHG_A_THM_DTLS: 00851 *status = (uint8_t)reg_stat_chg_a.bits.thm_dtls; 00852 break; 00853 case STAT_CHG_A_TJ_REG_STAT: 00854 *status = (uint8_t)reg_stat_chg_a.bits.tj_reg_stat; 00855 break; 00856 case STAT_CHG_A_VSYS_MIN_STAT: 00857 *status = (uint8_t)reg_stat_chg_a.bits.vsys_min_stat; 00858 break; 00859 case STAT_CHG_A_ICHGIN_LIM_STAT: 00860 *status = (uint8_t)reg_stat_chg_a.bits.ichgin_lim_stat; 00861 break; 00862 case STAT_CHG_A_VCHGIN_MIN_STAT: 00863 *status = (uint8_t)reg_stat_chg_a.bits.vchgin_min_stat; 00864 break; 00865 case STAT_CHG_A_RSVD: 00866 default: 00867 return MAX77658_INVALID_DATA; 00868 break; 00869 } 00870 00871 return MAX77658_NO_ERROR; 00872 } 00873 00874 int MAX77658::get_thm_dtls(decode_thm_dtls_t *thm_dtls) 00875 { 00876 int ret; 00877 reg_stat_chg_a_t reg_stat_chg_a = {0}; 00878 00879 ret = read_register(STAT_CHG_A, (uint8_t *)&(reg_stat_chg_a)); 00880 if (ret != MAX77658_NO_ERROR) return ret; 00881 00882 *thm_dtls = (decode_thm_dtls_t)reg_stat_chg_a.bits.thm_dtls; 00883 00884 return MAX77658_NO_ERROR; 00885 } 00886 00887 int MAX77658::get_stat_chg_b(reg_bit_stat_chg_b_t bit_field, uint8_t *status) 00888 { 00889 int ret; 00890 reg_stat_chg_b_t reg_stat_chg_b = {0}; 00891 00892 ret = read_register(STAT_CHG_B, (uint8_t *)&(reg_stat_chg_b)); 00893 if (ret != MAX77658_NO_ERROR) return ret; 00894 00895 switch (bit_field) 00896 { 00897 case STAT_CHG_B_TIME_SUS: 00898 *status = (uint8_t)reg_stat_chg_b.bits.time_sus; 00899 break; 00900 case STAT_CHG_B_CHG: 00901 *status = (uint8_t)reg_stat_chg_b.bits.chg; 00902 break; 00903 case STAT_CHG_B_CHGIN_DTLS: 00904 *status = (uint8_t)reg_stat_chg_b.bits.chgin_dtls; 00905 break; 00906 case STAT_CHG_B_CHG_DTLS: 00907 *status = (uint8_t)reg_stat_chg_b.bits.chg_dtls; 00908 break; 00909 default: 00910 return MAX77658_INVALID_DATA; 00911 break; 00912 } 00913 00914 return MAX77658_NO_ERROR; 00915 } 00916 00917 int MAX77658::get_chg_dtls(decode_chg_dtls_t *chg_dtls) 00918 { 00919 int ret; 00920 reg_stat_chg_b_t reg_stat_chg_b = {0}; 00921 00922 ret = read_register(STAT_CHG_B, (uint8_t *)&(reg_stat_chg_b)); 00923 if (ret != MAX77658_NO_ERROR) return ret; 00924 00925 *chg_dtls = (decode_chg_dtls_t)reg_stat_chg_b.bits.chg_dtls; 00926 00927 return MAX77658_NO_ERROR; 00928 } 00929 00930 int MAX77658::set_thm_hot(int tempDegC) 00931 { 00932 uint8_t value; 00933 reg_cnfg_chg_a_t reg_cnfg_chg_a = {0}; 00934 00935 if (tempDegC < 45) tempDegC = 45; 00936 else if (tempDegC > 60) tempDegC = 60; 00937 00938 value = (tempDegC - 45) / 5; 00939 00940 SET_BIT_FIELD(CNFG_CHG_A, reg_cnfg_chg_a, reg_cnfg_chg_a.bits.thm_hot, value); 00941 return MAX77658_NO_ERROR; 00942 } 00943 00944 int MAX77658::get_thm_hot(int *tempDegC) 00945 { 00946 int ret; 00947 uint8_t bit_value; 00948 reg_cnfg_chg_a_t reg_cnfg_chg_a = {0}; 00949 00950 ret = read_register(CNFG_CHG_A, (uint8_t *)&(reg_cnfg_chg_a)); 00951 if (ret != MAX77658_NO_ERROR) return ret; 00952 00953 bit_value = (uint8_t)reg_cnfg_chg_a.bits.thm_hot; 00954 if (bit_value <= 3) 00955 *tempDegC = (bit_value * 5) + 45; 00956 else 00957 return MAX77658_INVALID_DATA; 00958 00959 return MAX77658_NO_ERROR; 00960 } 00961 00962 int MAX77658::set_thm_warm(int tempDegC) 00963 { 00964 uint8_t value; 00965 reg_cnfg_chg_a_t reg_cnfg_chg_a = {0}; 00966 00967 if (tempDegC < 35) tempDegC = 35; 00968 else if (tempDegC > 50) tempDegC = 50; 00969 00970 value = (tempDegC - 35) / 5; 00971 00972 SET_BIT_FIELD(CNFG_CHG_A, reg_cnfg_chg_a, reg_cnfg_chg_a.bits.thm_warm, value); 00973 return MAX77658_NO_ERROR; 00974 } 00975 00976 int MAX77658::get_thm_warm(int *tempDegC) 00977 { 00978 int ret; 00979 uint8_t bit_value; 00980 reg_cnfg_chg_a_t reg_cnfg_chg_a = {0}; 00981 00982 ret = read_register(CNFG_CHG_A, (uint8_t *)&(reg_cnfg_chg_a)); 00983 if (ret != MAX77658_NO_ERROR) return ret; 00984 00985 bit_value = (uint8_t)reg_cnfg_chg_a.bits.thm_warm; 00986 if (bit_value <= 3) 00987 *tempDegC = (bit_value * 5) + 35; 00988 else 00989 return MAX77658_INVALID_DATA; 00990 00991 return MAX77658_NO_ERROR; 00992 } 00993 00994 int MAX77658::set_thm_cool(int tempDegC) 00995 { 00996 uint8_t value; 00997 reg_cnfg_chg_a_t reg_cnfg_chg_a = {0}; 00998 00999 if (tempDegC < 0) tempDegC = 0; 01000 else if (tempDegC > 15) tempDegC = 15; 01001 01002 value = tempDegC / 5; 01003 01004 SET_BIT_FIELD(CNFG_CHG_A, reg_cnfg_chg_a, reg_cnfg_chg_a.bits.thm_cool, value); 01005 return MAX77658_NO_ERROR; 01006 } 01007 01008 int MAX77658::get_thm_cool(int *tempDegC) 01009 { 01010 int ret; 01011 uint8_t bit_value; 01012 reg_cnfg_chg_a_t reg_cnfg_chg_a = {0}; 01013 01014 ret = read_register(CNFG_CHG_A, (uint8_t *)&(reg_cnfg_chg_a)); 01015 if (ret != MAX77658_NO_ERROR) return ret; 01016 01017 bit_value = (uint8_t)reg_cnfg_chg_a.bits.thm_cool; 01018 if (bit_value <= 3) 01019 *tempDegC = bit_value * 5; 01020 else 01021 return MAX77658_INVALID_DATA; 01022 01023 return MAX77658_NO_ERROR; 01024 } 01025 01026 int MAX77658::set_thm_cold(int tempDegC) 01027 { 01028 uint8_t value; 01029 reg_cnfg_chg_a_t reg_cnfg_chg_a = {0}; 01030 01031 if (tempDegC < -10) tempDegC = -10; 01032 else if (tempDegC > 5) tempDegC = 5; 01033 01034 value = (tempDegC + 10) / 5; 01035 01036 SET_BIT_FIELD(CNFG_CHG_A, reg_cnfg_chg_a, reg_cnfg_chg_a.bits.thm_cold, value); 01037 return MAX77658_NO_ERROR; 01038 } 01039 01040 int MAX77658::get_thm_cold(int *tempDegC) 01041 { 01042 int ret; 01043 uint8_t bit_value; 01044 reg_cnfg_chg_a_t reg_cnfg_chg_a = {0}; 01045 01046 ret = read_register(CNFG_CHG_A, (uint8_t *)&(reg_cnfg_chg_a)); 01047 if (ret != MAX77658_NO_ERROR) return ret; 01048 01049 bit_value = (uint8_t)reg_cnfg_chg_a.bits.thm_cold; 01050 if (bit_value <= 3) 01051 *tempDegC = (bit_value * 5) - 10; 01052 else 01053 return MAX77658_INVALID_DATA; 01054 01055 return MAX77658_NO_ERROR; 01056 } 01057 01058 int MAX77658::set_cnfg_chg_b(reg_bit_cnfg_chg_b_t bit_field, uint8_t config) 01059 { 01060 int ret; 01061 reg_cnfg_chg_b_t reg_cnfg_chg_b = {0}; 01062 01063 ret = read_register(CNFG_CHG_B, (uint8_t *)&(reg_cnfg_chg_b)); 01064 if (ret != MAX77658_NO_ERROR) return ret; 01065 01066 switch (bit_field) 01067 { 01068 case CNFG_CHG_B_CHG_EN: 01069 reg_cnfg_chg_b.bits.chg_en = config; 01070 break; 01071 case CNFG_CHG_B_I_PQ: 01072 reg_cnfg_chg_b.bits.i_pq = config; 01073 break; 01074 case CNFG_CHG_B_ICHGIN_LIM: 01075 reg_cnfg_chg_b.bits.ichgin_lim = config; 01076 break; 01077 case CNFG_CHG_B_VCHGIN_MIN: 01078 reg_cnfg_chg_b.bits.vchgin_min = config; 01079 break; 01080 default: 01081 return MAX77658_INVALID_DATA; 01082 break; 01083 } 01084 01085 return write_register(CNFG_CHG_B, (uint8_t *)&(reg_cnfg_chg_b)); 01086 } 01087 01088 int MAX77658::get_cnfg_chg_b(reg_bit_cnfg_chg_b_t bit_field, uint8_t *config) 01089 { 01090 int ret; 01091 reg_cnfg_chg_b_t reg_cnfg_chg_b = {0}; 01092 01093 ret = read_register(CNFG_CHG_B, (uint8_t *)&(reg_cnfg_chg_b)); 01094 if (ret != MAX77658_NO_ERROR) return ret; 01095 01096 switch (bit_field) 01097 { 01098 case CNFG_CHG_B_CHG_EN: 01099 *config = (uint8_t)reg_cnfg_chg_b.bits.chg_en; 01100 break; 01101 case CNFG_CHG_B_I_PQ: 01102 *config = (uint8_t)reg_cnfg_chg_b.bits.i_pq; 01103 break; 01104 case CNFG_CHG_B_ICHGIN_LIM: 01105 *config = (uint8_t)reg_cnfg_chg_b.bits.ichgin_lim; 01106 break; 01107 case CNFG_CHG_B_VCHGIN_MIN: 01108 *config = (uint8_t)reg_cnfg_chg_b.bits.vchgin_min; 01109 break; 01110 default: 01111 return MAX77658_INVALID_DATA; 01112 break; 01113 } 01114 01115 return MAX77658_NO_ERROR; 01116 } 01117 01118 int MAX77658::set_vchgin_min(float voltV) 01119 { 01120 uint8_t value; 01121 reg_cnfg_chg_b_t reg_cnfg_chg_b = {0}; 01122 float voltmV = voltV * 1000; 01123 01124 if (voltmV < 4000) voltmV = 4000; 01125 else if (voltmV > 4700) voltmV = 4700; 01126 01127 value = (voltmV - 4000) / 100; 01128 01129 SET_BIT_FIELD(CNFG_CHG_B, reg_cnfg_chg_b, reg_cnfg_chg_b.bits.vchgin_min, value); 01130 return MAX77658_NO_ERROR; 01131 } 01132 01133 int MAX77658::get_vchgin_min(float *voltV) 01134 { 01135 int ret; 01136 uint8_t value; 01137 reg_cnfg_chg_b_t reg_cnfg_chg_b = {0}; 01138 01139 ret = read_register(CNFG_CHG_B, (uint8_t *)&(reg_cnfg_chg_b)); 01140 if (ret != MAX77658_NO_ERROR) return ret; 01141 01142 value = (uint8_t)reg_cnfg_chg_b.bits.vchgin_min; 01143 *voltV = (float)(value * 0.1f) + 4.0f; 01144 return MAX77658_NO_ERROR; 01145 } 01146 01147 int MAX77658::set_ichgin_lim(int currentmA) 01148 { 01149 uint8_t value; 01150 reg_cnfg_chg_b_t reg_cnfg_chg_b = {0}; 01151 01152 if (currentmA < 95) currentmA = 95; 01153 else if (currentmA > 475) currentmA = 475; 01154 01155 value = (currentmA - 95) / 95; 01156 01157 SET_BIT_FIELD(CNFG_CHG_B, reg_cnfg_chg_b, reg_cnfg_chg_b.bits.ichgin_lim, value); 01158 return MAX77658_NO_ERROR; 01159 } 01160 01161 int MAX77658::get_ichgin_lim(int *currentmA) 01162 { 01163 int ret; 01164 uint8_t bit_value; 01165 reg_cnfg_chg_b_t reg_cnfg_chg_b = {0}; 01166 01167 ret = read_register(CNFG_CHG_B, (uint8_t *)&(reg_cnfg_chg_b)); 01168 if (ret != MAX77658_NO_ERROR) return ret; 01169 01170 bit_value = (uint8_t)reg_cnfg_chg_b.bits.ichgin_lim; 01171 *currentmA = (bit_value * 95) + 95; 01172 return MAX77658_NO_ERROR; 01173 } 01174 01175 int MAX77658::set_chg_pq(float voltV) 01176 { 01177 uint8_t value; 01178 reg_cnfg_chg_c_t reg_cnfg_chg_c = {0}; 01179 float voltmV = voltV * 1000; 01180 01181 if (voltmV < 2300) voltmV = 2300; 01182 else if (voltmV > 3000) voltmV = 3000; 01183 01184 value = (voltmV - 2300) / 100; 01185 01186 SET_BIT_FIELD(CNFG_CHG_C, reg_cnfg_chg_c, reg_cnfg_chg_c.bits.chg_pq, value); 01187 return MAX77658_NO_ERROR; 01188 } 01189 01190 int MAX77658::get_chg_pq(float *voltV) 01191 { 01192 int ret; 01193 uint8_t bit_value; 01194 reg_cnfg_chg_c_t reg_cnfg_chg_c = {0}; 01195 01196 ret = read_register(CNFG_CHG_C, (uint8_t *)&(reg_cnfg_chg_c)); 01197 if (ret != MAX77658_NO_ERROR) return ret; 01198 01199 bit_value = (uint8_t)reg_cnfg_chg_c.bits.chg_pq; 01200 *voltV = (bit_value * 0.1f) + 2.3f; 01201 return MAX77658_NO_ERROR; 01202 } 01203 01204 int MAX77658::set_i_term(float percent) 01205 { 01206 uint8_t value; 01207 reg_cnfg_chg_c_t reg_cnfg_chg_c = {0}; 01208 01209 if (percent < 7.5f) value = 0; 01210 else if ((percent >= 7.5f) && (percent < 10)) value = 1; 01211 else if ((percent >= 10) && (percent < 15)) value = 2; 01212 else if (percent >= 15) value = 3; 01213 01214 SET_BIT_FIELD(CNFG_CHG_C, reg_cnfg_chg_c, reg_cnfg_chg_c.bits.i_term, value); 01215 return MAX77658_NO_ERROR; 01216 } 01217 01218 int MAX77658::get_i_term(float *percent) 01219 { 01220 int ret; 01221 uint8_t bit_value; 01222 reg_cnfg_chg_c_t reg_cnfg_chg_c = {0}; 01223 01224 ret = read_register(CNFG_CHG_C, (uint8_t *)&(reg_cnfg_chg_c)); 01225 if (ret != MAX77658_NO_ERROR) return ret; 01226 01227 bit_value = (uint8_t)reg_cnfg_chg_c.bits.i_term; 01228 01229 if (bit_value == 0) *percent = 5.0f; 01230 else if (bit_value == 1) *percent = 7.5f; 01231 else if (bit_value == 2) *percent = 10.0f; 01232 else if (bit_value == 3) *percent = 15.0f; 01233 else return MAX77658_INVALID_DATA; 01234 01235 return MAX77658_NO_ERROR; 01236 } 01237 01238 int MAX77658::set_t_topoff(uint8_t minute) 01239 { 01240 uint8_t value; 01241 reg_cnfg_chg_c_t reg_cnfg_chg_c = {0}; 01242 01243 if (minute > 35) minute = 35; 01244 01245 value = (uint8_t)(minute / 5); 01246 01247 SET_BIT_FIELD(CNFG_CHG_C, reg_cnfg_chg_c, reg_cnfg_chg_c.bits.t_topoff, value); 01248 return MAX77658_NO_ERROR; 01249 } 01250 01251 int MAX77658::get_t_topoff(uint8_t *minute) 01252 { 01253 int ret; 01254 uint8_t bit_value; 01255 reg_cnfg_chg_c_t reg_cnfg_chg_c = {0}; 01256 01257 ret = read_register(CNFG_CHG_C, (uint8_t *)&(reg_cnfg_chg_c)); 01258 if (ret != MAX77658_NO_ERROR) return ret; 01259 01260 bit_value = (uint8_t)reg_cnfg_chg_c.bits.t_topoff; 01261 *minute = (bit_value * 5); 01262 return MAX77658_NO_ERROR; 01263 } 01264 01265 int MAX77658::set_tj_reg(uint8_t tempDegC) 01266 { 01267 uint8_t value; 01268 reg_cnfg_chg_d_t reg_cnfg_chg_d = {0}; 01269 01270 if (tempDegC < 60) tempDegC = 60; 01271 else if (tempDegC > 100) tempDegC = 100; 01272 01273 value = (tempDegC - 60) / 10; 01274 01275 SET_BIT_FIELD(CNFG_CHG_D, reg_cnfg_chg_d, reg_cnfg_chg_d.bits.tj_reg, value); 01276 return MAX77658_NO_ERROR; 01277 } 01278 01279 int MAX77658::get_tj_reg(uint8_t *tempDegC) 01280 { 01281 int ret; 01282 uint8_t bit_value; 01283 reg_cnfg_chg_d_t reg_cnfg_chg_d = {0}; 01284 01285 ret = read_register(CNFG_CHG_D, (uint8_t *)&(reg_cnfg_chg_d)); 01286 if (ret != MAX77658_NO_ERROR) return ret; 01287 01288 bit_value = (uint8_t)reg_cnfg_chg_d.bits.tj_reg; 01289 *tempDegC = (bit_value * 10) + 60; 01290 return MAX77658_NO_ERROR; 01291 } 01292 01293 int MAX77658::set_vsys_reg(float voltV) 01294 { 01295 uint8_t value; 01296 reg_cnfg_chg_d_t reg_cnfg_chg_d = {0}; 01297 float voltmV = voltV * 1000; 01298 01299 if (voltmV < 3300) voltmV = 3300; 01300 else if (voltmV > 4800) voltmV = 4800; 01301 01302 value = (voltmV - 3300) / 50; 01303 01304 SET_BIT_FIELD(CNFG_CHG_D, reg_cnfg_chg_d, reg_cnfg_chg_d.bits.vsys_reg, value); 01305 return MAX77658_NO_ERROR; 01306 } 01307 01308 int MAX77658::get_vsys_reg(float *voltV) 01309 { 01310 int ret; 01311 uint8_t bit_value; 01312 reg_cnfg_chg_d_t reg_cnfg_chg_d = {0}; 01313 01314 ret = read_register(CNFG_CHG_D, (uint8_t *)&(reg_cnfg_chg_d)); 01315 if (ret != MAX77658_NO_ERROR) return ret; 01316 01317 bit_value = (uint8_t)reg_cnfg_chg_d.bits.vsys_reg; 01318 *voltV = (bit_value * 0.05f) + 3.3f; 01319 return MAX77658_NO_ERROR; 01320 } 01321 01322 int MAX77658::set_chg_cc(float currentmA) 01323 { 01324 uint8_t value; 01325 reg_cnfg_chg_e_t reg_cnfg_chg_e = {0}; 01326 float currentuA = currentmA * 1000; 01327 01328 if (currentuA < 7500) currentuA = 7500; 01329 if (currentuA > 300000) currentuA = 300000; 01330 01331 value = (currentuA - 7500) / 7500; 01332 01333 SET_BIT_FIELD(CNFG_CHG_E, reg_cnfg_chg_e, reg_cnfg_chg_e.bits.chg_cc, value); 01334 return MAX77658_NO_ERROR; 01335 } 01336 01337 int MAX77658::get_chg_cc(float *currentmA) 01338 { 01339 int ret; 01340 uint8_t bit_value; 01341 reg_cnfg_chg_e_t reg_cnfg_chg_e = {0}; 01342 01343 ret = read_register(CNFG_CHG_E, (uint8_t *)&(reg_cnfg_chg_e)); 01344 if (ret != MAX77658_NO_ERROR) return ret; 01345 01346 bit_value = (uint8_t)reg_cnfg_chg_e.bits.chg_cc; 01347 if (bit_value >= 39) bit_value = 39; //0x27 to 0x3F = 300.0mA 01348 01349 *currentmA = (bit_value * 7.5f) + 7.5f; 01350 01351 return MAX77658_NO_ERROR; 01352 } 01353 01354 int MAX77658::set_t_fast_chg(decode_t_fast_chg_t t_fast_chg) 01355 { 01356 reg_cnfg_chg_e_t reg_cnfg_chg_e = {0}; 01357 01358 SET_BIT_FIELD(CNFG_CHG_E, reg_cnfg_chg_e, reg_cnfg_chg_e.bits.t_fast_chg, t_fast_chg); 01359 return MAX77658_NO_ERROR; 01360 } 01361 01362 int MAX77658::get_t_fast_chg(decode_t_fast_chg_t *t_fast_chg) 01363 { 01364 int ret; 01365 reg_cnfg_chg_e_t reg_cnfg_chg_e = {0}; 01366 01367 ret = read_register(CNFG_CHG_E, (uint8_t *)&(reg_cnfg_chg_e)); 01368 if (ret != MAX77658_NO_ERROR) return ret; 01369 01370 *t_fast_chg = (decode_t_fast_chg_t)reg_cnfg_chg_e.bits.t_fast_chg; 01371 01372 return MAX77658_NO_ERROR; 01373 } 01374 01375 int MAX77658::set_chg_cc_jeita(float currentmA) 01376 { 01377 uint8_t value; 01378 reg_cnfg_chg_f_t reg_cnfg_chg_f = {0}; 01379 float currentuA = currentmA * 1000; 01380 01381 if (currentuA < 7500) currentuA = 7500; 01382 else if (currentuA > 300000) currentuA = 300000; 01383 01384 value = round(currentuA - 7500) / 7500; 01385 01386 SET_BIT_FIELD(CNFG_CHG_F, reg_cnfg_chg_f, reg_cnfg_chg_f.bits.chg_cc_jeita, value); 01387 return MAX77658_NO_ERROR; 01388 } 01389 01390 int MAX77658::get_chg_cc_jeita(float *currentmA) 01391 { 01392 int ret; 01393 uint8_t bit_value; 01394 reg_cnfg_chg_f_t reg_cnfg_chg_f = {0}; 01395 01396 ret = read_register(CNFG_CHG_F, (uint8_t *)&(reg_cnfg_chg_f)); 01397 if (ret != MAX77658_NO_ERROR) return ret; 01398 01399 bit_value = (uint8_t)reg_cnfg_chg_f.bits.chg_cc_jeita; 01400 if (bit_value >= 39) bit_value = 39; //0x27 to 0x3F = 300.0mA 01401 01402 *currentmA = (bit_value * 7.5f) + 7.5f; 01403 return MAX77658_NO_ERROR; 01404 } 01405 01406 int MAX77658::set_cnfg_chg_g(reg_bit_cnfg_chg_g_t bit_field, uint8_t config) 01407 { 01408 int ret; 01409 reg_cnfg_chg_g_t reg_cnfg_chg_g = {0}; 01410 01411 ret = read_register(CNFG_CHG_G, (uint8_t *)&(reg_cnfg_chg_g)); 01412 if (ret != MAX77658_NO_ERROR) return ret; 01413 01414 switch (bit_field) 01415 { 01416 case CNFG_CHG_G_FUS_M: 01417 reg_cnfg_chg_g.bits.fus_m = config; 01418 break; 01419 case CNFG_CHG_G_USBS: 01420 reg_cnfg_chg_g.bits.usbs = config; 01421 break; 01422 case CNFG_CHG_G_CHG_CV: 01423 reg_cnfg_chg_g.bits.chg_cv = config; 01424 break; 01425 default: 01426 return MAX77658_INVALID_DATA; 01427 break; 01428 } 01429 01430 return write_register(CNFG_CHG_G, (uint8_t *)&(reg_cnfg_chg_g)); 01431 } 01432 01433 int MAX77658::get_cnfg_chg_g(reg_bit_cnfg_chg_g_t bit_field, uint8_t *config) 01434 { 01435 int ret; 01436 reg_cnfg_chg_g_t reg_cnfg_chg_g = {0}; 01437 01438 ret = read_register(CNFG_CHG_G, (uint8_t *)&(reg_cnfg_chg_g)); 01439 if (ret != MAX77658_NO_ERROR) return ret; 01440 01441 switch (bit_field) 01442 { 01443 case CNFG_CHG_G_FUS_M: 01444 *config = (uint8_t)reg_cnfg_chg_g.bits.fus_m; 01445 break; 01446 case CNFG_CHG_G_USBS: 01447 *config = (uint8_t)reg_cnfg_chg_g.bits.usbs; 01448 break; 01449 case CNFG_CHG_G_CHG_CV: 01450 *config = (uint8_t)reg_cnfg_chg_g.bits.chg_cv; 01451 break; 01452 default: 01453 return MAX77658_INVALID_DATA; 01454 break; 01455 } 01456 01457 return MAX77658_NO_ERROR; 01458 } 01459 01460 int MAX77658::set_chg_cv(float voltV) 01461 { 01462 uint8_t value; 01463 reg_cnfg_chg_g_t reg_cnfg_chg_g = {0}; 01464 float voltmV = voltV * 1000; 01465 01466 if (voltmV < 3600) voltmV = 3600; 01467 else if (voltmV > 4600) voltmV = 4600; 01468 01469 value = (voltmV - 3600) / 25; 01470 01471 SET_BIT_FIELD(CNFG_CHG_G, reg_cnfg_chg_g, reg_cnfg_chg_g.bits.chg_cv, value); 01472 return MAX77658_NO_ERROR; 01473 } 01474 01475 int MAX77658::get_chg_cv(float *voltV) 01476 { 01477 int ret; 01478 uint8_t bit_value; 01479 reg_cnfg_chg_g_t reg_cnfg_chg_g = {0}; 01480 01481 ret = read_register(CNFG_CHG_G, (uint8_t *)&(reg_cnfg_chg_g)); 01482 if (ret != MAX77658_NO_ERROR) return ret; 01483 01484 bit_value = (uint8_t)reg_cnfg_chg_g.bits.chg_cv; 01485 *voltV = (bit_value * 0.025f) + 3.6f; 01486 return MAX77658_NO_ERROR; 01487 } 01488 01489 int MAX77658::set_cnfg_chg_h(reg_bit_cnfg_chg_h_t bit_field, uint8_t config) 01490 { 01491 int ret; 01492 reg_cnfg_chg_h_t reg_cnfg_chg_h = {0}; 01493 01494 ret = read_register(CNFG_CHG_H, (uint8_t *)&(reg_cnfg_chg_h)); 01495 if (ret != MAX77658_NO_ERROR) return ret; 01496 01497 switch (bit_field) 01498 { 01499 case CNFG_CHG_H_CHR_TH_DIS: 01500 reg_cnfg_chg_h.bits.chr_th_dis = config; 01501 break; 01502 case CNFG_CHG_H_SYS_BAT_PRT: 01503 reg_cnfg_chg_h.bits.sys_bat_prt = config; 01504 break; 01505 case CNFG_CHG_H_CHG_CV_JEITA: 01506 reg_cnfg_chg_h.bits.chg_cv_jeita = config; 01507 break; 01508 default: 01509 return MAX77658_INVALID_DATA; 01510 break; 01511 } 01512 01513 return write_register(CNFG_CHG_H, (uint8_t *)&(reg_cnfg_chg_h)); 01514 } 01515 01516 int MAX77658::get_cnfg_chg_h(reg_bit_cnfg_chg_h_t bit_field, uint8_t *config) 01517 { 01518 int ret; 01519 reg_cnfg_chg_h_t reg_cnfg_chg_h = {0}; 01520 01521 ret = read_register(CNFG_CHG_H, (uint8_t *)&(reg_cnfg_chg_h)); 01522 if (ret != MAX77658_NO_ERROR) return ret; 01523 01524 switch (bit_field) 01525 { 01526 case CNFG_CHG_H_CHR_TH_DIS: 01527 *config = (uint8_t)reg_cnfg_chg_h.bits.chr_th_dis; 01528 break; 01529 case CNFG_CHG_H_SYS_BAT_PRT: 01530 *config = (uint8_t)reg_cnfg_chg_h.bits.sys_bat_prt; 01531 break; 01532 case CNFG_CHG_H_CHG_CV_JEITA: 01533 *config = (uint8_t)reg_cnfg_chg_h.bits.chg_cv_jeita; 01534 break; 01535 default: 01536 return MAX77658_INVALID_DATA; 01537 break; 01538 } 01539 01540 return MAX77658_NO_ERROR; 01541 } 01542 01543 int MAX77658::set_chg_cv_jeita(float voltV) 01544 { 01545 uint8_t value; 01546 reg_cnfg_chg_h_t reg_cnfg_chg_h = {0}; 01547 float voltmV = voltV * 1000; 01548 01549 if (voltmV < 3600) voltmV = 3600; 01550 else if (voltmV > 4600) voltmV = 4600; 01551 01552 value = round(voltmV - 3600) / 25; 01553 01554 SET_BIT_FIELD(CNFG_CHG_H, reg_cnfg_chg_h, reg_cnfg_chg_h.bits.chg_cv_jeita, value); 01555 return MAX77658_NO_ERROR; 01556 } 01557 01558 int MAX77658::get_chg_cv_jeita(float *voltV) 01559 { 01560 int ret; 01561 uint8_t bit_value; 01562 reg_cnfg_chg_h_t reg_cnfg_chg_h = {0}; 01563 01564 ret = read_register(CNFG_CHG_H, (uint8_t *)&(reg_cnfg_chg_h)); 01565 if (ret != MAX77658_NO_ERROR) return ret; 01566 01567 bit_value = (uint8_t)reg_cnfg_chg_h.bits.chg_cv_jeita; 01568 *voltV = (bit_value * 0.025f) + 3.6f; 01569 return MAX77658_NO_ERROR; 01570 } 01571 01572 int MAX77658::set_imon_dischg_scale(float currentmA) 01573 { 01574 uint8_t value; 01575 reg_cnfg_chg_i_t reg_cnfg_chg_i = {0}; 01576 01577 if (currentmA < 40.5f) value = 0; 01578 else if ((currentmA >= 40.5f) && (currentmA < 72.3f)) value = 1; 01579 else if ((currentmA >= 72.3f) && (currentmA < 103.4f)) value = 2; 01580 else if ((currentmA >= 103.4f) && (currentmA < 134.1f)) value = 3; 01581 else if ((currentmA >= 134.1f) && (currentmA < 164.1f)) value = 4; 01582 else if ((currentmA >= 164.1f) && (currentmA < 193.7f)) value = 5; 01583 else if ((currentmA >= 193.7f) && (currentmA < 222.7f)) value = 6; 01584 else if ((currentmA >= 222.7f) && (currentmA < 251.2f)) value = 7; 01585 else if ((currentmA >= 251.2f) && (currentmA < 279.3f)) value = 8; 01586 else if ((currentmA >= 279.3f) && (currentmA < 300.0f)) value = 9; 01587 else if (currentmA >= 300.0f) value = 10; 01588 01589 SET_BIT_FIELD(CNFG_CHG_I, reg_cnfg_chg_i, reg_cnfg_chg_i.bits.imon_dischg_scale, value); 01590 return MAX77658_NO_ERROR; 01591 } 01592 01593 int MAX77658::get_imon_dischg_scale(float *currentmA) 01594 { 01595 int ret; 01596 uint8_t bit_value; 01597 reg_cnfg_chg_i_t reg_cnfg_chg_i = {0}; 01598 01599 ret = read_register(CNFG_CHG_I, (uint8_t *)&(reg_cnfg_chg_i)); 01600 if (ret != MAX77658_NO_ERROR) { 01601 return ret; 01602 } 01603 01604 bit_value = (uint8_t)reg_cnfg_chg_i.bits.imon_dischg_scale; 01605 01606 if (bit_value == 0) *currentmA = 8.2f; 01607 else if (bit_value == 1) *currentmA = 40.5f; 01608 else if (bit_value == 2) *currentmA = 72.3f; 01609 else if (bit_value == 3) *currentmA = 103.4f; 01610 else if (bit_value == 4) *currentmA = 134.1f; 01611 else if (bit_value == 5) *currentmA = 164.1f; 01612 else if (bit_value == 6) *currentmA = 193.7f; 01613 else if (bit_value == 7) *currentmA = 222.7f; 01614 else if (bit_value == 8) *currentmA = 251.2f; 01615 else if (bit_value == 9) *currentmA = 279.3f; 01616 else *currentmA = 300.0f; //0xA to 0xF = 300.0mA 01617 01618 return MAX77658_NO_ERROR; 01619 } 01620 01621 int MAX77658::set_mux_sel(decode_mux_sel_t selection) 01622 { 01623 reg_cnfg_chg_i_t reg_cnfg_chg_i = {0}; 01624 01625 SET_BIT_FIELD(CNFG_CHG_I, reg_cnfg_chg_i, reg_cnfg_chg_i.bits.mux_sel, selection); 01626 return MAX77658_NO_ERROR; 01627 } 01628 01629 int MAX77658::get_mux_sel(decode_mux_sel_t *selection) 01630 { 01631 int ret; 01632 reg_cnfg_chg_i_t reg_cnfg_chg_i = {0}; 01633 01634 ret = read_register(CNFG_CHG_I, (uint8_t *)&(reg_cnfg_chg_i)); 01635 if (ret != MAX77658_NO_ERROR) return ret; 01636 01637 *selection = (decode_mux_sel_t)reg_cnfg_chg_i.bits.mux_sel; 01638 return MAX77658_NO_ERROR; 01639 } 01640 01641 int MAX77658::set_cnfg_sbb_top(reg_bit_cnfg_sbb_top_t bit_field, uint8_t config) 01642 { 01643 int ret; 01644 reg_cnfg_sbb_top_t reg_cnfg_sbb_top = {0}; 01645 01646 ret = read_register(CNFG_SBB_TOP, (uint8_t *)&(reg_cnfg_sbb_top)); 01647 if (ret != MAX77658_NO_ERROR) return ret; 01648 01649 switch (bit_field) 01650 { 01651 case CNFG_SBB_TOP_DRV_SBB: 01652 reg_cnfg_sbb_top.bits.drv_sbb = config; 01653 break; 01654 case CNFG_SBB_TOP_DIS_LPM: 01655 reg_cnfg_sbb_top.bits.dis_lpm = config; 01656 break; 01657 default: 01658 return MAX77658_INVALID_DATA; 01659 break; 01660 } 01661 01662 return write_register(CNFG_SBB_TOP, (uint8_t *)&(reg_cnfg_sbb_top)); 01663 } 01664 01665 int MAX77658::get_cnfg_sbb_top(reg_bit_cnfg_sbb_top_t bit_field, uint8_t *config) 01666 { 01667 int ret; 01668 reg_cnfg_sbb_top_t reg_cnfg_sbb_top = {0}; 01669 01670 ret = read_register(CNFG_SBB_TOP, (uint8_t *)&(reg_cnfg_sbb_top)); 01671 if (ret != MAX77658_NO_ERROR) return ret; 01672 01673 switch (bit_field) 01674 { 01675 case CNFG_SBB_TOP_DRV_SBB: 01676 *config = (uint8_t)reg_cnfg_sbb_top.bits.drv_sbb; 01677 break; 01678 case CNFG_SBB_TOP_DIS_LPM: 01679 *config = (uint8_t)reg_cnfg_sbb_top.bits.dis_lpm; 01680 break; 01681 default: 01682 return MAX77658_INVALID_DATA; 01683 break; 01684 } 01685 01686 return MAX77658_NO_ERROR; 01687 } 01688 01689 int MAX77658::set_tv_sbb_a(uint8_t channel, float voltV) 01690 { 01691 uint8_t value; 01692 reg_cnfg_sbb0_a_t reg_cnfg_sbb0_a = {0}; 01693 reg_cnfg_sbb1_a_t reg_cnfg_sbb1_a = {0}; 01694 reg_cnfg_sbb2_a_t reg_cnfg_sbb2_a = {0}; 01695 float voltmV = voltV * 1000; 01696 01697 if (voltmV < 500) voltmV = 500; 01698 else if (voltmV > 5500) voltmV = 5500; 01699 01700 value = (voltmV - 500) / 25; 01701 01702 if (channel == 0) { 01703 SET_BIT_FIELD(CNFG_SBB0_A, reg_cnfg_sbb0_a, reg_cnfg_sbb0_a.bits.tv_sbb0, value); 01704 } 01705 else if (channel == 1) { 01706 SET_BIT_FIELD(CNFG_SBB1_A, reg_cnfg_sbb1_a, reg_cnfg_sbb1_a.bits.tv_sbb1, value); 01707 } 01708 else if (channel == 2) { 01709 SET_BIT_FIELD(CNFG_SBB2_A, reg_cnfg_sbb2_a, reg_cnfg_sbb2_a.bits.tv_sbb2, value); 01710 } 01711 else { 01712 return MAX77658_INVALID_DATA; 01713 } 01714 01715 return MAX77658_NO_ERROR; 01716 } 01717 01718 int MAX77658::get_tv_sbb_a(uint8_t channel, float *voltV) 01719 { 01720 int ret; 01721 uint8_t bit_value; 01722 reg_cnfg_sbb0_a_t reg_cnfg_sbb0_a = {0}; 01723 reg_cnfg_sbb1_a_t reg_cnfg_sbb1_a = {0}; 01724 reg_cnfg_sbb2_a_t reg_cnfg_sbb2_a = {0}; 01725 01726 if (channel == 0) { 01727 ret = read_register(CNFG_SBB0_A, (uint8_t *)&(reg_cnfg_sbb0_a)); 01728 if (ret != MAX77658_NO_ERROR) return ret; 01729 01730 bit_value = (uint8_t)reg_cnfg_sbb0_a.bits.tv_sbb0; 01731 } 01732 else if (channel == 1) { 01733 ret = read_register(CNFG_SBB1_A, (uint8_t *)&(reg_cnfg_sbb1_a)); 01734 if (ret != MAX77658_NO_ERROR) return ret; 01735 01736 bit_value = (uint8_t)reg_cnfg_sbb1_a.bits.tv_sbb1; 01737 } 01738 else if (channel == 2) { 01739 ret = read_register(CNFG_SBB2_A, (uint8_t *)&(reg_cnfg_sbb2_a)); 01740 if (ret != MAX77658_NO_ERROR) return ret; 01741 01742 bit_value = (uint8_t)reg_cnfg_sbb2_a.bits.tv_sbb2; 01743 } 01744 else return MAX77658_INVALID_DATA; 01745 01746 if (bit_value > 200) bit_value = 200; 01747 *voltV = (bit_value * 0.025f) + 0.5f; 01748 01749 return MAX77658_NO_ERROR; 01750 } 01751 01752 int MAX77658::set_op_mode(uint8_t channel, decode_op_mode_t mode) 01753 { 01754 reg_cnfg_sbb0_b_t reg_cnfg_sbb0_b = {0}; 01755 reg_cnfg_sbb1_b_t reg_cnfg_sbb1_b = {0}; 01756 reg_cnfg_sbb2_b_t reg_cnfg_sbb2_b = {0}; 01757 01758 if (channel == 0) { 01759 SET_BIT_FIELD(CNFG_SBB0_B, reg_cnfg_sbb0_b, reg_cnfg_sbb0_b.bits.op_mode0, mode); 01760 } 01761 else if (channel == 1) { 01762 SET_BIT_FIELD(CNFG_SBB1_B, reg_cnfg_sbb1_b, reg_cnfg_sbb1_b.bits.op_mode1, mode); 01763 } 01764 else if (channel == 2) { 01765 SET_BIT_FIELD(CNFG_SBB2_B, reg_cnfg_sbb2_b, reg_cnfg_sbb2_b.bits.op_mode2, mode); 01766 } 01767 else { 01768 return MAX77658_INVALID_DATA; 01769 } 01770 01771 return MAX77658_NO_ERROR; 01772 } 01773 01774 int MAX77658::get_op_mode(uint8_t channel, decode_op_mode_t *mode) 01775 { 01776 int ret; 01777 reg_cnfg_sbb0_b_t reg_cnfg_sbb0_b = {0}; 01778 reg_cnfg_sbb1_b_t reg_cnfg_sbb1_b = {0}; 01779 reg_cnfg_sbb2_b_t reg_cnfg_sbb2_b = {0}; 01780 01781 if (channel == 0) { 01782 ret = read_register(CNFG_SBB0_B, (uint8_t *)&(reg_cnfg_sbb0_b)); 01783 if (ret != MAX77658_NO_ERROR) return ret; 01784 01785 *mode = (decode_op_mode_t)reg_cnfg_sbb0_b.bits.op_mode0; 01786 } 01787 else if (channel == 1) { 01788 ret = read_register(CNFG_SBB1_B, (uint8_t *)&(reg_cnfg_sbb1_b)); 01789 if (ret != MAX77658_NO_ERROR) return ret; 01790 01791 *mode = (decode_op_mode_t)reg_cnfg_sbb1_b.bits.op_mode1; 01792 } 01793 else if (channel == 2) { 01794 ret = read_register(CNFG_SBB2_B, (uint8_t *)&(reg_cnfg_sbb2_b)); 01795 if (ret != MAX77658_NO_ERROR) return ret; 01796 01797 *mode = (decode_op_mode_t)reg_cnfg_sbb2_b.bits.op_mode2; 01798 } 01799 else { 01800 return MAX77658_INVALID_DATA; 01801 } 01802 01803 return MAX77658_NO_ERROR; 01804 } 01805 01806 int MAX77658::set_ip_sbb(uint8_t channel, decode_ip_sbb_t ip_sbb) 01807 { 01808 reg_cnfg_sbb0_b_t reg_cnfg_sbb0_b = {0}; 01809 reg_cnfg_sbb1_b_t reg_cnfg_sbb1_b = {0}; 01810 reg_cnfg_sbb2_b_t reg_cnfg_sbb2_b = {0}; 01811 01812 if (channel == 0) { 01813 SET_BIT_FIELD(CNFG_SBB0_B, reg_cnfg_sbb0_b, reg_cnfg_sbb0_b.bits.ip_sbb0, ip_sbb); 01814 } 01815 else if (channel == 1) { 01816 SET_BIT_FIELD(CNFG_SBB1_B, reg_cnfg_sbb1_b, reg_cnfg_sbb1_b.bits.ip_sbb1, ip_sbb); 01817 } 01818 else if (channel == 2) { 01819 SET_BIT_FIELD(CNFG_SBB2_B, reg_cnfg_sbb2_b, reg_cnfg_sbb2_b.bits.ip_sbb2, ip_sbb); 01820 } 01821 else { 01822 return MAX77658_INVALID_DATA; 01823 } 01824 01825 return MAX77658_NO_ERROR; 01826 } 01827 01828 int MAX77658::get_ip_sbb(uint8_t channel, decode_ip_sbb_t *ip_sbb) 01829 { 01830 int ret; 01831 reg_cnfg_sbb0_b_t reg_cnfg_sbb0_b = {0}; 01832 reg_cnfg_sbb1_b_t reg_cnfg_sbb1_b = {0}; 01833 reg_cnfg_sbb2_b_t reg_cnfg_sbb2_b = {0}; 01834 01835 if (channel == 0) { 01836 ret = read_register(CNFG_SBB0_B, (uint8_t *)&(reg_cnfg_sbb0_b)); 01837 if (ret != MAX77658_NO_ERROR) return ret; 01838 01839 *ip_sbb = (decode_ip_sbb_t)reg_cnfg_sbb0_b.bits.ip_sbb0; 01840 } 01841 else if (channel == 1) { 01842 ret = read_register(CNFG_SBB1_B, (uint8_t *)&(reg_cnfg_sbb1_b)); 01843 if (ret != MAX77658_NO_ERROR) return ret; 01844 01845 *ip_sbb = (decode_ip_sbb_t)reg_cnfg_sbb1_b.bits.ip_sbb1; 01846 } 01847 else if (channel == 2) { 01848 ret = read_register(CNFG_SBB2_B, (uint8_t *)&(reg_cnfg_sbb2_b)); 01849 if (ret != MAX77658_NO_ERROR) return ret; 01850 01851 *ip_sbb = (decode_ip_sbb_t)reg_cnfg_sbb2_b.bits.ip_sbb2; 01852 } 01853 else { 01854 return MAX77658_INVALID_DATA; 01855 } 01856 01857 return MAX77658_NO_ERROR; 01858 } 01859 01860 int MAX77658::set_ade_sbb(uint8_t channel, decode_ade_sbb_t ade_sbb) 01861 { 01862 reg_cnfg_sbb0_b_t reg_cnfg_sbb0_b = {0}; 01863 reg_cnfg_sbb1_b_t reg_cnfg_sbb1_b = {0}; 01864 reg_cnfg_sbb2_b_t reg_cnfg_sbb2_b = {0}; 01865 01866 if (channel == 0) { 01867 SET_BIT_FIELD(CNFG_SBB0_B, reg_cnfg_sbb0_b, reg_cnfg_sbb0_b.bits.ade_sbb0, ade_sbb); 01868 } 01869 else if (channel == 1) { 01870 SET_BIT_FIELD(CNFG_SBB1_B, reg_cnfg_sbb1_b, reg_cnfg_sbb1_b.bits.ade_sbb1, ade_sbb); 01871 } 01872 else if (channel == 2) { 01873 SET_BIT_FIELD(CNFG_SBB2_B, reg_cnfg_sbb2_b, reg_cnfg_sbb2_b.bits.ade_sbb2, ade_sbb); 01874 } 01875 else { 01876 return MAX77658_INVALID_DATA; 01877 } 01878 01879 return MAX77658_NO_ERROR; 01880 } 01881 01882 int MAX77658::get_ade_sbb(uint8_t channel, decode_ade_sbb_t *ade_sbb) 01883 { 01884 int ret; 01885 reg_cnfg_sbb0_b_t reg_cnfg_sbb0_b = {0}; 01886 reg_cnfg_sbb1_b_t reg_cnfg_sbb1_b = {0}; 01887 reg_cnfg_sbb2_b_t reg_cnfg_sbb2_b = {0}; 01888 01889 if (channel == 0) { 01890 ret = read_register(CNFG_SBB0_B, (uint8_t *)&(reg_cnfg_sbb0_b)); 01891 if (ret != MAX77658_NO_ERROR) return ret; 01892 01893 *ade_sbb = (decode_ade_sbb_t)reg_cnfg_sbb0_b.bits.ade_sbb0; 01894 } 01895 else if (channel == 1) { 01896 ret = read_register(CNFG_SBB1_B, (uint8_t *)&(reg_cnfg_sbb1_b)); 01897 if (ret != MAX77658_NO_ERROR) return ret; 01898 01899 *ade_sbb = (decode_ade_sbb_t)reg_cnfg_sbb1_b.bits.ade_sbb1; 01900 } 01901 else if (channel == 2) { 01902 ret = read_register(CNFG_SBB2_B, (uint8_t *)&(reg_cnfg_sbb2_b)); 01903 if (ret != MAX77658_NO_ERROR) return ret; 01904 01905 *ade_sbb = (decode_ade_sbb_t)reg_cnfg_sbb2_b.bits.ade_sbb2; 01906 } 01907 else { 01908 return MAX77658_INVALID_DATA; 01909 } 01910 01911 return MAX77658_NO_ERROR; 01912 } 01913 01914 int MAX77658::set_en_sbb(uint8_t channel, decode_en_sbb_t en_sbb) 01915 { 01916 reg_cnfg_sbb0_b_t reg_cnfg_sbb0_b = {0}; 01917 reg_cnfg_sbb1_b_t reg_cnfg_sbb1_b = {0}; 01918 reg_cnfg_sbb2_b_t reg_cnfg_sbb2_b = {0}; 01919 01920 if (channel == 0) { 01921 SET_BIT_FIELD(CNFG_SBB0_B, reg_cnfg_sbb0_b, reg_cnfg_sbb0_b.bits.en_sbb0, en_sbb); 01922 } 01923 else if (channel == 1) { 01924 SET_BIT_FIELD(CNFG_SBB1_B, reg_cnfg_sbb1_b, reg_cnfg_sbb1_b.bits.en_sbb1, en_sbb); 01925 } 01926 else if (channel == 2) { 01927 SET_BIT_FIELD(CNFG_SBB2_B, reg_cnfg_sbb2_b, reg_cnfg_sbb2_b.bits.en_sbb2, en_sbb); 01928 } 01929 else { 01930 return MAX77658_INVALID_DATA; 01931 } 01932 01933 return MAX77658_NO_ERROR; 01934 } 01935 01936 int MAX77658::get_en_sbb(uint8_t channel, decode_en_sbb_t *en_sbb) 01937 { 01938 int ret; 01939 reg_cnfg_sbb0_b_t reg_cnfg_sbb0_b = {0}; 01940 reg_cnfg_sbb1_b_t reg_cnfg_sbb1_b = {0}; 01941 reg_cnfg_sbb2_b_t reg_cnfg_sbb2_b = {0}; 01942 01943 if (channel == 0) { 01944 ret = read_register(CNFG_SBB0_B, (uint8_t *)&(reg_cnfg_sbb0_b)); 01945 if (ret != MAX77658_NO_ERROR) return ret; 01946 01947 *en_sbb = (decode_en_sbb_t)reg_cnfg_sbb0_b.bits.en_sbb0; 01948 } 01949 else if (channel == 1) { 01950 ret = read_register(CNFG_SBB1_B, (uint8_t *)&(reg_cnfg_sbb1_b)); 01951 if (ret != MAX77658_NO_ERROR) return ret; 01952 01953 *en_sbb = (decode_en_sbb_t)reg_cnfg_sbb1_b.bits.en_sbb1; 01954 } 01955 else if (channel == 2) { 01956 ret = read_register(CNFG_SBB2_B, (uint8_t *)&(reg_cnfg_sbb2_b)); 01957 if (ret != MAX77658_NO_ERROR) return ret; 01958 01959 *en_sbb = (decode_en_sbb_t)reg_cnfg_sbb2_b.bits.en_sbb2; 01960 } 01961 else return MAX77658_INVALID_DATA; 01962 01963 return MAX77658_NO_ERROR; 01964 } 01965 01966 int MAX77658::set_tv_sbb_dvs(float voltV) 01967 { 01968 uint8_t value; 01969 reg_cnfg_dvs_sbb0_a_t reg_cnfg_dvs_sbb0_a = {0}; 01970 float voltmV = voltV * 1000; 01971 01972 if (voltmV < 500) voltmV = 500; 01973 else if (voltmV > 5500) voltmV = 5500; 01974 01975 value = (voltmV - 500) / 25; 01976 01977 SET_BIT_FIELD(CNFG_DVS_SBB0_A, reg_cnfg_dvs_sbb0_a, reg_cnfg_dvs_sbb0_a.bits.tv_sbb0_dvs, value); 01978 return MAX77658_NO_ERROR; 01979 } 01980 01981 int MAX77658::get_tv_sbb_dvs(float *voltV) 01982 { 01983 int ret; 01984 uint8_t bit_value; 01985 reg_cnfg_dvs_sbb0_a_t reg_cnfg_dvs_sbb0_a = {0}; 01986 01987 ret = read_register(CNFG_DVS_SBB0_A, (uint8_t *)&(reg_cnfg_dvs_sbb0_a)); 01988 if (ret != MAX77658_NO_ERROR) return ret; 01989 01990 bit_value = (uint8_t)reg_cnfg_dvs_sbb0_a.bits.tv_sbb0_dvs; 01991 01992 if (bit_value > 200) bit_value = 200; 01993 01994 *voltV = (bit_value * 0.025f) + 0.5f; 01995 return MAX77658_NO_ERROR; 01996 } 01997 01998 int MAX77658::set_tv_ldo_volt_a(uint8_t channel, float voltV) 01999 { 02000 int ret; 02001 uint8_t value; 02002 reg_cnfg_ldo0_a_t reg_cnfg_ldo0_a = {0}; 02003 reg_cnfg_ldo1_a_t reg_cnfg_ldo1_a = {0}; 02004 float voltmV = voltV * 1000; 02005 02006 if (channel == 0) { 02007 ret = read_register(CNFG_LDO0_A, (uint8_t *)&(reg_cnfg_ldo0_a)); 02008 if (ret != MAX77658_NO_ERROR) return ret; 02009 02010 if ((uint8_t)reg_cnfg_ldo0_a.bits.tv_ldo0_7 == 0) { //No Offset 02011 if (voltmV < 500) voltmV = 500; 02012 else if (voltmV > 3675) voltmV = 3675; 02013 02014 value = (voltmV - 500) / 25; 02015 } 02016 else { //1.325V Offset 02017 if (voltmV < 1825) voltmV = 1825; 02018 else if (voltmV > 5000) voltmV = 5000; 02019 02020 value = (voltmV - 1825) / 25; 02021 } 02022 02023 SET_BIT_FIELD(CNFG_LDO0_A, reg_cnfg_ldo0_a, reg_cnfg_ldo0_a.bits.tv_ldo0_6_0, value); 02024 } 02025 else { 02026 ret = read_register(CNFG_LDO1_A, (uint8_t *)&(reg_cnfg_ldo1_a)); 02027 if (ret != MAX77658_NO_ERROR) return ret; 02028 02029 if ((uint8_t)reg_cnfg_ldo1_a.bits.tv_ldo1_7 == 0) { //No Offset 02030 if (voltmV < 500) voltmV = 500; 02031 else if (voltmV > 3675) voltmV = 3675; 02032 02033 value = (voltmV - 500) / 25; 02034 } 02035 else { //1.325V Offset 02036 if (voltmV < 1825) voltmV = 1825; 02037 else if (voltmV > 5000) voltmV = 5000; 02038 02039 value = (voltmV - 1825) / 25; 02040 } 02041 02042 SET_BIT_FIELD(CNFG_LDO1_A, reg_cnfg_ldo1_a, reg_cnfg_ldo1_a.bits.tv_ldo1_6_0, value); 02043 } 02044 return MAX77658_NO_ERROR; 02045 } 02046 02047 int MAX77658::get_tv_ldo_volt_a(uint8_t channel, float *voltV) 02048 { 02049 int ret; 02050 uint8_t bit_value; 02051 reg_cnfg_ldo0_a_t reg_cnfg_ldo0_a = {0}; 02052 reg_cnfg_ldo1_a_t reg_cnfg_ldo1_a = {0}; 02053 02054 if (channel == 0){ 02055 ret = read_register(CNFG_LDO0_A, (uint8_t *)&(reg_cnfg_ldo0_a)); 02056 if (ret != MAX77658_NO_ERROR) return ret; 02057 02058 bit_value = (uint8_t)reg_cnfg_ldo0_a.bits.tv_ldo0_6_0; 02059 if ((uint8_t)reg_cnfg_ldo0_a.bits.tv_ldo0_7 == 0) //No Offset 02060 *voltV = (bit_value * 0.025f) + 0.5f; 02061 else //1.325V Offset 02062 *voltV = (bit_value * 0.025f) + 1.825f; 02063 } 02064 else { 02065 ret = read_register(CNFG_LDO1_A, (uint8_t *)&(reg_cnfg_ldo1_a)); 02066 if (ret != MAX77658_NO_ERROR) return ret; 02067 02068 bit_value = (uint8_t)reg_cnfg_ldo1_a.bits.tv_ldo1_6_0; 02069 if ((uint8_t)reg_cnfg_ldo1_a.bits.tv_ldo1_7 == 0) //No Offset 02070 *voltV = (bit_value * 0.025f) + 0.5f; 02071 else //1.325V Offset 02072 *voltV = (bit_value * 0.025f) + 1.825f; 02073 } 02074 02075 return MAX77658_NO_ERROR; 02076 } 02077 02078 int MAX77658::set_tv_ldo_offset_a(uint8_t channel, decode_tv_ldo_offset_a_t offset) 02079 { 02080 reg_cnfg_ldo0_a_t reg_cnfg_ldo0_a = {0}; 02081 reg_cnfg_ldo1_a_t reg_cnfg_ldo1_a = {0}; 02082 02083 if (channel == 0) { 02084 SET_BIT_FIELD(CNFG_LDO0_A, reg_cnfg_ldo0_a, reg_cnfg_ldo0_a.bits.tv_ldo0_7, offset); 02085 } 02086 else if (channel == 1) { 02087 SET_BIT_FIELD(CNFG_LDO1_A, reg_cnfg_ldo1_a, reg_cnfg_ldo1_a.bits.tv_ldo1_7, offset); 02088 } 02089 else { 02090 return MAX77658_INVALID_DATA; 02091 } 02092 02093 return MAX77658_NO_ERROR; 02094 } 02095 02096 int MAX77658::get_tv_ldo_offset_a(uint8_t channel, decode_tv_ldo_offset_a_t *offset) 02097 { 02098 int ret; 02099 reg_cnfg_ldo0_a_t reg_cnfg_ldo0_a = {0}; 02100 reg_cnfg_ldo1_a_t reg_cnfg_ldo1_a = {0}; 02101 02102 if (channel == 0) { 02103 ret = read_register(CNFG_LDO0_A, (uint8_t *)&(reg_cnfg_ldo0_a)); 02104 if (ret != MAX77658_NO_ERROR) return ret; 02105 02106 *offset = (decode_tv_ldo_offset_a_t)reg_cnfg_ldo0_a.bits.tv_ldo0_7; 02107 } 02108 else if (channel == 1) { 02109 ret = read_register(CNFG_LDO1_A, (uint8_t *)&(reg_cnfg_ldo1_a)); 02110 if (ret != MAX77658_NO_ERROR) return ret; 02111 02112 *offset = (decode_tv_ldo_offset_a_t)reg_cnfg_ldo1_a.bits.tv_ldo1_7; 02113 } 02114 else { 02115 return MAX77658_INVALID_DATA; 02116 } 02117 02118 return MAX77658_NO_ERROR; 02119 } 02120 02121 int MAX77658::set_en_ldo(uint8_t channel, decode_en_ldo_t en_ldo) 02122 { 02123 reg_cnfg_ldo0_b_t reg_cnfg_ldo0_b = {0}; 02124 reg_cnfg_ldo1_b_t reg_cnfg_ldo1_b = {0}; 02125 02126 if (channel == 0) { 02127 SET_BIT_FIELD(CNFG_LDO0_B, reg_cnfg_ldo0_b, reg_cnfg_ldo0_b.bits.en_ldo0, en_ldo); 02128 } 02129 else if (channel == 1) { 02130 SET_BIT_FIELD(CNFG_LDO1_B, reg_cnfg_ldo1_b, reg_cnfg_ldo1_b.bits.en_ldo1, en_ldo); 02131 } 02132 else { 02133 return MAX77658_INVALID_DATA; 02134 } 02135 02136 return MAX77658_NO_ERROR; 02137 } 02138 02139 int MAX77658::get_en_ldo(uint8_t channel, decode_en_ldo_t *en_ldo) 02140 { 02141 int ret; 02142 reg_cnfg_ldo0_b_t reg_cnfg_ldo0_b = {0}; 02143 reg_cnfg_ldo1_b_t reg_cnfg_ldo1_b = {0}; 02144 02145 if (channel == 0) { 02146 ret = read_register(CNFG_LDO0_B, (uint8_t *)&(reg_cnfg_ldo0_b)); 02147 if (ret != MAX77658_NO_ERROR) return ret; 02148 02149 *en_ldo = (decode_en_ldo_t)reg_cnfg_ldo0_b.bits.en_ldo0; 02150 } 02151 else if (channel == 1) { 02152 ret = read_register(CNFG_LDO1_B, (uint8_t *)&(reg_cnfg_ldo1_b)); 02153 if (ret != MAX77658_NO_ERROR) return ret; 02154 02155 *en_ldo = (decode_en_ldo_t)reg_cnfg_ldo1_b.bits.en_ldo1; 02156 } 02157 else return MAX77658_INVALID_DATA; 02158 02159 return MAX77658_NO_ERROR; 02160 } 02161 02162 int MAX77658::set_ade_ldo(uint8_t channel, decode_ade_ldo_t ade_ldo) 02163 { 02164 reg_cnfg_ldo0_b_t reg_cnfg_ldo0_b = {0}; 02165 reg_cnfg_ldo1_b_t reg_cnfg_ldo1_b = {0}; 02166 02167 if (channel == 0) { 02168 SET_BIT_FIELD(CNFG_LDO0_B, reg_cnfg_ldo0_b, reg_cnfg_ldo0_b.bits.ade_ldo0, ade_ldo); 02169 } 02170 else if (channel == 1) { 02171 SET_BIT_FIELD(CNFG_LDO1_B, reg_cnfg_ldo1_b, reg_cnfg_ldo1_b.bits.ade_ldo1, ade_ldo); 02172 } 02173 else { 02174 return MAX77658_INVALID_DATA; 02175 } 02176 02177 return MAX77658_NO_ERROR; 02178 } 02179 02180 int MAX77658::get_ade_ldo(uint8_t channel, decode_ade_ldo_t *ade_ldo) 02181 { 02182 int ret; 02183 reg_cnfg_ldo0_b_t reg_cnfg_ldo0_b = {0}; 02184 reg_cnfg_ldo1_b_t reg_cnfg_ldo1_b = {0}; 02185 02186 if (channel == 0) { 02187 ret = read_register(CNFG_LDO0_B, (uint8_t *)&(reg_cnfg_ldo0_b)); 02188 if (ret != MAX77658_NO_ERROR) return ret; 02189 02190 *ade_ldo = (decode_ade_ldo_t)reg_cnfg_ldo0_b.bits.ade_ldo0; 02191 } 02192 else if (channel == 1) { 02193 ret = read_register(CNFG_LDO1_B, (uint8_t *)&(reg_cnfg_ldo1_b)); 02194 if (ret != MAX77658_NO_ERROR) return ret; 02195 02196 *ade_ldo = (decode_ade_ldo_t)reg_cnfg_ldo1_b.bits.ade_ldo1; 02197 } 02198 else { 02199 return MAX77658_INVALID_DATA; 02200 } 02201 02202 return MAX77658_NO_ERROR; 02203 } 02204 02205 int MAX77658::set_ldo_md(uint8_t channel, decode_ldo_md_t mode) 02206 { 02207 reg_cnfg_ldo0_b_t reg_cnfg_ldo0_b = {0}; 02208 reg_cnfg_ldo1_b_t reg_cnfg_ldo1_b = {0}; 02209 02210 if (channel == 0) { 02211 SET_BIT_FIELD(CNFG_LDO0_B, reg_cnfg_ldo0_b, reg_cnfg_ldo0_b.bits.ldo0_md, mode); 02212 } 02213 else if (channel == 1) { 02214 SET_BIT_FIELD(CNFG_LDO1_B, reg_cnfg_ldo1_b, reg_cnfg_ldo1_b.bits.ldo1_md, mode); 02215 } 02216 else { 02217 return MAX77658_INVALID_DATA; 02218 } 02219 02220 return MAX77658_NO_ERROR; 02221 } 02222 02223 int MAX77658::get_ldo_md(uint8_t channel, decode_ldo_md_t *mode) 02224 { 02225 int ret; 02226 reg_cnfg_ldo0_b_t reg_cnfg_ldo0_b = {0}; 02227 reg_cnfg_ldo1_b_t reg_cnfg_ldo1_b = {0}; 02228 02229 if (channel == 0) { 02230 ret = read_register(CNFG_LDO0_B, (uint8_t *)&(reg_cnfg_ldo0_b)); 02231 if (ret != MAX77658_NO_ERROR) return ret; 02232 02233 *mode = (decode_ldo_md_t)reg_cnfg_ldo0_b.bits.ldo0_md; 02234 } 02235 else if (channel == 1) { 02236 ret = read_register(CNFG_LDO1_B, (uint8_t *)&(reg_cnfg_ldo1_b)); 02237 if (ret != MAX77658_NO_ERROR) return ret; 02238 02239 *mode = (decode_ldo_md_t)reg_cnfg_ldo1_b.bits.ldo1_md; 02240 } 02241 else { 02242 return MAX77658_INVALID_DATA; 02243 } 02244 02245 return MAX77658_NO_ERROR; 02246 } 02247 02248 int MAX77658::set_fg_status(reg_bit_status_t bit_field, uint8_t status) 02249 { 02250 int ret; 02251 reg_status_t reg_status = {0}; 02252 02253 ret = read_fg_register(Status, (uint8_t *)&(reg_status)); 02254 if (ret != MAX77658_NO_ERROR) return ret; 02255 02256 switch (bit_field) 02257 { 02258 case Status_Imn: 02259 reg_status.bits.imn = status; 02260 break; 02261 case Status_POR: 02262 reg_status.bits.por = status; 02263 break; 02264 case Status_SPR_2: 02265 reg_status.bits.spr_2 = status; 02266 break; 02267 case Status_Bst: 02268 reg_status.bits.bst = status; 02269 break; 02270 case Status_Isysmx: 02271 reg_status.bits.isysmx = status; 02272 break; 02273 case Status_SPR_5: 02274 reg_status.bits.spr_5 = status; 02275 break; 02276 case Status_ThmHot: 02277 reg_status.bits.thmhot = status; 02278 break; 02279 case Status_dSOCi: 02280 reg_status.bits.dsoci = status; 02281 break; 02282 case Status_Vmn: 02283 reg_status.bits.vmn = status; 02284 break; 02285 case Status_Tmn: 02286 reg_status.bits.tmn = status; 02287 break; 02288 case Status_Smn: 02289 reg_status.bits.smn = status; 02290 break; 02291 case Status_Bi: 02292 reg_status.bits.bi = status; 02293 break; 02294 case Status_Vmx: 02295 reg_status.bits.vmx = status; 02296 break; 02297 case Status_Tmx: 02298 reg_status.bits.tmx = status; 02299 break; 02300 case Status_Smx: 02301 reg_status.bits.smx = status; 02302 break; 02303 case Status_Br: 02304 reg_status.bits.br = status; 02305 break; 02306 default: 02307 return MAX77658_INVALID_DATA; 02308 break; 02309 } 02310 02311 return write_fg_register(Status, (uint8_t *)&(reg_status)); 02312 } 02313 02314 int MAX77658::get_fg_status(reg_bit_status_t bit_field, uint8_t *status) 02315 { 02316 int ret; 02317 reg_status_t reg_status = {0}; 02318 02319 ret = read_fg_register(Status, (uint8_t *)&(reg_status)); 02320 if (ret != MAX77658_NO_ERROR) return ret; 02321 02322 switch (bit_field) 02323 { 02324 case Status_Imn: 02325 *status = (uint8_t)reg_status.bits.imn; 02326 break; 02327 case Status_POR: 02328 *status = (uint8_t)reg_status.bits.por; 02329 break; 02330 case Status_SPR_2: 02331 *status = (uint8_t)reg_status.bits.spr_2; 02332 break; 02333 case Status_Bst: 02334 *status = (uint8_t)reg_status.bits.bst; 02335 break; 02336 case Status_Isysmx: 02337 *status = (uint8_t)reg_status.bits.isysmx; 02338 break; 02339 case Status_SPR_5: 02340 *status = (uint8_t)reg_status.bits.spr_5; 02341 break; 02342 case Status_ThmHot: 02343 *status = (uint8_t)reg_status.bits.thmhot; 02344 break; 02345 case Status_dSOCi: 02346 *status = (uint8_t)reg_status.bits.dsoci; 02347 break; 02348 case Status_Vmn: 02349 *status = (uint8_t)reg_status.bits.vmn; 02350 break; 02351 case Status_Tmn: 02352 *status = (uint8_t)reg_status.bits.tmn; 02353 break; 02354 case Status_Smn: 02355 *status = (uint8_t)reg_status.bits.smn; 02356 break; 02357 case Status_Bi: 02358 *status = (uint8_t)reg_status.bits.bi; 02359 break; 02360 case Status_Vmx: 02361 *status = (uint8_t)reg_status.bits.vmx; 02362 break; 02363 case Status_Tmx: 02364 *status = (uint8_t)reg_status.bits.tmx; 02365 break; 02366 case Status_Smx: 02367 *status = (uint8_t)reg_status.bits.smx; 02368 break; 02369 case Status_Br: 02370 *status = (uint8_t)reg_status.bits.br; 02371 break; 02372 default: 02373 return MAX77658_INVALID_DATA; 02374 break; 02375 } 02376 02377 return MAX77658_NO_ERROR; 02378 } 02379 02380 int MAX77658::set_fg_valrt_th(reg_bit_valrt_th_t bit_field, float voltV) 02381 { 02382 int ret; 02383 uint8_t voltRaw; 02384 reg_valrt_th_t reg_valrt_th = {0}; 02385 float voltmV = voltV * 1000; 02386 02387 ret = read_fg_register(VAlrtTh, (uint8_t *)&(reg_valrt_th)); 02388 if (ret != MAX77658_NO_ERROR) return ret; 02389 02390 //20mV resolution 02391 voltRaw = (int)(voltmV / 20) & TO_UINT8; 02392 02393 switch (bit_field) 02394 { 02395 case VAlrtTh_MinVoltageAlrt: 02396 reg_valrt_th.bits.min_voltage_alrt = voltRaw; 02397 break; 02398 case VAlrtTh_MaxVoltageAlrt: 02399 reg_valrt_th.bits.max_voltage_alrt = voltRaw; 02400 break; 02401 default: 02402 return MAX77658_INVALID_DATA; 02403 break; 02404 } 02405 02406 return write_fg_register(VAlrtTh, (uint8_t *)&(reg_valrt_th)); 02407 } 02408 02409 int MAX77658::get_fg_valrt_th(reg_bit_valrt_th_t bit_field, float *voltV) 02410 { 02411 int ret; 02412 int8_t voltSigned; 02413 reg_valrt_th_t reg_valrt_th = {0}; 02414 02415 ret = read_fg_register(VAlrtTh, (uint8_t *)&(reg_valrt_th)); 02416 if (ret != MAX77658_NO_ERROR) return ret; 02417 02418 switch (bit_field) 02419 { 02420 case VAlrtTh_MinVoltageAlrt: 02421 voltSigned = (int8_t)reg_valrt_th.bits.min_voltage_alrt; 02422 break; 02423 case VAlrtTh_MaxVoltageAlrt: 02424 voltSigned = (int8_t)reg_valrt_th.bits.max_voltage_alrt; 02425 break; 02426 default: 02427 return MAX77658_INVALID_DATA; 02428 break; 02429 } 02430 02431 //20mV resolution 02432 *voltV = (float)((voltSigned * 20.0f) / 1000.0f); 02433 02434 return MAX77658_NO_ERROR; 02435 } 02436 02437 int MAX77658::set_fg_talrt_th(reg_bit_talrt_th_t bit_field, int tempDegC) 02438 { 02439 int ret; 02440 uint8_t tempRaw; 02441 reg_talrt_th_t reg_talrt_th = {0}; 02442 02443 ret = read_fg_register(TAlrtTh, (uint8_t *)&(reg_talrt_th)); 02444 if (ret != MAX77658_NO_ERROR) return ret; 02445 02446 //1°C resolution 02447 tempRaw = tempDegC & TO_UINT8; 02448 02449 switch (bit_field) 02450 { 02451 case TAlrtTh_MinTempAlrt: 02452 if(tempRaw < 128) tempRaw = 128; 02453 reg_talrt_th.bits.min_temp_alrt = tempRaw; 02454 break; 02455 case TAlrtTh_MaxTempAlrt: 02456 if(tempRaw > 127) tempRaw = 127; 02457 reg_talrt_th.bits.max_temp_alrt = tempRaw; 02458 break; 02459 default: 02460 return MAX77658_INVALID_DATA; 02461 break; 02462 } 02463 02464 return write_fg_register(TAlrtTh, (uint8_t *)&(reg_talrt_th)); 02465 } 02466 02467 int MAX77658::get_fg_talrt_th(reg_bit_talrt_th_t bit_field, int *tempDegC) 02468 { 02469 int ret, tempSigned; 02470 reg_talrt_th_t reg_talrt_th = {0}; 02471 02472 ret = read_fg_register(TAlrtTh, (uint8_t *)&(reg_talrt_th)); 02473 if (ret != MAX77658_NO_ERROR) return ret; 02474 02475 switch (bit_field) 02476 { 02477 case TAlrtTh_MinTempAlrt: 02478 tempSigned = (int)reg_talrt_th.bits.min_temp_alrt; 02479 if(tempSigned < -128) tempSigned = -128; 02480 break; 02481 case TAlrtTh_MaxTempAlrt: 02482 tempSigned = (int)reg_talrt_th.bits.max_temp_alrt; 02483 if(tempSigned > 127) tempSigned = 127; 02484 break; 02485 default: 02486 return MAX77658_INVALID_DATA; 02487 break; 02488 } 02489 02490 //1°C resolution 02491 *tempDegC = (int)tempSigned & 0xFF; 02492 02493 return MAX77658_NO_ERROR; 02494 } 02495 02496 int MAX77658::set_fg_salrt_th(reg_bit_salrt_th_t bit_field, uint8_t soc) 02497 { 02498 int ret; 02499 uint8_t capRaw; 02500 reg_salrt_th_t reg_salrt_th = {0}; 02501 02502 ret = read_fg_register(SAlrtTh, (uint8_t *)&(reg_salrt_th)); 02503 if (ret != MAX77658_NO_ERROR) return ret; 02504 02505 //%1 resolution 02506 capRaw = (uint8_t)(soc); 02507 02508 switch (bit_field) 02509 { 02510 case SAlrtTh_MinSocAlrt: 02511 reg_salrt_th.bits.min_soc_alrt = capRaw; 02512 break; 02513 case SAlrtTh_MaxSocAlrt: 02514 reg_salrt_th.bits.max_soc_alrt = capRaw; 02515 break; 02516 default: 02517 return MAX77658_INVALID_DATA; 02518 break; 02519 } 02520 02521 return write_fg_register(SAlrtTh, (uint8_t *)&(reg_salrt_th)); 02522 } 02523 02524 int MAX77658::get_fg_salrt_th(reg_bit_salrt_th_t bit_field, uint8_t *soc) 02525 { 02526 int ret; 02527 uint8_t capRaw; 02528 reg_salrt_th_t reg_salrt_th = {0}; 02529 02530 ret = read_fg_register(SAlrtTh, (uint8_t *)&(reg_salrt_th)); 02531 if (ret != MAX77658_NO_ERROR) return ret; 02532 02533 switch (bit_field) 02534 { 02535 case SAlrtTh_MinSocAlrt: 02536 capRaw = (uint8_t)reg_salrt_th.bits.min_soc_alrt; 02537 break; 02538 case SAlrtTh_MaxSocAlrt: 02539 capRaw = (uint8_t)reg_salrt_th.bits.max_soc_alrt; 02540 break; 02541 default: 02542 return MAX77658_INVALID_DATA; 02543 break; 02544 } 02545 02546 //%1 resolution 02547 *soc = (uint8_t)(capRaw); 02548 02549 return MAX77658_NO_ERROR; 02550 } 02551 02552 int MAX77658::set_fg_full_soc_thr(float soc_thr) 02553 { 02554 int capRaw; 02555 reg_full_soc_thr_t reg_full_soc_thr = {0}; 02556 02557 //LSB unit is 1/256%. 02558 capRaw = (int)round(soc_thr * 256); 02559 02560 SET_FG_BIT_FIELD(FullSocThr, reg_full_soc_thr, reg_full_soc_thr.bits.full_soc_thr, capRaw); 02561 return MAX77658_NO_ERROR; 02562 } 02563 02564 int MAX77658::get_fg_full_soc_thr(float *soc_thr) 02565 { 02566 int ret, capRaw; 02567 reg_full_soc_thr_t reg_full_soc_thr = {0}; 02568 02569 ret = read_fg_register(FullSocThr, (uint8_t *)&(reg_full_soc_thr)); 02570 if (ret != MAX77658_NO_ERROR) return ret; 02571 02572 //LSB unit is 1/256%. 02573 capRaw = (int)reg_full_soc_thr.bits.full_soc_thr; 02574 *soc_thr = (float)(capRaw / 256.0f); 02575 02576 return MAX77658_NO_ERROR; 02577 } 02578 02579 int MAX77658::set_fg_design_cap(float capacitymAh) 02580 { 02581 int capRaw; 02582 reg_design_cap_t reg_design_cap = {0}; 02583 02584 //Min is 0.0mAh and Max is 6553.5mAh. 02585 if (capacitymAh < 0) capacitymAh = 0; 02586 else if (capacitymAh > 6553.5f) capacitymAh = 6553.5; 02587 02588 //LSB unit is 0.1mAh. 02589 capRaw = (int)(capacitymAh * 10); 02590 02591 SET_FG_BIT_FIELD(DesignCap, reg_design_cap, reg_design_cap.bits.design_cap, capRaw); 02592 return MAX77658_NO_ERROR; 02593 } 02594 02595 int MAX77658::get_fg_design_cap(float *capacitymAh) 02596 { 02597 int ret, capRaw; 02598 reg_design_cap_t reg_design_cap = {0}; 02599 02600 ret = read_fg_register(DesignCap, (uint8_t *)&(reg_design_cap)); 02601 if (ret != MAX77658_NO_ERROR) return ret; 02602 02603 //LSB unit is 0.1mAh. Min is 0.0mAh and Max is 6553.5mAh. 02604 capRaw = (int)reg_design_cap.bits.design_cap; 02605 *capacitymAh = (float)(capRaw * 0.1f); 02606 02607 return MAX77658_NO_ERROR; 02608 } 02609 02610 int MAX77658::set_fg_config(reg_bit_config_t bit_field, uint8_t config) 02611 { 02612 int ret; 02613 reg_config_t reg_config = {0}; 02614 02615 ret = read_fg_register(Config, (uint8_t *)&(reg_config)); 02616 if (ret != MAX77658_NO_ERROR) return ret; 02617 02618 switch (bit_field) 02619 { 02620 case Config_Ber: 02621 reg_config.bits.ber = config; 02622 break; 02623 case Config_Bei: 02624 reg_config.bits.bei = config; 02625 break; 02626 case Config_Aen: 02627 reg_config.bits.aen = config; 02628 break; 02629 case Config_FTHRM: 02630 reg_config.bits.fthrm = config; 02631 break; 02632 case Config_ETHRM: 02633 reg_config.bits.ethrm = config; 02634 break; 02635 case Config_SPR_5: 02636 reg_config.bits.spr_5 = config; 02637 break; 02638 case Config_I2CSH: 02639 reg_config.bits.i2csh = config; 02640 break; 02641 case Config_SHDN: 02642 reg_config.bits.shdn = config; 02643 break; 02644 case Config_Tex: 02645 reg_config.bits.tex = config; 02646 break; 02647 case Config_Ten: 02648 reg_config.bits.ten = config; 02649 break; 02650 case Config_AINSH: 02651 reg_config.bits.ainsh = config; 02652 break; 02653 case Config_SPR_11: 02654 reg_config.bits.spr_11 = config; 02655 break; 02656 case Config_Vs: 02657 reg_config.bits.vs = config; 02658 break; 02659 case Config_Ts: 02660 reg_config.bits.ts = config; 02661 break; 02662 case Config_Ss: 02663 reg_config.bits.ss = config; 02664 break; 02665 case Config_SPR_15: 02666 reg_config.bits.spr_15 = config; 02667 break; 02668 default: 02669 return MAX77658_INVALID_DATA; 02670 break; 02671 } 02672 02673 return write_fg_register(Config, (uint8_t *)&(reg_config)); 02674 } 02675 02676 int MAX77658::get_fg_config(reg_bit_config_t bit_field, uint8_t *config) 02677 { 02678 int ret; 02679 reg_config_t reg_config = {0}; 02680 02681 ret = read_fg_register(Config, (uint8_t *)&(reg_config)); 02682 if (ret != MAX77658_NO_ERROR) return ret; 02683 02684 switch (bit_field) 02685 { 02686 case Config_Ber: 02687 *config = (uint8_t)reg_config.bits.ber; 02688 break; 02689 case Config_Bei: 02690 *config = (uint8_t)reg_config.bits.bei; 02691 break; 02692 case Config_Aen: 02693 *config = (uint8_t)reg_config.bits.aen; 02694 break; 02695 case Config_FTHRM: 02696 *config = (uint8_t)reg_config.bits.fthrm; 02697 break; 02698 case Config_ETHRM: 02699 *config = (uint8_t)reg_config.bits.ethrm; 02700 break; 02701 case Config_SPR_5: 02702 *config = (uint8_t)reg_config.bits.spr_5; 02703 break; 02704 case Config_I2CSH: 02705 *config = (uint8_t)reg_config.bits.i2csh; 02706 break; 02707 case Config_SHDN: 02708 *config = (uint8_t)reg_config.bits.shdn; 02709 break; 02710 case Config_Tex: 02711 *config = (uint8_t)reg_config.bits.tex; 02712 break; 02713 case Config_Ten: 02714 *config = (uint8_t)reg_config.bits.ten; 02715 break; 02716 case Config_AINSH: 02717 *config = (uint8_t)reg_config.bits.ainsh; 02718 break; 02719 case Config_SPR_11: 02720 *config = (uint8_t)reg_config.bits.spr_11; 02721 break; 02722 case Config_Vs: 02723 *config = (uint8_t)reg_config.bits.vs; 02724 break; 02725 case Config_Ts: 02726 *config = (uint8_t)reg_config.bits.ts; 02727 break; 02728 case Config_Ss: 02729 *config = (uint8_t)reg_config.bits.ss; 02730 break; 02731 case Config_SPR_15: 02732 *config = (uint8_t)reg_config.bits.spr_15; 02733 break; 02734 default: 02735 return MAX77658_INVALID_DATA; 02736 break; 02737 } 02738 02739 return MAX77658_NO_ERROR; 02740 } 02741 02742 int MAX77658::set_fg_ichg_term(float currentA) 02743 { 02744 uint16_t currentRaw; 02745 reg_ichg_term_t reg_ichg_term = {0}; 02746 02747 //Register scale range of ± 5.12 A 02748 if (currentA < -5.12f) currentA = -5.12f; 02749 else if (currentA > 5.12f) currentA = 5.12f; 02750 02751 //LSB value of 156.25μA 02752 currentRaw = (int)round(currentA * 1000000 / 156.25f) & TO_UINT16; 02753 02754 SET_FG_BIT_FIELD(IChgTerm, reg_ichg_term, reg_ichg_term.bits.ichg_term, currentRaw); 02755 return MAX77658_NO_ERROR; 02756 } 02757 02758 int MAX77658::get_fg_ichg_term(float *currentA) 02759 { 02760 int ret; 02761 int16_t currentSigned; 02762 reg_ichg_term_t reg_ichg_term = {0}; 02763 02764 ret = read_fg_register(IChgTerm, (uint8_t *)&(reg_ichg_term)); 02765 if (ret != MAX77658_NO_ERROR) return ret; 02766 02767 //LSB value of 156.25μA 02768 currentSigned = (int16_t)reg_ichg_term.bits.ichg_term; 02769 *currentA = (float)(((int)currentSigned) * 156.25f / 1000000); 02770 02771 //Register scale range of ± 5.12 A 02772 if (*currentA < -5.12f) *currentA = -5.12f; 02773 else if (*currentA > 5.12f) *currentA = 5.12f; 02774 02775 return MAX77658_NO_ERROR; 02776 } 02777 02778 int MAX77658::get_fg_dev_name(uint16_t *value) 02779 { 02780 int ret; 02781 reg_dev_name_t reg_dev_name = {0}; 02782 02783 ret = read_fg_register(DevName, (uint8_t *)&(reg_dev_name)); 02784 if (ret != MAX77658_NO_ERROR) return ret; 02785 02786 *value = (uint16_t)(reg_dev_name.bits.dev_name); 02787 02788 return MAX77658_NO_ERROR; 02789 } 02790 02791 int MAX77658::set_fg_nempty(uint8_t nempty) 02792 { 02793 reg_filter_cfg_t reg_filter_cfg = {0}; 02794 02795 SET_FG_BIT_FIELD(FilterCfg, reg_filter_cfg, reg_filter_cfg.bits.nempty, nempty); 02796 return MAX77658_NO_ERROR; 02797 } 02798 02799 int MAX77658::get_fg_nempty(uint8_t *nempty) 02800 { 02801 int ret; 02802 reg_filter_cfg_t reg_filter_cfg = {0}; 02803 02804 ret = read_fg_register(FilterCfg, (uint8_t *)&(reg_filter_cfg)); 02805 if (ret != MAX77658_NO_ERROR) return ret; 02806 02807 *nempty = (uint8_t)reg_filter_cfg.bits.nempty; 02808 02809 return MAX77658_NO_ERROR; 02810 } 02811 02812 int MAX77658::set_fg_nmix(float second) 02813 { 02814 int nmixRaw; 02815 reg_filter_cfg_t reg_filter_cfg = {0}; 02816 02817 //Mixing Period = 175.8ms × 2^(5+NMIX) 02818 nmixRaw = (int)round((log2(second * 1000.0f / 175.8f)) - 5.0f); 02819 02820 SET_FG_BIT_FIELD(FilterCfg, reg_filter_cfg, reg_filter_cfg.bits.nmix, nmixRaw); 02821 return MAX77658_NO_ERROR; 02822 } 02823 02824 int MAX77658::get_fg_nmix(float *second) 02825 { 02826 int ret, nmixRaw; 02827 reg_filter_cfg_t reg_filter_cfg = {0}; 02828 02829 ret = read_fg_register(FilterCfg, (uint8_t *)&(reg_filter_cfg)); 02830 if (ret != MAX77658_NO_ERROR) return ret; 02831 02832 //Mixing Period = 175.8ms × 2^(5+NMIX) 02833 nmixRaw = (int)reg_filter_cfg.bits.nmix; 02834 *second = (float)(175.8f * pow(2, (5 + nmixRaw)) / 1000.0f); 02835 02836 return MAX77658_NO_ERROR; 02837 } 02838 02839 int MAX77658::set_fg_navgcell(float second) 02840 { 02841 int navgcellRaw; 02842 reg_filter_cfg_t reg_filter_cfg = {0}; 02843 02844 //AverageVCELL time constant = 175.8ms × 2^(6+NAVGVCELL) 02845 navgcellRaw = (int)round((log2(second * 1000.0f / 175.8f)) - 6.0f); 02846 02847 SET_FG_BIT_FIELD(FilterCfg, reg_filter_cfg, reg_filter_cfg.bits.navgcell, navgcellRaw); 02848 return MAX77658_NO_ERROR; 02849 } 02850 02851 int MAX77658::get_fg_navgcell(float *second) 02852 { 02853 int ret, navgcellRaw; 02854 reg_filter_cfg_t reg_filter_cfg = {0}; 02855 02856 ret = read_fg_register(FilterCfg, (uint8_t *)&(reg_filter_cfg)); 02857 if (ret != MAX77658_NO_ERROR) return ret; 02858 02859 //AverageVCELL time constant = 175.8ms × 2^(6+NAVGVCELL) 02860 navgcellRaw = (int)reg_filter_cfg.bits.navgcell; 02861 *second = (float)(175.8f * pow(2, (6 + navgcellRaw)) / 1000.0f); 02862 02863 return MAX77658_NO_ERROR; 02864 } 02865 02866 int MAX77658::set_fg_ncurr(float second) 02867 { 02868 int ncurrRaw; 02869 reg_filter_cfg_t reg_filter_cfg = {0}; 02870 02871 //AverageVCELL time constant = 175.8ms × 2^(2+NCURR) 02872 ncurrRaw = (int)round((log2(second * 1000.0f / 175.8f)) - 2.0f); 02873 02874 SET_FG_BIT_FIELD(FilterCfg, reg_filter_cfg, reg_filter_cfg.bits.navgcell, ncurrRaw); 02875 return MAX77658_NO_ERROR; 02876 } 02877 02878 int MAX77658::get_fg_ncurr(float *second) 02879 { 02880 int ret, ncurrRaw; 02881 reg_filter_cfg_t reg_filter_cfg = {0}; 02882 02883 ret = read_fg_register(FilterCfg, (uint8_t *)&(reg_filter_cfg)); 02884 if (ret != MAX77658_NO_ERROR) return ret; 02885 02886 //AverageVCELL time constant = 175.8ms × 2^(2+NCURR) 02887 ncurrRaw = (int)reg_filter_cfg.bits.ncurr; 02888 *second = (float)(175.8f * pow(2, (2 + ncurrRaw)) / 1000.0f); 02889 02890 return MAX77658_NO_ERROR; 02891 } 02892 02893 int MAX77658::set_fg_iavg_empty(float currentA) 02894 { 02895 uint16_t currentRaw; 02896 reg_iavg_empty_t reg_iavg_empty = {0}; 02897 02898 //Register scale range of ± 5.12 A 02899 if (currentA < -5.12f) currentA = -5.12f; 02900 else if (currentA > 5.12f) currentA = 5.12f; 02901 02902 //LSB value of 156.25μA 02903 currentRaw = (int)round(currentA * 1000000 / 156.25f) & TO_UINT16; 02904 02905 SET_FG_BIT_FIELD(IAvgEmpty, reg_iavg_empty, reg_iavg_empty.bits.rsvd, currentRaw); 02906 return MAX77658_NO_ERROR; 02907 } 02908 02909 int MAX77658::get_fg_iavg_empty(float *currentA) 02910 { 02911 int ret; 02912 int16_t currentSigned; 02913 reg_iavg_empty_t reg_iavg_empty = {0}; 02914 02915 ret = read_fg_register(IAvgEmpty, (uint8_t *)&(reg_iavg_empty)); 02916 if (ret != MAX77658_NO_ERROR) return ret; 02917 02918 //LSB value of 156.25μA 02919 currentSigned = (int16_t)reg_iavg_empty.bits.rsvd; 02920 *currentA = (float)(((int)currentSigned) * 156.25f / 1000000); 02921 02922 //Register scale range of ± 5.12 A 02923 if (*currentA < -5.12f) *currentA = -5.12f; 02924 else if (*currentA > 5.12f) *currentA = 5.12f; 02925 02926 return MAX77658_NO_ERROR; 02927 } 02928 02929 int MAX77658::set_fg_v_empty(float voltV) 02930 { 02931 int voltRaw; 02932 reg_v_empty_t reg_v_empty = {0}; 02933 float voltmV = voltV * 1000; 02934 02935 //A 10mV resolution gives a 0 to 5.11V range. 02936 if (voltmV < 0) voltmV = 0; 02937 else if (voltmV > 5110) voltmV = 5110; 02938 02939 voltRaw = (int)(voltmV / 10); 02940 02941 SET_FG_BIT_FIELD(VEmpty, reg_v_empty, reg_v_empty.bits.v_empty, voltRaw); 02942 return MAX77658_NO_ERROR; 02943 } 02944 02945 int MAX77658::get_fg_v_empty(float *voltV) 02946 { 02947 int ret, voltRaw; 02948 reg_v_empty_t reg_v_empty = {0}; 02949 02950 ret = read_fg_register(VEmpty, (uint8_t *)&(reg_v_empty)); 02951 if (ret != MAX77658_NO_ERROR) return ret; 02952 02953 //A 10mV resolution gives a 0 to 5.11V range. 02954 voltRaw = (int)reg_v_empty.bits.v_empty; 02955 *voltV = ((float)voltRaw * 10.0f) / 1000.0f; 02956 02957 if (*voltV < 0) *voltV = 0; 02958 else if (*voltV > 5.11f) *voltV = 5.11f; 02959 02960 return MAX77658_NO_ERROR; 02961 } 02962 02963 int MAX77658::set_fg_v_recover(float voltV) 02964 { 02965 int voltRaw; 02966 reg_v_empty_t reg_v_empty = {0}; 02967 float voltmV = voltV * 1000; 02968 02969 //A 40mV resolution gives a 0 to 5.08V range. 02970 if (voltmV < 0) voltmV = 0; 02971 else if (voltmV > 5080) voltmV = 5080; 02972 02973 voltRaw = (int)(voltmV / 40); 02974 02975 SET_FG_BIT_FIELD(VEmpty, reg_v_empty, reg_v_empty.bits.v_recover, voltRaw); 02976 return MAX77658_NO_ERROR; 02977 } 02978 02979 int MAX77658::get_fg_v_recover(float *voltV) 02980 { 02981 int ret, voltRaw; 02982 reg_v_empty_t reg_v_empty = {0}; 02983 02984 ret = read_fg_register(VEmpty, (uint8_t *)&(reg_v_empty)); 02985 if (ret != MAX77658_NO_ERROR) return ret; 02986 02987 //A 40mV resolution gives a 0 to 5.08V range. 02988 voltRaw = (int)reg_v_empty.bits.v_recover; 02989 *voltV = ((float)voltRaw * 40.0f) / 1000.0f; 02990 02991 02992 if (*voltV < 0) *voltV = 0; 02993 else if (*voltV > 5.08f) *voltV = 5.08f; 02994 02995 return MAX77658_NO_ERROR; 02996 } 02997 02998 int MAX77658::set_fg_config2(reg_bit_config2_t bit_field, uint8_t config) 02999 { 03000 int ret; 03001 reg_config2_t reg_config2 = {0}; 03002 03003 ret = read_fg_register(Config2, (uint8_t *)&(reg_config2)); 03004 if (ret != MAX77658_NO_ERROR) return ret; 03005 03006 switch (bit_field) 03007 { 03008 case Config2_ISysNCurr: 03009 reg_config2.bits.isys_ncurr = config; 03010 break; 03011 case Config2_OCVQen: 03012 reg_config2.bits.qcvqen = config; 03013 break; 03014 case Config2_LdMdl: 03015 reg_config2.bits.ldmdl = config; 03016 break; 03017 case Config2_TAlrtEn: 03018 reg_config2.bits.tairt_en = config; 03019 break; 03020 case Config2_dSOCen: 03021 reg_config2.bits.dsocen = config; 03022 break; 03023 case Config2_ThmHotAlrtEn: 03024 reg_config2.bits.thm_hotairt_en = config; 03025 break; 03026 case Config2_ThmHotEn: 03027 reg_config2.bits.thmhot_en = config; 03028 break; 03029 case Config2_FCThmHot: 03030 reg_config2.bits.fc_thmhot = config; 03031 break; 03032 case Config2_SPR: 03033 reg_config2.bits.spr = config; 03034 break; 03035 default: 03036 return MAX77658_INVALID_DATA; 03037 break; 03038 } 03039 03040 return write_fg_register(Config2, (uint8_t *)&(reg_config2)); 03041 } 03042 03043 int MAX77658::get_fg_config2(reg_bit_config2_t bit_field, uint8_t *config) 03044 { 03045 int ret; 03046 reg_config2_t reg_config2 = {0}; 03047 03048 ret = read_fg_register(Config2, (uint8_t *)&(reg_config2)); 03049 if (ret != MAX77658_NO_ERROR) return ret; 03050 03051 switch (bit_field) 03052 { 03053 case Config2_ISysNCurr: 03054 *config = (uint8_t)reg_config2.bits.isys_ncurr; 03055 break; 03056 case Config2_OCVQen: 03057 *config = (uint8_t)reg_config2.bits.qcvqen; 03058 break; 03059 case Config2_LdMdl: 03060 *config = (uint8_t)reg_config2.bits.ldmdl; 03061 break; 03062 case Config2_TAlrtEn: 03063 *config = (uint8_t)reg_config2.bits.tairt_en; 03064 break; 03065 case Config2_dSOCen: 03066 *config = (uint8_t)reg_config2.bits.dsocen; 03067 break; 03068 case Config2_ThmHotAlrtEn: 03069 *config = (uint8_t)reg_config2.bits.thm_hotairt_en; 03070 break; 03071 case Config2_ThmHotEn: 03072 *config = (uint8_t)reg_config2.bits.thmhot_en; 03073 break; 03074 case Config2_FCThmHot: 03075 *config = (uint8_t)reg_config2.bits.fc_thmhot; 03076 break; 03077 case Config2_SPR: 03078 *config = (uint8_t)reg_config2.bits.spr; 03079 break; 03080 default: 03081 return MAX77658_INVALID_DATA; 03082 break; 03083 } 03084 03085 return MAX77658_NO_ERROR; 03086 } 03087 03088 int MAX77658::set_fg_isys_ncurr(float second) 03089 { 03090 int secondRaw; 03091 reg_config2_t reg_config2 = {0}; 03092 03093 //AvgISys time constant = 45s x 2^(ISysNCurr-7) 03094 secondRaw = (int)round(log2(second * 1000 / 45000) + 7); 03095 03096 SET_FG_BIT_FIELD(Config2, reg_config2, reg_config2.bits.isys_ncurr, secondRaw); 03097 return MAX77658_NO_ERROR; 03098 } 03099 03100 int MAX77658::get_fg_isys_ncurr(float *second) 03101 { 03102 int ret, secondRaw; 03103 reg_config2_t reg_config2 = {0}; 03104 03105 ret = read_fg_register(Config2, (uint8_t *)&(reg_config2)); 03106 if (ret != MAX77658_NO_ERROR) return ret; 03107 03108 //AvgISys time constant = 45s x 2^(ISysNCurr-7) 03109 secondRaw = (int)reg_config2.bits.isys_ncurr; 03110 *second = (float)(45.0f * pow(2, secondRaw - 7)); 03111 03112 return MAX77658_NO_ERROR; 03113 } 03114 03115 int MAX77658::set_fg_temp(float tempDegC) 03116 { 03117 uint16_t tempRaw; 03118 reg_temp_t reg_temp = {0}; 03119 03120 //Min value is -128.0°C and Max value is 127.996°C. 03121 if (tempDegC < -128) tempDegC = -128; 03122 else if (tempDegC > 127.996f) tempDegC = 127.996f; 03123 03124 //LSB is 1/256°C = 0.0039˚C. 03125 tempRaw = (int)round(tempDegC * 256) & TO_UINT16; 03126 03127 SET_FG_BIT_FIELD(Temp, reg_temp, reg_temp.bits.temp, tempRaw); 03128 return MAX77658_NO_ERROR; 03129 } 03130 03131 int MAX77658::get_fg_temp(float *tempDegC) 03132 { 03133 int ret; 03134 int16_t tempSigned; 03135 reg_temp_t reg_temp = {0}; 03136 03137 ret = read_fg_register(Temp, (uint8_t *)&(reg_temp)); 03138 if (ret != MAX77658_NO_ERROR) return ret; 03139 03140 //LSB is 1/256°C = 0.0039˚C. 03141 tempSigned = (int16_t)reg_temp.bits.temp; 03142 *tempDegC = (float)(tempSigned / 256.0f); 03143 03144 //Min value is -128.0°C and Max value is 127.996°C. 03145 if (*tempDegC < -128) *tempDegC = -128; 03146 else if (*tempDegC > 127.996f) *tempDegC = 127.996f; 03147 03148 return MAX77658_NO_ERROR; 03149 } 03150 03151 int MAX77658::set_fg_vcell(float voltV) 03152 { 03153 uint16_t voltRaw; 03154 reg_vcell_t reg_vcell = {0}; 03155 float voltmV = voltV * 1000; 03156 03157 //Register scale range between 0V and 5.11992V. //LSB value of 1.25mV/16 03158 if (voltmV < 0) voltmV = 0; 03159 else if (voltmV > 5119.92f) voltmV = 5119.92f; 03160 03161 voltRaw = (int)round(voltmV / 1.25 * 16) & TO_UINT16; 03162 03163 SET_FG_BIT_FIELD(Vcell, reg_vcell, reg_vcell.bits.vcell, voltRaw); 03164 return MAX77658_NO_ERROR; 03165 } 03166 03167 int MAX77658::get_fg_vcell(float *voltV) 03168 { 03169 int ret, voltRaw; 03170 reg_vcell_t reg_vcell = {0}; 03171 03172 ret = read_fg_register(Vcell, (uint8_t *)&(reg_vcell)); 03173 if (ret != MAX77658_NO_ERROR) return ret; 03174 03175 //LSB value of 1.25mV/16 03176 voltRaw = (int)reg_vcell.bits.vcell; 03177 *voltV = (float)(voltRaw * 1.25f / 16 / 1000); 03178 03179 if (*voltV < 0) *voltV = 0; 03180 else if (*voltV > 5.11992f) *voltV = 5.11992f; 03181 03182 return MAX77658_NO_ERROR; 03183 } 03184 03185 int MAX77658::set_fg_current(float currentA) 03186 { 03187 uint16_t currentRaw; 03188 reg_current_t reg_current = {0}; 03189 float currentmA = currentA * 1000; 03190 03191 if (currentmA < -1024) currentmA = -1024; 03192 else if (currentmA > 1024) currentmA = 1024; 03193 03194 //The current register has a LSB value of 31.25uA, a register scale of 1.024A 03195 currentRaw = (int)round(currentmA * 1000 / 31.25f) & TO_UINT16; 03196 03197 SET_FG_BIT_FIELD(Current, reg_current, reg_current.bits.current, currentRaw); 03198 return MAX77658_NO_ERROR; 03199 } 03200 03201 int MAX77658::get_fg_current(float *currentA) 03202 { 03203 int ret; 03204 int16_t currentSigned; 03205 reg_current_t reg_current = {0}; 03206 03207 ret = read_fg_register(Current, (uint8_t *)&(reg_current)); 03208 if (ret != MAX77658_NO_ERROR) return ret; 03209 03210 //The current register has a LSB value of 31.25uA, a register scale of 1.024A 03211 currentSigned = (int16_t)(reg_current.bits.current); 03212 *currentA = (float)(currentSigned * 31.25f / 1000000); 03213 03214 if (*currentA < -1.024f) *currentA = -1.024f; 03215 else if (*currentA > 1.024f) *currentA = 1.024f; 03216 03217 return MAX77658_NO_ERROR; 03218 } 03219 03220 int MAX77658::set_fg_avg_current(float currentA) 03221 { 03222 uint16_t currentRaw; 03223 reg_avg_current_t reg_avg_current = {0}; 03224 float currentmA = currentA * 1000; 03225 03226 if (currentmA < -1024) currentmA = -1024; 03227 else if (currentmA > 1024) currentmA = 1024; 03228 03229 //The current register has a LSB value of 31.25uA, a register scale of 1.024A 03230 currentRaw = (int)round(currentmA * 1000 / 31.25f) & TO_UINT16; 03231 03232 SET_FG_BIT_FIELD(AvgCurrent, reg_avg_current, reg_avg_current.bits.avg_current, currentRaw); 03233 return MAX77658_NO_ERROR; 03234 } 03235 03236 int MAX77658::get_fg_avg_current(float *currentA) 03237 { 03238 int ret; 03239 int16_t currentSigned; 03240 reg_avg_current_t reg_avg_current = {0}; 03241 03242 ret = read_fg_register(AvgCurrent, (uint8_t *)&(reg_avg_current)); 03243 if (ret != MAX77658_NO_ERROR) return ret; 03244 03245 //The current register has a LSB value of 31.25uA, a register scale of 1.024A 03246 currentSigned = (int16_t)(reg_avg_current.bits.avg_current); 03247 *currentA = (float)(currentSigned * 31.25f / 1000000); 03248 03249 if (*currentA < -1.024f) *currentA = -1.024f; 03250 else if (*currentA > 1.024f) *currentA = 1.024f; 03251 03252 return MAX77658_NO_ERROR; 03253 } 03254 03255 int MAX77658::set_fg_avgta(float tempDegC) 03256 { 03257 uint16_t tempRaw; 03258 reg_avg_ta_t reg_avg_ta = {0}; 03259 03260 //Min value is -128.0°C and Max value is 127.996°C. 03261 if (tempDegC < -128) tempDegC = -128; 03262 else if (tempDegC > 127.996f) tempDegC = 127.996f; 03263 03264 //LSB is 1/256°C = 0.0039˚C. 03265 tempRaw = (int)round(tempDegC * 256) & TO_UINT16; 03266 03267 SET_FG_BIT_FIELD(AvgTA, reg_avg_ta, reg_avg_ta.bits.avg_ta, tempRaw); 03268 return MAX77658_NO_ERROR; 03269 } 03270 03271 int MAX77658::get_fg_avgta(float *tempDegC) 03272 { 03273 int ret; 03274 int16_t tempSigned; 03275 reg_avg_ta_t reg_avg_ta = {0}; 03276 03277 ret = read_fg_register(AvgTA, (uint8_t *)&(reg_avg_ta)); 03278 if (ret != MAX77658_NO_ERROR) return ret; 03279 03280 //LSB is 1/256°C = 0.0039˚C. 03281 tempSigned = (int16_t)reg_avg_ta.bits.avg_ta; 03282 *tempDegC = (float)(tempSigned / 256.0f); 03283 03284 //Min value is -128.0°C and Max value is 127.996°C. 03285 if (*tempDegC < -128) *tempDegC = -128; 03286 else if (*tempDegC > 127.996f) *tempDegC = 127.996f; 03287 03288 return MAX77658_NO_ERROR; 03289 } 03290 03291 int MAX77658::set_fg_avgvcell(float voltV) 03292 { 03293 uint16_t voltRaw; 03294 reg_avg_vcell_t reg_avg_vcell = {0}; 03295 float voltmV = voltV * 1000; 03296 03297 //Register scale range between 0V and 5.11992V. //LSB value of 1.25mV/16 03298 if (voltmV < 0) voltmV = 0; 03299 else if (voltmV > 5119.92f) voltmV = 5119.92f; 03300 03301 voltRaw = (int)round(voltmV / 1.25 * 16) & TO_UINT16; 03302 03303 SET_FG_BIT_FIELD(AvgVCell, reg_avg_vcell, reg_avg_vcell.bits.avg_vcell, voltRaw); 03304 return MAX77658_NO_ERROR; 03305 } 03306 03307 int MAX77658::get_fg_avgvcell(float *voltV) 03308 { 03309 int ret, voltRaw; 03310 reg_avg_vcell_t reg_avg_vcell = {0}; 03311 03312 ret = read_fg_register(AvgVCell, (uint8_t *)&(reg_avg_vcell)); 03313 if (ret != MAX77658_NO_ERROR) return ret; 03314 03315 //LSB value of 1.25mV/16 03316 voltRaw = (int)reg_avg_vcell.bits.avg_vcell; 03317 *voltV = (float)(voltRaw * 1.25f / 16 / 1000); 03318 03319 //Min value is 0.0V and Max value is 5.11992V. 03320 if (*voltV < 0) *voltV = 0; 03321 else if (*voltV > 5.11992f) *voltV = 5.11992f; 03322 03323 return MAX77658_NO_ERROR; 03324 } 03325 03326 int MAX77658::set_fg_max_min_temp(reg_bit_max_min_temp_t bit_field, int tempDegC) 03327 { 03328 int ret; 03329 uint8_t tempRaw; 03330 reg_max_min_temp_t reg_max_min_temp = {0}; 03331 03332 ret = read_fg_register(MaxMinTemp, (uint8_t *)&(reg_max_min_temp)); 03333 if (ret != MAX77658_NO_ERROR) return ret; 03334 03335 tempRaw = tempDegC & TO_UINT8; 03336 03337 //1°C resolution 03338 switch (bit_field) 03339 { 03340 case MaxMinTemp_MinTemperature: 03341 reg_max_min_temp.bits.min_temp = tempRaw; 03342 break; 03343 case MaxMinTemp_MaxTemperature: 03344 reg_max_min_temp.bits.max_temp = tempRaw; 03345 break; 03346 default: 03347 return MAX77658_INVALID_DATA; 03348 break; 03349 } 03350 03351 return write_fg_register(MaxMinTemp, (uint8_t *)&(reg_max_min_temp)); 03352 } 03353 03354 int MAX77658::get_fg_max_min_temp(reg_bit_max_min_temp_t bit_field, int *tempDegC) 03355 { 03356 int ret; 03357 int8_t tempSigned; 03358 reg_max_min_temp_t reg_max_min_temp = {0}; 03359 03360 ret = read_fg_register(MaxMinTemp, (uint8_t *)&(reg_max_min_temp)); 03361 if (ret != MAX77658_NO_ERROR) return ret; 03362 03363 switch (bit_field) 03364 { 03365 case MaxMinTemp_MinTemperature: 03366 tempSigned = (int8_t)reg_max_min_temp.bits.min_temp; 03367 break; 03368 case MaxMinTemp_MaxTemperature: 03369 tempSigned = (int8_t)reg_max_min_temp.bits.max_temp; 03370 break; 03371 default: 03372 return MAX77658_INVALID_DATA; 03373 break; 03374 } 03375 03376 //1°C resolution 03377 *tempDegC = (int)tempSigned; 03378 03379 return MAX77658_NO_ERROR; 03380 } 03381 03382 int MAX77658::set_fg_max_min_volt(reg_bit_max_min_volt_t bit_field, float voltV) 03383 { 03384 int ret; 03385 uint8_t voltRaw; 03386 reg_max_min_volt_t reg_max_min_volt = {0}; 03387 float voltmV = voltV * 1000; 03388 03389 ret = read_fg_register(MaxMinVolt, (uint8_t *)&(reg_max_min_volt)); 03390 if (ret != MAX77658_NO_ERROR) return ret; 03391 03392 //20mV resolution 03393 voltRaw = (int)(voltmV / 20) & TO_UINT8; 03394 03395 switch (bit_field) 03396 { 03397 case MaxMinVolt_MinVoltage: 03398 reg_max_min_volt.bits.min_volt = voltRaw; 03399 break; 03400 case MaxMinVolt_MaxVoltage: 03401 reg_max_min_volt.bits.max_volt = voltRaw; 03402 break; 03403 default: 03404 return MAX77658_INVALID_DATA; 03405 break; 03406 } 03407 03408 return write_fg_register(MaxMinVolt, (uint8_t *)&(reg_max_min_volt)); 03409 } 03410 03411 int MAX77658::get_fg_max_min_volt(reg_bit_max_min_volt_t bit_field, float *voltV) 03412 { 03413 int ret; 03414 int8_t voltSigned; 03415 reg_max_min_volt_t reg_max_min_volt = {0}; 03416 03417 ret = read_fg_register(MaxMinVolt, (uint8_t *)&(reg_max_min_volt)); 03418 if (ret != MAX77658_NO_ERROR) return ret; 03419 03420 switch (bit_field) 03421 { 03422 case MaxMinVolt_MinVoltage: 03423 voltSigned = (int8_t)reg_max_min_volt.bits.min_volt; 03424 break; 03425 case MaxMinVolt_MaxVoltage: 03426 voltSigned = (int8_t)reg_max_min_volt.bits.max_volt; 03427 break; 03428 default: 03429 return MAX77658_INVALID_DATA; 03430 break; 03431 } 03432 03433 //20mV resolution 03434 *voltV = (float)((voltSigned * 20.0f) / 1000.0f); 03435 03436 return MAX77658_NO_ERROR; 03437 } 03438 03439 int MAX77658::set_fg_max_min_curr(reg_bit_max_min_curr_t bit_field, float currentA) 03440 { 03441 int ret; 03442 uint8_t currentRaw; 03443 reg_max_min_curr_t reg_max_min_curr = {0}; 03444 float currentmA = currentA * 1000; 03445 03446 ret = read_fg_register(MaxMinCurr, (uint8_t *)&(reg_max_min_curr)); 03447 if (ret != MAX77658_NO_ERROR) return ret; 03448 03449 //8mA resolution. 03450 currentRaw = (int)round(currentmA / 8) & TO_UINT8; 03451 03452 switch (bit_field) 03453 { 03454 case MaxMinCurr_MaxDisCurrent: 03455 reg_max_min_curr.bits.min_charge_curr = currentRaw; 03456 break; 03457 case MaxMinCurr_MaxChargeCurrent: 03458 reg_max_min_curr.bits.max_charge_curr = currentRaw; 03459 break; 03460 default: 03461 return MAX77658_INVALID_DATA; 03462 break; 03463 } 03464 03465 return write_fg_register(MaxMinCurr, (uint8_t *)&(reg_max_min_curr)); 03466 } 03467 03468 int MAX77658::get_fg_max_min_curr(reg_bit_max_min_curr_t bit_field, float *currentA) 03469 { 03470 int ret; 03471 int8_t currentSigned; 03472 reg_max_min_curr_t reg_max_min_curr = {0}; 03473 03474 ret = read_fg_register(MaxMinCurr, (uint8_t *)&(reg_max_min_curr)); 03475 if (ret != MAX77658_NO_ERROR) return ret; 03476 03477 switch (bit_field) 03478 { 03479 case MaxMinCurr_MaxDisCurrent: 03480 currentSigned = (int8_t)reg_max_min_curr.bits.min_charge_curr; 03481 break; 03482 case MaxMinCurr_MaxChargeCurrent: 03483 currentSigned = (int8_t)reg_max_min_curr.bits.max_charge_curr; 03484 break; 03485 default: 03486 return MAX77658_INVALID_DATA; 03487 break; 03488 } 03489 03490 //8mA resolution 03491 *currentA = (float)(currentSigned * 8.0f / 1000.0f); 03492 03493 return MAX77658_NO_ERROR; 03494 } 03495 03496 int MAX77658::set_fg_ain0(float percent) 03497 { 03498 int percentRaw; 03499 reg_ain0_t reg_ain0 = {0}; 03500 03501 //LSB of 0.0122% 03502 percentRaw = (int)round(percent / 0.0122f); 03503 03504 SET_FG_BIT_FIELD(AIN0, reg_ain0, reg_ain0.bits.ain0, percentRaw); 03505 return MAX77658_NO_ERROR; 03506 } 03507 03508 int MAX77658::get_fg_ain0(float *percent) 03509 { 03510 int ret, percentRaw; 03511 reg_ain0_t reg_ain0 = {0}; 03512 03513 ret = read_fg_register(AIN0, (uint8_t *)&(reg_ain0)); 03514 if (ret != MAX77658_NO_ERROR) return ret; 03515 03516 //LSB of 0.0122% 03517 percentRaw = (int)reg_ain0.bits.ain0; 03518 *percent = (float)(percentRaw * 0.0122f); 03519 03520 return MAX77658_NO_ERROR; 03521 } 03522 03523 int MAX77658::set_fg_timer(float second) 03524 { 03525 int secondRaw; 03526 reg_timer_t reg_timer = {0}; 03527 03528 //full-scale range of 0 to 3.2 hours= 11520 sec 03529 if (second < 0) second = 0; 03530 else if (second > 11520.0f) second = 11520.0f; 03531 03532 //LSB is 175.8ms 03533 secondRaw = (int)round(second * 1000 / 175.8f); 03534 03535 SET_FG_BIT_FIELD(Timer, reg_timer, reg_timer.bits.timer, secondRaw); 03536 return MAX77658_NO_ERROR; 03537 } 03538 03539 int MAX77658::get_fg_timer(float *second) 03540 { 03541 int ret, secondRaw; 03542 reg_timer_t reg_timer = {0}; 03543 03544 ret = read_fg_register(Timer, (uint8_t *)&(reg_timer)); 03545 if (ret != MAX77658_NO_ERROR) return ret; 03546 03547 //LSB is 175.8ms 03548 secondRaw = (int)reg_timer.bits.timer; 03549 *second = (float)((float)secondRaw * 175.8f / 1000); 03550 03551 //full-scale range of 0 to 3.2 hours 03552 if (*second < 0) *second = 0; 03553 else if (*second > 11520.0f) *second = 11520.0f; 03554 03555 return MAX77658_NO_ERROR; 03556 } 03557 03558 int MAX77658::set_fg_shdnctr(float second) 03559 { 03560 int secondRaw; 03561 reg_shdn_timer_t reg_shdn_timer = {0}; 03562 03563 //The counter LSB is 1.4s 03564 secondRaw = (int)round(second / 1.4f); 03565 03566 SET_FG_BIT_FIELD(ShdnTimer, reg_shdn_timer, reg_shdn_timer.bits.shdnctr, secondRaw); 03567 return MAX77658_NO_ERROR; 03568 } 03569 03570 int MAX77658::get_fg_shdnctr(float *second) 03571 { 03572 int ret, secondRaw; 03573 reg_shdn_timer_t reg_shdn_timer = {0}; 03574 03575 ret = read_fg_register(ShdnTimer, (uint8_t *)&(reg_shdn_timer)); 03576 if (ret != MAX77658_NO_ERROR) return ret; 03577 03578 //Period = 175.8ms × 2^(8+THR) 03579 secondRaw = (int)reg_shdn_timer.bits.shdnctr; 03580 *second = (float)(secondRaw * 1.4f); 03581 03582 return MAX77658_NO_ERROR; 03583 } 03584 03585 int MAX77658::set_fg_shdn_thr(float second) 03586 { 03587 int secondRaw; 03588 reg_shdn_timer_t reg_shdn_timer = {0}; 03589 03590 //minimum of 45s to a maximum of 1.6h=5760sec 03591 if (second < 45) second = 45; 03592 else if (second > 5760.0f) second = 5760.0f; 03593 03594 //Period = 175.8ms × 2^(8+THR) 03595 secondRaw = (int)round(log2(second * 1000 / 175.8f) - 8); 03596 03597 SET_FG_BIT_FIELD(ShdnTimer, reg_shdn_timer, reg_shdn_timer.bits.shdn_thr, secondRaw); 03598 return MAX77658_NO_ERROR; 03599 } 03600 03601 int MAX77658::get_fg_shdn_thr(float *second) 03602 { 03603 int ret, secondRaw; 03604 reg_shdn_timer_t reg_shdn_timer = {0}; 03605 03606 ret = read_fg_register(ShdnTimer, (uint8_t *)&(reg_shdn_timer)); 03607 if (ret != MAX77658_NO_ERROR) return ret; 03608 03609 //Period = 175.8ms × 2^(8+THR) 03610 secondRaw = (int)reg_shdn_timer.bits.shdn_thr; 03611 *second = (float)(175.8f / 1000 * pow(2, secondRaw + 8)); 03612 03613 //minimum of 45s to a maximum of 1.6h 03614 if (*second < 45) *second = 45; 03615 else if (*second > 5760.0f) *second = 5760.0f; 03616 03617 return MAX77658_NO_ERROR; 03618 } 03619 03620 int MAX77658::set_fg_timerh(float hour) 03621 { 03622 int hourRaw; 03623 reg_timerh_t reg_timerh = {0}; 03624 03625 // Full-scale range up to 23.94 years = 209853.5577138 hr 03626 if (hour > 209853.5577138f) hour = (209853.5577138f); 03627 03628 //A 3.2-hour LSB 03629 hourRaw = (int)round(hour / 3.2f); 03630 03631 SET_FG_BIT_FIELD(TimerH, reg_timerh, reg_timerh.bits.timerh, hourRaw); 03632 return MAX77658_NO_ERROR; 03633 } 03634 03635 int MAX77658::get_fg_timerh(float *hour) 03636 { 03637 int ret, hourRaw; 03638 reg_timerh_t reg_timerh = {0}; 03639 03640 ret = read_fg_register(TimerH, (uint8_t *)&(reg_timerh)); 03641 if (ret != MAX77658_NO_ERROR) return ret; 03642 03643 //A 3.2-hour LSB 03644 hourRaw = (int)reg_timerh.bits.timerh; 03645 *hour = (float)(hourRaw * 3.2f); 03646 03647 // Full-scale range up to 23.94 years = 209853.5577138 hr 03648 if (*hour > 209853.5577138f) *hour = 209853.5577138f; 03649 03650 return MAX77658_NO_ERROR; 03651 } 03652 03653 int MAX77658::set_fg_rep_cap(float repCapmAh) 03654 { 03655 int repCapRaw; 03656 reg_rep_cap_t reg_rep_cap = {0}; 03657 03658 //Min value is 0.0mAh and Max value is 6553.5mAh 03659 if (repCapmAh < 0) repCapmAh = 0; 03660 else if (repCapmAh > 6553.5f) repCapmAh = 6553.5f; 03661 03662 //LSB is 0.1mAh. 03663 repCapRaw = (int)round(repCapmAh / 0.1f); 03664 03665 SET_FG_BIT_FIELD(RepCap, reg_rep_cap, reg_rep_cap.bits.rep_cap, repCapRaw); 03666 return MAX77658_NO_ERROR; 03667 } 03668 03669 int MAX77658::get_fg_rep_cap(float *repCapmAh) 03670 { 03671 int ret, repCapRaw; 03672 reg_rep_cap_t reg_rep_cap = {0}; 03673 03674 ret = read_fg_register(RepCap, (uint8_t *)&(reg_rep_cap)); 03675 if (ret != MAX77658_NO_ERROR) return ret; 03676 03677 //LSB is 0.1mAh. 03678 repCapRaw = (int)reg_rep_cap.bits.rep_cap; 03679 *repCapmAh = (float)(repCapRaw * 0.1f); 03680 03681 //Min value is 0.0mAh and Max value is 6553.5mAh 03682 if (*repCapmAh < 0) *repCapmAh = 0; 03683 else if (*repCapmAh > 6553.5f) *repCapmAh = 6553.5f; 03684 03685 return MAX77658_NO_ERROR; 03686 } 03687 03688 int MAX77658::set_fg_rep_soc(float percent) 03689 { 03690 int percentRaw; 03691 reg_rep_soc_t reg_rep_soc = {0}; 03692 03693 //Min value is 0.0% and Max value is 255.9961% 03694 if (percent < 0) percent = 0; 03695 else if (percent > 255.9961f) percent = 255.9961f; 03696 03697 //LSB is 1/256% 03698 percentRaw = (int)round(percent * 256); 03699 03700 SET_FG_BIT_FIELD(RepSOC, reg_rep_soc, reg_rep_soc.bits.rep_soc, percentRaw); 03701 return MAX77658_NO_ERROR; 03702 } 03703 03704 int MAX77658::get_fg_rep_soc(float *percent) 03705 { 03706 int ret, percentRaw; 03707 reg_rep_soc_t reg_rep_soc = {0}; 03708 03709 ret = read_fg_register(RepSOC, (uint8_t *)&(reg_rep_soc)); 03710 if (ret != MAX77658_NO_ERROR) return ret; 03711 03712 //LSB is 1/256% 03713 percentRaw = (int)reg_rep_soc.bits.rep_soc; 03714 *percent = (float)((float)percentRaw / 256.0f); 03715 03716 //Min value is 0.0% and Max value is 255.9961% 03717 if (*percent < 0) *percent = 0; 03718 else if (*percent > 255.9961f) *percent = 255.9961f; 03719 03720 return MAX77658_NO_ERROR; 03721 } 03722 03723 int MAX77658::set_fg_av_soc(float percent) 03724 { 03725 int percentRaw; 03726 reg_av_soc_t reg_av_soc = {0}; 03727 03728 //Min value is 0.0% and Max value is 255.9961% 03729 if (percent < 0) percent = 0; 03730 else if (percent > 255.9961f) percent = 255.9961f; 03731 03732 //LSB is 1/256% 03733 percentRaw = (int)round(percent * 256); 03734 03735 SET_FG_BIT_FIELD(AvSOC, reg_av_soc, reg_av_soc.bits.av_soc, percentRaw); 03736 return MAX77658_NO_ERROR; 03737 } 03738 03739 int MAX77658::get_fg_av_soc(float *percent) 03740 { 03741 int ret, percentRaw; 03742 reg_av_soc_t reg_av_soc = {0}; 03743 03744 ret = read_fg_register(AvSOC, (uint8_t *)&(reg_av_soc)); 03745 if (ret != MAX77658_NO_ERROR) return ret; 03746 03747 //LSB is 1/256% 03748 percentRaw = (int)reg_av_soc.bits.av_soc; 03749 *percent = (float)(percentRaw / 256.0f); 03750 03751 //Min value is 0.0% and Max value is 255.9961% 03752 if (*percent < 0) *percent = 0; 03753 else if (*percent > 255.9961f) *percent = 255.9961f; 03754 03755 return MAX77658_NO_ERROR; 03756 } 03757 03758 int MAX77658::set_fg_full_cap_reg(float repCapmAh) 03759 { 03760 int repCapRaw; 03761 reg_full_cap_rep_t reg_full_cap_rep = {0}; 03762 03763 //Min value is 0.0mAh and Max value is 6553.5mAh 03764 if (repCapmAh < 0) repCapmAh = 0; 03765 else if (repCapmAh > 6553.5f) repCapmAh = 6553.5f; 03766 03767 //LSB is 0.1mAh. 03768 repCapRaw = (int)round(repCapmAh / 0.1f); 03769 03770 SET_FG_BIT_FIELD(FullCapRep, reg_full_cap_rep, reg_full_cap_rep.bits.full_cap_rep, repCapRaw); 03771 return MAX77658_NO_ERROR; 03772 } 03773 03774 int MAX77658::get_fg_full_cap_reg(float *repCapmAh) 03775 { 03776 int ret, repCapRaw; 03777 reg_full_cap_rep_t reg_full_cap_rep = {0}; 03778 03779 ret = read_fg_register(FullCapRep, (uint8_t *)&(reg_full_cap_rep)); 03780 if (ret != MAX77658_NO_ERROR) return ret; 03781 03782 //LSB is 0.1mAh. 03783 repCapRaw = (int)reg_full_cap_rep.bits.full_cap_rep; 03784 *repCapmAh = (float)(repCapRaw * 0.1f); 03785 03786 //Min value is 0.0mAh and Max value is 6553.5mAh 03787 if (*repCapmAh < 0) *repCapmAh = 0; 03788 else if (*repCapmAh > 6553.5f) *repCapmAh = 6553.5f; 03789 03790 return MAX77658_NO_ERROR; 03791 } 03792 03793 int MAX77658::set_fg_tte(float minute) 03794 { 03795 int minuteRaw; 03796 reg_tte_t reg_tte = {0}; 03797 03798 //Min value is 0.0s and Max value is 102.3984h = 6143.904min. 03799 //LSB is 5.625s. 03800 minuteRaw = (int)round((float)minute * 60 / 5.625f); 03801 03802 SET_FG_BIT_FIELD(TTE, reg_tte, reg_tte.bits.tte, minuteRaw); 03803 return MAX77658_NO_ERROR; 03804 } 03805 03806 int MAX77658::get_fg_tte(float *minute) 03807 { 03808 int ret, minuteRaw; 03809 reg_tte_t reg_tte = {0}; 03810 03811 ret = read_fg_register(TTE, (uint8_t *)&(reg_tte)); 03812 if (ret != MAX77658_NO_ERROR) return ret; 03813 03814 //LSB is 5.625s. 03815 minuteRaw = (int)reg_tte.bits.tte; 03816 *minute = (float)((float)minuteRaw * 5.625f / 60); 03817 03818 //Min value is 0.0s and Max value is 102.3984h = = 6143.904 min.min. 03819 if (*minute < 0) *minute = 0; 03820 else if (*minute > 6143.904f) *minute = 6143.904f; 03821 03822 return MAX77658_NO_ERROR; 03823 } 03824 03825 int MAX77658::set_fg_rcell(float resOhm) 03826 { 03827 int resistanceRaw; 03828 reg_rcell_t reg_rcell = {0}; 03829 03830 //Min value is 0.0Ohm and Max value is 15.99976Ohm. 03831 if (resOhm < 0) resOhm = 0; 03832 else if (resOhm > 15.99976f) resOhm = 15.99976f; 03833 03834 //LSB is 1/4096Ohm 03835 resistanceRaw = (int)round(resOhm * 4096); 03836 03837 SET_FG_BIT_FIELD(RCell, reg_rcell, reg_rcell.bits.rcell, resistanceRaw); 03838 return MAX77658_NO_ERROR; 03839 } 03840 03841 int MAX77658::get_fg_rcell(float *resOhm) 03842 { 03843 int ret, resistanceRaw; 03844 reg_rcell_t reg_rcell = {0}; 03845 03846 ret = read_fg_register(RCell, (uint8_t *)&(reg_rcell)); 03847 if (ret != MAX77658_NO_ERROR) return ret; 03848 03849 //LSB is 1/4096Ohm 03850 resistanceRaw = (int)reg_rcell.bits.rcell; 03851 *resOhm = (float)(resistanceRaw / 4096.0f); 03852 03853 //Min value is 0.0Ohm and Max value is 15.99976Ohm. 03854 if (*resOhm < 0) *resOhm = 0; 03855 else if (*resOhm > 15.99976f) *resOhm = 15.99976f; 03856 03857 return MAX77658_NO_ERROR; 03858 } 03859 03860 int MAX77658::set_fg_cycles(uint16_t percent) 03861 { 03862 reg_cycles_t reg_cycles = {0}; 03863 03864 //The LSB indicates 1%. 03865 SET_FG_BIT_FIELD(Cycles, reg_cycles, reg_cycles.bits.cycles, percent); 03866 return MAX77658_NO_ERROR; 03867 } 03868 03869 int MAX77658::get_fg_cycles(uint16_t *percent) 03870 { 03871 int ret; 03872 reg_cycles_t reg_cycles = {0}; 03873 03874 ret = read_fg_register(Cycles, (uint8_t *)&(reg_cycles)); 03875 if (ret != MAX77658_NO_ERROR) return ret; 03876 03877 //The LSB indicates 1%. 03878 *percent = (uint16_t)(reg_cycles.bits.cycles); 03879 return MAX77658_NO_ERROR; 03880 } 03881 03882 int MAX77658::set_fg_av_cap(float avCapmAh) 03883 { 03884 int avCapRaw; 03885 reg_av_cap_t reg_av_cap = {0}; 03886 03887 //LSB is 0.1mAh. Min value is 0.0mAh and Max value is 6553.5mAh. 03888 if (avCapmAh < 0) avCapmAh = 0; 03889 else if (avCapmAh > 6553.5f) avCapmAh = 6553.5f; 03890 03891 avCapRaw = (int)round(avCapmAh / 0.5f); 03892 03893 SET_FG_BIT_FIELD(AvCap, reg_av_cap, reg_av_cap.bits.av_cap, avCapRaw); 03894 return MAX77658_NO_ERROR; 03895 } 03896 03897 int MAX77658::get_fg_av_cap(float *avCapmAh) 03898 { 03899 int ret, avCapRaw; 03900 reg_av_cap_t reg_av_cap = {0}; 03901 03902 ret = read_fg_register(AvCap, (uint8_t *)&(reg_av_cap)); 03903 if (ret != MAX77658_NO_ERROR) return ret; 03904 03905 //LSB is 0.1mAh. Min value is 0.0mAh and Max value is 6553.5mAh. 03906 avCapRaw = (int)reg_av_cap.bits.av_cap; 03907 *avCapmAh = (float)((float)avCapRaw * 0.1f); 03908 03909 if (*avCapmAh < 0) *avCapmAh = 0; 03910 else if (*avCapmAh > 6553.5f) *avCapmAh = 6553.5f; 03911 03912 return MAX77658_NO_ERROR; 03913 } 03914 03915 int MAX77658::set_fg_ttf(float minute) 03916 { 03917 int minuteRaw; 03918 reg_ttf_t reg_ttf = {0}; 03919 03920 //Min value is 0.0s and Max value is 102.3984h = = 6143.904 min.min. 03921 if (minute < 0) minute = 0; 03922 else if (minute > 6143.904f) minute = 6143.904f; 03923 03924 //LSB is 5.625s. 03925 minuteRaw = (int)round((float)minute * 60 / 5.625f); 03926 03927 SET_FG_BIT_FIELD(TTF, reg_ttf, reg_ttf.bits.ttf, minuteRaw); 03928 return MAX77658_NO_ERROR; 03929 } 03930 03931 int MAX77658::get_fg_ttf(float *minute) 03932 { 03933 int ret, minuteRaw; 03934 reg_ttf_t reg_ttf = {0}; 03935 03936 ret = read_fg_register(TTF, (uint8_t *)&(reg_ttf)); 03937 if (ret != MAX77658_NO_ERROR) return ret; 03938 03939 minuteRaw = (int)reg_ttf.bits.ttf; 03940 *minute = (float)((float)minuteRaw * 5.625f / 60); 03941 03942 //Min value is 0.0s and Max value is 102.3984h = = 6143.904 min.min. 03943 if (*minute < 0) *minute = 0; 03944 else if (*minute > 6143.904f) *minute = 6143.904f; 03945 03946 return MAX77658_NO_ERROR; 03947 } 03948 03949 int MAX77658::irq_disable_all() 03950 { 03951 int ret; 03952 uint8_t reg = 0; 03953 uint8_t status = 0; 03954 03955 //Disable Masks in INTM_GLBL1 03956 ret = write_register(INTM_GLBL1, ®); 03957 if (ret != MAX77658_NO_ERROR) return ret; 03958 03959 //Disable Masks in INTM_GLBL0 03960 ret = write_register(INTM_GLBL0, ®); 03961 if (ret != MAX77658_NO_ERROR) return ret; 03962 03963 //Disable Masks in INT_M_CHG 03964 ret = write_register(INT_M_CHG, ®); 03965 if (ret != MAX77658_NO_ERROR) return ret; 03966 03967 // Clear Interrupt Flags in INT_GLBL1 03968 ret = read_register(INT_GLBL1, &status); 03969 if (ret != MAX77658_NO_ERROR) return ret; 03970 03971 // Clear Interrupt Flags in INT_GLBL0 03972 ret = read_register(INT_GLBL0, &status); 03973 if (ret != MAX77658_NO_ERROR) return ret; 03974 03975 // Clear Interrupt Flags in INT_CHG 03976 ret = read_register(INT_CHG, &status); 03977 if (ret != MAX77658_NO_ERROR) return ret; 03978 03979 return MAX77658_NO_ERROR; 03980 } 03981 03982 void MAX77658::set_interrupt_handler(reg_bit_int_glbl_t id, interrupt_handler_function func, void *cb) 03983 { 03984 interrupt_handler_list[id].func = func; 03985 interrupt_handler_list[id].cb = cb; 03986 } 03987 03988 void MAX77658::post_interrupt_work() 03989 { 03990 int ret; 03991 uint8_t reg = 0, inten = 0, not_inten = 0, mask = 0; 03992 03993 while (true) { 03994 03995 ThisThread::flags_wait_any(POST_INTR_WORK_SIGNAL_ID); 03996 03997 // Check Interrupt Flags in INT_GLBL0 03998 ret = read_register(INT_GLBL0, ®); 03999 if (ret != MAX77658_NO_ERROR) return; 04000 04001 ret = read_register(INTM_GLBL0, &inten); 04002 if (ret != MAX77658_NO_ERROR) return; 04003 04004 not_inten = ~inten; // 0 means unmasked. 04005 04006 for (int i = 0; i < INT_GLBL1_GPI1_F; i++) { 04007 mask = (1 << i); 04008 if ((reg & mask) && (not_inten & mask)) { 04009 if (interrupt_handler_list[i].func != NULL) { 04010 interrupt_handler_list[i] 04011 .func(interrupt_handler_list[i].cb); 04012 } 04013 } 04014 } 04015 04016 // Check Interrupt Flags in INT_GLBL1 04017 ret = read_register(INT_GLBL1, ®); 04018 if (ret != MAX77658_NO_ERROR) return; 04019 04020 ret = read_register(INTM_GLBL1, &inten); 04021 if (ret != MAX77658_NO_ERROR) return; 04022 04023 not_inten = ~inten; // 0 means unmasked. 04024 04025 for (int i = INT_GLBL1_GPI1_F; i < INT_CHG_THM_I; i++) { 04026 mask = (1 << (i - INT_GLBL1_GPI1_F)); 04027 if ((reg & mask) && (not_inten & mask)) { 04028 if (interrupt_handler_list[i].func != NULL) { 04029 interrupt_handler_list[i] 04030 .func(interrupt_handler_list[i].cb); 04031 } 04032 } 04033 } 04034 04035 // Check Interrupt Flags in INT_CHG 04036 ret = read_register(INT_CHG, ®); 04037 if (ret != MAX77658_NO_ERROR) return; 04038 04039 ret = read_register(INT_M_CHG, &inten); 04040 if (ret != MAX77658_NO_ERROR) return; 04041 04042 not_inten = ~inten; // 0 means unmasked. 04043 04044 for (int i = INT_CHG_THM_I; i < INT_CHG_END; i++) { 04045 mask = (1 << (i - INT_CHG_THM_I)); 04046 if ((reg & mask) && (not_inten & mask)) { 04047 if (interrupt_handler_list[i].func != NULL) { 04048 interrupt_handler_list[i] 04049 .func(interrupt_handler_list[i].cb); 04050 } 04051 } 04052 } 04053 } 04054 } 04055 04056 void MAX77658::interrupt_handler() 04057 { 04058 post_intr_work_thread->flags_set(POST_INTR_WORK_SIGNAL_ID); 04059 } 04060
Generated on Fri Aug 26 2022 12:03:39 by
