Statistics
| Branch: | Tag: | Revision:

amiro-os / modules / PowerManagement_1-2 / module.h @ 7368d8da

History | View | Annotate | Download (31.649 KB)

1
/*
2
AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
3
Copyright (C) 2016..2020  Thomas Schöpping et al.
4

5
This program is free software: you can redistribute it and/or modify
6
it under the terms of the GNU General Public License as published by
7
the Free Software Foundation, either version 3 of the License, or
8
(at your option) any later version.
9

10
This program is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
GNU General Public License for more details.
14

15
You should have received a copy of the GNU General Public License
16
along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
*/
18

    
19
/**
20
 * @file
21
 * @brief   Structures and constant for the PowerManagement module.
22
 *
23
 * @addtogroup powermanagement_module
24
 * @{
25
 */
26

    
27
#ifndef AMIROOS_MODULE_H
28
#define AMIROOS_MODULE_H
29

    
30
#include <amiroos.h>
31

    
32
/*===========================================================================*/
33
/**
34
 * @name Module specific functions
35
 * @{
36
 */
37
/*===========================================================================*/
38

    
39
/**
40
 * @brief Makro to store data in the core coupled memory (ccm).
41
 *        Example:
42
 *        int compute_buffer[128] CCM_RAM;
43
 *
44
 * @note The ccm is not connected to any bus system.
45
 */
46
#define CCM_RAM(...)                            __attribute__((section(".ram4"), ##__VA_ARGS__))
47

    
48
/**
49
 * @brief Makro to store data in the ethernet memory (eth).
50
 *        Example:
51
 *        int dma_buffer[128] ETH_RAM;
52
 *
53
 * @note The eth is a dedicated memory block with its own DMA controller.
54
 */
55
#define ETH_RAM(...)                            __attribute__((section(".ram2"), ##__VA_ARGS__))
56

    
57
/**
58
 * @brief Makro to store data in the backup memory (bckp).
59
 *        Example:
60
 *        int backup_buffer[128] BCKP_RAM;
61
 *
62
 * @note The eth is a dedicated memory block with its own DMA controller.
63
 */
64
#define BCKP_RAM(...)                           __attribute__((section(".ram5"), ##__VA_ARGS__))
65

    
66
/** @} */
67

    
68
/*===========================================================================*/
69
/**
70
 * @name ChibiOS/HAL configuration
71
 * @{
72
 */
73
/*===========================================================================*/
74

    
75
/**
76
 * @brief   ADC driver for reading the system voltage.
77
 */
78
#define MODULE_HAL_ADC_VSYS                     ADCD1
79

    
80
/**
81
 * @brief   Configuration for the ADC.
82
 */
83
extern ADCConversionGroup moduleHalAdcVsysConversionGroup;
84

    
85
/**
86
 * @brief   CAN driver to use.
87
 */
88
#define MODULE_HAL_CAN                          CAND1
89

    
90
/**
91
 * @brief   Configuration for the CAN driver.
92
 */
93
extern CANConfig moduleHalCanConfig;
94

    
95
/**
96
 * @brief   I2C driver to access the sensor ring, power monitors for VIO1.8 and VIO3.3, and fuel gauge (rear battery).
97
 * @details Depending on the attached sensor ring, the devices connected to this bus vary:
98
 *          ProximitySensor:
99
 *            - I2C multiplexer (PCA9544A)
100
 *            - proximity sensors (VCNL4020) #1 - #4
101
 *          DistanceSensor (VL53L0X):
102
 *            TODO
103
 *          DistanceSensor (VL53L1X):
104
 *            TODO
105
 */
106
#define MODULE_HAL_I2C_SR_PM18_PM33_GAUGEREAR   I2CD1
107

    
108
/**
109
 * @brief   Configuration for the sensor ring, power monitors for VIO1.8 and VIO3.3, and fuel gauge (rear battery) I2C driver.
110
 * @details Depending on the attached sensor ring, the devices connected to this bus vary:
111
 *          ProximitySensor:
112
 *            - I2C multiplexer (PCA9544A)
113
 *            - proximity sensors (VCNL4020) #1 - #4
114
 *          DistanceSensor (VL53L0X):
115
 *            TODO
116
 *          DistanceSensor (VL53L1X):
117
 *            TODO
118
 */
119
extern I2CConfig moduleHalI2cSrPm18Pm33GaugeRearConfig;
120

    
121
/**
122
 * @brief   I2C driver to access the sensor ring, power monitors for VSYS4.2, VIO5.0 and VDD, EEPROM, and fuel gauge (front battery).
123
 * @details Depending on the attached sensor ring, the devices connected to this bus vary:
124
 *          ProximitySensor:
125
 *            - I2C multiplexer (PCA9544A)
126
 *            - proximity sensors (VCNL4020) #1 - #4
127
 *            - touch sensor (MPR121)
128
 *          DistanceSensor (VL53L0X):
129
 *            TODO
130
 *          DistanceSensor (VL53L1X):
131
 *            TODO
132
 */
