MAX77734 Demo

Dependencies:   max32630fthr USBDevice

Revision:
8:ba930f3cc7fa
Parent:
6:684c51f32c1d
--- a/main.cpp	Mon Feb 06 23:40:01 2017 +0000
+++ b/main.cpp	Thu Dec 27 05:16:14 2018 +0000
@@ -1,6 +1,45 @@
+/*******************************************************************************
+ * Copyright (C) 2018 Maxim Integrated Products, Inc., All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+ * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Maxim Integrated
+ * Products, Inc. shall not be used except as stated in the Maxim Integrated
+ * Products, Inc. Branding Policy.
+ *
+ * The mere transfer of this software does not imply any licenses
+ * of trade secrets, proprietary technology, copyrights, patents,
+ * trademarks, maskwork rights, or any other form of intellectual
+ * property whatsoever. Maxim Integrated Products, Inc. retains all
+ * ownership rights.
+ *******************************************************************************
+ */
 #include "mbed.h"
 #include "max32630fthr.h"
 #include "USBSerial.h"
+#include <string> 
+#include "max77734.h"
+#include "serial_gui_if.h"
+
+void IRQB_FALL_ISR();
+void serial_function_info(SERIAL_GUI_INTERFACE *sif);
+void handle_serial_cmd(SERIAL_GUI_INTERFACE *sif, int id, MAX77734 *max77734);
 
 MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3);
 
@@ -10,29 +49,194 @@
 // Virtual serial port over USB
 USBSerial microUSB;
 
+// Interrupt Pin
+DigitalIn PIN_IRQB(P5_0, PullUp); 
+InterruptIn IRQB(P5_0);
+
+// LED
 DigitalOut rLED(LED1);
 DigitalOut gLED(LED2);
 DigitalOut bLED(LED3);
 
+// I2C Pins
+I2C i2cBus(P5_7, P6_0);
+
+// MAX77734
+MAX77734 max77734(&i2cBus);    
+//******************************************************************************
 // main() runs in its own thread in the OS
 // (note the calls to Thread::wait below for delays)
 int main()
 {
-    int c;
+    int cmd = 0;
 
+    rLED = LED_OFF;
+    gLED = LED_OFF;
+    bLED = LED_OFF;
+    
+    SERIAL_GUI_INTERFACE sif = SERIAL_GUI_INTERFACE(&daplink);
     daplink.printf("daplink serial port\r\n");
     microUSB.printf("micro USB serial port\r\n");
-    rLED = LED_ON;
-    gLED = LED_ON;
-    bLED = LED_OFF;
-
-    rLED = LED_OFF;
-
+        
+    i2cBus.frequency(400000);
+    wait_ms(100);    
+    // register Interrupt Service Routine
+    IRQB.fall(&IRQB_FALL_ISR);
+    // MAX77734 Driver and Initialize
+    max77734.init();
+    // register the information of functions
+    serial_function_info(&sif);
+    
     while(1) {
-        c = microUSB.getc();
-        microUSB.putc(c);
-        daplink.putc(c);
-        bLED = c & 1;
+         
+        gLED = LED_OFF;
+        rLED = LED_ON;
+        if((cmd = sif.get_serial_cmd()) > 0)
+        {
+            handle_serial_cmd(&sif, cmd, &max77734);
+            daplink.printf("cmd id %d handled\n", cmd);
+            
+            rLED = LED_OFF;
+            gLED = LED_ON;
+            //daplink.printf("arg1 %d\n",sif.get_argument(1));
+            //daplink.printf("arg1 %d\n",sif.get_argument(2));            
+            //daplink.printf("arg1 %d %s\n",sif.get_argi(1),sif.get_arg(1));
+        }        
+        
+        wait_ms(50); 
+        daplink.printf("main\n");   
     }
 }
 
