Statistics
| Branch: | Tag: | Revision:

amiro-os / modules / PowerManagement_1-2 / module.c @ bf8ca9aa

History | View | Annotate | Download (94.917 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
#include "module.h"
28

    
29
/*===========================================================================*/
30
/**
31
 * @name Module specific functions
32
 * @{
33
 */
34
/*===========================================================================*/
35

    
36
/** @} */
37

    
38
/*===========================================================================*/
39
/**
40
 * @name ChibiOS/HAL configuration
41
 * @{
42
 */
43
/*===========================================================================*/
44

    
45
ADCConversionGroup moduleHalAdcVsysConversionGroup = {
46
  /* buffer type        */ true,
47
  /* number of channels */ 1,
48
  /* callback function  */ NULL,
49
  /* error callback     */ NULL,
50
  /* CR1                */ ADC_CR1_AWDEN | ADC_CR1_AWDIE,
51
  /* CR2                */ ADC_CR2_SWSTART | ADC_CR2_CONT,
52
  /* SMPR1              */ 0,
53
  /* SMPR2              */ ADC_SMPR2_SMP_AN9(ADC_SAMPLE_480),
54
  /* HTR                */ ADC_HTR_HT,
55
  /* LTR                */ 0,
56
  /* SQR1               */ ADC_SQR1_NUM_CH(1),
57
  /* SQR2               */ 0,
58
  /* SQR3               */ ADC_SQR3_SQ1_N(ADC_CHANNEL_IN9),
59
};
60

    
61
CANConfig moduleHalCanConfig = {
62
  /* mcr  */ CAN_MCR_ABOM | CAN_MCR_AWUM | CAN_MCR_TXFP,
63
  /* btr  */ CAN_BTR_SJW(1) | CAN_BTR_TS2(3) | CAN_BTR_TS1(15) | CAN_BTR_BRP(1),
64
};
65

    
66
I2CConfig moduleHalI2cSrPm18Pm33GaugeRearConfig = {
67
  /* I²C mode   */ OPMODE_I2C,
68
  /* frequency  */ 400000, // TODO: replace with some macro (-> ChibiOS/HAL)
69
  /* duty cycle */ FAST_DUTY_CYCLE_2,
70
};
71

    
72
I2CConfig moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig = {
73
  /* I²C mode   */ OPMODE_I2C,
74
  /* frequency  */ 400000, // TODO: replace with some macro (-> ChibiOS/HAL)
75
  /* duty cycle */ FAST_DUTY_CYCLE_2,
76
};
77

    
78
PWMConfig moduleHalPwmBuzzerConfig = {
79
  /* frequency              */ 1000000,
80
  /* period                 */ 0,
81
  /* callback               */ NULL,
82
  /* channel configurations */ {
83
    /* channel 0              */ {
84
      /* mode                   */ PWM_OUTPUT_DISABLED,
85
      /* callback               */ NULL
86
    },
87
    /* channel 1              */ {
88
      /* mode                   */ PWM_OUTPUT_ACTIVE_HIGH,
89
      /* callback               */ NULL
90
    },
91
    /* channel 2              */ {
92
      /* mode                   */ PWM_OUTPUT_DISABLED,
93
      /* callback               */ NULL
94
    },
95
    /* channel 3              */ {
96
      /* mode                   */ PWM_OUTPUT_DISABLED,
97
      /* callback               */ NULL
98
    },
99
  },
100
  /* TIM CR2 register       */ 0,
101
#if (STM32_PWM_USE_ADVANCED == TRUE)
102
  /* TIM BDTR register      */ 0,
103
#endif /* (STM32_PWM_USE_ADVANCED == TRUE) */
104
  /* TIM DIER register      */ 0,
105
};
106

    
107
SerialConfig moduleHalProgIfConfig = {
108
  /* bit rate */ 115200,
109
  /* CR1      */ 0,
110
  /* CR1      */ 0,
111
  /* CR1      */ 0,
112
};
113

    
114
/** @} */
115

    
116
/*===========================================================================*/
117
/**
118
 * @name GPIO definitions
119
 * @{
120
 */
121
/*===========================================================================*/
122

    
123
/**
124
 * @brief   SWITCH_STATUS input signal GPIO.
125
 */
126
static apalGpio_t _gpioSwitchStatus = {
127
  /* line */ LINE_SWITCH_STATUS_N,
128
};
129
ROMCONST apalControlGpio_t moduleGpioSwitchStatus = {
130
  /* GPIO */ &_gpioSwitchStatus,
131
  /* meta */ {
132
    /* direction      */ APAL_GPIO_DIRECTION_INPUT,
133
    /* active state   */ APAL_GPIO_ACTIVE_LOW,
134
    /* interrupt edge */ APAL_GPIO_EDGE_NONE,
135
  },
136
};
137

    
138
/**
139
 * @brief   SYS_REG_EN output signal GPIO.
140
 */
141
static apalGpio_t _gpioSysRegEn = {
142
  /* line */ LINE_SYS_REG_EN,
143
};
144
ROMCONST apalControlGpio_t moduleGpioSysRegEn = {
145
  /* GPIO */ &_gpioSysRegEn,
146
  /* meta */ {
147
    /* direction      */ APAL_GPIO_DIRECTION_OUTPUT,
148
    /* active state   */ APAL_GPIO_ACTIVE_HIGH,
149
    /* interrupt edge */ APAL_GPIO_EDGE_NONE,
150
  },
151
};
152

    
153
/**
154
 * @brief   IR_INT1 input signal GPIO.
155
 */
156
static apalGpio_t _gpioIrInt1 = {
157
  /* line */ LINE_IR_INT1_N,
158
};
159
ROMCONST apalControlGpio_t moduleGpioIrInt1 = {
160
  /* GPIO */ &_gpioIrInt1,
161
  /* meta */ {
162
    /* direction      */ APAL_GPIO_DIRECTION_INPUT,
163
#if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR)
164
    /* active state   */ (VCNL4020_LLD_INT_EDGE == APAL_GPIO_EDGE_RISING) ? APAL_GPIO_ACTIVE_HIGH : APAL_GPIO_ACTIVE_LOW,
165
    /* interrupt edge */ VCNL4020_LLD_INT_EDGE,
166
#elif (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X)
167
    /* active state   */ (PCAL6524_LLD_INT_EDGE == APAL_GPIO_EDGE_RISING) ? APAL_GPIO_ACTIVE_HIGH : APAL_GPIO_ACTIVE_LOW,
168
    /* interrupt edge */ PCAL6524_LLD_INT_EDGE,
169
#elif (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X)
170
    /* active state   */ (PCAL6524_LLD_INT_EDGE == APAL_GPIO_EDGE_RISING) ? APAL_GPIO_ACTIVE_HIGH : APAL_GPIO_ACTIVE_LOW,
171
    /* interrupt edge */ PCAL6524_LLD_INT_EDGE,
172
#else /* (BOARD_SENSORRING == ?) */
173
    /* active state   */ APAL_GPIO_ACTIVE_LOW,
174
    /* interrupt edge */ APAL_GPIO_EDGE_NONE,
175
#endif /* (BOARD_SENSORRING == ?) */
176
  },
177
};
178

    
179
/**
180
 * @brief   POWER_EN output signal GPIO.
181
 */
182
static apalGpio_t _gpioPowerEn = {
183
  /* line */ LINE_POWER_EN,
184
};
185
ROMCONST apalControlGpio_t moduleGpioPowerEn = {
186
  /* GPIO */ &_gpioPowerEn,
187
  /* meta */ {
188
    /* direction      */ APAL_GPIO_DIRECTION_OUTPUT,
189
    /* active state   */ APAL_GPIO_ACTIVE_HIGH,
190
    /* interrupt edge */ APAL_GPIO_EDGE_NONE,
191
  },
192
};
193

    
194
/**
195
 * @brief   SYS_UART_DN bidirectional signal GPIO.
196
 */
197
static apalGpio_t _gpioSysUartDn = {
198
  /* line */ LINE_SYS_UART_DN,
199
};
200
ROMCONST apalControlGpio_t moduleGpioSysUartDn = {
201
  /* GPIO */ &_gpioSysUartDn,
202
  /* meta */ {
203
    /* direction      */ APAL_GPIO_DIRECTION_BIDIRECTIONAL,
204
    /* active state   */ APAL_GPIO_ACTIVE_LOW,
205
    /* interrupt edge */ APAL_GPIO_EDGE_BOTH,
206
  },
207
};
208

    
209
/**
210
 * @brief   CHARGE_STAT2A input signal GPIO.
211
 */
212
static apalGpio_t _gpioChargeStat2A = {
213
  /* line */ LINE_CHARGE_STAT2A,
214
};
215
ROMCONST apalControlGpio_t moduleGpioChargeStat2A = {
216
  /* GPIO */ &_gpioChargeStat2A,
217
  /* meta */ {
218
    /* direction      */ APAL_GPIO_DIRECTION_INPUT,
219
    /* active state   */ BQ241xx_LLD_CHARGE_STATUS_GPIO_ACTIVE_STATE,
220
    /* interrupt edge */ APAL_GPIO_EDGE_NONE,
221
  },
222
};
223

    
224
/**
225
 * @brief   GAUGE_BATLOW2 input signal GPIO.
226
 */
227
static apalGpio_t _gpioGaugeBatLow2 = {
228
  /* line */ LINE_GAUGE_BATLOW2,
229
};
230
ROMCONST apalControlGpio_t moduleGpioGaugeBatLow2 = {
231
  /* GPIO */ &_gpioGaugeBatLow2,
232
  /* meta */ {
233
    /* direction      */ APAL_GPIO_DIRECTION_INPUT,
234
    /* active state   */ BQ27500_LLD_BATLOW_ACTIVE_STATE,
235
    /* interrupt edge */ APAL_GPIO_EDGE_BOTH,
236
  },
237
};
238

    
239
/**
240
 * @brief   GAUGE_BATGD2 input signal GPIO.
241
 */
242
static apalGpio_t _gpioGaugeBatGd2 = {
243
  /* line */ LINE_GAUGE_BATGD2_N,
244
};
245
ROMCONST apalControlGpio_t moduleGpioGaugeBatGd2 = {
246
  /* GPIO */ &_gpioGaugeBatGd2,
247
  /* meta */ {
248
    /* direction      */ APAL_GPIO_DIRECTION_INPUT,
249
    /* active state   */ BQ27500_LLD_BATGOOD_ACTIVE_STATE,
250
    /* interrupt edge */ APAL_GPIO_EDGE_BOTH,
251
  },
252
};
253

    
254
/**
255
 * @brief   LED output signal GPIO.
256
 */
257
static apalGpio_t _gpioLed = {
258
  /* line */ LINE_LED,
259
};
260
ROMCONST apalControlGpio_t moduleGpioLed = {
261
  /* GPIO */ &_gpioLed,
262
  /* meta */ {
263
    /* direction      */ APAL_GPIO_DIRECTION_OUTPUT,
264
    /* active state   */ LED_LLD_GPIO_ACTIVE_STATE,
265
    /* interrupt edge */ APAL_GPIO_EDGE_NONE,
266
  },
267
};
268

    
269
/**
270
 * @brief   SYS_UART_UP bidirectional signal GPIO.
271
 */
272
static apalGpio_t _gpioSysUartUp = {
273
  /* line */ LINE_SYS_UART_UP,
274
};
275
ROMCONST apalControlGpio_t moduleGpioSysUartUp = {
276
  /* GPIO */ &_gpioSysUartUp,
277
  /* meta */ {
278
    /* direction      */ APAL_GPIO_DIRECTION_BIDIRECTIONAL,
279
    /* active state   */ APAL_GPIO_ACTIVE_LOW,
280
    /* interrupt edge */ APAL_GPIO_EDGE_BOTH,
281
  },
282
};
283

    
284
/**
285
 * @brief   CHARGE_STAT1A input signal GPIO.
286
 */
287
static apalGpio_t _gpioChargeStat1A = {
288
  /* line */ LINE_CHARGE_STAT1A,
289
};
290
ROMCONST apalControlGpio_t moduleGpioChargeStat1A = {
291
  /* GPIO */ &_gpioChargeStat1A,
292
  /* meta */ {
293
    /* direction      */ APAL_GPIO_DIRECTION_INPUT,
294
    /* active state   */ BQ241xx_LLD_CHARGE_STATUS_GPIO_ACTIVE_STATE,
295
    /* interrupt edge */ APAL_GPIO_EDGE_NONE,
296
  },
297
};
298

    
299
/**
300
 * @brief   GAUGE_BATLOW1 input signal GPIO.
301
 */
302
static apalGpio_t _gpioGaugeBatLow1 = {
303
  /* line */ LINE_GAUGE_BATLOW1,
304
};
305
ROMCONST apalControlGpio_t moduleGpioGaugeBatLow1 = {
306
  /* GPIO */ &_gpioGaugeBatLow1,
307
  /* meta */ {
308
    /* direction      */ APAL_GPIO_DIRECTION_INPUT,
309
    /* active state   */ BQ27500_LLD_BATLOW_ACTIVE_STATE,
310
    /* interrupt edge */ APAL_GPIO_EDGE_BOTH,
311
  },
312
};
313

    
314
/**
315
 * @brief   GAUGE_BATGD1 input signal GPIO.
316
 */
317
static apalGpio_t _gpioGaugeBatGd1 = {
318
  /* line */ LINE_GAUGE_BATGD1_N,
319
};
320
ROMCONST apalControlGpio_t moduleGpioGaugeBatGd1 = {
321
  /* GPIO */ &_gpioGaugeBatGd1,
322
  /* meta */ {
323
    /* direction      */ APAL_GPIO_DIRECTION_INPUT,
324
    /* active state   */ BQ27500_LLD_BATGOOD_ACTIVE_STATE,
325
    /* interrupt edge */ APAL_GPIO_EDGE_BOTH,
326
  },
327
};
328

    
329
/**
330
 * @brief   CHARG_EN1 output signal GPIO.
331
 */
332
static apalGpio_t _gpioChargeEn1 = {
333
  /* line */ LINE_CHARGE_EN1_N,
334
};
335
ROMCONST apalControlGpio_t moduleGpioChargeEn1 = {
336
  /* GPIO */ &_gpioChargeEn1,
337
  /* meta */ {
338
    /* direction      */ APAL_GPIO_DIRECTION_OUTPUT,
339
    /* active state   */ BQ241xx_LLD_ENABLED_GPIO_ACTIVE_STATE,
340
    /* interrupt edge */ APAL_GPIO_EDGE_NONE,
341
  },
342
};
343

    
344
/**
345
 * @brief   IR_INT2 input signal GPIO.
346
 */
347
static apalGpio_t _gpioIrInt2 = {
348
  /* line */ LINE_IR_INT2_N,
349
};
350
ROMCONST apalControlGpio_t moduleGpioIrInt2 = {
351
  /* GPIO */ &_gpioIrInt2,
352
  /* meta */ {
353
    /* direction      */ APAL_GPIO_DIRECTION_INPUT,
354
#if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR)
355
    /* active state   */ (VCNL4020_LLD_INT_EDGE == APAL_GPIO_EDGE_RISING) ? APAL_GPIO_ACTIVE_HIGH : APAL_GPIO_ACTIVE_LOW,
356
    /* interrupt edge */ VCNL4020_LLD_INT_EDGE,
357
#elif (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X)
358
    /* active state   */ (PCAL6524_LLD_INT_EDGE == APAL_GPIO_EDGE_RISING) ? APAL_GPIO_ACTIVE_HIGH : APAL_GPIO_ACTIVE_LOW,
359
    /* interrupt edge */ PCAL6524_LLD_INT_EDGE,
360
#elif (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X)
361
    /* active state   */ (PCAL6524_LLD_INT_EDGE == APAL_GPIO_EDGE_RISING) ? APAL_GPIO_ACTIVE_HIGH : APAL_GPIO_ACTIVE_LOW,
362
    /* interrupt edge */ PCAL6524_LLD_INT_EDGE,
363
#else /* (BOARD_SENSORRING == ?) */
364
    /* active state   */ APAL_GPIO_ACTIVE_LOW,
365
    /* interrupt edge */ APAL_GPIO_EDGE_NONE,
366
#endif /* (BOARD_SENSORRING == ?) */
367
  },
368
};
369

    
370
/**
371
 * @brief   TOUCH_INT input signal GPIO.
372
 */
373
static apalGpio_t _gpioTouchInt = {
374
  /* line */ LINE_TOUCH_INT_N,
375
};
376
ROMCONST apalControlGpio_t moduleGpioTouchInt = {
377
  /* GPIO */ &_gpioTouchInt,
378
  /* meta */ {
379
    /* direction      */ APAL_GPIO_DIRECTION_INPUT,
380
#if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR)
381
    /* active state   */ (MPR121_LLD_INT_EDGE == APAL_GPIO_EDGE_RISING) ? APAL_GPIO_ACTIVE_HIGH : APAL_GPIO_ACTIVE_LOW,
382
    /* interrupt edge */ MPR121_LLD_INT_EDGE,
383
#elif (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X)
384
    /* active state   */ (AT42QT1050_LLD_INT_EDGE == APAL_GPIO_EDGE_RISING) ? APAL_GPIO_ACTIVE_HIGH : APAL_GPIO_ACTIVE_LOW,
385
    /* interrupt edge */ AT42QT1050_LLD_INT_EDGE,
386
#elif (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X)
387
    /* active state   */ (AT42QT1050_LLD_INT_EDGE == APAL_GPIO_EDGE_RISING) ? APAL_GPIO_ACTIVE_HIGH : APAL_GPIO_ACTIVE_LOW,
388
    /* interrupt edge */ AT42QT1050_LLD_INT_EDGE,
389
#else /* (BOARD_SENSORRING == ?) */
390
    /* active state   */ APAL_GPIO_ACTIVE_LOW,
391
    /* interrupt edge */ APAL_GPIO_EDGE_NONE,
392
#endif /* (BOARD_SENSORRING == ?) */
393
  },
394
};
395

    
396
/**
397
 * @brief   SYS_DONE input signal GPIO.
398
 */
399
static apalGpio_t _gpioSysDone = {
400
  /* line */ LINE_SYS_DONE,
401
};
402
ROMCONST apalControlGpio_t moduleGpioSysDone = {
403
  /* GPIO */ &_gpioSysDone,
404
  /* meta */ {
405
    /* direction      */ APAL_GPIO_DIRECTION_INPUT,
406
    /* active state   */ APAL_GPIO_ACTIVE_HIGH,
407
    /* interrupt edge */ APAL_GPIO_EDGE_NONE,
408
  },
409
};
410

    
411
/**
412
 * @brief   SYS_PROG output signal GPIO.
413
 */
414
static apalGpio_t _gpioSysProg = {
415
  /* line */ LINE_SYS_PROG_N,
416
};
417
ROMCONST apalControlGpio_t moduleGpioSysProg = {
418
  /* GPIO */ &_gpioSysProg,
419
  /* meta */ {
420
    /* direction      */ APAL_GPIO_DIRECTION_OUTPUT,
421
    /* active state   */ APAL_GPIO_ACTIVE_LOW,
422
    /* interrupt edge */ APAL_GPIO_EDGE_NONE,
423
  },
424
};
425

    
426
/**
427
 * @brief   PATH_DC input signal GPIO.
428
 */
429
static apalGpio_t _gpioPathDc = {
430
  /* line */ LINE_PATH_DC,
431
};
432
ROMCONST apalControlGpio_t moduleGpioPathDc = {
433
  /* GPIO */ &_gpioPathDc,
434
  /* meta */ {
435
    /* direction      */ APAL_GPIO_DIRECTION_INPUT,
436
    /* active state   */ APAL_GPIO_ACTIVE_LOW,
437
    /* interrupt edge */ APAL_GPIO_EDGE_BOTH,
438
  },
439
};
440

    
441
/**
442
 * @brief   SYS_SPI_DIR bidirectional signal GPIO.
443
 */
444
static apalGpio_t _gpioSysSpiDir = {
445
  /* line */ LINE_SYS_SPI_DIR,
446
};
447
ROMCONST apalControlGpio_t moduleGpioSysSpiDir = {
448
  /* GPIO */ &_gpioSysSpiDir,
449
  /* meta */ {
450
    /* direction      */ APAL_GPIO_DIRECTION_BIDIRECTIONAL,
451
    /* active state   */ APAL_GPIO_ACTIVE_LOW,
452
    /* interrupt edge */ APAL_GPIO_EDGE_FALLING,
453
  },
454
};
455

    
456
/**
457
 * @brief   SYS_SYNC bidirectional signal GPIO.
458
 */
459
static apalGpio_t _gpioSysSync = {
460
  /* line */ LINE_SYS_INT_N,
461
};
462
ROMCONST apalControlGpio_t moduleGpioSysSync = {
463
  /* GPIO */ &_gpioSysSync,
464
  /* meta */ {
465
    /* direction      */ APAL_GPIO_DIRECTION_BIDIRECTIONAL,
466
    /* active state   */ APAL_GPIO_ACTIVE_LOW,
467
    /* interrupt edge */ APAL_GPIO_EDGE_BOTH,
468
  },
469
};
470

    
471
/**
472
 * @brief   SYS_PD bidirectional signal GPIO.
473
 */
474
static apalGpio_t _gpioSysPd = {
475
  /* line */ LINE_SYS_PD_N,
476
};
477
ROMCONST apalControlGpio_t moduleGpioSysPd = {
478
  /* GPIO */ &_gpioSysPd,
479
  /* meta */ {
480
    /* direction      */ APAL_GPIO_DIRECTION_BIDIRECTIONAL,
481
    /* active state   */ APAL_GPIO_ACTIVE_LOW,
482
    /* interrupt edge */ APAL_GPIO_EDGE_BOTH,
483
  },
484
};
485

    
486
/**
487
 * @brief   SYS_WARMRST bidirectional signal GPIO.
488
 */
489
static apalGpio_t _gpioSysWarmrst = {
490
  /* line */ LINE_SYS_WARMRST_N,
491
};
492
ROMCONST apalControlGpio_t moduleGpioSysWarmrst = {
493
  /* GPIO */ &_gpioSysWarmrst,
494
  /* meta */ {
495
    /* direction      */ APAL_GPIO_DIRECTION_BIDIRECTIONAL,
496
    /* active state   */ APAL_GPIO_ACTIVE_LOW,
497
    /* interrupt edge */ APAL_GPIO_EDGE_BOTH,
498
  },
499
};
500

    
501
/**
502
 * @brief   BT_RST output signal GPIO.
503
 */
504
static apalGpio_t _gpioBtRst = {
505
  /* line */ LINE_BT_RST,
506
};
507
ROMCONST apalControlGpio_t moduleGpioBtRst = {
508
  /* GPIO */ &_gpioBtRst,
509
  /* meta */ {
510
    /* direction      */ APAL_GPIO_DIRECTION_OUTPUT,
511
    /* active state   */ APAL_GPIO_ACTIVE_LOW,
512
    /* interrupt edge */ APAL_GPIO_EDGE_NONE,
513
  },
514
};
515

    
516
/**
517
 * @brief   CHARGE_EN2 output signal GPIO.
518
 */
519
static apalGpio_t _gpioChargeEn2 = {
520
  /* line */ LINE_CHARGE_EN2_N,
521
};
522
ROMCONST apalControlGpio_t moduleGpioChargeEn2 = {
523
  /* GPIO */ &_gpioChargeEn2,
524
  /* meta */ {
525
    /* direction      */ APAL_GPIO_DIRECTION_OUTPUT,
526
    /* active state   */ BQ241xx_LLD_ENABLED_GPIO_ACTIVE_STATE,
527
    /* interrupt edge */ APAL_GPIO_EDGE_NONE,
528
  },
529
};
530

    
531
/** @} */
532

    
533
/*===========================================================================*/
534
/**
535
 * @name AMiRo-OS core configurations
536
 * @{
537
 */
538
/*===========================================================================*/
539

    
540
#if (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
541
ROMCONST char* moduleShellPrompt = "PowerManagement";
542
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true) */
543

    
544
/** @} */
545

    
546
/*===========================================================================*/
547
/**
548
 * @name Startup Shutdown Synchronization Protocol (SSSP)
549
 * @{
550
 */