133
#define MODULE_HAL_I2C_SR_PM42_PM50_PMVDD_EEPROM_GAUGEFRONT I2CD2
134

    
135
/**
136
 * @brief   Configuration for the sensor ring, power monitors for VSYS4.2, VIO5.0 and VDD, EEPROM, and fuel gauge (front battery) I2C driver.
137
 * @details Depending on the attached sensor ring, the devices connected to this bus vary:
138
 *          ProximitySensor:
139
 *            - I2C multiplexer (PCA9544A)
140
 *            - proximity sensors (VCNL4020) #1 - #4
141
 *            - touch sensor (MPR121)
142
 *          DistanceSensor (VL53L0X):
143
 *            TODO
144
 *          DistanceSensor (VL53L1X):
145
 *            TODO
146
 */
147
extern I2CConfig moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig;
148

    
149
/**
150
 * @brief   PWM driver for the buzzer.
151
 */
152
#define MODULE_HAL_PWM_BUZZER                   PWMD3
153

    
154
/**
155
 * @brief   Configuration of the PWM driver.
156
 */
157
extern PWMConfig moduleHalPwmBuzzerConfig;
158

    
159
/**
160
 * @brief   PWM channel for the buzzer.
161
 */
162
#define MODULE_HAL_PWM_BUZZER_CHANNEL           1
163

    
164
/**
165
 * @brief   Serial driver of the programmer interface.
166
 */
167
#define MODULE_HAL_PROGIF                       SD1
168

    
169
/**
170
 * @brief   Configuration for the programmer serial interface driver.
171
 */
172
extern SerialConfig moduleHalProgIfConfig;
173

    
174
/**
175
 * @brief   Real-Time Clock driver.
176
 */
177
#define MODULE_HAL_RTC                          RTCD1
178

    
179
/** @} */
180

    
181
/*===========================================================================*/
182
/**
183
 * @name GPIO definitions
184
 * @{
185
 */
186
/*===========================================================================*/
187

    
188
/**
189
 * @brief   SWITCH_STATUS input signal GPIO.
190
 */
191
extern ROMCONST apalControlGpio_t moduleGpioSwitchStatus;
192

    
193
/**
194
 * @brief   SYS_REG_EN output signal GPIO.
195
 */
196
extern ROMCONST apalControlGpio_t moduleGpioSysRegEn;
197

    
198
/**
199
 * @brief   IR_INT1 input signal GPIO.
200
 */
201
extern ROMCONST apalControlGpio_t moduleGpioIrInt1;
202

    
203
/**
204
 * @brief   POWER_EN output signal GPIO.
205
 */
206
extern ROMCONST apalControlGpio_t moduleGpioPowerEn;
207

    
208
/**
209
 * @brief   SYS_UART_DN bidirectional signal GPIO.
210
 */
211
extern ROMCONST apalControlGpio_t moduleGpioSysUartDn;
212

    
213
/**
214
 * @brief   CHARGE_STAT2A input signal GPIO.
215
 */
216
extern ROMCONST apalControlGpio_t moduleGpioChargeStat2A;
217

    
218
/**
219
 * @brief   GAUGE_BATLOW2 input signal GPIO.
220
 */
221
extern ROMCONST apalControlGpio_t moduleGpioGaugeBatLow2;
222

    
223
/**
224
 * @brief   GAUGE_BATGD2 input signal GPIO.
225
 */
226
extern ROMCONST apalControlGpio_t moduleGpioGaugeBatGd2;
227

    
228
/**
229
 * @brief   LED output signal GPIO.
230
 */
231
extern ROMCONST apalControlGpio_t moduleGpioLed;
232

    
233
/**
234
 * @brief   SYS_UART_UP bidirectional signal GPIO.
235
 */
236
extern ROMCONST apalControlGpio_t moduleGpioSysUartUp;
237

    
238
/**
239
 * @brief   CHARGE_STAT1A input signal GPIO.
240
 */
241
extern ROMCONST apalControlGpio_t moduleGpioChargeStat1A;
242

    
243
/**
244
 * @brief   GAUGE_BATLOW1 input signal GPIO.
245
 */
246
extern ROMCONST apalControlGpio_t moduleGpioGaugeBatLow1;
247

    
248
/**
249
 * @brief   GAUGE_BATGD1 input signal GPIO.
250
 */
251
extern ROMCONST apalControlGpio_t moduleGpioGaugeBatGd1;
252

    
253
/**
254
 * @brief   CHARGE_EN1 output signal GPIO.
255
 */
256
extern ROMCONST apalControlGpio_t moduleGpioChargeEn1;
257

    
258
/**
259
 * @brief   IR_INT2 input signal GPIO.
260
 */
261
extern ROMCONST apalControlGpio_t moduleGpioIrInt2;
262

    
263
/**
264
 * @brief   TOUCH_INT input signal GPIO.
265
 */