+//******************************************************************************
+void IRQB_FALL_ISR()
+{
+    int32_t rData;
+    rData = max77734.interrupt_isr();
+    if(rData < 0){
+        daplink.printf("0x%x = 0x%x", MAX77734::REG_INT_GLBL, rData);
+        daplink.printf("0x%x = 0x%x", MAX77734::REG_INT_CHG,  rData);
+        return;
+    }
+        
+    daplink.printf("0x%x = 0x%x", MAX77734::REG_INT_GLBL, rData & 0xff);
+    daplink.printf("0x%x = 0x%x", MAX77734::REG_INT_CHG, (rData >>8) & 0xff);    
+}
+
+//******************************************************************************
+void handle_serial_cmd(SERIAL_GUI_INTERFACE *sif, int id, MAX77734 *max77734)
+{
+    int reg_no, data, mask, rData;
+        
+    daplink.printf("handle_serial_cmd id  %d\n",id);
+    switch(id){
+    case 0x100:
+        sif->req_function_info();
+        break; 
+        
+    case 0x101://i2c read byte    
+        reg_no = sif->get_argi(1);
+        rData = max77734->i2c_read_byte((MAX77734::REG_TYPE)reg_no);
+        sif->send_reg_value(reg_no, rData);
+        break;
+        
+    case 0x102://i2c write byte
+        reg_no = sif->get_argi(1);
+        data   = sif->get_argi(2);        
+        rData = max77734->i2c_write_byte((MAX77734::REG_TYPE)reg_no,
+                                         (char)data);
+        if(rData < 0)         
+            sif->send_reg_value(reg_no, rData);
+        else 
+            sif->send_reg_value(reg_no, 0);
+        break;
+        
+    case 0x103://i2c update byte
+        reg_no = sif->get_argi(1);
+        data   = sif->get_argi(2);
+        mask   = sif->get_argi(3);
+        rData = max77734->i2c_update_byte((MAX77734::REG_TYPE)reg_no,
+                                         (char)data, (char)mask);
+                                         
+        if(rData < 0)         
+            sif->send_reg_value(reg_no, rData);
+        else 
+            sif->send_reg_value(reg_no, 0);
+        break;
+    
+    default:    
+        rData = max77734->read_register((MAX77734::REG_TYPE) id);
+        sif->send_reg_value(id, rData);
+        break;
+        
+    }    
+}
+
+//******************************************************************************
+void serial_function_info(SERIAL_GUI_INTERFACE *sif)
+{
+    //Function Name, name length, id, argc, arg[n]min, arg[n]max.....
+    sif->set_function_info("req_func_info",
+                          strlen("req_func_info"),   0x100, 0);
+    sif->set_function_info("i2c_read_byte",    
+                          strlen("i2c_read_byte"),   0x101, 2, 0x0, 0xff);
+    sif->set_function_info("i2c_write_byte",   
+                      strlen("i2c_write_byte"), 0x102, 3, 0x0, 0xff, 0x0, 0xff);
+    sif->set_function_info("i2c_update_byte",  strlen("i2c_update_byte"), 
+                                     0x103, 4, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff);
+ 
+    sif->set_function_info("REG_INT_GLBL",     strlen("REG_INT_GLBL"),    
+                                                MAX77734::REG_INT_GLBL,    0);
+    sif->set_function_info("REG_INT_CHG",      strlen("REG_INT_CHG"),     
+                                                MAX77734::REG_INT_CHG,     0);
+    sif->set_function_info("REG_STAT_CHG_A",   strlen("REG_STAT_CHG_A"),  
+                                                MAX77734::REG_STAT_CHG_A,  0);
+    sif->set_function_info("REG_STAT_CHG_B",   strlen("REG_STAT_CHG_B"),  
+                                                MAX77734::REG_STAT_CHG_B,  0);
+    sif->set_function_info("REG_ERCFLAG",      strlen("REG_ERCFLAG"),     
+                                                MAX77734::REG_ERCFLAG,     0);
+    sif->set_function_info("REG_STAT_GLBL",    strlen("REG_STAT_GLBL"),   
+                                                MAX77734::REG_STAT_GLBL,   0);
+    sif->set_function_info("REG_INTM_GLBL",    strlen("REG_INTM_GLBL"),   
+                                                MAX77734::REG_INTM_GLBL,   0);
+    sif->set_function_info("REG_INTM_CHG",     strlen("REG_INTM_CHG"),    
+                                                MAX77734::REG_INTM_CHG,    0);
+    sif->set_function_info("REG_CNFG_GLBL",    strlen("REG_CNFG_GLBL"),   
+                                                MAX77734::REG_CNFG_GLBL,   0);
+    sif->set_function_info("REG_CID",          strlen("REG_CID"),         
+                                                MAX77734::REG_CID,         0);
+    sif->set_function_info("REG_CNFG_WDT",     strlen("REG_CNFG_WDT"),    
+                                                MAX77734::REG_CNFG_WDT,    0);
+    sif->set_function_info("REG_CNFG_CHG_A",   strlen("REG_CNFG_CHG_A"),  
+                                                MAX77734::REG_CNFG_CHG_A,  0);
+    sif->set_function_info("REG_CNFG_CHG_B",   strlen("REG_CNFG_CHG_B"),  
+                                                MAX77734::REG_CNFG_CHG_B,  0);
+    sif->set_function_info("REG_CNFG_CHG_C",   strlen("REG_CNFG_CHG_C"),  
+                                                MAX77734::REG_CNFG_CHG_C,  0);
+    sif->set_function_info("REG_CNFG_CHG_D",   strlen("REG_CNFG_CHG_D"),  
+                                                MAX77734::REG_CNFG_CHG_D,  0);
+    sif->set_function_info("REG_CNFG_CHG_E",   strlen("REG_CNFG_CHG_E"),  
+                                                MAX77734::REG_CNFG_CHG_E,  0);
+    sif->set_function_info("REG_CNFG_CHG_F",   strlen("REG_CNFG_CHG_F"),  
+                                                MAX77734::REG_CNFG_CHG_F,  0);
+    sif->set_function_info("REG_CNFG_CHG_G",   strlen("REG_CNFG_CHG_G"),  
+                                                MAX77734::REG_CNFG_CHG_G,  0);
+    sif->set_function_info("REG_CNFG_CHG_H",   strlen("REG_CNFG_CHG_H"),  
+                                                MAX77734::REG_CNFG_CHG_H,  0);
+    sif->set_function_info("REG_CNFG_CHG_I",   strlen("REG_CNFG_CHG_I"),  
+                                                MAX77734::REG_CNFG_CHG_I,  0);
+    sif->set_function_info("REG_CNFG_LDO_A",   strlen("REG_CNFG_LDO_A"),  
+                                                MAX77734::REG_CNFG_LDO_A,  0);
+    sif->set_function_info("REG_CNFG_LDO_B",   strlen("REG_CNFG_LDO_B"),  
+                                                MAX77734::REG_CNFG_LDO_B,  0);
+    sif->set_function_info("REG_CNFG_SNK1_A",  strlen("REG_CNFG_SNK1_A"), 
+                                                MAX77734::REG_CNFG_SNK1_A, 0);
+    sif->set_function_info("REG_CNFG_SNK1_B",  strlen("REG_CNFG_SNK1_B"), 
+                                                MAX77734::REG_CNFG_SNK1_B, 0);
+    sif->set_function_info("REG_CNFG_SNK2_A",  strlen("REG_CNFG_SNK2_A"), 
+                                                MAX77734::REG_CNFG_SNK2_A, 0);
+    sif->set_function_info("REG_CNFG_SNK2_B",  strlen("REG_CNFG_SNK2_B"), 
+                                                MAX77734::REG_CNFG_SNK2_B, 0);
+    sif->set_function_info("REG_CNFG_SNK_TOP", strlen("REG_CNFG_SNK_TOP"),
+                                                MAX77734::REG_CNFG_SNK_TOP,0);
+}