551
/*===========================================================================*/
552

    
553
/** @} */
554

    
555
/*===========================================================================*/
556
/**
557
 * @name Low-level drivers
558
 * @{
559
 */
560
/*===========================================================================*/
561

    
562
AT24C01BDriver moduleLldEeprom = {
563
  /* I2C driver   */ &MODULE_HAL_I2C_SR_PM42_PM50_PMVDD_EEPROM_GAUGEFRONT,
564
  /* I2C address  */ AT24C01B_LLD_I2C_ADDR_FIXED,
565
};
566

    
567
BQ241xxDriver moduleLldBatteryChargerFront = {
568
  /* charge enable GPIO */ &moduleGpioChargeEn1,
569
  /* charge status GPIO */ &moduleGpioChargeStat1A,
570
};
571

    
572
BQ241xxDriver moduleLldBatteryChargerRear = {
573
  /* charge enable GPIO */ &moduleGpioChargeEn2,
574
  /* charge status GPIO */ &moduleGpioChargeStat2A,
575
};
576

    
577
BQ27500Driver moduleLldFuelGaugeFront = {
578
  /* I2C driver         */ &MODULE_HAL_I2C_SR_PM42_PM50_PMVDD_EEPROM_GAUGEFRONT,
579
  /* battery low GPIO   */ &moduleGpioGaugeBatLow1,
580
  /* battery good GPIO  */ &moduleGpioGaugeBatGd1,
581
};
582

    
583
BQ27500Driver moduleLldFuelGaugeRear = {
584
  /* I2C driver         */ &MODULE_HAL_I2C_SR_PM18_PM33_GAUGEREAR,
585
  /* battery low GPIO   */ &moduleGpioGaugeBatLow2,
586
  /* battery good GPIO  */ &moduleGpioGaugeBatGd2,
587
};
588

    
589
INA219Driver moduleLldPowerMonitorVdd = {
590
  /* I2C Driver       */ &MODULE_HAL_I2C_SR_PM42_PM50_PMVDD_EEPROM_GAUGEFRONT,
591
  /* I²C address      */ INA219_LLD_I2C_ADDR_A0 | INA219_LLD_I2C_ADDR_A1,
592
  /* current LSB (uA) */ 0x00u,
593
  /* configuration    */ NULL,
594
};
595

    
596
INA219Driver moduleLldPowerMonitorVio18 = {
597
  /* I2C Driver       */ &MODULE_HAL_I2C_SR_PM18_PM33_GAUGEREAR,
598
  /* I²C address      */ INA219_LLD_I2C_ADDR_A1,
599
  /* current LSB (uA) */ 0x00u,
600
  /* configuration    */ NULL,
601
};
602

    
603
INA219Driver moduleLldPowerMonitorVio33 = {
604
  /* I2C Driver       */ &MODULE_HAL_I2C_SR_PM18_PM33_GAUGEREAR,
605
  /* I²C address      */ INA219_LLD_I2C_ADDR_FIXED,
606
  /* current LSB (uA) */ 0x00u,
607
  /* configuration    */ NULL,
608
};
609

    
610
INA219Driver moduleLldPowerMonitorVsys42 = {
611
  /* I2C Driver       */ &MODULE_HAL_I2C_SR_PM42_PM50_PMVDD_EEPROM_GAUGEFRONT,
612
  /* I²C address      */ INA219_LLD_I2C_ADDR_FIXED,
613
  /* current LSB (uA) */ 0x00u,
614
  /* configuration    */ NULL,
615
};
616

    
617
INA219Driver moduleLldPowerMonitorVio50 = {
618
  /* I2C Driver       */ &MODULE_HAL_I2C_SR_PM42_PM50_PMVDD_EEPROM_GAUGEFRONT,
619
  /* I²C address      */ INA219_LLD_I2C_ADDR_A1,
620
  /* current LSB (uA) */ 0x00u,
621
  /* configuration    */ NULL,
622
};
623

    
624
LEDDriver moduleLldStatusLed = {
625
  /* LED GPIO */ &moduleGpioLed,
626
};
627

    
628
TPS6211xDriver moduleLldStepDownConverter = {
629
  /* Power enable GPIO */ &moduleGpioPowerEn,
630
};
631

    
632
#if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) || defined(__DOXYGEN__)
633

    
634
MPR121Driver moduleLldTouch = {
635
  /* I²C Driver */ &MODULE_HAL_I2C_SR_PM42_PM50_PMVDD_EEPROM_GAUGEFRONT,
636
};
637

    
638
PCA9544ADriver moduleLldI2cMultiplexer1 = {
639
  /* I²C driver   */ &MODULE_HAL_I2C_SR_PM18_PM33_GAUGEREAR,
640
  /* I²C address  */ PCA9544A_LLD_I2C_ADDR_A0 | PCA9544A_LLD_I2C_ADDR_A1 | PCA9544A_LLD_I2C_ADDR_A2,
641
};
642

    
643
PCA9544ADriver moduleLldI2cMultiplexer2 = {
644
  /* I²C driver   */ &MODULE_HAL_I2C_SR_PM42_PM50_PMVDD_EEPROM_GAUGEFRONT,
645
  /* I²C address  */ PCA9544A_LLD_I2C_ADDR_A0 | PCA9544A_LLD_I2C_ADDR_A1 | PCA9544A_LLD_I2C_ADDR_A2,
646
};
647

    
648
VCNL4020Driver moduleLldProximity1 = {
649
  /* I²C Driver */ &MODULE_HAL_I2C_SR_PM18_PM33_GAUGEREAR,
650
};
651

    
652
VCNL4020Driver moduleLldProximity2 = {
653
  /* I²C Driver */ &MODULE_HAL_I2C_SR_PM42_PM50_PMVDD_EEPROM_GAUGEFRONT,
654
};
655

    
656
#endif /* (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) */
657

    
658
#if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || defined(__DOXYGEN__)
659

    
660
PCAL6524Driver moduleLldGpioExtender1 = {
661
  /* I²C driver   */ &MODULE_HAL_I2C_SR_PM18_PM33_GAUGEREAR,
662
  /* I²C address  */ PCAL6524_LLD_I2C_ADDR_VDD,
663
};
664

    
665
PCAL6524Driver moduleLldGpioExtender2 = {
666
  /* I²C driver   */ &MODULE_HAL_I2C_SR_PM42_PM50_PMVDD_EEPROM_GAUGEFRONT,
667
  /* I²C address  */ PCAL6524_LLD_I2C_ADDR_VDD,
668
};
669

    
670
AT42QT1050Driver moduleLldTouch = {
671
  /* I²C driver   */ &MODULE_HAL_I2C_SR_PM42_PM50_PMVDD_EEPROM_GAUGEFRONT,
672
  /* I²C address  */ AT42QT1050_LLD_I2C_ADDRSEL_LOW,
673
};
674

    
675
VL53L0XDriver moduleLldProximity1 = {
676
    {
677
        /* I²C Driver */ &MODULE_HAL_I2C_SR_PM18_PM33_GAUGEREAR,
678
        /* I²C timeout */ TIME_INFINITE,
679

    
680
        /* VL53L0X_DevData_t */
681
        {
682
            /* VL53L0X_DMaxData_t */
683
            {
684
                /* AmbTuningWindowFactor_K */ 0,
685
                /* RetSignalAt0mm */ 0,
686

    
687
            },
688
            /* Part2PartOffsetNVMMicroMeter */ 0,
689
            /* Part2PartOffsetAdjustmentNVMMicroMeter */ 0,
690
            /* VL53L0X_DeviceParameters_t */
691
            {
692
                /* VL53L0X_DeviceModes DeviceMode 0 == singleranging*/ 0,
693
                /* VL53L0X_HistogramModes HistogramMode 0=disable */ 0,
694
                /* MeasurementTimingBudgetMicroSeconds */ 0,
695
                /* InterMeasurementPeriodMilliSeconds */ 0,
696
                /* !! XTalkCompensationEnable */ 0,
697
                /* XTalkCompensationRangeMilliMeter */ 0,
698
                /* XTalkCompensationRateMegaCps */ 0,
699
                /* RangeOffsetMicroMeters */ 0,
700
                /* !! LimitChecksEnable */ {0},
701
                /* LimitChecksStatus */ {0},
702
                /* LimitChecksValue */ {0},
703
                /* !! WrapAroundCheckEnable */ 0,
704

    
705
            },
706
            /* VL53L0X_RangingMeasurementData_t */
707
            {
708
                /* TimeStamp */ 0,
709
                /* MeasurementTimeUsec */ 0,
710
                /* RangeMilliMeter */ 0,
711
                /* !! RangeDMaxMilliMeter */ 0,
712
                /* SignalRateRtnMegaCps */ 0,
713
                /* AmbientRateRtnMegaCps */ 0,
714
                /* EffectiveSpadRtnCount */ 0,
715
                /* ZoneId */ 0,
716
                /* RangeFractionalPart */ 0,
717
                /* RangeStatus */ 0,
718
            },
719
            /* VL53L0X_HistogramMeasurementData_t */
720
            {
721
                /* HistogramData */ {0},
722
                /* HistogramType */ 0,
723
                /* FirstBin */ 0,
724
                /* BufferSize */ 0,
725
                /* NumberOfBins */ 0,
726
                /* VL53L0X_DeviceError ErrorStatus 0 == None_error */ 0,
727
            },
728
            /* VL53L0X_DeviceSpecificParameters_t */
729
            {
730
                /* OscFrequencyMHz */ 0,
731
                /* LastEncodedTimeout */ 0,
732
                /* !! VL53L0X_GpioFunctionality Pin0GpioFunctionality 0==no interrupt */ 0,
733
                /* FinalRangeTimeoutMicroSecs */ 0,
734
                /* FinalRangeVcselPulsePeriod */ 0,
735
                /* PreRangeTimeoutMicroSecs */ 0,
736
                /* PreRangeVcselPulsePeriod */ 0,
737
                /* SigmaEstRefArray */ 0,
738
                /* SigmaEstEffPulseWidth */ 0,
739
                /* SigmaEstEffAmbWidth */ 0,
740
                /* ReadDataFromDeviceDone 0 == read from device was not done */ 0,
741
                /* ModuleId */ 0,
742
                /* Revision */ 0,
743
                /* ProductId */ "0",
744
                /* !! ReferenceSpadCount */ 0,
745
                /* !! ReferenceSpadType */ 0,
746
                /* RefSpadsInitialised */ 0,
747
                /* PartUIDUpper */ 0,
748
                /* PartUIDLower */ 0,
749
                /* SignalRateMeasFixed400mm */ 0,
750
            },
751
            /* VL53L0X_SpadData_t */
752
            {
753
                /* RefSpadEnables */ {0},
754
                /* RefGoodSpadMap */ {0},
755

    
756
            },
757
            /* SequenceConfig */ 0,
758
            /* !! RangeFractionalEnable */ 0,
759
            /* VL53L0X_State PalState */ 0,
760
            /* !! VL53L0X_PowerModes PowerMode 0==VL53L0X_POWERMODE_STANDBY_LEVEL1 */ 0,
761
            /* SigmaEstRefArray */ 0,
762
            /* SigmaEstEffPulseWidth */ 0,
763
            /* SigmaEstEffAmbWidth */ 0,
764
            /* StopVariable */ 0,
765
            /* targetRefRate */ 0,
766
            /* SigmaEstimate */ 0,
767
            /* SignalEstimate */0 ,
768
            /* LastSignalRefMcps */ 0,
769
            /* *pTuningSettingsPointer */ 0,
770
            /* UseInternalTuningSettings */ 0,
771
            /* LinearityCorrectiveGain */ 0,
772
            /* !! DmaxCalRangeMilliMeter */ 0,
773
            /* DmaxCalSignalRateRtnMegaCps */ 0,
774
        },
775
        /* I²C address */ VL53L0X_LLD_I2C_ADDR,
776
        /* COMM TYPE*/ 1,
777
        /* COMM SPEED*/ 1,
778
    }
779
};
780

    
781
VL53L0XDriver moduleLldProximity2 = {
782
    {
783
        /* I²C Driver */ &MODULE_HAL_I2C_SR_PM42_PM50_PMVDD_EEPROM_GAUGEFRONT,
784
        /* I²C timeout */ TIME_INFINITE,
785

    
786
        /* VL53L0X_DevData_t */
787
        {
788
            /* VL53L0X_DMaxData_t */
789
            {
790
                /* AmbTuningWindowFactor_K */ 0,
791
                /* RetSignalAt0mm */ 0,
792

    
793
            },
794
            /* Part2PartOffsetNVMMicroMeter */ 0,
795
            /* Part2PartOffsetAdjustmentNVMMicroMeter */ 0,
796
            /* VL53L0X_DeviceParameters_t */
797
            {
798
                /* VL53L0X_DeviceModes DeviceMode 0 == singleranging*/ 0,
799
                /* VL53L0X_HistogramModes HistogramMode 0=disable */ 0,
800
                /* MeasurementTimingBudgetMicroSeconds */ 0,
801
                /* InterMeasurementPeriodMilliSeconds */ 0,
802
                /* !! XTalkCompensationEnable */ 0,
803
                /* XTalkCompensationRangeMilliMeter */ 0,
804
                /* XTalkCompensationRateMegaCps */ 0,
805
                /* RangeOffsetMicroMeters */ 0,
806
                /* !! LimitChecksEnable */ {0},
807
                /* LimitChecksStatus */ {0},
808
                /* LimitChecksValue */ {0},
809
                /* !! WrapAroundCheckEnable */ 0,
810

    
811
            },
812
            /* VL53L0X_RangingMeasurementData_t */
813
            {
814
                /* TimeStamp */ 0,
815
                /* MeasurementTimeUsec */ 0,
816
                /* RangeMilliMeter */ 0,
817
                /* !! RangeDMaxMilliMeter */ 0,
818
                /* SignalRateRtnMegaCps */ 0,
819
                /* AmbientRateRtnMegaCps */ 0,
820
                /* EffectiveSpadRtnCount */ 0,
821
                /* ZoneId */ 0,
822
                /* RangeFractionalPart */ 0,
823
                /* RangeStatus */ 0,
824
            },
825
            /* VL53L0X_HistogramMeasurementData_t */
826
            {
827
                /* HistogramData */ {0},
828
                /* HistogramType */ 0,
829
                /* FirstBin */ 0,
830
                /* BufferSize */ 0,
831
                /* NumberOfBins */ 0,
832
                /* VL53L0X_DeviceError ErrorStatus 0 == None_error */ 0,
833
            },
834
            /* VL53L0X_DeviceSpecificParameters_t */
835
            {
836
                /* OscFrequencyMHz */ 0,
837
                /* LastEncodedTimeout */ 0,
838
                /* !! VL53L0X_GpioFunctionality Pin0GpioFunctionality 0==no interrupt */ 0,
839
                /* FinalRangeTimeoutMicroSecs */ 0,
840
                /* FinalRangeVcselPulsePeriod */ 0,
841
                /* PreRangeTimeoutMicroSecs */ 0,
842
                /* PreRangeVcselPulsePeriod */ 0,
843
                /* SigmaEstRefArray */ 0,
844
                /* SigmaEstEffPulseWidth */ 0,
845
                /* SigmaEstEffAmbWidth */ 0,
846
                /* ReadDataFromDeviceDone 0 == read from device was not done */ 0,
847
                /* ModuleId */ 0,
848
                /* Revision */ 0,
849
                /* ProductId */ "0",
850
                /* !! ReferenceSpadCount */ 0,
851
                /* !! ReferenceSpadType */ 0,
852
                /* RefSpadsInitialised */ 0,
853
                /* PartUIDUpper */ 0,
854
                /* PartUIDLower */ 0,
855
                /* SignalRateMeasFixed400mm */ 0,
856
            },
857
            /* VL53L0X_SpadData_t */
858
            {
859
                /* RefSpadEnables */ {0},
860
                /* RefGoodSpadMap */ {0},
861

    
862
            },
863
            /* SequenceConfig */ 0,
864
            /* !! RangeFractionalEnable */ 0,
865
            /* VL53L0X_State PalState */ 0,
866
            /* !! VL53L0X_PowerModes PowerMode 0==VL53L0X_POWERMODE_STANDBY_LEVEL1 */ 0,
867
            /* SigmaEstRefArray */ 0,
868
            /* SigmaEstEffPulseWidth */ 0,
869
            /* SigmaEstEffAmbWidth */ 0,
870
            /* StopVariable */ 0,
871
            /* targetRefRate */ 0,
872
            /* SigmaEstimate */ 0,
873
            /* SignalEstimate */0 ,
874
            /* LastSignalRefMcps */ 0,
875
            /* *pTuningSettingsPointer */ 0,
876
            /* UseInternalTuningSettings */ 0,
877
            /* LinearityCorrectiveGain */ 0,
878
            /* !! DmaxCalRangeMilliMeter */ 0,
879
            /* DmaxCalSignalRateRtnMegaCps */ 0,
880
        },
881
        /* I²C address */ VL53L0X_LLD_I2C_ADDR,
882
        /* COMM TYPE*/ 1,
883
        /* COMM SPEED*/ 1,
884
    }
885
};
886

    
887

    
888
#endif /* (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) */
889

    
890
#if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) || defined(__DOXYGEN__)
891

    
892
PCAL6524Driver moduleLldGpioExtender1 = {
893
  /* I²C driver   */ &MODULE_HAL_I2C_SR_PM18_PM33_GAUGEREAR,
894
  /* I²C address  */ PCAL6524_LLD_I2C_ADDR_VDD,
895
};
896

    
897
PCAL6524Driver moduleLldGpioExtender2 = {
898
  /* I²C driver   */ &MODULE_HAL_I2C_SR_PM42_PM50_PMVDD_EEPROM_GAUGEFRONT,
899
  /* I²C address  */ PCAL6524_LLD_I2C_ADDR_VDD,
900
};
901

    
902
AT42QT1050Driver moduleLldTouch = {
903
  /* I²C driver   */ &MODULE_HAL_I2C_SR_PM42_PM50_PMVDD_EEPROM_GAUGEFRONT,
904
  /* I²C address  */ AT42QT1050_LLD_I2C_ADDRSEL_LOW,
905
};
906

    
907
#endif /* (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) */
908

    
909
/** @} */
910

    
911
/*===========================================================================*/
912
/**
913
 * @name Unit tests (UT)
914
 * @{
915
 */
