Statistics
| Branch: | Tag: | Revision:

amiro-os / modules / PowerManagement_1-1 / module.h @ 8be006e0

History | View | Annotate | Download (28.217 KB)

1
/*
2
AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
3
Copyright (C) 2016..2019  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
/*===========================================================================*/
31
/**
32
 * @name Module specific functions
33
 * @{
34
 */
35
/*===========================================================================*/
36

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

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

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

    
64
/** @} */
65

    
66
/*===========================================================================*/
67
/**
68
 * @name ChibiOS/HAL configuration
69
 * @{
70
 */
71
/*===========================================================================*/
72
#include <hal.h>
73

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

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

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

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

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

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

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

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

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

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

    
158
/**
159
 * @brief   PWM channeö for the buzzer.
160
 */
161
#define MODULE_HAL_PWM_BUZZER_CHANNEL           1
162

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

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

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

    
178
/** @} */
179

    
180
/*===========================================================================*/
181
/**
182
 * @name GPIO definitions
183
 * @{
184
 */
185
/*===========================================================================*/
186
#include <periphALtypes.h>
187

    
188
/**
189
 * @brief   SYS_REG_EN output signal GPIO.
190
 */
191
extern ROMCONST apalControlGpio_t moduleGpioSysRegEn;
192

    
193
/**
194
 * @brief   IR_INT1 input signal GPIO.
195
 */
196
extern ROMCONST apalControlGpio_t moduleGpioIrInt1;
197

    
198
/**
199
 * @brief   POWER_EN output signal GPIO.
200
 */
201
extern ROMCONST apalControlGpio_t moduleGpioPowerEn;
202

    
203
/**
204
 * @brief   SYS_UART_DN bidirectional signal GPIO.
205
 */
206
extern ROMCONST apalControlGpio_t moduleGpioSysUartDn;
207

    
208
/**
209
 * @brief   CHARGE_STAT2A input signal GPIO.
210
 */
211
extern ROMCONST apalControlGpio_t moduleGpioChargeStat2A;
212

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

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

    
223
/**
224
 * @brief   LED output signal GPIO.
225
 */
226
extern ROMCONST apalControlGpio_t moduleGpioLed;
227

    
228
/**
229
 * @brief   SYS_UART_UP bidirectional signal GPIO.
230
 */
231
extern ROMCONST apalControlGpio_t moduleGpioSysUartUp;
232

    
233
/**
234
 * @brief   CHARGE_STAT1A input signal GPIO.
235
 */
236
extern ROMCONST apalControlGpio_t moduleGpioChargeStat1A;
237

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

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

    
248
/**
249
 * @brief   CHARG_EN1 output signal GPIO.
250
 */
251
extern ROMCONST apalControlGpio_t moduleGpioChargeEn1;
252

    
253
/**
254
 * @brief   IR_INT2 input signal GPIO.
255
 */
256
extern ROMCONST apalControlGpio_t moduleGpioIrInt2;
257

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

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

    
268
/**
269
 * @brief   SYS_PROG output signal GPIO.
270
 */
271
extern ROMCONST apalControlGpio_t moduleGpioSysProg;
272

    
273
/**
274
 * @brief   PATH_DC input signal GPIO.
275
 */
276
extern ROMCONST apalControlGpio_t moduleGpioPathDc;
277

    
278
/**
279
 * @brief   SYS_SPI_DIR bidirectional signal GPIO.
280
 */
281
extern ROMCONST apalControlGpio_t moduleGpioSysSpiDir;
282

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

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

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

    
298
/**
299
 * @brief   BT_RST output signal GPIO.
300
 */
301
extern ROMCONST apalControlGpio_t moduleGpioBtRst;
302

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

    
308
/** @} */
309

    
310
/*===========================================================================*/
311
/**
312
 * @name AMiRo-OS core configurations
313
 * @{
314
 */
