Statistics
| Branch: | Tag: | Revision:

amiro-os / devices / PowerManagement / main.cpp @ 552936c8

History | View | Annotate | Download (39.579 KB)

1 58fe0e0b Thomas Schöpping
#ifndef IN_CCM
2
/*
3
 * @brief Makro to store data in the core coupled memory (ccm).
4
 *        Example:
5
 *        int compute_buffer[128] IN_CCM;
6
 *
7
 * @note The ccm is not connected to any bus system.
8
 */
9
#define IN_CCM  __attribute__((section(".ccm"))) __attribute__((aligned(4)))
10
#endif
11
12
#ifndef IN_ETH
13
/*
14
 * @brief Makro to store data in the ethernet memory (eth).
15
 *        Example:
16
 *        int dma_buffer[128] IN_ETH;
17
 *
18
 * @note The eth is a dedicated memory block with its own DMA controller.
19
 */
20
#define IN_ETH  __attribute__((section(".eth"))) __attribute__((aligned(4)))
21
#endif
22
23
#define BL_CALLBACK_TABLE_ADDR  (0x08000000 + 0x01C0)
24
#define BL_MAGIC_NUMBER         ((uint32_t)0xFF669900u)
25
26
#define SHUTDOWN_NONE             0
27
#define SHUTDOWN_TRANSPORTATION   1
28
#define SHUTDOWN_DEEPSLEEP        2
29
#define SHUTDOWN_HIBERNATE        3
30
#define SHUTDOWN_RESTART          4
31
#define SHUTDOWN_HANDLE_REQUEST   5
32
33
#include <ch.hpp>
34
#include <shell.h>
35
#include <chprintf.h>
36
#include <wakeup.h>
37
#include <cstdlib>
38
#include <cstring>
39
#include <amiro/util/util.h>
40
#include <global.hpp>
41
#include <exti.hpp>
42
43
using namespace amiro;
44
using namespace constants::PowerManagement;
45
46
Global global;
47
48
void shutdownTimeoutISR(void *arg) {
49
50
  (void) arg;
51
52
}
53
54
void systemStop() {
55
56
//  VirtualTimer shutdownTimeout;
57
  uint8_t i;
58
59
  // tell all boards that it's time to shut down
60
  global.robot.broadcastShutdown();
61
62
  global.userThread.requestTerminate();
63
  global.userThread.wait();
64
65
  // kill bluetooth
66
  boardBluetoothSetState(0);
67
68
  global.adc1_vsys.requestTerminate();
69
  global.adc1_vsys.wait();
70
71
  for (i = 0; i < global.vcnl4020.size(); ++i) {
72
    global.vcnl4020[i].requestTerminate();
73
    global.vcnl4020[i].wait();
74
  }
75
76
  for (i = 0; i < global.bq27500.size(); ++i) {
77
    global.bq27500[i].requestTerminate();
78
    global.bq27500[i].wait();
79
  }
80
81
  for (i = 0; i < global.ina219.size(); ++i) {
82
    global.ina219[i].requestTerminate();
83
    global.ina219[i].wait();
84
  }
85
86
//  boardWriteIoPower(0);
87
  global.mpr121.configure(&global.mpr121_stdby_config);
88
  /* cannot shut down touch, b/c we need it to
89
   * clear any interrupt, so WKUP is not blocked
90
   */
91
92
  // stop I²C
93
  for (i = 0; i < global.V_I2C1.size(); ++i)
94
    global.V_I2C1[i].stop();
95
  for (i = 0; i < global.V_I2C2.size(); ++i)
96
    global.V_I2C2[i].stop();
97
98
  global.mpr121.requestTerminate();
99
  global.mpr121.wait();
100
101
  global.HW_I2C2.stop();
102
  global.HW_I2C1.stop();
103
104
  // stop all threads
105
  global.robot.terminate();
106
107
//  // 60 sec timeout
108
//  palWritePad(GPIOC, GPIOC_SYS_INT_N, PAL_HIGH);
109
//  chVTSet(&shutdownTimeout, MS2ST(60000), shutdownTimeoutISR, NULL);
110
//  // wait for all boards to release SYS_INT_N
111
//  while (palReadPad(GPIOC, GPIOC_SYS_INT_N)!=PAL_HIGH && chVTIsArmedI(&shutdownTimeout)) {
112
//    BaseThread::sleep(MS2ST(1)); /* must sleep for VT, else it will never fire */
113
//  }
114
//  chVTReset(&shutdownTimeout);
115
116
//  chprintf((BaseSequentialStream*) &SD1, "Stop\n");
117
//  boardWriteSystemPower(0);
118
//  boardWriteLed(1);
119
//  boardStop(0x00, 0x00);
120
121
//  /*
122
//   * HSI-PLL domain now.
123
//   */
124
//  //chprintf((BaseSequentialStream*) &SD1, "After Stop\n");
125
//  boardWriteLed(1);
126
127
//  while (true)
128
//    BaseThread::sleep(MS2ST(250));
129
130
  return;
131
}
132
133
void systemShutdown() {
134
135
  VirtualTimer shutdownTimeout;
136
  uint8_t i;
137
138
  // tell all boards that it's time to shut down
139
  global.robot.broadcastShutdown();
140
141
  // wait a little to make sure all boards got the message and had time to pull their SYS_PD_N pins down
142
  BaseThread::sleep(MS2ST(500));
143
144
  // stop the user thread
145
  global.userThread.requestTerminate();
146
  global.userThread.wait();
147
148
  // kill bluetooth
149
  boardBluetoothSetState(0);
150
151
  // stop all threads
152
  global.robot.terminate();
153
154
  global.adc1_vsys.requestTerminate();
155
  global.adc1_vsys.wait();
156
157
  for (i = 0; i < global.vcnl4020.size(); ++i) {
158
    global.vcnl4020[i].requestTerminate();
159
    global.vcnl4020[i].wait();
160
  }
161
162
  for (i = 0; i < global.bq27500.size(); ++i) {
163
    global.bq27500[i].requestTerminate();
164
    global.bq27500[i].wait();
165
  }
166
167
  for (i = 0; i < global.ina219.size(); ++i) {
168
    global.ina219[i].requestTerminate();
169
    global.ina219[i].wait();
170
  }
171
172
  // 60 sec timeout
173
  chVTSet(&shutdownTimeout, MS2ST(60000), shutdownTimeoutISR, NULL);
174
175
  // wait for all boards to release SYS_PD_N
176
  while (!palReadPad(GPIOC, GPIOC_SYS_PD_N) && chVTIsArmedI(&shutdownTimeout))
177
    BaseThread::sleep(MS2ST(1)); /* must sleep for VT, else it will never fire */
178
179
  chVTReset(&shutdownTimeout);
180
  boardWriteIoPower(0);
181
  global.mpr121.configure(&global.mpr121_stdby_config);
182
  /* cannot shut down touch, b/c we need it to
183
   * clear any interrupt, so WKUP is not blocked
184
   */
185
186
  // stop I²C
187
  for (i = 0; i < global.V_I2C1.size(); ++i)
188
    global.V_I2C1[i].stop();
189
  for (i = 0; i < global.V_I2C2.size(); ++i)
190
    global.V_I2C2[i].stop();
191
192
  boardWriteSystemPower(0);
193
  boardStandby();
194
195
}
196
197
198
void boardPeripheryCheck(BaseSequentialStream *chp) {
199
200
#ifndef AMIRO_NSELFTEST
201
  chprintf(chp, "\nCHECK: START\n");
202
  msg_t result = 0;
203
204
    // Check the proximitysensors
205
  for (uint8_t i = 0; i < global.vcnl4020.size(); i++) {
206
    result = global.vcnl4020[i].getCheck();
207
    if (result == global.vcnl4020[i].CHECK_OK)
208
      chprintf(chp, "VCNL4020: %d OK\n", i);
209
    else
210
      chprintf(chp, "VCNL4020: %d FAIL\n", i);
211
  }
212
  chprintf(chp, "----------------------------------------\n");
213
214
  // check the PowerPath controller
215
  chprintf(chp, "\n");
216
  if (global.ltc4412.isPluggedIn())
217
    chprintf(chp, "LTC4412: plugged in\n");
218
  else
219
    chprintf(chp, "LTC4412: not plugged in\n");
220
  chprintf(chp, "----------------------------------------\n");
221
222
  // Check the eeprom
223
  result = global.memory.getCheck();
224
  if ( result != global.memory.OK)
225
    chprintf(chp, "Memory Structure: FAIL\n");
226
  else
227
    chprintf(chp, "Memory Structure: OK\n");
228
  chprintf(chp, "----------------------------------------\n");
229
230
  // Check the power monitors
231
  INA219::BusVoltage bus_voltage;
232
  chprintf(chp, "\n");
233
  chprintf(chp, "INA219:\n");
234
  chprintf(chp, "\tVDD (3.3V):\n");
235
  uint8_t result_ina219_vdd = global.ina219[INA_VDD].selftest();
236
  chprintf(chp, "->\t");
237
  if (result_ina219_vdd == BaseSensor<>::NOT_IMPLEMENTED)
238
    chprintf(chp, "not implemented");
239
  else if (result_ina219_vdd != INA219::Driver::ST_OK)
240
    chprintf(chp, "FAIL (error code 0x%02X)", result_ina219_vdd);
241
  else
242
    chprintf(chp, "OK");
243
244
  chprintf(chp, "\n\n");
245
  chprintf(chp, "\tVIO1.8:\n");
246
  uint8_t result_ina219_vio18 = global.ina219[INA_VIO18].selftest();
247
  chprintf(chp, "->\t");
248
  if (result_ina219_vio18 == BaseSensor<>::NOT_IMPLEMENTED)
249
    chprintf(chp, "not implemented");
250
  else if (result_ina219_vio18 != INA219::Driver::ST_OK)
251
    chprintf(chp, &q