916
/*===========================================================================*/
917
#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
918
#include <string.h>
919

    
920
/*
921
 * ADC
922
 */
923
static int _utShellCmdCb_Adc(BaseSequentialStream* stream, int argc, char* argv[])
924
{
925
  (void)argc;
926
  (void)argv;
927
  aosUtRun(stream, &moduleUtAdcVsys, NULL);
928
  return AOS_OK;
929
}
930
static ut_adcdata_t _utAdcVsysData = {
931
  /* driver               */ &MODULE_HAL_ADC_VSYS,
932
  /* ADC conversion group */ &moduleHalAdcVsysConversionGroup,
933
};
934
aos_unittest_t moduleUtAdcVsys = {
935
  /* name           */ "ADC",
936
  /* info           */ "VSYS",
937
  /* test function  */ utAdcFunc,
938
  /* shell command  */ {
939
    /* name     */ "unittest:ADC",
940
    /* callback */ _utShellCmdCb_Adc,
941
    /* next     */ NULL,
942
  },
943
  /* data           */ &_utAdcVsysData,
944
};
945

    
946
/*
947
 * AT24C01B (EEPROM)
948
 */
949
static int _utShellCmdCb_AlldAt24c01b(BaseSequentialStream* stream, int argc, char* argv[])
950
{
951
  (void)argc;
952
  (void)argv;
953
  aosUtRun(stream, &moduleUtAlldAt24c01b, NULL);
954
  return AOS_OK;
955
}
956
static ut_at24c01bdata_t _utAlldAt24c01bData = {
957
  /* driver   */ &moduleLldEeprom,
958
  /* timeout  */ MICROSECONDS_PER_SECOND,
959
};
960
aos_unittest_t moduleUtAlldAt24c01b = {
961
  /* name           */ "AT24C01B",
962
  /* info           */ "1kbit EEPROM",
963
  /* test function  */ utAlldAt24c01bFunc,
964
  /* shell command  */ {
965
    /* name     */ "unittest:EEPROM",
966
    /* callback */ _utShellCmdCb_AlldAt24c01b,
967
    /* next     */ NULL,
968
  },
969
  /* data           */ &_utAlldAt24c01bData,
970
};
971

    
972
/*
973
 * bq24103a (battery charger)
974
 */
