Maxim Integrated / Mbed OS MAXREFDES220#

Dependencies:   USBDevice max32630fthr

Committer:
Shaun Kelsey
Date:
Thu May 24 14:40:48 2018 -0700
Revision:
5:795cffb6f01a
Parent:
0:da5f5b56060a
Bootloader feature additions

New configuration options for bootloader

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Shaun Kelsey 0:da5f5b56060a 1 /***************************************************************************
Shaun Kelsey 0:da5f5b56060a 2 * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
Shaun Kelsey 0:da5f5b56060a 3 *
Shaun Kelsey 0:da5f5b56060a 4 * Permission is hereby granted, free of charge, to any person obtaining a
Shaun Kelsey 0:da5f5b56060a 5 * copy of this software and associated documentation files (the "Software"),
Shaun Kelsey 0:da5f5b56060a 6 * to deal in the Software without restriction, including without limitation
Shaun Kelsey 0:da5f5b56060a 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
Shaun Kelsey 0:da5f5b56060a 8 * and/or sell copies of the Software, and to permit persons to whom the
Shaun Kelsey 0:da5f5b56060a 9 * Software is furnished to do so, subject to the following conditions:
Shaun Kelsey 0:da5f5b56060a 10 *
Shaun Kelsey 0:da5f5b56060a 11 * The above copyright notice and this permission notice shall be included
Shaun Kelsey 0:da5f5b56060a 12 * in all copies or substantial portions of the Software.
Shaun Kelsey 0:da5f5b56060a 13 *
Shaun Kelsey 0:da5f5b56060a 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
Shaun Kelsey 0:da5f5b56060a 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Shaun Kelsey 0:da5f5b56060a 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
Shaun Kelsey 0:da5f5b56060a 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
Shaun Kelsey 0:da5f5b56060a 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
Shaun Kelsey 0:da5f5b56060a 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
Shaun Kelsey 0:da5f5b56060a 20 * OTHER DEALINGS IN THE SOFTWARE.
Shaun Kelsey 0:da5f5b56060a 21 *
Shaun Kelsey 0:da5f5b56060a 22 * Except as contained in this notice, the name of Maxim Integrated
Shaun Kelsey 0:da5f5b56060a 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
Shaun Kelsey 0:da5f5b56060a 24 * Products, Inc. Branding Policy.
Shaun Kelsey 0:da5f5b56060a 25 *
Shaun Kelsey 0:da5f5b56060a 26 * The mere transfer of this software does not imply any licenses
Shaun Kelsey 0:da5f5b56060a 27 * of trade secrets, proprietary technology, copyrights, patents,
Shaun Kelsey 0:da5f5b56060a 28 * trademarks, maskwork rights, or any other form of intellectual
Shaun Kelsey 0:da5f5b56060a 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
Shaun Kelsey 0:da5f5b56060a 30 * ownership rights.
Shaun Kelsey 0:da5f5b56060a 31 ****************************************************************************
Shaun Kelsey 0:da5f5b56060a 32 */
Shaun Kelsey 0:da5f5b56060a 33
Shaun Kelsey 0:da5f5b56060a 34 #include "utils.h"
Shaun Kelsey 0:da5f5b56060a 35 #include <ctype.h>
Shaun Kelsey 5:795cffb6f01a 36 #include "Peripherals.h"
Shaun Kelsey 0:da5f5b56060a 37
Shaun Kelsey 0:da5f5b56060a 38 /*
Shaun Kelsey 0:da5f5b56060a 39 * @brief Parse DeviceStudio get_reg command
Shaun Kelsey 0:da5f5b56060a 40 * @details format is "get_reg <type> <addr>"
Shaun Kelsey 0:da5f5b56060a 41 *
Shaun Kelsey 0:da5f5b56060a 42 * @return 0 on success, -1 on failure
Shaun Kelsey 0:da5f5b56060a 43 */
Shaun Kelsey 0:da5f5b56060a 44 int parse_get_reg_cmd(const char* str, const char* dev_type, uint8_t* addr)
Shaun Kelsey 0:da5f5b56060a 45 {
Shaun Kelsey 0:da5f5b56060a 46 const char* num_start = str + strlen("get_reg") + strlen(dev_type) + 2;
Shaun Kelsey 0:da5f5b56060a 47 unsigned int addr32;
Shaun Kelsey 0:da5f5b56060a 48
Shaun Kelsey 0:da5f5b56060a 49 int num_found = sscanf(num_start, "%x", &addr32);
Shaun Kelsey 0:da5f5b56060a 50 if (num_found == 1) {
Shaun Kelsey 0:da5f5b56060a 51 *addr = (uint8_t)addr32;
Shaun Kelsey 0:da5f5b56060a 52 return 0;
Shaun Kelsey 0:da5f5b56060a 53 } else {
Shaun Kelsey 0:da5f5b56060a 54 return -1;
Shaun Kelsey 0:da5f5b56060a 55 }
Shaun Kelsey 0:da5f5b56060a 56 }
Shaun Kelsey 0:da5f5b56060a 57
Shaun Kelsey 0:da5f5b56060a 58 /*
Shaun Kelsey 0:da5f5b56060a 59 * @brief Parse DeviceStudio set_reg command
Shaun Kelsey 0:da5f5b56060a 60 * @details format is "set_reg <type> <addr> <val>"
Shaun Kelsey 0:da5f5b56060a 61 *
Shaun Kelsey 0:da5f5b56060a 62 * @return 0 on success, -1 on failure
Shaun Kelsey 0:da5f5b56060a 63 */
Shaun Kelsey 0:da5f5b56060a 64 int parse_set_reg_cmd(const char* str, const char* dev_type, uint8_t* addr, uint8_t* val)
Shaun Kelsey 0:da5f5b56060a 65 {
Shaun Kelsey 0:da5f5b56060a 66 const char* num_start = str + strlen("set_reg") + strlen(dev_type) + 2;
Shaun Kelsey 0:da5f5b56060a 67 unsigned int addr32, val32;
Shaun Kelsey 0:da5f5b56060a 68
Shaun Kelsey 0:da5f5b56060a 69 int num_found = sscanf(num_start, "%x %x", &addr32, &val32);
Shaun Kelsey 0:da5f5b56060a 70 if (num_found == 2) {
Shaun Kelsey 0:da5f5b56060a 71 *addr = (uint8_t)addr32;
Shaun Kelsey 0:da5f5b56060a 72 *val = (uint8_t)val32;
Shaun Kelsey 0:da5f5b56060a 73 return 0;
Shaun Kelsey 0:da5f5b56060a 74 } else {
Shaun Kelsey 0:da5f5b56060a 75 return -1;
Shaun Kelsey 0:da5f5b56060a 76 }
Shaun Kelsey 0:da5f5b56060a 77 }
Shaun Kelsey 0:da5f5b56060a 78 int parse_set_reg_cmd(const char* str, const char* dev_type, uint8_t* addr, uint16_t* val)
Shaun Kelsey 0:da5f5b56060a 79 {
Shaun Kelsey 0:da5f5b56060a 80 const char* num_start = str + strlen("set_reg") + strlen(dev_type) + 2;
Shaun Kelsey 0:da5f5b56060a 81 unsigned int addr32, val32;
Shaun Kelsey 0:da5f5b56060a 82
Shaun Kelsey 0:da5f5b56060a 83 int num_found = sscanf(num_start, "%x %x", &addr32, &val32);
Shaun Kelsey 0:da5f5b56060a 84 if (num_found == 2) {
Shaun Kelsey 0:da5f5b56060a 85 *addr = (uint8_t)addr32;
Shaun Kelsey 5:795cffb6f01a 86 *val = (uint16_t)val32;
Shaun Kelsey 0:da5f5b56060a 87 return 0;
Shaun Kelsey 0:da5f5b56060a 88 } else {
Shaun Kelsey 0:da5f5b56060a 89 return -1;
Shaun Kelsey 0:da5f5b56060a 90 }
Shaun Kelsey 0:da5f5b56060a 91 }
Shaun Kelsey 0:da5f5b56060a 92 int parse_set_reg_cmd(const char* str, const char* dev_type, uint8_t* addr, uint32_t* val)
Shaun Kelsey 0:da5f5b56060a 93 {
Shaun Kelsey 0:da5f5b56060a 94 const char* num_start = str + strlen("set_reg") + strlen(dev_type) + 2;
Shaun Kelsey 0:da5f5b56060a 95 unsigned int addr32, val32;
Shaun Kelsey 0:da5f5b56060a 96
Shaun Kelsey 0:da5f5b56060a 97 int num_found = sscanf(num_start, "%x %x", &addr32, &val32);
Shaun Kelsey 0:da5f5b56060a 98 if (num_found == 2) {
Shaun Kelsey 0:da5f5b56060a 99 *addr = (uint8_t)addr32;
Shaun Kelsey 5:795cffb6f01a 100 *val = val32;
Shaun Kelsey 0:da5f5b56060a 101 return 0;
Shaun Kelsey 0:da5f5b56060a 102 } else {
Shaun Kelsey 0:da5f5b56060a 103 return -1;
Shaun Kelsey 0:da5f5b56060a 104 }
Shaun Kelsey 0:da5f5b56060a 105 }
Shaun Kelsey 5:795cffb6f01a 106
Shaun Kelsey 5:795cffb6f01a 107 int parse_cmd_data(const char* str, const char* cmd, uint8_t *vals, int vals_sz, bool hex)
Shaun Kelsey 5:795cffb6f01a 108 {
Shaun Kelsey 5:795cffb6f01a 109 const char* sptr = str + strlen(cmd);
Shaun Kelsey 5:795cffb6f01a 110 int found = 0;
Shaun Kelsey 5:795cffb6f01a 111 int ssfound;
Shaun Kelsey 5:795cffb6f01a 112 unsigned int val32;
Shaun Kelsey 5:795cffb6f01a 113
Shaun Kelsey 5:795cffb6f01a 114 while (found < vals_sz) {
Shaun Kelsey 5:795cffb6f01a 115 while (*sptr != ' ' && *sptr != '\0') { sptr++; }
Shaun Kelsey 5:795cffb6f01a 116 if (*sptr == '\0')
Shaun Kelsey 5:795cffb6f01a 117 break;
Shaun Kelsey 5:795cffb6f01a 118 sptr++;
Shaun Kelsey 5:795cffb6f01a 119
Shaun Kelsey 5:795cffb6f01a 120 if (hex)
Shaun Kelsey 5:795cffb6f01a 121 ssfound = sscanf(sptr, "%x", &val32);
Shaun Kelsey 5:795cffb6f01a 122 else
Shaun Kelsey 5:795cffb6f01a 123 ssfound = sscanf(sptr, "%d", &val32);
Shaun Kelsey 5:795cffb6f01a 124 if (ssfound != 1)
Shaun Kelsey 5:795cffb6f01a 125 break;
Shaun Kelsey 5:795cffb6f01a 126 *(vals + found) = (uint8_t)val32;
Shaun Kelsey 5:795cffb6f01a 127 found++;
Shaun Kelsey 5:795cffb6f01a 128 }
Shaun Kelsey 5:795cffb6f01a 129
Shaun Kelsey 5:795cffb6f01a 130 return found;
Shaun Kelsey 5:795cffb6f01a 131 }
Shaun Kelsey 5:795cffb6f01a 132
Shaun Kelsey 5:795cffb6f01a 133 int parse_cmd_data(const char* str, const char* cmd, uint16_t *vals, int vals_sz, bool hex)
Shaun Kelsey 5:795cffb6f01a 134 {
Shaun Kelsey 5:795cffb6f01a 135 const char* sptr = str + strlen(cmd);
Shaun Kelsey 5:795cffb6f01a 136 int found = 0;
Shaun Kelsey 5:795cffb6f01a 137 int ssfound;
Shaun Kelsey 5:795cffb6f01a 138 unsigned int val32;
Shaun Kelsey 5:795cffb6f01a 139
Shaun Kelsey 5:795cffb6f01a 140 while (found < vals_sz) {
Shaun Kelsey 5:795cffb6f01a 141 while (*sptr != ' ' && *sptr != '\0') { sptr++; }
Shaun Kelsey 5:795cffb6f01a 142 if (*sptr == '\0')
Shaun Kelsey 5:795cffb6f01a 143 break;
Shaun Kelsey 5:795cffb6f01a 144 sptr++;
Shaun Kelsey 5:795cffb6f01a 145
Shaun Kelsey 5:795cffb6f01a 146 if (hex)
Shaun Kelsey 5:795cffb6f01a 147 ssfound = sscanf(sptr, "%x", &val32);
Shaun Kelsey 5:795cffb6f01a 148 else
Shaun Kelsey 5:795cffb6f01a 149 ssfound = sscanf(sptr, "%d", &val32);
Shaun Kelsey 5:795cffb6f01a 150 if (ssfound != 1)
Shaun Kelsey 5:795cffb6f01a 151 break;
Shaun Kelsey 5:795cffb6f01a 152 *(vals + found) = (uint16_t)val32;
Shaun Kelsey 5:795cffb6f01a 153 found++;
Shaun Kelsey 5:795cffb6f01a 154 }
Shaun Kelsey 5:795cffb6f01a 155
Shaun Kelsey 5:795cffb6f01a 156 return found;
Shaun Kelsey 5:795cffb6f01a 157 }
Shaun Kelsey 5:795cffb6f01a 158
Shaun Kelsey 5:795cffb6f01a 159 int parse_cmd_data(const char* str, const char* cmd, uint32_t *vals, int vals_sz, bool hex)
Shaun Kelsey 5:795cffb6f01a 160 {
Shaun Kelsey 5:795cffb6f01a 161 const char* sptr = str + strlen(cmd);
Shaun Kelsey 5:795cffb6f01a 162 int found = 0;
Shaun Kelsey 5:795cffb6f01a 163 int ssfound;
Shaun Kelsey 5:795cffb6f01a 164
Shaun Kelsey 5:795cffb6f01a 165 while (found < vals_sz) {
Shaun Kelsey 5:795cffb6f01a 166 while (*sptr != ' ' && *sptr != '\0') { sptr++; }
Shaun Kelsey 5:795cffb6f01a 167 if (*sptr == '\0')
Shaun Kelsey 5:795cffb6f01a 168 break;
Shaun Kelsey 5:795cffb6f01a 169 sptr++;
Shaun Kelsey 5:795cffb6f01a 170
Shaun Kelsey 5:795cffb6f01a 171 if (hex)
Shaun Kelsey 5:795cffb6f01a 172 ssfound = sscanf(sptr, "%x", vals + found);
Shaun Kelsey 5:795cffb6f01a 173 else
Shaun Kelsey 5:795cffb6f01a 174 ssfound = sscanf(sptr, "%d", vals + found);
Shaun Kelsey 5:795cffb6f01a 175 if (ssfound != 1)
Shaun Kelsey 5:795cffb6f01a 176 break;
Shaun Kelsey 5:795cffb6f01a 177 found++;
Shaun Kelsey 5:795cffb6f01a 178 }
Shaun Kelsey 5:795cffb6f01a 179
Shaun Kelsey 5:795cffb6f01a 180 return found;
Shaun Kelsey 5:795cffb6f01a 181 }
Shaun Kelsey 5:795cffb6f01a 182
Shaun Kelsey 5:795cffb6f01a 183 bool starts_with(const char* str1, const char* str2)
Shaun Kelsey 5:795cffb6f01a 184 {
Shaun Kelsey 5:795cffb6f01a 185 while (*str1 && *str2) {
Shaun Kelsey 5:795cffb6f01a 186 if (*str1 != *str2)
Shaun Kelsey 5:795cffb6f01a 187 return false;
Shaun Kelsey 5:795cffb6f01a 188 str1++;
Shaun Kelsey 5:795cffb6f01a 189 str2++;
Shaun Kelsey 5:795cffb6f01a 190 }
Shaun Kelsey 5:795cffb6f01a 191
Shaun Kelsey 5:795cffb6f01a 192 if (*str2)
Shaun Kelsey 5:795cffb6f01a 193 return false;
Shaun Kelsey 5:795cffb6f01a 194
Shaun Kelsey 5:795cffb6f01a 195 return true;
Shaun Kelsey 5:795cffb6f01a 196 }