Nordic Semiconductor nRF5 AirFuel SDK  version 2.2.0
pru_wireless_debug.c
Go to the documentation of this file.
1 /* Copyright (c) 2013 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 <string.h>
16 #include <stdio.h>
17 
18 #include "pru_hw_config.h"
19 #include "pru_test_mux.h"
20 #include "softdevice_handler.h"
21 #include "wireless_debug.h"
22 #include "nrf_gzll.h"
23 #include "pru_sensors.h"
24 #include "nrf_assert.h"
25 #include "bsp.h"
26 
27 #define EVT_STRING_LENGTH_MAX 20
28 #define DEBUG_LINE_LENGTH 80
29 #define VRECT_INCREMENT 500
30 #define IRECT_INCREMENT 100
31 #define VOUT_INCREMENT 500
32 #define IOUT_INCREMENT 100
33 #define TEMPERATURE_INCREMENT 5
34 #define PIPE_NUMBER 0
35 #define TX_PAYLOAD_LENGTH 32
41 typedef struct
42 {
43  pru_sm_state_t state;
44  pru_sensor_data_t sensor_data;
45  pru_control_t control_data;
46 } debug_output_t;
47 
49 static debug_output_t m_debug_output;
53 static bool m_transmission_stopped = false;
54 static bool m_debug_print = false;
55 static uint8_t debug_pkt[TX_PAYLOAD_LENGTH];
56 extern bool gzll_initialized;
63 {
65  {
66  memcpy(&m_latest_control_data_received, &p_evt->data.pru_control, sizeof(pru_control_t));
67  }
68 }
69 
75 static void debug_print_string(const char *str)
76 {
77  size_t len = strlen(str);
78  ASSERT(len < (TX_PAYLOAD_LENGTH-1));
79  if(len < (TX_PAYLOAD_LENGTH-1))
80  {
81  debug_pkt[0] = DEBUG_STR;
82  strncpy((char *)&debug_pkt[1], str, len);
83  debug_pkt[len+1] = 0;
84  m_debug_print = true;
85  }
86 }
87 
88 
97 bool pru_process_command_board(uint8_t cmd);
98 
99 
109 {
110  bool b_cmd_processed = true;
111  uint32_t err_code;
112 
113  pru_tmux_override_values_get(&override_values);
114 
115  switch (cmd)
116  {
117  // Inc/dec , enable/disable commands
118 
119  case 'q':
120  debug_print_string("Power adjusted bit set\n\r");
121  override_values.power_adjusted = true;
122  break;
123 
124  case 'a':
125  debug_print_string("Power adjusted bit cleared\n\r");
126  override_values.power_adjusted = false;
127  break;
128 
129  case 'w':
130  override_values.iout += IOUT_INCREMENT;
131  sprintf(temp_string, "Inc IOUT -> %04X\n\r", override_values.iout);
133  break;
134 
135  case 's':
136  override_values.iout -= IOUT_INCREMENT;
137  sprintf(temp_string, "Dec IOUT -> %04X\n\r", override_values.iout);
139  break;
140 
141  case 'e':
142  debug_print_string("NOT SUPPORTED\n\r");
143  break;
144 
145  case 'd':
146  debug_print_string("NOT SUPPORTED\n\r");
147  break;
148 
149  case 'r':
150  override_values.vout += VOUT_INCREMENT;
151  sprintf(temp_string, "Inc VOUT -> %04X\n\r", override_values.vout);
153  break;
154 
155  case 'f':
156  override_values.vout -= VOUT_INCREMENT;
157  sprintf(temp_string, "Dec VOUT -> %04X\n\r", override_values.vout);
159  break;
160 
161  case 't':
162  debug_print_string("Wired charger on\n\r");
163  override_values.wired_charge_detect = true;
164  break;
165  case 'g':
166  debug_print_string("Wired charger off\n\r");
167  override_values.wired_charge_detect = false;
168  break;
169 
170  case 'y':
171  override_values.vrect += VRECT_INCREMENT;
172  sprintf(temp_string, "Inc VRECT -> %4X\n\r", override_values.vrect);
174  break;
175  case 'h':
176  override_values.vrect -= VRECT_INCREMENT;
177  sprintf(temp_string, "Dec VRECT -> %04X\n\r", override_values.vrect);
179  break;
180 
181  case 'u':
182  override_values.irect += IRECT_INCREMENT;
183  sprintf(temp_string, "Inc IRECT -> %04X\n\r", override_values.irect);
185  break;
186  case 'j':
187  override_values.irect -= IRECT_INCREMENT;
188  sprintf(temp_string, "Dec IRECT -> %04X\n\r", override_values.irect);
190  break;
191 
192  case 'i':
193  override_values.temperature += TEMPERATURE_INCREMENT;
194  sprintf(temp_string, "Inc TEMP -> %04X\n\r", override_values.temperature);
196  break;
197  case 'k':
198  override_values.temperature -= TEMPERATURE_INCREMENT;
199  sprintf(temp_string, "Dec TEMP -> %04X\n\r", override_values.temperature);
201  break;
202 
203  case 'o':
204  debug_print_string("Test-mode enabled\n\r");
205  tmux_get_select(TMUX_SELECT_OVERRIDE);
206  tmux_set_select(TMUX_SELECT_OVERRIDE);
207  break;
208 
209  case 'p':
210  debug_print_string("SDK Version ");
212  debug_print_string("\n\r");
213  break;
214 
215  case 'l':
216  debug_print_string("Test-mode disabled\n\r");
217  tmux_get_select(TMUX_SELECT_NO_OVERRIDE);
218  tmux_set_select(TMUX_SELECT_NO_OVERRIDE);
219  break;
220 
221  // Single button commands
222  case 'z':
223  debug_print_string("Reset\r\n");
224  NVIC_SystemReset();
225  break;
226 
227  case 'x':
228  debug_print_string("Send Slave Security Request\n\r");
229 
230  ble_gap_sec_params_t sec_params;
231  memset(&sec_params, 0, sizeof(ble_gap_sec_params_t));
232  sec_params.mitm = 0;
233  sec_params.bond = 0;
234 
235  err_code = sd_ble_gap_authenticate(0, &sec_params); // Use 0 as we will only be connected to one device.
236  APP_ERROR_CHECK(err_code);
237 
238  break;
239 
240  case 'n':
241  debug_print_string("Charge complete\n\r");
242  override_values.charge_complete = true;
243  break;
244 
245  case 'm':
246  debug_print_string("Charge incomplete\n\r");
247  override_values.charge_complete = false;
248  break;
249 
250  case '1':
251  debug_print_string("Vrect to PRU_VRECT_UVLO\n\r");
252  override_values.vrect = PRU_VRECT_UVLO;
253  break;
254 
255  case '2':
256  debug_print_string("Vrect to PRU_VRECT_BOOT\n\r");
257  override_values.vrect = PRU_VRECT_BOOT;
258  break;
259 
260  case '3':
261  debug_print_string("Vrect to PRU_VRECT_MIN\n\r");
262  override_values.vrect = PRU_VRECT_MIN;
263  break;
264 
265  case '4':
266  debug_print_string("Vrect to PRU_VRECT_HIGH\n\r");
267  override_values.vrect = (PRU_VRECT_HIGH);
268  break;
269 
270  case '5':
271  debug_print_string("Vrect to PRU_VRECT_MAX\n\r");
272  override_values.vrect = (PRU_VRECT_MAX);
273  break;
274 
275  case 'c':
276  case 'v':
278  {
279  debug_print_string("Stop packet transmission\n\r");
280  m_transmission_stopped = !m_transmission_stopped; // Need to do this before disabling the softdevice
281  (void)sd_softdevice_disable();
282  }
283 
284  else
285  {
286  debug_print_string("Start packet transmission\n\r");
288  nrf_clock_lf_cfg_t clock_lf_cfg = NRF_CLOCK_LFCLKSRC;
289  SOFTDEVICE_HANDLER_INIT(&clock_lf_cfg, NULL);
290  }
291  break;
292  case '6':
293  debug_print_string("\n\rpru\n\r");
294  break;
295  case '7':
296  case '8':
297  #ifdef DFU_SUPPORT
298  debug_print_string("Entering DFU mode ...\n\r");
299  dfu_start();
300  break;
301  #endif // DFU_SUPPORT
302 
303  case '9':
304  case ',':
305  case '.':
306  case '0':
307  default:
308  b_cmd_processed = false;
309  break;
310  }
311 
312  pru_tmux_override_values_set(&override_values);
313 
314  return b_cmd_processed;
315 }
316 
319 static void cmd_poll(void)
320 {
321  uint8_t cmd;
322  bool b_cmd_processed;
323 
324  if (!debug_cmd_available())
325  {
326  return;
327  }
328  cmd = get_debug_cmd();
329  b_cmd_processed = m_pru_process_command_common(cmd);
330  if (!b_cmd_processed)
331  {
332  debug_print_string("\n\rCommand not implemented\n\r");
333  }
334 }
335 
336 
340 static bool debug_output_changed(void)
341 {
342  const pru_sensor_data_t * sensor_data;
343  bool changed = false;
344 
345  sensor_data = pru_sensors_data_get();
346 
348  {
349  changed = true;
351  }
352 
353  if(memcmp(&m_debug_output.sensor_data, sensor_data, sizeof(pru_sensor_data_t)) != 0)
354  {
355  changed = true;
356  memcpy(&m_debug_output.sensor_data, sensor_data, sizeof(pru_sensor_data_t));
357  }
358 
359  if(memcmp(&m_debug_output.control_data, &m_latest_control_data_received, sizeof(pru_control_t)))
360  {
361  changed = true;
362  memcpy(&m_debug_output.control_data, &m_latest_control_data_received, sizeof(pru_control_t));
363  }
364 
365  if(strlen(m_evt_evt_string) > 0)
366  {
367  changed = true;
368  }
369 
370  return changed;
371 }
372 
373 void debug(void)
374 {
375  uint32_t pkt_len = 1;
376 
377  if (m_debug_print)
378  {
379  m_debug_print = false;
380  pkt_len = strlen((const char *)debug_pkt) + 1;
381  }
382  else if(debug_output_changed())
383  {
384  //debug_output_print();
385  debug_pkt[0] = DEBUG_PKT;
386  debug_pkt[1] = (uint8_t)m_debug_output.state;
387  debug_pkt[2] = (uint8_t)(m_debug_output.sensor_data.vrect & 0xff);
388  debug_pkt[3] = (uint8_t)(m_debug_output.sensor_data.vrect >> 8);
389  debug_pkt[4] = (uint8_t)(m_debug_output.sensor_data.irect & 0xff);
390  debug_pkt[5] = (uint8_t)(m_debug_output.sensor_data.irect >> 8);
391  debug_pkt[6] = (uint8_t)(m_debug_output.sensor_data.vout & 0xff);
392  debug_pkt[7] = (uint8_t)(m_debug_output.sensor_data.vout >> 8);
393  debug_pkt[8] = (uint8_t)(m_debug_output.sensor_data.iout & 0xff);
394  debug_pkt[9] = (uint8_t)(m_debug_output.sensor_data.iout >> 8);
395  debug_pkt[10] = (uint8_t)(m_debug_output.sensor_data.temperature & 0xff);
396  debug_pkt[11] = (uint8_t)(m_debug_output.sensor_data.temperature >> 8);
397  debug_pkt[12] = (uint8_t)m_debug_output.sensor_data.charge_complete;
398  debug_pkt[13] = (uint8_t)(PRU_VRECT_SET & 0xff);
399  debug_pkt[14] = (uint8_t)(PRU_VRECT_SET >> 8);
400  debug_pkt[15] = (uint8_t)(PRU_VRECT_MIN & 0xff);
401  debug_pkt[16] = (uint8_t)(PRU_VRECT_MIN >> 8);
402  debug_pkt[17] = (uint8_t)(PRU_VRECT_MAX & 0xff);
403  debug_pkt[18] = (uint8_t)(PRU_VRECT_MAX >> 8);
404  debug_pkt[19] = (uint8_t)PRU_TEMP_MAX ;
405  debug_pkt[20] = (uint8_t)(PRU_VRECT_MAX & 0xff);
406  debug_pkt[21] = (uint8_t)(PRU_VRECT_MAX >> 8);
407  debug_pkt[22] = (uint8_t)(PRU_PRECT_MAX & 0xff);
408  //lint -e572
409  debug_pkt[23] = (uint8_t)(PRU_PRECT_MAX >> 8);
410  if(strlen(m_evt_evt_string) > 0)
411  {
412  debug_pkt[24] = 1;
413  }
414  else
415  {
416  debug_pkt[24] = 0;
417  }
418  debug_pkt[25] = (uint8_t)m_debug_output.sensor_data.power_adjusted;
419  debug_pkt[26] = (uint8_t)m_debug_output.control_data.enable_pru_output;
420  debug_pkt[27] = (uint8_t)m_debug_output.control_data.enable_pru_charge_indicator;
421  debug_pkt[28] = (uint8_t)m_debug_output.control_data.adj_power;
422  debug_pkt[29] = (uint8_t)m_debug_output.control_data.permissions;
423  debug_pkt[30] = (uint8_t)m_debug_output.control_data.time_set;
424  pkt_len = TX_PAYLOAD_LENGTH;
425  }
426  while(!nrf_gzll_add_packet_to_tx_fifo(PIPE_NUMBER, debug_pkt, pkt_len))
427  ;
428  debug_pkt[0] = DEBUG_POLL;
429  cmd_poll();
430 }
#define VOUT_INCREMENT
static debug_output_t m_debug_output
#define PRU_VRECT_MIN
Definition: pru_hw_config.h:25
#define TX_PAYLOAD_LENGTH
PRU Control structure.
Definition: wpt.h:79
bool pru_process_command_board(uint8_t cmd)
Function for processing board specific test commands.
#define PRU_VRECT_HIGH
Definition: pru_hw_config.h:27
#define PRU_TEMP_MAX
Definition: pru_hw_config.h:30
#define VRECT_INCREMENT
static void cmd_poll(void)
Get and process uart commands.
bool m_pru_process_command_common(uint8_t cmd)
Function for processing common test commands.
const pru_sensor_data_t * pru_sensors_data_get(void)
Get the latest data from the PRU sensors.
Definition: pru_sensors.c:146
Definition of PRU reporting data.
Definition: pru_sensors.h:26
#define PIPE_NUMBER
pru_sm_state_t
PRU states.
Definition: pru_sm.h:26
#define DEBUG_LINE_LENGTH
void wpts_test_evt_handle_cb(ble_wpts_t *p_wpts, ble_wpts_evt_t *p_evt)
Override weak wpts_test_evt_handle_cb()
#define PRU_VRECT_BOOT
Definition: pru_hw_config.h:23
ble_wpts_evt_type_t evt_type
Definition: ble_wpts.h:43
bool debug_cmd_available(void)
Check if debug command received from dongle.
#define PRU_VRECT_SET
Definition: pru_hw_config.h:26
static void debug_print_string(const char *str)
Function for writing a string to the debug packet.
void pru_tmux_override_values_set(pru_tmux_override_t *values)
Set override values.
Definition: pru_test_mux.c:146
#define PRU_VRECT_MAX
Definition: pru_hw_config.h:28
WPT Service event.
Definition: ble_wpts.h:41
static bool debug_output_changed(void)
Update m_debug_output variable.
#define TEMPERATURE_INCREMENT
static char m_evt_evt_string[EVT_STRING_LENGTH_MAX]
#define PRU_PRECT_MAX
Definition: pru_hw_config.h:43
union ble_wpts_evt_t::@0 data
bool gzll_initialized
Collection of PRU HAL variables that can be overrided by test multiplexer.
Definition: pru_test_mux.h:36
static pru_control_t m_latest_control_data_received
pru_control_t pru_control
Definition: ble_wpts.h:46
#define PRU_VRECT_UVLO
Definition: pru_hw_config.h:24
void pru_tmux_override_values_get(pru_tmux_override_t *values)
Get ovveride values.
Definition: pru_test_mux.c:152
void tmux_get_select(tmux_select_t select)
Select source for all **tmux**get() functions.
Definition: pru_test_mux.c:135
#define IRECT_INCREMENT
pru_sm_state_t pru_sm_execute(pru_sm_signal_type_t sig, pru_sm_state_vars_t *p_state)
Execute state machine.
Definition: pru_sm.c:71
void debug(void)
Process debug commands.
#define IOUT_INCREMENT
void tmux_set_select(tmux_select_t select)
Select whether override values shall be used when writing to **hal**set() functions.
Definition: pru_test_mux.c:140
static uint8_t debug_pkt[TX_PAYLOAD_LENGTH]
static char temp_string[DEBUG_LINE_LENGTH]
void dfu_start(void)
Starts DFU mode. The function writes a special value to retention register to tell bootloader to star...
Definition: common.c:93
WPT Service status structure.
Definition: ble_wpts.h:71
static bool m_debug_print
#define SDK_VERSION
Definition: wpt.h:30
#define EVT_STRING_LENGTH_MAX
char get_debug_cmd(void)
get debug command received from dongle
static pru_tmux_override_t override_values
static bool m_transmission_stopped