315
/*===========================================================================*/
316

    
317
/**
318
 * @brief   Event flag to be set on a IR_INT1 / CHARGE_STAT1A interrupt.
319
 */
320
#define MODULE_OS_IOEVENTFLAGS_IRINT1           ((eventflags_t)1 << GPIOB_IR_INT1_N)
321

    
322
/**
323
 * @brief   Event flag to be set on a GAUGE_BATLOW1 interrupt.
324
 */
325
#define MODULE_OS_IOEVENTFLAGS_GAUGEBATLOW1     ((eventflags_t)1 << GPIOC_GAUGE_BATLOW1)
326

    
327
/**
328
 * @brief   Event flag to be set on a GAUGE_BATGD1 interrupt.
329
 */
330
#define MODULE_OS_IOEVENTFLAGS_GAUGEBATGD1      ((eventflags_t)1 << GPIOC_GAUGE_BATGD1_N)
331

    
332
/**
333
 * @brief   Event flag to be set on a SYS_UART_DN interrupt.
334
 */
335
#define MODULE_OS_IOEVENTFLAGS_SYSUARTDN        ((eventflags_t)1 << GPIOB_SYS_UART_DN)
336

    
337
/**
338
 * @brief   Event flag to be set on a IR_INT2 / CHARGE_STAT2A interrupt.
339
 */
340
#define MODULE_OS_IOEVENTFLAGS_IRINT2           ((eventflags_t)1 << GPIOC_IR_INT2_N)
341

    
342
/**
343
 * @brief   Event flag to be set on a TOUCH_INT interrupt.
344
 */
345
#define MODULE_OS_IOEVENTFLAGS_TOUCHINT         ((eventflags_t)1 << GPIOC_TOUCH_INT_N)
346

    
347
/**
348
 * @brief   Event flag to be set on a GAUGE_BATLOW2 interrupt.
349
 */
350
#define MODULE_OS_IOEVENTFLAGS_GAUGEBATLOW2     ((eventflags_t)1 << GPIOB_GAUGE_BATLOW2)
351

    
352
/**
353
 * @brief   Event flag to be set on a GAUGE_BATGD2 interrupt.
354
 */
355
#define MODULE_OS_IOEVENTFLAGS_GAUGEBATGD2      ((eventflags_t)1 << GPIOB_GAUGE_BATGD2_N)
356

    
357
/**
358
 * @brief   Event flag to be set on a PATH_DC interrupt.
359
 */
360
#define MODULE_OS_IOEVENTFLAGS_PATHDC           ((eventflags_t)1 << GPIOC_PATH_DC)
361

    
362
/**
363
 * @brief   Event flag to be set on a SYS_SPI_DIR interrupt.
364
 */
365
#define MODULE_OS_IOEVENTFLAGS_SYSSPIDIR        ((eventflags_t)1 << GPIOC_SYS_SPI_DIR)
366

    
367
/**
368
 * @brief   Event flag to be set on a SYS_SYNC interrupt.
369
 */
370
#define MODULE_OS_IOEVENTFLAGS_SYSSYNC          ((eventflags_t)1 << GPIOC_SYS_INT_N)
371

    
372
/**
373
 * @brief   Event flag to be set on a SYS_PD interrupt.
374
 */
375
#define MODULE_OS_IOEVENTFLAGS_SYSPD            ((eventflags_t)1 << GPIOC_SYS_PD_N)
376

    
377
/**
378
 * @brief   Event flag to be set on a SYS_WARMRST interrupt.
379
 */
380
#define MODULE_OS_IOEVENTFLAGS_SYSWARMRST       ((eventflags_t)1 << GPIOC_SYS_WARMRST_N)
381

    
382
/**
383
 * @brief   Event flag to be set on a SYS_UART_UP interrupt.
384
 */
