Nordic Semiconductor nRF5 AirFuel SDK  version 2.2.0
pru_sensors.c
Go to the documentation of this file.
1 /* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved.
2  *
3  * The information contained herein is property of Nordic Semiconductor ASA.
4  * Terms and conditions of usage are described in detail in NORDIC
5  * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
6  *
7  * Licensees are granted free, non-transferable use of the information. NO
8  * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
9  * the file.
10  *
11  */
12 
15 #include <stdint.h>
16 #include <string.h>
17 
18 #include "pru_sensors.h"
19 #include "pru_hw_config.h"
20 #include "pru_test_mux.h"
21 #include "nrf_error.h"
22 #include "nrf_assert.h"
23 
24 
25 /******************************************************************************/
28 /******************************************************************************/
29 
31 static uint32_t m_hv_counter = 0;
37 /******************************************************************************/
40 /******************************************************************************/
41 
43 {
44  // Initialize 'static' PRU dynamic values
45  memset(&m_pru_sensor_data,0,sizeof(m_pru_sensor_data));
46  memset(&m_prev_alerts, 0, sizeof(pru_alert_t));
47  m_signal_handler = sm_handler;
48  m_hv_counter = 0;
49 }
50 
52 {
53 #ifndef STATIC_POWER_ADJUSTED_BIT
54  static uint16_t nof_calls_since_power_adjusted_set = 0;
55 #endif
56  uint32_t err_code = NRF_SUCCESS;
57  uint16_t vrect, irect, vout, iout;
58  int16_t temperature;
59  bool wired;
60  bool charge_port;
61  bool charge_complete;
62  bool last_power_adjusted;
63 
64  // Update sensor values if reading was successful.
65  err_code = pru_tmux_vrect_get(&vrect);
66  APP_ERROR_CHECK(err_code);
67  m_pru_sensor_data.vrect = vrect;
68 
69  err_code = pru_tmux_irect_get(&irect);
70  APP_ERROR_CHECK(err_code);
71  m_pru_sensor_data.irect = irect;
72 
73  err_code = pru_tmux_vout_get(&vout);
74  APP_ERROR_CHECK(err_code);
75  m_pru_sensor_data.vout = vout;
76 
77  err_code = pru_tmux_iout_get(&iout);
78  APP_ERROR_CHECK(err_code);
79  m_pru_sensor_data.iout = iout;
80 
81  err_code = pru_tmux_temperature_get(&temperature);
82  APP_ERROR_CHECK(err_code);
83  m_pru_sensor_data.temperature = temperature;
84 
85  err_code = pru_tmux_wired_charge_detect_status_get(&wired);
86  APP_ERROR_CHECK(err_code);
87  m_pru_sensor_data.wired_charge_detect = wired;
88 
89  err_code = pru_tmux_charge_complete_status_get(&charge_complete);
90  APP_ERROR_CHECK(err_code);
91  m_pru_sensor_data.charge_complete = charge_complete;
92 
93  err_code = pru_tmux_vout_enable_get(&charge_port);
94  APP_ERROR_CHECK(err_code);
95  m_pru_sensor_data.charge_port = charge_port;
96 
97  err_code = pru_tmux_power_adjusted_get(&last_power_adjusted);
98  APP_ERROR_CHECK(err_code);
99 
100 #ifndef STATIC_POWER_ADJUSTED_BIT
101  if(m_pru_sensor_data.power_adjusted)
102  {
103  nof_calls_since_power_adjusted_set++;
104 
105  // See if we need to reset the 'Adjusted Power Response' value.
106  if((PRU_SENSORS_TIMER_PERIOD_MS * nof_calls_since_power_adjusted_set) >= PRU_RESET_POWER_ADJUSTED_MS)
107  {
108  m_pru_sensor_data.power_adjusted = false;
109  nof_calls_since_power_adjusted_set = 0;
110  }
111  }
112  else if(last_power_adjusted)
113  {
114  // The HAL has reported that power has been adjusted. Reset the HAL value, and start the 1 second reset functionality
115  // for the 'Adjusted Power Response' bit.
116  err_code = pru_tmux_power_adjusted_set(false);
117  APP_ERROR_CHECK(err_code);
118 
119  m_pru_sensor_data.power_adjusted = true;
120  nof_calls_since_power_adjusted_set = 0;
121  }
122 #else
123  m_pru_sensor_data.power_adjusted = last_power_adjusted;
124 #endif
125 
126  m_pru_sensor_data.over_voltage = (m_pru_sensor_data.vrect > PRU_VRECT_MAX) ? 1:0;
127  m_pru_sensor_data.over_current = (((uint32_t)m_pru_sensor_data.vrect*m_pru_sensor_data.irect/(100*1000)) >= PRU_PRECT_MAX) ? 1:0;
128  m_pru_sensor_data.over_temperature = (m_pru_sensor_data.temperature >= (int16_t)PRU_TEMP_MAX) ? 1: 0;
129 
130  if(m_pru_sensor_data.vrect > PRU_VRECT_HIGH)
131  {
133  }
134  else
135  {
136  m_hv_counter = 0;
137  }
138  m_pru_sensor_data.sustained_high_voltage = (m_hv_counter > PRU_VRECT_HIGH_SUSTAIN_MS) ? 1:0;
139 
140  #ifdef USE_BOARD_SPECIFIC_SENSORS
141  err_code = pru_sensors_board_read_all(&m_pru_sensor_data);
142  APP_ERROR_CHECK(err_code);
143  #endif
144 }
145 
147 {
148  return &m_pru_sensor_data;
149 }
150 
151 uint32_t pru_sensor_alerts_get(bool * new_alert_occured, pru_alert_t * p_pru_alert)
152 {
153  ASSERT(p_pru_alert != NULL);
154  ASSERT(new_alert_occured != NULL);
155 
156  if((p_pru_alert != NULL) && (new_alert_occured != NULL))
157  {
158  memset(p_pru_alert, 0, sizeof(pru_alert_t));
159  p_pru_alert->alerts.pru_over_voltage = m_pru_sensor_data.over_voltage;
160  p_pru_alert->alerts.pru_over_current = m_pru_sensor_data.over_current;
161  p_pru_alert->alerts.pru_over_temperature = m_pru_sensor_data.over_temperature;
162  p_pru_alert->alerts.charge_complete = m_pru_sensor_data.charge_complete;
163  p_pru_alert->alerts.wired_charge_detect = m_pru_sensor_data.wired_charge_detect;
165 
166  if((p_pru_alert->alerts.pru_over_voltage ||
167  p_pru_alert->alerts.pru_over_current ||
168  p_pru_alert->alerts.pru_over_temperature ||
169  p_pru_alert->alerts.charge_complete ||
170  p_pru_alert->alerts.wired_charge_detect) &&
171  (memcmp(&m_prev_alerts, p_pru_alert, sizeof(pru_alert_t) != 0)))
172  {
173  *new_alert_occured = true;
174  }
175  else
176  {
177  *new_alert_occured = false;
178  }
179 
180  memcpy(&m_prev_alerts, p_pru_alert, sizeof(pru_alert_t));
181 
182  return NRF_SUCCESS;
183  }
184  else
185  {
186  return NRF_ERROR_NULL;
187  }
188 }
189 
191 {
192  if(m_signal_handler != NULL)
193  {
194  const pru_sensor_data_t * p_sensor_data = pru_sensors_data_get();
195  bool system_error = (p_sensor_data->over_voltage || p_sensor_data->over_current || p_sensor_data->over_temperature);
196 
197  // System Error or System OK Event
198  if(system_error)
200 
201  if(p_sensor_data->vrect >= PRU_VRECT_BOOT)
203 
204  if(p_sensor_data->vrect < PRU_VRECT_UVLO)
206 
207  if(p_sensor_data->charge_complete || p_sensor_data->wired_charge_detect)
209  }
210 }
211 
static pru_sensor_data_t m_pru_sensor_data
Definition: pru_sensors.c:30
uint32_t pru_sensors_board_read_all(pru_sensor_data_t *p_sensor_data)
Read PRU HW specific sensors.
uint8_t charge_port
Definition: pru_sensors.h:38
#define PRU_VRECT_HIGH_SUSTAIN_MS
Definition: pru_hw_config.h:29
uint8_t wired_charge_detect
Definition: wpt.h:139
uint8_t over_voltage
Definition: pru_sensors.h:33
int16_t temperature
Definition: pru_sensors.h:32
#define PRU_VRECT_HIGH
Definition: pru_hw_config.h:27
void pru_sensors_gen_evts(void)
Generate PRU state machine events from sensor data.
Definition: pru_sensors.c:190
#define PRU_SENSORS_TIMER_PERIOD_MS
Definition: pru_hw_config.h:39
void pru_sensors_read_all(void)
Read PRU sensors.
Definition: pru_sensors.c:51
uint32_t pru_tmux_power_adjusted_get(bool *adjusted)
Test wrapper for pru_hal_power_adjusted_get().
Definition: pru_test_mux.c:122
uint32_t pru_tmux_vrect_get(uint16_t *p_vrect)
Test wrapper for pru_hal_vrect_get().
Definition: pru_test_mux.c:67
PRU Alert Parameter structure.
Definition: wpt.h:145
#define PRU_TEMP_MAX
Definition: pru_hw_config.h:30
uint32_t pru_tmux_irect_get(uint16_t *p_irect)
Test wrapper for pru_hal_irect_get().
Definition: pru_test_mux.c:72
void pru_sensors_init(pru_sm_handler_t sm_handler)
Initialize sensors and read default values.
Definition: pru_sensors.c:42
static uint32_t m_hv_counter
Definition: pru_sensors.c:31
uint8_t over_temperature
Definition: pru_sensors.h:35
const pru_sensor_data_t * pru_sensors_data_get(void)
Get the latest data from the PRU sensors.
Definition: pru_sensors.c:146
uint32_t pru_tmux_vout_enable_get(bool *enable)
Test wrapper for pru_hal_vout_enable_get().
Definition: pru_test_mux.c:77
static pru_alert_t m_prev_alerts
Definition: pru_sensors.c:32
Definition of PRU reporting data.
Definition: pru_sensors.h:26
uint8_t power_adjusted
Definition: pru_sensors.h:40
uint32_t pru_tmux_temperature_get(int16_t *p_temperature)
Test wrapper for pru_hal_temperature_get().
Definition: pru_test_mux.c:92
#define PRU_RESET_POWER_ADJUSTED_MS
Definition: pru_config.h:41
#define PRU_VRECT_BOOT
Definition: pru_hw_config.h:23
void(* pru_sm_handler_t)(pru_sm_signal_type_t evt)
Definition: pru.h:31
uint8_t pru_over_voltage
Definition: wpt.h:134
#define PRU_VRECT_MAX
Definition: pru_hw_config.h:28
uint8_t charge_complete
Definition: pru_sensors.h:39
uint8_t pru_over_current
Definition: wpt.h:135
uint8_t pru_over_temperature
Definition: wpt.h:136
uint32_t pru_tmux_power_adjusted_set(bool adjusted)
Test wrapper for pru_hal_power_adjusted_set().
Definition: pru_test_mux.c:127
uint32_t pru_tmux_wired_charge_detect_status_get(bool *p_wired)
Test wrapper for pru_hal_wired_charge_detect_status_get().
Definition: pru_test_mux.c:97
#define PRU_PRECT_MAX
Definition: pru_hw_config.h:43
uint32_t pru_tmux_iout_get(uint16_t *p_iout)
Test wrapper for pru_hal_iout_get().
Definition: pru_test_mux.c:87
uint32_t pru_tmux_vout_get(uint16_t *p_vout)
Test wrapper for pru_hal_vout_get().
Definition: pru_test_mux.c:82
uint8_t wired_charge_detect
Definition: pru_sensors.h:37
#define PRU_VRECT_UVLO
Definition: pru_hw_config.h:24
#define BLE_WPTS_PRU_ALERT_NO_SELF_PROTECTION_VAL
uint8_t over_current
Definition: pru_sensors.h:34
uint8_t pru_self_protection
Definition: wpt.h:137
uint32_t pru_tmux_charge_complete_status_get(bool *p_charge_complete)
Test wrapper for pru_hal_charge_complete_status_get().
Definition: pru_test_mux.c:102
uint32_t pru_sensor_alerts_get(bool *new_alert_occured, pru_alert_t *p_pru_alert)
Extract alerts from the latest data read from PRU sensors.
Definition: pru_sensors.c:151
pru_alert_bits_t alerts
Definition: wpt.h:147
uint8_t charge_complete
Definition: wpt.h:138
uint8_t sustained_high_voltage
Definition: pru_sensors.h:36
static pru_sm_handler_t m_signal_handler
Definition: pru_sensors.c:33