975
static int _utShellCmdCb_AlldBq24103a(BaseSequentialStream* stream, int argc, char* argv[])
976
{
977
  // local variables
978
  bool print_help = false;
979

    
980
  // evaluate argument
981
  if (argc == 2) {
982
    if (strcmp(argv[1], "-f") == 0 || strcmp(argv[1], "--front") == 0) {
983
      moduleUtAlldBq24103a.data = &moduleLldBatteryChargerFront;
984
      aosUtRun(stream, &moduleUtAlldBq24103a, "front battery");
985
      moduleUtAlldBq24103a.data = NULL;
986
    }
987
    else if (strcmp(argv[1], "-r") == 0 || strcmp(argv[1], "--rear") == 0) {
988
      moduleUtAlldBq24103a.data = &moduleLldBatteryChargerRear;
989
      aosUtRun(stream, &moduleUtAlldBq24103a, "rear battery");
990
      moduleUtAlldBq24103a.data = NULL;
991
    }
992
    else {
993
      print_help = true;
994
    }
995
  } else {
996
    print_help = true;
997
  }
998

    
999
  // print help or just return
1000
  if (print_help) {
1001
    chprintf(stream, "Usage: %s OPTION\n", argv[0]);
1002
    chprintf(stream, "Options:\n");
1003
    chprintf(stream, "  --front, -f\n");
1004
    chprintf(stream, "    Test the front battery charger.\n");
1005
    chprintf(stream, "  --rear, -r\n");
1006
    chprintf(stream, "    Test the rear battery charger.\n");
1007
    return AOS_INVALIDARGUMENTS;
1008
  } else {
1009
    return AOS_OK;
1010
  }
1011
}
1012
aos_unittest_t moduleUtAlldBq24103a = {
1013
  /* name           */ "bq24103a",
1014
  /* info           */ "battery charger",
1015
  /* test function  */ utAlldBq241xxFunc,
1016
  /* shell command  */ {
1017
    /* name     */ "unittest:BatteryCharger",
1018
    /* callback */ _utShellCmdCb_AlldBq24103a,
1019
    /* next     */ NULL,
1020
  },
1021
  /* data           */ NULL,
1022
};
1023

    
1024
/*
1025
 * bq27500 (fuel gauge)
1026
 */
1027
static int _utShellCmdCb_AlldBq27500(BaseSequentialStream* stream, int argc, char* argv[])
1028
{
1029
  // evaluate arguments
1030
  if (argc == 2) {
1031
    if (strcmp(argv[1], "-f") == 0 || strcmp(argv[1], "--front") == 0) {
1032
      ((ut_bq27500data_t*)moduleUtAlldBq27500.data)->driver = &moduleLldFuelGaugeFront;
1033
      aosUtRun(stream, &moduleUtAlldBq27500, "front battery");
1034
      ((ut_bq27500data_t*)moduleUtAlldBq27500.data)->driver = NULL;
1035
      return AOS_OK;
1036
    }
1037
    else if (strcmp(argv[1], "-r") == 0 || strcmp(argv[1], "--rear") == 0) {
1038
      ((ut_bq27500data_t*)moduleUtAlldBq27500.data)->driver = &moduleLldFuelGaugeRear;
1039
      aosUtRun(stream, &moduleUtAlldBq27500, "rear battery");
1040
      ((ut_bq27500data_t*)moduleUtAlldBq27500.data)->driver = NULL;
1041
      return AOS_OK;
1042
    }
1043
  }
1044
  // print help
1045
  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
1046
  chprintf(stream, "Options:\n");
1047
  chprintf(stream, "  --front, -f\n");
1048
  chprintf(stream, "    Test the front battery fuel gauge.\n");
1049
  chprintf(stream, "  --rear, -r\n");
1050
  chprintf(stream, "    Test the rear battery fuel gauge.\n");
1051
  return AOS_INVALIDARGUMENTS;
1052
}
1053
static ut_bq27500data_t _utAlldBq27500Data = {
1054
  /* driver   */ NULL,
1055
  /* timeout  */ MICROSECONDS_PER_SECOND,
1056
};
1057
aos_unittest_t moduleUtAlldBq27500 = {
1058
  /* name           */ "bq27500",
1059
  /* info           */ "fuel gauge",
1060
  /* test function  */ utAlldBq27500Func,
1061
  /* shell command  */ {
1062
    /* name     */ "unittest:FuelGauge",
1063
    /* callback */ _utShellCmdCb_AlldBq27500,
1064
    /* next     */ NULL,
1065
  },
1066
  /* data           */ &_utAlldBq27500Data,
1067
};
1068

    
1069
/*
1070
 * bq27500 (fuel gauge) in combination with bq24103a (battery charger)
1071
 */
1072
static int _utShellCmdCb_AlldBq27500Bq24103a(BaseSequentialStream* stream, int argc, char* argv[])
1073
{
1074
  // evaluate arguments
1075
  if (argc == 2) {
1076
    if (strcmp(argv[1], "-f") == 0 || strcmp(argv[1], "--front") == 0) {
1077
      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq27500 = &moduleLldFuelGaugeFront;
1078
      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq241xx = &moduleLldBatteryChargerFront;
1079
      aosUtRun(stream, &moduleUtAlldBq27500Bq24103a, "front battery");
1080
      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq27500 = NULL;
1081
      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq241xx = NULL;
1082
      return AOS_OK;
1083
    }
1084
    else if (strcmp(argv[1], "-r") == 0 || strcmp(argv[1], "--rear") == 0) {
1085
      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq27500 = &moduleLldFuelGaugeRear;
1086
      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq241xx = &moduleLldBatteryChargerRear;
1087
      aosUtRun(stream, &moduleUtAlldBq27500Bq24103a, "rear battery");
1088
      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq27500 = NULL;
1089
      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq241xx = NULL;
1090
      return AOS_OK;
1091
    }
1092
  }
1093
  // print help
1094
  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
1095
  chprintf(stream, "Options:\n");
1096
  chprintf(stream, "  --front, -f\n");
1097
  chprintf(stream, "    Test the front battery fuel gauge and charger.\n");
1098
  chprintf(stream, "  --rear, -r\n");
1099
  chprintf(stream, "    Test the rear battery fuel gauge and charger.\n");
1100
  return AOS_INVALIDARGUMENTS;
1101
}
1102
static ut_bq27500bq241xxdata_t _utAlldBq27500Bq24103aData= {
1103
  /* bq27500 driver   */ NULL,
1104
  /* bq24103a driver  */ NULL,
1105
  /* timeout          */ MICROSECONDS_PER_SECOND,
1106
};
1107
aos_unittest_t moduleUtAlldBq27500Bq24103a = {
1108
  /* name           */ "BQ27500 & BQ24103A",
1109
  /* info           */ "fuel gauge & battery charger",
1110
  /* test function  */ utAlldBq27500Bq241xxFunc,
1111
  /* shell command  */ {
1112
    /* name     */ "unittest:FuelGauge&BatteryCharger",
1113
    /* callback */ _utShellCmdCb_AlldBq27500Bq24103a,
1114
    /* next     */ NULL,
1115
  },
1116
  /* data           */ &_utAlldBq27500Bq24103aData,
1117
};
1118

    
1119
/*
1120
 * INA219 (power monitor)
1121
 */
1122
static int _utShellCmdCb_AlldIna219(BaseSequentialStream* stream, int argc, char* argv[])
1123
{
1124
  // evaluate arguments
1125
  if (argc == 2) {
1126
    if (strcmp(argv[1], "VDD") == 0) {
1127
      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = &moduleLldPowerMonitorVdd;
1128
      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 3.3f;
1129
      aosUtRun(stream, &moduleUtAlldIna219, "VDD (3.3V)");
1130
      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = NULL;
1131
      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 0.0f;
1132
      return AOS_OK;
1133
    }
1134
    else if (strcmp(argv[1], "VIO1.8") == 0) {
1135
      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = &moduleLldPowerMonitorVio18;
1136
      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 1.8f;
1137
      aosUtRun(stream, &moduleUtAlldIna219, "VIO (1.8V)");
1138
      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = NULL;
1139
      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 0.0f;
1140
      return AOS_OK;
1141
    }
1142
    else if (strcmp(argv[1], "VIO3.3") == 0) {
1143
      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = &moduleLldPowerMonitorVio33;
1144
      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 3.3f;
1145
      aosUtRun(stream, &moduleUtAlldIna219, "VIO (3.3V)");
1146
      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = NULL;
1147
      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 0.0f;
1148
      return AOS_OK;
1149
    }
1150
    else if (strcmp(argv[1], "VSYS4.2") == 0) {
1151
      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = &moduleLldPowerMonitorVsys42;
1152
      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 4.2f;
1153
      aosUtRun(stream, &moduleUtAlldIna219, "VSYS (4.2V)");
1154
      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = NULL;
1155
      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 0.0f;
1156
      return AOS_OK;
1157
    }
1158
    else if (strcmp(argv[1], "VIO5.0") == 0) {
1159
      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = &moduleLldPowerMonitorVio50;
1160
      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 5.0f;
1161
      aosUtRun(stream, &moduleUtAlldIna219, "VIO (5.0V)");
1162
      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = NULL;
1163
      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 0.0f;
1164
      return AOS_OK;
1165
    }
1166
  }
1167
  // print help
1168
  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
1169
  chprintf(stream, "Options:\n");
1170
  chprintf(stream, "  VDD\n");
1171
  chprintf(stream, "    Test VDD (3.3V) power monitor.\n");
1172
  chprintf(stream, "  VIO1.8\n");
1173
  chprintf(stream, "    Test VIO 1.8V power monitor.\n");
1174
  chprintf(stream, "  VIO3.3\n");
1175
  chprintf(stream, "    Test VIO 3.3V power monitor.\n");
1176
  chprintf(stream, "  VSYS4.2\n");
1177
  chprintf(stream, "    Test VSYS 4.2V power monitor.\n");
1178
  chprintf(stream, "  VIO5.0\n");
1179
  chprintf(stream, "    Test VIO 5.0V power monitor.\n");
1180
  return AOS_INVALIDARGUMENTS;
1181
}
1182
static ut_ina219data_t _utAlldIna219Data = {
1183
  /* driver           */ NULL,
1184
  /* expected voltage */ 0.0f,
1185
  /* tolerance        */ 0.05f,
1186
  /* timeout          */ MICROSECONDS_PER_SECOND,
1187
};
1188
aos_unittest_t moduleUtAlldIna219 = {
1189
  /* name           */ "INA219",
1190
  /* info           */ "power monitor",
1191
  /* test function  */ utAlldIna219Func,
1192
  /* shell command  */ {
1193
    /* name     */ "unittest:PowerMonitor",
1194
    /* callback */ _utShellCmdCb_AlldIna219,
1195
    /* next     */ NULL,
1196
  },
1197
  /* data           */ &_utAlldIna219Data,
1198
};
1199

    
1200
/*
1201
 * Status LED
1202
 */