385
#define MODULE_OS_IOEVENTFLAGS_SYSUARTUP        ((eventflags_t)1 << GPIOB_SYS_UART_UP)
386

    
387
#if (AMIROOS_CFG_SHELL_ENABLE == true) || defined(__DOXYGEN__)
388
/**
389
 * @brief   Shell prompt text.
390
 */
391
extern ROMCONST char* moduleShellPrompt;
392
#endif
393

    
394
/**
395
 * @brief   Interrupt initialization macro.
396
 * @note    SSSP related interrupt signals are already initialized in 'aos_system.c'.
397
 */
398
#define MODULE_INIT_INTERRUPTS() {                                            \
399
  /* IR_INT1 */                                                               \
400
  palSetPadCallback(moduleGpioIrInt1.gpio->port, moduleGpioIrInt1.gpio->pad, _intCallback, &moduleGpioIrInt1.gpio->pad); \
401
  palEnablePadEvent(moduleGpioIrInt1.gpio->port, moduleGpioIrInt1.gpio->pad, APAL2CH_EDGE(moduleGpioIrInt1.meta.edge));  \
402
  /* GAUGE_BATLOW2 */                                                         \
403
  palSetPadCallback(moduleGpioGaugeBatLow2.gpio->port, moduleGpioGaugeBatLow2.gpio->pad, _intCallback, &moduleGpioGaugeBatLow2.gpio->pad);  \
404
  palEnablePadEvent(moduleGpioGaugeBatLow2.gpio->port, moduleGpioGaugeBatLow2.gpio->pad, APAL2CH_EDGE(moduleGpioGaugeBatLow2.meta.edge));   \
405
  /* GAUGE_BATGD2 */                                                          \
406
  palSetPadCallback(moduleGpioGaugeBatGd2.gpio->port, moduleGpioGaugeBatGd2.gpio->pad, _intCallback, &moduleGpioGaugeBatGd2.gpio->pad); \
407
  palEnablePadEvent(moduleGpioGaugeBatGd2.gpio->port, moduleGpioGaugeBatGd2.gpio->pad, APAL2CH_EDGE(moduleGpioGaugeBatGd2.meta.edge));  \
408
  /* GAUGE_BATLOW1 */                                                         \
409
  palSetPadCallback(moduleGpioGaugeBatLow1.gpio->port, moduleGpioGaugeBatLow1.gpio->pad, _intCallback, &moduleGpioGaugeBatLow1.gpio->pad);  \
410
  palEnablePadEvent(moduleGpioGaugeBatLow1.gpio->port, moduleGpioGaugeBatLow1.gpio->pad, APAL2CH_EDGE(moduleGpioGaugeBatLow1.meta.edge));   \
411
  /* GAUGE_BATGD1 */                                                          \
412
  palSetPadCallback(moduleGpioGaugeBatGd1.gpio->port, moduleGpioGaugeBatGd1.gpio->pad, _intCallback, &moduleGpioGaugeBatGd1.gpio->pad); \
413
  palEnablePadEvent(moduleGpioGaugeBatGd1.gpio->port, moduleGpioGaugeBatGd1.gpio->pad, APAL2CH_EDGE(moduleGpioGaugeBatGd1.meta.edge));  \
414
  /* IR_INT2 */                                                               \
415
  palSetPadCallback(moduleGpioIrInt2.gpio->port, moduleGpioIrInt2.gpio->pad, _intCallback, &moduleGpioIrInt2.gpio->pad); \
416
  palEnablePadEvent(moduleGpioIrInt2.gpio->port, moduleGpioIrInt2.gpio->pad, APAL2CH_EDGE(moduleGpioIrInt2.meta.edge));  \
417
  /* TOUCH_INT */                                                             \
418
  palSetPadCallback(moduleGpioTouchInt.gpio->port, moduleGpioTouchInt.gpio->pad, _intCallback, &moduleGpioTouchInt.gpio->pad); \
419
  palEnablePadEvent(moduleGpioTouchInt.gpio->port, moduleGpioTouchInt.gpio->pad, APAL2CH_EDGE(moduleGpioTouchInt.meta.edge));  \
