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.
MAX77655.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 "MAX77655.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 MAX77655::MAX77655(I2C *i2c, PinName IRQPin):interrupt_handler_list{NULL} 00042 { 00043 if (i2c == NULL) 00044 return; 00045 00046 i2c_handler = i2c; 00047 00048 if (IRQPin != NC) { 00049 irq_disable_all(); 00050 post_intr_work_thread = new Thread(); 00051 post_intr_work_thread->start(Callback<void()>(this, &MAX77655::post_interrupt_work)); 00052 00053 this->irq_pin = new InterruptIn(IRQPin); 00054 this->irq_pin->fall(Callback<void()>(this, &MAX77655::interrupt_handler)); 00055 this->irq_pin->enable_irq(); 00056 } else { 00057 this->irq_pin = NULL; 00058 } 00059 } 00060 00061 MAX77655::~MAX77655() 00062 { 00063 if (post_intr_work_thread) 00064 delete post_intr_work_thread; 00065 00066 if (irq_pin) 00067 delete irq_pin; 00068 } 00069 00070 int MAX77655::read_register(uint8_t reg, uint8_t *value) 00071 { 00072 int rtn_val; 00073 00074 if (value == NULL) 00075 return MAX77655_VALUE_NULL; 00076 00077 rtn_val = i2c_handler->write(MAX77655_I2C_ADDRESS, (const char *)®, 1, true); 00078 if (rtn_val != 0) 00079 return MAX77655_WRITE_DATA_FAILED; 00080 00081 rtn_val = i2c_handler->read(MAX77655_I2C_ADDRESS, (char *) value, 1, false); 00082 if (rtn_val < 0) 00083 return MAX77655_READ_DATA_FAILED; 00084 00085 return MAX77655_NO_ERROR; 00086 } 00087 00088 int MAX77655::write_register(uint8_t reg, const uint8_t *value) 00089 { 00090 int rtn_val; 00091 unsigned char local_data[2]; 00092 00093 if (value == NULL) 00094 return MAX77655_VALUE_NULL; 00095 00096 local_data[0] = reg; 00097 00098 memcpy(&local_data[1], value, 1); 00099 00100 rtn_val = i2c_handler->write(MAX77655_I2C_ADDRESS, (const char *)local_data, sizeof(local_data)); 00101 if (rtn_val != MAX77655_NO_ERROR) 00102 return MAX77655_WRITE_DATA_FAILED; 00103 00104 return MAX77655_NO_ERROR; 00105 } 00106 00107 #define SET_BIT_FIELD(address, reg_name, bit_field_name, value) \ 00108 int ret_val; \ 00109 ret_val = read_register(address, (uint8_t *)&(reg_name)); \ 00110 if (ret_val) { \ 00111 return ret_val; \ 00112 } \ 00113 bit_field_name = value; \ 00114 ret_val = write_register(address, (uint8_t *)&(reg_name)); \ 00115 if (ret_val) { \ 00116 return ret_val; \ 00117 } 00118 00119 int MAX77655::set_cnfg_glbl_a(reg_bit_cnfg_glbl_a_t bit_field, uint8_t config) 00120 { 00121 int ret; 00122 reg_cnfg_glbl_a_t reg_cnfg_glbl_a; 00123 00124 ret = read_register(CNFG_GLBL_A, (uint8_t *)&(reg_cnfg_glbl_a)); 00125 if (ret != MAX77655_NO_ERROR) return ret; 00126 00127 switch (bit_field) 00128 { 00129 case CNFG_GLBL_A_DBEN_nEN: 00130 reg_cnfg_glbl_a.bits.dben_nen = config; 00131 break; 00132 case CNFG_GLBL_A_nEN_MODE: 00133 reg_cnfg_glbl_a.bits.nen_mode = config; 00134 break; 00135 case CNFG_GLBL_A_MRT: 00136 reg_cnfg_glbl_a.bits.mrt = config; 00137 break; 00138 case CNFG_GLBL_A_BIAS_LPM: 00139 reg_cnfg_glbl_a.bits.bias_lpm = config; 00140 break; 00141 case CNFG_GLBL_A_PU_DIS: 00142 reg_cnfg_glbl_a.bits.pu_dis = config; 00143 break; 00144 default: 00145 return MAX77655_INVALID_DATA; 00146 break; 00147 } 00148 00149 return write_register(CNFG_GLBL_A, (uint8_t *)&(reg_cnfg_glbl_a)); 00150 } 00151 00152 int MAX77655::get_cnfg_glbl_a(reg_bit_cnfg_glbl_a_t bit_field, uint8_t *config) 00153 { 00154 int ret; 00155 reg_cnfg_glbl_a_t reg_cnfg_glbl_a = {0}; 00156 00157 ret = read_register(CNFG_GLBL_A, (uint8_t *)&(reg_cnfg_glbl_a)); 00158 if (ret != MAX77655_NO_ERROR) return ret; 00159 00160 switch (bit_field) 00161 { 00162 case CNFG_GLBL_A_DBEN_nEN: 00163 *config = (uint8_t)reg_cnfg_glbl_a.bits.dben_nen; 00164 break; 00165 case CNFG_GLBL_A_nEN_MODE: 00166 *config = (uint8_t)reg_cnfg_glbl_a.bits.nen_mode; 00167 break; 00168 case CNFG_GLBL_A_MRT: 00169 *config = (uint8_t)reg_cnfg_glbl_a.bits.mrt; 00170 break; 00171 case CNFG_GLBL_A_BIAS_LPM: 00172 *config = (uint8_t)reg_cnfg_glbl_a.bits.bias_lpm; 00173 break; 00174 case CNFG_GLBL_A_PU_DIS: 00175 *config = (uint8_t)reg_cnfg_glbl_a.bits.pu_dis; 00176 break; 00177 default: 00178 return MAX77655_INVALID_DATA; 00179 break; 00180 } 00181 00182 return MAX77655_NO_ERROR; 00183 } 00184 00185 int MAX77655::set_sft_ctrl(decode_sft_ctrl_t config) 00186 { 00187 reg_cnfg_glbl_b_t reg_cnfg_glbl_b; 00188 00189 SET_BIT_FIELD(CNFG_GLBL_B, reg_cnfg_glbl_b, reg_cnfg_glbl_b.bits.sft_ctrl, config); 00190 00191 return MAX77655_NO_ERROR; 00192 } 00193 00194 int MAX77655::get_sft_ctrl(decode_sft_ctrl_t *config) 00195 { 00196 int ret; 00197 reg_cnfg_glbl_b_t reg_cnfg_glbl_b = {0}; 00198 00199 ret = read_register(CNFG_GLBL_B, (uint8_t *)&(reg_cnfg_glbl_b)); 00200 if (ret != MAX77655_NO_ERROR) return ret; 00201 00202 *config = (decode_sft_ctrl_t)reg_cnfg_glbl_b.bits.sft_ctrl; 00203 00204 return MAX77655_NO_ERROR; 00205 } 00206 00207 int MAX77655::set_interrupt_mask(reg_bit_int_mask_t bit_field, uint8_t maskBit) 00208 { 00209 int ret; 00210 uint8_t reg_addr; 00211 reg_intm_glbl_t reg_intm_glbl; 00212 00213 ret = read_register(INTM_GLBL, (uint8_t *)&(reg_intm_glbl)); 00214 00215 if (ret != MAX77655_NO_ERROR) return ret; 00216 00217 switch (bit_field) 00218 { 00219 case INTM_GLBL_nEN_FM: 00220 reg_intm_glbl.bits.nen_fm = maskBit; 00221 break; 00222 case INTM_GLBL_nEN_RM: 00223 reg_intm_glbl.bits.nen_rm = maskBit; 00224 break; 00225 case INTM_GLBL_TJAL1_RM: 00226 reg_intm_glbl.bits.tjal1_rm = maskBit; 00227 break; 00228 case INTM_GLBL_TJAL2_RM: 00229 reg_intm_glbl.bits.tjal2_rm = maskBit; 00230 break; 00231 case INTM_GLBL_SBB0_FM: 00232 reg_intm_glbl.bits.sbb0_fm = maskBit; 00233 break; 00234 case INTM_GLBL_SBB1_FM: 00235 reg_intm_glbl.bits.sbb1_fm = maskBit; 00236 break; 00237 case INTM_GLBL_SBB2_FM: 00238 reg_intm_glbl.bits.sbb2_fm = maskBit; 00239 break; 00240 case INTM_GLBL_SBB3_FM: 00241 reg_intm_glbl.bits.sbb3_fm = maskBit; 00242 break; 00243 default: 00244 return MAX77655_INVALID_DATA; 00245 break; 00246 } 00247 00248 return write_register(INTM_GLBL, (uint8_t *)&(reg_intm_glbl)); 00249 } 00250 00251 int MAX77655::get_interrupt_mask(reg_bit_int_mask_t bit_field, uint8_t *maskBit) 00252 { 00253 int ret; 00254 uint8_t reg_addr; 00255 reg_intm_glbl_t reg_intm_glbl = {0}; 00256 00257 ret = read_register(INTM_GLBL, (uint8_t *)&(reg_intm_glbl)); 00258 00259 if (ret != MAX77655_NO_ERROR) return ret; 00260 00261 switch (bit_field) 00262 { 00263 case INTM_GLBL_nEN_FM: 00264 *maskBit = (uint8_t)reg_intm_glbl.bits.nen_fm; 00265 break; 00266 case INTM_GLBL_nEN_RM: 00267 *maskBit = (uint8_t)reg_intm_glbl.bits.nen_rm; 00268 break; 00269 case INTM_GLBL_TJAL1_RM: 00270 *maskBit = (uint8_t)reg_intm_glbl.bits.tjal1_rm; 00271 break; 00272 case INTM_GLBL_TJAL2_RM: 00273 *maskBit = (uint8_t)reg_intm_glbl.bits.tjal2_rm; 00274 break; 00275 case INTM_GLBL_SBB0_FM: 00276 *maskBit = (uint8_t)reg_intm_glbl.bits.sbb0_fm; 00277 break; 00278 case INTM_GLBL_SBB1_FM: 00279 *maskBit = (uint8_t)reg_intm_glbl.bits.sbb1_fm; 00280 break; 00281 case INTM_GLBL_SBB2_FM: 00282 *maskBit = (uint8_t)reg_intm_glbl.bits.sbb2_fm; 00283 break; 00284 case INTM_GLBL_SBB3_FM: 00285 *maskBit = (uint8_t)reg_intm_glbl.bits.sbb3_fm; 00286 break; 00287 default: 00288 return MAX77655_INVALID_DATA; 00289 break; 00290 } 00291 00292 return MAX77655_NO_ERROR; 00293 } 00294 00295 int MAX77655::get_stat_glbl(reg_bit_stat_glbl_t bit_field, uint8_t *status) 00296 { 00297 int ret; 00298 reg_stat_glbl_t reg_stat_glbl = {0}; 00299 00300 ret = read_register(STAT_GLBL, (uint8_t *)&(reg_stat_glbl)); 00301 if (ret != MAX77655_NO_ERROR) return ret; 00302 00303 switch (bit_field) 00304 { 00305 case STAT_GLBL_STAT_EN: 00306 *status = (uint8_t)reg_stat_glbl.bits.stat_en; 00307 break; 00308 case STAT_GLBL_TJAL1_S: 00309 *status = (uint8_t)reg_stat_glbl.bits.tjal1_s; 00310 break; 00311 case STAT_GLBL_TJAL2_S: 00312 *status = (uint8_t)reg_stat_glbl.bits.tjal2_s; 00313 break; 00314 case STAT_GLBL_SBB0_S: 00315 *status = (uint8_t)reg_stat_glbl.bits.sbb0_s; 00316 break; 00317 case STAT_GLBL_SBB1_S: 00318 *status = (uint8_t)reg_stat_glbl.bits.sbb1_s; 00319 break; 00320 case STAT_GLBL_SBB2_S: 00321 *status = (uint8_t)reg_stat_glbl.bits.sbb2_s; 00322 break; 00323 case STAT_GLBL_SBB3_S: 00324 *status = (uint8_t)reg_stat_glbl.bits.sbb3_s; 00325 break; 00326 default: 00327 ret = MAX77655_INVALID_DATA; 00328 break; 00329 } 00330 00331 return ret; 00332 } 00333 00334 int MAX77655::get_ercflag(reg_bit_ercflag_t bit_field, uint8_t *flag) 00335 { 00336 int ret; 00337 reg_ercflag_t reg_ercflag = {0}; 00338 00339 ret = read_register(ERCFLAG, (uint8_t *)&(reg_ercflag)); 00340 if (ret != MAX77655_NO_ERROR) return ret; 00341 00342 switch (bit_field) 00343 { 00344 case ERCFLAG_TOVLD: 00345 *flag = (uint8_t)reg_ercflag.bits.tovld; 00346 break; 00347 case ERCFLAG_OVLO: 00348 *flag = (uint8_t)reg_ercflag.bits.ovlo; 00349 break; 00350 case ERCFLAG_UVLO: 00351 *flag = (uint8_t)reg_ercflag.bits.uvlo; 00352 break; 00353 case ERCFLAG_MRST: 00354 *flag = (uint8_t)reg_ercflag.bits.mrst; 00355 break; 00356 case ERCFLAG_SFT_OFF_F: 00357 *flag = (uint8_t)reg_ercflag.bits.sft_off_f; 00358 break; 00359 case ERCFLAG_SFT_CRST_F: 00360 *flag = (uint8_t)reg_ercflag.bits.sft_crst_f; 00361 break; 00362 default: 00363 ret = MAX77655_INVALID_DATA; 00364 break; 00365 } 00366 00367 return ret; 00368 } 00369 00370 int MAX77655::get_cid(void) { 00371 char rbuf[1] = {0}; 00372 int ret; 00373 00374 ret = read_register(CID, (uint8_t *)&(rbuf)); 00375 if (ret != MAX77655_NO_ERROR) return ret; 00376 00377 return *rbuf; 00378 } 00379 00380 int MAX77655::set_drv_sbb(decode_drv_sbb_t config) 00381 { 00382 reg_config_sbb_top_t reg_config_sbb_top; 00383 00384 SET_BIT_FIELD(CONFIG_SBB_TOP, reg_config_sbb_top, reg_config_sbb_top.bits.drv_sbb, config); 00385 00386 return MAX77655_NO_ERROR; 00387 } 00388 00389 int MAX77655::get_drv_sbb(decode_drv_sbb_t *config) 00390 { 00391 int ret; 00392 reg_config_sbb_top_t reg_config_sbb_top = {0}; 00393 00394 ret = read_register(CONFIG_SBB_TOP, (uint8_t *)&(reg_config_sbb_top)); 00395 if (ret != MAX77655_NO_ERROR) return ret; 00396 00397 *config = (decode_drv_sbb_t)reg_config_sbb_top.bits.drv_sbb; 00398 00399 return MAX77655_NO_ERROR; 00400 } 00401 00402 int MAX77655::set_tv_sbb(uint8_t channel, float voltV) 00403 { 00404 uint8_t value; 00405 reg_cnfg_sbb0_a_t reg_cnfg_sbb0_a; 00406 reg_cnfg_sbb1_a_t reg_cnfg_sbb1_a; 00407 reg_cnfg_sbb2_a_t reg_cnfg_sbb2_a; 00408 reg_cnfg_sbb3_a_t reg_cnfg_sbb3_a; 00409 float voltmV = voltV * 1000; 00410 00411 if (voltmV < 500) voltmV = 500; 00412 else if (voltmV > 4000) voltmV = 4000; 00413 00414 value = (voltmV - 500) / 25; 00415 00416 if (channel == 0) { 00417 SET_BIT_FIELD(CNFG_SBB0_A, reg_cnfg_sbb0_a, reg_cnfg_sbb0_a.bits.tv_sbb0, value); 00418 } 00419 else if (channel == 1) { 00420 SET_BIT_FIELD(CNFG_SBB1_A, reg_cnfg_sbb1_a, reg_cnfg_sbb1_a.bits.tv_sbb1, value); 00421 } 00422 else if (channel == 2) { 00423 SET_BIT_FIELD(CNFG_SBB2_A, reg_cnfg_sbb2_a, reg_cnfg_sbb2_a.bits.tv_sbb2, value); 00424 } 00425 else if (channel == 3) { 00426 SET_BIT_FIELD(CNFG_SBB3_A, reg_cnfg_sbb3_a, reg_cnfg_sbb3_a.bits.tv_sbb3, value); 00427 } 00428 else { 00429 return MAX77655_INVALID_DATA; 00430 } 00431 00432 return MAX77655_NO_ERROR; 00433 } 00434 00435 int MAX77655::get_tv_sbb(uint8_t channel, float *voltV) 00436 { 00437 int ret; 00438 uint8_t bit_value; 00439 reg_cnfg_sbb0_a_t reg_cnfg_sbb0_a = {0}; 00440 reg_cnfg_sbb1_a_t reg_cnfg_sbb1_a = {0}; 00441 reg_cnfg_sbb2_a_t reg_cnfg_sbb2_a = {0}; 00442 reg_cnfg_sbb3_a_t reg_cnfg_sbb3_a = {0}; 00443 00444 if (channel == 0) { 00445 ret = read_register(CNFG_SBB0_A, (uint8_t *)&(reg_cnfg_sbb0_a)); 00446 if (ret != MAX77655_NO_ERROR) return ret; 00447 00448 bit_value = (uint8_t)reg_cnfg_sbb0_a.bits.tv_sbb0; 00449 } 00450 else if (channel == 1) { 00451 ret = read_register(CNFG_SBB1_A, (uint8_t *)&(reg_cnfg_sbb1_a)); 00452 if (ret != MAX77655_NO_ERROR) return ret; 00453 00454 bit_value = (uint8_t)reg_cnfg_sbb1_a.bits.tv_sbb1; 00455 } 00456 else if (channel == 2) { 00457 ret = read_register(CNFG_SBB2_A, (uint8_t *)&(reg_cnfg_sbb2_a)); 00458 if (ret != MAX77655_NO_ERROR) return ret; 00459 00460 bit_value = (uint8_t)reg_cnfg_sbb2_a.bits.tv_sbb2; 00461 } 00462 else if (channel == 3) { 00463 ret = read_register(CNFG_SBB3_A, (uint8_t *)&(reg_cnfg_sbb3_a)); 00464 if (ret != MAX77655_NO_ERROR) return ret; 00465 00466 bit_value = (uint8_t)reg_cnfg_sbb3_a.bits.tv_sbb3; 00467 } 00468 else { 00469 return MAX77655_INVALID_DATA; 00470 } 00471 00472 if (bit_value > 141) bit_value = 141; 00473 *voltV = (bit_value * 0.025f) + 0.5f; 00474 00475 return MAX77655_NO_ERROR; 00476 } 00477 00478 int MAX77655::set_ade_sbb(uint8_t channel, decode_ade_sbb_t ade_sbb) 00479 { 00480 reg_cnfg_sbb0_b_t reg_cnfg_sbb0_b; 00481 reg_cnfg_sbb1_b_t reg_cnfg_sbb1_b; 00482 reg_cnfg_sbb2_b_t reg_cnfg_sbb2_b; 00483 reg_cnfg_sbb3_b_t reg_cnfg_sbb3_b; 00484 00485 if (channel == 0) { 00486 SET_BIT_FIELD(CNFG_SBB0_B, reg_cnfg_sbb0_b, reg_cnfg_sbb0_b.bits.ade_sbb0, ade_sbb); 00487 } 00488 else if (channel == 1) { 00489 SET_BIT_FIELD(CNFG_SBB1_B, reg_cnfg_sbb1_b, reg_cnfg_sbb1_b.bits.ade_sbb1, ade_sbb); 00490 } 00491 else if (channel == 2) { 00492 SET_BIT_FIELD(CNFG_SBB2_B, reg_cnfg_sbb2_b, reg_cnfg_sbb2_b.bits.ade_sbb2, ade_sbb); 00493 } 00494 else if (channel == 3) { 00495 SET_BIT_FIELD(CNFG_SBB3_B, reg_cnfg_sbb3_b, reg_cnfg_sbb3_b.bits.ade_sbb3, ade_sbb); 00496 } 00497 else { 00498 return MAX77655_INVALID_DATA; 00499 } 00500 00501 return MAX77655_NO_ERROR; 00502 } 00503 00504 int MAX77655::get_ade_sbb(uint8_t channel, decode_ade_sbb_t *ade_sbb) 00505 { 00506 int ret; 00507 reg_cnfg_sbb0_b_t reg_cnfg_sbb0_b = {0}; 00508 reg_cnfg_sbb1_b_t reg_cnfg_sbb1_b = {0}; 00509 reg_cnfg_sbb2_b_t reg_cnfg_sbb2_b = {0}; 00510 reg_cnfg_sbb3_b_t reg_cnfg_sbb3_b = {0}; 00511 00512 if (channel == 0) { 00513 ret = read_register(CNFG_SBB0_B, (uint8_t *)&(reg_cnfg_sbb0_b)); 00514 if (ret != MAX77655_NO_ERROR) return ret; 00515 00516 *ade_sbb = (decode_ade_sbb_t)reg_cnfg_sbb0_b.bits.ade_sbb0; 00517 } 00518 else if (channel == 1) { 00519 ret = read_register(CNFG_SBB1_B, (uint8_t *)&(reg_cnfg_sbb1_b)); 00520 if (ret != MAX77655_NO_ERROR) return ret; 00521 00522 *ade_sbb = (decode_ade_sbb_t)reg_cnfg_sbb1_b.bits.ade_sbb1; 00523 } 00524 else if (channel == 2) { 00525 ret = read_register(CNFG_SBB2_B, (uint8_t *)&(reg_cnfg_sbb2_b)); 00526 if (ret != MAX77655_NO_ERROR) return ret; 00527 00528 *ade_sbb = (decode_ade_sbb_t)reg_cnfg_sbb2_b.bits.ade_sbb2; 00529 } 00530 else if (channel == 3) { 00531 ret = read_register(CNFG_SBB3_B, (uint8_t *)&(reg_cnfg_sbb3_b)); 00532 if (ret != MAX77655_NO_ERROR) return ret; 00533 00534 *ade_sbb = (decode_ade_sbb_t)reg_cnfg_sbb3_b.bits.ade_sbb3; 00535 } 00536 else { 00537 return MAX77655_INVALID_DATA; 00538 } 00539 00540 return MAX77655_NO_ERROR; 00541 } 00542 00543 int MAX77655::set_en_sbb(uint8_t channel, decode_en_sbb_t en_sbb) 00544 { 00545 reg_cnfg_sbb0_b_t reg_cnfg_sbb0_b; 00546 reg_cnfg_sbb1_b_t reg_cnfg_sbb1_b; 00547 reg_cnfg_sbb2_b_t reg_cnfg_sbb2_b; 00548 reg_cnfg_sbb3_b_t reg_cnfg_sbb3_b; 00549 00550 if (channel == 0) { 00551 SET_BIT_FIELD(CNFG_SBB0_B, reg_cnfg_sbb0_b, reg_cnfg_sbb0_b.bits.en_sbb0, en_sbb); 00552 } 00553 else if (channel == 1) { 00554 SET_BIT_FIELD(CNFG_SBB1_B, reg_cnfg_sbb1_b, reg_cnfg_sbb1_b.bits.en_sbb1, en_sbb); 00555 } 00556 else if (channel == 2) { 00557 SET_BIT_FIELD(CNFG_SBB2_B, reg_cnfg_sbb2_b, reg_cnfg_sbb2_b.bits.en_sbb2, en_sbb); 00558 } 00559 else if (channel == 3) { 00560 SET_BIT_FIELD(CNFG_SBB3_B, reg_cnfg_sbb3_b, reg_cnfg_sbb3_b.bits.en_sbb3, en_sbb); 00561 } 00562 else { 00563 return MAX77655_INVALID_DATA; 00564 } 00565 00566 return MAX77655_NO_ERROR; 00567 } 00568 00569 int MAX77655::get_en_sbb(uint8_t channel, decode_en_sbb_t *en_sbb) 00570 { 00571 int ret; 00572 reg_cnfg_sbb0_b_t reg_cnfg_sbb0_b = {0}; 00573 reg_cnfg_sbb1_b_t reg_cnfg_sbb1_b = {0}; 00574 reg_cnfg_sbb2_b_t reg_cnfg_sbb2_b = {0}; 00575 reg_cnfg_sbb3_b_t reg_cnfg_sbb3_b = {0}; 00576 00577 if (channel == 0) { 00578 ret = read_register(CNFG_SBB0_B, (uint8_t *)&(reg_cnfg_sbb0_b)); 00579 if (ret != MAX77655_NO_ERROR) return ret; 00580 00581 *en_sbb = (decode_en_sbb_t)reg_cnfg_sbb0_b.bits.en_sbb0; 00582 } 00583 else if (channel == 1) { 00584 ret = read_register(CNFG_SBB1_B, (uint8_t *)&(reg_cnfg_sbb1_b)); 00585 if (ret != MAX77655_NO_ERROR) return ret; 00586 00587 *en_sbb = (decode_en_sbb_t)reg_cnfg_sbb1_b.bits.en_sbb1; 00588 } 00589 else if (channel == 2) { 00590 ret = read_register(CNFG_SBB2_B, (uint8_t *)&(reg_cnfg_sbb2_b)); 00591 if (ret != MAX77655_NO_ERROR) return ret; 00592 00593 *en_sbb = (decode_en_sbb_t)reg_cnfg_sbb2_b.bits.en_sbb2; 00594 } 00595 else if (channel == 3) { 00596 ret = read_register(CNFG_SBB3_B, (uint8_t *)&(reg_cnfg_sbb3_b)); 00597 if (ret != MAX77655_NO_ERROR) return ret; 00598 00599 *en_sbb = (decode_en_sbb_t)reg_cnfg_sbb3_b.bits.en_sbb3; 00600 } 00601 else return MAX77655_INVALID_DATA; 00602 00603 return MAX77655_NO_ERROR; 00604 } 00605 00606 int MAX77655::irq_disable_all() 00607 { 00608 int ret; 00609 uint8_t reg = 0; 00610 uint8_t status = 0; 00611 00612 //Disable Masks in INTM_GLBL 00613 ret = write_register(INTM_GLBL, ®); 00614 if (ret != MAX77655_NO_ERROR) return ret; 00615 00616 // Clear Interrupt Flags in INT_GLBL 00617 return read_register(INT_GLBL, &status); 00618 } 00619 00620 void MAX77655::set_interrupt_handler(reg_bit_int_glbl_t id, interrupt_handler_function func, void *cb) 00621 { 00622 interrupt_handler_list[id].func = func; 00623 interrupt_handler_list[id].cb = cb; 00624 } 00625 00626 void MAX77655::post_interrupt_work() 00627 { 00628 int ret; 00629 uint8_t reg = 0, inten = 0, not_inten = 0, mask = 0; 00630 00631 while (true) { 00632 00633 ThisThread::flags_wait_any(POST_INTR_WORK_SIGNAL_ID); 00634 // Check Interrupt Flags in INT_GLBL0 00635 ret = read_register(INT_GLBL, ®); 00636 if (ret != MAX77655_NO_ERROR) return; 00637 00638 ret = read_register(INTM_GLBL, &inten); 00639 if (ret != MAX77655_NO_ERROR) return; 00640 00641 not_inten = ~inten; // 0 means unmasked. 00642 00643 for (int i = 0; i <= INT_GLBL_SBB3_FM; i++) { 00644 mask = (1 << i); 00645 /* 00646 *************************************************** 00647 This is special case. when nEN is pulled high, the 00648 on/off controller initiates a power-down sequence and 00649 goes to shutdown mode. 00650 *************************************************** 00651 */ 00652 if (((reg & mask) && (not_inten & mask)) 00653 || ((reg & (1 << INT_GLBL_nEN_F)) && (i == INT_GLBL_nEN_F)) 00654 || ((reg & (1 << INT_GLBL_nEN_R)) && (i == INT_GLBL_nEN_R))) { 00655 if (interrupt_handler_list[i].func != NULL) { 00656 interrupt_handler_list[i] 00657 .func(interrupt_handler_list[i].cb); 00658 } 00659 } 00660 } 00661 } 00662 } 00663 00664 void MAX77655::interrupt_handler() 00665 { 00666 post_intr_work_thread->flags_set(POST_INTR_WORK_SIGNAL_ID); 00667 } 00668
Generated on Tue Aug 23 2022 15:12:28 by
1.7.2