initial commit for hsp3 with secure authenicator

Fork of max20303 by Maxim Integrated

Committer:
phonemacro
Date:
Fri Aug 10 23:22:45 2018 +0000
Revision:
2:912b89c40b72
Parent:
1:0333f77c665f
initial ver, updated for LDO2Config for V2 micro board

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Emre.Eken 1:0333f77c665f 1 /*******************************************************************************
Emre.Eken 1:0333f77c665f 2 * Copyright (C) 2018 Maxim Integrated Products, Inc., All Rights Reserved.
Emre.Eken 1:0333f77c665f 3 *
Emre.Eken 1:0333f77c665f 4 * Permission is hereby granted, free of charge, to any person obtaining a
Emre.Eken 1:0333f77c665f 5 * copy of this software and associated documentation files (the "Software"),
Emre.Eken 1:0333f77c665f 6 * to deal in the Software without restriction, including without limitation
Emre.Eken 1:0333f77c665f 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
Emre.Eken 1:0333f77c665f 8 * and/or sell copies of the Software, and to permit persons to whom the
Emre.Eken 1:0333f77c665f 9 * Software is furnished to do so, subject to the following conditions:
Emre.Eken 1:0333f77c665f 10 *
Emre.Eken 1:0333f77c665f 11 * The above copyright notice and this permission notice shall be included
Emre.Eken 1:0333f77c665f 12 * in all copies or substantial portions of the Software.
Emre.Eken 1:0333f77c665f 13 *
Emre.Eken 1:0333f77c665f 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
Emre.Eken 1:0333f77c665f 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Emre.Eken 1:0333f77c665f 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
Emre.Eken 1:0333f77c665f 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
Emre.Eken 1:0333f77c665f 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
Emre.Eken 1:0333f77c665f 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
Emre.Eken 1:0333f77c665f 20 * OTHER DEALINGS IN THE SOFTWARE.
Emre.Eken 1:0333f77c665f 21 *
Emre.Eken 1:0333f77c665f 22 * Except as contained in this notice, the name of Maxim Integrated
Emre.Eken 1:0333f77c665f 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
Emre.Eken 1:0333f77c665f 24 * Products, Inc. Branding Policy.
Emre.Eken 1:0333f77c665f 25 *
Emre.Eken 1:0333f77c665f 26 * The mere transfer of this software does not imply any licenses
Emre.Eken 1:0333f77c665f 27 * of trade secrets, proprietary technology, copyrights, patents,
Emre.Eken 1:0333f77c665f 28 * trademarks, maskwork rights, or any other form of intellectual
Emre.Eken 1:0333f77c665f 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
Emre.Eken 1:0333f77c665f 30 * ownership rights.
Emre.Eken 1:0333f77c665f 31 *******************************************************************************
Emre.Eken 1:0333f77c665f 32 */
Emre.Eken 1:0333f77c665f 33
Emre.Eken 1:0333f77c665f 34
Emre.Eken 1:0333f77c665f 35 #include "MAX20303.h"
Emre.Eken 1:0333f77c665f 36
Emre.Eken 1:0333f77c665f 37
Emre.Eken 1:0333f77c665f 38 //******************************************************************************
Emre.Eken 1:0333f77c665f 39 MAX20303::MAX20303(I2C *i2c):
Emre.Eken 1:0333f77c665f 40 m_i2c(i2c), m_writeAddress(MAX20303_SLAVE_WR_ADDR),
Emre.Eken 1:0333f77c665f 41 m_readAddress(MAX20303_SLAVE_RD_ADDR)
Emre.Eken 1:0333f77c665f 42 {
Emre.Eken 1:0333f77c665f 43 }
Emre.Eken 1:0333f77c665f 44
Emre.Eken 1:0333f77c665f 45
Emre.Eken 1:0333f77c665f 46 //******************************************************************************
Emre.Eken 1:0333f77c665f 47 MAX20303::~MAX20303(void)
Emre.Eken 1:0333f77c665f 48 {
Emre.Eken 1:0333f77c665f 49 //empty block
Emre.Eken 1:0333f77c665f 50 }
Emre.Eken 1:0333f77c665f 51
Emre.Eken 1:0333f77c665f 52
Emre.Eken 1:0333f77c665f 53 //******************************************************************************
Emre.Eken 1:0333f77c665f 54 int MAX20303::LDO1Config()
Emre.Eken 1:0333f77c665f 55 {
Emre.Eken 1:0333f77c665f 56 int32_t ret = 0;
Emre.Eken 1:0333f77c665f 57 uint8_t val;
Emre.Eken 1:0333f77c665f 58 appcmdoutvalue_ = 0x40;
Emre.Eken 1:0333f77c665f 59 appdatainoutbuffer_[0] = 0x05;
Emre.Eken 1:0333f77c665f 60 appdatainoutbuffer_[1] = 0x34;
Emre.Eken 1:0333f77c665f 61 AppWrite(2);
Emre.Eken 1:0333f77c665f 62
Emre.Eken 1:0333f77c665f 63 return ret;
Emre.Eken 1:0333f77c665f 64 }
Emre.Eken 1:0333f77c665f 65
phonemacro 2:912b89c40b72 66 int MAX20303::LDO2Config()
phonemacro 2:912b89c40b72 67 {
phonemacro 2:912b89c40b72 68 int32_t ret = 0;
phonemacro 2:912b89c40b72 69 uint8_t val;
phonemacro 2:912b89c40b72 70 appcmdoutvalue_ = 0x42;
phonemacro 2:912b89c40b72 71 appdatainoutbuffer_[0] = 0x01;
phonemacro 2:912b89c40b72 72 appdatainoutbuffer_[1] = 0x15; // 0.9V + (0.1V * number) = 3V
phonemacro 2:912b89c40b72 73 AppWrite(2);
phonemacro 2:912b89c40b72 74
phonemacro 2:912b89c40b72 75 return ret;
phonemacro 2:912b89c40b72 76 }
phonemacro 2:912b89c40b72 77
phonemacro 2:912b89c40b72 78
phonemacro 2:912b89c40b72 79
Emre.Eken 1:0333f77c665f 80 //******************************************************************************
Emre.Eken 1:0333f77c665f 81 int MAX20303::writeReg(registers_t reg, uint8_t value)
Emre.Eken 1:0333f77c665f 82 {
Emre.Eken 1:0333f77c665f 83 int32_t ret;
Emre.Eken 1:0333f77c665f 84
Emre.Eken 1:0333f77c665f 85 char cmdData[2] = {reg, value};
Emre.Eken 1:0333f77c665f 86
Emre.Eken 1:0333f77c665f 87 ret = m_i2c->write(m_writeAddress, cmdData, sizeof(cmdData));
Emre.Eken 1:0333f77c665f 88
Emre.Eken 1:0333f77c665f 89 if (ret != 0)
Emre.Eken 1:0333f77c665f 90 return MAX20303_ERROR;
Emre.Eken 1:0333f77c665f 91
Emre.Eken 1:0333f77c665f 92 return MAX20303_NO_ERROR;
Emre.Eken 1:0333f77c665f 93 }
Emre.Eken 1:0333f77c665f 94
Emre.Eken 1:0333f77c665f 95
Emre.Eken 1:0333f77c665f 96 //******************************************************************************
Emre.Eken 1:0333f77c665f 97 int MAX20303::readReg(registers_t reg, uint8_t &value)
Emre.Eken 1:0333f77c665f 98 {
Emre.Eken 1:0333f77c665f 99 int32_t ret;
Emre.Eken 1:0333f77c665f 100
Emre.Eken 1:0333f77c665f 101 char data = reg;
Emre.Eken 1:0333f77c665f 102
Emre.Eken 1:0333f77c665f 103 ret = m_i2c->write(m_writeAddress, &data, sizeof(data));
Emre.Eken 1:0333f77c665f 104 if (ret != 0) {
Emre.Eken 1:0333f77c665f 105 printf("%s - failed - ret: %d\n", __func__);
Emre.Eken 1:0333f77c665f 106 return MAX20303_ERROR;
Emre.Eken 1:0333f77c665f 107 }
Emre.Eken 1:0333f77c665f 108
Emre.Eken 1:0333f77c665f 109 ret = m_i2c->read(m_readAddress, &data, sizeof(data));
Emre.Eken 1:0333f77c665f 110 if (ret != 0) {
Emre.Eken 1:0333f77c665f 111 printf("%s - failed - ret: %d\n", __func__);
Emre.Eken 1:0333f77c665f 112 return MAX20303_ERROR;
Emre.Eken 1:0333f77c665f 113 }
Emre.Eken 1:0333f77c665f 114
Emre.Eken 1:0333f77c665f 115 value = data;
Emre.Eken 1:0333f77c665f 116 printf("MAX20303 read reg[0x%X]=0x%X, ret=%d\r\n", (uint32_t)reg, value, ret);
Emre.Eken 1:0333f77c665f 117 return MAX20303_NO_ERROR;
Emre.Eken 1:0333f77c665f 118 }
Emre.Eken 1:0333f77c665f 119
Emre.Eken 1:0333f77c665f 120 //******************************************************************************
Emre.Eken 1:0333f77c665f 121 int MAX20303::readRegMulti(registers_t reg, uint8_t *value, uint8_t len){
Emre.Eken 1:0333f77c665f 122 int32_t ret;
Emre.Eken 1:0333f77c665f 123 char data = reg;
Emre.Eken 1:0333f77c665f 124
Emre.Eken 1:0333f77c665f 125 ret = m_i2c->write(m_writeAddress, &data, sizeof(data));
Emre.Eken 1:0333f77c665f 126 if (ret != 0) {
Emre.Eken 1:0333f77c665f 127 printf("%s - failed - ret: %d\n", __func__);
Emre.Eken 1:0333f77c665f 128 return MAX20303_ERROR;
Emre.Eken 1:0333f77c665f 129 }
Emre.Eken 1:0333f77c665f 130
Emre.Eken 1:0333f77c665f 131 ret = m_i2c->read(m_readAddress, (char *)value, len);
Emre.Eken 1:0333f77c665f 132 if (ret != 0) {
Emre.Eken 1:0333f77c665f 133 printf("%s - failed - ret: %d\n", __func__);
Emre.Eken 1:0333f77c665f 134 return MAX20303_ERROR;
Emre.Eken 1:0333f77c665f 135 }
Emre.Eken 1:0333f77c665f 136
Emre.Eken 1:0333f77c665f 137 printf("MAX20303 read reg[0x%X]=0x%X, ret=%d\r\n", (uint32_t)reg, value, ret);
Emre.Eken 1:0333f77c665f 138 return MAX20303_NO_ERROR;
Emre.Eken 1:0333f77c665f 139 }
Emre.Eken 1:0333f77c665f 140
Emre.Eken 1:0333f77c665f 141 //******************************************************************************
Emre.Eken 1:0333f77c665f 142 int MAX20303::writeRegMulti(registers_t reg, uint8_t *value, uint8_t len){
Emre.Eken 1:0333f77c665f 143 int32_t ret;
Emre.Eken 1:0333f77c665f 144 i2cbuffer_[0] = reg;
Emre.Eken 1:0333f77c665f 145 memcpy(&i2cbuffer_[1], value, len);
Emre.Eken 1:0333f77c665f 146
Emre.Eken 1:0333f77c665f 147 ret = m_i2c->write(m_writeAddress, (char *)i2cbuffer_, (len+1));
Emre.Eken 1:0333f77c665f 148
Emre.Eken 1:0333f77c665f 149 if (ret != 0)
Emre.Eken 1:0333f77c665f 150 return MAX20303_ERROR;
Emre.Eken 1:0333f77c665f 151
Emre.Eken 1:0333f77c665f 152 return MAX20303_NO_ERROR;
Emre.Eken 1:0333f77c665f 153 }
Emre.Eken 1:0333f77c665f 154 //******************************************************************************
Emre.Eken 1:0333f77c665f 155 int MAX20303::mv2bits(int mV)
Emre.Eken 1:0333f77c665f 156 {
Emre.Eken 1:0333f77c665f 157 int regBits;
Emre.Eken 1:0333f77c665f 158
Emre.Eken 1:0333f77c665f 159 if (( MAX20303_LDO_MIN_MV <= mV) && (mV <= MAX20303_LDO_MAX_MV)) {
Emre.Eken 1:0333f77c665f 160 regBits = (mV - MAX20303_LDO_MIN_MV) / MAX20303_LDO_STEP_MV;
Emre.Eken 1:0333f77c665f 161 } else {
Emre.Eken 1:0333f77c665f 162 return -1;
Emre.Eken 1:0333f77c665f 163 }
Emre.Eken 1:0333f77c665f 164
Emre.Eken 1:0333f77c665f 165 return regBits;
Emre.Eken 1:0333f77c665f 166 }
Emre.Eken 1:0333f77c665f 167 //******************************************************************************
Emre.Eken 1:0333f77c665f 168 int MAX20303::PowerOffthePMIC(){
Emre.Eken 1:0333f77c665f 169 int ret;
Emre.Eken 1:0333f77c665f 170 appdatainoutbuffer_[0] = 0xB2;
Emre.Eken 1:0333f77c665f 171 appcmdoutvalue_ = 0x80;
Emre.Eken 1:0333f77c665f 172 ret = AppWrite(1);
Emre.Eken 1:0333f77c665f 173
Emre.Eken 1:0333f77c665f 174 if(appcmdoutvalue_ != 0x80){
Emre.Eken 1:0333f77c665f 175 ret |= MAX20303_ERROR;
Emre.Eken 1:0333f77c665f 176 }
Emre.Eken 1:0333f77c665f 177
Emre.Eken 1:0333f77c665f 178 return ret;
Emre.Eken 1:0333f77c665f 179 }
Emre.Eken 1:0333f77c665f 180 //******************************************************************************
Emre.Eken 1:0333f77c665f 181 int MAX20303::SoftResetthePMIC(){
Emre.Eken 1:0333f77c665f 182 int ret;
Emre.Eken 1:0333f77c665f 183 appdatainoutbuffer_[0] = 0xB3;
Emre.Eken 1:0333f77c665f 184 appcmdoutvalue_ = 0x81;
Emre.Eken 1:0333f77c665f 185 ret = AppWrite(1);
Emre.Eken 1:0333f77c665f 186
Emre.Eken 1:0333f77c665f 187 if(appcmdoutvalue_ != 0x81){
Emre.Eken 1:0333f77c665f 188 ret |= MAX20303_ERROR;
Emre.Eken 1:0333f77c665f 189 }
Emre.Eken 1:0333f77c665f 190
Emre.Eken 1:0333f77c665f 191 return ret;
Emre.Eken 1:0333f77c665f 192 }
Emre.Eken 1:0333f77c665f 193 //******************************************************************************
Emre.Eken 1:0333f77c665f 194 int MAX20303::HardResetthePMIC(){
Emre.Eken 1:0333f77c665f 195 int ret;
Emre.Eken 1:0333f77c665f 196 appdatainoutbuffer_[0] = 0xB4;
Emre.Eken 1:0333f77c665f 197 appcmdoutvalue_ = 0x82;
Emre.Eken 1:0333f77c665f 198 ret = AppWrite(1);
Emre.Eken 1:0333f77c665f 199
Emre.Eken 1:0333f77c665f 200 if(appcmdoutvalue_ != 0x82){
Emre.Eken 1:0333f77c665f 201 ret |= MAX20303_ERROR;
Emre.Eken 1:0333f77c665f 202 }
Emre.Eken 1:0333f77c665f 203
Emre.Eken 1:0333f77c665f 204 return ret;
Emre.Eken 1:0333f77c665f 205 }
Emre.Eken 1:0333f77c665f 206
Emre.Eken 1:0333f77c665f 207 //******************************************************************************
Emre.Eken 1:0333f77c665f 208 int MAX20303::AppWrite(uint8_t dataoutlen){
Emre.Eken 1:0333f77c665f 209 int ret;
Emre.Eken 1:0333f77c665f 210
Emre.Eken 1:0333f77c665f 211 ret = writeRegMulti(MAX20303::REG_AP_DATOUT0, appdatainoutbuffer_, dataoutlen);
Emre.Eken 1:0333f77c665f 212 ret |= writeReg(MAX20303::REG_AP_CMDOUT, appcmdoutvalue_);
Emre.Eken 1:0333f77c665f 213 wait_ms(10);
Emre.Eken 1:0333f77c665f 214 ret |= readReg(MAX20303::REG_AP_RESPONSE, appcmdoutvalue_);
Emre.Eken 1:0333f77c665f 215
Emre.Eken 1:0333f77c665f 216 if(ret != 0)
Emre.Eken 1:0333f77c665f 217 return MAX20303_ERROR;
Emre.Eken 1:0333f77c665f 218
Emre.Eken 1:0333f77c665f 219 return MAX20303_NO_ERROR;
Emre.Eken 1:0333f77c665f 220 }
Emre.Eken 1:0333f77c665f 221
Emre.Eken 1:0333f77c665f 222
Emre.Eken 1:0333f77c665f 223 //******************************************************************************
Emre.Eken 1:0333f77c665f 224 int MAX20303::AppRead(uint8_t datainlen){
Emre.Eken 1:0333f77c665f 225 int ret;
Emre.Eken 1:0333f77c665f 226
Emre.Eken 1:0333f77c665f 227 ret = writeReg(MAX20303::REG_AP_CMDOUT, appcmdoutvalue_);
Emre.Eken 1:0333f77c665f 228 wait_ms(10);
Emre.Eken 1:0333f77c665f 229 ret |= readRegMulti(MAX20303::REG_AP_RESPONSE, i2cbuffer_, datainlen);
Emre.Eken 1:0333f77c665f 230 if(ret != 0)
Emre.Eken 1:0333f77c665f 231 return MAX20303_ERROR;
Emre.Eken 1:0333f77c665f 232
Emre.Eken 1:0333f77c665f 233 return MAX20303_NO_ERROR;
Emre.Eken 1:0333f77c665f 234 }
Emre.Eken 1:0333f77c665f 235
Emre.Eken 1:0333f77c665f 236 //******************************************************************************
Emre.Eken 1:0333f77c665f 237 char MAX20303::CheckPMICHWID(){
Emre.Eken 1:0333f77c665f 238 int ret;
Emre.Eken 1:0333f77c665f 239 uint8_t value = 0x00;
Emre.Eken 1:0333f77c665f 240
Emre.Eken 1:0333f77c665f 241 ret = readReg(MAX20303::REG_HARDWARE_ID, value);
Emre.Eken 1:0333f77c665f 242 if(ret != MAX20303_NO_ERROR)
Emre.Eken 1:0333f77c665f 243 return false;
Emre.Eken 1:0333f77c665f 244
Emre.Eken 1:0333f77c665f 245 if(value == 0x02)
Emre.Eken 1:0333f77c665f 246 return true;
Emre.Eken 1:0333f77c665f 247 else
Emre.Eken 1:0333f77c665f 248 return false;
Emre.Eken 1:0333f77c665f 249 }
Emre.Eken 1:0333f77c665f 250
Emre.Eken 1:0333f77c665f 251 //******************************************************************************
Emre.Eken 1:0333f77c665f 252 int MAX20303::led0on(char enable) {
Emre.Eken 1:0333f77c665f 253
Emre.Eken 1:0333f77c665f 254 if(enable)
Emre.Eken 1:0333f77c665f 255 return writeReg(REG_LED0_DIRECT, 0x21);
Emre.Eken 1:0333f77c665f 256 else
Emre.Eken 1:0333f77c665f 257 return writeReg(REG_LED0_DIRECT, 0x01);
Emre.Eken 1:0333f77c665f 258 }
Emre.Eken 1:0333f77c665f 259
Emre.Eken 1:0333f77c665f 260 //******************************************************************************
Emre.Eken 1:0333f77c665f 261 int MAX20303::led1on(char enable) {
Emre.Eken 1:0333f77c665f 262 if(enable)
Emre.Eken 1:0333f77c665f 263 return writeReg(REG_LED1_DIRECT, 0x21);
Emre.Eken 1:0333f77c665f 264 else
Emre.Eken 1:0333f77c665f 265 return writeReg(REG_LED1_DIRECT, 0x01);
Emre.Eken 1:0333f77c665f 266 }
Emre.Eken 1:0333f77c665f 267
Emre.Eken 1:0333f77c665f 268 //******************************************************************************
Emre.Eken 1:0333f77c665f 269 int MAX20303::led2on(char enable) {
Emre.Eken 1:0333f77c665f 270 if(enable)
Emre.Eken 1:0333f77c665f 271 return writeReg(REG_LED2_DIRECT, 0x21);
Emre.Eken 1:0333f77c665f 272 else
Emre.Eken 1:0333f77c665f 273 return writeReg(REG_LED2_DIRECT, 0x01);
Emre.Eken 1:0333f77c665f 274 }
Emre.Eken 1:0333f77c665f 275
Emre.Eken 1:0333f77c665f 276
Emre.Eken 1:0333f77c665f 277 //******************************************************************************
Emre.Eken 1:0333f77c665f 278 int MAX20303::BoostEnable(void) {
Emre.Eken 1:0333f77c665f 279
Emre.Eken 1:0333f77c665f 280 writeReg(REG_AP_CMDOUT, 0x30);
Emre.Eken 1:0333f77c665f 281 writeReg(REG_AP_DATOUT3, 0x00); // 00 : 5V
Emre.Eken 1:0333f77c665f 282 writeReg(REG_AP_DATOUT0, 0x01); // Boost Enabled
Emre.Eken 1:0333f77c665f 283
Emre.Eken 1:0333f77c665f 284 return MAX20303_NO_ERROR;
Emre.Eken 1:0333f77c665f 285 }
Emre.Eken 1:0333f77c665f 286
Emre.Eken 1:0333f77c665f 287 //******************************************************************************
Emre.Eken 1:0333f77c665f 288 int MAX20303::BuckBoostEnable(void)
Emre.Eken 1:0333f77c665f 289 {
Emre.Eken 1:0333f77c665f 290 int ret = 0;
Emre.Eken 1:0333f77c665f 291
Emre.Eken 1:0333f77c665f 292 ret |= writeReg( REG_AP_DATOUT0, 0x00); // Reserved = 0x00
Emre.Eken 1:0333f77c665f 293 ret |= writeReg( REG_AP_DATOUT1, 0x04); // BBstlSet = 0b'100 Buck Boost Peak current Limit = 200mA
Emre.Eken 1:0333f77c665f 294 ret |= writeReg( REG_AP_DATOUT2, 0x19); // BBstVSet = 0b'11001 Buck Boost Output Voltage = 5V
Emre.Eken 1:0333f77c665f 295 ret |= writeReg( REG_AP_DATOUT3, 0x01); // BBstRipRed = 1 Ripple Reduction
Emre.Eken 1:0333f77c665f 296 ret |= writeReg( REG_AP_CMDOUT, 0x70);
Emre.Eken 1:0333f77c665f 297 if (ret != 0)
Emre.Eken 1:0333f77c665f 298 return MAX20303_ERROR;
Emre.Eken 1:0333f77c665f 299
Emre.Eken 1:0333f77c665f 300 return MAX20303_NO_ERROR;
Emre.Eken 1:0333f77c665f 301 }