blob: e7e01fc706434e4864cb04d8dcb5fe6bf640c386 [file] [log] [blame]
Channagoud Kadabi9dc19c82015-04-23 14:20:55 -07001/* Copyright (c) 2015, The Linux Foundation. All rights reserved.
2
3Redistribution and use in source and binary forms, with or without
4modification, are permitted provided that the following conditions are
5met:
6 * Redistributions of source code must retain the above copyright
7 notice, this list of conditions and the following disclaimer.
8 * Redistributions in binary form must reproduce the above
9 copyright notice, this list of conditions and the following
10 disclaimer in the documentation and/or other materials provided
11 with the distribution.
12 * Neither the name of The Linux Foundation nor the names of its
13 contributors may be used to endorse or promote products derived
14 from this software without specific prior written permission.
15
16THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27*/
28
29#include "pm_fg_adc_usr.h"
30#include "pm_fg_driver.h"
Channagoud Kadabi4ab0b172015-07-13 20:12:26 -070031#include "pm_smbchg_driver.h"
32#include "pm_err_flags.h"
33#include "pm_comm.h"
34#include <sys/types.h>
Channagoud Kadabi9dc19c82015-04-23 14:20:55 -070035
36/*===========================================================================
37 TYPE DEFINITIONS
38===========================================================================*/
39#define RAW_IBAT_LSB 39
40#define RAW_VBAT_LSB 39
41#define OFFSET_LSB_NUM 12 //Offset LSB Numerator
42#define OFFSET_LSB_DENOM 10 //Offset LSB Denominator
43#define GAIN_LSB_DENOM 400 // Gain LSB is 0.32/128 = 1/400
Channagoud Kadabi4ab0b172015-07-13 20:12:26 -070044
Channagoud Kadabi9dc19c82015-04-23 14:20:55 -070045/*===========================================================================
46 FUNCTION DEFINITIONS
47===========================================================================*/
48/**
49* @brief This function grant access to FG ADC User access *
50* @details
51* This function grant access to FG ADC User access
52*
53* @param[in] pm_fg_data_type Self
54*
55* @return pm_err_flag_type
56* PM_ERR_FLAG__FEATURE_NOT_SUPPORTED = Feature not available on this
57* version of the PMIC.
58* PM_ERR_FLAG__SUCCESS = SUCCESS.
59*
60*/
61pm_err_flag_type pm_fg_adc_usr_grant_sec_access(pm_fg_data_type *fg_adc_usr_ptr)
62{
63
64 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
65
66 if(NULL == fg_adc_usr_ptr)
67 {
68 err_flag = PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
69 }
70 else
71 {
72 pm_register_address_type sec_access = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_sec_access;
73 err_flag = pm_comm_write_byte(fg_adc_usr_ptr->comm_ptr->slave_id, sec_access, 0xA5, 0);
74 }
75
76 return err_flag;
77}
78
79/* Interrupt */
80pm_err_flag_type pm_fg_adc_usr_irq_enable(uint32 pmic_device, pm_fg_adc_usr_irq_type irq, boolean enable)
81{
82 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
83 pm_register_address_type irq_reg;
84 pm_register_data_type data = 1 << irq;
85
86 pm_fg_data_type* fg_adc_usr_ptr = pm_fg_get_data(pmic_device);
87
88 if (NULL == fg_adc_usr_ptr)
89 {
90 err_flag = PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
91 }
92 else if (irq >= PM_FG_ADC_USR_IRQ_INVALID)
93 {
94 err_flag = PM_ERR_FLAG__PAR2_OUT_OF_RANGE;
95 }
96 else
97 {
98 if (enable)
99 {
100 irq_reg = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->int_en_set;
101 }
102 else
103 {
104 irq_reg = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->int_en_clr;
105 }
106
107 err_flag = pm_comm_write_byte(fg_adc_usr_ptr->comm_ptr->slave_id, irq_reg, data, 0);
108 }
109 return err_flag;
110}
111
112pm_err_flag_type pm_fg_adc_usr_irq_clear(uint32 pmic_device, pm_fg_adc_usr_irq_type irq)
113{
114 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
115 pm_register_data_type data = 1 << irq;
116 pm_register_address_type int_latched_clr;
117 pm_fg_data_type* fg_adc_usr_ptr = pm_fg_get_data(pmic_device);
118
119 if (NULL == fg_adc_usr_ptr)
120 {
121 err_flag = PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
122 }
123 else if (irq >= PM_FG_ADC_USR_IRQ_INVALID)
124 {
125 err_flag = PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
126 }
127 else
128 {
129 int_latched_clr = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->int_latched_clr;
130 err_flag = pm_comm_write_byte(fg_adc_usr_ptr->comm_ptr->slave_id, int_latched_clr, data, 0);
131 }
132
133 return err_flag;
134}
135
136
137pm_err_flag_type pm_fg_adc_usr_irq_set_trigger(uint32 pmic_device, pm_fg_adc_usr_irq_type irq, pm_irq_trigger_type trigger)
138{
139 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
140 uint8 mask = 1 << irq;
141 pm_register_data_type set_type, polarity_high, polarity_low;
142 pm_register_address_type int_set_type, int_polarity_high, int_polarity_low;
143
144 pm_fg_data_type* fg_adc_usr_ptr = pm_fg_get_data(pmic_device);
145
146 if (NULL == fg_adc_usr_ptr)
147 {
148 err_flag = PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
149 }
150 else if (irq >= PM_FG_ADC_USR_IRQ_INVALID)
151 {
152 err_flag = PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
153 }
154 else
155 {
156 int_set_type = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->int_set_type;
157 int_polarity_high = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->int_polarity_high;
158 int_polarity_low = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->int_polarity_low;
159
160 switch (trigger)
161 {
162 case PM_IRQ_TRIGGER_ACTIVE_LOW:
163 set_type = 0x00;
164 polarity_high = 0x00;
165 polarity_low = 0xFF;
166 break;
167 case PM_IRQ_TRIGGER_ACTIVE_HIGH:
168 set_type = 0x00;
169 polarity_high = 0xFF;
170 polarity_low = 0x00;
171 break;
172 case PM_IRQ_TRIGGER_RISING_EDGE:
173 set_type = 0xFF;
174 polarity_high = 0xFF;
175 polarity_low = 0x00;
176 break;
177 case PM_IRQ_TRIGGER_FALLING_EDGE:
178 set_type = 0xFF;
179 polarity_high = 0x00;
180 polarity_low = 0xFF;
181 break;
182 case PM_IRQ_TRIGGER_DUAL_EDGE:
183 set_type = 0xFF;
184 polarity_high = 0xFF;
185 polarity_low = 0xFF;
186 break;
187 default:
188 return PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
189 }
190 err_flag = pm_comm_write_byte_mask(fg_adc_usr_ptr->comm_ptr->slave_id, int_set_type, mask, set_type, 0);
191 err_flag |= pm_comm_write_byte_mask(fg_adc_usr_ptr->comm_ptr->slave_id, int_polarity_high, mask, polarity_high, 0);
192 err_flag |= pm_comm_write_byte_mask(fg_adc_usr_ptr->comm_ptr->slave_id, int_polarity_low, mask, polarity_low, 0);
193 }
194
195 return err_flag;
196}
197
198
199pm_err_flag_type pm_fg_adc_usr_irq_status(uint32 pmic_device, pm_fg_adc_usr_irq_type irq, pm_irq_status_type type, boolean *status)
200{
201 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
202 pm_register_data_type data;
203 uint8 mask = 1 << irq;
204 pm_register_address_type int_sts;
205 pm_fg_data_type* fg_adc_usr_ptr = pm_fg_get_data(pmic_device);
206
207 if (NULL == fg_adc_usr_ptr)
208 {
209 err_flag = PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
210 }
211 else if (irq >= PM_FG_ADC_USR_IRQ_INVALID)
212 {
213 err_flag = PM_ERR_FLAG__PAR2_OUT_OF_RANGE;
214 }
215 else
216 {
217 switch (type)
218 {
219 case PM_IRQ_STATUS_RT:
220 int_sts = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->int_rt_sts;
221 break;
222 case PM_IRQ_STATUS_LATCHED:
223 int_sts = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->int_latched_sts;
224 break;
225 case PM_IRQ_STATUS_PENDING:
226 int_sts = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->int_pending_sts;
227 break;
228 default:
229 return PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
230 }
231
232 err_flag = pm_comm_read_byte_mask(fg_adc_usr_ptr->comm_ptr->slave_id, int_sts, mask, &data, 0);
233 *status = data ? TRUE : FALSE;
234 }
235
236 return err_flag;
237}
238
239
240
241/**
242* @brief This function enable/disables BMS Fule Gauge Algorithm BCL (battery current limiting s/w use) *
243* @details
244* This function enable/disables BMS Fule Gauge Algorithm BCL (battery current limiting s/w use)
245*
246* @param[in] pmic_device_index. Primary: 0 Secondary: 1
247* @param[in]enable enable/disable BCL monitoring
248*
249* @return pm_err_flag_type
250* PM_ERR_FLAG__FEATURE_NOT_SUPPORTED = Feature not available on this
251* version of the PMIC.
252* PM_ERR_FLAG__SUCCESS = SUCCESS.
253*
254*/
255pm_err_flag_type pm_fg_adc_usr_enable_bcl_monitoring(uint32 pmic_device, boolean enable)
256{
257 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
258 pm_register_address_type fg_adc_usr_bcl_monitoring = 0x00;
259 uint8 mask = 0x80;
260
261 pm_fg_data_type* fg_adc_usr_ptr = pm_fg_get_data(pmic_device);
262
263 if (NULL == fg_adc_usr_ptr)
264 {
265 return PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
266 }
267 else
268 {
269 fg_adc_usr_bcl_monitoring = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_en_ctl;
270 err_flag = pm_comm_write_byte_mask(fg_adc_usr_ptr->comm_ptr->slave_id, fg_adc_usr_bcl_monitoring, mask, (pm_register_data_type)(enable << 7), 0);
271 }
272
273 return err_flag;
274
275}
276
277
278/**
279* @brief This function returns BMS Fule Gauge BCL (battery current limiting s/w use) *
280* @details
281* This function returns BMS Fule Gauge BCL (battery current limiting s/w use)
282*
283* @param[in] pmic_device_index. Primary: 0 Secondary: 1
284* @param[out]enable BCL monitoring sts
285*
286* @return pm_err_flag_type
287* PM_ERR_FLAG__FEATURE_NOT_SUPPORTED = Feature not available on this
288* version of the PMIC.
289* PM_ERR_FLAG__SUCCESS = SUCCESS.
290*
291*/
292pm_err_flag_type pm_fg_adc_usr_get_bcl_monitoring_sts(uint32 pmic_device, boolean *enable)
293{
294 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
295 pm_register_address_type fg_adc_usr_bcl_monitoring = 0x00;
296 pm_register_data_type data = 0x00;
297 uint8 mask = 0x80;
298
299 pm_fg_data_type* fg_adc_usr_ptr = pm_fg_get_data(pmic_device);
300
301 if (NULL == fg_adc_usr_ptr)
302 {
303 return PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
304 }
305 else
306 {
307 fg_adc_usr_bcl_monitoring = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_en_ctl;
308 err_flag = pm_comm_read_byte_mask(fg_adc_usr_ptr->comm_ptr->slave_id, fg_adc_usr_bcl_monitoring, mask, &data, 0);
309 *enable = (boolean )data;
310 }
311
312 return err_flag;
313
314}
315
316
317/**
318* @brief This function returns of status of adc_usrery parameter update request *
319* @details
320* This function returns of status of battery parameter update request (VBAT, IBAT, VBAT_CP, IBAT_CP, IBAT_MAX, IBAT_MAX_CP, VBAT_MIN, VBAT_MIN_CP)
321*
322* @param[in] pmic_device_index. Primary: 0 Secondary: 1
323* @param[in]enable enable/disable BCL monitoring
324*
325* @return pm_err_flag_type
326* PM_ERR_FLAG__FEATURE_NOT_SUPPORTED = Feature not available on this
327* version of the PMIC.
328* PM_ERR_FLAG__SUCCESS = SUCCESS.
329*
330*/
331pm_err_flag_type pm_fg_adc_usr_get_access_bat_req_sts(uint32 pmic_device, boolean *enable)
332{
333
334 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
335 pm_register_address_type fg_adc_usr_bat_req_sts = 0x00;
336 pm_register_data_type data = 0x00;
337 uint8 mask = 0x80;
338
339 pm_fg_data_type* fg_adc_usr_ptr = pm_fg_get_data(pmic_device);
340
341 if (NULL == fg_adc_usr_ptr)
342 {
343 return PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
344 }
345 else
346 {
347 fg_adc_usr_bat_req_sts = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_access_bat_req;
348 err_flag = pm_comm_read_byte_mask(fg_adc_usr_ptr->comm_ptr->slave_id, fg_adc_usr_bat_req_sts, mask, &data, 0);
349 *enable = (boolean )data;
350 }
351
352 return err_flag;
353
354}
355
356
357
358/**
359* @brief This function enable/disables the updates of VBAT, IBAT, VBAT_CP, IBAT_CP, IBAT_MAX, IBAT_MAX_CP, VBAT_MIN, VBAT_MIN_CP *
360* @details
361* This function enable/disables the updates of VBAT, IBAT, VBAT_CP, IBAT_CP, IBAT_MAX, IBAT_MAX_CP, VBAT_MIN, VBAT_MIN_CP
362*
363* @param[in] pmic_device_index. Primary: 0 Secondary: 1
364* @param[in]enable enable/disable BCL monitoring
365*
366* @return pm_err_flag_type
367* PM_ERR_FLAG__FEATURE_NOT_SUPPORTED = Feature not available on this
368* version of the PMIC.
369* PM_ERR_FLAG__SUCCESS = SUCCESS.
370*
371*/
372pm_err_flag_type pm_fg_adc_usr_set_access_bat_req(uint32 pmic_device, boolean enable)
373{
374 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
375 pm_register_address_type fg_adc_usr_bat_req_sts = 0x00;
376 uint8 mask = 0x80;
377
378 pm_fg_data_type* fg_adc_usr_ptr = pm_fg_get_data(pmic_device);
379
380 if (NULL == fg_adc_usr_ptr)
381 {
382 return PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
383 }
384 else
385 {
386 fg_adc_usr_bat_req_sts = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_access_bat_req;
387 err_flag = pm_comm_write_byte_mask(fg_adc_usr_ptr->comm_ptr->slave_id, fg_adc_usr_bat_req_sts, mask, (pm_register_data_type)enable, 0);
388 }
389
390 return err_flag;
391}
392
393
394/**
395* @brief This function returns the grant status of battery parameter update request *
396* @details
397* This function returns of status of battery parameter update request (VBAT, IBAT, VBAT_CP, IBAT_CP, IBAT_MAX, IBAT_MAX_CP, VBAT_MIN, VBAT_MIN_CP)
398*
399* @param[in] pmic_device_index. Primary: 0 Secondary: 1
400* @param[in]enable enable/disable BCL monitoring
401*
402* @return pm_err_flag_type
403* PM_ERR_FLAG__FEATURE_NOT_SUPPORTED = Feature not available on this
404* version of the PMIC.
405* PM_ERR_FLAG__SUCCESS = SUCCESS.
406*
407*/
408pm_err_flag_type pm_fg_adc_usr_get_access_bat_grnt_sts(uint32 pmic_device, boolean *enable)
409{
410 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
411 pm_register_address_type fg_adc_usr_bat_grnt_sts = 0x00;
412 pm_register_data_type data = 0x00;
413 uint8 mask = 0x80;
414
415 pm_fg_data_type* fg_adc_usr_ptr = pm_fg_get_data(pmic_device);
416
417 if (NULL == fg_adc_usr_ptr)
418 {
419 return PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
420 }
421 else
422 {
423 fg_adc_usr_bat_grnt_sts = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_access_bat_grnt;
424 err_flag = pm_comm_read_byte_mask(fg_adc_usr_ptr->comm_ptr->slave_id, fg_adc_usr_bat_grnt_sts, mask, &data, 0);
425 *enable = (boolean )data;
426 }
427
428 return err_flag;
429
430}
431
432
433
434/**
435* @brief This function returns status RDY bit after battery parameter update request is serviced *
436* @details
437* After the first readings from ADC are obtained, this bit is set to 1; At reset and shutdown, this bit gets automatically cleared
438*
439* @param[in] pmic_device_index. Primary: 0 Secondary: 1
440* @param[in]enable enable/disable BCL monitoring
441*
442* @return pm_err_flag_type
443* PM_ERR_FLAG__FEATURE_NOT_SUPPORTED = Feature not available on this
444* version of the PMIC.
445* PM_ERR_FLAG__SUCCESS = SUCCESS.
446*
447*/
448pm_err_flag_type pm_fg_adc_usr_get_bcl_values(uint32 pmic_device, boolean *enable)
449{
450 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
451 pm_register_address_type fg_adc_usr_bcl_values = 0x00;
452 pm_register_data_type data = 0x00;
453 uint8 mask = 0x80;
454
455 pm_fg_data_type* fg_adc_usr_ptr = pm_fg_get_data(pmic_device);
456
457 if (NULL == fg_adc_usr_ptr)
458 {
459 return PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
460 }
461 else
462 {
463 fg_adc_usr_bcl_values = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_bcl_values;
464 err_flag = pm_comm_read_byte_mask(fg_adc_usr_ptr->comm_ptr->slave_id, fg_adc_usr_bcl_values, mask, &data, 0);
465 *enable = (boolean )data;
466 }
467
468 return err_flag;
469
470}
471
472
473/**
474* @brief This function returns battery ADC Voltage *
475* @details
476* 8 bit signed partial ADC value, MSB = 0 is positive voltage (positive number), only positive voltages are captured, 1 LSB = 39 mV
477*
478* @param[in] pmic_device_index. Primary: 0 Secondary: 1
479* @param[out]vbat_adc Battery Voltage
480*
481* @return pm_err_flag_type
482* PM_ERR_FLAG__FEATURE_NOT_SUPPORTED = Feature not available on this
483* version of the PMIC.
484* PM_ERR_FLAG__SUCCESS = SUCCESS.
485*
486*/
487pm_err_flag_type pm_fg_adc_usr_get_vbat(uint32 pmic_device, uint32 *vbat_adc)
488{
489 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
490 pm_register_address_type fg_adc_usr_vbat = 0x00;
491 pm_register_address_type fg_adc_usr_vbat_cp = 0x00;
492 pm_register_data_type data = 0x00;
493 pm_register_data_type data1 = 0x00;
494
495 int8 temp_data = 0;
496 int32 temp_data1 = 0;
497
498 //Compare data thrice in copy register and original register to make sure we have right data
499 uint32 total_count = 3;
500 uint32 count = 0;
501
502 pm_fg_data_type* fg_adc_usr_ptr = pm_fg_get_data(pmic_device);
503
504 *vbat_adc = 0;
505
506 if (NULL == fg_adc_usr_ptr)
507 {
508 return PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
509 }
510 else
511 {
512 fg_adc_usr_vbat = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_vbat;
513 fg_adc_usr_vbat_cp = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_vbat_cp;
514
515 do {
516 err_flag = pm_comm_read_byte(fg_adc_usr_ptr->comm_ptr->slave_id, fg_adc_usr_vbat, &data1, 0);
517 err_flag = pm_comm_read_byte(fg_adc_usr_ptr->comm_ptr->slave_id, fg_adc_usr_vbat_cp, &data, 0);
518
519 if(data == data1)
520 {
521 break;
522 }
523
524 if((total_count - 1) == count)
525 {
526 data = 0;
527 err_flag = PM_ERR_FLAG__INVALID;
528 }
529
530 count++;
531
532 }while ( count < total_count);
533
534 //Convert uint8 to int8
535 temp_data = data;
536
537 //Convert int8 to int32
538 temp_data1 = temp_data;
539
540 *vbat_adc = temp_data1 * RAW_VBAT_LSB;
541 }
542
543 return err_flag;
544}
545
546
547/**
548* @brief This function returns battery ADC Current *
549* @details
550* 8 bit signed partial ADC value, MSB = 0 is discharging current (positive number), only discharging currents are captured, 1 LSB = 39 mA
551*
552* @param[in] pmic_device_index. Primary: 0 Secondary: 1
553* @param[out]ibat_adc Battery Current
554*
555* @return pm_err_flag_type
556* PM_ERR_FLAG__FEATURE_NOT_SUPPORTED = Feature not available on this
557* version of the PMIC.
558* PM_ERR_FLAG__SUCCESS = SUCCESS.
559*
560*/
561pm_err_flag_type pm_fg_adc_usr_get_ibat(uint32 pmic_device, int32 *ibat_adc)
562{
563 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
564 pm_register_address_type fg_adc_usr_ibat = 0x00;
565 pm_register_address_type fg_adc_usr_ibat_cp = 0x00;
566 pm_register_data_type data = 0x00;
567 pm_register_data_type data1 = 0x00;
568
569 int8 temp_data = 0;
570 int32 temp_data1 = 0;
571
572 uint32 count = 0;
573 //Compare data thrice in copy register and original register to make sure we have right data
574 uint32 total_count = 3;
575
576 pm_fg_data_type *fg_adc_usr_ptr = pm_fg_get_data(pmic_device);
577
578 if (NULL == fg_adc_usr_ptr)
579 {
580 return PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
581 }
582 else if (NULL == ibat_adc)
583 {
584 err_flag = PM_ERR_FLAG__PAR2_OUT_OF_RANGE;
585 }
586 else
587 {
588 fg_adc_usr_ibat = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_ibat;
589 fg_adc_usr_ibat_cp = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_ibat_cp;
590
591 do
592 {
593 /*Read original register and copy register to make sure available data is reliable*/
594 err_flag = pm_comm_read_byte(fg_adc_usr_ptr->comm_ptr->slave_id, fg_adc_usr_ibat, &data1, 0);
595 err_flag = pm_comm_read_byte(fg_adc_usr_ptr->comm_ptr->slave_id, fg_adc_usr_ibat_cp, &data, 0);
596
597 if (data1 == data)
598 {
599 break;
600 }
601 if ((total_count - 1) == count)
602 {
603 err_flag = PM_ERR_FLAG__INVALID;
604 }
605 count++;
606
607 }
608 while (count < total_count);
609
610 //Convert uint8 to int8
611 temp_data = data;
612
613 //Convert int8 to int32
614 temp_data1 = temp_data;
615
616 *ibat_adc = temp_data1 * RAW_IBAT_LSB;
617 }
618
619 return err_flag;
620}
621
622
623/**
624* @brief This function returns minimum battery Voltage *
625* @details
626* Running Vbat Min stored and then cleared by SW
627*
628* @param[in] pmic_device_index. Primary: 0 Secondary: 1
629* @param[out]vbat_min Battery Minimum Voltage
630*
631* @return pm_err_flag_type
632* PM_ERR_FLAG__FEATURE_NOT_SUPPORTED = Feature not available on this
633* version of the PMIC.
634* PM_ERR_FLAG__SUCCESS = SUCCESS.
635*
636*/
637pm_err_flag_type pm_fg_adc_usr_get_vbat_min(uint32 pmic_device, uint8 *vbat_min)
638{
639 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
640 pm_register_address_type fg_adc_usr_vbat_min = 0x00;
641 pm_register_data_type data = 0x00;
642
643 pm_fg_data_type* fg_adc_usr_ptr = pm_fg_get_data(pmic_device);
644
645 if (NULL == fg_adc_usr_ptr)
646 {
647 return PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
648 }
649 else
650 {
651 fg_adc_usr_vbat_min = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_vbat_min;
652 err_flag = pm_comm_read_byte(fg_adc_usr_ptr->comm_ptr->slave_id, fg_adc_usr_vbat_min, &data, 0);
653 *vbat_min = data;
654 }
655
656 return err_flag;
657
658}
659
660/**
661* @brief This function returns max battery current *
662* @details
663* Running Ibat Min stored and then cleared by SW
664*
665* @param[in] pmic_device_index. Primary: 0 Secondary: 1
666* @param[out]ibat_max Battery Maximum Current
667*
668* @return pm_err_flag_type
669* PM_ERR_FLAG__FEATURE_NOT_SUPPORTED = Feature not available on this
670* version of the PMIC.
671* PM_ERR_FLAG__SUCCESS = SUCCESS.
672*
673*/
674pm_err_flag_type pm_fg_adc_usr_get_ibat_max(uint32 pmic_device, uint8 *ibat_max)
675{
676 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
677 pm_register_address_type fg_adc_usr_ibat_max = 0x00;
678 pm_register_data_type data = 0x00;
679
680 pm_fg_data_type* fg_adc_usr_ptr = pm_fg_get_data(pmic_device);
681
682 if (NULL == fg_adc_usr_ptr)
683 {
684 return PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
685 }
686 else
687 {
688 fg_adc_usr_ibat_max = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_ibat_max;
689 err_flag = pm_comm_read_byte(fg_adc_usr_ptr->comm_ptr->slave_id, fg_adc_usr_ibat_max, &data, 0);
690 *ibat_max = (uint8)data;
691 }
692
693 return err_flag;
694
695}
696
697
698/**
699* @brief This function returns copy of minimum battery Voltage *
700* @details
701* Running Vbat Min stored and then cleared by SW
702*
703* @param[in] pmic_device_index. Primary: 0 Secondary: 1
704* @param[out]vbat_min Battery Minimum Voltage
705*
706* @return pm_err_flag_type
707* PM_ERR_FLAG__FEATURE_NOT_SUPPORTED = Feature not available on this
708* version of the PMIC.
709* PM_ERR_FLAG__SUCCESS = SUCCESS.
710*
711*/
712pm_err_flag_type pm_fg_adc_usr_get_vbat_min_cp(uint32 pmic_device, uint8 *vbat_min_cp)
713{
714 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
715 pm_register_address_type fg_adc_usr_vbat_min_cp = 0x00;
716 pm_register_data_type data = 0x00;
717
718 pm_fg_data_type* fg_adc_usr_ptr = pm_fg_get_data(pmic_device);
719
720 if (NULL == fg_adc_usr_ptr)
721 {
722 return PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
723 }
724 else
725 {
726 fg_adc_usr_vbat_min_cp = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_vbat_min_cp;
727 err_flag = pm_comm_read_byte(fg_adc_usr_ptr->comm_ptr->slave_id, fg_adc_usr_vbat_min_cp, &data, 0);
728 *vbat_min_cp = (uint8)data;
729 }
730
731 return err_flag;
732
733}
734
735/**
736* @brief This function returns copy of max battery current *
737* @details
738* Running Ibat Min stored and then cleared by SW
739*
740* @param[in] pmic_device_index. Primary: 0 Secondary: 1
741* @param[out]ibat_max Battery Maximum Current
742*
743* @return pm_err_flag_type
744* PM_ERR_FLAG__FEATURE_NOT_SUPPORTED = Feature not available on this
745* version of the PMIC.
746* PM_ERR_FLAG__SUCCESS = SUCCESS.
747*
748*/
749pm_err_flag_type pm_fg_adc_usr_get_ibat_max_cp(uint32 pmic_device, uint8 *ibat_max_cp)
750{
751 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
752 pm_register_address_type fg_adc_usr_ibat_max_cp = 0x00;
753 pm_register_data_type data = 0x00;
754
755 pm_fg_data_type* fg_adc_usr_ptr = pm_fg_get_data(pmic_device);
756
757 if (NULL == fg_adc_usr_ptr)
758 {
759 return PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
760 }
761 else
762 {
763 fg_adc_usr_ibat_max_cp = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_ibat_max_cp;
764 err_flag = pm_comm_read_byte(fg_adc_usr_ptr->comm_ptr->slave_id, fg_adc_usr_ibat_max_cp, &data, 0);
765 *ibat_max_cp = (uint8)data;
766 }
767
768 return err_flag;
769
770}
771
772
773/**
774* @brief This function returns Battery Resitance in HALF encoding *
775* @details
776* HALF-FLOATING point encoding, 15:11 exp, bit 10 sign, 9:0 mantissa, 1=1 ohm, refer to MDOS for encoding info
777*
778* @param[in] pmic_device_index. Primary: 0 Secondary: 1
779* @param[out]battResistance Battery Resistance
780*
781* @return pm_err_flag_type
782* PM_ERR_FLAG__FEATURE_NOT_SUPPORTED = Feature not available on this
783* version of the PMIC.
784* PM_ERR_FLAG__SUCCESS = SUCCESS.
785*
786*/
787pm_err_flag_type pm_fg_adc_usr_get_half_point_encoding(uint32 pmic_device, uint16 *battResistance)
788{
789
790 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
791 pm_register_address_type addr_msb;
792 pm_register_address_type addr_lsb;
793 pm_register_data_type data_0 = 0x00;
794 pm_register_data_type data_1 = 0x00;
795 uint16 battR = 0x0000;
796
797 pm_fg_data_type* fg_adc_usr_ptr = pm_fg_get_data(pmic_device);
798
799 if (NULL == fg_adc_usr_ptr)
800 {
801 return PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
802 }
803 else
804 {
805 addr_lsb = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_bat_res_7_0;
806 addr_msb = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_bat_res_15_8;
807 err_flag = pm_comm_read_byte(fg_adc_usr_ptr->comm_ptr->slave_id, addr_lsb, &data_0, 0);
808 err_flag = pm_comm_read_byte(fg_adc_usr_ptr->comm_ptr->slave_id, addr_msb, &data_1, 0);
809
810 battR = ((data_1 | battR) << 8) | (data_0 | battR);
811
812 *battResistance = battR;
813 }
814
815 return err_flag;
816
817}
818
819
820/**
821* @brief This function returns BCL mode status *
822* @details
823* This function returns BCL mode status
824*
825* @param[in] pmic_device_index. Primary: 0 Secondary: 1
826* @param[out] bcl_mode BCL mode
827*
828* @return pm_err_flag_type
829* PM_ERR_FLAG__FEATURE_NOT_SUPPORTED = Feature not available on this
830* version of the PMIC.
831* PM_ERR_FLAG__SUCCESS = SUCCESS.
832*
833*/
834pm_err_flag_type pm_fg_adc_usr_get_bcl_mode(uint32 pmic_device, pm_fg_adc_usr_bcl_mode_sts *bcl_mode)
835{
836 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
837 pm_register_address_type fg_adc_usr_bcl_values = 0x00;
838 pm_register_data_type data = 0x00;
839
840 pm_fg_data_type* fg_adc_usr_ptr = pm_fg_get_data(pmic_device);
841
842 if (NULL == fg_adc_usr_ptr)
843 {
844 return PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
845 }
846 else
847 {
848 fg_adc_usr_bcl_values = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_bcl_values;
849 err_flag = pm_comm_read_byte(fg_adc_usr_ptr->comm_ptr->slave_id, fg_adc_usr_bcl_values, &data, 0);
850 data = data >> 0x06;
851 *bcl_mode = (pm_fg_adc_usr_bcl_mode_sts)data;
852 }
853
854 return err_flag;
855
856}
857
858
859/**
860* @brief This function returns votlage gain correction value for battery voltage *
861* @details
862* This function returns gain correction value for battery
863*
864* @param[in] pmic_device_index. Primary: 0 Secondary: 1
865* @param[in] gainCorrection for battery volatge
866*
867* @return pm_err_flag_type
868* PM_ERR_FLAG__FEATURE_NOT_SUPPORTED = Feature not available on this
869* version of the PMIC.
870* PM_ERR_FLAG__SUCCESS = SUCCESS.
871*
872*/
873pm_err_flag_type pm_fg_adc_usr_get_bcl_v_gain_batt(uint32 pmic_device, int32 *v_gain_correction)
874{
875 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
876 pm_register_address_type fg_adc_usr_v_gain_batt = 0x00;
877 pm_register_data_type data = 0x00;
878
879 int8 temp_data = 0;
880 int32 temp_data1 = 0;
881
882 pm_fg_data_type* fg_adc_usr_ptr = pm_fg_get_data(pmic_device);
883
884 if (NULL == fg_adc_usr_ptr)
885 {
886 return PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
887 }
888 else
889 {
890 fg_adc_usr_v_gain_batt = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_bcl_v_gain_batt;
891 err_flag = pm_comm_read_byte(fg_adc_usr_ptr->comm_ptr->slave_id, fg_adc_usr_v_gain_batt, &data, 0);
892
893 //Convert uint8 to int8
894 temp_data = data;
895
896 //Convert int8 to int32
897 temp_data1 = temp_data;
898
899 *v_gain_correction = temp_data1;
900 }
901
902 return err_flag;
903
904}
905
906/**
907* @brief This function returns current Rsense gain correction value for Battery Current *
908* @details
909* This function returns current Rsense gain correction value for Battery Current
910*
911* @param[in] pmic_device_index. Primary: 0 Secondary: 1
912* @param[in] gainCorrection for battery volatge
913*
914* @return pm_err_flag_type
915* PM_ERR_FLAG__FEATURE_NOT_SUPPORTED = Feature not available on this
916* version of the PMIC.
917* PM_ERR_FLAG__SUCCESS = SUCCESS.
918*
919*/
920pm_err_flag_type pm_fg_adc_usr_get_bcl_i_gain_rsense(uint32 pmic_device, int32 *i_gain_rsense)
921{
922 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
923 pm_register_address_type fg_adc_usr_i_gain_rsense = 0x00;
924 pm_register_data_type data = 0x00;
925
926 int8 temp_data = 0;
927 int32 temp_data1 = 0;
928
929 pm_fg_data_type* fg_adc_usr_ptr = pm_fg_get_data(pmic_device);;
930
931 if (NULL == fg_adc_usr_ptr)
932 {
933 return PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
934 }
935 else
936 {
937 fg_adc_usr_i_gain_rsense = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_bcl_i_gain_rsense;
938 err_flag = pm_comm_read_byte(fg_adc_usr_ptr->comm_ptr->slave_id, fg_adc_usr_i_gain_rsense, &data, 0);
939
940 //Convert uint8 to int8
941 temp_data = data;
942
943 //Convert int8 to int32
944 temp_data1 = temp_data;
945
946 *i_gain_rsense = temp_data1;
947 }
948
949 return err_flag;
950}
951
952
953
954/**
955* @brief This function returns current Rsense offset value for Battery Current *
956* @details
957* This function returns current Rsense offset value for Battery Current
958*
959* @param[in] pmic_device_index. Primary: 0 Secondary: 1
960* @param[in] ioffset_rsense Offset Gain Correction battery current
961*
962* @return pm_err_flag_type
963* PM_ERR_FLAG__FEATURE_NOT_SUPPORTED = Feature not available on this
964* version of the PMIC.
965* PM_ERR_FLAG__SUCCESS = SUCCESS.
966*
967*/
968pm_err_flag_type pm_fg_adc_usr_get_bcl_i_offset_rsense(uint32 pmic_device, int32 *i_offset_rsense)
969{
970 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
971 pm_register_address_type fg_adc_usr_i_offset_rsense = 0x00;
972 pm_register_data_type data = 0x00;
973
974 int8 temp_data = 0;
975 int32 temp_data1 = 0;
976
977 pm_fg_data_type* fg_adc_usr_ptr = pm_fg_get_data(pmic_device);
978
979 if (NULL == fg_adc_usr_ptr)
980 {
981 return PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
982 }
983 else
984 {
985 fg_adc_usr_i_offset_rsense = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_bcl_i_offset_rsense;
986 err_flag = pm_comm_read_byte(fg_adc_usr_ptr->comm_ptr->slave_id, fg_adc_usr_i_offset_rsense, &data, 0);
987
988 //Convert uint8 to int8
989 temp_data = data;
990
991 //Convert int8 to int32
992 temp_data1 = temp_data;
993
994 *i_offset_rsense = (temp_data1 * OFFSET_LSB_NUM) / OFFSET_LSB_DENOM;
995 }
996
997 return err_flag;
998
999}
1000
1001
1002/**
1003* @brief This function returns current gain in BATFET for Battery Current *
1004* @details
1005* This function returns current gain in BATFET for Battery Current
1006*
1007* @param[in] pmic_device_index. Primary: 0 Secondary: 1
1008* @param[in] igain_offset_correction Gain Correction for battery current
1009*
1010* @return pm_err_flag_type
1011* PM_ERR_FLAG__FEATURE_NOT_SUPPORTED = Feature not available on this
1012* version of the PMIC.
1013* PM_ERR_FLAG__SUCCESS = SUCCESS.
1014*
1015*/
1016pm_err_flag_type pm_fg_adc_usr_get_bcl_i_gain_batfet(uint32 pmic_device, int32 *i_gain_batfet)
1017{
1018 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
1019 pm_register_address_type fg_adc_usr_i_gain_batfet = 0x00;
1020 pm_register_data_type data = 0x00;
1021
1022 int8 temp_data = 0;
1023 int32 temp_data1 = 0;
1024
1025 pm_fg_data_type* fg_adc_usr_ptr = pm_fg_get_data(pmic_device);
1026
1027 if (NULL == fg_adc_usr_ptr)
1028 {
1029 return PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
1030 }
1031 else
1032 {
1033 fg_adc_usr_i_gain_batfet = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_bcl_i_gain_batfet;
1034 err_flag = pm_comm_read_byte(fg_adc_usr_ptr->comm_ptr->slave_id, fg_adc_usr_i_gain_batfet, &data, 0);
1035
1036 //Convert uint8 to int8
1037 temp_data = data;
1038
1039 //Convert int8 to int32
1040 temp_data1 = temp_data;
1041
1042 *i_gain_batfet = temp_data1;
1043 }
1044
1045 return err_flag;
1046
1047}
1048
1049
1050/**
1051* @brief This function returns current offset in BATFET for Battery Current *
1052* @details
1053* This function returns current gain in BATFET for Battery Current
1054*
1055* @param[in] pmic_device_index. Primary: 0 Secondary: 1
1056* @param[in] ioffset_batfet_correction offset Gain Correction for BATFET
1057*
1058* @return pm_err_flag_type
1059* PM_ERR_FLAG__FEATURE_NOT_SUPPORTED = Feature not available on this
1060* version of the PMIC.
1061* PM_ERR_FLAG__SUCCESS = SUCCESS.
1062*
1063*/
1064pm_err_flag_type pm_fg_adc_usr_get_bcl_i_offset_batfet(uint32 pmic_device, int32 *i_offset_batfet)
1065{
1066 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
1067 pm_register_address_type fg_adc_usr_i_offset_batfet = 0x00;
1068 pm_register_data_type data = 0x00;
1069
1070 int8 temp_data = 0;
1071 int32 temp_data1 = 0;
1072
1073 pm_fg_data_type* fg_adc_usr_ptr = pm_fg_get_data(pmic_device);;
1074
1075 if (NULL == fg_adc_usr_ptr)
1076 {
1077 return PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
1078 }
1079 else
1080 {
1081 fg_adc_usr_i_offset_batfet = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_bcl_i_offset_batfet;
1082 err_flag = pm_comm_read_byte(fg_adc_usr_ptr->comm_ptr->slave_id, fg_adc_usr_i_offset_batfet, &data, 0);
1083
1084 //Convert uint8 to int8
1085 temp_data = data;
1086
1087 //Convert int8 to int32
1088 temp_data1 = temp_data;
1089
1090 *i_offset_batfet = ((temp_data1 * OFFSET_LSB_NUM) / OFFSET_LSB_DENOM);
1091 }
1092
1093 return err_flag;
1094}
1095
1096
1097
1098/**
1099* @brief This function returns source used for current sense *
1100* @details
1101* This function returns source used for current sense
1102*
1103* @param[in] pmic_device_index. Primary: 0 Secondary: 1
1104* @param[in] isense_source source used for current sense
1105*
1106* @return pm_err_flag_type
1107* PM_ERR_FLAG__FEATURE_NOT_SUPPORTED = Feature not available on this
1108* version of the PMIC.
1109* PM_ERR_FLAG__SUCCESS = SUCCESS.
1110*
1111*/
1112pm_err_flag_type pm_fg_adc_usr_get_bcl_i_sense_source(uint32 pmic_device, boolean *i_sense_source)
1113{
1114 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
1115 pm_register_address_type fg_adc_usr_bcl_isense_source = 0x00;
1116 pm_register_data_type data = 0x00;
1117 uint8 mask = 0x01;
1118
1119 pm_fg_data_type* fg_adc_usr_ptr = pm_fg_get_data(pmic_device);
1120
1121 if (NULL == fg_adc_usr_ptr)
1122 {
1123 return PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
1124 }
1125 else
1126 {
1127 fg_adc_usr_bcl_isense_source = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_bcl_i_sense_source;
1128 err_flag = pm_comm_read_byte_mask(fg_adc_usr_ptr->comm_ptr->slave_id, fg_adc_usr_bcl_isense_source, mask, &data, 0);
1129 *i_sense_source = (boolean )data;
1130 }
1131
1132 return err_flag;
1133}
1134
1135
1136/**
1137* @brief This function cleras stored VBAT minimum *
1138* @details
1139* This function cleras stored VBAT minimum
1140*
1141* @param[in] pmic_device_index. Primary: 0 Secondary: 1
1142* @param[in]enable enable/disable for clearing stored vbat minimum
1143*
1144* @return pm_err_flag_type
1145* PM_ERR_FLAG__FEATURE_NOT_SUPPORTED = Feature not available on this
1146* version of the PMIC.
1147* PM_ERR_FLAG__SUCCESS = SUCCESS.
1148*
1149*/
1150pm_err_flag_type pm_fg_adc_usr_clear_vbat_min(uint32 pmic_device, boolean enable)
1151{
1152 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
1153 pm_register_address_type fg_adc_usr_clr_vbat_min = 0x00;
1154
1155 pm_fg_data_type* fg_adc_usr_ptr = pm_fg_get_data(pmic_device);
1156
1157 if (NULL == fg_adc_usr_ptr)
1158 {
1159 return PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
1160 }
1161 else
1162 {
1163 fg_adc_usr_clr_vbat_min = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_vbat_min_clr;
1164 err_flag = pm_comm_write_byte_mask(fg_adc_usr_ptr->comm_ptr->slave_id, fg_adc_usr_clr_vbat_min, 0x80, (pm_register_data_type)enable, 0);
1165 }
1166
1167 return err_flag;
1168
1169}
1170
1171/**
1172* @brief This function clears stored IBAT Max *
1173* @details
1174* This function cleras stored IBAT Max
1175*
1176* @param[in] pmic_device_index. Primary: 0 Secondary: 1
1177* @param[in]enable enable/disable for clearing stored vbat minimum
1178*
1179* @return pm_err_flag_type
1180* PM_ERR_FLAG__FEATURE_NOT_SUPPORTED = Feature not available on this
1181* version of the PMIC.
1182* PM_ERR_FLAG__SUCCESS = SUCCESS.
1183*
1184*/
1185pm_err_flag_type pm_fg_adc_usr_clear_ibat_max(uint32 pmic_device, boolean enable)
1186{
1187 pm_err_flag_type err_flag = PM_ERR_FLAG__SUCCESS;
1188 pm_register_address_type fg_adc_usr_clr_ibat_min = 0x00;
1189
1190 pm_fg_data_type* fg_adc_usr_ptr = pm_fg_get_data(pmic_device);
1191
1192 if (NULL == fg_adc_usr_ptr)
1193 {
1194 return PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
1195 }
1196 else
1197 {
1198 fg_adc_usr_clr_ibat_min = fg_adc_usr_ptr->fg_register->adc_usr_register->base_address + fg_adc_usr_ptr->fg_register->adc_usr_register->fg_adc_usr_ibat_max_clr;
1199 err_flag = pm_comm_write_byte_mask(fg_adc_usr_ptr->comm_ptr->slave_id, fg_adc_usr_clr_ibat_min, 0x80, (pm_register_data_type)enable, 0);
1200 }
1201
1202 return err_flag;
1203
1204}
1205
1206
1207/**
1208PmicFgCalibrateIbat()
1209
1210@brief
1211
1212*/
1213pm_err_flag_type pm_fg_adc_usr_get_calibrated_ibat(uint32 pmic_device, int32 *calibrated_ibat)
1214{
1215 pm_err_flag_type errFlag = PM_ERR_FLAG__SUCCESS;
1216
1217 int32 raw_ibat = 0;
1218 static int32 gain = 0;
1219 static int32 offset = 0;
1220
1221 boolean sense_source = FALSE;
1222
1223 *calibrated_ibat = 0;
1224
1225 errFlag |= pm_fg_adc_usr_get_ibat(pmic_device, &raw_ibat);
1226
1227 if((!gain) || (!offset))
1228 {//gain and offset are constant per part, so we should read them only once
1229 errFlag |= pm_fg_adc_usr_get_bcl_i_sense_source( pmic_device, &sense_source);
1230
1231 if(sense_source)
1232 {// 1 -> pick rsense correction
1233 errFlag |= pm_fg_adc_usr_get_bcl_i_gain_rsense( pmic_device, &gain );
1234 errFlag |= pm_fg_adc_usr_get_bcl_i_offset_rsense( pmic_device, &offset );
1235 }
1236 else
1237 {// 0 -> pick batfet correction
1238 errFlag |= pm_fg_adc_usr_get_bcl_i_gain_batfet( pmic_device, &gain );
1239 errFlag |= pm_fg_adc_usr_get_bcl_i_offset_batfet( pmic_device, &offset );
1240 }
1241 }
1242
1243 *calibrated_ibat = (((raw_ibat + offset) * (GAIN_LSB_DENOM + gain ))/ GAIN_LSB_DENOM);
1244
1245 return errFlag;
1246}
1247
1248pm_err_flag_type pm_fg_adc_usr_get_calibrated_vbat(uint32 pmic_device, uint32 *calibrated_vbat)
1249{
1250 pm_err_flag_type errFlag = PM_ERR_FLAG__SUCCESS;
1251
1252 uint32 raw_vbat = 0;
1253 static int32 gain = 0;
1254
1255 errFlag = pm_fg_adc_usr_get_vbat(pmic_device, &raw_vbat);
1256
1257 if(!gain)
1258 {//Gain is constant w.r.t to every part, so we should read it only once.
1259 errFlag |= pm_fg_adc_usr_get_bcl_v_gain_batt( pmic_device, &gain );
1260 }
1261
1262 /* Applying gain calibration to the raw value*/
1263 // Twos_complement(VBAT_registerval) *39 * (1+ Twos_Complement(V_GAIN_registerval) * (.32/128))
1264 *calibrated_vbat = (uint32)(((raw_vbat * (GAIN_LSB_DENOM + gain)))/GAIN_LSB_DENOM);
1265
1266 return errFlag;
1267}
1268