420
  /* PATH_DC */                                                               \
421
  palSetPadCallback(moduleGpioPathDc.gpio->port, moduleGpioPathDc.gpio->pad, _intCallback, &moduleGpioPathDc.gpio->pad);  \
422
  palEnablePadEvent(moduleGpioPathDc.gpio->port, moduleGpioPathDc.gpio->pad, APAL2CH_EDGE(moduleGpioPathDc.meta.edge));   \
423
  /* SYS_SPI_DIR */                                                           \
424
  palSetPadCallback(moduleGpioSysSpiDir.gpio->port, moduleGpioSysSpiDir.gpio->pad, _intCallback, &moduleGpioSysSpiDir.gpio->pad); \
425
  palEnablePadEvent(moduleGpioSysSpiDir.gpio->port, moduleGpioSysSpiDir.gpio->pad, APAL2CH_EDGE(moduleGpioSysSpiDir.meta.edge));  \
426
  /* SYS_WARMRST */                                                           \
427
  palSetPadCallback(moduleGpioSysWarmrst.gpio->port, moduleGpioSysWarmrst.gpio->pad, _intCallback, &moduleGpioSysWarmrst.gpio->pad);  \
428
  palEnablePadEvent(moduleGpioSysWarmrst.gpio->port, moduleGpioSysWarmrst.gpio->pad, APAL2CH_EDGE(moduleGpioSysWarmrst.meta.edge));   \
429
}
430

    
431
/**
432
 * @brief   Unit test initialization hook.
433
 */
434
#define MODULE_INIT_TESTS() {                                                 \
435
  /* add unit-test shell commands */                                          \
436
  aosShellAddCommand(&aos.shell, &moduleUtAdcVsys.shellcmd);                  \
437
  aosShellAddCommand(&aos.shell, &moduleUtAlldAt24c01bn.shellcmd);            \
438
  aosShellAddCommand(&aos.shell, &moduleUtAlldBq24103a.shellcmd);             \
439
  aosShellAddCommand(&aos.shell, &moduleUtAlldBq27500.shellcmd);              \
440
  aosShellAddCommand(&aos.shell, &moduleUtAlldBq27500Bq24103a.shellcmd);      \
441
  aosShellAddCommand(&aos.shell, &moduleUtAlldIna219.shellcmd);               \
442
  aosShellAddCommand(&aos.shell, &moduleUtAlldPklcs1212e4001.shellcmd);       \
443
  aosShellAddCommand(&aos.shell, &moduleUtAlldLed.shellcmd);                  \
444
  aosShellAddCommand(&aos.shell, &moduleUtAlldTps62113.shellcmd);             \
445
  aosShellAddCommand(&aos.shell, &moduleUtAlldTps62113Ina219.shellcmd);       \
446
  MODULE_INIT_TEST_SENSORRING();                                              \
447
}
448
#if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) || defined(__DOXYGEN__)
449
  #define MODULE_INIT_TEST_SENSORRING() {                                     \
450
    aosShellAddCommand(&aos.shell, &moduleUtAlldPca9544a.shellcmd);           \
451
    aosShellAddCommand(&aos.shell, &moduleUtAlldMpr121.shellcmd);             \
452
    aosShellAddCommand(&aos.shell, &moduleUtAlldVcnl4020.shellcmd);           \
453
  }
454
#elif (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || defined(__DOXYGEN__)
455
  #define MODULE_INIT_TEST_SENSORRING() {                                     \
456
    /* TODO */                                                                \
457
  }
458
#elif (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) || defined(__DOXYGEN__)
459
  #define MODULE_INIT_TEST_SENSORRING() {                                     \
460
    /* TODO */                                                                \
461
  }
462
#else
463
  #define MODULE_INIT_TEST_SENSORRING()         {}