1203
static int _utShellCmdCb_AlldLed(BaseSequentialStream* stream, int argc, char* argv[])
1204
{
1205
  (void)argc;
1206
  (void)argv;
1207
  aosUtRun(stream, &moduleUtAlldLed, NULL);
1208
  return AOS_OK;
1209
}
1210
aos_unittest_t moduleUtAlldLed = {
1211
  /* name           */ "LED",
1212
  /* info           */ NULL,
1213
  /* test function  */ utAlldLedFunc,
1214
  /* shell command  */ {
1215
    /* name     */ "unittest:StatusLED",
1216
    /* callback */ _utShellCmdCb_AlldLed,
1217
    /* next     */ NULL,
1218
  },
1219
  /* data           */ &moduleLldStatusLed,
1220
};
1221

    
1222
/*
1223
 * PKLCS1212E4001 (buzzer)
1224
 */
1225
static int _utShellCmdCb_AlldPklcs1212e4001(BaseSequentialStream* stream, int argc, char* argv[])
1226
{
1227
  (void)argc;
1228
  (void)argv;
1229
  aosUtRun(stream, &moduleUtAlldPklcs1212e4001, NULL);
1230
  return AOS_OK;
1231
}
1232
static ut_pkxxxexxx_t _utAlldPklcs1212e4001Data = {
1233
  /* PWM driver   */ &MODULE_HAL_PWM_BUZZER,
1234
  /* PWM channel  */ MODULE_HAL_PWM_BUZZER_CHANNEL
1235
};
1236
aos_unittest_t moduleUtAlldPklcs1212e4001 = {
1237
  /* name           */ "PKLCS1212E4001",
1238
  /* info           */ "buzzer",
1239
  /* test function  */ utAlldPkxxxexxxFunc,
1240
  /* shell command  */ {
1241
    /* name     */ "unittest:Buzzer",
1242
    /* callback */ _utShellCmdCb_AlldPklcs1212e4001,
1243
    /* next     */ NULL,
1244
  },
1245
  /* data           */ &_utAlldPklcs1212e4001Data,
1246
};
1247

    
1248
/*
1249
 * TPS62113 (step-down converter)
1250
 */
1251
static int _utShellCmdCb_AlldTps62113(BaseSequentialStream* stream, int argc, char* argv[])
1252
{
1253
  // Although there are four TPS62113 on the PCB, they all share the same input signal.
1254
  // A sa result, no additional shell arguments need to be evaluated.
1255
  (void)argc;
1256
  (void)argv;
1257
  aosUtRun(stream, &moduleUtAlldTps62113, NULL);
1258
  return AOS_OK;
1259
}
1260
aos_unittest_t moduleUtAlldTps62113 = {
1261
  /* name           */ "TPS62113",
1262
  /* info           */ "step-down converter",
1263
  /* test function  */ utAlldTps6211xFunc,
1264
  /* shell command  */ {
1265
    /* name     */ "unittest:StepDownConverter",
1266
    /* callback */ _utShellCmdCb_AlldTps62113,
1267
    /* next     */ NULL,
1268
  },
1269
  /* data           */ &moduleLldStepDownConverter,
1270
};
1271

    
1272
/*
1273
 * TPS62113 (step-donw converter) in combination with INA219 (power monitor)
1274
 */
1275
static int _utShellCmdCb_AlldTps62113Ina219(BaseSequentialStream* stream, int argc, char* argv[])
1276
{
1277
  (void)argc;
1278
  (void)argv;
1279
  aosUtRun(stream, &moduleUtAlldTps62113Ina219, "VSYS (4.2V)");
1280
  return AOS_OK;
1281
}
1282
static ut_tps6211xina219data_t _utAlldTps62113Ina219Data = {
1283
  /* TPS62113 */ &moduleLldStepDownConverter,
1284
  /* INA219   */ &moduleLldPowerMonitorVsys42,
1285
  /* timeout  */ MICROSECONDS_PER_SECOND,
1286
};
1287
aos_unittest_t moduleUtAlldTps62113Ina219 = {
1288
  /* name           */ "TPS62113 & INA219",
1289
  /* info           */ "step-down converter & power monitor",
1290
  /* test function  */ utAlldTps6211xIna219Func,
1291
  /* shell command  */ {
1292
    /* name     */ "unittest:StepDownConverter&PowerMonitor",
1293
    /* callback */ _utShellCmdCb_AlldTps62113Ina219,
1294
    /* next     */ NULL,
1295
  },
1296
  /* data           */ &_utAlldTps62113Ina219Data,
1297
};
1298

    
1299
#if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) || defined(__DOXYGEN__)
1300

    
1301
/*
1302
 * MPR121 (touch sensor)
1303
 */
1304
static int _utShellCmdCb_AlldMpr121(BaseSequentialStream* stream, int argc, char* argv[])
1305
{
1306
  (void)argc;
1307
  (void)argv;
1308
  aosUtRun(stream, &moduleUtAlldMpr121, NULL);
1309
  return AOS_OK;
1310
}
1311
static ut_mpr121data_t _utAlldMpr121Data= {
1312
  /* MPR121 driver  */ &moduleLldTouch,
1313
  /* timeout        */ MICROSECONDS_PER_SECOND,
1314
  /* event source   */ &aos.events.io,
1315
  /* event flags    */ MODULE_OS_IOEVENTFLAGS_TOUCHINT,
1316
};
1317
aos_unittest_t moduleUtAlldMpr121 = {
1318
  /* name           */ "MPR121",
1319
  /* info           */ "touch sensor",
1320
  /* test function  */ utAlldMpr121Func,
1321
  /* shell command  */ {
1322
    /* name     */ "unittest:Touch",
1323
    /* callback */ _utShellCmdCb_AlldMpr121,
1324
    /* next     */ NULL,
1325
  },
1326
  /* data           */ &_utAlldMpr121Data,
1327
};
1328

    
1329
/*
1330
 * PCA9544A (I2C multiplexer)
1331
 */
1332
static int _utShellCmdCb_AlldPca5944a(BaseSequentialStream* stream, int argc, char* argv[])
1333
{
1334
  // evaluate arguments
1335
  if (argc == 2) {
1336
    if (strcmp(argv[1], "#1") == 0) {
1337
      ((ut_pca9544adata_t*)moduleUtAlldPca9544a.data)->driver = &moduleLldI2cMultiplexer1;
1338
      aosUtRun(stream, &moduleUtAlldPca9544a, "I2C bus #1");
1339
      ((ut_pca9544adata_t*)moduleUtAlldPca9544a.data)->driver = NULL;
1340
      return AOS_OK;
1341
    }
1342
    else if (strcmp(argv[1], "#2") == 0) {
1343
      ((ut_pca9544adata_t*)moduleUtAlldPca9544a.data)->driver = &moduleLldI2cMultiplexer2;
1344
      aosUtRun(stream, &moduleUtAlldPca9544a, "I2C bus #2");
1345
      ((ut_pca9544adata_t*)moduleUtAlldPca9544a.data)->driver = NULL;
1346
      return AOS_OK;
1347
    }
1348
  }
1349
  // print help
1350
  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
1351
  chprintf(stream, "Options:\n");
1352
  chprintf(stream, "  #1\n");
1353
  chprintf(stream, "    Test the multiplexer on the I2C bus #1.\n");
1354
  chprintf(stream, "  #2\n");
1355
  chprintf(stream, "    Test the multiplexer on the I2C bus #2.\n");
1356
  return AOS_INVALIDARGUMENTS;
1357
}
1358
static ut_pca9544adata_t _utAlldPca9544aData = {
1359
  /* driver   */ NULL,
1360
  /* timeout  */ MICROSECONDS_PER_SECOND,
1361
};
1362
aos_unittest_t moduleUtAlldPca9544a = {
1363
  /* name           */ "PCA9544A",
1364
  /* info           */ "I2C multiplexer",
1365
  /* test function  */ utAlldPca9544aFunc,
1366
  /* shell command  */ {
1367
    /* name     */ "unittest:I2CMultiplexer",
1368
    /* callback */ _utShellCmdCb_AlldPca5944a,
1369
    /* next     */ NULL,
1370
  },
1371
  /* data           */ &_utAlldPca9544aData,
1372
};
1373

    
1374
/*
1375
 * VCNL4020 (proximity sensor)
1376
 */