266
extern ROMCONST apalControlGpio_t moduleGpioTouchInt;
267

    
268
/**
269
 * @brief   SYS_DONE input signal GPIO.
270
 */
271
extern ROMCONST apalControlGpio_t moduleGpioSysDone;
272

    
273
/**
274
 * @brief   SYS_PROG output signal GPIO.
275
 */
276
extern ROMCONST apalControlGpio_t moduleGpioSysProg;
277

    
278
/**
279
 * @brief   PATH_DC input signal GPIO.
280
 */
281
extern ROMCONST apalControlGpio_t moduleGpioPathDc;
282

    
283
/**
284
 * @brief   SYS_SPI_DIR bidirectional signal GPIO.
285
 */
286
extern ROMCONST apalControlGpio_t moduleGpioSysSpiDir;
287

    
288
/**
289
 * @brief   SYS_SYNC bidirectional signal GPIO.
290
 */
291
extern ROMCONST apalControlGpio_t moduleGpioSysSync;
292

    
293
/**
294
 * @brief   SYS_PD bidirectional signal GPIO.
295
 */
296
extern ROMCONST apalControlGpio_t moduleGpioSysPd;
297

    
298
/**
299
 * @brief   SYS_WARMRST bidirectional signal GPIO.
300
 */
301
extern ROMCONST apalControlGpio_t moduleGpioSysWarmrst;
302

    
303
/**
304
 * @brief   BT_RST output signal GPIO.
305
 */
306
extern ROMCONST apalControlGpio_t moduleGpioBtRst;
307

    
308
/**
309
 * @brief   CHARGE_EN2 output signal GPIO.
310
 */
311
extern ROMCONST apalControlGpio_t moduleGpioChargeEn2;
312

    
313
/** @} */
314

    
315
/*===========================================================================*/
316
/**
317
 * @name AMiRo-OS core configurations
318
 * @{
319
 */
320
/*===========================================================================*/
321

    
322
/**
323
 * @brief   Event flag to be set on a IR_INT1 / CHARGE_STAT1A interrupt.
324
 */
325
#define MODULE_OS_GPIOEVENTFLAG_IRINT1          AOS_GPIOEVENT_FLAG(PAL_PAD(LINE_IR_INT1_N))
326

    
327
/**
328
 * @brief   Event flag to be set on a GAUGE_BATLOW1 interrupt.
329
 */
330
#define MODULE_OS_GPIOEVENTFLAG_GAUGEBATLOW1    AOS_GPIOEVENT_FLAG(PAL_PAD(LINE_GAUGE_BATLOW1))
331

    
332
/**
333
 * @brief   Event flag to be set on a GAUGE_BATGD1 interrupt.
334
 */
335
#define MODULE_OS_GPIOEVENTFLAG_GAUGEBATGD1     AOS_GPIOEVENT_FLAG(PAL_PAD(LINE_GAUGE_BATGD1_N))
336

    
337
/**
338
 * @brief   Event flag to be set on a SYS_UART_DN interrupt.
339
 */
340
#define MODULE_OS_GPIOEVENTFLAG_SYSUARTDN       AOS_GPIOEVENT_FLAG(PAL_PAD(LINE_SYS_UART_DN))
341

    
342
/**
343
 * @brief   Event flag to be set on a IR_INT2 / CHARGE_STAT2A interrupt.
344
 */
345
#define MODULE_OS_GPIOEVENTFLAG_IRINT2          AOS_GPIOEVENT_FLAG(PAL_PAD(LINE_IR_INT2_N))
346

    
347
/**
348
 * @brief   Event flag to be set on a TOUCH_INT interrupt.
349
 */
350
#define MODULE_OS_GPIOEVENTFLAG_TOUCHINT        AOS_GPIOEVENT_FLAG(PAL_PAD(LINE_TOUCH_INT_N))
351

    
352
/**
353
 * @brief   Event flag to be set on a GAUGE_BATLOW2 interrupt.
354
 */
355
#define MODULE_OS_GPIOEVENTFLAG_GAUGEBATLOW2    AOS_GPIOEVENT_FLAG(PAL_PAD(LINE_GAUGE_BATLOW2))
356

    
357
/**
358
 * @brief   Event flag to be set on a GAUGE_BATGD2 interrupt.
359
 */
360
#define MODULE_OS_GPIOEVENTFLAG_GAUGEBATGD2     AOS_GPIOEVENT_FLAG(PAL_PAD(LINE_GAUGE_BATGD2_N))
361

    
362
/**
363
 * @brief   Event flag to be set on a PATH_DC interrupt.
364
 */
365
#define MODULE_OS_GPIOEVENTFLAG_PATHDC          AOS_GPIOEVENT_FLAG(PAL_PAD(LINE_PATH_DC))
366

    
367
/**
368
 * @brief   Event flag to be set on a SYS_SPI_DIR interrupt.
369
 */
