MAX77734 Demo
Dependencies: max32630fthr USBDevice
Diff: main.cpp
- 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); +}