1377
static void _utAlldVcnl4020_disableInterrupt(VCNL4020Driver* vcnl)
1378
{
1379
  uint8_t intstatus;
1380
  vcnl4020_lld_writereg(vcnl, VCNL4020_LLD_REGADDR_INTCTRL, 0, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
1381
  vcnl4020_lld_readreg(vcnl, VCNL4020_LLD_REGADDR_INTSTATUS, &intstatus, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
1382
  if (intstatus) {
1383
    vcnl4020_lld_writereg(vcnl, VCNL4020_LLD_REGADDR_INTSTATUS, intstatus, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
1384
  }
1385
  return;
1386
}
1387
static int _utShellCmdCb_AlldVcnl4020(BaseSequentialStream* stream, int argc, char* argv[])
1388
{
1389
  enum {
1390
    UNKNOWN,
1391
    NNE, ENE, ESE, SSE, SSW,WSW,WNW, NNW,
1392
  } sensor = UNKNOWN;
1393
  // evaluate arguments
1394
  if (argc == 2) {
1395
    if (strcmp(argv[1], "-nne") == 0) {
1396
      sensor = NNE;
1397
    } else if (strcmp(argv[1], "-ene") == 0) {
1398
      sensor = ENE;
1399
    } else if (strcmp(argv[1], "-ese") == 0) {
1400
      sensor = ESE;
1401
    } else if (strcmp(argv[1], "-sse") == 0) {
1402
      sensor = SSE;
1403
    } else if (strcmp(argv[1], "-ssw") == 0) {
1404
      sensor = SSW;
1405
    } else if (strcmp(argv[1], "-wsw") == 0) {
1406
      sensor = WSW;
1407
    } else if (strcmp(argv[1], "-wnw") == 0) {
1408
      sensor = WNW;
1409
    } else if (strcmp(argv[1], "-nnw") == 0) {
1410
      sensor = NNW;
1411
    }
1412
  }
1413
  if (sensor != UNKNOWN) {
1414
    PCA9544ADriver* mux = NULL;
1415
    switch (sensor) {
1416
      case SSE:
1417
      case SSW:
1418
      case WSW:
1419
      case WNW:
1420
        mux = &moduleLldI2cMultiplexer1;
1421
        ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld = &moduleLldProximity1;
1422
        ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT2;
1423
        break;
1424
      case NNW:
1425
      case NNE:
1426
      case ENE:
1427
      case ESE:
1428
        mux = &moduleLldI2cMultiplexer2;
1429
        ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld = &moduleLldProximity2;
1430
        ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT1;
1431
        break;
1432
      default:
1433
        break;
1434
    }
1435
    pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH0, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
1436
    _utAlldVcnl4020_disableInterrupt(((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld);
1437
    pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH1, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
1438
    _utAlldVcnl4020_disableInterrupt(((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld);
1439
    pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH2, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
1440
    _utAlldVcnl4020_disableInterrupt(((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld);
1441
    pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH3, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
1442
    _utAlldVcnl4020_disableInterrupt(((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld);
1443
    switch (sensor) {
1444
      case NNE:
1445
        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH1, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
1446
        aosUtRun(stream, &moduleUtAlldVcnl4020, "north-northeast sensor");
1447
        break;
1448
      case ENE:
1449
        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH3, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
1450
        aosUtRun(stream, &moduleUtAlldVcnl4020, "east-northeast sensor");
1451
        break;
1452
      case ESE:
1453
        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH2, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
1454
        aosUtRun(stream, &moduleUtAlldVcnl4020, "north-southeast sensor");
1455
        break;
1456
      case SSE:
1457
        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH0, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
1458
        aosUtRun(stream, &moduleUtAlldVcnl4020, "south-southeast sensor");
1459
        break;
1460
      case SSW:
1461
        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH1, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
1462
        aosUtRun(stream, &moduleUtAlldVcnl4020, "south-southwest sensor");
1463
        break;
1464
      case WSW:
1465
        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH3, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
1466
        aosUtRun(stream, &moduleUtAlldVcnl4020, "west-southwest sensor");
1467
        break;
1468
      case WNW:
1469
        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH2, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
1470
        aosUtRun(stream, &moduleUtAlldVcnl4020, "west-northwest sensor");
1471
        break;
1472
      case NNW:
1473
        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH0, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
1474
        aosUtRun(stream, &moduleUtAlldVcnl4020, "north-northwest sensor");
1475
        break;
1476
      default:
1477
        break;
1478
    }
1479
    ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld = NULL;
1480
    ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->evtflags = 0;
1481
    return AOS_OK;
1482
  }
1483
  // print help
1484
  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
1485
  chprintf(stream, "Options:\n");
1486
  chprintf(stream, "  -nne\n");
1487
  chprintf(stream, "    Test north-northeast sensor.\n");
1488
  chprintf(stream, "  -ene\n");
1489
  chprintf(stream, "    Test east-northeast sensor.\n");
1490
  chprintf(stream, "  -ese\n");
1491
  chprintf(stream, "    Test east-southeast sensor.\n");
1492
  chprintf(stream, "  -sse\n");
1493
  chprintf(stream, "    Test south-southeast sensor.\n");
1494
  chprintf(stream, "  -ssw\n");
1495
  chprintf(stream, "    Test south-southwest sensor.\n");
1496
  chprintf(stream, "  -wsw\n");
1497
  chprintf(stream, "    Test west-southwest sensor.\n");
1498
  chprintf(stream, "  -wnw\n");
1499
  chprintf(stream, "    Test west-northwest sensor.\n");
1500
  chprintf(stream, "  -nnw\n");
1501
  chprintf(stream, "    Test north-northwest sensor.\n");
1502
  return AOS_INVALIDARGUMENTS;
1503
}
1504
static ut_vcnl4020data_t _utAlldVcnl4020Data = {
1505
  /* driver       */ NULL,
1506
  /* timeout      */ MICROSECONDS_PER_SECOND,
1507
  /* event source */ &aos.events.io,
1508
  /* event flags  */ 0,
1509
};
1510
aos_unittest_t moduleUtAlldVcnl4020 = {
1511
  /* name           */ "VCNL4020",
1512
  /* info           */ "proximity sensor",
1513
  /* test function  */ utAlldVcnl4020Func,
1514
  /* shell command  */ {
1515
    /* name     */ "unittest:Proximity",
1516
    /* callback */ _utShellCmdCb_AlldVcnl4020,
1517
    /* next     */ NULL,
1518
  },
1519
  /* data           */ &_utAlldVcnl4020Data,
1520
};
1521

    
1522
#endif /* (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) */
1523

    
1524
#if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || defined(__DOXYGEN__)
1525

    
1526
/*
1527
 * PCAL6524 (GPIO extender)
1528
 */
1529
static int _utShellCmdCb_AlldPcal6524(BaseSequentialStream* stream, int argc, char* argv[])
1530
{
1531
  // evaluate arguments
1532
  if (argc == 2) {
1533
    if (strcmp(argv[1], "#1") == 0) {
1534
      ((ut_pcal6524data_t*)moduleUtAlldPcal6524.data)->pcal6524d = &moduleLldGpioExtender1;
1535
      aosUtRun(stream, &moduleUtAlldPcal6524, "I2C bus #1");
1536
      ((ut_pcal6524data_t*)moduleUtAlldPcal6524.data)->pcal6524d = NULL;
1537
      return AOS_OK;
1538
    }
1539
    else if (strcmp(argv[1], "#2") == 0) {
1540
      ((ut_pcal6524data_t*)moduleUtAlldPcal6524.data)->pcal6524d = &moduleLldGpioExtender2;
1541
      aosUtRun(stream, &moduleUtAlldPcal6524, "I2C bus #2");
1542
      ((ut_pcal6524data_t*)moduleUtAlldPcal6524.data)->pcal6524d = NULL;
1543
      return AOS_OK;
1544
    }
1545
  }
1546
  // print help
1547
  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
1548
  chprintf(stream, "Options:\n");
1549
  chprintf(stream, "  #1\n");
1550
  chprintf(stream, "    Test the GPIO extender on the I2C bus #1.\n");
1551
  chprintf(stream, "  #2\n");
1552
  chprintf(stream, "    Test the GPIO extender on the I2C bus #2.\n");
1553
  return AOS_INVALIDARGUMENTS;
1554
}
1555
static ut_pcal6524data_t _utAlldPcal6524Data = {
1556
  /* driver   */ NULL,
1557
  /* timeout  */ MICROSECONDS_PER_SECOND,
1558
};
1559
aos_unittest_t moduleUtAlldPcal6524 = {
1560
  /* name           */ "PCAL6524",
1561
  /* info           */ "GPIO extender",
1562
  /* test function  */ utAlldPcal6524Func,
1563
  /* shell command  */ {
1564
    /* name     */ "unittest:GPIOExtender",
1565
    /* callback */ _utShellCmdCb_AlldPcal6524,
1566
    /* next     */ NULL,
1567
  },
1568
  /* data           */ &_utAlldPcal6524Data,
1569
};
1570

    
1571
/*
1572
 * AT42QT1050 (touch sensor)
1573
 */
1574
static int _utShellCmdCb_AlldAt42qt1050(BaseSequentialStream* stream, int argc, char* argv[])
1575
{
1576
  (void)argc;
1577
  (void)argv;
1578
  aosUtRun(stream, &moduleUtAlldAt42qt1050, NULL);
1579
  return AOS_OK;
1580
}
1581
static ut_at42qt1050data_t _utAlldAt42qt1050Data= {
1582
  /* AT42QT1050 driver  */ &moduleLldTouch,
1583
  /* timeout            */ MICROSECONDS_PER_SECOND,
1584
  /* event source       */ &aos.events.io,
1585
  /* event flags        */ MODULE_OS_IOEVENTFLAGS_TOUCHINT,
1586
};
1587
aos_unittest_t moduleUtAlldAt42qt1050 = {
1588
  /* name           */ "AT42QT1050",
1589
  /* info           */ "touch sensor",
1590
  /* test function  */ utAlldAt42qt1050Func,
1591
  /* shell command  */ {
1592
    /* name     */ "unittest:Touch",
1593
    /* callback */ _utShellCmdCb_AlldAt42qt1050,
1594
    /* next     */ NULL,
1595
  },
1596
  /* data           */ &_utAlldAt42qt1050Data,
1597
};
1598

    
1599
/* VL53L0X (proximity sensor) */
1600
static int _utShellCmdCb_AlldVL53L0X(BaseSequentialStream* stream, int argc, char* argv[])
1601
{
1602

    
1603

    
1604
    // first GPIO-Extender (the first 4 areas)
1605
    PCAL6524Driver* mux1 = NULL;
1606
    // second GPRO-Extender (the last 4 areas)
1607
    PCAL6524Driver* mux2 = NULL;
1608
    uint32_t status;
1609
    uint8_t buffer[2];
1610
    mux1 = &moduleLldGpioExtender1;
1611
    mux2 = &moduleLldGpioExtender2;
1612

    
1613

    
1614
    /*  1.1
1615
        set XSHUT as output(0) and GPIO/interrzpt as input(1)
1616
        XSHUT are P0_0 ... P0_7 P1_0 ... P1_3
1617
        intertupt are P1_4 ... P1_7 P2_0 ... P2_7
1618
    */
1619
    //P0_0...P0_7: 0x00 == 00000000
1620
    status = pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_CONFIGURATION_P0, 0x00, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1621
    //P1_0...P1_7: 0xF0==11110000
1622
    status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_CONFIGURATION_P1, 0xF0, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1623
    //P2_0...P2_7: 0xFF==11111111
1624
    status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_CONFIGURATION_P2, 0xFF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1625

    
1626
    /*  1.2
1627
        to set all VL53L0X to standby, you must set the XSHUT to low through pull-down.A better way is to set for all a pull-up and write the value 0 (low) to
1628
        Output port registers.
1629
        Therefore you must active the pull-ups/pull-downs for all XSHUT anf GPIO pins.
1630
        Set all XSHUT to low with a pull-down and all interrupts to high with a pull-up.
1631
    */
1632

    
1633
    //activte pull-up/pull-down for all pins
1634
    status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_PUPDENABLE_P0, 0xFF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1635
    status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_PUPDENABLE_P1, 0xFF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1636
    status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_PUPDENABLE_P2, 0xFF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1637
    //set pins to pull-up(1) or pull-down(0)
1638
    status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_PUPDSELECTION_P0, 0xFF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1639
    status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_PUPDSELECTION_P1, 0xFF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1640
    status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_PUPDSELECTION_P2, 0xFF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1641
    //set output ports to logical 0 to set VL53L0X to standby. If the port is an input port nothing happens.
1642
    status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_OUTPUT_P0, 0x00, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1643
    status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_OUTPUT_P1, 0x00, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1644

    
1645

    
1646
    /*  2.1
1647
        Configuration of the interrupt handling on GPIO Extander.
1648
        The Interrupt pins are already set as Input (pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_CONFIGURATION_P1, 0xF0,...); for Pins P1_0...P1_7).
1649
        To enable interrupts you must set the interrupt mask register to 0 for the GPIO pins (P1_4...P1_7 P2_0...P2_7).
1650
        Set for unittest all pins to 1 and only enable the one used pin.
1651
    */
1652
    status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTMASK_P0, 0xFF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1653
    status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTMASK_P1, 0xFF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1654
    status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTMASK_P2, 0xFF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1655

    
1656

    
1657
    /*  2.2
1658
        Set the interrupt edge register (60h to 65h) after you set the interrupt mask register (we unset this a step before) to declare if a rising edge (01)
1659
        or a falling edge (10) or other is an interrupt.
1660
        The GPIO1 pin from the VL53L0X is low and goes high if an interrupt is detected, you must use 01 for the pins P1_4...P1_7 P2_0...P2_7.
1661

1662
    */
1663
    //P1_4...P1_7: 0x55==01010101
1664
    //status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTEDGE_P1B, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1665
    //P2_3...P2_0: 0x55==01010101
1666
    //status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTEDGE_P2A, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1667
    //P2_4...P2_7: 0x55==01010101
1668
    //status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTEDGE_P2B, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1669

    
1670
    /*  3
1671
        Latch the input register (48h,49h,4Ah) enable and disable the input latch of the I/O pins. Write a 0 == not lachted and every read from the Input registers (00h,01h,02h)
1672
        and every change from the VL53L0X will clear the interrupt. Write a 1 == lachted and only a read from the Input registers (00h,01h,02h) will clear the interrupt.
1673
        Therefore it is not important what is set in step 2.1 and 2.2.
1674
    */
1675
    //P1_7...P1_4 set to 1 and P1_3...P1_0 set to 0: 0xF0==11110000
1676
    status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INPUTLATCH_P1, 0xF0, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1677
    //P2_7...P2_0 set to 1: 0xFF==11111111
1678
    status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INPUTLATCH_P2, 0xFF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1679

    
1680

    
1681

    
1682

    
1683
    // same as second GPIO-Extender
1684
    // set input/output
1685
    status = pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_CONFIGURATION_P0, 0x00, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1686
    status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_CONFIGURATION_P1, 0xF0, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1687
    status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_CONFIGURATION_P2, 0xFF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1688

    
1689
    //activte pull-up/pull-down for all pins
1690
    status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_PUPDENABLE_P0, 0xFF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1691
    status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_PUPDENABLE_P1, 0xFF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1692
    status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_PUPDENABLE_P2, 0xFF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1693
    //set pins to pull-up(1) or pull-down(0)
1694
    status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_PUPDSELECTION_P0, 0xFF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1695
    status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_PUPDSELECTION_P1, 0xFF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1696
    status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_PUPDSELECTION_P2, 0xFF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1697
    //set output ports to logical 0 to set VL53L0X to standby. If the port is an input port nothing happens.
1698
    status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_OUTPUT_P0, 0x00, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1699
    status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_OUTPUT_P1, 0x00, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1700
    //un enable all interrupts
1701
    status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTMASK_P0, 0xFF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1702
    status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTMASK_P1, 0xFF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1703
    status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTMASK_P2, 0xFF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1704
    // set interrupt to latch
1705
    status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INPUTLATCH_P1, 0xF0, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1706
    status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INPUTLATCH_P2, 0xFF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1707

    
1708

    
1709

    
1710

    
1711

    
1712
    //set one sensor to active
1713
    /*only bus moduleLldGpioExtender1
1714

1715
                A            GP
1716
            S1  S2  S3 | S4  S5  S6 | S7  S8  S9 | S10 S11 S12|
1717
    GPIO
1718
    XSHUT   1.3 1.2 1.1| 1.0 0.7 0.6| 0.5 0.4 0.3| 0.2 0.1 0.0|
1719
    INTER   2.7 2.6 2.5| 2.4 2.3 2.2| 2.1 2.0 1.7| 1.6 1.5 1.4|
1720

1721
    OPTION
1722
    #       11  12  13 | 14  15  16 | 17  18  19 | 110 111 112|
1723

1724

1725
    A == Anschluss
1726
    GP == GPIO Extender
1727
      */
1728
  if (argc == 2) {
1729

    
1730
      /*  scheme to set VL53L0X with the GPIO Extender:
1731
       * set bitmask for XSHUT, e.g. XSHUT at 0.3 => 00001000 == buffer[0] = 0x8;
1732
       * find the corresponding interrupt pin, e.g. 0.3 with interrupt 1.7
1733
       * 1.1 start the sensor, e.g for XSHUT at 0.3
1734
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_OUTPUT_P0, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1735
       * 2.1 set the interrupt, e.g. for 1.7 == 011111111 == 0x7F
1736
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTMASK_P1, 0x7F, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1737
       * 2.2 set interrupt edge register, e.g. interrupt at 1.7
1738
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTEDGE_P1B, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1739
       */
1740

    
1741

    
1742
      if (strcmp(argv[1], "#11") == 0) {
1743
          buffer[0] = 0x8; // == P1.3 => Interrupt 2.7
1744
          //start the sensor
1745
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_OUTPUT_P1, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1746
          //In step 2.1 the interrupt pins were unenabled, so enable the one necessary interrupt pin.
1747
          // 011111111 == 0x7F
1748
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTMASK_P2, 0x7F, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1749
          // set interrupt edge register, see step 2.2
1750
          // P2_4...P2_7: 0x55==01010101, although we need only the register 2_6, but the are ignored.
1751
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTEDGE_P2B, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1752

    
1753

    
1754
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = &moduleLldProximity1;
1755
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT2;
1756

    
1757
          //set GPIO extender
1758
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = &moduleLldGpioExtender1;
1759
      } else if (strcmp(argv[1], "#12") == 0) {
1760
          buffer[0] = 0x4; // PUD1.2 with interrupt P2_6
1761
          //start the sensor
1762
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_OUTPUT_P1, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1763
          //In step 2.1 the interrupt pins were unenabled, so enable the one necessary interrupt pin.
1764
          // 1011111111 == 0xBF
1765
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTMASK_P2, 0xBF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1766
          // set interrupt edge register, see step 2.2
1767
          // P2_4...P2_7: 0x55==01010101, although we need only the register 2_6, but the are ignored.
1768
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTEDGE_P2B, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1769

    
1770

    
1771

    
1772
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = &moduleLldProximity1;
1773
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT2;
1774

    
1775
          //set GPIO extender
1776
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = &moduleLldGpioExtender1;
1777
      } else if (strcmp(argv[1], "#13") == 0) {
1778
          buffer[0] = 0x2; // PUD1.1 with Interrupt P2_5
1779
          //start the sensor
1780
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_OUTPUT_P1, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1781
          //In step 2.1 the interrupt pins were unenabled, so enable the one necessary interrupt pin.
1782
          // 1101111111 == 0xDF == M2.5
1783
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTMASK_P2, 0xDF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1784
          // P2_4...P2_7: 0x55==01010101, although we need only the register 2_5, but the are ignored.
1785
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTEDGE_P2B, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1786

    
1787

    
1788
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = &moduleLldProximity1;
1789
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT2;
1790
          //set GPIO extender
1791
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = &moduleLldGpioExtender1;
1792
      } else if (strcmp(argv[1], "#14") == 0) {
1793
          buffer[0] = 0x1; // PUD1.0 with Interrupt P2_4
1794
          //start the sensor
1795
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_OUTPUT_P1, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1796
          //In step 2.1 the interrupt pins were unenabled, so enable the one necessary interrupt pin.
1797
          // 11101111 == 0xEF
1798
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTMASK_P2, 0xEF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1799
          // set interrupt edge register, see step 2.2
1800
          // P2_4...P2_7: 0x55==01010101, although we need only the register 2_6, but the are ignored.
1801
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTEDGE_P2B, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1802

    
1803

    
1804
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = &moduleLldProximity1;
1805
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT2;
1806
          //set GPIO extender
1807
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = &moduleLldGpioExtender1;
1808
      } else if (strcmp(argv[1], "#15") == 0) {
1809
          buffer[0] = 0x80; // PUD0.7 with interrupt P2.3
1810
          //start the sensor
1811
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_OUTPUT_P0, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1812
          //In step 2.1 the interrupt pins were unenabled, so enable the one necessary interrupt pin.
1813
          // 11110111 == 0xF7
1814
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTMASK_P2, 0xF7, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1815
          // set interrupt edge register, see step 2.2
1816
          // P2_0...P2_3: 0x55==01010101, although we need only the register 2_6, but the are ignored.
1817
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTEDGE_P2A, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1818

    
1819

    
1820
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = &moduleLldProximity1;
1821
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT2;
1822
          //set GPIO extender
1823
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = &moduleLldGpioExtender1;
1824
      } else if (strcmp(argv[1], "#16") == 0) {
1825
          buffer[0] = 0x40; // PUD0.6 with interrupt P2.2
1826
          //start the sensor
1827
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_OUTPUT_P0, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1828
          //In step 2.1 the interrupt pins were unenabled, so enable the one necessary interrupt pin.
1829
          // 11111011 == 0xFB
1830
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTMASK_P2, 0xFB, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1831
          // set interrupt edge register, see step 2.2
1832
          // P2_0...P2_3: 0x55==01010101, although we need only the register 2_6, but the are ignored.
1833
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTEDGE_P2A, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1834

    
1835

    
1836
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = &moduleLldProximity1;
1837
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT2;
1838
          //set GPIO extender
1839
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = &moduleLldGpioExtender1;
1840
      } else if (strcmp(argv[1], "#17") == 0) {
1841
          buffer[0] = 0x20; // PUD0.5 wirh interrupt P2.1
1842
          //start the sensor
1843
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_OUTPUT_P0, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1844
          //In step 2.1 the interrupt pins were unenabled, so enable the one necessary interrupt pin.
1845
          // 11111101 == 0xFD
1846
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTMASK_P2, 0xFD, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1847
          // set interrupt edge register, see step 2.2
1848
          // P2_0...P2_3: 0x55==01010101, although we need only the register 2_6, but the are ignored.
1849
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTEDGE_P2A, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1850

    
1851

    
1852
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = &moduleLldProximity1;
1853
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT2;
1854
          //set GPIO extender
1855
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = &moduleLldGpioExtender1;
1856
      } else if (strcmp(argv[1], "#18") == 0) {
1857
          buffer[0] = 0x10; // PUD0.4 with interrupt P2.0
1858
          //start the sensor
1859
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_OUTPUT_P0, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1860
          //In step 2.1 the interrupt pins were unenabled, so enable the one necessary interrupt pin.
1861
          // 11111110 == 0xFE
1862
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTMASK_P2, 0xFE, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1863
          // set interrupt edge register, see step 2.2
1864
          // P2_3...P2_0: 0x55==01010101, although we need only the register 2_6, but the are ignored.
1865
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTEDGE_P2A, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1866

    
1867

    
1868
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = &moduleLldProximity1;
1869
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT2;
1870
          //set GPIO extender
1871
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = &moduleLldGpioExtender1;
1872
      } else if (strcmp(argv[1], "#19") == 0) {
1873
          buffer[0] = 0x8; // PUD0.3 with interrupt P1_7
1874
          //start the sensor
1875
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_OUTPUT_P0, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1876
          //In step 2.1 the interrupt pins were unenabled, so enable the one necessary interrupt pin.
1877
          // 011111111 == 0x7F
1878
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTMASK_P1, 0x7F, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1879
          // set interrupt edge register, see step 2.2
1880
          // P1_4...P1_7: 0x55==01010101, although we need only the register 2_6, but the are ignored.
1881
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTEDGE_P1B, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1882

    
1883

    
1884
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = &moduleLldProximity1;
1885
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT2;
1886
          //set GPIO extender
1887
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = &moduleLldGpioExtender1;
1888
      } else if (strcmp(argv[1], "#110") == 0) {
1889
          buffer[0] = 0x4; //PUD0.2 with interrupt P1_6
1890
          //start the sensor
1891
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_OUTPUT_P0, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1892
          //In step 2.1 the interrupt pins were unenabled, so enable the one necessary interrupt pin.
1893
          // 10111111 == 0xBF
1894
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTMASK_P1, 0xBF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1895
          // set interrupt edge register, see step 2.2
1896
          // P1_4...P1_7: 0x55==01010101, although we need only the register 2_6, but the are ignored.
1897
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTEDGE_P1B, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1898

    
1899

    
1900
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = &moduleLldProximity1;
1901
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT2;
1902
          //set GPIO extender
1903
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = &moduleLldGpioExtender1;
1904
      } else if (strcmp(argv[1], "#111") == 0) {
1905
          buffer[0] = 0x2; // PUD0.1 with interrupt P1_5
1906
          //start the sensor
1907
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_OUTPUT_P0, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1908
          //In step 2.1 the interrupt pins were unenabled, so enable the one necessary interrupt pin.
1909
          // 11011111 == 0xDF
1910
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTMASK_P1, 0xDF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1911
          // set interrupt edge register, see step 2.2
1912
          // P1_4...P1_7: 0x55==01010101, although we need only the register 2_6, but the are ignored.
1913
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTEDGE_P1B, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1914

    
1915

    
1916
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = &moduleLldProximity1;
1917
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT2;
1918
          //set GPIO extender
1919
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = &moduleLldGpioExtender1;
1920
      } else if (strcmp(argv[1], "#112") == 0) {
1921
          buffer[0] = 0x1; // PUD0.0 with interrupt P1_4
1922
          //start the sensor
1923
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_OUTPUT_P0, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1924
          //In step 2.1 the interrupt pins were unenabled, so enable the one necessary interrupt pin.
1925
          // 11101111 == 0xEF
1926
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTMASK_P1, 0xEF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1927
          // set interrupt edge register, see step 2.2
1928
          // P1_4...P1_7: 0x55==01010101, although we need only the register 2_6, but the are ignored.
1929
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTEDGE_P1B, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1930

    
1931

    
1932
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = &moduleLldProximity1;
1933
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT2;
1934
          //set GPIO extender
1935
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = &moduleLldGpioExtender1;
1936

    
1937
      } else if (strcmp(argv[1], "#21") == 0) {
1938
          buffer[0] = 0x8; // == P1.3 => Interrupt 2.7
1939
          //start the sensor
1940
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_OUTPUT_P1, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1941
          //In step 2.1 the interrupt pins were unenabled, so enable the one necessary interrupt pin.
1942
          // 011111111 == 0x7F
1943
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTMASK_P2, 0x7F, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1944
          // set interrupt edge register, see step 2.2
1945
          // P2_4...P2_7: 0x55==01010101, although we need only the register 2_6, but the are ignored.
1946
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTEDGE_P2B, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1947

    
1948
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = &moduleLldProximity2;
1949
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT1;
1950
          //set GPIO extender
1951
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = &moduleLldGpioExtender2;
1952
      } else if (strcmp(argv[1], "#22") == 0) {
1953
          buffer[0] = 0x4; // PUD1.2 with interrupt P2_6
1954
          //start the sensor
1955
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_OUTPUT_P1, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1956
          //In step 2.1 the interrupt pins were unenabled, so enable the one necessary interrupt pin.
1957
          // 1011111111 == 0xBF
1958
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTMASK_P2, 0xBF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1959
          // set interrupt edge register, see step 2.2
1960
          // P2_4...P2_7: 0x55==01010101, although we need only the register 2_6, but the are ignored.
1961
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTEDGE_P2B, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1962

    
1963

    
1964
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = &moduleLldProximity2;
1965
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT1;
1966
          //set GPIO extender
1967
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = &moduleLldGpioExtender2;
1968

    
1969
      } else if (strcmp(argv[1], "#23") == 0) {
1970
          buffer[0] = 0x2; // PUD1.1 with Interrupt P2_5
1971
          //start the sensor
1972
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_OUTPUT_P1, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1973
          //In step 2.1 the interrupt pins were unenabled, so enable the one necessary interrupt pin.
1974
          // 1101111111 == 0xDF == M2.5
1975
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTMASK_P2, 0xDF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1976
          // P2_4...P2_7: 0x55==01010101, although we need only the register 2_5, but the are ignored.
1977
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTEDGE_P2B, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1978

    
1979
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = &moduleLldProximity2;
1980
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT1;
1981
          //set GPIO extender
1982
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = &moduleLldGpioExtender2;
1983
      } else if (strcmp(argv[1], "#24") == 0) {
1984
          buffer[0] = 0x1; // PUD1.0 with Interrupt P2_4
1985
          //start the sensor
1986
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_OUTPUT_P1, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1987
          //In step 2.1 the interrupt pins were unenabled, so enable the one necessary interrupt pin.
1988
          // 11101111 == 0xEF
1989
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTMASK_P2, 0xEF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1990
          // set interrupt edge register, see step 2.2
1991
          // P2_4...P2_7: 0x55==01010101, although we need only the register 2_6, but the are ignored.
1992
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTEDGE_P2B, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
1993

    
1994

    
1995
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = &moduleLldProximity2;
1996
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT1;
1997
          //set GPIO extender
1998
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = &moduleLldGpioExtender2;
1999
      } else if (strcmp(argv[1], "#25") == 0) {
2000
          buffer[0] = 0x80; // PUD0.7 with interrupt P2.3
2001
          //start the sensor
2002
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_OUTPUT_P0, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2003
          //In step 2.1 the interrupt pins were unenabled, so enable the one necessary interrupt pin.
2004
          // 11110111 == 0xF7
2005
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTMASK_P2, 0xF7, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2006
          // set interrupt edge register, see step 2.2
2007
          // P2_0...P2_3: 0x55==01010101, although we need only the register 2_6, but the are ignored.
2008
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTEDGE_P2A, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2009

    
2010

    
2011
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = &moduleLldProximity2;
2012
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT1;
2013
          //set GPIO extender
2014
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = &moduleLldGpioExtender2;
2015
      } else if (strcmp(argv[1], "#26") == 0) {
2016
          buffer[0] = 0x40; // PUD0.6 with interrupt P2.2
2017
          //start the sensor
2018
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_OUTPUT_P0, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2019
          //In step 2.1 the interrupt pins were unenabled, so enable the one necessary interrupt pin.
2020
          // 11111011 == 0xFB
2021
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTMASK_P2, 0xFB, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2022
          // set interrupt edge register, see step 2.2
2023
          // P2_0...P2_3: 0x55==01010101, although we need only the register 2_6, but the are ignored.
2024
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTEDGE_P2A, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2025

    
2026

    
2027
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = &moduleLldProximity2;
2028
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT1;
2029
          //set GPIO extender
2030
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = &moduleLldGpioExtender2;
2031
      } else if (strcmp(argv[1], "#27") == 0) {
2032
          buffer[0] = 0x20; // PUD0.5 wirh interrupt P2.1
2033
          //start the sensor
2034
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_OUTPUT_P0, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2035
          //In step 2.1 the interrupt pins were unenabled, so enable the one necessary interrupt pin.
2036
          // 11111101 == 0xFD
2037
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTMASK_P2, 0xFD, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2038
          // set interrupt edge register, see step 2.2
2039
          // P2_0...P2_3: 0x55==01010101, although we need only the register 2_6, but the are ignored.
2040
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTEDGE_P2A, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2041

    
2042
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = &moduleLldProximity2;
2043
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT1;
2044
          //set GPIO extender
2045
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = &moduleLldGpioExtender2;
2046
      } else if (strcmp(argv[1], "#28") == 0) {
2047
          buffer[0] = 0x10; // PUD0.4 with interrupt P2.0
2048
          //start the sensor
2049
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_OUTPUT_P0, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2050
          //In step 2.1 the interrupt pins were unenabled, so enable the one necessary interrupt pin.
2051
          // 11111110 == 0xFE
2052
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTMASK_P2, 0xFE, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2053
          // set interrupt edge register, see step 2.2
2054
          // P2_3...P2_0: 0x55==01010101, although we need only the register 2_6, but the are ignored.
2055
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTEDGE_P2A, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2056

    
2057

    
2058
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = &moduleLldProximity2;
2059
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT1;
2060
          //set GPIO extender
2061
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = &moduleLldGpioExtender2;
2062
      } else if (strcmp(argv[1], "#29") == 0) {
2063
          buffer[0] = 0x8; // PUD0.3 with interrupt P1_7
2064
          //start the sensor
2065
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_OUTPUT_P0, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2066
          //In step 2.1 the interrupt pins were unenabled, so enable the one necessary interrupt pin.
2067
          // 011111111 == 0x7F
2068
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTMASK_P1, 0x7F, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2069
          // set interrupt edge register, see step 2.2
2070
          // P1_4...P1_7: 0x55==01010101, although we need only the register 2_6, but the are ignored.
2071
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTEDGE_P1B, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2072

    
2073

    
2074
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = &moduleLldProximity2;
2075
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT1;
2076
          //set GPIO extender
2077
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = &moduleLldGpioExtender2;
2078
      } else if (strcmp(argv[1], "#210") == 0) {
2079
          buffer[0] = 0x4; //PUD0.2 with interrupt P1_6
2080
          //start the sensor
2081
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_OUTPUT_P0, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2082
          //In step 2.1 the interrupt pins were unenabled, so enable the one necessary interrupt pin.
2083
          // 10111111 == 0xBF
2084
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTMASK_P1, 0xBF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2085
          // set interrupt edge register, see step 2.2
2086
          // P1_4...P1_7: 0x55==01010101, although we need only the register 2_6, but the are ignored.
2087
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTEDGE_P1B, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2088

    
2089

    
2090
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = &moduleLldProximity2;
2091
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT1;
2092
          //set GPIO extender
2093
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = &moduleLldGpioExtender2;
2094
      } else if (strcmp(argv[1], "#211") == 0) {
2095
          buffer[0] = 0x2; // PUD0.1 with interrupt P1_5
2096
          //start the sensor
2097
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_OUTPUT_P0, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2098
          //In step 2.1 the interrupt pins were unenabled, so enable the one necessary interrupt pin.
2099
          // 11011111 == 0xDF
2100
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTMASK_P1, 0xDF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2101
          // set interrupt edge register, see step 2.2
2102
          // P1_4...P1_7: 0x55==01010101, although we need only the register 2_6, but the are ignored.
2103
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTEDGE_P1B, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2104

    
2105

    
2106
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = &moduleLldProximity2;
2107
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT1;
2108
          //set GPIO extender
2109
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = &moduleLldGpioExtender2;
2110
      } else if (strcmp(argv[1], "#212") == 0) {
2111
          buffer[0] = 0x1; // PUD0.0 with interrupt P1_4
2112
          //start the sensor
2113
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_OUTPUT_P0, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2114
          //In step 2.1 the interrupt pins were unenabled, so enable the one necessary interrupt pin.
2115
          // 11101111 == 0xEF
2116
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTMASK_P1, 0xEF, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2117
          // set interrupt edge register, see step 2.2
2118
          // P1_4...P1_7: 0x55==01010101, although we need only the register 2_6, but the are ignored.
2119
          status |= pcal6524_lld_write_reg(mux2, PCAL6524_LLD_CMD_INTERRUPTEDGE_P1B, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2120

    
2121
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = &moduleLldProximity2;
2122
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT1;
2123
          //set GPIO extender
2124
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = &moduleLldGpioExtender2;
2125
      } else {
2126
          //use first sensor
2127
          chprintf(stream, "unknown argument, use first sensor\n");
2128
          usleep(2000000);
2129
          buffer[0] = 0x8; // == P1.3 => Interrupt 2.7
2130
          //start the sensor
2131
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_OUTPUT_P1, buffer[0], ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2132
          //In step 2.1 the interrupt pins were unenabled, so enable the one necessary interrupt pin.
2133
          // 011111111 == 0x7F
2134
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTMASK_P2, 0x7F, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2135
          // set interrupt edge register, see step 2.2
2136
          // P2_4...P2_7: 0x55==01010101, although we need only the register 2_6, but the are ignored.
2137
          status |= pcal6524_lld_write_reg(mux1, PCAL6524_LLD_CMD_INTERRUPTEDGE_P2B, 0x55, ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->timeout);
2138

    
2139

    
2140
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = &moduleLldProximity1;
2141
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT2;
2142

    
2143
          //set GPIO extender
2144
          ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = &moduleLldGpioExtender1;
2145
      }
2146

    
2147

    
2148

    
2149

    
2150

    
2151
      (void)argc;
2152
      (void)argv;
2153
      //wait 60 ms for boottime from sensor
2154
      usleep(60000);
2155
      aosUtRun(stream, &moduleUtAlldVl53l0x, "VL53");
2156

    
2157
      ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->vl53d = NULL;
2158
      ((ut_vl53l0xdata_t*)moduleUtAlldVl53l0x.data)->gpio = NULL;
2159
      return AOS_OK;
2160
  }else{
2161

    
2162
  // print help
2163
  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
2164
  chprintf(stream, "Options:\n");
2165
  chprintf(stream, "  #11\n");
2166
  chprintf(stream, "    Test the first VL53L0X sensor on the I2C bus #1.\n");
2167
  chprintf(stream, "  #12\n");
2168
  chprintf(stream, "    Test the second VL53L0X sensor on the I2C bus #1.\n");
2169
  chprintf(stream, "  ... #112\n");
2170
  chprintf(stream, "    Test the 12 VL53L0X sensor on the I2C bus #1.\n");
2171
  chprintf(stream, "  #21\n");
2172
  chprintf(stream, "    Test the first VL53L0X sensor on the I2C bus #2.\n");
2173
  chprintf(stream, "  ... #212\n");
2174
  chprintf(stream, "    Test the 12 VL53L0X sensor on the I2C bus #2.\n");
2175
  return AOS_INVALIDARGUMENTS;
2176
  }
2177

    
2178

    
2179
  // belegung der Hols beim Sensor:
2180
  //                    obster/rechter: interrupt, XSHUT, GND
2181
  //                    mittlerer:      GND, interrupt, XSHUT, GND
2182
  //                    Unterster/linker:GND, interrupt, XSHUT
2183
  // set the XHUT Pins (P0_0 ... P0_7 P1_0 ... P1_3 ) from first GPIO-Extender to LOW
2184
  //    -> first: Der pin, der auf XSHUT weißt ist ein Output !
2185
  //    -> second: setze alle Sensoren unter reset == Der Pin erhält eine Spannung unter 1 Volt
2186
  //    -> third: setze einen Pin auf High (Spannung groesser 2 Volt) und dann kann man die Adresse
2187
  //                ansprechen.
2188

    
2189

    
2190

    
2191
}
2192
static ut_vl53l0xdata_t _utAlldVL53L0XData = {
2193
  /* driver       */ NULL,
2194
  /* timeout      */ MICROSECONDS_PER_SECOND,
2195
  /* event source */ &aos.events.io,
2196
  /* event flags  */ 0,
2197
  /* gpio */ NULL,
2198
};
2199
aos_unittest_t moduleUtAlldVl53l0x = {
2200
  /* name           */ "VL53L0X",
2201
  /* info           */ "proximity sensor",
2202
  /* test function  */ utAlldVL53L0XFunc,
2203
  /* shell command  */ {
2204
    /* name     */ "unittest:Proximity",
2205
    /* callback */ _utShellCmdCb_AlldVL53L0X,
2206
    /* next     */ NULL,
2207
  },
2208
  /* data           */ &_utAlldVL53L0XData,
2209
};
2210

    
2211

    
2212
#endif /* (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) */
2213

    
2214
#if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) || defined(__DOXYGEN__)
2215

    
2216
/*
2217
 * PCAL6524 (GPIO extender)
2218
 */
2219
static int _utShellCmdCb_AlldPcal6524(BaseSequentialStream* stream, int argc, char* argv[])
2220
{
2221
  // evaluate arguments
2222
  if (argc == 2) {
2223
    if (strcmp(argv[1], "#1") == 0) {
2224
      ((ut_pcal6524data_t*)moduleUtAlldPcal6524.data)->pcal6524d = &moduleLldGpioExtender1;
2225
      aosUtRun(stream, &moduleUtAlldPcal6524, "I2C bus #1");
2226
      ((ut_pcal6524data_t*)moduleUtAlldPcal6524.data)->pcal6524d = NULL;
2227
      return AOS_OK;
2228
    }
2229
    else if (strcmp(argv[1], "#2") == 0) {
2230
      ((ut_pcal6524data_t*)moduleUtAlldPcal6524.data)->pcal6524d = &moduleLldGpioExtender2;
2231
      aosUtRun(stream, &moduleUtAlldPcal6524, "I2C bus #2");
2232
      ((ut_pcal6524data_t*)moduleUtAlldPcal6524.data)->pcal6524d = NULL;
2233
      return AOS_OK;
2234
    }
2235
  }
2236
  // print help
2237
  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
2238
  chprintf(stream, "Options:\n");
2239
  chprintf(stream, "  #1\n");
2240
  chprintf(stream, "    Test the GPIO extender on the I2C bus #1.\n");
2241
  chprintf(stream, "  #2\n");
2242
  chprintf(stream, "    Test the GPIO extender on the I2C bus #2.\n");
2243
  return AOS_INVALIDARGUMENTS;
2244
}
2245
static ut_pcal6524data_t _utAlldPcal6524Data = {
2246
  /* driver   */ NULL,
2247
  /* timeout  */ MICROSECONDS_PER_SECOND,
2248
};
2249
aos_unittest_t moduleUtAlldPcal6524 = {
2250
  /* name           */ "PCAL6524",
2251
  /* info           */ "GPIO extender",
2252
  /* test function  */ utAlldPcal6524Func,
2253
  /* shell command  */ {
2254
    /* name     */ "unittest:GPIOExtender",
2255
    /* callback */ _utShellCmdCb_AlldPcal6524,
2256
    /* next     */ NULL,
2257
  },
2258
  /* data           */ &_utAlldPcal6524Data,
2259
};
2260

    
2261
/*
2262
 * AT42QT1050 (touch sensor)
2263
 */
2264
static int _utShellCmdCb_AlldAt42qt1050(BaseSequentialStream* stream, int argc, char* argv[])
2265
{
2266
  (void)argc;
2267
  (void)argv;
2268
  aosUtRun(stream, &moduleUtAlldAt42qt1050, NULL);
2269
  return AOS_OK;
2270
}
2271
static ut_at42qt1050data_t _utAlldAt42qt1050Data= {
2272
  /* AT42QT1050 driver  */ &moduleLldTouch,
2273
  /* timeout            */ MICROSECONDS_PER_SECOND,
2274
  /* event source       */ &aos.events.io,
2275
  /* event flags        */ MODULE_OS_IOEVENTFLAGS_TOUCHINT,
2276
};
2277
aos_unittest_t moduleUtAlldAt42qt1050 = {
2278
  /* name           */ "AT42QT1050",
2279
  /* info           */ "touch sensor",
2280
  /* test function  */ utAlldAt42qt1050Func,
2281
  /* shell command  */ {
2282
    /* name     */ "unittest:Touch",
2283
    /* callback */ _utShellCmdCb_AlldAt42qt1050,
2284
    /* next     */ NULL,
2285
  },
2286
  /* data           */ &_utAlldAt42qt1050Data,
2287
};
2288

    
2289
#endif /* (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) */
2290

    
2291
#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
2292

    
2293
/** @} */
2294
/** @} */