MAX77642/MAX77643 Ultra Configurable PMIC Featuring 93% Peak Efficiency Single-Inductor, 3-Output BuckBoost, 1-LDO for Long Battery Life Mbed Driver

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MAX77643_2.cpp Source File

MAX77643_2.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 "MAX77643_2.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 MAX77643_2::MAX77643_2(I2C *i2c, PinName IRQPin)
00042 {
00043     if (i2c == NULL)
00044         return;
00045 
00046     i2c_handler = i2c;
00047     interrupt_handler_list = new handler[INTM_NUM_OF_BIT] {};
00048 
00049     if (IRQPin != NC) {
00050         irq_disable_all();
00051         post_intr_work_thread = new Thread();
00052         post_intr_work_thread->start(Callback<void()>(this, &MAX77643_2::post_interrupt_work));
00053 
00054         this->irq_pin = new InterruptIn(IRQPin);
00055         this->irq_pin->fall(Callback<void()>(this, &MAX77643_2::interrupt_handler));
00056         this->irq_pin->enable_irq();
00057     } else {
00058         this->irq_pin = NULL;
00059     }
00060 }
00061 
00062 MAX77643_2::~MAX77643_2()
00063 {
00064     if (post_intr_work_thread)
00065         delete post_intr_work_thread;
00066 
00067     if (irq_pin)
00068         delete irq_pin;
00069 
00070     if (interrupt_handler_list)
00071         delete [] interrupt_handler_list;
00072 }
00073 
00074 int MAX77643_2::read_register(uint8_t reg, uint8_t *value)
00075 {
00076     int rtn_val;
00077 
00078     if (value == NULL)
00079         return MAX77643_2_VALUE_NULL;
00080 
00081     rtn_val = i2c_handler->write(MAX77643_2_I2C_ADDRESS, (const char *)&reg, 1, true);
00082     if (rtn_val != 0)
00083         return MAX77643_2_WRITE_DATA_FAILED;
00084     rtn_val = i2c_handler->read(MAX77643_2_I2C_ADDRESS, (char *) value, 1, false);
00085     if (rtn_val < 0)
00086         return MAX77643_2_READ_DATA_FAILED;
00087 
00088     return MAX77643_2_NO_ERROR;
00089 }
00090 
00091 int MAX77643_2::write_register(uint8_t reg, const uint8_t *value)
00092 {
00093     int rtn_val;
00094     unsigned char local_data[2];
00095 
00096     if (value == NULL)
00097         return MAX77643_2_VALUE_NULL;
00098 
00099     local_data[0] = reg;
00100 
00101     memcpy(&local_data[1], value, 1);
00102 
00103     rtn_val = i2c_handler->write(MAX77643_2_I2C_ADDRESS, (const char *)local_data, sizeof(local_data));
00104     if (rtn_val != MAX77643_2_NO_ERROR)
00105         return MAX77643_2_WRITE_DATA_FAILED;
00106 
00107     return MAX77643_2_NO_ERROR;
00108 }
00109 
00110 #define SET_BIT_FIELD(address, reg_name, bit_field_name, value)                             \
00111     int ret_val;                                                                    \
00112         ret_val = read_register(address, (uint8_t *)&(reg_name));                       \
00113         if (ret_val) {                                                                  \
00114             return ret_val;                                                             \
00115     }                                                                               \
00116     bit_field_name = value;                                                         \
00117     ret_val = write_register(address, (uint8_t *)&(reg_name));                      \
00118     if (ret_val) {                                                                  \
00119     return ret_val;                                                             \
00120     }
00121 
00122 int MAX77643_2::get_ercflag(reg_bit_ercflag_t bit_field, uint8_t *flag)
00123 {
00124     int ret;
00125     reg_ercflag_t reg_ercflag = {0};
00126 
00127     ret = read_register(ERCFLAG, (uint8_t *)&(reg_ercflag));
00128     if (ret != MAX77643_2_NO_ERROR) return ret;
00129     
00130     switch (bit_field)
00131     {
00132     case ERCFLAG_TOVLD:
00133         *flag = (uint8_t)reg_ercflag.bits.tovld;
00134         break;
00135     case ERCFLAG_INOVLO:
00136         *flag = (uint8_t)reg_ercflag.bits.inovlo;
00137         break;
00138     case ERCFLAG_INUVLO:
00139         *flag = (uint8_t)reg_ercflag.bits.inuvlo;
00140         break;
00141     case ERCFLAG_MRST_F:
00142         *flag = (uint8_t)reg_ercflag.bits.mrst_f;
00143         break;
00144     case ERCFLAG_SFT_OFF_F:
00145         *flag = (uint8_t)reg_ercflag.bits.sft_off_f;
00146         break;
00147     case ERCFLAG_SFT_CRST_F:
00148         *flag = (uint8_t)reg_ercflag.bits.sft_crst_f;
00149         break;
00150     case ERCFLAG_WDT_EXP_F:
00151         *flag = (uint8_t)reg_ercflag.bits.wdt_exp_f;
00152         break;
00153     case ERCFLAG_SBB_FAULT_F:
00154         *flag = (uint8_t)reg_ercflag.bits.sbb_fault_f;
00155         break;
00156     default:
00157         ret = MAX77643_2_INVALID_DATA;
00158         break;      
00159     }
00160 
00161     return ret;
00162 }
00163 
00164 int MAX77643_2::get_stat_glbl(reg_bit_stat_glbl_t bit_field, uint8_t *status)
00165 {
00166     int ret;
00167     reg_stat_glbl_t reg_stat_glbl = {0};
00168 
00169     ret = read_register(STAT_GLBL, (uint8_t *)&(reg_stat_glbl));
00170     if (ret != MAX77643_2_NO_ERROR) return ret;
00171 
00172     switch (bit_field)
00173     {
00174     case STAT_GLBL_STAT_IRQ:
00175         *status = (uint8_t)reg_stat_glbl.bits.stat_irq;
00176         break;
00177     case STAT_GLBL_STAT_EN:
00178         *status = (uint8_t)reg_stat_glbl.bits.stat_en;
00179         break;
00180     case STAT_GLBL_TJAL1_S:
00181         *status = (uint8_t)reg_stat_glbl.bits.tjal1_s;
00182         break;
00183     case STAT_GLBL_TJAL2_S:
00184         *status = (uint8_t)reg_stat_glbl.bits.tjal2_s;
00185         break;
00186     case STAT_GLBL_DOD_S:
00187         *status = (uint8_t)reg_stat_glbl.bits.dod_s;
00188         break;
00189     case STAT_GLBL_BOK:
00190         *status = (uint8_t)reg_stat_glbl.bits.bok;
00191         break;
00192     case STAT_GLBL_DIDM:
00193         *status = (uint8_t)reg_stat_glbl.bits.didm;
00194         break;
00195     default:
00196         ret = MAX77643_2_INVALID_DATA;
00197         break;      
00198     }
00199 
00200     return ret;
00201 }
00202 
00203 int MAX77643_2::set_interrupt_mask(reg_bit_int_mask_t bit_field, uint8_t maskBit)
00204 {
00205     int ret;
00206     uint8_t reg_addr = 0;
00207     reg_intm_glbl0_t reg_intm_glbl0 = {0};
00208     reg_intm_glbl1_t reg_intm_glbl1 = {0};
00209  
00210     //INTM_GLBL0 (0x04) and INTM_GLBL1 (0x05)
00211     reg_addr = (uint8_t)floor((static_cast<uint8_t>(bit_field)) / 8) + 0x04; 
00212     
00213     if (reg_addr == INTM_GLBL0)
00214         ret = read_register(INTM_GLBL0, (uint8_t *)&(reg_intm_glbl0));
00215     else if (reg_addr == INTM_GLBL1)
00216         ret = read_register(INTM_GLBL1, (uint8_t *)&(reg_intm_glbl1));
00217     else 
00218         return MAX77643_2_INVALID_DATA;
00219     
00220     if (ret != MAX77643_2_NO_ERROR) return ret;
00221     
00222     switch (bit_field)
00223     {
00224     case INTM_GLBL0_GPI0_FM:
00225         reg_intm_glbl0.bits.gpi0_fm = maskBit;
00226         break;
00227     case INTM_GLBL0_GPI0_RM:
00228         reg_intm_glbl0.bits.gpi0_rm = maskBit;
00229         break;
00230     case INTM_GLBL0_nEN_FM:
00231         reg_intm_glbl0.bits.nen_fm = maskBit;
00232         break;
00233     case INTM_GLBL0_nEN_RM:
00234         reg_intm_glbl0.bits.nen_rm = maskBit;
00235         break;
00236     case INTM_GLBL0_TJAL1_RM:
00237         reg_intm_glbl0.bits.tjal1_rm = maskBit;
00238         break;
00239     case INTM_GLBL0_TJAL2_RM:
00240         reg_intm_glbl0.bits.tjal2_rm = maskBit;
00241         break;
00242     case INTM_GLBL0_DOD_RM:
00243         reg_intm_glbl0.bits.dod_rm = maskBit;
00244         break;
00245     case INTM_GLBL1_GPI1_FM:
00246         reg_intm_glbl1.bits.gpi1_fm = maskBit;
00247         break;
00248     case INTM_GLBL1_GPI1_RM:
00249         reg_intm_glbl1.bits.gpi1_rm = maskBit;
00250         break;
00251     case INTM_GLBL1_SBB0_FM:
00252         reg_intm_glbl1.bits.sbb0_fm = maskBit;
00253         break;
00254     case INTM_GLBL1_SBB1_FM:
00255         reg_intm_glbl1.bits.sbb1_fm = maskBit;
00256         break;
00257     case INTM_GLBL1_SBB2_FM:
00258         reg_intm_glbl1.bits.sbb2_fm = maskBit;
00259         break;
00260     case INTM_GLBL1_LDO_M:
00261         reg_intm_glbl1.bits.ldo_m = maskBit;
00262         break;
00263     default:
00264         return MAX77643_2_INVALID_DATA;
00265         break;      
00266     }
00267     
00268     if (reg_addr == INTM_GLBL0)
00269         return write_register(INTM_GLBL0, (uint8_t *)&(reg_intm_glbl0));
00270     else if (reg_addr == INTM_GLBL1)
00271         return write_register(INTM_GLBL1, (uint8_t *)&(reg_intm_glbl1));
00272     else 
00273         return MAX77643_2_INVALID_DATA;
00274 }
00275 
00276 int MAX77643_2::get_interrupt_mask(reg_bit_int_mask_t bit_field, uint8_t *maskBit)
00277 {
00278     int ret;
00279     uint8_t reg_addr = 0;
00280     reg_intm_glbl0_t reg_intm_glbl0 = {0};
00281     reg_intm_glbl1_t reg_intm_glbl1 = {0};
00282  
00283     //INTM_GLBL0 (0x04) and INTM_GLBL1 (0x05)
00284     reg_addr = (uint8_t)floor((static_cast<uint8_t>(bit_field)) / 8) + 0x04; 
00285     
00286     if (reg_addr == INTM_GLBL0)
00287         ret = read_register(INTM_GLBL0, (uint8_t *)&(reg_intm_glbl0));
00288     else if (reg_addr == INTM_GLBL1)
00289         ret = read_register(INTM_GLBL1, (uint8_t *)&(reg_intm_glbl1));
00290     else 
00291         return MAX77643_2_INVALID_DATA;
00292     
00293     if (ret != MAX77643_2_NO_ERROR) return ret;
00294 
00295     switch (bit_field)
00296     {   
00297     case INTM_GLBL0_GPI0_FM:
00298         *maskBit = (uint8_t)reg_intm_glbl0.bits.gpi0_fm;
00299         break;
00300     case INTM_GLBL0_GPI0_RM:
00301         *maskBit = (uint8_t)reg_intm_glbl0.bits.gpi0_rm;
00302         break;
00303     case INTM_GLBL0_nEN_FM:
00304         *maskBit = (uint8_t)reg_intm_glbl0.bits.nen_fm;
00305         break;
00306     case INTM_GLBL0_nEN_RM:
00307         *maskBit = (uint8_t)reg_intm_glbl0.bits.nen_rm;
00308         break;
00309     case INTM_GLBL0_TJAL1_RM:
00310         *maskBit = (uint8_t)reg_intm_glbl0.bits.tjal1_rm;
00311         break;
00312     case INTM_GLBL0_TJAL2_RM:
00313         *maskBit = (uint8_t)reg_intm_glbl0.bits.tjal2_rm;
00314         break;
00315     case INTM_GLBL0_DOD_RM:
00316         *maskBit = (uint8_t)reg_intm_glbl0.bits.dod_rm;
00317         break;  
00318     case INTM_GLBL1_GPI1_FM:
00319         *maskBit = (uint8_t)reg_intm_glbl1.bits.gpi1_fm;
00320         break;
00321     case INTM_GLBL1_GPI1_RM:
00322         *maskBit = (uint8_t)reg_intm_glbl1.bits.gpi1_rm;
00323         break;
00324     case INTM_GLBL1_SBB0_FM:
00325         *maskBit = (uint8_t)reg_intm_glbl1.bits.sbb0_fm;
00326         break;
00327     case INTM_GLBL1_SBB1_FM:
00328         *maskBit = (uint8_t)reg_intm_glbl1.bits.sbb1_fm;
00329         break;
00330     case INTM_GLBL1_SBB2_FM:
00331         *maskBit = (uint8_t)reg_intm_glbl1.bits.sbb2_fm;
00332         break;
00333     case INTM_GLBL1_LDO_M:
00334         *maskBit = (uint8_t)reg_intm_glbl1.bits.ldo_m;
00335         break;
00336     default:
00337         return MAX77643_2_INVALID_DATA;
00338         break;      
00339     }
00340 
00341     return MAX77643_2_NO_ERROR;
00342 }
00343 
00344 int MAX77643_2::set_cnfg_glbl0(reg_bit_cnfg_glbl0_t bit_field, uint8_t config)
00345 {   
00346     int ret;
00347     reg_cnfg_glbl0_t reg_cnfg_glbl0 = {0};
00348     
00349     ret = read_register(CNFG_GLBL0, (uint8_t *)&(reg_cnfg_glbl0));
00350     if (ret != MAX77643_2_NO_ERROR) return ret;
00351     
00352     switch (bit_field)
00353     {
00354     case CNFG_GLBL0_SFT_CTRL:
00355         reg_cnfg_glbl0.bits.sft_ctrl = config;
00356         break;
00357     case CNFG_GLBL0_DBEN_nEN:
00358         reg_cnfg_glbl0.bits.dben_nen = config;
00359         break;
00360     case CNFG_GLBL0_nEN_MODE:
00361         reg_cnfg_glbl0.bits.nen_mode = config;
00362         break;
00363     case CNFG_GLBL0_SBIA_LPM:
00364         reg_cnfg_glbl0.bits.sbia_lpm = config;
00365         break;
00366     case CNFG_GLBL0_T_MRST:
00367         reg_cnfg_glbl0.bits.t_mrst = config;
00368         break;
00369     case CNFG_GLBL0_PU_DIS:
00370         reg_cnfg_glbl0.bits.pu_dis = config;
00371         break;
00372     default:
00373         return MAX77643_2_INVALID_DATA;
00374         break;      
00375     }
00376                                     
00377     return write_register(CNFG_GLBL0, (uint8_t *)&(reg_cnfg_glbl0));
00378 }
00379 
00380 int MAX77643_2::get_cnfg_glbl0(reg_bit_cnfg_glbl0_t bit_field, uint8_t *config)
00381 {
00382     int ret;
00383     reg_cnfg_glbl0_t reg_cnfg_glbl0 = {0};
00384 
00385     ret = read_register(CNFG_GLBL0, (uint8_t *)&(reg_cnfg_glbl0));
00386     if (ret != MAX77643_2_NO_ERROR) return ret;
00387 
00388     switch (bit_field)
00389     {
00390     case CNFG_GLBL0_SFT_CTRL:
00391         *config = (uint8_t)reg_cnfg_glbl0.bits.sft_ctrl;
00392         break;
00393     case CNFG_GLBL0_DBEN_nEN:
00394         *config = (uint8_t)reg_cnfg_glbl0.bits.dben_nen;
00395         break;
00396     case CNFG_GLBL0_nEN_MODE:
00397         *config = (uint8_t)reg_cnfg_glbl0.bits.nen_mode;
00398         break;
00399     case CNFG_GLBL0_SBIA_LPM:
00400         *config = (uint8_t)reg_cnfg_glbl0.bits.sbia_lpm;
00401         break;
00402     case CNFG_GLBL0_T_MRST:
00403         *config = (uint8_t)reg_cnfg_glbl0.bits.t_mrst;
00404         break;
00405     case CNFG_GLBL0_PU_DIS:
00406         *config = (uint8_t)reg_cnfg_glbl0.bits.pu_dis;
00407         break;
00408     default:
00409         ret = MAX77643_2_INVALID_DATA;
00410         break;      
00411     }
00412 
00413     return ret;
00414 }
00415 
00416 int MAX77643_2::set_cnfg_glbl1(reg_bit_cnfg_glbl1_t bit_field, uint8_t config)
00417 {   
00418     int ret;
00419     reg_cnfg_glbl1_t reg_cnfg_glbl1;
00420     
00421     ret = read_register(CNFG_GLBL1, (uint8_t *)&(reg_cnfg_glbl1));
00422     if (ret != MAX77643_2_NO_ERROR) return ret;
00423     
00424     switch (bit_field)
00425     {
00426     case CNFG_GLBL1_AUTO_WKT:
00427         reg_cnfg_glbl1.bits.auto_wkt = config;
00428         break;
00429     case CNFG_GLBL1_SBB_F_SHUTDN:
00430         reg_cnfg_glbl1.bits.sbb_f_shutdn = config;
00431         break;
00432     default:
00433         return MAX77643_2_INVALID_DATA;
00434         break;      
00435     }
00436                                     
00437     return write_register(CNFG_GLBL1, (uint8_t *)&(reg_cnfg_glbl1));
00438 }
00439 
00440 int MAX77643_2::get_cnfg_glbl1(reg_bit_cnfg_glbl1_t bit_field, uint8_t *config)
00441 {
00442     int ret;
00443     reg_cnfg_glbl1_t reg_cnfg_glbl1 = {0};
00444 
00445     ret = read_register(CNFG_GLBL1, (uint8_t *)&(reg_cnfg_glbl1));
00446     if (ret != MAX77643_2_NO_ERROR) return ret;
00447 
00448     switch (bit_field)
00449     {
00450     case CNFG_GLBL1_AUTO_WKT:
00451         *config = (uint8_t)reg_cnfg_glbl1.bits.auto_wkt;
00452         break;
00453     case CNFG_GLBL1_SBB_F_SHUTDN:
00454         *config = (uint8_t)reg_cnfg_glbl1.bits.sbb_f_shutdn;
00455         break;
00456     default:
00457         ret = MAX77643_2_INVALID_DATA;
00458         break;      
00459     }
00460 
00461     return ret;
00462 }
00463 
00464 int MAX77643_2::set_cnfg_gpio(reg_bit_cnfg_gpio_t bit_field, uint8_t channel, uint8_t config)
00465 {
00466     int ret;
00467     reg_cnfg_gpio0_t reg_cnfg_gpio0 = {0};
00468     reg_cnfg_gpio1_t reg_cnfg_gpio1 = {0};
00469     
00470     if (channel == 0)
00471     {
00472         ret = read_register(CNFG_GPIO0, (uint8_t *)&(reg_cnfg_gpio0));
00473         if (ret != MAX77643_2_NO_ERROR) return ret;
00474         
00475         switch (bit_field)
00476         {
00477             case CNFG_GPIO_DIR:
00478                 reg_cnfg_gpio0.bits.gpo_dir = config;
00479                 break;
00480             case CNFG_GPIO_DI:
00481                 reg_cnfg_gpio0.bits.gpo_di = config;
00482                 break;
00483             case CNFG_GPIO_DRV:
00484                 reg_cnfg_gpio0.bits.gpo_drv = config;
00485                 break;
00486             case CNFG_GPIO_DO:
00487                 reg_cnfg_gpio0.bits.gpo_do = config;
00488                 break;
00489             case CNFG_GPIO_DBEN_GPI:
00490                 reg_cnfg_gpio0.bits.dben_gpi = config;
00491                 break;
00492             case CNFG_GPIO_ALT_GPIO:
00493                 reg_cnfg_gpio0.bits.alt_gpio = config;
00494                 break;
00495             default:
00496                 return MAX77643_2_INVALID_DATA;
00497                 break;      
00498         }
00499         
00500         return write_register(CNFG_GPIO0, (uint8_t *)&(reg_cnfg_gpio0));
00501     }
00502     else if (channel == 1)
00503     {
00504         ret = read_register(CNFG_GPIO1, (uint8_t *)&(reg_cnfg_gpio1));
00505         if (ret != MAX77643_2_NO_ERROR) return ret;
00506         
00507         switch (bit_field)
00508         {
00509             case CNFG_GPIO_DIR:
00510                 reg_cnfg_gpio1.bits.gpo_dir = config;
00511                 break;
00512             case CNFG_GPIO_DI:
00513                 reg_cnfg_gpio1.bits.gpo_di = config;
00514                 break;
00515             case CNFG_GPIO_DRV:
00516                 reg_cnfg_gpio1.bits.gpo_drv = config;
00517                 break;
00518             case CNFG_GPIO_DO:
00519                 reg_cnfg_gpio1.bits.gpo_do = config;
00520                 break;
00521             case CNFG_GPIO_DBEN_GPI:
00522                 reg_cnfg_gpio1.bits.dben_gpi = config;
00523                 break;
00524             case CNFG_GPIO_ALT_GPIO:
00525                 reg_cnfg_gpio1.bits.alt_gpio = config;
00526                 break;
00527             default:
00528                 return MAX77643_2_INVALID_DATA;
00529                 break;      
00530         }
00531         
00532         return write_register(CNFG_GPIO1, (uint8_t *)&(reg_cnfg_gpio1));
00533     }
00534     else {
00535         return MAX77643_2_INVALID_DATA;
00536     }
00537 }
00538 
00539 int MAX77643_2::get_cnfg_gpio(reg_bit_cnfg_gpio_t bit_field, uint8_t channel, uint8_t *config)
00540 {
00541     int ret;
00542     reg_cnfg_gpio0_t reg_cnfg_gpio0 = {0};
00543     reg_cnfg_gpio1_t reg_cnfg_gpio1 = {0};
00544     
00545     if (channel == 0)
00546     {
00547         ret = read_register(CNFG_GPIO0, (uint8_t *)&(reg_cnfg_gpio0));
00548         if (ret != MAX77643_2_NO_ERROR) return ret;
00549     
00550         switch (bit_field)
00551         {
00552             case CNFG_GPIO_DIR:
00553                 *config = (uint8_t)reg_cnfg_gpio0.bits.gpo_dir;
00554                 break;
00555             case CNFG_GPIO_DI:
00556                 *config = (uint8_t)reg_cnfg_gpio0.bits.gpo_di;
00557                 break;
00558             case CNFG_GPIO_DRV:
00559                 *config = (uint8_t)reg_cnfg_gpio0.bits.gpo_drv;
00560                 break;
00561             case CNFG_GPIO_DO:
00562                 *config = (uint8_t)reg_cnfg_gpio0.bits.gpo_do;
00563                 break;
00564             case CNFG_GPIO_DBEN_GPI:
00565                 *config = (uint8_t)reg_cnfg_gpio0.bits.dben_gpi;
00566                 break;
00567             case CNFG_GPIO_ALT_GPIO:
00568                 *config = (uint8_t)reg_cnfg_gpio0.bits.alt_gpio;
00569                 break;
00570             default:
00571                 return MAX77643_2_INVALID_DATA;
00572                 break;      
00573         }
00574     }
00575     else if (channel == 1)
00576     {
00577         ret = read_register(CNFG_GPIO1, (uint8_t *)&(reg_cnfg_gpio1));
00578         if (ret != MAX77643_2_NO_ERROR) return ret;
00579         
00580         switch (bit_field)
00581         {
00582             case CNFG_GPIO_DIR:
00583                 *config = (uint8_t)reg_cnfg_gpio1.bits.gpo_dir;
00584                 break;
00585             case CNFG_GPIO_DI:
00586                 *config = (uint8_t)reg_cnfg_gpio1.bits.gpo_di;
00587                 break;
00588             case CNFG_GPIO_DRV:
00589                 *config = (uint8_t)reg_cnfg_gpio1.bits.gpo_drv;
00590                 break;
00591             case CNFG_GPIO_DO:
00592                 *config = (uint8_t)reg_cnfg_gpio1.bits.gpo_do;
00593                 break;
00594             case CNFG_GPIO_DBEN_GPI:
00595                 *config = (uint8_t)reg_cnfg_gpio1.bits.dben_gpi;
00596                 break;
00597             case CNFG_GPIO_ALT_GPIO:
00598                 *config = (uint8_t)reg_cnfg_gpio1.bits.alt_gpio;
00599                 break;
00600             default:
00601                 return MAX77643_2_INVALID_DATA;
00602                 break;      
00603         }
00604     }
00605     else {
00606         return MAX77643_2_INVALID_DATA;
00607     }
00608 
00609     return ret;
00610 }
00611 
00612 int MAX77643_2::get_cid(void) {
00613     char rbuf[1] = {0};
00614     int ret;
00615 
00616     ret = read_register(CID, (uint8_t *)&(rbuf));
00617     if (ret != MAX77643_2_NO_ERROR) return ret;
00618  
00619     return *rbuf;
00620 }
00621 
00622 int MAX77643_2::set_cnfg_wdt(reg_bit_cnfg_wdt_t bit_field, uint8_t config)
00623 {
00624     int ret;
00625     reg_cnfg_wdt_t reg_cnfg_wdt = {0};
00626     
00627     ret = read_register(CNFG_WDT, (uint8_t *)&(reg_cnfg_wdt));
00628     if (ret != MAX77643_2_NO_ERROR) return ret;
00629     
00630     switch (bit_field)
00631     {
00632         case CNFG_WDT_WDT_LOCK:
00633             reg_cnfg_wdt.bits.wdt_lock = config;
00634             break;
00635         case CNFG_WDT_WDT_EN:
00636             reg_cnfg_wdt.bits.wdt_en = config;
00637             break;
00638         case CNFG_WDT_WDT_CLR:
00639             reg_cnfg_wdt.bits.wdt_clr = config;
00640             break;
00641         case CNFG_WDT_WDT_MODE:
00642             reg_cnfg_wdt.bits.wdt_mode = config;
00643             break;
00644         case CNFG_WDT_WDT_PER:
00645             reg_cnfg_wdt.bits.wdt_per = config;
00646             break;
00647         default:
00648             return MAX77643_2_INVALID_DATA;
00649             break;      
00650     }
00651 
00652     return write_register(CNFG_WDT, (uint8_t *)&(reg_cnfg_wdt));
00653 }
00654 
00655 int MAX77643_2::get_cnfg_wdt(reg_bit_cnfg_wdt_t bit_field, uint8_t *config)
00656 {
00657     int ret;
00658     reg_cnfg_wdt_t reg_cnfg_wdt = {0};
00659 
00660     ret = read_register(CNFG_WDT, (uint8_t *)&(reg_cnfg_wdt));
00661     if (ret != MAX77643_2_NO_ERROR) return ret;
00662 
00663     switch (bit_field)
00664     {
00665         case CNFG_WDT_WDT_LOCK:
00666             *config = (uint8_t)reg_cnfg_wdt.bits.wdt_lock;
00667             break;
00668         case CNFG_WDT_WDT_EN:
00669             *config = (uint8_t)reg_cnfg_wdt.bits.wdt_en;
00670             break;
00671         case CNFG_WDT_WDT_CLR:
00672             *config = (uint8_t)reg_cnfg_wdt.bits.wdt_clr;
00673             break;
00674         case CNFG_WDT_WDT_MODE:
00675             *config = (uint8_t)reg_cnfg_wdt.bits.wdt_mode;
00676             break;
00677         case CNFG_WDT_WDT_PER:
00678             *config = (uint8_t)reg_cnfg_wdt.bits.wdt_per;
00679             break;
00680         default:
00681             return MAX77643_2_INVALID_DATA;
00682             break;      
00683     }
00684 
00685     return MAX77643_2_NO_ERROR;
00686 }
00687 
00688 int MAX77643_2::set_cnfg_sbb_top(reg_bit_cnfg_sbb_top_t bit_field, uint8_t config)
00689 {
00690     int ret;
00691     reg_cnfg_sbb_top_t reg_cnfg_sbb_top = {0};
00692     
00693     ret = read_register(CNFG_SBB_TOP, (uint8_t *)&(reg_cnfg_sbb_top));
00694     if (ret != MAX77643_2_NO_ERROR) return ret;
00695     
00696     switch (bit_field)
00697     {
00698         case CNFG_SBB_TOP_DRV_SBB:
00699             reg_cnfg_sbb_top.bits.drv_sbb = config;
00700             break;
00701         case CNFG_SBB_TOP_DIS_LPM:
00702             reg_cnfg_sbb_top.bits.dis_lpm = config;
00703             break;
00704         default:
00705             return MAX77643_2_INVALID_DATA;
00706         break;
00707     }
00708 
00709     return write_register(CNFG_SBB_TOP, (uint8_t *)&(reg_cnfg_sbb_top));
00710 }
00711 
00712 int MAX77643_2::get_cnfg_sbb_top(reg_bit_cnfg_sbb_top_t bit_field, uint8_t *config)
00713 {
00714     int ret;
00715     reg_cnfg_sbb_top_t reg_cnfg_sbb_top = {0};
00716 
00717     ret = read_register(CNFG_SBB_TOP, (uint8_t *)&(reg_cnfg_sbb_top));
00718     if (ret != MAX77643_2_NO_ERROR) return ret;
00719 
00720     switch (bit_field)
00721     {
00722         case CNFG_SBB_TOP_DRV_SBB:
00723             *config = (uint8_t)reg_cnfg_sbb_top.bits.drv_sbb;
00724             break;
00725         case CNFG_SBB_TOP_DIS_LPM:
00726             *config = (uint8_t)reg_cnfg_sbb_top.bits.dis_lpm;
00727             break;
00728         default:
00729             return MAX77643_2_INVALID_DATA;
00730         break;
00731     }
00732 
00733     return MAX77643_2_NO_ERROR;
00734 }
00735 
00736 int MAX77643_2::set_tv_sbb(uint8_t channel, float voltV)
00737 {
00738     uint8_t value;
00739     reg_cnfg_sbb0_a_t reg_cnfg_sbb0_a = {0};
00740     reg_cnfg_sbb1_a_t reg_cnfg_sbb1_a = {0};
00741     reg_cnfg_sbb2_a_t reg_cnfg_sbb2_a = {0};
00742     float voltmV = voltV * 1000;
00743     
00744     if (voltmV < 500) voltmV = 500;
00745     else if (voltmV > 5500) voltmV = 5500;
00746 
00747     value = (voltmV - 500) / 25;
00748 
00749     if (channel == 0) {
00750         SET_BIT_FIELD(CNFG_SBB0_A, reg_cnfg_sbb0_a, reg_cnfg_sbb0_a.bits.tv_sbb0, value);
00751     }       
00752     else if (channel == 1) {
00753         SET_BIT_FIELD(CNFG_SBB1_A, reg_cnfg_sbb1_a, reg_cnfg_sbb1_a.bits.tv_sbb1, value);
00754     }
00755     else if (channel == 2) {
00756         SET_BIT_FIELD(CNFG_SBB2_A, reg_cnfg_sbb2_a, reg_cnfg_sbb2_a.bits.tv_sbb2, value);
00757     }
00758     else {
00759         return MAX77643_2_INVALID_DATA;
00760     }
00761     
00762     return MAX77643_2_NO_ERROR;
00763 }
00764 
00765 int MAX77643_2::get_tv_sbb(uint8_t channel, float *voltV)
00766 {
00767     int ret;
00768     uint8_t bit_value;
00769     reg_cnfg_sbb0_a_t reg_cnfg_sbb0_a = {0};
00770     reg_cnfg_sbb1_a_t reg_cnfg_sbb1_a = {0};
00771     reg_cnfg_sbb2_a_t reg_cnfg_sbb2_a = {0};
00772 
00773     if (channel == 0) { 
00774         ret = read_register(CNFG_SBB0_A, (uint8_t *)&(reg_cnfg_sbb0_a));
00775         if (ret != MAX77643_2_NO_ERROR) return ret;
00776         
00777         bit_value = (uint8_t)reg_cnfg_sbb0_a.bits.tv_sbb0;
00778     }
00779     else if (channel == 1) {
00780         ret = read_register(CNFG_SBB1_A, (uint8_t *)&(reg_cnfg_sbb1_a));
00781         if (ret != MAX77643_2_NO_ERROR) return ret;
00782     
00783         bit_value = (uint8_t)reg_cnfg_sbb1_a.bits.tv_sbb1;
00784     }
00785     else if (channel == 2) {
00786         ret = read_register(CNFG_SBB2_A, (uint8_t *)&(reg_cnfg_sbb2_a));
00787         if (ret != MAX77643_2_NO_ERROR) return ret;
00788     
00789         bit_value = (uint8_t)reg_cnfg_sbb2_a.bits.tv_sbb2;
00790     }
00791     else return MAX77643_2_INVALID_DATA;
00792     
00793     if (bit_value > 200) bit_value = 200;
00794     *voltV = (bit_value * 0.025f) + 0.5f;
00795 
00796     return MAX77643_2_NO_ERROR;
00797 }
00798 
00799 int MAX77643_2::set_op_mode(uint8_t channel, decode_op_mode_t mode)
00800 {   
00801     reg_cnfg_sbb0_b_t reg_cnfg_sbb0_b = {0};
00802     reg_cnfg_sbb1_b_t reg_cnfg_sbb1_b = {0};
00803     reg_cnfg_sbb2_b_t reg_cnfg_sbb2_b = {0};
00804     
00805     if (channel == 0) {
00806         SET_BIT_FIELD(CNFG_SBB0_B, reg_cnfg_sbb0_b, reg_cnfg_sbb0_b.bits.op_mode0, mode);
00807     }
00808     else if (channel == 1) {
00809         SET_BIT_FIELD(CNFG_SBB1_B, reg_cnfg_sbb1_b, reg_cnfg_sbb1_b.bits.op_mode1, mode);
00810     }
00811     else if (channel == 2) {
00812         SET_BIT_FIELD(CNFG_SBB2_B, reg_cnfg_sbb2_b, reg_cnfg_sbb2_b.bits.op_mode2, mode);
00813     }
00814     else {
00815         return MAX77643_2_INVALID_DATA;
00816     }
00817     
00818     return MAX77643_2_NO_ERROR;
00819 }
00820 
00821 int MAX77643_2::get_op_mode(uint8_t channel, decode_op_mode_t *mode)
00822 {
00823     int ret;
00824     reg_cnfg_sbb0_b_t reg_cnfg_sbb0_b = {0};
00825     reg_cnfg_sbb1_b_t reg_cnfg_sbb1_b = {0};
00826     reg_cnfg_sbb2_b_t reg_cnfg_sbb2_b = {0};
00827 
00828     if (channel == 0) {
00829         ret = read_register(CNFG_SBB0_B, (uint8_t *)&(reg_cnfg_sbb0_b));
00830         if (ret != MAX77643_2_NO_ERROR) return ret;
00831 
00832         *mode = (decode_op_mode_t)reg_cnfg_sbb0_b.bits.op_mode0;
00833     }
00834     else if (channel == 1) {
00835         ret = read_register(CNFG_SBB1_B, (uint8_t *)&(reg_cnfg_sbb1_b));
00836         if (ret != MAX77643_2_NO_ERROR) return ret;
00837 
00838         *mode = (decode_op_mode_t)reg_cnfg_sbb1_b.bits.op_mode1;
00839     }
00840     else if (channel == 2) {
00841         ret = read_register(CNFG_SBB2_B, (uint8_t *)&(reg_cnfg_sbb2_b));
00842         if (ret != MAX77643_2_NO_ERROR) return ret;
00843 
00844         *mode = (decode_op_mode_t)reg_cnfg_sbb2_b.bits.op_mode2;
00845     }
00846     else { 
00847         return MAX77643_2_INVALID_DATA;
00848     }
00849 
00850     return MAX77643_2_NO_ERROR;
00851 }
00852 
00853 int MAX77643_2::set_ip_sbb(uint8_t channel, decode_ip_sbb_t ip_sbb)
00854 {   
00855     reg_cnfg_sbb0_b_t reg_cnfg_sbb0_b = {0};
00856     reg_cnfg_sbb1_b_t reg_cnfg_sbb1_b = {0};
00857     reg_cnfg_sbb2_b_t reg_cnfg_sbb2_b = {0};
00858     
00859     if (channel == 0) {
00860         SET_BIT_FIELD(CNFG_SBB0_B, reg_cnfg_sbb0_b, reg_cnfg_sbb0_b.bits.ip_sbb0, ip_sbb);
00861     }
00862     else if (channel == 1) {
00863         SET_BIT_FIELD(CNFG_SBB1_B, reg_cnfg_sbb1_b, reg_cnfg_sbb1_b.bits.ip_sbb1, ip_sbb);
00864     }
00865     else if (channel == 2) {
00866         SET_BIT_FIELD(CNFG_SBB2_B, reg_cnfg_sbb2_b, reg_cnfg_sbb2_b.bits.ip_sbb2, ip_sbb);
00867     }
00868     else {
00869         return MAX77643_2_INVALID_DATA;
00870     }
00871     
00872     return MAX77643_2_NO_ERROR;
00873 }
00874 
00875 int MAX77643_2::get_ip_sbb(uint8_t channel, decode_ip_sbb_t *ip_sbb)
00876 {
00877     int ret;
00878     reg_cnfg_sbb0_b_t reg_cnfg_sbb0_b = {0};
00879     reg_cnfg_sbb1_b_t reg_cnfg_sbb1_b = {0};
00880     reg_cnfg_sbb2_b_t reg_cnfg_sbb2_b = {0};
00881 
00882     if (channel == 0) {
00883         ret = read_register(CNFG_SBB0_B, (uint8_t *)&(reg_cnfg_sbb0_b));
00884         if (ret != MAX77643_2_NO_ERROR) return ret;
00885 
00886         *ip_sbb = (decode_ip_sbb_t)reg_cnfg_sbb0_b.bits.ip_sbb0;
00887     }
00888     else if (channel == 1) {
00889         ret = read_register(CNFG_SBB1_B, (uint8_t *)&(reg_cnfg_sbb1_b));
00890         if (ret != MAX77643_2_NO_ERROR) return ret;
00891 
00892         *ip_sbb = (decode_ip_sbb_t)reg_cnfg_sbb1_b.bits.ip_sbb1;
00893     }
00894     else if (channel == 2) {
00895         ret = read_register(CNFG_SBB2_B, (uint8_t *)&(reg_cnfg_sbb2_b));
00896         if (ret != MAX77643_2_NO_ERROR) return ret;
00897 
00898         *ip_sbb = (decode_ip_sbb_t)reg_cnfg_sbb2_b.bits.ip_sbb2;
00899     }
00900     else {
00901         return MAX77643_2_INVALID_DATA;
00902     }
00903 
00904     return MAX77643_2_NO_ERROR;
00905 }
00906 
00907 int MAX77643_2::set_ade_sbb(uint8_t channel, decode_ade_sbb_t ade_sbb)
00908 {   
00909     reg_cnfg_sbb0_b_t reg_cnfg_sbb0_b = {0};
00910     reg_cnfg_sbb1_b_t reg_cnfg_sbb1_b = {0};
00911     reg_cnfg_sbb2_b_t reg_cnfg_sbb2_b = {0};
00912     
00913     if (channel == 0) {
00914         SET_BIT_FIELD(CNFG_SBB0_B, reg_cnfg_sbb0_b, reg_cnfg_sbb0_b.bits.ade_sbb0, ade_sbb);
00915     }
00916     else if (channel == 1) {
00917         SET_BIT_FIELD(CNFG_SBB1_B, reg_cnfg_sbb1_b, reg_cnfg_sbb1_b.bits.ade_sbb1, ade_sbb);
00918     }
00919     else if (channel == 2) {
00920         SET_BIT_FIELD(CNFG_SBB2_B, reg_cnfg_sbb2_b, reg_cnfg_sbb2_b.bits.ade_sbb2, ade_sbb);
00921     }
00922     else {
00923         return MAX77643_2_INVALID_DATA;
00924     }
00925     
00926     return MAX77643_2_NO_ERROR;
00927 }
00928 
00929 int MAX77643_2::get_ade_sbb(uint8_t channel, decode_ade_sbb_t *ade_sbb)
00930 {
00931     int ret;
00932     reg_cnfg_sbb0_b_t reg_cnfg_sbb0_b = {0};
00933     reg_cnfg_sbb1_b_t reg_cnfg_sbb1_b = {0};
00934     reg_cnfg_sbb2_b_t reg_cnfg_sbb2_b = {0};
00935 
00936     if (channel == 0) {
00937         ret = read_register(CNFG_SBB0_B, (uint8_t *)&(reg_cnfg_sbb0_b));
00938         if (ret != MAX77643_2_NO_ERROR) return ret;
00939 
00940         *ade_sbb = (decode_ade_sbb_t)reg_cnfg_sbb0_b.bits.ade_sbb0;
00941     }
00942     else if (channel == 1) {
00943         ret = read_register(CNFG_SBB1_B, (uint8_t *)&(reg_cnfg_sbb1_b));
00944         if (ret != MAX77643_2_NO_ERROR) return ret;
00945 
00946         *ade_sbb = (decode_ade_sbb_t)reg_cnfg_sbb1_b.bits.ade_sbb1;
00947     }
00948     else if (channel == 2) {
00949         ret = read_register(CNFG_SBB2_B, (uint8_t *)&(reg_cnfg_sbb2_b));
00950         if (ret != MAX77643_2_NO_ERROR) return ret;
00951 
00952         *ade_sbb = (decode_ade_sbb_t)reg_cnfg_sbb2_b.bits.ade_sbb2;
00953     }
00954     else {
00955         return MAX77643_2_INVALID_DATA;
00956     }
00957 
00958     return MAX77643_2_NO_ERROR;
00959 }
00960 
00961 int MAX77643_2::set_en_sbb(uint8_t channel, decode_en_sbb_t en_sbb)
00962 {   
00963     reg_cnfg_sbb0_b_t reg_cnfg_sbb0_b = {0};
00964     reg_cnfg_sbb1_b_t reg_cnfg_sbb1_b = {0};
00965     reg_cnfg_sbb2_b_t reg_cnfg_sbb2_b = {0};
00966     
00967     if (channel == 0) {
00968         SET_BIT_FIELD(CNFG_SBB0_B, reg_cnfg_sbb0_b, reg_cnfg_sbb0_b.bits.en_sbb0, en_sbb);
00969     }
00970     else if (channel == 1) {
00971         SET_BIT_FIELD(CNFG_SBB1_B, reg_cnfg_sbb1_b, reg_cnfg_sbb1_b.bits.en_sbb1, en_sbb);
00972     }
00973     else if (channel == 2) {
00974         SET_BIT_FIELD(CNFG_SBB2_B, reg_cnfg_sbb2_b, reg_cnfg_sbb2_b.bits.en_sbb2, en_sbb);
00975     }
00976     else {
00977         return MAX77643_2_INVALID_DATA;
00978     }
00979     
00980     return MAX77643_2_NO_ERROR;
00981 }
00982 
00983 int MAX77643_2::get_en_sbb(uint8_t channel, decode_en_sbb_t *en_sbb)
00984 {
00985     int ret;
00986     reg_cnfg_sbb0_b_t reg_cnfg_sbb0_b = {0};
00987     reg_cnfg_sbb1_b_t reg_cnfg_sbb1_b = {0};
00988     reg_cnfg_sbb2_b_t reg_cnfg_sbb2_b = {0};
00989 
00990     if (channel == 0) {
00991         ret = read_register(CNFG_SBB0_B, (uint8_t *)&(reg_cnfg_sbb0_b));
00992         if (ret != MAX77643_2_NO_ERROR) return ret;
00993 
00994         *en_sbb = (decode_en_sbb_t)reg_cnfg_sbb0_b.bits.en_sbb0;
00995     }
00996     else if (channel == 1) {
00997         ret = read_register(CNFG_SBB1_B, (uint8_t *)&(reg_cnfg_sbb1_b));
00998         if (ret != MAX77643_2_NO_ERROR) return ret;
00999 
01000         *en_sbb = (decode_en_sbb_t)reg_cnfg_sbb1_b.bits.en_sbb1;
01001     }
01002     else if (channel == 2) {
01003         ret = read_register(CNFG_SBB2_B, (uint8_t *)&(reg_cnfg_sbb2_b));
01004         if (ret != MAX77643_2_NO_ERROR) return ret;
01005 
01006         *en_sbb = (decode_en_sbb_t)reg_cnfg_sbb2_b.bits.en_sbb2;
01007     }
01008     else return MAX77643_2_INVALID_DATA;
01009 
01010     return MAX77643_2_NO_ERROR;
01011 }
01012 
01013 int MAX77643_2::set_tv_sbb_dvs(float voltV)
01014 {
01015     uint8_t value;
01016     reg_cnfg_dvs_sbb0_a_t reg_cnfg_dvs_sbb0_a = {0};
01017     float voltmV = voltV * 1000;
01018 
01019     if (voltmV < 500) voltmV = 500;
01020     else if (voltmV > 5500) voltmV = 5500;  
01021 
01022     value = (voltmV - 500) / 25;
01023     
01024     SET_BIT_FIELD(CNFG_DVS_SBB0_A, reg_cnfg_dvs_sbb0_a, reg_cnfg_dvs_sbb0_a.bits.tv_sbb0_dvs, value);
01025     return MAX77643_2_NO_ERROR;
01026 }
01027 
01028 int MAX77643_2::get_tv_sbb_dvs(float *voltV)
01029 {
01030     int ret;
01031     uint8_t bit_value;
01032     reg_cnfg_dvs_sbb0_a_t reg_cnfg_dvs_sbb0_a = {0};
01033 
01034     ret = read_register(CNFG_DVS_SBB0_A, (uint8_t *)&(reg_cnfg_dvs_sbb0_a));
01035     if (ret != MAX77643_2_NO_ERROR) return ret;
01036 
01037     bit_value = (uint8_t)reg_cnfg_dvs_sbb0_a.bits.tv_sbb0_dvs;
01038     
01039     if (bit_value > 200) bit_value = 200;
01040     
01041     *voltV = (bit_value * 0.025f) + 0.5f;
01042     return MAX77643_2_NO_ERROR;
01043 }
01044 
01045 int MAX77643_2::set_tv_ldo(float voltV)
01046 {
01047     int ret;
01048     uint8_t value;
01049     reg_cnfg_ldo0_a_t reg_cnfg_ldo0_a = {0};
01050     float voltmV = voltV * 1000;
01051     const float offsetmV = 1325;
01052     const float incrementmV = 25;
01053     float lower_limit_voltmV = 500, upper_limit_voltmV = 3675;
01054 
01055     ret = read_register(CNFG_LDO0_A, (uint8_t *)&(reg_cnfg_ldo0_a));
01056     if (ret != MAX77643_2_NO_ERROR) return ret;
01057 
01058     if ((uint8_t)reg_cnfg_ldo0_a.bits.tv_ofs_ldo == 1) { // 1.325V Offset
01059         lower_limit_voltmV += offsetmV;
01060         upper_limit_voltmV += offsetmV;
01061     }
01062 
01063     voltmV  = (voltmV < lower_limit_voltmV) ? lower_limit_voltmV : upper_limit_voltmV;
01064     value   = (voltmV - lower_limit_voltmV) / incrementmV;
01065 
01066     SET_BIT_FIELD(CNFG_LDO0_A, reg_cnfg_ldo0_a, reg_cnfg_ldo0_a.bits.tv_ldo0, value);
01067 
01068     return MAX77643_2_NO_ERROR;
01069 }
01070 
01071 int MAX77643_2::get_tv_ldo(float *voltV)
01072 {
01073     int ret;
01074     uint8_t bit_value;
01075     reg_cnfg_ldo0_a_t reg_cnfg_ldo0_a = {0};
01076     float lower_limitV      = 0.5f;
01077     const float incrementV  = 0.025f;
01078     const float offsetV     = 1.325f;
01079 
01080     ret = read_register(CNFG_LDO0_A, (uint8_t *)&(reg_cnfg_ldo0_a));
01081     if (ret != MAX77643_2_NO_ERROR) return ret;
01082 
01083     bit_value = (uint8_t)reg_cnfg_ldo0_a.bits.tv_ldo0;
01084     if ((uint8_t)reg_cnfg_ldo0_a.bits.tv_ofs_ldo == 0) //No Offset
01085         *voltV = (bit_value * incrementV) + lower_limitV;
01086     else //1.325V Offset 
01087         *voltV = (bit_value * incrementV) + (lower_limitV + offsetV);
01088 
01089     return MAX77643_2_NO_ERROR;
01090 }
01091 
01092 int MAX77643_2::set_tv_ofs_ldo(decode_tv_ofs_ldo_t offset)
01093 {   
01094     reg_cnfg_ldo0_a_t reg_cnfg_ldo0_a = {0};
01095     
01096     SET_BIT_FIELD(CNFG_LDO0_A, reg_cnfg_ldo0_a, reg_cnfg_ldo0_a.bits.tv_ofs_ldo, offset);
01097     
01098     return MAX77643_2_NO_ERROR;
01099 }
01100 
01101 int MAX77643_2::get_tv_ofs_ldo(decode_tv_ofs_ldo_t *offset)
01102 {
01103     int ret;
01104     reg_cnfg_ldo0_a_t reg_cnfg_ldo0_a = {0};
01105 
01106     ret = read_register(CNFG_LDO0_A, (uint8_t *)&(reg_cnfg_ldo0_a));
01107     if (ret != MAX77643_2_NO_ERROR) return ret;
01108 
01109     *offset = (decode_tv_ofs_ldo_t)reg_cnfg_ldo0_a.bits.tv_ofs_ldo;
01110 
01111     return MAX77643_2_NO_ERROR;
01112 }
01113 
01114 int MAX77643_2::set_en_ldo(decode_en_ldo_t en_ldo)
01115 {   
01116     reg_cnfg_ldo0_b_t reg_cnfg_ldo0_b = {0};
01117     
01118     SET_BIT_FIELD(CNFG_LDO0_B, reg_cnfg_ldo0_b, reg_cnfg_ldo0_b.bits.en_ldo, en_ldo);
01119     
01120     return MAX77643_2_NO_ERROR;
01121 }
01122 
01123 int MAX77643_2::get_en_ldo(decode_en_ldo_t *en_ldo)
01124 {
01125     int ret;
01126     reg_cnfg_ldo0_b_t reg_cnfg_ldo0_b = {0};
01127 
01128     ret = read_register(CNFG_LDO0_B, (uint8_t *)&(reg_cnfg_ldo0_b));
01129     if (ret != MAX77643_2_NO_ERROR) return ret;
01130 
01131     *en_ldo = (decode_en_ldo_t)reg_cnfg_ldo0_b.bits.en_ldo;
01132 
01133     return MAX77643_2_NO_ERROR;
01134 }
01135 
01136 int MAX77643_2::set_ade_ldo(decode_ade_ldo_t ade_ldo)
01137 {   
01138     reg_cnfg_ldo0_b_t reg_cnfg_ldo0_b = {0};
01139     
01140     SET_BIT_FIELD(CNFG_LDO0_B, reg_cnfg_ldo0_b, reg_cnfg_ldo0_b.bits.ade_ldo, ade_ldo);
01141     
01142     return MAX77643_2_NO_ERROR;
01143 }
01144 
01145 int MAX77643_2::get_ade_ldo(decode_ade_ldo_t *ade_ldo)
01146 {
01147     int ret;
01148     reg_cnfg_ldo0_b_t reg_cnfg_ldo0_b = {0};
01149 
01150     ret = read_register(CNFG_LDO0_B, (uint8_t *)&(reg_cnfg_ldo0_b));
01151     if (ret != MAX77643_2_NO_ERROR) return ret;
01152 
01153     *ade_ldo = (decode_ade_ldo_t)reg_cnfg_ldo0_b.bits.ade_ldo;
01154 
01155     return MAX77643_2_NO_ERROR;
01156 }
01157 
01158 int MAX77643_2::set_ldo_md(decode_ldo_md_t mode)
01159 {   
01160     reg_cnfg_ldo0_b_t reg_cnfg_ldo0_b = {0};
01161     
01162     SET_BIT_FIELD(CNFG_LDO0_B, reg_cnfg_ldo0_b, reg_cnfg_ldo0_b.bits.ldo_md, mode);
01163     
01164     return MAX77643_2_NO_ERROR;
01165 }
01166 
01167 int MAX77643_2::get_ldo_md(decode_ldo_md_t *mode)
01168 {
01169     int ret;
01170     reg_cnfg_ldo0_b_t reg_cnfg_ldo0_b = {0};
01171 
01172     ret = read_register(CNFG_LDO0_B, (uint8_t *)&(reg_cnfg_ldo0_b));
01173     if (ret != MAX77643_2_NO_ERROR) return ret;
01174 
01175     *mode = (decode_ldo_md_t)reg_cnfg_ldo0_b.bits.ldo_md;
01176 
01177     return MAX77643_2_NO_ERROR;
01178 }
01179 
01180 int MAX77643_2::irq_disable_all()
01181 {
01182     int ret;
01183     uint8_t reg = 0;
01184     uint8_t status = 0;
01185 
01186     //Disable Masks in INTM_GLBL1
01187     ret = write_register(INTM_GLBL1, &reg);
01188     if (ret != MAX77643_2_NO_ERROR) return ret;
01189 
01190     //Disable Masks in INTM_GLBL0
01191     ret = write_register(INTM_GLBL0, &reg);
01192     if (ret != MAX77643_2_NO_ERROR) return ret;
01193 
01194     // Clear Interrupt Flags in INT_GLBL1
01195     ret = read_register(INT_GLBL1, &status);
01196     if (ret != MAX77643_2_NO_ERROR) return ret;
01197 
01198     // Clear Interrupt Flags in INT_GLBL0
01199     ret = read_register(INT_GLBL0, &status);
01200     if (ret != MAX77643_2_NO_ERROR) return ret;
01201 
01202     return MAX77643_2_NO_ERROR;
01203 }
01204 
01205 void MAX77643_2::set_interrupt_handler(reg_bit_int_glbl_t id, interrupt_handler_function func, void *cb)
01206 {
01207     interrupt_handler_list[id].func = func;
01208     interrupt_handler_list[id].cb = cb;
01209 }
01210 
01211 void MAX77643_2::post_interrupt_work()
01212 {
01213     int ret;
01214     uint8_t reg = 0,  inten = 0, not_inten = 0, mask = 0;
01215 
01216     while (true) {
01217 
01218         ThisThread::flags_wait_any(POST_INTR_WORK_SIGNAL_ID);
01219 
01220         // Check Interrupt Flags in INT_GLBL0
01221         ret = read_register(INT_GLBL0, &reg);
01222         if (ret != MAX77643_2_NO_ERROR) return;
01223 
01224         ret = read_register(INTM_GLBL0, &inten);
01225         if (ret != MAX77643_2_NO_ERROR) return;
01226 
01227         not_inten = ~inten; // 0 means unmasked.
01228 
01229         for (int i = 0; i < INT_GLBL1_GPI1_F; i++) {
01230             mask = (1 << i);
01231             if ((reg & mask) && (not_inten & mask)) {
01232             if (interrupt_handler_list[i].func != NULL) {
01233                 interrupt_handler_list[i]
01234                 .func(interrupt_handler_list[i].cb);
01235             }
01236             }
01237         }
01238 
01239         // Check Interrupt Flags in INT_GLBL1
01240         ret = read_register(INT_GLBL1, &reg);
01241         if (ret != MAX77643_2_NO_ERROR) return;
01242 
01243         ret = read_register(INTM_GLBL1, &inten);
01244         if (ret != MAX77643_2_NO_ERROR) return;
01245 
01246         not_inten = ~inten; // 0 means unmasked.
01247 
01248         for (int i = INT_GLBL1_GPI1_F; i < INT_CHG_END; i++) {
01249             mask = (1 << (i - INT_GLBL1_GPI1_F));
01250             if ((reg & mask) && (not_inten & mask)) {
01251                 if (interrupt_handler_list[i].func != NULL) {
01252                     interrupt_handler_list[i]
01253                     .func(interrupt_handler_list[i].cb);
01254                 }
01255             }
01256         }
01257     }
01258 }
01259 
01260 void MAX77643_2::interrupt_handler()
01261 {
01262     post_intr_work_thread->flags_set(POST_INTR_WORK_SIGNAL_ID);
01263 }
01264