370
#define MODULE_OS_GPIOEVENTFLAG_SYSSPIDIR       AOS_GPIOEVENT_FLAG(PAL_PAD(LINE_SYS_SPI_DIR))
371

    
372
/**
373
 * @brief   Event flag to be set on a SYS_SYNC interrupt.
374
 */
375
#define MODULE_OS_GPIOEVENTFLAG_SYSSYNC         AOS_GPIOEVENT_FLAG(PAL_PAD(LINE_SYS_INT_N))
376

    
377
/**
378
 * @brief   Event flag to be set on a SYS_PD interrupt.
379
 */
380
#define MODULE_OS_GPIOEVENTFLAG_SYSPD           AOS_GPIOEVENT_FLAG(PAL_PAD(LINE_SYS_PD_N))
381

    
382
/**
383
 * @brief   Event flag to be set on a SYS_WARMRST interrupt.
384
 */
385
#define MODULE_OS_GPIOEVENTFLAG_SYSWARMRST      AOS_GPIOEVENT_FLAG(PAL_PAD(LINE_SYS_WARMRST_N))
386

    
387
/**
388
 * @brief   Event flag to be set on a SYS_UART_UP interrupt.
389
 */
390
#define MODULE_OS_GPIOEVENTFLAG_SYSUARTUP       AOS_GPIOEVENT_FLAG(PAL_PAD(LINE_SYS_UART_UP))
391

    
392
#if (AMIROOS_CFG_SHELL_ENABLE == true) || defined(__DOXYGEN__)
393
/**
394
 * @brief   Shell prompt text.
395
 */
396
extern ROMCONST char* moduleShellPrompt;
397
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) */
398

    
399
/**
400
 * @brief   Interrupt initialization macro.
401
 */
402
#define MODULE_INIT_INTERRUPTS() {                                            \
403
  /* IR_INT1 */                                                               \
404
  palSetLineCallback(moduleGpioIrInt1.gpio->line, aosSysGetStdGpioCallback(), &moduleGpioIrInt1.gpio->line);  \
405
  palEnableLineEvent(moduleGpioIrInt1.gpio->line, APAL2CH_EDGE(moduleGpioIrInt1.meta.edge));                  \
406
  /* GAUGE_BATLOW2 */                                                         \
407
  palSetLineCallback(moduleGpioGaugeBatLow2.gpio->line, aosSysGetStdGpioCallback(), &moduleGpioGaugeBatLow2.gpio->line);  \
408
  palEnableLineEvent(moduleGpioGaugeBatLow2.gpio->line, APAL2CH_EDGE(moduleGpioGaugeBatLow2.meta.edge));                  \
409
  /* GAUGE_BATGD2 */                                                          \
410
  palSetLineCallback(moduleGpioGaugeBatGd2.gpio->line, aosSysGetStdGpioCallback(), &moduleGpioGaugeBatGd2.gpio->line);  \
411
  palEnableLineEvent(moduleGpioGaugeBatGd2.gpio->line, APAL2CH_EDGE(moduleGpioGaugeBatGd2.meta.edge));                  \
412
  /* GAUGE_BATLOW1 */                                                         \
413
  palSetLineCallback(moduleGpioGaugeBatLow1.gpio->line, aosSysGetStdGpioCallback(), &moduleGpioGaugeBatLow1.gpio->line);  \
414
  palEnableLineEvent(moduleGpioGaugeBatLow1.gpio->line, APAL2CH_EDGE(moduleGpioGaugeBatLow1.meta.edge));                  \
415
  /* GAUGE_BATGD1 */                                                          \
416
  palSetLineCallback(moduleGpioGaugeBatGd1.gpio->line, aosSysGetStdGpioCallback(), &moduleGpioGaugeBatGd1.gpio->line);  \
417
  palEnableLineEvent(moduleGpioGaugeBatGd1.gpio->line, APAL2CH_EDGE(moduleGpioGaugeBatGd1.meta.edge));                  \
418
  /* IR_INT2 */                                                               \
419
  palSetLineCallback(moduleGpioIrInt2.gpio->line, aosSysGetStdGpioCallback(), &moduleGpioIrInt2.gpio->line);  \
420
  palEnableLineEvent(moduleGpioIrInt2.gpio->line, APAL2CH_EDGE(moduleGpioIrInt2.meta.edge));                  \
421
  /* TOUCH_INT */                                                             \
422
  palSetLineCallback(moduleGpioTouchInt.gpio->line, aosSysGetStdGpioCallback(), &moduleGpioTouchInt.gpio->line);  \
423
  palEnableLineEvent(moduleGpioTouchInt.gpio->line, APAL2CH_EDGE(moduleGpioTouchInt.meta.edge));                  \
424
  /* PATH_DC */                                                               \
425
  palSetLineCallback(moduleGpioPathDc.gpio->line, aosSysGetStdGpioCallback(), &moduleGpioPathDc.gpio->line);  \
426
  palEnableLineEvent(moduleGpioPathDc.gpio->line, APAL2CH_EDGE(moduleGpioPathDc.meta.edge));                  \