464
#endif
465

    
466
/**
467
 * @brief   Periphery communication interfaces initialization hook.
468
 */
469
#define MODULE_INIT_PERIPHERY_COMM() {                                        \
470
  MODULE_INIT_PERIPHERY_COMM_SENSORRING();                                    \
471
  /* serial driver */                                                         \
472
  sdStart(&MODULE_HAL_PROGIF, &moduleHalProgIfConfig);                        \
473
  /* I2C */                                                                   \
474
  moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed = (INA219_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed) ? INA219_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed;  \
475
  moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed = (BQ27500_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed) ? BQ27500_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed;  \
476
  moduleHalI2cSrPm18Pm33GaugeRearConfig.duty_cycle = (moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed <= 100000) ? STD_DUTY_CYCLE : FAST_DUTY_CYCLE_2;  \
477
  i2cStart(&MODULE_HAL_I2C_SR_PM18_PM33_GAUGEREAR, &moduleHalI2cSrPm18Pm33GaugeRearConfig); \
478
  moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (INA219_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? INA219_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed; \
479
  moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (AT24C01BN_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? AT24C01BN_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed; \
480
  moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (BQ27500_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? BQ27500_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed; \
481
  moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.duty_cycle = (moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed <= 100000) ? STD_DUTY_CYCLE : FAST_DUTY_CYCLE_2;  \
482
  i2cStart(&MODULE_HAL_I2C_SR_PM42_PM50_PMVDD_EEPROM_GAUGEFRONT, &moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig);  \
483
  /* ADC */                                                                   \
484
  adcStart(&MODULE_HAL_ADC_VSYS, NULL);                                       \
485
  /* PWM */                                                                   \
486
  pwmStart(&MODULE_HAL_PWM_BUZZER, &moduleHalPwmBuzzerConfig);                \
487
  moduleHalPwmBuzzerConfig.frequency = MODULE_HAL_PWM_BUZZER.clock;           \
488
  pwmStop(&MODULE_HAL_PWM_BUZZER);                                            \
489
  moduleHalPwmBuzzerConfig.period = moduleHalPwmBuzzerConfig.frequency / PKLCS1212E4001_LLD_FREQUENCY_SPEC; \
490
  pwmStart(&MODULE_HAL_PWM_BUZZER, &moduleHalPwmBuzzerConfig);                \
491
}
492
#if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) || defined(__DOXYGEN__)
493
  #define MODULE_INIT_PERIPHERY_COMM_SENSORRING() {                           \
494
    moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed = (PCA9544A_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed) ? PCA9544A_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed;  \
495
    moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed = (VCNL4020_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed) ? VCNL4020_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed;  \
496
    moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (PCA9544A_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? PCA9544A_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed; \
497
    moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (VCNL4020_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? VCNL4020_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed; \
498
    moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (MPR121_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? MPR121_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed; \
499
  }
500
#elif (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || defined(__DOXYGEN__)
501
  #define MODULE_INIT_PERIPHERY_COMM_SENSORRING() {                           \
502
    /* TODO */                                                                \
503
  }
504
#elif (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) || defined(__DOXYGEN__)
505
  #define MODULE_INIT_PERIPHERY_COMM_SENSORRING() {                           \
506
    /* TODO */                                                                \
507
  }
508
#else
509
  #define MODULE_INIT_PERIPHERY_COMM_SENSORRING() {}
510
#endif
511

    
512
/**
513
 * @brief   Periphery communication interface deinitialization hook.
514
 */
515
#define MODULE_SHUTDOWN_PERIPHERY_COMM() {                                    \
516
  /* PWM */                                                                   \
517
  pwmStop(&MODULE_HAL_PWM_BUZZER);                                            \
518
  /* ADC */                                                                   \
519
  adcStop(&MODULE_HAL_ADC_VSYS);                                              \
520
  /* I2C */                                                                   \
521
  i2cStop(&MODULE_HAL_I2C_SR_PM18_PM33_GAUGEREAR);                            \
522
  i2cStop(&MODULE_HAL_I2C_SR_PM42_PM50_PMVDD_EEPROM_GAUGEFRONT);              \
523
  /* don't stop the serial driver so messages can still be printed */         \
524
}
525

    
526
/** @} */
527

    
528
/*===========================================================================*/
529
/**
530
 * @name Startup Shutdown Synchronization Protocol (SSSP)
531
 * @{
532
 */
533
/*===========================================================================*/
534

    
535
/**
536
 * @brief   PD signal GPIO.
537
 */
538
#define moduleSsspGpioPd                        moduleGpioSysPd
539

    
540
/**
541
 * @brief   SYNC signal GPIO.
542
 */
543
#define moduleSsspGpioSync                       moduleGpioSysSync
544

    
545
/**
546
 * @brief   DN signal GPIO.
547
 */
548
#define moduleSsspGpioDn                        moduleGpioSysUartDn
549

    
550
/**
551
 * @brief   UP signal GPIO.
552
 */
553
#define moduleSsspGpioUp                        moduleGpioSysUartUp
554

    
555
/**
556
 * @brief   Event flags for PD signal events.
557
 */
558
#define MODULE_SSSP_EVENTFLAGS_PD               MODULE_OS_IOEVENTFLAGS_SYSPD
559

    
560
/**
561
 * @brief   Event flags for SYNC signal events.
562
 */
563
#define MODULE_SSSP_EVENTFLAGS_SYNC             MODULE_OS_IOEVENTFLAGS_SYSSYNC
564

    
565
/**
566
 * @brief   Event flags for UP signal events.
567
 */
568
#define MODULE_SSSP_EVENTFLAGS_UP               MODULE_OS_IOEVENTFLAGS_SYSUARTUP
569

    
570
/**
571
 * @brief   Event flags for DN signal events.
572
 */
573
#define MODULE_SSSP_EVENTFLAGS_DN               MODULE_OS_IOEVENTFLAGS_SYSUARTDN
574

    
575
/** @} */
576

    
577
/*===========================================================================*/
578
/**
579
 * @name Low-level drivers
580
 * @{
581
 */
582
/*===========================================================================*/
583
#include <alld_at24c01bn-sh-b.h>
584
#include <alld_bq24103a.h>
585
#include <alld_bq27500.h>
586
#include <alld_ina219.h>
587
#include <alld_led.h>
588
#include <alld_pklcs1212e4001.h>
589
#include <alld_tps62113.h>
590

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

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

    
601
/**
602
 * @brief   Battery charger (rear battery) driver.
603
 */
604
extern BQ24103ADriver 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   Step down converter driver.
648
 * @note    Although there multiple TPS62113, those are completely identical from driver few (share the same signals).
649
 */
650
extern TPS62113Driver moduleLldStepDownConverter;
651

    
652
#if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) || defined(__DOXYGEN__)
653

    
654
#include <alld_mpr121.h>
655
#include <alld_pca9544a.h>
656
#include <alld_vcnl4020.h>
657

    
658
/**
659
 * @brief   Touch sensor driver.
660
 */
661
extern MPR121Driver moduleLldTouch;
662

    
663
/**
664
 * @brief   I2C multiplexer (I2C #1) driver.
665
 */
666
extern PCA9544ADriver moduleLldI2cMultiplexer1;
667

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

    
673
/**
674
 * @brief   Proximity sensor (I2C #1) driver.
675
 */
676
extern VCNL4020Driver moduleLldProximity1;
677

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

    
683
#endif /* BOARD_SENSORRING == BOARD_PROXIMITYSENSOR */
684

    
685
#if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || defined(__DOXYGEN__)
686
// TODO
687
#endif /* BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X */
688

    
689
#if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) || defined(__DOXYGEN__)
690
// TODO
691
#endif /* BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X */
692

    
693
/** @} */
694

    
695
/*===========================================================================*/
696
/**
697
 * @name Unit tests (UT)
698
 * @{
699
 */
700
/*===========================================================================*/
701
#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
702
#include <ut_lld_adc.h>
703
#include <ut_alld_at24c01bn-sh-b.h>
704
#include <ut_alld_bq24103a.h>
705
#include <ut_alld_bq27500.h>
706
#include <ut_alld_bq27500_bq24103a.h>
707
#include <ut_alld_ina219.h>
708
#include <ut_alld_led.h>
709
#include <ut_alld_pklcs1212e4001.h>
710
#include <ut_alld_tps62113.h>
711
#include <ut_alld_tps62113_ina219.h>
712

    
713
/**
714
 * @brief   ADC unit test object.
715
 */
716
extern aos_unittest_t moduleUtAdcVsys;
717

    
718
/**
719
 * @brief   AT24C01BN-SH-B (EEPROM) unit test object.
720
 */
721
extern aos_unittest_t moduleUtAlldAt24c01bn;
722

    
723
/**
724
 * @brief   BQ24103A (battery charger) unit test object.
725
 */
726
extern aos_unittest_t moduleUtAlldBq24103a;
727

    
728
/**
729
 * @brief   BQ27500 (fuel gauge) unit test object.
730
 */
731
extern aos_unittest_t moduleUtAlldBq27500;
732

    
733
/**
734
 * @brief   BQ27500 (fuela gauge) in combination with BQ24103A (battery charger) unit test object.
735
 */
736
extern aos_unittest_t moduleUtAlldBq27500Bq24103a;
737

    
738
/**
739
 * @brief   INA219 (power monitor) unit test object.
740
 */
741
extern aos_unittest_t moduleUtAlldIna219;
742

    
743
/**
744
 * @brief   Status LED unit test object.
745
 */
746
extern aos_unittest_t moduleUtAlldLed;
747

    
748
/**
749
 * @brief   PKLCS1212E4001 (buzzer) unit test object.
750
 */
751
extern aos_unittest_t moduleUtAlldPklcs1212e4001;
752

    
753
/**
754
 * @brief   TPS62113 (step-down converter) unit test object.
755
 */
756
extern aos_unittest_t moduleUtAlldTps62113;
757

    
758
/**
759
 * @brief   TPS62113 (step-sown converter) in combination with INA219 (power monitor) unit test object.
760
 */
761
extern aos_unittest_t moduleUtAlldTps62113Ina219;
762

    
763
#if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) || defined(__DOXYGEN__)
764

    
765
#include <ut_alld_mpr121.h>
766
#include <ut_alld_pca9544a.h>
767
#include <ut_alld_vcnl4020.h>
768

    
769
/**
770
 * @brief   MPR121 (touch sensor) unit test object.
771
 */
772
extern aos_unittest_t moduleUtAlldMpr121;
773

    
774
/**
775
 * @brief   PCA9544A (I2C multiplexer) unit test object.
776
 */
777
extern aos_unittest_t moduleUtAlldPca9544a;
778

    
779
/**
780
 * @brief   VCNL4020 (proximity sensor) unit test object.
781
 */
782
extern aos_unittest_t moduleUtAlldVcnl4020;
783

    
784
#endif /* BOARD_SENSORRING == BOARD_PROXIMITYSENSOR */
785

    
786
#if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || defined(__DOXYGEN__)
787
// TODO
788
#endif /* BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X */
789

    
790
#if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) || defined(__DOXYGEN__)
791
// TODO
792
#endif /* BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X */
793

    
794
#endif /* AMIROOS_CFG_TESTS_ENABLE == true */
795

    
796
/** @} */
797

    
798
#endif /* _AMIROOS_MODULE_H_ */
799

    
800
/** @} */