427
  /* SYS_SPI_DIR */                                                           \
428
  palSetLineCallback(moduleGpioSysSpiDir.gpio->line, aosSysGetStdGpioCallback(), &moduleGpioSysSpiDir.gpio->line);  \
429
  palEnableLineEvent(moduleGpioSysSpiDir.gpio->line, APAL2CH_EDGE(moduleGpioSysSpiDir.meta.edge));                  \
430
  /* SYS_WARMRST */                                                           \
431
  palSetLineCallback(moduleGpioSysWarmrst.gpio->line, aosSysGetStdGpioCallback(), &moduleGpioSysWarmrst.gpio->line);  \
432
  palEnableLineEvent(moduleGpioSysWarmrst.gpio->line, APAL2CH_EDGE(moduleGpioSysWarmrst.meta.edge));                  \
433
}
434

    
435
/**
436
 * @brief   Test initialization hook.
437
 */
438
#define MODULE_INIT_TESTS() {                                                 \
439
  /* add test commands to shell */                                            \
440
  aosShellAddCommand(&aos.shell, &moduleTestAdcShellCmd);                     \
441
  aosShellAddCommand(&aos.shell, &moduleTestAt24c01bShellCmd);                \
442
  aosShellAddCommand(&aos.shell, &moduleTestBq241xxShellCmd);                 \
443
  aosShellAddCommand(&aos.shell, &moduleTestBq27500ShellCmd);                 \
444
  aosShellAddCommand(&aos.shell, &moduleTestBq27500Bq241xxShellCmd);          \
445
  aosShellAddCommand(&aos.shell, &moduleTestIna219ShellCmd);                  \
446
  aosShellAddCommand(&aos.shell, &moduleTestLedShellCmd);                     \
447
  aosShellAddCommand(&aos.shell, &moduleTestSwitchShellCmd);                  \
448
  aosShellAddCommand(&aos.shell, &moduleTestTps6211xShellCmd);                \
449
  aosShellAddCommand(&aos.shell, &moduleTestTps6211xIna219ShellCmd);          \
450
  MODULE_INIT_TEST_SENSORRING();                                              \
451
  aosShellAddCommand(&aos.shell, &moduleTestAllShellCmd);                     \
452
}
453
#if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) || defined(__DOXYGEN__)
454
  #define MODULE_INIT_TEST_SENSORRING() {                                     \
455
    aosShellAddCommand(&aos.shell, &moduleTestPca9544aShellCmd);              \
456
    aosShellAddCommand(&aos.shell, &moduleTestMpr121ShellCmd);                \
457
    aosShellAddCommand(&aos.shell, &moduleTestVcnl4020ShellCmd);              \
458
  }
459
#elif (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || defined(__DOXYGEN__)
460
  #define MODULE_INIT_TEST_SENSORRING() {                                     \
461
    aosShellAddCommand(&aos.shell, &moduleTestPcal6524ShellCmd);              \
462
    aosShellAddCommand(&aos.shell, &moduleTestAt42qt1050ShellCmd);            \
463
  }
464
#elif (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) || defined(__DOXYGEN__)
465
  #define MODULE_INIT_TEST_SENSORRING() {                                     \
466
    aosShellAddCommand(&aos.shell, &moduleTestPcal6524ShellCmd);              \
467
    aosShellAddCommand(&aos.shell, &moduleTestAt42qt1050ShellCmd);            \
468
  }
469
#else /* (BOARD_SENSORRING == ?) */
470
  #define MODULE_INIT_TEST_SENSORRING()         {}
471
#endif /* (BOARD_SENSORRING == ?) */
472

    
473
/**
474
 * @brief   Periphery communication interfaces initialization hook.
475
 */
476
#define MODULE_INIT_PERIPHERY_IF() {                                          \
477
  MODULE_INIT_PERIPHERY_IF_SENSORRING();                                      \
478
  /* serial driver */                                                         \
479
  sdStart(&MODULE_HAL_PROGIF, &moduleHalProgIfConfig);                        \
480
  /* I2C */                                                                   \
481
  moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed = (INA219_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed) ? INA219_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed;  \
482
  moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed = (BQ27500_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed) ? BQ27500_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed;  \
483
  moduleHalI2cSrPm18Pm33GaugeRearConfig.duty_cycle = (moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed <= 100000) ? STD_DUTY_CYCLE : FAST_DUTY_CYCLE_2;  \
484
  i2cStart(&MODULE_HAL_I2C_SR_PM18_PM33_GAUGEREAR, &moduleHalI2cSrPm18Pm33GaugeRearConfig); \
485
  moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (INA219_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? INA219_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed; \
486
  moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (AT24C01B_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? AT24C01B_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed; \
487
  moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (BQ27500_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? BQ27500_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed; \
488
  moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.duty_cycle = (moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed <= 100000) ? STD_DUTY_CYCLE : FAST_DUTY_CYCLE_2;  \
489
  i2cStart(&MODULE_HAL_I2C_SR_PM42_PM50_PMVDD_EEPROM_GAUGEFRONT, &moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig);  \
490
  /* ADC */                                                                   \
491
  adcStart(&MODULE_HAL_ADC_VSYS, NULL);                                       \
492
  /* PWM */                                                                   \
493
  pwmStart(&MODULE_HAL_PWM_BUZZER, &moduleHalPwmBuzzerConfig);                \
494
  moduleHalPwmBuzzerConfig.frequency = MODULE_HAL_PWM_BUZZER.clock;           \
495
  pwmStop(&MODULE_HAL_PWM_BUZZER);                                            \
496
  moduleHalPwmBuzzerConfig.period = moduleHalPwmBuzzerConfig.frequency / PKxxxExxx_LLD_FREQUENCY_SPEC; \
497
  pwmStart(&MODULE_HAL_PWM_BUZZER, &moduleHalPwmBuzzerConfig);                \
498
  /* CAN */                                                                   \
499
  canStart(&MODULE_HAL_CAN, &moduleHalCanConfig);                             \
500
}
501
#if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) || defined(__DOXYGEN__)
502
  #define MODULE_INIT_PERIPHERY_IF_SENSORRING() {                             \
503
    moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed = (PCA9544A_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed) ? PCA9544A_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed;  \
504
    moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed = (VCNL4020_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed) ? VCNL4020_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed;  \
505
    moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (PCA9544A_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? PCA9544A_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed; \
506
    moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (VCNL4020_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? VCNL4020_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed; \
507
    moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (MPR121_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? MPR121_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed; \
508
  }
509
#elif (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || defined(__DOXYGEN__)
510
  #define MODULE_INIT_PERIPHERY_IF_SENSORRING() {                             \
511
    moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed = (PCAL6524_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed) ? PCAL6524_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed;  \
512
    moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (PCAL6524_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? PCAL6524_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed;  \
513
    moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (AT42QT1050_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? AT42QT1050_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed;  \
514
  }
515
#elif (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) || defined(__DOXYGEN__)
516
  #define MODULE_INIT_PERIPHERY_IF_SENSORRING() {                             \
517
    moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed = (PCAL6524_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed) ? PCAL6524_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed;  \
518
    moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (PCAL6524_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? PCAL6524_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed;  \
519
    moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (AT42QT1050_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? AT42QT1050_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed;  \
520
  }
521
#else /* (BOARD_SENSORRING == ?) */
522
  #define MODULE_INIT_PERIPHERY_IF_SENSORRING() {}
523
#endif /* (BOARD_SENSORRING == ?) */
524

    
525
/**
526
 * @brief   Periphery communication interface deinitialization hook.
527
 */
528
#define MODULE_SHUTDOWN_PERIPHERY_IF() {                                      \
529
  /* CAN */                                                                   \
530
  canStop(&MODULE_HAL_CAN);                                                   \
531
  /* PWM */                                                                   \
532
  pwmStop(&MODULE_HAL_PWM_BUZZER);                                            \
533
  /* ADC */                                                                   \
534
  adcStop(&MODULE_HAL_ADC_VSYS);                                              \
535
  /* I2C */                                                                   \
536
  i2cStop(&MODULE_HAL_I2C_SR_PM18_PM33_GAUGEREAR);                            \
537
  i2cStop(&MODULE_HAL_I2C_SR_PM42_PM50_PMVDD_EEPROM_GAUGEFRONT);              \
538
  /* don't stop the serial driver so messages can still be printed */         \
539
}
540

    
541
#define AMIROOS_CFG_SYSINFO_HOOK() {                                          \
542
  _printSystemInfoLine(stream, "Built for Sensor Ring", SYSTEM_INFO_NAMEWIDTH, "%s", \
543
                       (BOARD_SENSORRING == BOARD_NOSENSORRING) ? "none" :  \
544
                       (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) ? "ProximitySensor (VCNL4020)" : \
545
                       (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) ? "DistanceSensor (VL53L0X)" :  \
546
                       (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) ? "DistanceSensor (VL53L1X)" :  \
547
                       "unknown");                                            \
548
  switch_lld_state_t s;                                                       \
549
  switch_lld_get(&moduleLldBatterySwitch, &s);                                \
550
  _printSystemInfoLine(stream, "Battery Switch", SYSTEM_INFO_NAMEWIDTH, "%s", (s == SWITCH_LLD_STATE_ON) ? "on" : "off"); \
551
}
552

    
553
/** @} */
554

    
555
/*===========================================================================*/
556
/**
557
 * @name Startup Shutdown Synchronization Protocol (SSSP)
558
 * @{
559
 */
560
/*===========================================================================*/
561

    
562
#define moduleSsspSignalPD()                    (&moduleGpioSysPd)
563
#define moduleSsspEventflagPD()                 MODULE_OS_GPIOEVENTFLAG_SYSPD
564

    
565
#define moduleSsspSignalS()                     (&moduleGpioSysSync)
566
#define moduleSsspEventflagS()                  MODULE_OS_GPIOEVENTFLAG_SYSSYNC
567

    
568
#define moduleSsspSignalUP()                    (&moduleGpioSysUartUp)
569
#define moduleSsspEventflagUP()                 MODULE_OS_GPIOEVENTFLAG_SYSUARTUP
570

    
571
#define moduleSsspSignalDN()                    (&moduleGpioSysUartDn)
572
#define moduleSsspEventflagDN()                 MODULE_OS_GPIOEVENTFLAG_SYSUARTDN
573

    
574
/** @} */
575

    
576
/*===========================================================================*/
577
/**
578
 * @name Low-level drivers
579
 * @{
580
 */
581
/*===========================================================================*/
582
#include <alld_AT24C01B.h>
583
#include <alld_bq241xx.h>
584
#include <alld_bq27500.h>
585
#include <alld_INA219.h>
586
#include <alld_LED.h>
587
#include <alld_PKxxxExxx.h>
588
#include <alld_switch.h>
589
#include <alld_TPS6211x.h>
590

    
591
/**
592
 * @brief   EEPROM driver.
593
 */
594
extern AT24C01BDriver moduleLldEeprom;
595

    
596
/**
597
 * @brief   Battery charger (front battery) driver.
598
 */
599
extern BQ241xxDriver moduleLldBatteryChargerFront;
600

    
601
/**
602
 * @brief   Battery charger (rear battery) driver.
603
 */
604
extern BQ241xxDriver moduleLldBatteryChargerRear;
605

    
606
/**
607
 * @brief   Fuel gauge (front battery) driver.
608
 */
609
extern BQ27500Driver moduleLldFuelGaugeFront;
610

    
611
/**
612
 * @brief   Fuel gauge (rear battery) driver.
613
 */
614
extern BQ27500Driver moduleLldFuelGaugeRear;
615

    
616
/**
617
 * @brief   Power monitor (VDD) driver.
618
 */
619
extern INA219Driver moduleLldPowerMonitorVdd;
620

    
621
/**
622
 * @brief   Power monitor (VIO 1.8) driver.
623
 */
624
extern INA219Driver moduleLldPowerMonitorVio18;
625

    
626
/**
627
 * @brief   Power monitor (VIO 3.3) driver.
628
 */
629
extern INA219Driver moduleLldPowerMonitorVio33;
630

    
631
/**
632
 * @brief   Power monitor (VSYS 4.2) driver.
633
 */
634
extern INA219Driver moduleLldPowerMonitorVsys42;
635

    
636
/**
637
 * @brief   Power monitor (VIO 5.0) driver.
638
 */
639
extern INA219Driver moduleLldPowerMonitorVio50;
640

    
641
/**
642
 * @brief   Status LED driver.
643
 */
644
extern LEDDriver moduleLldStatusLed;
645

    
646
/**
647
 * @brief   Battery switch driver.
648
 */
649
extern SwitchDriver moduleLldBatterySwitch;
650

    
651
/**
652
 * @brief   Step down converter driver.
653
 * @note    Although there multiple TPS6211x, those are completely identical from driver few (share the same signals).
654
 */
655
extern TPS6211xDriver moduleLldStepDownConverter;
656

    
657
#if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) || defined(__DOXYGEN__)
658

    
659
#include <alld_MPR121.h>
660
#include <alld_PCA9544A.h>
661
#include <alld_VCNL4020.h>
662

    
663
/**
664
 * @brief   Touch sensor driver.
665
 */
666
extern MPR121Driver moduleLldTouch;
667

    
668
/**
669
 * @brief   I2C multiplexer (I2C #1) driver.
670
 */
671
extern PCA9544ADriver moduleLldI2cMultiplexer1;
672

    
673
/**
674
 * @brief   I2C multiplexer (I2C #2) driver.
675
 */
676
extern PCA9544ADriver moduleLldI2cMultiplexer2;
677

    
678
/**
679
 * @brief   Proximity sensor (I2C #1) driver.
680
 */
681
extern VCNL4020Driver moduleLldProximity1;
682

    
683
/**
684
 * @brief   Proximity sensor (I2C #2) driver.
685
 */
686
extern VCNL4020Driver moduleLldProximity2;
687

    
688
#endif /* (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) */
689

    
690
#if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || defined(__DOXYGEN__)
691

    
692
#include <alld_PCAL6524.h>
693
#include <alld_AT42QT1050.h>
694

    
695
/**
696
 * @brief   GPIO extender (I2C #1) driver.
697
 */
698
extern PCAL6524Driver moduleLldGpioExtender1;
699

    
700
/**
701
 * @brief   GPIO extender (I2C #2) driver.
702
 */
703
extern PCAL6524Driver moduleLldGpioExtender2;
704

    
705
/**
706
 * @brief   Touch sensor driver.
707
 */
708
extern AT42QT1050Driver moduleLldTouch;
709

    
710
#endif /* (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) */
711

    
712
#if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) || defined(__DOXYGEN__)
713

    
714
#include <alld_PCAL6524.h>
715
#include <alld_AT42QT1050.h>
716

    
717
/**
718
 * @brief   GPIO extender (I2C #1) driver.
719
 */
720
extern PCAL6524Driver moduleLldGpioExtender1;
721

    
722
/**
723
 * @brief   GPIO extender (I2C #2) driver.
724
 */
725
extern PCAL6524Driver moduleLldGpioExtender2;
726

    
727
/**
728
 * @brief   Touch sensor driver.
729
 */
730
extern AT42QT1050Driver moduleLldTouch;
731

    
732
#endif /* (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) */
733

    
734
/** @} */
735

    
736
/*===========================================================================*/
737
/**
738
 * @name Tests
739
 * @{
740
 */
741
/*===========================================================================*/
742
#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
743

    
744
/**
745
 * @brief   ADC test command.
746
 */
747
extern aos_shellcommand_t moduleTestAdcShellCmd;
748

    
749
/**
750
 * @brief   AT24C01BN-SH-B (EEPROM) test command.
751
 */
752
extern aos_shellcommand_t moduleTestAt24c01bShellCmd;
753

    
754
/**
755
 * @brief   bq24103a (battery charger) test command.
756
 */
757
extern aos_shellcommand_t moduleTestBq241xxShellCmd;
758

    
759
/**
760
 * @brief   bq27500 (fuel gauge) test command.
761
 */
762
extern aos_shellcommand_t moduleTestBq27500ShellCmd;
763

    
764
/**
765
 * @brief   bq27500 (fuel gauge) in combination with bq24103a (battery charger) test command.
766
 */
767
extern aos_shellcommand_t moduleTestBq27500Bq241xxShellCmd;
768

    
769
/**
770
 * @brief   INA219 (power monitor) test command.
771
 */
772
extern aos_shellcommand_t moduleTestIna219ShellCmd;
773

    
774
/**
775
 * @brief   Status LED test command.
776
 */
777
extern aos_shellcommand_t moduleTestLedShellCmd;
778

    
779
/**
780
 * @brief   PKLCS1212E4001 (buzzer) test command.
781
 */
782
extern aos_shellcommand_t moduleTestPkxxxexxxShellCmd;
783

    
784
/**
785
 * @brief   Switch test command.
786
 */
787
extern aos_shellcommand_t moduleTestSwitchShellCmd;
788

    
789
/**
790
 * @brief   TPS62113 (step-down converter) test command.
791
 */
792
extern aos_shellcommand_t moduleTestTps6211xShellCmd;
793

    
794
/**
795
 * @brief   TPS62113 (step-sown converter) in combination with INA219 (power monitor) test command.
796
 */
797
extern aos_shellcommand_t moduleTestTps6211xIna219ShellCmd;
798

    
799
#if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) || defined(__DOXYGEN__)
800

    
801
/**
802
 * @brief   MPR121 (touch sensor) test command.
803
 */
804
extern aos_shellcommand_t moduleTestMpr121ShellCmd;
805

    
806
/**
807
 * @brief   PCA9544A (I2C multiplexer) test command.
808
 */
809
extern aos_shellcommand_t moduleTestPca9544aShellCmd;
810

    
811
/**
812
 * @brief   VCNL4020 (proximity sensor) test command.
813
 */
814
extern aos_shellcommand_t moduleTestVcnl4020ShellCmd;
815

    
816
#endif /* (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) */
817

    
818
#if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || defined(__DOXYGEN__)
819

    
820
/**
821
 * @brief   PCAL6524 (GPIO extender) test command.
822
 */
823
extern aos_shellcommand_t moduleTestPcal6524ShellCmd;
824

    
825
/**
826
 * @brief   AT42QT1050 (touch sensor) test command.
827
 */
828
extern aos_shellcommand_t moduleTestAt42qt1050ShellCmd;
829

    
830
#endif /* (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) */
831

    
832
#if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) || defined(__DOXYGEN__)
833

    
834
/**
835
 * @brief   PCAL6524 (GPIO extender) test command.
836
 */
837
extern aos_shellcommand_t moduleTestPcal6524ShellCmd;
838

    
839
/**
840
 * @brief   AT42QT1050 (touch sensor) test command.
841
 */
842
extern aos_shellcommand_t moduleTestAt42qt1050ShellCmd;
843

    
844
#endif /* (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) */
845

    
846
/**
847
 * @brief   Entire module test command.
848
 */
849
extern aos_shellcommand_t moduleTestAllShellCmd;
850

    
851
#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
852

    
853
/** @} */
854

    
855
#endif /* AMIROOS_MODULE_H */
856

    
857
/** @} */