commit ddf34c3d28477689064d650e0bf4f578de75ec86
Author: Thomas Schöpping <tschoepp@cit-ec.uni-bielefeld.de>
Date:   Wed Feb 6 13:55:47 2019 +0100

    updated AMiRo-LLD and applied all required changes to AMiRo-OS and all modules.

diff --git a/modules/DiWheelDrive_1-1/alldconf.h b/modules/DiWheelDrive_1-1/alldconf.h
index 96577df..d6da5d0 100644
--- a/modules/DiWheelDrive_1-1/alldconf.h
+++ b/modules/DiWheelDrive_1-1/alldconf.h
@@ -46,57 +46,57 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /**
  * @brief   Enable flag for the A3906 motor driver.
  */
-#define AMIROLLD_CFG_USE_A3906
+#define AMIROLLD_CFG_A3906              1
 
 /**
  * @brief   Enable flag for the AT24C01BN-SH-B EEPROM.
  */
-#define AMIROLLD_CFG_USE_AT24C01BN
+#define AMIROLLD_CFG_AT24C01B           1
 
 /**
  * @brief   Enable flag for the MHC5883L compass.
  */
-#define AMIROLLD_CFG_USE_HMC5883L
+#define AMIROLLD_CFG_HMC5883L           1
 
 /**
  * @brief   Enable flag for the INA219 power monitor.
  */
-#define AMIROLLD_CFG_USE_INA219
+#define AMIROLLD_CFG_INA219             1
 
 /**
  * @brief   Enable flag for the L3G4200D gyroscope.
  */
-#define AMIROLLD_CFG_USE_L3G4200D
+#define AMIROLLD_CFG_L3G4200D           1
 
 /**
  * @brief   Enable flag for the status LED.
  */
-#define AMIROLLD_CFG_USE_LED
+#define AMIROLLD_CFG_LED                1
 
 /**
  * @brief   Enable flag for the LIS331DLH accelerometer.
  */
-#define AMIROLLD_CFG_USE_LIS331DLH
+#define AMIROLLD_CFG_LIS331DLH          1
 
 /**
  * @brief   Enable flag for the LTC4412 power path controller.
  */
-#define AMIROLLD_CFG_USE_LTC4412
+#define AMIROLLD_CFG_LTC4412            1
 
 /**
  * @brief   Enable flag for the PCA9544A I2C multiplexer.
  */
-#define AMIROLLD_CFG_USE_PCA9544A
+#define AMIROLLD_CFG_PCA9544A           1
 
 /**
  * @brief   Enable flag for the TPS62113 step-down converter.
  */
-#define AMIROLLD_CFG_USE_TPS62113
+#define AMIROLLD_CFG_TPS6211x           1
 
 /**
  * @brief   Enable flag for the VCNL4020 proximity sensor.
  */
-#define AMIROLLD_CFG_USE_VCNL4020
+#define AMIROLLD_CFG_VCNL4020           1
 
 #endif /* ALLDCONF_H */
 
diff --git a/modules/DiWheelDrive_1-1/module.c b/modules/DiWheelDrive_1-1/module.c
index ec1ab16..94d94a6 100644
--- a/modules/DiWheelDrive_1-1/module.c
+++ b/modules/DiWheelDrive_1-1/module.c
@@ -378,9 +378,9 @@ A3906Driver moduleLldMotors = {
   /* power enable GPIO  */ &moduleGpioPowerEn,
 };
 
-AT24C01BNDriver moduleLldEeprom = {
+AT24C01BDriver moduleLldEeprom = {
   /* I2C driver   */ &MODULE_HAL_I2C_PROX_EEPROM_PWRMTR,
-  /* I²C address  */ AT24C01BN_LLD_I2C_ADDR_FIXED,
+  /* I²C address  */ AT24C01B_LLD_I2C_ADDR_FIXED,
 };
 
 HMC5883LDriver moduleLldCompass = {
@@ -416,7 +416,7 @@ PCA9544ADriver moduleLldI2cMultiplexer = {
   /* I²C address  */ PCA9544A_LLD_I2C_ADDR_FIXED | PCA9544A_LLD_I2C_ADDR_A0 | PCA9544A_LLD_I2C_ADDR_A1 | PCA9544A_LLD_I2C_ADDR_A2,
 };
 
-TPS62113Driver moduleLldStepDownConverterVdrive = {
+TPS6211xDriver moduleLldStepDownConverterVdrive = {
   /* Power enable Gpio */ &moduleGpioPowerEn,
 };
 
@@ -480,29 +480,29 @@ aos_unittest_t moduleUtAlldA3906  = {
 };
 
 /*
- * AT24C01BN (EEPROM)
+ * AT24C01B (EEPROM)
  */
-static int _utShellCmdCb_AlldAt24c01bn(BaseSequentialStream* stream, int argc, char* argv[])
+static int _utShellCmdCb_AlldAt24c01b(BaseSequentialStream* stream, int argc, char* argv[])
 {
   (void)argc;
   (void)argv;
-  aosUtRun(stream, &moduleUtAlldAt24c01bn, NULL);
+  aosUtRun(stream, &moduleUtAlldAt24c01b, NULL);
   return AOS_OK;
 }
-static ut_at24c01bndata_t _utAt24c01bnData = {
+static ut_at24c01bdata_t _utAlldAt24c01bData = {
   /* driver   */ &moduleLldEeprom,
   /* timeout  */ MICROSECONDS_PER_SECOND,
 };
-aos_unittest_t moduleUtAlldAt24c01bn = {
-  /* name           */ "AT24C01BN-SH-B",
+aos_unittest_t moduleUtAlldAt24c01b = {
+  /* name           */ "AT24C01B",
   /* info           */ "1kbit EEPROM",
-  /* test function  */ utAlldAt24c01bnFunc,
+  /* test function  */ utAlldAt24c01bFunc,
   /* shell command  */ {
     /* name     */ "unittest:EEPROM",
-    /* callback */ _utShellCmdCb_AlldAt24c01bn,
+    /* callback */ _utShellCmdCb_AlldAt24c01b,
     /* next     */ NULL,
   },
-  /* data           */ &_utAt24c01bnData,
+  /* data           */ &_utAlldAt24c01bData,
 };
 
 /*
@@ -704,7 +704,7 @@ static int _utShellCmdCb_AlldTps62113(BaseSequentialStream* stream, int argc, ch
 aos_unittest_t moduleUtAlldTps62113 = {
   /* name           */ "TPS62113",
   /* info           */ "Step down converter",
-  /* test function  */ utAlldTps62113Func,
+  /* test function  */ utAlldTps6211xFunc,
   /* shell command  */ {
     /* name     */ "unittest:StepDownConverter",
     /* callback */ _utShellCmdCb_AlldTps62113,
diff --git a/modules/DiWheelDrive_1-1/module.h b/modules/DiWheelDrive_1-1/module.h
index 9828892..7b4dbbe 100644
--- a/modules/DiWheelDrive_1-1/module.h
+++ b/modules/DiWheelDrive_1-1/module.h
@@ -337,7 +337,7 @@ extern ROMCONST char* moduleShellPrompt;
 #define MODULE_INIT_TESTS() {                                                 \
   /* add unit-test shell commands */                                          \
   aosShellAddCommand(&aos.shell, &moduleUtAlldA3906.shellcmd);                \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldAt24c01bn.shellcmd);            \
+  aosShellAddCommand(&aos.shell, &moduleUtAlldAt24c01b.shellcmd);            \
   aosShellAddCommand(&aos.shell, &moduleUtAlldHmc5883l.shellcmd);             \
   aosShellAddCommand(&aos.shell, &moduleUtAlldIna219.shellcmd);               \
   aosShellAddCommand(&aos.shell, &moduleUtAlldL3g4200d.shellcmd);             \
@@ -361,7 +361,7 @@ extern ROMCONST char* moduleShellPrompt;
   i2cStart(&MODULE_HAL_I2C_COMPASS, &moduleHalI2cCompassConfig);              \
   moduleHalI2cProxEepromPwrmtrConfig.clock_speed = (PCA9544A_LLD_I2C_MAXFREQUENCY < moduleHalI2cProxEepromPwrmtrConfig.clock_speed) ? PCA9544A_LLD_I2C_MAXFREQUENCY : moduleHalI2cProxEepromPwrmtrConfig.clock_speed; \
   moduleHalI2cProxEepromPwrmtrConfig.clock_speed = (VCNL4020_LLD_I2C_MAXFREQUENCY < moduleHalI2cProxEepromPwrmtrConfig.clock_speed) ? VCNL4020_LLD_I2C_MAXFREQUENCY : moduleHalI2cProxEepromPwrmtrConfig.clock_speed; \
-  moduleHalI2cProxEepromPwrmtrConfig.clock_speed = (AT24C01BN_LLD_I2C_MAXFREQUENCY < moduleHalI2cProxEepromPwrmtrConfig.clock_speed) ? AT24C01BN_LLD_I2C_MAXFREQUENCY : moduleHalI2cProxEepromPwrmtrConfig.clock_speed; \
+  moduleHalI2cProxEepromPwrmtrConfig.clock_speed = (AT24C01B_LLD_I2C_MAXFREQUENCY < moduleHalI2cProxEepromPwrmtrConfig.clock_speed) ? AT24C01B_LLD_I2C_MAXFREQUENCY : moduleHalI2cProxEepromPwrmtrConfig.clock_speed; \
   moduleHalI2cProxEepromPwrmtrConfig.clock_speed = (INA219_LLD_I2C_MAXFREQUENCY < moduleHalI2cProxEepromPwrmtrConfig.clock_speed) ? INA219_LLD_I2C_MAXFREQUENCY : moduleHalI2cProxEepromPwrmtrConfig.clock_speed; \
   moduleHalI2cProxEepromPwrmtrConfig.duty_cycle = (moduleHalI2cProxEepromPwrmtrConfig.clock_speed <= 100000) ? STD_DUTY_CYCLE : FAST_DUTY_CYCLE_2;  \
   i2cStart(&MODULE_HAL_I2C_PROX_EEPROM_PWRMTR, &moduleHalI2cProxEepromPwrmtrConfig);  \
@@ -439,17 +439,17 @@ extern ROMCONST char* moduleShellPrompt;
  * @{
  */
 /*===========================================================================*/
-#include <alld_a3906.h>
-#include <alld_at24c01bn-sh-b.h>
-#include <alld_hmc5883l.h>
-#include <alld_ina219.h>
-#include <alld_l3g4200d.h>
-#include <alld_led.h>
-#include <alld_lis331dlh.h>
-#include <alld_ltc4412.h>
-#include <alld_pca9544a.h>
-#include <alld_tps62113.h>
-#include <alld_vcnl4020.h>
+#include <alld_A3906.h>
+#include <alld_AT24C01B.h>
+#include <alld_HMC5883L.h>
+#include <alld_INA219.h>
+#include <alld_L3G4200D.h>
+#include <alld_LED.h>
+#include <alld_LIS331DLH.h>
+#include <alld_LTC4412.h>
+#include <alld_PCA9544A.h>
+#include <alld_TPS6211x.h>
+#include <alld_VCNL4020.h>
 
 /**
  * @brief   Motor driver.
@@ -459,7 +459,7 @@ extern A3906Driver moduleLldMotors;
 /**
  * @brief   EEPROM driver.
  */
-extern AT24C01BNDriver moduleLldEeprom;
+extern AT24C01BDriver moduleLldEeprom;
 
 /**
  * @brief   Compass driver.
@@ -499,7 +499,7 @@ extern PCA9544ADriver moduleLldI2cMultiplexer;
 /**
  * @brief   Step down converter (VDRIVE) driver.
  */
-extern TPS62113Driver moduleLldStepDownConverterVdrive;
+extern TPS6211xDriver moduleLldStepDownConverterVdrive;
 
 /**
  * @brief   Proximity sensor driver.
@@ -515,17 +515,17 @@ extern VCNL4020Driver moduleLldProximity;
  */
 /*===========================================================================*/
 #if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
-#include <ut_alld_a3906.h>
-#include <ut_alld_at24c01bn-sh-b.h>
-#include <ut_alld_hmc5883l.h>
-#include <ut_alld_ina219.h>
-#include <ut_alld_l3g4200d.h>
-#include <ut_alld_led.h>
-#include <ut_alld_lis331dlh.h>
-#include <ut_alld_ltc4412.h>
-#include <ut_alld_pca9544a.h>
-#include <ut_alld_tps62113.h>
-#include <ut_alld_vcnl4020.h>
+#include <ut_alld_A3906_v1.h>
+#include <ut_alld_AT24C01B_v1.h>
+#include <ut_alld_HMC5883L_v1.h>
+#include <ut_alld_INA219_v1.h>
+#include <ut_alld_L3G4200D_v1.h>
+#include <ut_alld_LED_v1.h>
+#include <ut_alld_LIS331DLH_v1.h>
+#include <ut_alld_LTC4412_v1.h>
+#include <ut_alld_PCA9544A_v1.h>
+#include <ut_alld_TPS6211x_v1.h>
+#include <ut_alld_VCNL4020_v1.h>
 
 /**
  * @brief   A3906 (motor driver) unit test object.
@@ -535,7 +535,7 @@ extern aos_unittest_t moduleUtAlldA3906;
 /**
  * @brief   AT24C01BN-SH-B (EEPROM) unit test object.
  */
-extern aos_unittest_t moduleUtAlldAt24c01bn;
+extern aos_unittest_t moduleUtAlldAt24c01b;
 
 /**
  * @brief   HMC5883L (compass) unit test object.
diff --git a/modules/LightRing_1-0/alldconf.h b/modules/LightRing_1-0/alldconf.h
index 8854b73..f398463 100644
--- a/modules/LightRing_1-0/alldconf.h
+++ b/modules/LightRing_1-0/alldconf.h
@@ -46,17 +46,17 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /**
  * @brief   Enable flag for the AT24C01BN-SH-B EEPROM.
  */
-#define AMIROLLD_CFG_USE_AT24C01BN
+#define AMIROLLD_CFG_AT24C01B           1
 
 /**
  * @brief   Enable flag for the TLC5947 LED driver.
  */
-#define AMIROLLD_CFG_USE_TLC5947
+#define AMIROLLD_CFG_TLC5947            1
 
 /**
  * @brief   Enable flag for the TPS2051BDBV power switch.
  */
-#define AMIROLLD_CFG_USE_TPS2051BDBV
+#define AMIROLLD_CFG_TPS20xxB           1
 
 #endif /* ALLDCONF_H */
 
diff --git a/modules/LightRing_1-0/module.c b/modules/LightRing_1-0/module.c
index 34f74d4..7ca204d 100644
--- a/modules/LightRing_1-0/module.c
+++ b/modules/LightRing_1-0/module.c
@@ -112,7 +112,7 @@ ROMCONST apalControlGpio_t moduleGpioLaserEn = {
   /* GPIO */ &_gpioLaserEn,
   /* meta */ {
     /* direction      */ APAL_GPIO_DIRECTION_OUTPUT,
-    /* active state   */ TPS2051B_LLD_ENABLE_ACTIVE_STATE,
+    /* active state   */ TPS20xxB_LLD_ENABLE_ACTIVE_STATE,
     /* interrupt edge */ APAL_GPIO_EDGE_NONE,
   },
 };
@@ -128,7 +128,7 @@ ROMCONST apalControlGpio_t moduleGpioLaserOc = {
   /* GPIO */ &_gpioLaserOc,
   /* meta */ {
     /* direction      */ APAL_GPIO_DIRECTION_INPUT,
-    /* active state   */ TPS2051B_LLD_OVERCURRENT_ACTIVE_STATE,
+    /* active state   */ TPS20xxB_LLD_OVERCURRENT_ACTIVE_STATE,
     /* interrupt edge */ APAL_GPIO_EDGE_BOTH,
   },
 };
@@ -260,7 +260,7 @@ ROMCONST char* moduleShellPrompt = "LightRing";
  */
 /*===========================================================================*/
 
-AT24C01BNDriver moduleLldEeprom = {
+AT24C01BDriver moduleLldEeprom = {
   /* I2C driver   */ &MODULE_HAL_I2C_EEPROM,
   /* I2C address  */ 0x00u,
 };
@@ -271,7 +271,7 @@ TLC5947Driver moduleLldLedPwm = {
   /* XLAT signal GPIO   */ &moduleGpioLightXlat,
 };
 
-TPS2051BDriver moduleLldPowerSwitchLaser = {
+TPS20xxBDriver moduleLldPowerSwitchLaser = {
   /* laser enable GPIO      */ &moduleGpioLaserEn,
   /* laser overcurrent GPIO */ &moduleGpioLaserOc,
 };
@@ -287,33 +287,33 @@ TPS2051BDriver moduleLldPowerSwitchLaser = {
 #if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
 
 /*
- * EEPROM (AT24C01BN)
+ * EEPROM (AT24C01B)
  */
-static int _utShellCmdCb_AlldAt24c01bn(BaseSequentialStream* stream, int argc, char* argv[])
+static int _utShellCmdCb_AlldAt24c01b(BaseSequentialStream* stream, int argc, char* argv[])
 {
   (void)argc;
   (void)argv;
-  aosUtRun(stream, &moduleUtAlldAt24c01bn, NULL);
+  aosUtRun(stream, &moduleUtAlldAt24c01b, NULL);
   return AOS_OK;
 }
-static ut_at24c01bndata_t _utAt24c01bnData = {
+static ut_at24c01bdata_t _utAlldAt24c01bData = {
   /* driver   */ &moduleLldEeprom,
   /* timeout  */ MICROSECONDS_PER_SECOND,
 };
-aos_unittest_t moduleUtAlldAt24c01bn = {
-  /* name           */ "AT24C01BN-SH-B",
+aos_unittest_t moduleUtAlldAt24c01b = {
+  /* name           */ "AT24C01B",
   /* info           */ "1kbit EEPROM",
-  /* test function  */ utAlldAt24c01bnFunc,
+  /* test function  */ utAlldAt24c01bFunc,
   /* shell command  */ {
     /* name     */ "unittest:EEPROM",
-    /* callback */ _utShellCmdCb_AlldAt24c01bn,
+    /* callback */ _utShellCmdCb_AlldAt24c01b,
     /* next     */ NULL,
   },
-  /* data           */ &_utAt24c01bnData,
+  /* data           */ &_utAlldAt24c01bData,
 };
 
 /*
- * LED PWM driver (TLD5947)
+ * LED PWM driver (TLC5947)
  */
 static int _utShellCmdCb_Tlc5947(BaseSequentialStream* stream, int argc, char* argv[])
 {
@@ -335,7 +335,7 @@ aos_unittest_t moduleUtAlldTlc5947 = {
 };
 
 /*
- * power switch (Laser)
+ * power switch (TPS2051BDBV)
  */
 static int _utShellCmdCb_Tps2051bdbv(BaseSequentialStream* stream, int argc, char* argv[])
 {
@@ -347,7 +347,7 @@ static int _utShellCmdCb_Tps2051bdbv(BaseSequentialStream* stream, int argc, cha
 aos_unittest_t moduleUtAlldTps2051bdbv = {
   /* info           */ "TPS2051BDBV",
   /* name           */ "current-limited power switch",
-  /* test function  */ utAlldTps2051bdbvFunc,
+  /* test function  */ utAlldTps20xxbFunc,
   /* shell command  */ {
     /* name     */ "unittest:PowerSwitch",
     /* callback */ _utShellCmdCb_Tps2051bdbv,
diff --git a/modules/LightRing_1-0/module.h b/modules/LightRing_1-0/module.h
index f6ed79d..803e0c8 100644
--- a/modules/LightRing_1-0/module.h
+++ b/modules/LightRing_1-0/module.h
@@ -221,7 +221,7 @@ extern ROMCONST char* moduleShellPrompt;
  */
 #define MODULE_INIT_TESTS() {                                                 \
   /* add unit-test shell commands */                                          \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldAt24c01bn.shellcmd);            \
+  aosShellAddCommand(&aos.shell, &moduleUtAlldAt24c01b.shellcmd);            \
   aosShellAddCommand(&aos.shell, &moduleUtAlldTlc5947.shellcmd);              \
   aosShellAddCommand(&aos.shell, &moduleUtAlldTps2051bdbv.shellcmd);          \
 }
@@ -233,7 +233,7 @@ extern ROMCONST char* moduleShellPrompt;
   /* serial driver */                                                         \
   sdStart(&MODULE_HAL_PROGIF, &moduleHalProgIfConfig);                        \
   /* I2C */                                                                   \
-  moduleHalI2cEepromConfig.clock_speed = (AT24C01BN_LLD_I2C_MAXFREQUENCY < moduleHalI2cEepromConfig.clock_speed) ? AT24C01BN_LLD_I2C_MAXFREQUENCY : moduleHalI2cEepromConfig.clock_speed; \
+  moduleHalI2cEepromConfig.clock_speed = (AT24C01B_LLD_I2C_MAXFREQUENCY < moduleHalI2cEepromConfig.clock_speed) ? AT24C01B_LLD_I2C_MAXFREQUENCY : moduleHalI2cEepromConfig.clock_speed; \
   moduleHalI2cEepromConfig.duty_cycle = (moduleHalI2cEepromConfig.clock_speed <= 100000) ? STD_DUTY_CYCLE : FAST_DUTY_CYCLE_2;  \
   i2cStart(&MODULE_HAL_I2C_EEPROM, &moduleHalI2cEepromConfig);                \
   /* SPI */                                                                   \
@@ -300,14 +300,14 @@ extern ROMCONST char* moduleShellPrompt;
  * @{
  */
 /*===========================================================================*/
-#include <alld_at24c01bn-sh-b.h>
-#include <alld_tlc5947.h>
-#include <alld_tps2051bdbv.h>
+#include <alld_AT24C01B.h>
+#include <alld_TLC5947.h>
+#include <alld_TPS20xxB.h>
 
 /**
  * @brief   EEPROM driver.
  */
-extern AT24C01BNDriver moduleLldEeprom;
+extern AT24C01BDriver moduleLldEeprom;
 
 /**
  * @brief   LED PWM driver.
@@ -317,7 +317,7 @@ extern TLC5947Driver moduleLldLedPwm;
 /**
  * @brief   Power switch driver for the laser supply power.
  */
-extern TPS2051BDriver moduleLldPowerSwitchLaser;
+extern TPS20xxBDriver moduleLldPowerSwitchLaser;
 
 /** @} */
 
@@ -328,14 +328,14 @@ extern TPS2051BDriver moduleLldPowerSwitchLaser;
  */
 /*===========================================================================*/
 #if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
-#include <ut_alld_at24c01bn-sh-b.h>
-#include <ut_alld_tlc5947.h>
-#include <ut_alld_tps2051bdbv.h>
+#include <ut_alld_AT24C01B_v1.h>
+#include <ut_alld_TLC5947_v1.h>
+#include <ut_alld_TPS20xxB_v1.h>
 
 /**
  * @brief   EEPROM unit test object.
  */
-extern aos_unittest_t moduleUtAlldAt24c01bn;
+extern aos_unittest_t moduleUtAlldAt24c01b;
 
 /**
  * @brief   LED PWM driver unit test object.
diff --git a/modules/PowerManagement_1-1/alldconf.h b/modules/PowerManagement_1-1/alldconf.h
index 73e2e67..c6a8fc8 100644
--- a/modules/PowerManagement_1-1/alldconf.h
+++ b/modules/PowerManagement_1-1/alldconf.h
@@ -49,59 +49,62 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /**
  * @brief   Enable flag for the AT24C01BN-SH-B EEPROM.
  */
-#define AMIROLLD_CFG_USE_AT24C01BN
+#define AMIROLLD_CFG_AT24C01B           1
 
 /**
  * @brief   Enable flag for the BQ24103A charger.
  */
-#define AMIROLLD_CFG_USE_BQ24103A
+#define AMIROLLD_CFG_BQ241xx            1
 
 /**
  * @brief   Enable flag for the BQ27500 fuel gauge.
  */
-#define AMIROLLD_CFG_USE_BQ27500
+#define AMIROLLD_CFG_BQ27500            1
 
 /**
  * @brief   Enable flag for the INA219 power monitor.
  */
-#define AMIROLLD_CFG_USE_INA219
+#define AMIROLLD_CFG_INA219             1
 
 /**
  * @brief   Enable flag for the status LED.
  */
-#define AMIROLLD_CFG_USE_LED
+#define AMIROLLD_CFG_LED                1
 
 /**
  * @brief   Enable flag for the PKLCS1212E4001 buzzer.
  */
-#define AMIROLLD_CFG_USE_PKLCS1212E4001
+#define AMIROLLD_CFG_PKxxxExxx          1
+#define PKxxxExxx_LLD_FREQUENCY_MIN     2000
+#define PKxxxExxx_LLD_FREQUENCY_SPEC    4000
+#define PKxxxExxx_LLD_FREQUENCY_MAX     6000
 
 /**
  * @brief   Enable flag for the TPS2051BDBV power switch.
  */
-#define AMIROLLD_CFG_USE_TPS2051BDBV
+#define AMIROLLD_CFG_TPS20xxB           1
 
 /**
  * @brief   Enable flag for the TPS62113 step-down converter.
  */
-#define AMIROLLD_CFG_USE_TPS62113
+#define AMIROLLD_CFG_TPS6211x           1
 
 #if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) || defined(__DOXYGEN__)
 
 /**
  * @brief   Enable flag for the MPR121 touch sensor.
  */
-#define AMIROLLD_CFG_USE_MPR121
+#define AMIROLLD_CFG_MPR121             1
 
 /**
  * @brief   Enable flag for the PCA9544A I2C multiplexer.
  */
-#define AMIROLLD_CFG_USE_PCA9544A
+#define AMIROLLD_CFG_PCA9544A           1
 
 /**
  * @brief   Enable flag for the VCNL4020 proximity sensor.
  */
-#define AMIROLLD_CFG_USE_VCNL4020
+#define AMIROLLD_CFG_VCNL4020           1
 
 #endif /* BOARD_SENSORRING == BOARD_PROXIMITYSENSOR */
 
@@ -110,12 +113,12 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /**
  * @brief   Enable flag for the PCAL6524 GPIO extender
  */
-#define AMIROLLD_CFG_USE_PCAL6524
+#define AMIROLLD_CFG_PCAL6524           1
 
 /**
  * @brief   Enable flag for the AT42Q1050 touch sensor.
  */
-#define AMIROLLD_CFG_USE_AT42QT1050
+#define AMIROLLD_CFG_AT42QT1050         1
 
 #endif /* BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X */
 
@@ -124,12 +127,12 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /**
  * @brief   Enable flag for the PCAL6524 GPIO extender
  */
-#define AMIROLLD_CFG_USE_PCAL6524
+#define AMIROLLD_CFG_PCAL6524           1
 
 /**
  * @brief   Enable flag for the AT42Q1050 touch sensor.
  */
-#define AMIROLLD_CFG_USE_AT42QT1050
+#define AMIROLLD_CFG_AT42QT1050         1
 
 #endif /* BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X */
 
diff --git a/modules/PowerManagement_1-1/board.h b/modules/PowerManagement_1-1/board.h
index 70601a9..eaded06 100644
--- a/modules/PowerManagement_1-1/board.h
+++ b/modules/PowerManagement_1-1/board.h
@@ -91,7 +91,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /*
  * Configuration macro to define which type of sensor ring is attached.
  */
-#define BOARD_SENSORRING                  BOARD_PROXIMITYSENSOR
+#define BOARD_SENSORRING                BOARD_PROXIMITYSENSOR
 
 /*
  * IO pins assignments.
diff --git a/modules/PowerManagement_1-1/module.c b/modules/PowerManagement_1-1/module.c
index b2d7450..0481c0b 100644
--- a/modules/PowerManagement_1-1/module.c
+++ b/modules/PowerManagement_1-1/module.c
@@ -206,7 +206,7 @@ ROMCONST apalControlGpio_t moduleGpioChargeStat2A = {
   /* GPIO */ &_gpioChargeStat2A,
   /* meta */ {
     /* direction      */ APAL_GPIO_DIRECTION_INPUT,
-    /* active state   */ BQ24103A_LLD_CHARGE_STATUS_GPIO_ACTIVE_STATE,
+    /* active state   */ BQ241xx_LLD_CHARGE_STATUS_GPIO_ACTIVE_STATE,
     /* interrupt edge */ APAL_GPIO_EDGE_NONE,
   },
 };
@@ -286,7 +286,7 @@ ROMCONST apalControlGpio_t moduleGpioChargeStat1A = {
   /* GPIO */ &_gpioChargeStat1A,
   /* meta */ {
     /* direction      */ APAL_GPIO_DIRECTION_INPUT,
-    /* active state   */ BQ24103A_LLD_CHARGE_STATUS_GPIO_ACTIVE_STATE,
+    /* active state   */ BQ241xx_LLD_CHARGE_STATUS_GPIO_ACTIVE_STATE,
     /* interrupt edge */ APAL_GPIO_EDGE_NONE,
   },
 };
@@ -334,7 +334,7 @@ ROMCONST apalControlGpio_t moduleGpioChargeEn1 = {
   /* GPIO */ &_gpioChargeEn1,
   /* meta */ {
     /* direction      */ APAL_GPIO_DIRECTION_OUTPUT,
-    /* active state   */ BQ24103A_LLD_ENABLED_GPIO_ACTIVE_STATE,
+    /* active state   */ BQ241xx_LLD_ENABLED_GPIO_ACTIVE_STATE,
     /* interrupt edge */ APAL_GPIO_EDGE_NONE,
   },
 };
@@ -532,7 +532,7 @@ ROMCONST apalControlGpio_t moduleGpioChargeEn2 = {
   /* GPIO */ &_gpioChargeEn2,
   /* meta */ {
     /* direction      */ APAL_GPIO_DIRECTION_OUTPUT,
-    /* active state   */ BQ24103A_LLD_ENABLED_GPIO_ACTIVE_STATE,
+    /* active state   */ BQ241xx_LLD_ENABLED_GPIO_ACTIVE_STATE,
     /* interrupt edge */ APAL_GPIO_EDGE_NONE,
   },
 };
@@ -568,17 +568,17 @@ ROMCONST char* moduleShellPrompt = "PowerManagement";
  */
 /*===========================================================================*/
 
-AT24C01BNDriver moduleLldEeprom = {
+AT24C01BDriver moduleLldEeprom = {
   /* I2C driver   */ &MODULE_HAL_I2C_SR_PM42_PM50_PMVDD_EEPROM_GAUGEFRONT,
-  /* I2C address  */ AT24C01BN_LLD_I2C_ADDR_FIXED,
+  /* I2C address  */ AT24C01B_LLD_I2C_ADDR_FIXED,
 };
 
-BQ24103ADriver moduleLldBatteryChargerFront = {
+BQ241xxDriver moduleLldBatteryChargerFront = {
   /* charge enable GPIO */ &moduleGpioChargeEn1,
   /* charge status GPIO */ &moduleGpioChargeStat1A,
 };
 
-BQ24103ADriver moduleLldBatteryChargerRear = {
+BQ241xxDriver moduleLldBatteryChargerRear = {
   /* charge enable GPIO */ &moduleGpioChargeEn2,
   /* charge status GPIO */ &moduleGpioChargeStat2A,
 };
@@ -634,7 +634,7 @@ LEDDriver moduleLldStatusLed = {
   /* LED GPIO */ &moduleGpioLed,
 };
 
-TPS62113Driver moduleLldStepDownConverter = {
+TPS6211xDriver moduleLldStepDownConverter = {
   /* Power enable GPIO */ &moduleGpioPowerEn,
 };
 
@@ -740,33 +740,33 @@ aos_unittest_t moduleUtAdcVsys = {
 };
 
 /*
- * AT24C01BN-SH-B (EEPROM)
+ * AT24C01B (EEPROM)
  */
-static int _utShellCmdCb_AlldAt24c01bn(BaseSequentialStream* stream, int argc, char* argv[])
+static int _utShellCmdCb_AlldAt24c01b(BaseSequentialStream* stream, int argc, char* argv[])
 {
   (void)argc;
   (void)argv;
-  aosUtRun(stream, &moduleUtAlldAt24c01bn, NULL);
+  aosUtRun(stream, &moduleUtAlldAt24c01b, NULL);
   return AOS_OK;
 }
-static ut_at24c01bndata_t _utAlldAt24c01bnData = {
+static ut_at24c01bdata_t _utAlldAt24c01bData = {
   /* driver   */ &moduleLldEeprom,
   /* timeout  */ MICROSECONDS_PER_SECOND,
 };
-aos_unittest_t moduleUtAlldAt24c01bn = {
-  /* name           */ "AT24C01BN-SH-B",
+aos_unittest_t moduleUtAlldAt24c01b = {
+  /* name           */ "AT24C01B",
   /* info           */ "1kbit EEPROM",
-  /* test function  */ utAlldAt24c01bnFunc,
+  /* test function  */ utAlldAt24c01bFunc,
   /* shell command  */ {
     /* name     */ "unittest:EEPROM",
-    /* callback */ _utShellCmdCb_AlldAt24c01bn,
+    /* callback */ _utShellCmdCb_AlldAt24c01b,
     /* next     */ NULL,
   },
-  /* data           */ &_utAlldAt24c01bnData,
+  /* data           */ &_utAlldAt24c01bData,
 };
 
 /*
- * BQ24103A (battery charger)
+ * bq24103a (battery charger)
  */
 static int _utShellCmdCb_AlldBq24103a(BaseSequentialStream* stream, int argc, char* argv[])
 {
@@ -806,9 +806,9 @@ static int _utShellCmdCb_AlldBq24103a(BaseSequentialStream* stream, int argc, ch
   }
 }
 aos_unittest_t moduleUtAlldBq24103a = {
-  /* name           */ "BQ24103A",
+  /* name           */ "bq24103a",
   /* info           */ "battery charger",
-  /* test function  */ utAlldBq24103aFunc,
+  /* test function  */ utAlldBq241xxFunc,
   /* shell command  */ {
     /* name     */ "unittest:BatteryCharger",
     /* callback */ _utShellCmdCb_AlldBq24103a,
@@ -818,7 +818,7 @@ aos_unittest_t moduleUtAlldBq24103a = {
 };
 
 /*
- * BQ27500 (fuel gauge)
+ * bq27500 (fuel gauge)
  */
 static int _utShellCmdCb_AlldBq27500(BaseSequentialStream* stream, int argc, char* argv[])
 {
@@ -851,7 +851,7 @@ static ut_bq27500data_t _utAlldBq27500Data = {
   /* timeout  */ MICROSECONDS_PER_SECOND,
 };
 aos_unittest_t moduleUtAlldBq27500 = {
-  /* name           */ "BQ27500",
+  /* name           */ "bq27500",
   /* info           */ "fuel gauge",
   /* test function  */ utAlldBq27500Func,
   /* shell command  */ {
@@ -863,26 +863,26 @@ aos_unittest_t moduleUtAlldBq27500 = {
 };
 
 /*
- * BQ27500 (fuel gauge) in combination with BQ24103A (battery charger)
+ * bq27500 (fuel gauge) in combination with bq24103a (battery charger)
  */
 static int _utShellCmdCb_AlldBq27500Bq24103a(BaseSequentialStream* stream, int argc, char* argv[])
 {
   // evaluate arguments
   if (argc == 2) {
     if (strcmp(argv[1], "-f") == 0 || strcmp(argv[1], "--front") == 0) {
-      ((ut_bq27500bq24103adata_t*)moduleUtAlldBq27500Bq24103a.data)->bq27500 = &moduleLldFuelGaugeFront;
-      ((ut_bq27500bq24103adata_t*)moduleUtAlldBq27500Bq24103a.data)->bq24103a = &moduleLldBatteryChargerFront;
+      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq27500 = &moduleLldFuelGaugeFront;
+      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq241xx = &moduleLldBatteryChargerFront;
       aosUtRun(stream, &moduleUtAlldBq27500Bq24103a, "front battery");
-      ((ut_bq27500bq24103adata_t*)moduleUtAlldBq27500Bq24103a.data)->bq27500 = NULL;
-      ((ut_bq27500bq24103adata_t*)moduleUtAlldBq27500Bq24103a.data)->bq24103a = NULL;
+      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq27500 = NULL;
+      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq241xx = NULL;
       return AOS_OK;
     }
     else if (strcmp(argv[1], "-r") == 0 || strcmp(argv[1], "--rear") == 0) {
-      ((ut_bq27500bq24103adata_t*)moduleUtAlldBq27500Bq24103a.data)->bq27500 = &moduleLldFuelGaugeRear;
-      ((ut_bq27500bq24103adata_t*)moduleUtAlldBq27500Bq24103a.data)->bq24103a = &moduleLldBatteryChargerRear;
+      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq27500 = &moduleLldFuelGaugeRear;
+      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq241xx = &moduleLldBatteryChargerRear;
       aosUtRun(stream, &moduleUtAlldBq27500Bq24103a, "rear battery");
-      ((ut_bq27500bq24103adata_t*)moduleUtAlldBq27500Bq24103a.data)->bq27500 = NULL;
-      ((ut_bq27500bq24103adata_t*)moduleUtAlldBq27500Bq24103a.data)->bq24103a = NULL;
+      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq27500 = NULL;
+      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq241xx = NULL;
       return AOS_OK;
     }
   }
@@ -895,15 +895,15 @@ static int _utShellCmdCb_AlldBq27500Bq24103a(BaseSequentialStream* stream, int a
   chprintf(stream, "    Test the rear battery fuel gauge and charger.\n");
   return AOS_INVALID_ARGUMENTS;
 }
-static ut_bq27500bq24103adata_t _utAlldBq27500Bq24103aData= {
-  /* BQ27500 driver   */ NULL,
-  /* BQ23203A driver  */ NULL,
+static ut_bq27500bq241xxdata_t _utAlldBq27500Bq24103aData= {
+  /* bq27500 driver   */ NULL,
+  /* bq24103a driver  */ NULL,
   /* timeout          */ MICROSECONDS_PER_SECOND,
 };
 aos_unittest_t moduleUtAlldBq27500Bq24103a = {
   /* name           */ "BQ27500 & BQ24103A",
   /* info           */ "fuel gauge & battery charger",
-  /* test function  */ utAlldBq27500Bq24103aFunc,
+  /* test function  */ utAlldBq27500Bq241xxFunc,
   /* shell command  */ {
     /* name     */ "unittest:FuelGauge&BatteryCharger",
     /* callback */ _utShellCmdCb_AlldBq27500Bq24103a,
@@ -1025,14 +1025,14 @@ static int _utShellCmdCb_AlldPklcs1212e4001(BaseSequentialStream* stream, int ar
   aosUtRun(stream, &moduleUtAlldPklcs1212e4001, NULL);
   return AOS_OK;
 }
-static ut_pklcs1212e4001_t _utAlldPklcs1212e4001Data = {
+static ut_pkxxxexxx_t _utAlldPklcs1212e4001Data = {
   /* PWM driver   */ &MODULE_HAL_PWM_BUZZER,
   /* PWM channel  */ MODULE_HAL_PWM_BUZZER_CHANNEL
 };
 aos_unittest_t moduleUtAlldPklcs1212e4001 = {
   /* name           */ "PKLCS1212E4001",
   /* info           */ "buzzer",
-  /* test function  */ utAlldPklcs1212e4001Func,
+  /* test function  */ utAlldPkxxxexxxFunc,
   /* shell command  */ {
     /* name     */ "unittest:Buzzer",
     /* callback */ _utShellCmdCb_AlldPklcs1212e4001,
@@ -1042,7 +1042,7 @@ aos_unittest_t moduleUtAlldPklcs1212e4001 = {
 };
 
 /*
- * TPS62113 (stop-down converter)
+ * TPS62113 (step-down converter)
  */
 static int _utShellCmdCb_AlldTps62113(BaseSequentialStream* stream, int argc, char* argv[])
 {
@@ -1056,7 +1056,7 @@ static int _utShellCmdCb_AlldTps62113(BaseSequentialStream* stream, int argc, ch
 aos_unittest_t moduleUtAlldTps62113 = {
   /* name           */ "TPS62113",
   /* info           */ "step-down converter",
-  /* test function  */ utAlldTps62113Func,
+  /* test function  */ utAlldTps6211xFunc,
   /* shell command  */ {
     /* name     */ "unittest:StepDownConverter",
     /* callback */ _utShellCmdCb_AlldTps62113,
@@ -1075,7 +1075,7 @@ static int _utShellCmdCb_AlldTps62113Ina219(BaseSequentialStream* stream, int ar
   aosUtRun(stream, &moduleUtAlldTps62113Ina219, "VSYS (4.2V)");
   return AOS_OK;
 }
-static ut_tps62113ina219data_t _utAlldTps62113Ina219Data = {
+static ut_tps6211xina219data_t _utAlldTps62113Ina219Data = {
   /* TPS62113 */ &moduleLldStepDownConverter,
   /* INA219   */ &moduleLldPowerMonitorVsys42,
   /* timeout  */ MICROSECONDS_PER_SECOND,
@@ -1083,7 +1083,7 @@ static ut_tps62113ina219data_t _utAlldTps62113Ina219Data = {
 aos_unittest_t moduleUtAlldTps62113Ina219 = {
   /* name           */ "TPS62113 & INA219",
   /* info           */ "step-down converter & power monitor",
-  /* test function  */ utAlldTps62113Ina219Func,
+  /* test function  */ utAlldTps6211xIna219Func,
   /* shell command  */ {
     /* name     */ "unittest:StepDownConverter&PowerMonitor",
     /* callback */ _utShellCmdCb_AlldTps62113Ina219,
diff --git a/modules/PowerManagement_1-1/module.h b/modules/PowerManagement_1-1/module.h
index 90c5e92..08f6b35 100644
--- a/modules/PowerManagement_1-1/module.h
+++ b/modules/PowerManagement_1-1/module.h
@@ -434,7 +434,7 @@ extern ROMCONST char* moduleShellPrompt;
 #define MODULE_INIT_TESTS() {                                                 \
   /* add unit-test shell commands */                                          \
   aosShellAddCommand(&aos.shell, &moduleUtAdcVsys.shellcmd);                  \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldAt24c01bn.shellcmd);            \
+  aosShellAddCommand(&aos.shell, &moduleUtAlldAt24c01b.shellcmd);            \
   aosShellAddCommand(&aos.shell, &moduleUtAlldBq24103a.shellcmd);             \
   aosShellAddCommand(&aos.shell, &moduleUtAlldBq27500.shellcmd);              \
   aosShellAddCommand(&aos.shell, &moduleUtAlldBq27500Bq24103a.shellcmd);      \
@@ -478,7 +478,7 @@ extern ROMCONST char* moduleShellPrompt;
   moduleHalI2cSrPm18Pm33GaugeRearConfig.duty_cycle = (moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed <= 100000) ? STD_DUTY_CYCLE : FAST_DUTY_CYCLE_2;  \
   i2cStart(&MODULE_HAL_I2C_SR_PM18_PM33_GAUGEREAR, &moduleHalI2cSrPm18Pm33GaugeRearConfig); \
   moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (INA219_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? INA219_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed; \
-  moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (AT24C01BN_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? AT24C01BN_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed; \
+  moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (AT24C01B_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? AT24C01B_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed; \
   moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (BQ27500_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? BQ27500_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed; \
   moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.duty_cycle = (moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed <= 100000) ? STD_DUTY_CYCLE : FAST_DUTY_CYCLE_2;  \
   i2cStart(&MODULE_HAL_I2C_SR_PM42_PM50_PMVDD_EEPROM_GAUGEFRONT, &moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig);  \
@@ -488,7 +488,7 @@ extern ROMCONST char* moduleShellPrompt;
   pwmStart(&MODULE_HAL_PWM_BUZZER, &moduleHalPwmBuzzerConfig);                \
   moduleHalPwmBuzzerConfig.frequency = MODULE_HAL_PWM_BUZZER.clock;           \
   pwmStop(&MODULE_HAL_PWM_BUZZER);                                            \
-  moduleHalPwmBuzzerConfig.period = moduleHalPwmBuzzerConfig.frequency / PKLCS1212E4001_LLD_FREQUENCY_SPEC; \
+  moduleHalPwmBuzzerConfig.period = moduleHalPwmBuzzerConfig.frequency / PKxxxExxx_LLD_FREQUENCY_SPEC; \
   pwmStart(&MODULE_HAL_PWM_BUZZER, &moduleHalPwmBuzzerConfig);                \
 }
 #if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) || defined(__DOXYGEN__)
@@ -586,28 +586,28 @@ extern ROMCONST char* moduleShellPrompt;
  * @{
  */
 /*===========================================================================*/
-#include <alld_at24c01bn-sh-b.h>
-#include <alld_bq24103a.h>
+#include <alld_AT24C01B.h>
+#include <alld_bq241xx.h>
 #include <alld_bq27500.h>
-#include <alld_ina219.h>
-#include <alld_led.h>
-#include <alld_pklcs1212e4001.h>
-#include <alld_tps62113.h>
+#include <alld_INA219.h>
+#include <alld_LED.h>
+#include <alld_PKxxxExxx.h>
+#include <alld_TPS6211x.h>
 
 /**
  * @brief   EEPROM driver.
  */
-extern AT24C01BNDriver moduleLldEeprom;
+extern AT24C01BDriver moduleLldEeprom;
 
 /**
  * @brief   Battery charger (front battery) driver.
  */
-extern BQ24103ADriver moduleLldBatteryChargerFront;
+extern BQ241xxDriver moduleLldBatteryChargerFront;
 
 /**
  * @brief   Battery charger (rear battery) driver.
  */
-extern BQ24103ADriver moduleLldBatteryChargerRear;
+extern BQ241xxDriver moduleLldBatteryChargerRear;
 
 /**
  * @brief   Fuel gauge (front battery) driver.
@@ -651,15 +651,15 @@ extern LEDDriver moduleLldStatusLed;
 
 /**
  * @brief   Step down converter driver.
- * @note    Although there multiple TPS62113, those are completely identical from driver few (share the same signals).
+ * @note    Although there multiple TPS6211x, those are completely identical from driver few (share the same signals).
  */
-extern TPS62113Driver moduleLldStepDownConverter;
+extern TPS6211xDriver moduleLldStepDownConverter;
 
 #if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) || defined(__DOXYGEN__)
 
-#include <alld_mpr121.h>
-#include <alld_pca9544a.h>
-#include <alld_vcnl4020.h>
+#include <alld_MPR121.h>
+#include <alld_PCA9544A.h>
+#include <alld_VCNL4020.h>
 
 /**
  * @brief   Touch sensor driver.
@@ -690,8 +690,8 @@ extern VCNL4020Driver moduleLldProximity2;
 
 #if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || defined(__DOXYGEN__)
 
-#include <alld_pcal6524.h>
-#include <alld_at42qt1050.h>
+#include <alld_PCAL6524.h>
+#include <alld_AT42QT1050.h>
 
 /**
  * @brief   GPIO extender (I2C #1) driver.
@@ -712,8 +712,8 @@ extern AT42QT1050Driver moduleLldTouch;
 
 #if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) || defined(__DOXYGEN__)
 
-#include <alld_pcal6524.h>
-#include <alld_at42qt1050.h>
+#include <alld_PCAL6524.h>
+#include <alld_AT42QT1050.h>
 
 /**
  * @brief   GPIO extender (I2C #1) driver.
@@ -742,15 +742,15 @@ extern AT42QT1050Driver moduleLldTouch;
 /*===========================================================================*/
 #if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
 #include <ut_lld_adc.h>
-#include <ut_alld_at24c01bn-sh-b.h>
-#include <ut_alld_bq24103a.h>
-#include <ut_alld_bq27500.h>
-#include <ut_alld_bq27500_bq24103a.h>
-#include <ut_alld_ina219.h>
-#include <ut_alld_led.h>
-#include <ut_alld_pklcs1212e4001.h>
-#include <ut_alld_tps62113.h>
-#include <ut_alld_tps62113_ina219.h>
+#include <ut_alld_AT24C01B_v1.h>
+#include <ut_alld_bq241xx_v1.h>
+#include <ut_alld_bq27500_v1.h>
+#include <ut_alld_bq27500_v1_bq241xx_v1.h>
+#include <ut_alld_INA219_v1.h>
+#include <ut_alld_LED_v1.h>
+#include <ut_alld_PKxxxExxx_v1.h>
+#include <ut_alld_TPS6211x_v1.h>
+#include <ut_alld_TPS6211x_v1_INA219_v1.h>
 
 /**
  * @brief   ADC unit test object.
@@ -760,7 +760,7 @@ extern aos_unittest_t moduleUtAdcVsys;
 /**
  * @brief   AT24C01BN-SH-B (EEPROM) unit test object.
  */
-extern aos_unittest_t moduleUtAlldAt24c01bn;
+extern aos_unittest_t moduleUtAlldAt24c01b;
 
 /**
  * @brief   BQ24103A (battery charger) unit test object.
@@ -804,9 +804,9 @@ extern aos_unittest_t moduleUtAlldTps62113Ina219;
 
 #if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) || defined(__DOXYGEN__)
 
-#include <ut_alld_mpr121.h>
-#include <ut_alld_pca9544a.h>
-#include <ut_alld_vcnl4020.h>
+#include <ut_alld_MPR121_v1.h>
+#include <ut_alld_PCA9544A_v1.h>
+#include <ut_alld_VCNL4020_v1.h>
 
 /**
  * @brief   MPR121 (touch sensor) unit test object.
@@ -827,8 +827,8 @@ extern aos_unittest_t moduleUtAlldVcnl4020;
 
 #if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || defined(__DOXYGEN__)
 
-#include <ut_alld_pcal6524.h>
-#include <ut_alld_at42qt1050.h>
+#include <ut_alld_PCAL6524_v1.h>
+#include <ut_alld_AT42QT1050_v1.h>
 
 /**
  * @brief   PCAL6524 (GPIO extender) unit test object.
@@ -844,8 +844,8 @@ extern aos_unittest_t moduleUtAlldAt42qt1050;
 
 #if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) || defined(__DOXYGEN__)
 
-#include <ut_alld_pcal6524.h>
-#include <ut_alld_at42qt1050.h>
+#include <ut_alld_PCAL6524_v1.h>
+#include <ut_alld_AT42QT1050_v1.h>
 
 /**
  * @brief   PCAL6524 (GPIO extender) unit test object.
diff --git a/periphery-lld/AMiRo-LLD b/periphery-lld/AMiRo-LLD
index a627f4d..c3c5444 160000
--- a/periphery-lld/AMiRo-LLD
+++ b/periphery-lld/AMiRo-LLD
@@ -1 +1 @@
-Subproject commit a627f4ddb13ff202f542b88cbce359299e8f6783
+Subproject commit c3c5444e8fe1240ac6f4d7e4922d2525f4dabc39
diff --git a/unittests/lld/inc/ut_lld_adc.h b/unittests/lld/inc/ut_lld_adc.h
index 9225de8..679f083 100644
--- a/unittests/lld/inc/ut_lld_adc.h
+++ b/unittests/lld/inc/ut_lld_adc.h
@@ -19,6 +19,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #ifndef AMIROOS_UT_LLD_ADC_H
 #define AMIROOS_UT_LLD_ADC_H
 
+#include <amiroos.h>
+
 #if ((AMIROOS_CFG_TESTS_ENABLE == true) && (HAL_USE_ADC == TRUE))|| defined(__DOXYGEN__)
 
 /******************************************************************************/
diff --git a/unittests/lld/src/ut_lld_adc.c b/unittests/lld/src/ut_lld_adc.c
index 68c20f9..1b8134b 100644
--- a/unittests/lld/src/ut_lld_adc.c
+++ b/unittests/lld/src/ut_lld_adc.c
@@ -17,10 +17,11 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include <amiroos.h>
-#include <ut_lld_adc.h>
 
 #if ((AMIROOS_CFG_TESTS_ENABLE == true) && (HAL_USE_ADC == TRUE))|| defined(__DOXYGEN__)
 
+#include <ut_lld_adc.h>
+
 /******************************************************************************/
 /* LOCAL DEFINITIONS                                                          */
 /******************************************************************************/
diff --git a/unittests/periphery-lld/inc/ut_alld_A3906_v1.h b/unittests/periphery-lld/inc/ut_alld_A3906_v1.h
new file mode 100644
index 0000000..009c895
--- /dev/null
+++ b/unittests/periphery-lld/inc/ut_alld_A3906_v1.h
@@ -0,0 +1,151 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef AMIROOS_UT_ALLD_A3906_V1_H
+#define AMIROOS_UT_ALLD_A3906_V1_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_A3906) && (AMIROLLD_CFG_A3906 == 1)) || defined(__DOXYGEN__)
+
+#include <alld_A3906.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the unit test.
+ */
+typedef struct {
+  /**
+   * @brief   Pointer to the driver to use.
+   */
+  A3906Driver* driver;
+
+  /**
+   * @brief   PWM driver information.
+   */
+  struct {
+    /**
+     * @brief   The PWM driver to use.
+     */
+    apalPWMDriver_t* driver;
+
+    /**
+     * @brief   PWM channel information.
+     */
+    struct {
+      /**
+     * @brief   PWM channel for the left wheel forward direction.
+     */
+      apalPWMchannel_t left_forward;
+
+      /**
+     * @brief   PWM channel for the left wheel backward direction.
+     */
+      apalPWMchannel_t left_backward;
+
+      /**
+     * @brief   PWM channel for the right wheel forward direction.
+     */
+      apalPWMchannel_t right_forward;
+
+      /**
+     * @brief   PWM channel for the right wheel backward direction.
+     */
+      apalPWMchannel_t right_backward;
+    } channel;
+  } pwm;
+
+  /**
+   * @brief   QEI driver information
+   */
+  struct {
+    /**
+     * @brief   QEI driver for the left wheel.
+     */
+    apalQEIDriver_t* left;
+
+    /**
+     * @brief   QEI driver for the right wheel.
+     */
+    apalQEIDriver_t* right;
+
+    /**
+     * @brief   QEI increments per wheel revolution.
+     */
+    apalQEICount_t increments_per_revolution;
+  } qei;
+
+  /**
+   * @brief   Wheel diameter information.
+   */
+  struct {
+    /**
+     * @brief   Left wheel diameter in m.
+     */
+    float left;
+
+    /**
+     * @brief   Right wheel diameter in m.
+     */
+    float right;
+  } wheel_diameter;
+
+  /**
+   * @brief   Timeout value (in us).
+   */
+  apalTime_t timeout;
+} ut_a3906data_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  aos_utresult_t utAlldA3906Func(BaseSequentialStream* stream, aos_unittest_t* ut);
+#ifdef __cplusplus
+}
+#endif
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_A3906) && (AMIROLLD_CFG_A3906 == 1) */
+
+#endif /* AMIROOS_UT_ALLD_A3906_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_AT24C01B_v1.h b/unittests/periphery-lld/inc/ut_alld_AT24C01B_v1.h
new file mode 100644
index 0000000..d9020af
--- /dev/null
+++ b/unittests/periphery-lld/inc/ut_alld_AT24C01B_v1.h
@@ -0,0 +1,81 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef AMIROOS_UT_ALLD_AT24C01B_V1_H
+#define AMIROOS_UT_ALLD_AT24C01B_V1_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_AT24C01B) && (AMIROLLD_CFG_AT24C01B == 1)) || defined(__DOXYGEN__)
+
+#include <alld_AT24C01B.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the unit test.
+ */
+typedef struct {
+  /**
+   * @brief   Pointer to the driver to use.
+   */
+  AT24C01BDriver* driver;
+
+  /**
+   * @brief   Timeout value (in us).
+   */
+  apalTime_t timeout;
+} ut_at24c01bdata_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  aos_utresult_t utAlldAt24c01bFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_AT24C01B) && (AMIROLLD_CFG_AT24C01B == 1) */
+
+#endif /* AMIROOS_UT_ALLD_AT24C01B_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_AT42QT1050_v1.h b/unittests/periphery-lld/inc/ut_alld_AT42QT1050_v1.h
new file mode 100644
index 0000000..cb27918
--- /dev/null
+++ b/unittests/periphery-lld/inc/ut_alld_AT42QT1050_v1.h
@@ -0,0 +1,91 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef AMIROOS_UT_ALLD_AT42QT1050_V1_H
+#define AMIROOS_UT_ALLD_AT42QT1050_V1_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_AT42QT1050) && (AMIROLLD_CFG_AT42QT1050 == 1)) || defined(__DOXYGEN__)
+
+#include <alld_AT42QT1050.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the unit test.
+ */
+typedef struct {
+  /**
+   * @brief   Pointer to the AT42QT1050 driver to use.
+   */
+  AT42QT1050Driver* at42qt1050d;
+
+  /**
+   * @brief   Timeout value (in µs).
+   */
+  apalTime_t timeout;
+
+  /**
+   * @brief   Event source to listen to.
+   */
+  event_source_t* evtsource;
+
+  /**
+   * @brief   Event flags to watch.
+   */
+  eventflags_t evtflags;
+} ut_at42qt1050data_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  aos_utresult_t utAlldAt42qt1050Func(BaseSequentialStream* stream, aos_unittest_t* ut);
+#ifdef __cplusplus
+}
+#endif
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_AT42QT1050) && (AMIROLLD_CFG_AT42QT1050 == 1) */
+
+#endif /* AMIROOS_UT_ALLD_AT42QT1050_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_DW1000_v0.h b/unittests/periphery-lld/inc/ut_alld_DW1000_v0.h
new file mode 100755
index 0000000..f55ecc2
--- /dev/null
+++ b/unittests/periphery-lld/inc/ut_alld_DW1000_v0.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef AMIROOS_UT_ALLD_DW1000_V0_H
+#define AMIROOS_UT_ALLD_DW1000_V0_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_DW1000) && (AMIROLLD_CFG_DW1000 == 0)) || defined(__DOXYGEN__)
+
+#include <alld_DW1000.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  aos_utresult_t utAlldDw1000Func(BaseSequentialStream* stream, aos_unittest_t* ut);
+#ifdef __cplusplus
+}
+#endif
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_DW1000) && (AMIROLLD_CFG_DW1000 == 0) */
+
+#endif /* AMIROOS_UT_ALLD_DW1000_V0_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_HMC5883L_v1.h b/unittests/periphery-lld/inc/ut_alld_HMC5883L_v1.h
new file mode 100644
index 0000000..8661f76
--- /dev/null
+++ b/unittests/periphery-lld/inc/ut_alld_HMC5883L_v1.h
@@ -0,0 +1,91 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef AMIROOS_UT_ALLD_HMC5883L_V1_H
+#define AMIROOS_UT_ALLD_HMC5883L_V1_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_HMC5883L) && (AMIROLLD_CFG_HMC5883L == 1)) || defined(__DOXYGEN__)
+
+#include <alld_HMC5883L.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Constum data structure for this unit test.
+ */
+typedef struct {
+  /**
+   * @brief   HMC5338L driver to use.
+   */
+  HMC5883LDriver* driver;
+
+  /**
+   * @brief   Event source for certain tests.
+   */
+  event_source_t *drdyEvtSrc;
+
+  /**
+   * @brief   Event flags to watch.
+   */
+  eventflags_t evtflags;
+
+  /**
+   * @brief   Timeout value in microseconds.
+   */
+  apalTime_t timeout;
+} ut_hmc5883ldata_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  aos_utresult_t utAlldHmc5883lFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
+#ifdef __cplusplus
+}
+#endif
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_HMC5883L) && (AMIROLLD_CFG_HMC5883L == 1) */
+
+#endif /* AMIROOS_UT_ALLD_HMC5883L_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_INA219_v1.h b/unittests/periphery-lld/inc/ut_alld_INA219_v1.h
new file mode 100644
index 0000000..9151ca2
--- /dev/null
+++ b/unittests/periphery-lld/inc/ut_alld_INA219_v1.h
@@ -0,0 +1,91 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef AMIROOS_UT_ALLD_INA219_V1_H
+#define AMIROOS_UT_ALLD_INA219_V1_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_INA219) && (AMIROLLD_CFG_INA219 == 1)) || defined(__DOXYGEN__)
+
+#include <alld_INA219.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the unit test.
+ */
+typedef struct {
+  /**
+   * @brief   INA219 driver to use.
+   */
+  INA219Driver *inad;
+
+  /**
+   * @brief   Expected voltage to be measured.
+   */
+  float v_expected;
+
+  /**
+   * @brief   Tolerance (relative) of measurement.
+   */
+  float tolerance;
+
+  /**
+   * @brief   Timeout delay for certain tests.
+   */
+  apalTime_t timeout;
+} ut_ina219data_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  aos_utresult_t utAlldIna219Func(BaseSequentialStream* stream, aos_unittest_t* ut);
+#ifdef __cplusplus
+}
+#endif
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_INA219) && (AMIROLLD_CFG_INA219 == 1) */
+
+#endif /* AMIROOS_UT_ALLD_INA219_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_L3G4200D_v1.h b/unittests/periphery-lld/inc/ut_alld_L3G4200D_v1.h
new file mode 100644
index 0000000..245d5b9
--- /dev/null
+++ b/unittests/periphery-lld/inc/ut_alld_L3G4200D_v1.h
@@ -0,0 +1,91 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef AMIROOS_UT_ALLD_L3G4200D_V1_H
+#define AMIROOS_UT_ALLD_L3G4200D_V1_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_L3G4200D) && (AMIROLLD_CFG_L3G4200D == 1)) || defined(__DOXYGEN__)
+
+#include <alld_L3G4200D.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the unit test.
+ */
+typedef struct {
+  /**
+   * @brief   L3G4200D driver to use.
+   */
+  L3G4200DDriver *l3gd;
+
+  /**
+   * @brief   SPI configuratoin.
+   */
+  SPIConfig *spiconf;
+
+  /**
+   * @brief   Event source for certain tests.
+   */
+  event_source_t *src;
+
+  /**
+   * @brief   Event flags to watch.
+   */
+  eventflags_t evtflags;
+} ut_l3g4200ddata_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  aos_utresult_t utAlldL3g4200dFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
+#ifdef __cplusplus
+}
+#endif
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_L3G4200D) && (AMIROLLD_CFG_L3G4200D == 1) */
+
+#endif /* AMIROOS_UT_ALLD_L3G4200D_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_LED_v1.h b/unittests/periphery-lld/inc/ut_alld_LED_v1.h
new file mode 100644
index 0000000..310e510
--- /dev/null
+++ b/unittests/periphery-lld/inc/ut_alld_LED_v1.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef AMIROOS_UT_ALLD_LED_V1_H
+#define AMIROOS_UT_ALLD_LED_V1_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_LED) && (AMIROLLD_CFG_LED == 1)) || defined(__DOXYGEN__)
+
+#include <alld_LED.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  aos_utresult_t utAlldLedFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
+#ifdef __cplusplus
+}
+#endif
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_LED) && (AMIROLLD_CFG_LED == 1) */
+
+#endif /* AMIROOS_UT_ALLD_LED_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_LIS331DLH_v1.h b/unittests/periphery-lld/inc/ut_alld_LIS331DLH_v1.h
new file mode 100644
index 0000000..f14a3d4
--- /dev/null
+++ b/unittests/periphery-lld/inc/ut_alld_LIS331DLH_v1.h
@@ -0,0 +1,91 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef AMIROOS_UT_ALLD_LIS331DLH_V1_H
+#define AMIROOS_UT_ALLD_LIS331DLH_V1_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_LIS331DLH) && (AMIROLLD_CFG_LIS331DLH == 1)) || defined(__DOXYGEN__)
+
+#include <alld_LIS331DLH.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the unit test.
+ */
+typedef struct {
+  /**
+   * @brief   Accelerometer driver to use.
+   */
+  LIS331DLHDriver *lisd;
+
+  /**
+   * @brief   SPI configuratoin.
+   */
+  SPIConfig *spiconf;
+
+  /**
+   * @brief   Event source for certain tests.
+   */
+  event_source_t *src;
+
+  /**
+   * @brief   Event flags to watch.
+   */
+  eventflags_t evtflags;
+} ut_lis331dlhdata_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  aos_utresult_t utAlldLis331dlhFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
+#ifdef __cplusplus
+}
+#endif
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_LIS331DLH) && (AMIROLLD_CFG_LIS331DLH == 1) */
+
+#endif /* AMIROOS_UT_ALLD_LIS331DLH_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_LTC4412_v1.h b/unittests/periphery-lld/inc/ut_alld_LTC4412_v1.h
new file mode 100644
index 0000000..5b4dbf1
--- /dev/null
+++ b/unittests/periphery-lld/inc/ut_alld_LTC4412_v1.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef AMIROOS_UT_ALLD_LTC4412_V1_H
+#define AMIROOS_UT_ALLD_LTC4412_V1_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_LTC4412) && (AMIROLLD_CFG_LTC4412 == 1)) || defined(__DOXYGEN__)
+
+#include <alld_LTC4412.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  aos_utresult_t utAlldLtc4412Func(BaseSequentialStream* stream, aos_unittest_t* ut);
+#ifdef __cplusplus
+}
+#endif
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_LTC4412) && (AMIROLLD_CFG_LTC4412 == 1) */
+
+#endif /* AMIROOS_UT_ALLD_LTC4412_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_MPR121_v1.h b/unittests/periphery-lld/inc/ut_alld_MPR121_v1.h
new file mode 100644
index 0000000..098b3d0
--- /dev/null
+++ b/unittests/periphery-lld/inc/ut_alld_MPR121_v1.h
@@ -0,0 +1,91 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef AMIROOS_UT_ALLD_MPR121_V1_H
+#define AMIROOS_UT_ALLD_MPR121_V1_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_MPR121) && (AMIROLLD_CFG_MPR121 == 1)) || defined(__DOXYGEN__)
+
+#include <alld_MPR121.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the unit test.
+ */
+typedef struct {
+  /**
+   * @brief   Pointer to the MPR121 driver to use.
+   */
+  MPR121Driver* mprd;
+
+  /**
+   * @brief   Timeout value (in us).
+   */
+  apalTime_t timeout;
+
+  /**
+   * @brief   Event source to listen to.
+   */
+  event_source_t* evtsource;
+
+  /**
+   * @brief   Event flags to watch.
+   */
+  eventflags_t evtflags;
+} ut_mpr121data_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  aos_utresult_t utAlldMpr121Func(BaseSequentialStream* stream, aos_unittest_t* ut);
+#ifdef __cplusplus
+}
+#endif
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_MPR121) && (AMIROLLD_CFG_MPR121 == 1) */
+
+#endif /* AMIROOS_UT_ALLD_MPR121_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_MPU6050_v1.h b/unittests/periphery-lld/inc/ut_alld_MPU6050_v1.h
new file mode 100644
index 0000000..926f6f2
--- /dev/null
+++ b/unittests/periphery-lld/inc/ut_alld_MPU6050_v1.h
@@ -0,0 +1,81 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2018  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef AMIROOS_UT_ALLD_MPU6050_V1_H
+#define AMIROOS_UT_ALLD_MPU6050_V1_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_MPU6050) && (AMIROLLD_CFG_MPU6050 == 1)) || defined(__DOXYGEN__)
+
+#include <alld_MPU6050.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the unit test.
+ */
+typedef struct {
+  /**
+   * @brief   MPU6050 driver to use.
+   */
+  MPU6050Driver *mpu;
+
+  /**
+   * @brief   Timeout delay for certain tests.
+   */
+  apalTime_t timeout;
+} ut_mpu6050data_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  aos_utresult_t utAlldMpu6050Func(BaseSequentialStream* stream, aos_unittest_t* ut);
+#ifdef __cplusplus
+}
+#endif
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_MPU6050) && (AMIROLLD_CFG_MPU6050 == 1) */
+
+#endif /* AMIROOS_UT_ALLD_MPU6050_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_PCA9544A_v1.h b/unittests/periphery-lld/inc/ut_alld_PCA9544A_v1.h
new file mode 100644
index 0000000..0a7a750
--- /dev/null
+++ b/unittests/periphery-lld/inc/ut_alld_PCA9544A_v1.h
@@ -0,0 +1,81 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef AMIROOS_UT_ALLD_PCA9544A_V1_H
+#define AMIROOS_UT_ALLD_PCA9544A_V1_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_PCA9544A) && (AMIROLLD_CFG_PCA9544A == 1)) || defined(__DOXYGEN__)
+
+#include <alld_PCA9544A.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the unit test.
+ */
+typedef struct {
+  /**
+   * @brief   Pointer to the driver to use.
+   */
+  PCA9544ADriver *driver;
+
+  /**
+   * @brief   Timeout for bus communication.
+   */
+  apalTime_t timeout;
+} ut_pca9544adata_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  aos_utresult_t utAlldPca9544aFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
+#ifdef __cplusplus
+}
+#endif
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_PCA9544A) && (AMIROLLD_CFG_PCA9544A == 1) */
+
+#endif /* AMIROOS_UT_ALLD_PCA9544A_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_PCAL6524_v1.h b/unittests/periphery-lld/inc/ut_alld_PCAL6524_v1.h
new file mode 100644
index 0000000..7cc7151
--- /dev/null
+++ b/unittests/periphery-lld/inc/ut_alld_PCAL6524_v1.h
@@ -0,0 +1,81 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef AMIROOS_UT_ALLD_PCAL6524_V1_H
+#define AMIROOS_UT_ALLD_PCAL6524_V1_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_PCAL6524) && (AMIROLLD_CFG_PCAL6524 == 1)) || defined(__DOXYGEN__)
+
+#include <alld_PCAL6524.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the unit test.
+ */
+typedef struct {
+  /**
+   * @brief   pointer to the PCAL6524 driver to use.
+   */
+  PCAL6524Driver* pcal6524d;
+
+  /**
+   * @brief   Timeout value (in µs).
+   */
+  apalTime_t timeout;
+} ut_pcal6524data_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  aos_utresult_t utAlldPcal6524Func(BaseSequentialStream* stream, aos_unittest_t *ut);
+#ifdef __cplusplus
+}
+#endif
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_PCAL6524) && (AMIROLLD_CFG_PCAL6524 == 1) */
+
+#endif /* AMIROOS_UT_ALLD_PCAL6524_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_PKxxxExxx_v1.h b/unittests/periphery-lld/inc/ut_alld_PKxxxExxx_v1.h
new file mode 100644
index 0000000..60136b1
--- /dev/null
+++ b/unittests/periphery-lld/inc/ut_alld_PKxxxExxx_v1.h
@@ -0,0 +1,81 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef AMIROOS_UT_ALLD_PKXXXEXXX_V1_H
+#define AMIROOS_UT_ALLD_PKXXXEXXX_V1_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_PKxxxExxx) && (AMIROLLD_CFG_PKxxxExxx == 1)) || defined(__DOXYGEN__)
+
+#include <alld_PKxxxExxx.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the unit test.
+ */
+typedef struct {
+  /**
+   * @brief   Pointer to the PWM driver.
+   */
+  apalPWMDriver_t* driver;
+
+  /**
+   * @brief   PWM channel to use.
+   */
+  apalPWMchannel_t channel;
+} ut_pkxxxexxx_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  aos_utresult_t utAlldPkxxxexxxFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
+#ifdef __cplusplus
+}
+#endif
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_PKxxxExxx) && (AMIROLLD_CFG_PKxxxExxx == 1) */
+
+#endif /* AMIROOS_UT_ALLD_PKXXXEXXX_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_TLC5947_v1.h b/unittests/periphery-lld/inc/ut_alld_TLC5947_v1.h
new file mode 100644
index 0000000..2199a95
--- /dev/null
+++ b/unittests/periphery-lld/inc/ut_alld_TLC5947_v1.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef AMIROOS_UT_ALLD_TLC5947_V1_H
+#define AMIROOS_UT_ALLD_TLC5947_V1_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TLC5947) && (AMIROLLD_CFG_TLC5947 == 1)) || defined(__DOXYGEN__)
+
+#include <alld_TLC5947.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  aos_utresult_t utAlldTlc5947Func(BaseSequentialStream* stream, aos_unittest_t* ut);
+#ifdef __cplusplus
+}
+#endif
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TLC5947) && (AMIROLLD_CFG_TLC5947 == 1) */
+
+#endif /* AMIROOS_UT_ALLD_TLC5947_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_TPS20xxB_v1.h b/unittests/periphery-lld/inc/ut_alld_TPS20xxB_v1.h
new file mode 100644
index 0000000..7c264bf
--- /dev/null
+++ b/unittests/periphery-lld/inc/ut_alld_TPS20xxB_v1.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef AMIROOS_UT_ALLD_TPS20XXB_V1_H
+#define AMIROOS_UT_ALLD_TPS20XXB_V1_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TPS20xxB) && (AMIROLLD_CFG_TPS20xxB == 1)) || defined(__DOXYGEN__)
+
+#include <alld_TPS20xxB.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  aos_utresult_t utAlldTps20xxbFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
+#ifdef __cplusplus
+}
+#endif
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TPS20xxB) && (AMIROLLD_CFG_TPS20xxB == 1) */
+
+#endif /* AMIROOS_UT_ALLD_TPS20XXB_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_TPS6211x_v1.h b/unittests/periphery-lld/inc/ut_alld_TPS6211x_v1.h
new file mode 100644
index 0000000..a158a98
--- /dev/null
+++ b/unittests/periphery-lld/inc/ut_alld_TPS6211x_v1.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef AMIROOS_UT_ALLD_TPS6211X_V1_H
+#define AMIROOS_UT_ALLD_TPS6211X_V1_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TPS6211x) && (AMIROLLD_CFG_TPS6211x == 1)) || defined(__DOXYGEN__)
+
+#include <alld_TPS6211x.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  aos_utresult_t utAlldTps6211xFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
+#ifdef __cplusplus
+}
+#endif
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TPS6211x) && (AMIROLLD_CFG_TPS6211x == 1) */
+
+#endif /* AMIROOS_UT_ALLD_TPS6211X_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_TPS6211x_v1_INA219_v1.h b/unittests/periphery-lld/inc/ut_alld_TPS6211x_v1_INA219_v1.h
new file mode 100644
index 0000000..5877c9e
--- /dev/null
+++ b/unittests/periphery-lld/inc/ut_alld_TPS6211x_v1_INA219_v1.h
@@ -0,0 +1,87 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef AMIROOS_UT_ALLD_TPS6211X_V1_INA219_V1_H
+#define AMIROOS_UT_ALLD_TPS6211X_V1_INA219_V1_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TPS6211x) && (AMIROLLD_CFG_TPS6211x == 1) && defined(AMIROLLD_CFG_INA219) && (AMIROLLD_CFG_INA219 == 1)) || defined(__DOXYGEN__)
+
+#include <alld_TPS6211x.h>
+#include <alld_INA219.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the unit test.
+ */
+typedef struct {
+  /**
+   * @brief   TPS62113 driver to use.
+   */
+  TPS6211xDriver* tps6211x;
+
+  /**
+   * @brief   INA219 driver to use.
+   */
+  INA219Driver* ina219;
+
+  /**
+   * @brief   Timeout value (in us).
+   */
+  apalTime_t timeout;
+} ut_tps6211xina219data_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  aos_utresult_t utAlldTps6211xIna219Func(BaseSequentialStream* stream, aos_unittest_t* ut);
+#ifdef __cplusplus
+}
+#endif
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TPS6211x) && (AMIROLLD_CFG_TPS6211x == 1) && defined(AMIROLLD_CFG_INA219) && (AMIROLLD_CFG_INA219 == 1) */
+
+#endif /* AMIROOS_UT_ALLD_TPS6211X_V1_INA219_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_VCNL4020_v1.h b/unittests/periphery-lld/inc/ut_alld_VCNL4020_v1.h
new file mode 100644
index 0000000..8140b58
--- /dev/null
+++ b/unittests/periphery-lld/inc/ut_alld_VCNL4020_v1.h
@@ -0,0 +1,91 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef AMIROOS_UT_ALLD_VCNL4020_V1_H
+#define AMIROOS_UT_ALLD_VCNL4020_V1_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_VCNL4020) && (AMIROLLD_CFG_VCNL4020 == 1)) || defined(__DOXYGEN__)
+
+#include <alld_VCNL4020.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the unit test.
+ */
+typedef struct {
+  /**
+   * @brief   VCNL4020 driver to use.
+   */
+  VCNL4020Driver *vcnld;
+
+  /**
+   * @brief   Timeout for certain tests.
+   */
+  apalTime_t timeout;
+
+  /**
+   * @brief   Event source to listen to.
+   */
+  event_source_t* evtsource;
+
+  /**
+   * @brief   Event flags to watch.
+   */
+  eventflags_t evtflags;
+} ut_vcnl4020data_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  aos_utresult_t utAlldVcnl4020Func(BaseSequentialStream* stream, aos_unittest_t* ut);
+#ifdef __cplusplus
+}
+#endif
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_VCNL4020) && (AMIROLLD_CFG_VCNL4020 == 1) */
+
+#endif /* AMIROOS_UT_ALLD_VCNL4020_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_a3906.h b/unittests/periphery-lld/inc/ut_alld_a3906.h
deleted file mode 100644
index d941012..0000000
--- a/unittests/periphery-lld/inc/ut_alld_a3906.h
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef AMIROOS_UT_ALLD_A3906_H
-#define AMIROOS_UT_ALLD_A3906_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_A3906)) || defined(__DOXYGEN__)
-
-#include <alld_a3906.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   Pointer to the driver to use.
-   */
-  A3906Driver* driver;
-
-  /**
-   * @brief   PWM driver information.
-   */
-  struct {
-    /**
-     * @brief   The PWM driver to use.
-     */
-    apalPWMDriver_t* driver;
-
-    /**
-     * @brief   PWM channel information.
-     */
-    struct {
-      /**
-     * @brief   PWM channel for the left wheel forward direction.
-     */
-      apalPWMchannel_t left_forward;
-
-      /**
-     * @brief   PWM channel for the left wheel backward direction.
-     */
-      apalPWMchannel_t left_backward;
-
-      /**
-     * @brief   PWM channel for the right wheel forward direction.
-     */
-      apalPWMchannel_t right_forward;
-
-      /**
-     * @brief   PWM channel for the right wheel backward direction.
-     */
-      apalPWMchannel_t right_backward;
-    } channel;
-  } pwm;
-
-  /**
-   * @brief   QEI driver information
-   */
-  struct {
-    /**
-     * @brief   QEI driver for the left wheel.
-     */
-    apalQEIDriver_t* left;
-
-    /**
-     * @brief   QEI driver for the right wheel.
-     */
-    apalQEIDriver_t* right;
-
-    /**
-     * @brief   QEI increments per wheel revolution.
-     */
-    apalQEICount_t increments_per_revolution;
-  } qei;
-
-  /**
-   * @brief   Wheel diameter information.
-   */
-  struct {
-    /**
-     * @brief   Left wheel diameter in m.
-     */
-    float left;
-
-    /**
-     * @brief   Right wheel diameter in m.
-     */
-    float right;
-  } wheel_diameter;
-
-  /**
-   * @brief   Timeout value (in us).
-   */
-  apalTime_t timeout;
-} ut_a3906data_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-  aos_utresult_t utAlldA3906Func(BaseSequentialStream* stream, aos_unittest_t* ut);
-#ifdef __cplusplus
-}
-#endif
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_A3906) */
-
-#endif /* AMIROOS_UT_ALLD_A3906_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_at24c01bn-sh-b.h b/unittests/periphery-lld/inc/ut_alld_at24c01bn-sh-b.h
deleted file mode 100644
index 3a2dc90..0000000
--- a/unittests/periphery-lld/inc/ut_alld_at24c01bn-sh-b.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef AMIROOS_UT_ALLD_AT24C01BN_H
-#define AMIROOS_UT_ALLD_AT24C01BN_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_AT24C01BN)) || defined(__DOXYGEN__)
-
-#include <alld_at24c01bn-sh-b.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   Pointer to the driver to use.
-   */
-  AT24C01BNDriver* driver;
-
-  /**
-   * @brief   Timeout value (in us).
-   */
-  apalTime_t timeout;
-} ut_at24c01bndata_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-  aos_utresult_t utAlldAt24c01bnFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_AT24C01BN) */
-
-#endif /* AMIROOS_UT_ALLD_AT24C01BN_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_at42qt1050.h b/unittests/periphery-lld/inc/ut_alld_at42qt1050.h
deleted file mode 100644
index 83b840b..0000000
--- a/unittests/periphery-lld/inc/ut_alld_at42qt1050.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef AMIROOS_UT_ALLD_AT42QT1050_H
-#define AMIROOS_UT_ALLD_AT42QT1050_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_AT42QT1050)) || defined(__DOXYGEN__)
-
-#include <alld_at42qt1050.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   Pointer to the AT42QT1050 driver to use.
-   */
-  AT42QT1050Driver* at42qt1050d;
-
-  /**
-   * @brief   Timeout value (in µs).
-   */
-  apalTime_t timeout;
-
-  /**
-   * @brief   Event source to listen to.
-   */
-  event_source_t* evtsource;
-
-  /**
-   * @brief   Event flags to watch.
-   */
-  eventflags_t evtflags;
-} ut_at42qt1050data_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-  aos_utresult_t utAlldAt42qt1050Func(BaseSequentialStream* stream, aos_unittest_t* ut);
-#ifdef __cplusplus
-}
-#endif
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_AT42QT1050) */
-
-#endif /* AMIROOS_UT_ALLD_AT42QT1050_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_bq24103a.h b/unittests/periphery-lld/inc/ut_alld_bq24103a.h
deleted file mode 100644
index 4088b3c..0000000
--- a/unittests/periphery-lld/inc/ut_alld_bq24103a.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef AMIROOS_UT_ALLD_BQ24103A_H
-#define AMIROOS_UT_ALLD_BQ24103A_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_BQ24103A)) || defined(__DOXYGEN__)
-
-#include <alld_bq24103a.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-  aos_utresult_t utAlldBq24103aFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
-#ifdef __cplusplus
-}
-#endif
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_BQ24103A) */
-
-#endif /* AMIROOS_UT_ALLD_BQ24103A_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_bq241xx_v1.h b/unittests/periphery-lld/inc/ut_alld_bq241xx_v1.h
new file mode 100644
index 0000000..244ffca
--- /dev/null
+++ b/unittests/periphery-lld/inc/ut_alld_bq241xx_v1.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef AMIROOS_UT_ALLD_BQ241XX_V1_H
+#define AMIROOS_UT_ALLD_BQ241XX_V1_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_BQ241xx) && (AMIROLLD_CFG_BQ241xx == 1)) || defined(__DOXYGEN__)
+
+#include <alld_bq241xx.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  aos_utresult_t utAlldBq241xxFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
+#ifdef __cplusplus
+}
+#endif
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_BQ241xx) && (AMIROLLD_CFG_BQ241xx == 1) */
+
+#endif /* AMIROOS_UT_ALLD_BQ241XX_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_bq27500.h b/unittests/periphery-lld/inc/ut_alld_bq27500.h
deleted file mode 100644
index 2b0a50f..0000000
--- a/unittests/periphery-lld/inc/ut_alld_bq27500.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef AMIROOS_UT_ALLD_BQ27500_H
-#define AMIROOS_UT_ALLD_BQ27500_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_BQ27500)) || defined(__DOXYGEN__)
-
-#include <alld_bq27500.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   Pointer to the driver to use.
-   */
-  BQ27500Driver *driver;
-
-  /**
-   * @brief   Timeout value (in us);
-   */
-  apalTime_t timeout;
-} ut_bq27500data_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-  aos_utresult_t utAlldBq27500Func(BaseSequentialStream* stream, aos_unittest_t* ut);
-#ifdef __cplusplus
-}
-#endif
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_BQ27500) */
-
-#endif /* AMIROOS_UT_ALLD_BQ27500_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_bq27500_bq24103a.h b/unittests/periphery-lld/inc/ut_alld_bq27500_bq24103a.h
deleted file mode 100644
index a558109..0000000
--- a/unittests/periphery-lld/inc/ut_alld_bq27500_bq24103a.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef AMIROOS_UT_ALLD_BQ27500_BQ24193A_H
-#define AMIROOS_UT_ALLD_BQ27500_BQ24193A_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_BQ27500) && defined(AMIROLLD_CFG_USE_BQ24103A)) || defined(__DOXYGEN__)
-
-#include <alld_bq27500.h>
-#include <alld_bq24103a.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   BQ27500 driver to use.
-   */
-  BQ27500Driver* bq27500;
-
-  /**
-   * @brief   BQ24103A driver to use.
-   */
-  BQ24103ADriver* bq24103a;
-
-  /**
-   * @brief   Timeout value (in us).
-   */
-  apalTime_t timeout;
-} ut_bq27500bq24103adata_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-  aos_utresult_t utAlldBq27500Bq24103aFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
-#ifdef __cplusplus
-}
-#endif
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_BQ27500) && defined(AMIROLLD_CFG_USE_BQ24103A) */
-
-#endif /* AMIROOS_UT_ALLD_BQ27500_BQ24193A_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_bq27500_v1.h b/unittests/periphery-lld/inc/ut_alld_bq27500_v1.h
new file mode 100644
index 0000000..6f974c2
--- /dev/null
+++ b/unittests/periphery-lld/inc/ut_alld_bq27500_v1.h
@@ -0,0 +1,81 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef AMIROOS_UT_ALLD_BQ27500_V1_H
+#define AMIROOS_UT_ALLD_BQ27500_V1_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_BQ27500) && (AMIROLLD_CFG_BQ27500 == 1)) || defined(__DOXYGEN__)
+
+#include <alld_bq27500.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the unit test.
+ */
+typedef struct {
+  /**
+   * @brief   Pointer to the driver to use.
+   */
+  BQ27500Driver *driver;
+
+  /**
+   * @brief   Timeout value (in us);
+   */
+  apalTime_t timeout;
+} ut_bq27500data_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  aos_utresult_t utAlldBq27500Func(BaseSequentialStream* stream, aos_unittest_t* ut);
+#ifdef __cplusplus
+}
+#endif
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_BQ27500) && (AMIROLLD_CFG_BQ27500 == 1) */
+
+#endif /* AMIROOS_UT_ALLD_BQ27500_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_bq27500_v1_bq241xx_v1.h b/unittests/periphery-lld/inc/ut_alld_bq27500_v1_bq241xx_v1.h
new file mode 100644
index 0000000..a4f371a
--- /dev/null
+++ b/unittests/periphery-lld/inc/ut_alld_bq27500_v1_bq241xx_v1.h
@@ -0,0 +1,87 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef AMIROOS_UT_ALLD_BQ27500_V1_BQ241xx_V1_H
+#define AMIROOS_UT_ALLD_BQ27500_V1_BQ241xx_V1_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_BQ27500) && (AMIROLLD_CFG_BQ27500 == 1) && defined(AMIROLLD_CFG_BQ241xx) && (AMIROLLD_CFG_BQ241xx == 1)) || defined(__DOXYGEN__)
+
+#include <alld_bq27500.h>
+#include <alld_bq241xx.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the unit test.
+ */
+typedef struct {
+  /**
+   * @brief   BQ27500 driver to use.
+   */
+  BQ27500Driver* bq27500;
+
+  /**
+   * @brief   BQ24103A driver to use.
+   */
+  BQ241xxDriver* bq241xx;
+
+  /**
+   * @brief   Timeout value (in us).
+   */
+  apalTime_t timeout;
+} ut_bq27500bq241xxdata_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  aos_utresult_t utAlldBq27500Bq241xxFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
+#ifdef __cplusplus
+}
+#endif
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_BQ27500) && (AMIROLLD_CFG_BQ27500 == 1) && defined(AMIROLLD_CFG_BQ24103A) && (AMIROLLD_CFG_BQ24103A == 1) */
+
+#endif /* AMIROOS_UT_ALLD_BQ27500_V1_BQ241xx_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_dw1000.h b/unittests/periphery-lld/inc/ut_alld_dw1000.h
deleted file mode 100755
index d402cd7..0000000
--- a/unittests/periphery-lld/inc/ut_alld_dw1000.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef AMIROOS_UT_DW1000_LLD_H
-#define AMIROOS_UT_DW1000_LLD_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_DW1000)) || defined(__DOXYGEN__)
-
-#include <alld_dw1000.h>
-//#include <deca_instance.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-  aos_utresult_t utAlldDw1000Func(BaseSequentialStream* stream, aos_unittest_t* ut);
-#ifdef __cplusplus
-}
-#endif
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_DW1000) */
-
-#endif /* AMIROOS_UT_DW1000_LLD_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_hmc5883l.h b/unittests/periphery-lld/inc/ut_alld_hmc5883l.h
deleted file mode 100644
index c6e8a52..0000000
--- a/unittests/periphery-lld/inc/ut_alld_hmc5883l.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef AMIROOS_UT_HMC5883L_LLD_H
-#define AMIROOS_UT_HMC5883L_LLD_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_HMC5883L)) || defined(__DOXYGEN__)
-
-#include <alld_hmc5883l.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Constum data structure for this unit test.
- */
-typedef struct {
-  /**
-   * @brief   HMC5338L driver to use.
-   */
-  HMC5883LDriver* driver;
-
-  /**
-   * @brief   Event source for certain tests.
-   */
-  event_source_t *drdyEvtSrc;
-
-  /**
-   * @brief   Event flags to watch.
-   */
-  eventflags_t evtflags;
-
-  /**
-   * @brief   Timeout value in microseconds.
-   */
-  apalTime_t timeout;
-} ut_hmc5883ldata_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-  aos_utresult_t utAlldHmc5883lFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
-#ifdef __cplusplus
-}
-#endif
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_HMC5883L) */
-
-#endif /* AMIROOS_UT_HMC5883L_LLD_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_ina219.h b/unittests/periphery-lld/inc/ut_alld_ina219.h
deleted file mode 100644
index e6b3c4b..0000000
--- a/unittests/periphery-lld/inc/ut_alld_ina219.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef AMIROOS_UT_INA219_LLD_H
-#define AMIROOS_UT_INA219_LLD_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_INA219)) || defined(__DOXYGEN__)
-
-#include <alld_ina219.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   INA219 driver to use.
-   */
-  INA219Driver *inad;
-
-  /**
-   * @brief   Expected voltage to be measured.
-   */
-  float v_expected;
-
-  /**
-   * @brief   Tolerance (relative) of measurement.
-   */
-  float tolerance;
-
-  /**
-   * @brief   Timeout delay for certain tests.
-   */
-  apalTime_t timeout;
-} ut_ina219data_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-  aos_utresult_t utAlldIna219Func(BaseSequentialStream* stream, aos_unittest_t* ut);
-#ifdef __cplusplus
-}
-#endif
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_INA219) */
-
-#endif /* AMIROOS_UT_INA219_LLD_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_l3g4200d.h b/unittests/periphery-lld/inc/ut_alld_l3g4200d.h
deleted file mode 100644
index eae1cba..0000000
--- a/unittests/periphery-lld/inc/ut_alld_l3g4200d.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef AMIROOS_UT_L3G4200D_LLD_H
-#define AMIROOS_UT_L3G4200D_LLD_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_L3G4200D)) || defined(__DOXYGEN__)
-
-#include <alld_l3g4200d.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   L3G4200D driver to use.
-   */
-  L3G4200DDriver *l3gd;
-
-  /**
-   * @brief   SPI configuratoin.
-   */
-  SPIConfig *spiconf;
-
-  /**
-   * @brief   Event source for certain tests.
-   */
-  event_source_t *src;
-
-  /**
-   * @brief   Event flags to watch.
-   */
-  eventflags_t evtflags;
-} ut_l3g4200ddata_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-  aos_utresult_t utAlldL3g4200dFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
-#ifdef __cplusplus
-}
-#endif
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_L3G4200D) */
-
-#endif /* AMIROOS_UT_L3G4200D_LLD_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_led.h b/unittests/periphery-lld/inc/ut_alld_led.h
deleted file mode 100644
index 4940856..0000000
--- a/unittests/periphery-lld/inc/ut_alld_led.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef AMIROOS_UT_ALLD_LED_H
-#define AMIROOS_UT_ALLD_LED_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_LED)) || defined(__DOXYGEN__)
-
-#include <alld_led.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-  aos_utresult_t utAlldLedFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
-#ifdef __cplusplus
-}
-#endif
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_LED) */
-
-#endif /* AMIROOS_UT_ALLD_LED_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_lis331dlh.h b/unittests/periphery-lld/inc/ut_alld_lis331dlh.h
deleted file mode 100644
index b41fe21..0000000
--- a/unittests/periphery-lld/inc/ut_alld_lis331dlh.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef AMIROOS_UT_LIS331DLH_LLD_H
-#define AMIROOS_UT_LIS331DLH_LLD_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_LIS331DLH)) || defined(__DOXYGEN__)
-
-#include <alld_lis331dlh.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   Accelerometer driver to use.
-   */
-  LIS331DLHDriver *lisd;
-
-  /**
-   * @brief   SPI configuratoin.
-   */
-  SPIConfig *spiconf;
-
-  /**
-   * @brief   Event source for certain tests.
-   */
-  event_source_t *src;
-
-  /**
-   * @brief   Event flags to watch.
-   */
-  eventflags_t evtflags;
-} ut_lis331dlhdata_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-  aos_utresult_t utAlldLis331dlhFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
-#ifdef __cplusplus
-}
-#endif
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_LIS331DLH) */
-
-#endif /* AMIROOS_UT_LIS331DLH_LLD_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_ltc4412.h b/unittests/periphery-lld/inc/ut_alld_ltc4412.h
deleted file mode 100644
index 750703b..0000000
--- a/unittests/periphery-lld/inc/ut_alld_ltc4412.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef AMIROOS_UT_ALLD_LTC4412_H
-#define AMIROOS_UT_ALLD_LTC4412_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_LTC4412)) || defined(__DOXYGEN__)
-
-#include <alld_ltc4412.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-  aos_utresult_t utAlldLtc4412Func(BaseSequentialStream* stream, aos_unittest_t* ut);
-#ifdef __cplusplus
-}
-#endif
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_LTC4412) */
-
-#endif /* AMIROOS_UT_ALLD_LTC4412_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_mpr121.h b/unittests/periphery-lld/inc/ut_alld_mpr121.h
deleted file mode 100644
index 8e0560c..0000000
--- a/unittests/periphery-lld/inc/ut_alld_mpr121.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef AMIROOS_UT_ALLD_MPR121_H
-#define AMIROOS_UT_ALLD_MPR121_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_MPR121)) || defined(__DOXYGEN__)
-
-#include <alld_mpr121.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   Pointer to the MPR121 driver to use.
-   */
-  MPR121Driver* mprd;
-
-  /**
-   * @brief   Timeout value (in us).
-   */
-  apalTime_t timeout;
-
-  /**
-   * @brief   Event source to listen to.
-   */
-  event_source_t* evtsource;
-
-  /**
-   * @brief   Event flags to watch.
-   */
-  eventflags_t evtflags;
-} ut_mpr121data_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-  aos_utresult_t utAlldMpr121Func(BaseSequentialStream* stream, aos_unittest_t* ut);
-#ifdef __cplusplus
-}
-#endif
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_MPR121) */
-
-#endif /* AMIROOS_UT_ALLD_MPR121_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_mpu6050.h b/unittests/periphery-lld/inc/ut_alld_mpu6050.h
deleted file mode 100644
index f3be65f..0000000
--- a/unittests/periphery-lld/inc/ut_alld_mpu6050.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2018  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef AMIROOS_UT_MPU6050_LLD_HPP
-#define AMIROOS_UT_MPU6050_LLD_HPP
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_MPU6050)) || defined(__DOXYGEN__)
-
-#include <alld_mpu6050.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   MPU6050 driver to use.
-   */
-  MPU6050Driver *mpu;
-
-  /**
-   * @brief   Timeout delay for certain tests.
-   */
-  apalTime_t timeout;
-} ut_mpu6050data_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-  aos_utresult_t utAlldMpu6050Func(BaseSequentialStream* stream, aos_unittest_t* ut);
-#ifdef __cplusplus
-}
-#endif
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_MPU6050) */
-
-#endif /* AMIROOS_UT_MPU6050_LLD_HPP */
diff --git a/unittests/periphery-lld/inc/ut_alld_pca9544a.h b/unittests/periphery-lld/inc/ut_alld_pca9544a.h
deleted file mode 100644
index 551fcca..0000000
--- a/unittests/periphery-lld/inc/ut_alld_pca9544a.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef AMIROOS_UT_ALLD_PCA9544A_H
-#define AMIROOS_UT_ALLD_PCA9544A_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_PCA9544A)) || defined(__DOXYGEN__)
-
-#include <alld_pca9544a.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   Pointer to the driver to use.
-   */
-  PCA9544ADriver *driver;
-
-  /**
-   * @brief   Timeout for bus communication.
-   */
-  apalTime_t timeout;
-} ut_pca9544adata_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-  aos_utresult_t utAlldPca9544aFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
-#ifdef __cplusplus
-}
-#endif
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_PCA9544A) */
-
-#endif /* AMIROOS_UT_ALLD_PCA9544A_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_pcal6524.h b/unittests/periphery-lld/inc/ut_alld_pcal6524.h
deleted file mode 100644
index 181aa8d..0000000
--- a/unittests/periphery-lld/inc/ut_alld_pcal6524.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef AMIROOS_UT_PCAL6524_LLD_H
-#define AMIROOS_UT_PCAL6524_LLD_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_PCAL6524)) || defined(__DOXYGEN__)
-
-#include <alld_pcal6524.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   pointer to the PCAL6524 driver to use.
-   */
-  PCAL6524Driver* pcal6524d;
-
-  /**
-   * @brief   Timeout value (in µs).
-   */
-  apalTime_t timeout;
-} ut_pcal6524data_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-  aos_utresult_t utAlldPcal6524Func(BaseSequentialStream* stream, aos_unittest_t *ut);
-#ifdef __cplusplus
-}
-#endif
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_PCAL6524) */
-
-#endif /* AMIROOS_UT_PCAL6524_LLD_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_pklcs1212e4001.h b/unittests/periphery-lld/inc/ut_alld_pklcs1212e4001.h
deleted file mode 100644
index b1ea08e..0000000
--- a/unittests/periphery-lld/inc/ut_alld_pklcs1212e4001.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef AMIROOS_UT_ALLD_PKLCS1212E4001_H
-#define AMIROOS_UT_ALLD_PKLCS1212E4001_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_PKLCS1212E4001)) || defined(__DOXYGEN__)
-
-#include <alld_pklcs1212e4001.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   Pointer to the PWM driver.
-   */
-  apalPWMDriver_t* driver;
-
-  /**
-   * @brief   PWM channel to use.
-   */
-  apalPWMchannel_t channel;
-} ut_pklcs1212e4001_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-  aos_utresult_t utAlldPklcs1212e4001Func(BaseSequentialStream* stream, aos_unittest_t* ut);
-#ifdef __cplusplus
-}
-#endif
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_PKLCS1212E4001) */
-
-#endif /* AMIROOS_UT_ALLD_PKLCS1212E4001_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_tlc5947.h b/unittests/periphery-lld/inc/ut_alld_tlc5947.h
deleted file mode 100644
index 7a0767c..0000000
--- a/unittests/periphery-lld/inc/ut_alld_tlc5947.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef AMIROOS_UT_ALLD_TLC5947_H
-#define AMIROOS_UT_ALLD_TLC5947_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_TLC5947)) || defined(__DOXYGEN__)
-
-#include <alld_tlc5947.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-  aos_utresult_t utAlldTlc5947Func(BaseSequentialStream* stream, aos_unittest_t* ut);
-#ifdef __cplusplus
-}
-#endif
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_TLC5947) */
-
-#endif /* AMIROOS_UT_ALLD_TLC5947_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_tps2051bdbv.h b/unittests/periphery-lld/inc/ut_alld_tps2051bdbv.h
deleted file mode 100644
index b2e50b3..0000000
--- a/unittests/periphery-lld/inc/ut_alld_tps2051bdbv.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef AMIROOS_UT_ALLD_TPS2051BDBV_H
-#define AMIROOS_UT_ALLD_TPS2051BDBV_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_TPS2051BDBV)) || defined(__DOXYGEN__)
-
-#include <alld_tps2051bdbv.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-  aos_utresult_t utAlldTps2051bdbvFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
-#ifdef __cplusplus
-}
-#endif
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_TPS2051BDBV) */
-
-#endif /* AMIROOS_UT_ALLD_TPS2051BDBV_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_tps62113.h b/unittests/periphery-lld/inc/ut_alld_tps62113.h
deleted file mode 100644
index 2a17e40..0000000
--- a/unittests/periphery-lld/inc/ut_alld_tps62113.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef AMIROOS_UT_ALLD_TPS62113_H
-#define AMIROOS_UT_ALLD_TPS62113_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_TPS62113)) || defined(__DOXYGEN__)
-
-#include <alld_tps62113.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-  aos_utresult_t utAlldTps62113Func(BaseSequentialStream* stream, aos_unittest_t* ut);
-#ifdef __cplusplus
-}
-#endif
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_TPS62113) */
-
-#endif /* AMIROOS_UT_ALLD_TPS62113_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_tps62113_ina219.h b/unittests/periphery-lld/inc/ut_alld_tps62113_ina219.h
deleted file mode 100644
index 100fa7e..0000000
--- a/unittests/periphery-lld/inc/ut_alld_tps62113_ina219.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef AMIROOS_UT_ALLD_TPS62113_INA219_H
-#define AMIROOS_UT_ALLD_TPS62113_INA219_H
-
-#include <amiroos.h>
-#include <alld_tps62113.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_TPS62113) && defined(AMIROLLD_CFG_USE_INA219)) || defined(__DOXYGEN__)
-
-#include <alld_ina219.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   TPS62113 driver to use.
-   */
-  TPS62113Driver* tps62113;
-
-  /**
-   * @brief   INA219 driver to use.
-   */
-  INA219Driver* ina219;
-
-  /**
-   * @brief   Timeout value (in us).
-   */
-  apalTime_t timeout;
-} ut_tps62113ina219data_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-  aos_utresult_t utAlldTps62113Ina219Func(BaseSequentialStream* stream, aos_unittest_t* ut);
-#ifdef __cplusplus
-}
-#endif
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_TPS62113) && defined(AMIROLLD_CFG_USE_INA219) */
-
-#endif /* AMIROOS_UT_ALLD_TPS62113_INA219_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_vcnl4020.h b/unittests/periphery-lld/inc/ut_alld_vcnl4020.h
deleted file mode 100644
index 380c3c1..0000000
--- a/unittests/periphery-lld/inc/ut_alld_vcnl4020.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef AMIROOS_UT_VCNL4020_LLD_H
-#define AMIROOS_UT_VCNL4020_LLD_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_VCNL4020)) || defined(__DOXYGEN__)
-
-#include <alld_vcnl4020.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   VCNL4020 driver to use.
-   */
-  VCNL4020Driver *vcnld;
-
-  /**
-   * @brief   Timeout for certain tests.
-   */
-  apalTime_t timeout;
-
-  /**
-   * @brief   Event source to listen to.
-   */
-  event_source_t* evtsource;
-
-  /**
-   * @brief   Event flags to watch.
-   */
-  eventflags_t evtflags;
-} ut_vcnl4020data_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-  aos_utresult_t utAlldVcnl4020Func(BaseSequentialStream* stream, aos_unittest_t* ut);
-#ifdef __cplusplus
-}
-#endif
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_VCNL4020) */
-
-#endif /* AMIROOS_UT_VCNL4020_LLD_H */
diff --git a/unittests/periphery-lld/src/ut_alld_A3906_v1.c b/unittests/periphery-lld/src/ut_alld_A3906_v1.c
new file mode 100644
index 0000000..2571b74
--- /dev/null
+++ b/unittests/periphery-lld/src/ut_alld_A3906_v1.c
@@ -0,0 +1,290 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_A3906) && (AMIROLLD_CFG_A3906 == 1)) || defined(__DOXYGEN__)
+
+#include <ut_alld_A3906_v1.h>
+#include <stdlib.h>
+#include <math.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/**
+ * @brief   Interval to poll QEI in certain tests.
+ */
+#define QEI_POLL_INTERVAL_MS          100
+
+/**
+ * @brief   Threshold for QEI differences.
+ * @details Differences smaller than or equal to this value are neglected (interpreted as zero).
+ *          The value can be interpreted as encoder ticks per second (tps).
+ * @note    The expected value is about 7000 tps and a jitter of up to ±2% is ok.
+ */
+#define QEI_DIFF_THRESHOLD            (apalQEICount_t)(7000 * 0.02f)
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/**
+ * @brief   Enumerator to distinguish between left and right wheel.
+ */
+typedef enum {
+  WHEEL_LEFT    = 0,  /**< left wheel identifier */
+  WHEEL_RIGHT   = 1,  /**< right wheel identifier */
+} wheel_t;
+
+/**
+ * @brief   Enumerator to distinguish directions.
+ */
+typedef enum {
+  DIRECTION_FORWARD   = 0,  /**< forward direction identifier */
+  DIRECTION_BACKWARD  = 1,  /**< backward direction identifier */
+} direction_t;
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/**
+ * @brief   helper function to test each wheel and direction separately.
+ *
+ * @param[in] stream      Stream for input/output.
+ * @param[in] data        Unit test meta data.
+ * @param[in] wheel       Wheel to test.
+ * @param[in] direction   Direction to test.
+ * @param[in,out] result  Result variable to modify.
+ */
+void _wheelDirectionTest(BaseSequentialStream* stream, ut_a3906data_t* data, wheel_t wheel, direction_t direction, aos_utresult_t* result)
+{
+  // local variables
+  uint32_t status;
+  bool qei_valid;
+  apalQEICount_t qei_count[2];
+  apalQEIDirection_t qei_direction;
+  uint32_t timeout_counter;
+
+  chprintf(stream, "%s wheel %s...\n", (wheel == WHEEL_LEFT) ? "left" : "right", (direction == DIRECTION_FORWARD) ? "forward" : "backward");
+  qei_valid = false;
+  status = apalQEIGetPosition((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_count[0]);
+  // increase PWM incrementally and read QEI data
+  for (apalPWMwidth_t pwm_width = APAL_PWM_WIDTH_MIN; pwm_width < APAL_PWM_WIDTH_MAX; ++pwm_width) {
+    status |= a3906_lld_set_pwm(data->pwm.driver, (wheel == WHEEL_LEFT) ?
+                                  ((direction == DIRECTION_FORWARD) ? data->pwm.channel.left_forward : data->pwm.channel.left_backward) :
+                                  ((direction == DIRECTION_FORWARD) ? data->pwm.channel.right_forward : data->pwm.channel.right_backward),
+                                pwm_width);
+    status |= apalQEIGetPosition((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_count[1]);
+    qei_valid = qei_valid || (qei_count[0] != qei_count[1]);
+    aosThdUSleep(5 * MICROSECONDS_PER_SECOND / (APAL_PWM_WIDTH_MAX - APAL_PWM_WIDTH_MIN));
+    qei_count[0] = qei_count[1];
+  }
+  status |= qei_valid ? 0x00 : 0x10;
+  status |= apalQEIGetDirection((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_direction);
+  status |= (qei_direction == ((direction == DIRECTION_FORWARD) ? APAL_QEI_DIRECTION_UP : APAL_QEI_DIRECTION_DOWN)) ? 0x00 : 0x20;
+
+  // let the wheel spin free until it stops
+  status |= a3906_lld_set_pwm(data->pwm.driver, (wheel == WHEEL_LEFT) ?
+                                ((direction == DIRECTION_FORWARD) ? data->pwm.channel.left_forward : data->pwm.channel.left_backward) :
+                                ((direction == DIRECTION_FORWARD) ? data->pwm.channel.right_forward : data->pwm.channel.right_backward),
+                              0);
+  qei_count[0] = 0;
+  qei_count[1] = 0;
+  timeout_counter = 0;
+  do {
+    status |= apalQEIGetPosition((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_count[0]);
+    aosThdMSleep(1);
+    status |= apalQEIGetPosition((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_count[1]);
+    ++timeout_counter;
+  } while ((qei_count[0] != qei_count[1]) && (timeout_counter * MICROSECONDS_PER_MILLISECOND <= data->timeout));
+  status |= (timeout_counter * MICROSECONDS_PER_MILLISECOND > data->timeout) ? APAL_STATUS_TIMEOUT : 0x00;
+
+  // report result
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, result);
+  } else {
+    aosUtFailedMsg(stream, result, "0x%08X\n", status);
+  }
+
+  return;
+}
+
+void _wheelSpeedTest(BaseSequentialStream* stream, ut_a3906data_t* data, wheel_t wheel, direction_t direction, aos_utresult_t* result)
+{
+  // local variables
+  uint32_t status;
+  apalQEICount_t qei_range;
+  apalQEICount_t qei_count[2] = {0};
+  apalQEICount_t qei_increments[2] = {0};
+  apalQEICount_t qei_increments_diff = 0;
+  uint32_t timeout_counter = 0;
+  uint32_t stable_counter = 0;
+
+  chprintf(stream, "%s wheel full speed %s...\n", (wheel == WHEEL_LEFT) ? "left" : "right", (direction == DIRECTION_FORWARD) ? "forward" : "backward");
+  // spin up the wheel with full speed
+  status = apalQEIGetRange((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_range);
+  status |= a3906_lld_set_pwm(data->pwm.driver, (wheel == WHEEL_LEFT) ?
+                               ((direction == DIRECTION_FORWARD) ? data->pwm.channel.left_forward : data->pwm.channel.left_backward) :
+                               ((direction == DIRECTION_FORWARD) ? data->pwm.channel.right_forward : data->pwm.channel.right_backward),
+                             APAL_PWM_WIDTH_MAX);
+  aosThdMSleep(100);
+  do {
+    // read QEI data to determine speed
+    status |= apalQEIGetPosition((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_count[0]);
+    aosThdMSleep(QEI_POLL_INTERVAL_MS);
+    status |= apalQEIGetPosition((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_count[1]);
+    timeout_counter += QEI_POLL_INTERVAL_MS;
+    qei_increments[0] = qei_increments[1];
+    qei_increments[1] = (direction == DIRECTION_FORWARD) ?
+                          ((qei_count[1] > qei_count[0]) ? (qei_count[1] - qei_count[0]) : (qei_count[1] + (qei_range - qei_count[0]))) :
+                          ((qei_count[0] > qei_count[1]) ? (qei_count[0] - qei_count[1]) : (qei_count[0] + (qei_range - qei_count[1])));
+    qei_increments_diff = abs((int32_t)qei_increments[0] - (int32_t)qei_increments[1]) * ((float)MILLISECONDS_PER_SECOND / (float)QEI_POLL_INTERVAL_MS);
+    stable_counter = ((qei_increments[0] != 0 || qei_increments[1] != 0) && qei_increments_diff <= QEI_DIFF_THRESHOLD) ? stable_counter+1 : 0;
+    if (qei_increments[0] != 0 && stable_counter == 0) {
+      chprintf(stream, "\tunstable speed? jitter of %u tps is above threshold (%u tps).\n", qei_increments_diff, QEI_DIFF_THRESHOLD);
+    }
+  } while ((stable_counter* QEI_POLL_INTERVAL_MS < MILLISECONDS_PER_SECOND) && (timeout_counter * MICROSECONDS_PER_MILLISECOND <= data->timeout));
+  status |= a3906_lld_set_pwm(data->pwm.driver, (wheel == WHEEL_LEFT) ?
+                               ((direction == DIRECTION_FORWARD) ? data->pwm.channel.left_forward : data->pwm.channel.left_backward) :
+                               ((direction == DIRECTION_FORWARD) ? data->pwm.channel.right_forward : data->pwm.channel.right_backward),
+                             APAL_PWM_WIDTH_OFF);
+  status |= (timeout_counter * MICROSECONDS_PER_MILLISECOND > data->timeout) ? APAL_STATUS_TIMEOUT : 0x00;
+
+  // report results
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, result);
+    const float tps = qei_increments[1] * ((float)MILLISECONDS_PER_SECOND / (float)QEI_POLL_INTERVAL_MS);
+    const float rpm = tps * SECONDS_PER_MINUTE / (float)data->qei.increments_per_revolution;
+    const float velocity = tps / (float)data->qei.increments_per_revolution * ((wheel == WHEEL_LEFT) ? data->wheel_diameter.left : data->wheel_diameter.right) * acos(-1);
+    chprintf(stream, "\t%f tps\n", tps);
+    chprintf(stream, "\t%f RPM\n", rpm);
+    chprintf(stream, "\t%f m/s\n", velocity);
+    chprintf(stream, "\n");
+  }
+  else {
+    aosUtFailedMsg(stream, result, "0x%08X\n", status);
+  }
+}
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+/**
+ * @brief   A3905 unit test function.
+ *
+ * @param[in] stream  Stream for input/output.
+ * @param[in] ut      Unit test object.
+ *
+ * @return            Unit test result value.
+ */
+aos_utresult_t utAlldA3906Func(BaseSequentialStream* stream, aos_unittest_t* ut)
+{
+  aosDbgCheck((ut->data != NULL) &&
+              (((ut_a3906data_t*)ut->data)->driver != NULL) &&
+              (((ut_a3906data_t*)ut->data)->pwm.driver != NULL) &&
+              (((ut_a3906data_t*)ut->data)->qei.left != NULL) &&
+              (((ut_a3906data_t*)ut->data)->qei.right != NULL));
+
+
+
+  // local variables
+  aos_utresult_t result = {0, 0};
+  uint32_t status = 0;
+  a3906_lld_power_t power_state;
+  apalQEICount_t qei_count[2][2];
+  uint32_t timeout_counter;
+  uint32_t stable_counter;
+
+  chprintf(stream, "enable power...\n");
+  power_state = A3906_LLD_POWER_ON;
+  status = a3906_lld_set_power(((ut_a3906data_t*)ut->data)->driver, power_state);
+  status |= a3906_lld_get_power(((ut_a3906data_t*)ut->data)->driver, &power_state);
+  status |= (power_state != A3906_LLD_POWER_ON) ? 0x10 : 0x00;
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  _wheelDirectionTest(stream, (ut_a3906data_t*)ut->data, WHEEL_LEFT, DIRECTION_FORWARD, &result);
+
+  _wheelDirectionTest(stream, (ut_a3906data_t*)ut->data, WHEEL_RIGHT, DIRECTION_FORWARD, &result);
+
+  _wheelDirectionTest(stream, (ut_a3906data_t*)ut->data, WHEEL_LEFT, DIRECTION_BACKWARD, &result);
+
+  _wheelDirectionTest(stream, (ut_a3906data_t*)ut->data, WHEEL_RIGHT, DIRECTION_BACKWARD, &result);
+
+  _wheelSpeedTest(stream, (ut_a3906data_t*)ut->data, WHEEL_LEFT, DIRECTION_FORWARD, &result);
+
+  _wheelSpeedTest(stream, (ut_a3906data_t*)ut->data, WHEEL_RIGHT, DIRECTION_FORWARD, &result);
+
+  _wheelSpeedTest(stream, (ut_a3906data_t*)ut->data, WHEEL_LEFT, DIRECTION_BACKWARD, &result);
+
+  _wheelSpeedTest(stream, (ut_a3906data_t*)ut->data, WHEEL_RIGHT, DIRECTION_BACKWARD, &result);
+
+  chprintf(stream, "disable power... \n");
+  power_state = A3906_LLD_POWER_OFF;
+  status = a3906_lld_set_power(((ut_a3906data_t*)ut->data)->driver, power_state);
+  status |= a3906_lld_get_power(((ut_a3906data_t*)ut->data)->driver, &power_state);
+  status |= (power_state != A3906_LLD_POWER_OFF) ? 0x10 : 0x00;
+  qei_count[WHEEL_LEFT][0] = 0;
+  qei_count[WHEEL_LEFT][1] = 0;
+  qei_count[WHEEL_RIGHT][0] = 0;
+  qei_count[WHEEL_RIGHT][1] = 0;
+  timeout_counter = 0;
+  stable_counter = 0;
+  do {
+    status |= apalQEIGetPosition(((ut_a3906data_t*)ut->data)->qei.left, &qei_count[WHEEL_LEFT][0]);
+    status |= apalQEIGetPosition(((ut_a3906data_t*)ut->data)->qei.right, &qei_count[WHEEL_RIGHT][0]);
+    aosThdMSleep(1);
+    status |= apalQEIGetPosition(((ut_a3906data_t*)ut->data)->qei.left, &qei_count[WHEEL_LEFT][1]);
+    status |= apalQEIGetPosition(((ut_a3906data_t*)ut->data)->qei.right, &qei_count[WHEEL_RIGHT][1]);
+    ++timeout_counter;
+    stable_counter = (qei_count[WHEEL_LEFT][0] == qei_count[WHEEL_LEFT][1] && qei_count[WHEEL_RIGHT][0] == qei_count[WHEEL_RIGHT][1]) ? stable_counter+1 : 0;
+  } while((stable_counter < 100) && (timeout_counter * MICROSECONDS_PER_MILLISECOND <= ((ut_a3906data_t*)ut->data)->timeout));
+  status |= (timeout_counter * MICROSECONDS_PER_MILLISECOND > ((ut_a3906data_t*)ut->data)->timeout) ? APAL_STATUS_TIMEOUT : 0x00;
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  // stop the PWM
+  a3906_lld_set_pwm(((ut_a3906data_t*)ut->data)->pwm.driver, ((ut_a3906data_t*)ut->data)->pwm.channel.left_forward, APAL_PWM_WIDTH_OFF);
+  a3906_lld_set_pwm(((ut_a3906data_t*)ut->data)->pwm.driver, ((ut_a3906data_t*)ut->data)->pwm.channel.left_backward, APAL_PWM_WIDTH_OFF);
+  a3906_lld_set_pwm(((ut_a3906data_t*)ut->data)->pwm.driver, ((ut_a3906data_t*)ut->data)->pwm.channel.right_forward, APAL_PWM_WIDTH_OFF);
+  a3906_lld_set_pwm(((ut_a3906data_t*)ut->data)->pwm.driver, ((ut_a3906data_t*)ut->data)->pwm.channel.right_backward, APAL_PWM_WIDTH_OFF);
+
+  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(A3906Driver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_A3906) && (AMIROLLD_CFG_A3906 == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_AT24C01B_v1.c b/unittests/periphery-lld/src/ut_alld_AT24C01B_v1.c
new file mode 100644
index 0000000..eddcdbb
--- /dev/null
+++ b/unittests/periphery-lld/src/ut_alld_AT24C01B_v1.c
@@ -0,0 +1,228 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_AT24C01B) && (AMIROLLD_CFG_AT24C01B == 1)) || defined(__DOXYGEN__)
+
+#include <ut_alld_AT24C01B_v1.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/**
+ * @brief   EEPROM address for page write/read access.
+ */
+#define _pageAddress                  (AT24C01B_LLD_SIZE_BYTES - 2*AT24C01B_LLD_PAGE_SIZE_BYTES)
+
+/**
+ * @brief   EEPROM address for byte write/read access.
+ */
+#define _byteAddress                  (_pageAddress + AT24C01B_LLD_PAGE_SIZE_BYTES - 1)
+
+/**
+ * @brief   Offset for overflow tests.
+ */
+#define _overflowOffset               3
+
+/**
+ * @brief   EEPROM address for page write/read access with overflow.
+ */
+#define _overflowAddress              (_pageAddress + _overflowOffset)
+
+/**
+ * @brief   Test data byte.
+ */
+#define _bytedata                     0xA5
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+/**
+ * @brief   AT24C01B unit test function.
+ *
+ * @param[in] stream  Stream for inout/outout.
+ * @param[in] ut      Unit test object.
+ *
+ * @return            Unit test result value.
+ */
+aos_utresult_t utAlldAt24c01bFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
+{
+  aosDbgCheck(ut->data != NULL && ((ut_at24c01bdata_t*)(ut->data))->driver != NULL);
+
+  // local variables
+  aos_utresult_t result = {0, 0};
+  uint32_t status = 0;
+  uint8_t page_data[AT24C01B_LLD_PAGE_SIZE_BYTES];
+  uint8_t original_data[AT24C01B_LLD_PAGE_SIZE_BYTES];
+  uint8_t read_data[AT24C01B_LLD_PAGE_SIZE_BYTES];
+  size_t errors = 0;
+  for (size_t dataIdx = 0; dataIdx < AT24C01B_LLD_PAGE_SIZE_BYTES; ++dataIdx) {
+    page_data[dataIdx] = dataIdx;
+  }
+
+  chprintf(stream, "reading byte...\n");
+  status = at24c01b_lld_read(((ut_at24c01bdata_t*)(ut->data))->driver, _byteAddress, original_data, 1, ((ut_at24c01bdata_t*)(ut->data))->timeout);
+  if (status == APAL_STATUS_SUCCESS || status == APAL_STATUS_WARNING) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "writing byte...\n");
+  status = at24c01b_lld_write_byte(((ut_at24c01bdata_t*)(ut->data))->driver, _byteAddress, _bytedata, ((ut_at24c01bdata_t*)(ut->data))->timeout);
+  while (at24c01b_lld_poll_ack(((ut_at24c01bdata_t*)(ut->data))->driver, ((ut_at24c01bdata_t*)(ut->data))->timeout) == APAL_STATUS_FAILURE) {
+    continue;
+  }
+  status |= at24c01b_lld_read(((ut_at24c01bdata_t*)(ut->data))->driver, _byteAddress, &read_data[0], 1, ((ut_at24c01bdata_t*)(ut->data))->timeout);
+  status |= (read_data[0] == _bytedata) ? 0x00 : 0x20;
+  status = at24c01b_lld_write_byte(((ut_at24c01bdata_t*)(ut->data))->driver, _byteAddress, (uint8_t)~_bytedata, ((ut_at24c01bdata_t*)(ut->data))->timeout);
+  while (at24c01b_lld_poll_ack(((ut_at24c01bdata_t*)(ut->data))->driver, ((ut_at24c01bdata_t*)(ut->data))->timeout) == APAL_STATUS_FAILURE) {
+    continue;
+  }
+  status |= at24c01b_lld_read(((ut_at24c01bdata_t*)(ut->data))->driver, _byteAddress, &read_data[1], 1, ((ut_at24c01bdata_t*)(ut->data))->timeout);
+  status |= (read_data[1] == (uint8_t)~_bytedata) ? 0x00 : 0x40;
+  status |= at24c01b_lld_write_byte(((ut_at24c01bdata_t*)(ut->data))->driver, _byteAddress, original_data[0], ((ut_at24c01bdata_t*)(ut->data))->timeout);
+  while (at24c01b_lld_poll_ack(((ut_at24c01bdata_t*)(ut->data))->driver, ((ut_at24c01bdata_t*)(ut->data))->timeout) == APAL_STATUS_FAILURE) {
+    continue;
+  }
+  status |= at24c01b_lld_read(((ut_at24c01bdata_t*)(ut->data))->driver, _byteAddress, &read_data[2], 1, ((ut_at24c01bdata_t*)(ut->data))->timeout);
+  status |= (read_data[2] == original_data[0]) ? 0x00 : 0x80;
+  if (status == APAL_STATUS_SUCCESS || status == APAL_STATUS_WARNING) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "reading page...\n");
+  status = at24c01b_lld_read(((ut_at24c01bdata_t*)(ut->data))->driver, _pageAddress, original_data, AT24C01B_LLD_PAGE_SIZE_BYTES, ((ut_at24c01bdata_t*)(ut->data))->timeout);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "writing page...\n");
+  status = at24c01b_lld_write_page(((ut_at24c01bdata_t*)(ut->data))->driver, _pageAddress, page_data, AT24C01B_LLD_PAGE_SIZE_BYTES, ((ut_at24c01bdata_t*)(ut->data))->timeout);
+  while (at24c01b_lld_poll_ack(((ut_at24c01bdata_t*)(ut->data))->driver, ((ut_at24c01bdata_t*)(ut->data))->timeout) == APAL_STATUS_FAILURE) {
+    continue;
+  }
+  status |= at24c01b_lld_read(((ut_at24c01bdata_t*)(ut->data))->driver, _pageAddress, read_data, AT24C01B_LLD_PAGE_SIZE_BYTES, ((ut_at24c01bdata_t*)(ut->data))->timeout);
+  errors = 0;
+  for (size_t dataIdx = 0; dataIdx < AT24C01B_LLD_PAGE_SIZE_BYTES; dataIdx++) {
+    if (read_data[dataIdx] != page_data[dataIdx]) {
+      ++errors;
+    }
+  }
+  if (status == APAL_STATUS_OK && errors == 0) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X; %u\n", status, errors);
+  }
+
+  chprintf(stream, "reading page at current address...\n");
+  // set address counter to UT_ALLD_AT24C01B_PAGE_ADDRESS
+  status = at24c01b_lld_read(((ut_at24c01bdata_t*)(ut->data))->driver, _pageAddress-1, read_data, 1, ((ut_at24c01bdata_t*)(ut->data))->timeout);
+  if (status == APAL_STATUS_WARNING) {
+    // on STM32F1 platform the address gets incremented by 2 after reading
+    status = at24c01b_lld_read(((ut_at24c01bdata_t*)(ut->data))->driver, _pageAddress-2, read_data, 1, ((ut_at24c01bdata_t*)(ut->data))->timeout);
+  }
+  // read page from the current address
+  status = at24c01b_lld_read_current_address(((ut_at24c01bdata_t*)(ut->data))->driver, read_data, AT24C01B_LLD_PAGE_SIZE_BYTES, ((ut_at24c01bdata_t*)(ut->data))->timeout);
+  errors = 0;
+  for (uint8_t dataIdx = 0; dataIdx < 8; dataIdx++) {
+    if (read_data[dataIdx] != page_data[dataIdx]) {
+      ++errors;
+    }
+  }
+  if (status == APAL_STATUS_OK && errors == 0) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X; %u\n", status, errors);
+  }
+
+  chprintf(stream, "writing page with overflow (7 bytes)...\n");
+  status = at24c01b_lld_write_page(((ut_at24c01bdata_t*)(ut->data))->driver, _overflowAddress, page_data, AT24C01B_LLD_PAGE_SIZE_BYTES-1, ((ut_at24c01bdata_t*)(ut->data))->timeout);
+  while (at24c01b_lld_poll_ack(((ut_at24c01bdata_t*)(ut->data))->driver, ((ut_at24c01bdata_t*)(ut->data))->timeout) == APAL_STATUS_FAILURE) {
+    continue;
+  }
+  status |= at24c01b_lld_read(((ut_at24c01bdata_t*)(ut->data))->driver, _overflowAddress, read_data, AT24C01B_LLD_PAGE_SIZE_BYTES-_overflowOffset, ((ut_at24c01bdata_t*)(ut->data))->timeout);
+  status |= at24c01b_lld_read(((ut_at24c01bdata_t*)(ut->data))->driver, _overflowAddress-_overflowOffset, read_data+(AT24C01B_LLD_PAGE_SIZE_BYTES-_overflowOffset), _overflowOffset-1, ((ut_at24c01bdata_t*)(ut->data))->timeout);
+  errors = 0;
+  for (uint8_t dataIdx = 0; dataIdx < AT24C01B_LLD_PAGE_SIZE_BYTES-1; dataIdx++) {
+    if (read_data[dataIdx] != page_data[dataIdx]) {
+      ++errors;
+    }
+  }
+  if (status == APAL_STATUS_OK && errors == 0) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X; %u\n", status, errors);
+  }
+
+  chprintf(stream, "writing page with overflow (8 bytes)...\n");
+  status = at24c01b_lld_write_page(((ut_at24c01bdata_t*)(ut->data))->driver, _overflowAddress, page_data, AT24C01B_LLD_PAGE_SIZE_BYTES, ((ut_at24c01bdata_t*)(ut->data))->timeout);
+  while (at24c01b_lld_poll_ack(((ut_at24c01bdata_t*)(ut->data))->driver, ((ut_at24c01bdata_t*)(ut->data))->timeout) == APAL_STATUS_FAILURE) {
+    continue;
+  }
+  status |= at24c01b_lld_read(((ut_at24c01bdata_t*)(ut->data))->driver, _overflowAddress, read_data, AT24C01B_LLD_PAGE_SIZE_BYTES-_overflowOffset, ((ut_at24c01bdata_t*)(ut->data))->timeout);
+  status |= at24c01b_lld_read(((ut_at24c01bdata_t*)(ut->data))->driver, _overflowAddress-_overflowOffset, read_data+(AT24C01B_LLD_PAGE_SIZE_BYTES-_overflowOffset), _overflowOffset, ((ut_at24c01bdata_t*)(ut->data))->timeout);
+  errors = 0;
+  for (uint8_t dataIdx = 0; dataIdx < AT24C01B_LLD_PAGE_SIZE_BYTES; dataIdx++) {
+    if (read_data[dataIdx] != page_data[dataIdx]) {
+      ++errors;
+    }
+  }
+  if (status == APAL_STATUS_OK && errors == 0) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X; %u\n", status, errors);
+  }
+
+  chprintf(stream, "write back original data...\n");
+  status = at24c01b_lld_write_page(((ut_at24c01bdata_t*)(ut->data))->driver, _pageAddress, original_data, AT24C01B_LLD_PAGE_SIZE_BYTES, ((ut_at24c01bdata_t*)(ut->data))->timeout);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(AT24C01BDriver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_USE_AT24C01B) && (AMIROLLD_USE_AT24C01B == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_AT42QT1050_v1.c b/unittests/periphery-lld/src/ut_alld_AT42QT1050_v1.c
new file mode 100644
index 0000000..0ddad2b
--- /dev/null
+++ b/unittests/periphery-lld/src/ut_alld_AT42QT1050_v1.c
@@ -0,0 +1,154 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_AT42QT1050) && (AMIROLLD_CFG_AT42QT1050 == 1)) || defined(__DOXYGEN__)
+
+#include <ut_alld_AT42QT1050_v1.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+#define INTERRUPT_EVENT_ID            1
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+aos_utresult_t utAlldAt42qt1050Func(BaseSequentialStream* stream, aos_unittest_t* ut)
+{
+  aosDbgCheck(ut->data != NULL && ((ut_at42qt1050data_t*)ut->data)->at42qt1050d != NULL);
+
+  // local variables
+  aos_utresult_t result = {0, 0};
+  uint32_t status;
+  uint8_t buffer8[4] = {0, 0};
+  uint16_t buffer16[5];
+  event_listener_t event_listener;
+  aos_timestamp_t tstart, tcurrent, tend;
+
+  chprintf(stream, "read register...\n");
+  status = at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_CHIPID, &buffer8[0], ((ut_at42qt1050data_t*)ut->data)->timeout);
+  status |= at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_FIRMWAREVERSION, &buffer8[1], ((ut_at42qt1050data_t*)ut->data)->timeout);
+  chprintf(stream, "\t\tchip ID: 0x%02X\n", buffer8[0]);
+  chprintf(stream, "\t\tfirmware version: %u.%u (0x%02X)\n", ((at42qt1050_lld_firmwarereg_t)buffer8[1]).major, ((at42qt1050_lld_firmwarereg_t)buffer8[1]).minor, buffer8[1]);
+  if (status == APAL_STATUS_SUCCESS && buffer8[0] == AT42QT1050_LLD_CHIPID) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "write register...\n");
+  buffer8[1] = (((uint8_t)(at42qt1050_lld_samples2pulse(4096) + 0.5f)) << 4) | ((uint8_t)(at42qt1050_lld_scaling2scale(1024) + 0.5f));
+  status = at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_PULSE_SCALE_1, &buffer8[0], ((ut_at42qt1050data_t*)ut->data)->timeout);
+  status |= at42qt1050_lld_write_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_PULSE_SCALE_1, buffer8[1] , ((ut_at42qt1050data_t*)ut->data)->timeout);
+  status |= at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_PULSE_SCALE_1, &buffer8[2], ((ut_at42qt1050data_t*)ut->data)->timeout);
+  status |= at42qt1050_lld_write_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_PULSE_SCALE_1, buffer8[0] , ((ut_at42qt1050data_t*)ut->data)->timeout);
+  status |= at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_PULSE_SCALE_1, &buffer8[3], ((ut_at42qt1050data_t*)ut->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS &&
+      buffer8[3] == buffer8[0] &&
+      buffer8[2] == buffer8[1] &&
+      at42qt1050_lld_pulse2samples(((at42qt1050_lld_pulsescalereg_t)buffer8[2]).pulse) == 4096 &&
+      at42qt1050_lld_scale2scaling(((at42qt1050_lld_pulsescalereg_t)buffer8[2]).scale) == 1024) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X [0x%02X 0x%02X 0x%02X 0x%02X]\n", status, buffer8[0], buffer8[1], buffer8[2], buffer8[3]);
+  }
+
+  chprintf(stream, "read reference data...\n");
+  status = APAL_STATUS_OK;
+  for (uint8_t key = 0; key < AT42QT1050_LLD_NUM_KEYS; ++key) {
+    status |= at42qt1050_lld_read_referencedata(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, key, &buffer16[key], ((ut_at42qt1050data_t*)ut->data)->timeout);
+    chprintf(stream, "\t\tkey %u: 0x%04X\n", key, buffer16[key]);
+  }
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "read key signal for ten seconds...\n");
+  status = APAL_STATUS_OK;
+  chprintf(stream, "\t\t key 0  key 1  key 2  key 3  key 4\n");
+  for (uint8_t s = 0; s < 10; ++s) {
+    aosThdSSleep(1);
+    for (uint8_t key = 0; key < AT42QT1050_LLD_NUM_KEYS; ++key) {
+      status |= at42qt1050_lld_read_keyssignal(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, key, &buffer16[key], ((ut_at42qt1050data_t*)ut->data)->timeout);
+    }
+    chprintf(stream, "\t\t0x%04X 0x%04X 0x%04X 0x%04X 0x%04X\n", buffer16[0], buffer16[1], buffer16[2], buffer16[3], buffer16[4]);
+  }
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "test interrupts...\n");
+  status = AOS_OK;
+  chEvtRegister(((ut_at42qt1050data_t*)ut->data)->evtsource, &event_listener, INTERRUPT_EVENT_ID);
+  aosSysGetUptime(&tstart);
+  tend = tstart + (30 * MICROSECONDS_PER_SECOND);
+  do {
+    aosSysGetUptime(&tcurrent);
+    const aos_timestamp_t ttimeout = MICROSECONDS_PER_SECOND - ((tcurrent - tstart) % MICROSECONDS_PER_SECOND);
+    const eventmask_t emask = chEvtWaitOneTimeout(EVENT_MASK(INTERRUPT_EVENT_ID), chTimeUS2I(ttimeout));
+    const eventflags_t eflags = chEvtGetAndClearFlags(&event_listener);
+    if (emask == EVENT_MASK(INTERRUPT_EVENT_ID) && eflags == ((ut_at42qt1050data_t*)ut->data)->evtflags) {
+      // interrupt detected
+      chprintf(stream, "\t\tinterrupt detected\n");
+    } // else: timeout
+    status |= at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_KEYSTATUS, &buffer8[0], ((ut_at42qt1050data_t*)ut->data)->timeout);
+    chprintf(stream, "\t\tkey status: %u %u %u %u %u\n",
+             (((buffer8[0] & AT42QT1050_LLD_KEYSTATUS_KEY0) == 0) ? 0 : 1),
+             (((buffer8[0] & AT42QT1050_LLD_KEYSTATUS_KEY1) == 0) ? 0 : 1),
+             (((buffer8[0] & AT42QT1050_LLD_KEYSTATUS_KEY2) == 0) ? 0 : 1),
+             (((buffer8[0] & AT42QT1050_LLD_KEYSTATUS_KEY3) == 0) ? 0 : 1),
+             (((buffer8[0] & AT42QT1050_LLD_KEYSTATUS_KEY4) == 0) ? 0 : 1));
+    aosSysGetUptime(&tcurrent);
+  } while (tcurrent < tend);
+  chEvtUnregister(((ut_at42qt1050data_t*)ut->data)->evtsource, &event_listener);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(AT42QT1050Driver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_AT42QT1050) && (AMIROLLD_CFG_AT42QT1050 == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_DW1000_v0.c b/unittests/periphery-lld/src/ut_alld_DW1000_v0.c
new file mode 100755
index 0000000..7be1955
--- /dev/null
+++ b/unittests/periphery-lld/src/ut_alld_DW1000_v0.c
@@ -0,0 +1,158 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_DW1000) && (AMIROLLD_CFG_DW1000 == 0)) || defined(__DOXYGEN__)
+
+#include <ut_alld_dw1000.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+aos_utresult_t utAlldDw1000Func(BaseSequentialStream* stream, aos_unittest_t* ut) {
+
+    aosDbgCheck(ut->data != NULL);
+
+    aos_utresult_t result = {0, 0};
+
+    chprintf(stream, "init DW1000...\n");
+    dwt_initialise(DWT_LOADUCODE, (DW1000Driver*) ut->data);
+    chprintf(stream, "device ID should be: 0xDECA0130\nget device ID...\n");
+    uint32_t actual_deviceId = dwt_readdevid();
+    chprintf(stream, "actual device ID is: 0x%x\n", actual_deviceId);
+    aosThdMSleep(1);
+
+    if (actual_deviceId == DWT_DEVICE_ID){
+      aosUtPassed(stream, &result);
+    } else {
+      aosUtFailed(stream, &result);
+    }
+
+    /*chprintf(stream, "write-read test...\n");
+    uint32_t testvalue = 0x0A;
+    uint16_t panid = 0x00;
+
+    dwt_readfromdevice(PANADR_ID, PANADR_PAN_ID_OFFSET, 2, (uint8_t*) &panid);
+    chprintf(stream, "value PANADR register before write: %x\n", panid);
+    chprintf(stream, "write 0x%x to PANADR register...\n", testvalue);
+    dwt_setpanid(testvalue);
+    dwt_readfromdevice(PANADR_ID, PANADR_PAN_ID_OFFSET, 2, (uint8_t*) &panid);
+
+    chprintf(stream, "PANADR register is now: 0x%x\n", panid);
+
+    if (panid == testvalue){
+      aosUtPassed(stream, &result);
+    } else {
+      aosUtFailed(stream, &result);
+    }
+*/
+
+    dwt_setleds(0x03);
+
+    // RUN DECA-DEMO
+
+    instanceConfig_t chConfig;
+    chConfig.channelNumber = 2;            // channel
+    chConfig.preambleCode = 4;             // preambleCode
+    chConfig.pulseRepFreq = DWT_PRF_16M;   // prf
+    chConfig.dataRate = DWT_BR_6M8;        // datarate
+    chConfig.preambleLen = DWT_PLEN_128;   // preambleLength
+    chConfig.pacSize = DWT_PAC8;           // pacSize
+    chConfig.nsSFD = 0;                    // non-standard SFD
+    chConfig.sfdTO = (129 + 8 - 8);        // SFD timeout
+
+    sfConfig_t sfConfig;
+    sfConfig.slotDuration_ms = (10);        //slot duration in milliseconds (NOTE: the ranging exchange must be able to complete in this time
+                                            //e.g. tag sends a poll, 4 anchors send responses and tag sends the final + processing time
+    sfConfig.numSlots = (10);               //number of slots in the superframe (8 tag slots and 2 used for anchor to anchor ranging),
+    sfConfig.sfPeriod_ms = (10*10);         //in ms => 100 ms frame means 10 Hz location rate
+    sfConfig.tagPeriod_ms = (10*10);        //tag period in ms (sleep time + ranging time)
+    sfConfig.pollTxToFinalTxDly_us = (2500); //poll to final delay in microseconds (needs to be adjusted according to lengths of ranging frames)
+
+    //TODO Disable EXTI IRQ
+    //port_DisableEXT_IRQ();
+
+    // inittestapplication
+    // dwt_softreset(); // already done in instance_init()
+
+    // Set this instance mode (tag/anchor)
+    (void) instance_init(TAG, (DW1000Driver*) ut->data);
+    //int err = instance_init(TAG, (DW1000Driver*) ut->data);
+    (void) instance_readdeviceid();
+    //uint32_t deca_dev_id = instance_readdeviceid();
+
+    // TAG ID 0
+    instance_set_16bit_address(0);
+    // simulate DECA config Mode 2 (DIP 1100000)
+    instance_config(&chConfig, &sfConfig) ;
+
+    //TODO Enable EXTI IRQ
+    //port_EnableEXT_IRQ();
+
+    // Start Ranging
+
+    chprintf(stream, "start ranging...\n");
+
+
+    while(1) {
+        //int n = 0;
+        instance_data_t* inst = instance_get_local_structure_ptr(0);
+
+        int monitor_local = inst->monitor ;
+        int txdiff = (chVTGetSystemTimeX() - inst->timeofTx);
+
+        tag_run();
+        //if delayed TX scheduled but did not happen after expected time then it has failed... (has to be < slot period)
+        //if anchor just go into RX and wait for next message from tags/anchors
+        //if tag handle as a timeout
+        if( (monitor_local == 1) && ( txdiff > inst->slotDuration_ms) )  {
+            inst->wait4ack = 0;
+            tag_process_rx_timeout(inst);
+            inst->monitor = 0;
+        }
+    }
+
+    (void) instance_newrange();
+    //int rx = instance_newrange();
+
+    return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_DW1000) && (AMIROLLD_CFG_DW1000 == 0) */
diff --git a/unittests/periphery-lld/src/ut_alld_HMC5883L_v1.c b/unittests/periphery-lld/src/ut_alld_HMC5883L_v1.c
new file mode 100644
index 0000000..4e55beb
--- /dev/null
+++ b/unittests/periphery-lld/src/ut_alld_HMC5883L_v1.c
@@ -0,0 +1,215 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_HMC5883L) && (AMIROLLD_CFG_HMC5883L == 1)) || defined(__DOXYGEN__)
+
+#include <ut_alld_HMC5883L_v1.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+/**
+ * @brief   HMC5338L unit test function.
+ *
+ * @param[in] stream  Stream for intput/output.
+ * @param[in] ut      Unit test object.
+ *
+ * @return            Unit test result value.
+ */
+aos_utresult_t utAlldHmc5883lFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
+{
+  aosDbgCheck(ut->data != NULL && (((ut_hmc5883ldata_t*)(ut->data))->drdyEvtSrc != NULL));
+
+  // local variables
+  aos_utresult_t result = {0, 0};
+  uint32_t status;
+  uint8_t rxbuffer[3];
+  uint8_t data;
+  uint8_t conf = 0x70;
+  hmc5883l_lld_config_t cfg;
+  uint16_t mdata[3];
+  uint8_t state;
+  eventmask_t event_mask = 0;
+  event_listener_t el;
+  uint16_t data_reads = 0;
+  aos_timestamp_t start;
+  aos_timestamp_t t;
+
+  chprintf(stream, "check ID...\n");
+  status = hmc5883l_lld_check(((ut_hmc5883ldata_t*)ut->data)->driver, rxbuffer, 3, ((ut_hmc5883ldata_t*)ut->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS && rxbuffer[0] == HMC5883L_LLD_IDENTIFICATION_A
+                                   && rxbuffer[1] == HMC5883L_LLD_IDENTIFICATION_B
+                                   && rxbuffer[2] == HMC5883L_LLD_IDENTIFICATION_C) {
+    aosUtPassed(stream, &result);
+  } else {
+    chprintf(stream, "\tfailed\n");
+    ++result.failed;
+    chprintf(stream, "\t\tstatus: %d, idA: %d, idB: %d, idC: %d\n", status, rxbuffer[0], rxbuffer[1], rxbuffer[2]);
+    chprintf(stream, "\t\texpected idA: %d, idB: %d, idC: %d\n", HMC5883L_LLD_IDENTIFICATION_A, HMC5883L_LLD_IDENTIFICATION_B, HMC5883L_LLD_IDENTIFICATION_C);
+  }
+
+  chprintf(stream, "read register...\n");
+  status = hmc5883l_lld_read_register(((ut_hmc5883ldata_t*)ut->data)->driver, HMC5883L_LLD_REGISTER_IDENTIFICATION_A, &data, 1, ((ut_hmc5883ldata_t*)ut->data)->timeout);
+  if ((status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) && data == HMC5883L_LLD_IDENTIFICATION_A) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "write register...\n");
+  status = hmc5883l_lld_write_register(((ut_hmc5883ldata_t*)ut->data)->driver, HMC5883L_LLD_REGISTER_CONFIG_A, &conf, 1, ((ut_hmc5883ldata_t*)ut->data)->timeout);
+  status |= hmc5883l_lld_read_register(((ut_hmc5883ldata_t*)ut->data)->driver, HMC5883L_LLD_REGISTER_CONFIG_A, &data, 1, ((ut_hmc5883ldata_t*)ut->data)->timeout);
+  if ((status == APAL_STATUS_SUCCESS || status == APAL_STATUS_WARNING) && data == 0x70) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n, data: d", status, data);
+  }
+
+  chprintf(stream, "read configuration\n");
+  status = hmc5883l_lld_read_config(((ut_hmc5883ldata_t*)ut->data)->driver, &cfg, ((ut_hmc5883ldata_t*)ut->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "write configuration\n");
+  cfg.avg = HMC5883L_LLD_AVG1;
+  cfg.outrate = HMC5883L_LLD_75_HZ;
+  cfg.mbias = HMC5883L_LLD_MB_NORMAL;
+  cfg.gain = HMC5883L_LLD_GN_0_GA;
+  cfg.highspeed = HMC5883L_LLD_HS_DISABLE;
+  cfg.mode = HMC5883L_LLD_MM_CONTINUOUS;
+  status = hmc5883l_lld_write_config(((ut_hmc5883ldata_t*)ut->data)->driver, cfg, ((ut_hmc5883ldata_t*)ut->data)->timeout);
+  status |= hmc5883l_lld_read_config(((ut_hmc5883ldata_t*)ut->data)->driver, &cfg, ((ut_hmc5883ldata_t*)ut->data)->timeout);
+  if (status == APAL_STATUS_OK &&
+      cfg.avg == HMC5883L_LLD_AVG1 &&
+      cfg.outrate == HMC5883L_LLD_75_HZ &&
+      cfg.mbias == HMC5883L_LLD_MB_NORMAL &&
+      cfg.gain == HMC5883L_LLD_GN_0_GA &&
+      cfg.highspeed == HMC5883L_LLD_HS_DISABLE &&
+      cfg.mode == HMC5883L_LLD_MM_CONTINUOUS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "read all data for five seconds...\n");
+  status = hmc5883l_lld_set_register(((ut_hmc5883ldata_t*)ut->data)->driver,HMC5883L_LLD_REGISTER_MODE,HMC5883L_LLD_MM_CONTINUOUS,((ut_hmc5883ldata_t*)ut->data)->timeout);
+  for (uint8_t i = 0; i < 5; ++i) {
+    status |= hmc5883l_lld_read_data(((ut_hmc5883ldata_t*)ut->data)->driver, mdata, ((ut_hmc5883ldata_t*)ut->data)->timeout);
+    chprintf(stream, "\t\tX = 0x%04X\tY = 0x%04X\tZ = 0x%04X\n",mdata[0],mdata[1],mdata[2]);
+    aosThdSSleep(1);
+  }
+  if (status == APAL_STATUS_OK) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "read status...\n");
+  status = hmc5883l_lld_read_lock(((ut_hmc5883ldata_t*)ut->data)->driver, &state, ((ut_hmc5883ldata_t*)ut->data)->timeout);
+  chprintf(stream, "\t\tsensor lock: %d\n", state);
+  status |= hmc5883l_lld_read_rdy(((ut_hmc5883ldata_t*)ut->data)->driver, &state, ((ut_hmc5883ldata_t*)ut->data)->timeout);
+  chprintf(stream, "\t\tsensor rdy: %d\n", state);
+  status |= hmc5883l_lld_read_status(((ut_hmc5883ldata_t*)ut->data)->driver, &state, ((ut_hmc5883ldata_t*)ut->data)->timeout);
+  chprintf(stream, "\t\tsensor status: %d\n", state);
+  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "interrupt (partial data read)...\n");
+  chEvtRegister(((ut_hmc5883ldata_t*)ut->data)->drdyEvtSrc, &el, 0);
+  status = hmc5883l_lld_write_config(((ut_hmc5883ldata_t*)ut->data)->driver, cfg, ((ut_hmc5883ldata_t*)ut->data)->timeout);
+  aosThdSSleep(1);
+  status |= hmc5883l_lld_read_data(((ut_hmc5883ldata_t*)ut->data)->driver, mdata, ((ut_hmc5883ldata_t*)ut->data)->timeout);
+  aosThdMSleep(10);
+  event_mask = chEvtWaitOneTimeout(EVENT_MASK(0), TIME_IMMEDIATE);
+  status |= hmc5883l_lld_read_register(((ut_hmc5883ldata_t*)ut->data)->driver, HMC5883L_LLD_REGISTER_DATA_OUT_X_MSB, &data, 1, ((ut_hmc5883ldata_t*)ut->data)->timeout);
+  aosThdMSleep(10);
+  status |= hmc5883l_lld_read_register(((ut_hmc5883ldata_t*)ut->data)->driver, HMC5883L_LLD_REGISTER_DATA_OUT_X_LSB, &data, 1, ((ut_hmc5883ldata_t*)ut->data)->timeout);
+  aosThdMSleep(10);
+  event_mask = chEvtWaitOneTimeout(EVENT_MASK(0), TIME_IMMEDIATE);
+  chprintf(stream, "\t\teventmask = 0x%08X (should be 0)\n", event_mask);
+  if (event_mask != EVENT_MASK(0)) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "interrupt (full data read)...\n");
+  status |= hmc5883l_lld_read_data(((ut_hmc5883ldata_t*)ut->data)->driver, mdata, ((ut_hmc5883ldata_t*)ut->data)->timeout);
+  event_mask = chEvtWaitOneTimeout(EVENT_MASK(0), chTimeUS2I(100 * MICROSECONDS_PER_MILLISECOND));
+  chprintf(stream, "\t\teventmask = 0x%08X (should be 1)\n", event_mask);
+  if (event_mask == EVENT_MASK(0)) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "read data based on interrupt...\n");
+  status = hmc5883l_lld_read_config(((ut_hmc5883ldata_t*)ut->data)->driver, &cfg, ((ut_hmc5883ldata_t*)ut->data)->timeout);
+  uint8_t mode = HMC5883L_LLD_MM_SINGLE;
+  cfg.mode = mode;
+  status |= hmc5883l_lld_write_config(((ut_hmc5883ldata_t*)ut->data)->driver, cfg, ((ut_hmc5883ldata_t*)ut->data)->timeout);
+  aosSysGetUptime(&start);
+  aosSysGetUptime(&t);
+  status |= hmc5883l_lld_read_data(((ut_hmc5883ldata_t*)ut->data)->driver, mdata, ((ut_hmc5883ldata_t*)ut->data)->timeout);
+  while (t - start < MICROSECONDS_PER_SECOND) {
+    event_mask = chEvtWaitOneTimeout(EVENT_MASK(0), chTimeUS2I(1000));
+    if (event_mask == EVENT_MASK(0)) {
+      status |= hmc5883l_lld_read_data(((ut_hmc5883ldata_t*)ut->data)->driver, mdata, ((ut_hmc5883ldata_t*)ut->data)->timeout);
+      data_reads++;
+      status = hmc5883l_lld_write_register(((ut_hmc5883ldata_t*)ut->data)->driver, HMC5883L_LLD_REGISTER_CONFIG_A+2, &mode, 1, ((ut_hmc5883ldata_t*)ut->data)->timeout);
+    }
+    aosSysGetUptime(&t);
+  }
+  chEvtUnregister(((ut_hmc5883ldata_t*)ut->data)->drdyEvtSrc, &el);
+  aosUtInfoMsg(stream,"Read data %u times in a second\n", data_reads);
+
+  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(HMC5883LDriver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_HMC5883L) && (AMIROLLD_CFG_HMC5883L == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_INA219_v1.c b/unittests/periphery-lld/src/ut_alld_INA219_v1.c
new file mode 100644
index 0000000..aa1885c
--- /dev/null
+++ b/unittests/periphery-lld/src/ut_alld_INA219_v1.c
@@ -0,0 +1,191 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_INA219) && (AMIROLLD_CFG_INA219 == 1)) || defined(__DOXYGEN__)
+
+#include <ut_alld_INA219_v1.h>
+#include <math.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+aos_utresult_t utAlldIna219Func(BaseSequentialStream* stream, aos_unittest_t* ut)
+{
+  aosDbgCheck(ut->data != NULL && ((ut_ina219data_t*)(ut->data))->inad != NULL);
+
+  // local variables
+  aos_utresult_t result = {0, 0};
+  uint32_t status;
+  uint16_t data[6];
+  uint16_t write_data = 0x1011;
+  uint16_t new_data[6];
+  uint16_t reset_data;
+  uint16_t test_calib = 0;
+  int16_t usensor_data = 0;
+  uint16_t busready = 0;
+  uint32_t power = 0;
+  int32_t shunt;
+  uint32_t bus;
+
+  chprintf(stream, "read registers...\n");
+  status = ina219_lld_read_register(((ut_ina219data_t*)ut->data)->inad, INA219_LLD_REGISTER_CONFIGURATION, data, 6, ((ut_ina219data_t*)ut->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "write registers...\n");
+  status = ina219_lld_write_register(((ut_ina219data_t*)ut->data)->inad, INA219_LLD_REGISTER_CONFIGURATION, &write_data, 1, ((ut_ina219data_t*)ut->data)->timeout);
+  status |= ina219_lld_read_register(((ut_ina219data_t*)ut->data)->inad, INA219_LLD_REGISTER_CONFIGURATION, new_data, 6, ((ut_ina219data_t*)ut->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS && new_data[0] == write_data) {
+    uint8_t errors = 0;
+    for (uint8_t dataIdx = 1; dataIdx < 6; dataIdx++) {
+      if (new_data[dataIdx] != data[dataIdx]) {
+        ++errors;
+      }
+    }
+    if (errors == 0) {
+      aosUtPassed(stream, &result);
+    } else {
+      aosUtFailed(stream, &result);
+    }
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "reset...\n");
+  status = ina219_lld_reset(((ut_ina219data_t*)ut->data)->inad, ((ut_ina219data_t*)ut->data)->timeout);
+  status |= ina219_lld_read_register(((ut_ina219data_t*)ut->data)->inad, INA219_LLD_REGISTER_CONFIGURATION, &reset_data, 1, ((ut_ina219data_t*)ut->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS && reset_data == 0x399F) {
+    aosUtPassed(stream, &result);
+  } else {
+    chprintf(stream, "\tfailed\n");
+    ++result.failed;
+  }
+
+  chprintf(stream, "read config...\n");
+  ina219_lld_cfg_t ina_config;
+  status = ina219_lld_read_config(((ut_ina219data_t*)ut->data)->inad, &ina_config, ((ut_ina219data_t*)ut->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "write config...\n");
+  ina_config.data = 0x7FFu;
+  status = ina219_lld_write_config(((ut_ina219data_t*)ut->data)->inad, ina_config, ((ut_ina219data_t*)ut->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+
+  chprintf(stream, "calibrate...\n");
+  ina219_lld_calib_input_t calib_in;
+  calib_in.shunt_resistance_0 = 0.1;
+  calib_in.max_expected_current_A = 0.075;
+  calib_in.current_lsb_uA = 10;
+  calib_in.cfg_reg = ina_config;
+  ina219_lld_calib_output_t calib_out;
+  status = ina219_lld_calibration(((ut_ina219data_t*)ut->data)->inad, &calib_in, &calib_out);
+  status |= ina219_lld_write_calibration(((ut_ina219data_t*)ut->data)->inad, calib_out.calibration & 0xFFFEu, ((ut_ina219data_t*)ut->data)->timeout);
+  status |= ina219_lld_write_calibration(((ut_ina219data_t*)ut->data)->inad, 0xA000, ((ut_ina219data_t*)ut->data)->timeout);
+  ina219_lld_cfg_t test_config;
+  ((ut_ina219data_t*)ut->data)->inad->current_lsb_uA = 0xA;
+  status |= ina219_lld_read_config(((ut_ina219data_t*)ut->data)->inad, &test_config, ((ut_ina219data_t*)ut->data)->timeout);
+  status |= ina219_lld_read_calibration(((ut_ina219data_t*)ut->data)->inad, &test_calib, ((ut_ina219data_t*)ut->data)->timeout);
+  while (!busready || power == 0) {
+    aosThdMSleep(20);
+    status |= ina219_lld_bus_conversion_ready(((ut_ina219data_t*)ut->data)->inad, &busready, ((ut_ina219data_t*)ut->data)->timeout);
+    status |= ina219_lld_read_power(((ut_ina219data_t*)ut->data)->inad, &power, ((ut_ina219data_t*)ut->data)->timeout);
+  }
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "read shunt voltage...\n");
+  status = ina219_lld_read_shunt_voltage(((ut_ina219data_t*)ut->data)->inad, &shunt, ((ut_ina219data_t*)ut->data)->timeout);
+  chprintf(stream, "\t\tshunt voltage: %fV\n", (float)shunt/1000000.f);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "read bus voltage (%u%% tolerance)...\n", (uint8_t)(((ut_ina219data_t*)ut->data)->tolerance * 100.f + 0.5f));
+  status = ina219_lld_read_bus_voltage(((ut_ina219data_t*)ut->data)->inad, &bus, ((ut_ina219data_t*)ut->data)->timeout);
+  chprintf(stream, "\t\tbus voltage: %fV\n", (float)bus/1000000.f);
+  if ((status == APAL_STATUS_SUCCESS) && (fabs(((float)bus/1000000.f) - ((ut_ina219data_t*)ut->data)->v_expected) < ((ut_ina219data_t*)ut->data)->v_expected * ((ut_ina219data_t*)ut->data)->tolerance)) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "read power...\n");
+  status = ina219_lld_read_power(((ut_ina219data_t*)ut->data)->inad, &power, ((ut_ina219data_t*)ut->data)->timeout);
+  chprintf(stream, "\t\tpower: %fW\n", (float)(power)/1000000.f);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "read current...\n");
+  status = ina219_lld_read_current(((ut_ina219data_t*)ut->data)->inad, &usensor_data, ((ut_ina219data_t*)ut->data)->timeout);
+  chprintf(stream, "\t\tcurrent: %fA\n", (float)(usensor_data)/1000000.f);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  aosUtInfoMsg(stream, "driver object memory footprint: %u bytes\n", sizeof(INA219Driver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_INA219) && (AMIROLLD_CFG_INA219 == 1) */
+
diff --git a/unittests/periphery-lld/src/ut_alld_L3G4200D_v1.c b/unittests/periphery-lld/src/ut_alld_L3G4200D_v1.c
new file mode 100644
index 0000000..cd216f2
--- /dev/null
+++ b/unittests/periphery-lld/src/ut_alld_L3G4200D_v1.c
@@ -0,0 +1,289 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_L3G4200D) && (AMIROLLD_CFG_L3G4200D == 1)) || defined(__DOXYGEN__)
+
+#include <ut_alld_L3G4200D_v1.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+/**
+ * @brief   L3G4200D unit test function.
+ *
+ * @param[in] stream  Stream for input/output.
+ * @param[in] ut      Unit test object.
+ *
+ * @return            Unit test result value.
+ */
+aos_utresult_t utAlldL3g4200dFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
+{
+  aosDbgCheck(ut->data != NULL && ((ut_l3g4200ddata_t*)(ut->data)) != NULL);
+
+  // local variables
+  aos_utresult_t result = {0, 0};
+  uint32_t status;
+  uint8_t data = 0;
+  uint8_t write_data[5];
+  uint8_t read_data[5];
+  int16_t sdata[3];
+  uint8_t status_reg;
+  eventmask_t event_mask;
+  bool success = false;
+  uint8_t fifo = 0x5F;
+  event_listener_t el;
+
+  for (uint8_t dataIdx = 0; dataIdx < 4; dataIdx++) {
+    write_data[dataIdx] = (dataIdx+1)*11;
+  }
+  write_data[4] = 0;
+
+  chprintf(stream, "check identity...\n");
+  status = l3g4200d_lld_read_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd, L3G4200D_LLD_REGISTER_WHO_AM_I, &data, 1);
+  if(status == APAL_STATUS_SUCCESS && data == L3G4200D_LLD_WHO_AM_I){
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X, data: %d\n", status, data);
+  }
+
+  chprintf(stream, "write register...\n");
+  status = l3g4200d_lld_write_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd, L3G4200D_LLD_REGISTER_CTRL_REG1, write_data, 1);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "read register...\n");
+  status = l3g4200d_lld_read_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd, L3G4200D_LLD_REGISTER_CTRL_REG1, &data, 1);
+  if (status == APAL_STATUS_SUCCESS && data == write_data[0]) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X, data: %d\n", status, data);
+  }
+
+  chprintf(stream, "write multiple registers...\n");
+  status = l3g4200d_lld_write_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd, L3G4200D_LLD_REGISTER_CTRL_REG1, write_data, 5);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "read multiple registers...\n");
+  status = l3g4200d_lld_read_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd, L3G4200D_LLD_REGISTER_CTRL_REG1, read_data, 5);
+  uint8_t errors = 0;
+  for (uint8_t dataIdx = 0; dataIdx < 5; dataIdx++) {
+    if (read_data[dataIdx] != write_data[dataIdx]) {
+      ++errors;
+    }
+  }
+  if (status == APAL_STATUS_SUCCESS && errors == 0) {
+    aosUtPassed(stream, &result);
+  } else {
+    for (uint8_t dataIdx = 0; dataIdx < 5; dataIdx++) {
+      chprintf(stream, "\t\tStatus: %d, CTRL_REG%d: %d, write_data: %d\n", status, dataIdx+1, read_data[dataIdx], write_data[dataIdx]);
+    }
+    aosUtFailedMsg(stream, &result, "0x%08X, errors: %d\n", status, errors);
+  }
+
+  chprintf(stream, "read config...\n");
+  l3g4200d_lld_cfg_t cfg;
+  status = l3g4200d_lld_read_config(((ut_l3g4200ddata_t*)(ut->data))->l3gd, &cfg);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "write config...\n");
+  cfg.registers.ctrl_reg1 = L3G4200D_LLD_PD | L3G4200D_LLD_DR_100_HZ | L3G4200D_LLD_BW_12_5 | L3G4200D_LLD_ZEN | L3G4200D_LLD_YEN | L3G4200D_LLD_XEN;
+  //cfg.registers.ctrl_reg1 = L3G4200D_LLD_PD | L3G4200D_LLD_DR_800_HZ | L3G4200D_LLD_BW_20 | L3G4200D_LLD_ZEN | L3G4200D_LLD_YEN | L3G4200D_LLD_XEN;
+  cfg.registers.ctrl_reg3 = 0x07;
+  cfg.registers.ctrl_reg5 |= L3G4200D_LLD_FIFO_EN;
+  status = l3g4200d_lld_write_config(((ut_l3g4200ddata_t*)(ut->data))->l3gd, cfg);
+  uint8_t reg1 = cfg.data[0];
+  status |= l3g4200d_lld_read_config(((ut_l3g4200ddata_t*)(ut->data))->l3gd, &cfg);
+  if (status == APAL_STATUS_SUCCESS && cfg.data[0] == reg1) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "read gyro data for five seconds...\n");
+  status = APAL_STATUS_OK;
+  for (uint8_t i = 0; i < 5; ++i) {
+    status |= l3g4200d_lld_read_all_data(((ut_l3g4200ddata_t*)(ut->data))->l3gd, sdata, &cfg);
+    chprintf(stream, "\t\tX = %6d\tY = %6d\tZ = %6d\n", sdata[0], sdata[1], sdata[2]);
+    aosThdSSleep(1);
+  }
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "read X axis for five seconds...\n");
+  status = APAL_STATUS_SUCCESS;
+  for (uint32_t i = 0; i <= 5; i++) {
+    status |= l3g4200d_lld_read_data(((ut_l3g4200ddata_t*)(ut->data))->l3gd, &(sdata[0]), L3G4200D_LLD_X_AXIS, &cfg);
+    chprintf(stream, "\t\tX = %6d\n", sdata[0]);
+    aosThdSSleep(1);
+  }
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "read Y axis for five seconds...\n");
+  status = APAL_STATUS_SUCCESS;
+  for (uint32_t i = 0; i <= 5; i++) {
+    status |= l3g4200d_lld_read_data(((ut_l3g4200ddata_t*)(ut->data))->l3gd, &(sdata[0]), L3G4200D_LLD_Y_AXIS, &cfg);
+    chprintf(stream, "\t\tY = %6d\n", sdata[0]);
+    aosThdSSleep(1);
+  }
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "read Z axis for five seconds...\n");
+  status = APAL_STATUS_SUCCESS;
+  for (uint32_t i = 0; i <= 5; i++) {
+    status |= l3g4200d_lld_read_data(((ut_l3g4200ddata_t*)(ut->data))->l3gd, &(sdata[0]), L3G4200D_LLD_Z_AXIS, &cfg);
+    chprintf(stream, "\t\tZ = %6d\n", sdata[0]);
+    aosThdSSleep(1);
+  }
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+  aosThdMSleep(10);
+
+  chprintf(stream, "read status register...\n");
+  status = l3g4200d_lld_read_status_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd, &status_reg);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "read interrupt config...\n");
+  l3g4200d_lld_int_cfg_t int_cfg;
+  status = l3g4200d_lld_read_int_config(((ut_l3g4200ddata_t*)(ut->data))->l3gd, &int_cfg);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "write interrupt config...\n");
+  int_cfg.registers.int1_tsh_xh = 10;
+  status = l3g4200d_lld_write_int_config(((ut_l3g4200ddata_t*)(ut->data))->l3gd, int_cfg);
+  l3g4200d_lld_int_cfg_t int_cfg2;
+  status |= l3g4200d_lld_read_int_config(((ut_l3g4200ddata_t*)(ut->data))->l3gd, &int_cfg2);
+  if (status == APAL_STATUS_SUCCESS && int_cfg.registers.int1_tsh_xh == 10) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "interrupt test: read fifo until empty...\n");
+  chEvtRegister(((ut_l3g4200ddata_t*)(ut->data))->src, &el, 0);
+  status = l3g4200d_lld_write_fifo_ctrl_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd,fifo);
+  fifo = 0;
+  status |= l3g4200d_lld_read_fifo_ctrl_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd,&fifo);
+  status |= l3g4200d_lld_read_all_data(((ut_l3g4200ddata_t*)(ut->data))->l3gd, sdata, &cfg);
+  chEvtGetAndClearFlags(&el);
+  aosThdSSleep(1);
+  chEvtGetAndClearFlags(&el);
+  success = false;
+  for (uint8_t i = 0; i < 200; i++) {
+    status |= l3g4200d_lld_read_all_data(((ut_l3g4200ddata_t*)(ut->data))->l3gd, sdata, &cfg);
+    event_mask = chEvtWaitAnyTimeout(~0, TIME_IMMEDIATE);
+    status |= l3g4200d_lld_read_fifo_src_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd,&fifo);
+    if (event_mask != 0 && ((fifo & L3G4200D_LLD_EMPTY) || fifo == 0)) {
+      success = true;
+      break;
+    }
+    aosThdMSleep(1);
+  }
+  if (status == APAL_STATUS_SUCCESS && success) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  fifo = 0x4A;
+  status |= l3g4200d_lld_write_fifo_ctrl_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd,fifo);
+  cfg.registers.ctrl_reg1 = L3G4200D_LLD_PD | L3G4200D_LLD_DR_800_HZ | L3G4200D_LLD_BW_20 | L3G4200D_LLD_ZEN | L3G4200D_LLD_YEN | L3G4200D_LLD_XEN;
+  cfg.registers.ctrl_reg3 = 0x04;
+  status |= l3g4200d_lld_write_config(((ut_l3g4200ddata_t*)(ut->data))->l3gd, cfg);
+  chprintf(stream, "interrupt test: wait until wtm reached...\n");
+  for (uint8_t i = 0; i < 200; i++) {
+    status |= l3g4200d_lld_read_all_data(((ut_l3g4200ddata_t*)(ut->data))->l3gd, sdata, &cfg);
+    event_mask = chEvtWaitAnyTimeout(~0, TIME_IMMEDIATE);
+    status |= l3g4200d_lld_read_fifo_src_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd,&fifo);
+    if (event_mask != 0 && (fifo & L3G4200D_LLD_WTM)) {
+      success = true;
+      break;
+    }
+    aosThdMSleep(10);
+  }
+  if (status == APAL_STATUS_SUCCESS && success) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chEvtUnregister(((ut_l3g4200ddata_t*)(ut->data))->src, &el);
+  aosThdMSleep(10);
+
+  aosUtInfoMsg(stream, "driver object memory footprint: %u bytes\n", sizeof(L3G4200DDriver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_L3G4200D) && (AMIROLLD_CFG_L3G4200D == 1) */
+
diff --git a/unittests/periphery-lld/src/ut_alld_LED_v1.c b/unittests/periphery-lld/src/ut_alld_LED_v1.c
new file mode 100644
index 0000000..b014c6b
--- /dev/null
+++ b/unittests/periphery-lld/src/ut_alld_LED_v1.c
@@ -0,0 +1,107 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_LED) && (AMIROLLD_CFG_LED == 1)) || defined(__DOXYGEN__)
+
+#include <ut_alld_LED_v1.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+/**
+ * @brief   LED unit test function.
+ *
+ * @param[in] stream  Stream for input/output.
+ * @param[in] ut      Unit test object.
+ *
+ * @return            Unit test result value.
+ */
+aos_utresult_t utAlldLedFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
+{
+  aosDbgCheck(ut->data != NULL);
+
+  // local variables
+  aos_utresult_t result = {0, 0};
+  uint32_t status = AOS_OK;
+
+  chprintf(stream, "lighting up for two seconds...\n");
+  led_lld_state_t state = LED_LLD_STATE_ON;
+  status = led_lld_set((LEDDriver*)ut->data, state);
+  aosThdSSleep(2);
+  status |= led_lld_get((LEDDriver*)ut->data, &state);
+  if (status == APAL_STATUS_OK && state == LED_LLD_STATE_ON) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "turning off for two seconds...\n");
+  state = LED_LLD_STATE_OFF;
+  status = led_lld_set((LEDDriver*)ut->data, state);
+  aosThdSSleep(2);
+  status |= led_lld_get((LEDDriver*)ut->data, &state);
+  if (status == APAL_STATUS_OK && state == LED_LLD_STATE_OFF) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "toggling for two seconds...\n");
+  status = led_lld_set((LEDDriver*)ut->data, LED_LLD_STATE_ON);
+  for (uint32_t i = 0; i < 2000/100; ++i) {
+    status |= led_lld_toggle((LEDDriver*)ut->data);
+    status |= led_lld_get((LEDDriver*)ut->data, &state);
+    status |= ((uint8_t)state != (i & 0x01u)) ? APAL_STATUS_ERROR : APAL_STATUS_OK;
+    aosThdMSleep(100);
+  }
+  status = led_lld_set((LEDDriver*)ut->data, LED_LLD_STATE_OFF);
+  if (status == APAL_STATUS_OK) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(LEDDriver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_LED) && (AMIROLLD_CFG_LED == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_LIS331DLH_v1.c b/unittests/periphery-lld/src/ut_alld_LIS331DLH_v1.c
new file mode 100644
index 0000000..78a6c4d
--- /dev/null
+++ b/unittests/periphery-lld/src/ut_alld_LIS331DLH_v1.c
@@ -0,0 +1,257 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_LIS331DLH) && (AMIROLLD_CFG_LIS331DLH == 1)) || defined(__DOXYGEN__)
+
+#include <ut_alld_LIS331DLH_v1.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+/**
+ * @brief   LIS331DLH unit test function.
+ *
+ * @param[in] stream  Stream for input/output.
+ * @param[in] ut      Unit test object.
+ *
+ * @return            Unit test result value.
+ */
+aos_utresult_t utAlldLis331dlhFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
+{
+  aosDbgCheck(ut->data != NULL && ((ut_lis331dlhdata_t*)(ut->data)) != NULL);
+
+  // local variables
+  aos_utresult_t result = {0, 0};
+  uint32_t status;
+  uint8_t data = 0;
+  uint8_t write_data[5];
+  uint8_t read_data[5];
+  uint8_t errors = 0;
+  uint8_t reg1;
+  int16_t sdata[3];
+  uint8_t status_reg;
+  lis331dlh_lld_int_cfg_t intcfg;
+  event_listener_t el;
+  eventmask_t event_mask;
+  uint8_t success = 0;
+
+  for (uint8_t dataIdx = 0; dataIdx < 4; dataIdx++) {
+    write_data[dataIdx] = (dataIdx+1)*11;
+  }
+  write_data[4] = 0;
+
+  chprintf(stream, "check identity...\n");
+  status = lis331dlh_lld_read_register(((ut_lis331dlhdata_t*)(ut->data))->lisd, LIS331DLH_LLD_REGISTER_WHO_AM_I, &data, 1);
+  if (status == APAL_STATUS_SUCCESS &&
+      data == LIS331DLH_LLD_WHO_AM_I) {
+    aosUtPassed(stream, &result);
+  } else {
+    chprintf(stream, "\tfailed\n");
+    aosUtFailedMsg(stream, &result, "0x%08X, data: %d\n", status, data);
+    ++result.failed;
+  }
+
+  chprintf(stream, "write register...\n");
+  status = lis331dlh_lld_write_register(((ut_lis331dlhdata_t*)(ut->data))->lisd, LIS331DLH_LLD_REGISTER_CTRL_REG1, write_data, 1);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "read register...\n");
+  status = lis331dlh_lld_read_register(((ut_lis331dlhdata_t*)(ut->data))->lisd, LIS331DLH_LLD_REGISTER_CTRL_REG1, &data, 1);
+  if (status == APAL_STATUS_SUCCESS && data == write_data[0]) {
+    aosUtPassed(stream, &result);
+  } else {
+    chprintf(stream, "\tfailed\n");
+    aosUtFailedMsg(stream, &result, "0x%08X, data: %d\n", status, data);
+    ++result.failed;
+  }
+
+  chprintf(stream, "write multiple registers...\n");
+  status = lis331dlh_lld_write_register(((ut_lis331dlhdata_t*)(ut->data))->lisd, LIS331DLH_LLD_REGISTER_CTRL_REG1, write_data, 5);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "read multiple registers...\n");
+  status = lis331dlh_lld_read_register(((ut_lis331dlhdata_t*)(ut->data))->lisd, LIS331DLH_LLD_REGISTER_CTRL_REG1, read_data, 5);
+  for (uint8_t dataIdx = 0; dataIdx < 5; dataIdx++) {
+    if (read_data[dataIdx] != write_data[dataIdx]) {
+      ++errors;
+    }
+  }
+  if (status == APAL_STATUS_SUCCESS &&
+      errors == 0) {
+    aosUtPassed(stream, &result);
+  } else {
+    chprintf(stream, "\tfailed\n");
+    for (uint8_t dataIdx = 0; dataIdx < 5; dataIdx++) {
+      chprintf(stream, "\t\tStatus: %d, CTRL_REG%d: %d, write_data: %d\n", status, dataIdx+1, read_data[dataIdx], write_data[dataIdx]);
+    }
+    aosUtFailedMsg(stream, &result, "0x%08X, errors: %d\n", status, errors);
+  }
+
+  chprintf(stream, "read config...\n");
+  lis331dlh_lld_cfg_t cfg;
+  status = lis331dlh_lld_read_config(((ut_lis331dlhdata_t*)(ut->data))->lisd, &cfg);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "write config...\n");
+  cfg.registers.ctrl_reg1 = LIS331DLH_LLD_PM_ODR |
+      LIS331DLH_LLD_DR_1000HZ_780LP |
+      LIS331DLH_LLD_X_AXIS_ENABLE |
+      LIS331DLH_LLD_Y_AXIS_ENABLE |
+      LIS331DLH_LLD_Z_AXIS_ENABLE;
+  cfg.registers.ctrl_reg3 = 0x00;
+  status = lis331dlh_lld_write_config(((ut_lis331dlhdata_t*)(ut->data))->lisd, &cfg);
+  reg1 = cfg.data[0];
+  lis331dlh_lld_read_config(((ut_lis331dlhdata_t*)(ut->data))->lisd, &cfg);
+  if (status == APAL_STATUS_SUCCESS && cfg.data[0] == reg1) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "read acceleration for five seconds...\n");
+  status = APAL_STATUS_SUCCESS;
+  for (uint8_t i = 0; i < 5; ++i) {
+    status |= lis331dlh_lld_read_all_data(((ut_lis331dlhdata_t*)(ut->data))->lisd, sdata, &cfg);
+    chprintf(stream, "\t\tX = %6d\tY = %6d\tZ = %6d\n", sdata[0], sdata[1], sdata[2]);
+    aosThdSSleep(1);
+  }
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "read X acceleration for five seconds...\n");
+  status = APAL_STATUS_SUCCESS;
+  for (uint8_t i = 0; i < 5; ++i) {
+    status |= lis331dlh_lld_read_data(((ut_lis331dlhdata_t*)(ut->data))->lisd, &(sdata[0]), LIS331DLH_LLD_X_AXIS, &cfg);
+    chprintf(stream, "\t\tX = %6d\n", sdata[0]);
+    aosThdSSleep(1);
+  }
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "read Y acceleration for five seconds...\n");
+  status = APAL_STATUS_SUCCESS;
+  for (uint8_t i = 0; i < 5; ++i) {
+    status |= lis331dlh_lld_read_data(((ut_lis331dlhdata_t*)(ut->data))->lisd, &(sdata[0]), LIS331DLH_LLD_Y_AXIS, &cfg);
+    chprintf(stream, "\t\tY = %6d\n", sdata[0]);
+    aosThdSSleep(1);
+  }
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "read Z acceleration for five seconds...\n");
+  status = APAL_STATUS_SUCCESS;
+  for (uint8_t i = 0; i < 5; ++i) {
+    status |= lis331dlh_lld_read_data(((ut_lis331dlhdata_t*)(ut->data))->lisd, &(sdata[0]), LIS331DLH_LLD_Z_AXIS, &cfg);
+    chprintf(stream, "\t\tZ = %6d\n", sdata[0]);
+    aosThdSSleep(1);
+  }
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "read status register...\n");
+  status = lis331dlh_lld_read_status_register(((ut_lis331dlhdata_t*)(ut->data))->lisd, &status_reg);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "interrupt...\n");
+  intcfg.cfg_reg = LIS331DLH_LLD_INT_CFG_X_HIGH_ENABLE | LIS331DLH_LLD_INT_CFG_Y_HIGH_ENABLE | LIS331DLH_LLD_INT_CFG_Z_HIGH_ENABLE;
+  intcfg.threshold = 10;
+  intcfg.duration = 1;
+  lis331dlh_lld_write_int_config(((ut_lis331dlhdata_t*)(ut->data))->lisd, &intcfg, LIS331DLH_LLD_INT1);
+  aosThdSSleep(1);
+  chEvtRegister(((ut_lis331dlhdata_t*)(ut->data))->src, &el, 3);
+  chprintf(stream, "\t\tmove the AMiRo now to generate interrupts\n");
+  aosThdSSleep(1);
+  for (uint8_t i = 0; i < 10; i++) {
+    event_mask = chEvtWaitOneTimeout(EVENT_MASK(3), TIME_IMMEDIATE);
+    status |= lis331dlh_lld_read_all_data(((ut_lis331dlhdata_t*)(ut->data))->lisd, sdata, &cfg);
+    status = lis331dlh_lld_read_register(((ut_lis331dlhdata_t*)(ut->data))->lisd, LIS331DLH_LLD_REGISTER_INT1_SOURCE, &data, 1);
+    eventflags_t flags = chEvtGetAndClearFlags(&el);
+    if (event_mask == EVENT_MASK(3) && (flags & ((ut_lis331dlhdata_t*)(ut->data))->evtflags)) {
+      ++success;
+      chprintf(stream, "\t\tX = %6d INTERRUPT\n", sdata[0]);
+    } else {
+      chprintf(stream, "\t\tX = %6d\n", sdata[0]);
+    }
+    aosThdSSleep(1);
+  }
+  event_mask = chEvtWaitOneTimeout(EVENT_MASK(3), TIME_IMMEDIATE);
+  chEvtUnregister(((ut_lis331dlhdata_t*)(ut->data))->src, &el);
+  if (status == APAL_STATUS_SUCCESS && success > 0) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  aosUtInfoMsg(stream, "driver object memory footprint: %u bytes\n", sizeof(LIS331DLHDriver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_LIS331DLH) && (AMIROLLD_CFG_LIS331DLH == 1) */
+
diff --git a/unittests/periphery-lld/src/ut_alld_LTC4412_v1.c b/unittests/periphery-lld/src/ut_alld_LTC4412_v1.c
new file mode 100644
index 0000000..e6236ae
--- /dev/null
+++ b/unittests/periphery-lld/src/ut_alld_LTC4412_v1.c
@@ -0,0 +1,89 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_LTC4412) && (AMIROLLD_CFG_LTC4412 == 1)) || defined(__DOXYGEN__)
+
+#include <ut_alld_LTC4412_v1.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+aos_utresult_t utAlldLtc4412Func(BaseSequentialStream* stream, aos_unittest_t* ut)
+{
+  aosDbgCheck(ut->data != NULL);
+
+  // local variables
+  aos_utresult_t result = {0,0};
+  uint32_t status;
+
+  chprintf(stream, "read ctrl pin... \n");
+  ltc4412_lld_ctrl_t ctrl;
+  status = ltc4412_lld_get_ctrl((LTC4412Driver*)ut->data, &ctrl);
+  if(status == APAL_STATUS_SUCCESS){
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "write ctrl pin... \n");
+  status = ltc4412_lld_set_ctrl((LTC4412Driver*)ut->data, LTC4412_LLD_CTRL_ACTIVE);
+  status |= ltc4412_lld_get_ctrl((LTC4412Driver*)ut->data, &ctrl);
+  if (status == APAL_STATUS_SUCCESS && ctrl == LTC4412_LLD_CTRL_ACTIVE) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "read stat pin... \n");
+  ltc4412_lld_stat_t stat;
+  status = ltc4412_lld_get_stat((LTC4412Driver*)ut->data, &stat);
+  if(status == APAL_STATUS_SUCCESS){
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(LTC4412Driver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_LTC4412) && (AMIROLLD_CFG_LTC4412 == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_MPR121_v1.c b/unittests/periphery-lld/src/ut_alld_MPR121_v1.c
new file mode 100644
index 0000000..0cd380c
--- /dev/null
+++ b/unittests/periphery-lld/src/ut_alld_MPR121_v1.c
@@ -0,0 +1,186 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_MPR121) && (AMIROLLD_CFG_MPR121 == 1)) || defined(__DOXYGEN__)
+
+#include <ut_alld_MPR121_v1.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+#define INTERRUPT_EVENT_ID            1
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+aos_utresult_t utAlldMpr121Func(BaseSequentialStream* stream, aos_unittest_t* ut)
+{
+  aosDbgCheck(ut->data != NULL && ((ut_mpr121data_t*)ut->data)->mprd != NULL);
+
+  // local variables
+  aos_utresult_t result = {0, 0};
+  uint32_t status;
+  mpr121_lld_config_t cfg;
+  uint8_t data, wdata, rdata;
+  uint16_t edata[4];
+  uint8_t tstate = 0;
+  event_listener_t event_listener;
+  aos_timestamp_t tstart, tcurrent, tend;
+
+  chprintf(stream, "soft reset...\n");
+  status = mpr121_lld_soft_reset(((ut_mpr121data_t*)ut->data)->mprd, ((ut_mpr121data_t*)ut->data)->timeout);
+  status |= mpr121_lld_read_config(((ut_mpr121data_t*)ut->data)->mprd, &cfg, ((ut_mpr121data_t*)ut->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS && cfg.registers.ele_config == 0) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "read register...\n");
+  status = mpr121_lld_read_register(((ut_mpr121data_t*)ut->data)->mprd, MPR121_LLD_REGISTER_CONFIG_2, 0, 1, &data, ((ut_mpr121data_t*)ut->data)->timeout);
+  chprintf(stream, "\t\tdata: 0x%02X\n", data);
+  if (status == APAL_STATUS_SUCCESS && data == (MPR121_LLD_CDT_0_5 | MPR121_LLD_ESI_16)) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "write register...\n");
+  wdata = MPR121_LLD_CDT_32 | MPR121_LLD_SFI_10 | MPR121_LLD_ESI_16;
+  status = mpr121_lld_write_register(((ut_mpr121data_t*)ut->data)->mprd, MPR121_LLD_REGISTER_CONFIG_2, 0, 1, &wdata, ((ut_mpr121data_t*)ut->data)->timeout);
+  aosThdMSleep(500);
+  status |= mpr121_lld_read_register(((ut_mpr121data_t*)ut->data)->mprd, MPR121_LLD_REGISTER_CONFIG_2, 0, 1, &rdata, ((ut_mpr121data_t*)ut->data)->timeout);
+  chprintf(stream, "\t\tdata: 0x%02X\n", rdata);
+  status |= mpr121_lld_write_register(((ut_mpr121data_t*)ut->data)->mprd, MPR121_LLD_REGISTER_CONFIG_2, 0, 1, &data, ((ut_mpr121data_t*)ut->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS && rdata == wdata) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "read config...\n");
+  status = mpr121_lld_read_config(((ut_mpr121data_t*)ut->data)->mprd, &cfg, ((ut_mpr121data_t*)ut->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS && cfg.registers.config_1 == 0x10 && cfg.registers.config_2 == 0x24) {
+    aosUtPassed(stream, &result);
+  } else {
+    chprintf(stream, "\t\tconfig 1: 0x%02X\n", cfg.registers.config_1);
+    chprintf(stream, "\t\tconfig 2: 0x%02X\n", cfg.registers.config_2);
+    mpr121_lld_read_register(((ut_mpr121data_t*)ut->data)->mprd, MPR121_LLD_REGISTER_CONFIG_1, 0, 1, &rdata, ((ut_mpr121data_t*)ut->data)->timeout);
+    chprintf(stream, "\t\tconfig 1: 0x%02X\n", rdata);
+    mpr121_lld_read_register(((ut_mpr121data_t*)ut->data)->mprd, MPR121_LLD_REGISTER_CONFIG_2, 0, 1, &rdata, ((ut_mpr121data_t*)ut->data)->timeout);
+    chprintf(stream, "\t\tconfig 2: 0x%02X\n", rdata);
+    for (uint8_t valueIdx = 0; valueIdx < 8; valueIdx++) {
+      chprintf(stream, "\t\tdata %d: 0x%02X\n", valueIdx, cfg.values[valueIdx]);
+    }
+    chprintf(stream, "ele_config: 0x%02X\n", cfg.registers.ele_config);
+    chprintf(stream, "config_1: 0x%02X\n", cfg.registers.config_1);
+    chprintf(stream, "config_2: 0x%02X\n", cfg.registers.config_2);
+    chprintf(stream, "target_level: 0x%02X\n", cfg.registers.target_level);
+    chprintf(stream, "low_side_limit: 0x%02X\n", cfg.registers.low_side_limit);
+    chprintf(stream, "up_side_limit: 0x%02X\n", cfg.registers.up_side_limit);
+    chprintf(stream, "auto_config_2: 0x%02X\n", cfg.registers.auto_config_2);
+    chprintf(stream, "auto_config_1: 0x%02X\n", cfg.registers.auto_config_1);
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "write config...\n");
+  cfg.registers.ele_config = MPR121_LLD_CL_ON_ALL | MPR121_LLD_ELEPROX_0 | 4;
+  cfg.registers.config_1 = MPR121_LLD_FFI_18 | 16;
+  cfg.registers.config_2 = MPR121_LLD_CDT_1 | MPR121_LLD_SFI_10 | MPR121_LLD_ESI_32;
+  cfg.registers.up_side_limit = 0x96u;
+  cfg.registers.low_side_limit = 0x58u;
+  cfg.registers.target_level = 0x68u;
+  cfg.registers.auto_config_1 = MPR121_LLD_FFI_18 | MPR121_LLD_RETRY_2 | MPR121_LLD_BVA_ON_ALL | MPR121_LLD_AC_RECONF_EN;
+  status = mpr121_lld_write_config(((ut_mpr121data_t*)ut->data)->mprd, cfg, ((ut_mpr121data_t*)ut->data)->timeout);
+  aosThdMSleep(500);
+  status |= mpr121_lld_read_config(((ut_mpr121data_t*)ut->data)->mprd, &cfg, ((ut_mpr121data_t*)ut->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS && cfg.registers.up_side_limit == 0x96u) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "read filtered data for ten seconds...\n");
+  chprintf(stream, "(values should change if you touch the sensors now)\n");
+  for (uint8_t i = 0; i < 10; i++) {
+    status = mpr121_lld_read_filtered_data(((ut_mpr121data_t*)ut->data)->mprd, 0, 4, edata, ((ut_mpr121data_t*)ut->data)->timeout);
+    chprintf(stream, "\t\t0x%04X | 0x%04X | 0x%04X | 0x%04X\n", edata[0], edata[1], edata[2], edata[3]);
+    aosThdSSleep(1);
+  }
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "test interrupts...\n");
+  status = AOS_OK;
+  chEvtRegister(((ut_mpr121data_t*)ut->data)->evtsource, &event_listener, INTERRUPT_EVENT_ID);
+  aosSysGetUptime(&tstart);
+  tend = tstart + (30 * MICROSECONDS_PER_SECOND);
+  do {
+    aosSysGetUptime(&tcurrent);
+    const aos_timestamp_t ttimeout = MICROSECONDS_PER_SECOND - ((tcurrent - tstart) % MICROSECONDS_PER_SECOND);
+    const eventmask_t emask = chEvtWaitOneTimeout(EVENT_MASK(INTERRUPT_EVENT_ID), chTimeUS2I(ttimeout));
+    const eventflags_t eflags = chEvtGetAndClearFlags(&event_listener);
+    if (emask == EVENT_MASK(INTERRUPT_EVENT_ID) && eflags == ((ut_mpr121data_t*)ut->data)->evtflags) {
+      // interrupt detected
+      status |= mpr121_lld_read_register(((ut_mpr121data_t*)ut->data)->mprd, MPR121_LLD_REGISTER_TOUCH_STATUS, 0, 1, &tstate, ((ut_mpr121data_t*)ut->data)->timeout);
+      chprintf(stream, "\t\tinterrupt detected\n");
+      chprintf(stream, "\t\ttstate: %X %X %X %X\n", tstate & 1, (tstate >> 1) & 1, (tstate >> 2) & 1, (tstate >> 3) & 1);
+    }
+    else if (emask == 0) {
+      // timeout
+      status |= mpr121_lld_read_register(((ut_mpr121data_t*)ut->data)->mprd, MPR121_LLD_REGISTER_TOUCH_STATUS, 0, 1, &tstate, ((ut_mpr121data_t*)ut->data)->timeout);
+      chprintf(stream, "\t\ttstate: %X %X %X %X\n", tstate & 1, (tstate >> 1) & 1, (tstate >> 2) & 1, (tstate >> 3) & 1);
+    }
+    aosSysGetUptime(&tcurrent);
+  } while (tcurrent < tend);
+  chEvtUnregister(((ut_mpr121data_t*)ut->data)->evtsource, &event_listener);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(MPR121Driver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_MPR121) && (AMIROLLD_CFG_MPR121 == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_MPU6050_v1.c b/unittests/periphery-lld/src/ut_alld_MPU6050_v1.c
new file mode 100644
index 0000000..5ebff21
--- /dev/null
+++ b/unittests/periphery-lld/src/ut_alld_MPU6050_v1.c
@@ -0,0 +1,67 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2018  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_MPU6050) && (AMIROLLD_CFG_MPU6050 == 1)) || defined(__DOXYGEN__)
+
+#include <ut_alld_MPU6050_v1.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+aos_utresult_t utAlldMpu6050Func(BaseSequentialStream* stream, aos_unittest_t* ut)
+{
+    aos_utresult_t result = {0, 0};
+
+    const mpu6050_lld_register_t addr = 0x75; // register to read from
+    uint16_t const data; // buffer for data
+    const uint8_t num = 1; // read one register
+    const apalTime_t timeout = 100; // TODO: Check units
+
+
+    mpu6050_lld_read_register(((ut_mpu6050data_t*)ut->data)->mpu, addr, &data, num, ((ut_mpu6050data_t*)ut->data)->timeout);
+            /** registers to read:
+            0x75: WHO AM I (should return I2C-Adress without the last bit, which is determined by the state of the AO pin!) returns 0x68
+                      */
+
+  return result; // TODO: Adjust
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_MPU6050) && (AMIROLLD_CFG_MPU6050 == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_PCA9544A_v1.c b/unittests/periphery-lld/src/ut_alld_PCA9544A_v1.c
new file mode 100644
index 0000000..dfa4a09
--- /dev/null
+++ b/unittests/periphery-lld/src/ut_alld_PCA9544A_v1.c
@@ -0,0 +1,124 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_PCA9544A) && (AMIROLLD_CFG_PCA9544A == 1)) || defined(__DOXYGEN__)
+
+#include <ut_alld_PCA9544A_v1.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+aos_utresult_t utAlldPca9544aFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
+{
+  aosDbgCheck(ut->data != NULL && ((ut_pca9544adata_t*)ut->data)->driver != NULL);
+
+  // local variables
+  aos_utresult_t result = {0,0};
+  uint32_t status;
+  uint8_t ctrlreg;
+  pca9544a_lld_intstatus_t interrupt;
+  pca9544a_lld_chid_t channel;
+  uint8_t test_mask = 0x00u;
+
+  chprintf(stream, "reading control register...\n");
+  status = pca9544a_lld_read(((ut_pca9544adata_t*)ut->data)->driver, &ctrlreg, ((ut_pca9544adata_t*)ut->data)->timeout);
+  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "writing control register...\n");
+  status = APAL_STATUS_OK;
+  status |= pca9544a_lld_write(((ut_pca9544adata_t*)ut->data)->driver, (uint8_t)(PCA9544A_LLD_CTRLREG_EN), ((ut_pca9544adata_t*)ut->data)->timeout);
+  status |= pca9544a_lld_read(((ut_pca9544adata_t*)ut->data)->driver, &ctrlreg, ((ut_pca9544adata_t*)ut->data)->timeout);
+  if ((status == APAL_STATUS_OK  || status == APAL_STATUS_WARNING) && ctrlreg == PCA9544A_LLD_CTRLREG_EN) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X, 0x%X\n", status, ctrlreg);
+  }
+
+  chprintf(stream, "reading interrupt status...\n");
+  status = pca9544a_lld_getintstatus(((ut_pca9544adata_t*)ut->data)->driver, &interrupt, ((ut_pca9544adata_t*)ut->data)->timeout);
+  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
+    aosUtPassedMsg(stream, &result, "0x%08X\n", interrupt);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "reading current channel...\n");
+  status = pca9544a_lld_getcurrentchannel(((ut_pca9544adata_t*)ut->data)->driver, &channel, ((ut_pca9544adata_t*)ut->data)->timeout);
+  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
+    aosUtPassedMsg(stream, &result, "0x%08X\n", channel);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "setting current channel...\n");
+  status = APAL_STATUS_OK;
+  status |= pca9544a_lld_setchannel(((ut_pca9544adata_t*)ut->data)->driver, PCA9544A_LLD_CH0, ((ut_pca9544adata_t*)ut->data)->timeout);
+  status |= pca9544a_lld_getcurrentchannel(((ut_pca9544adata_t*)ut->data)->driver, &channel, ((ut_pca9544adata_t*)ut->data)->timeout);
+  test_mask |= (channel != PCA9544A_LLD_CH0) ? 0x01u : 0x00u;
+  status |= pca9544a_lld_setchannel(((ut_pca9544adata_t*)ut->data)->driver, PCA9544A_LLD_CH1, ((ut_pca9544adata_t*)ut->data)->timeout);
+  status |= pca9544a_lld_getcurrentchannel(((ut_pca9544adata_t*)ut->data)->driver, &channel, ((ut_pca9544adata_t*)ut->data)->timeout);
+  test_mask |= (channel != PCA9544A_LLD_CH1) ? 0x02u : 0x00u;
+  status |= pca9544a_lld_setchannel(((ut_pca9544adata_t*)ut->data)->driver, PCA9544A_LLD_CH2, ((ut_pca9544adata_t*)ut->data)->timeout);
+  status |= pca9544a_lld_getcurrentchannel(((ut_pca9544adata_t*)ut->data)->driver, &channel, ((ut_pca9544adata_t*)ut->data)->timeout);
+  test_mask |= (channel != PCA9544A_LLD_CH2) ? 0x04u : 0x00u;
+  status |= pca9544a_lld_setchannel(((ut_pca9544adata_t*)ut->data)->driver, PCA9544A_LLD_CH3, ((ut_pca9544adata_t*)ut->data)->timeout);
+  status |= pca9544a_lld_getcurrentchannel(((ut_pca9544adata_t*)ut->data)->driver, &channel, ((ut_pca9544adata_t*)ut->data)->timeout);
+  test_mask |= (channel != PCA9544A_LLD_CH3) ? 0x08u : 0x00u;
+  status |= pca9544a_lld_setchannel(((ut_pca9544adata_t*)ut->data)->driver, PCA9544A_LLD_CH_NONE, ((ut_pca9544adata_t*)ut->data)->timeout);
+  status |= pca9544a_lld_getcurrentchannel(((ut_pca9544adata_t*)ut->data)->driver, &channel, ((ut_pca9544adata_t*)ut->data)->timeout);
+  test_mask |= (channel != PCA9544A_LLD_CH_NONE) ? 0x10u : 0x00u;
+  if ((status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) && test_mask == 0x00u) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X, 0x%X\n", status, test_mask);
+  }
+
+  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(PCA9544ADriver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_PCA9544A) && (AMIROLLD_CFG_PCA9544A == 1) */
+
diff --git a/unittests/periphery-lld/src/ut_alld_PCAL6524_v1.c b/unittests/periphery-lld/src/ut_alld_PCAL6524_v1.c
new file mode 100644
index 0000000..e4fda2e
--- /dev/null
+++ b/unittests/periphery-lld/src/ut_alld_PCAL6524_v1.c
@@ -0,0 +1,165 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_PCAL6524) && (AMIROLLD_CFG_PCAL6524 == 1)) || defined(__DOXYGEN__)
+
+#include <ut_alld_PCAL6524_v1.h>
+#include <string.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+aos_utresult_t utAlldPcal6524Func(BaseSequentialStream* stream, aos_unittest_t *ut)
+{
+  aosDbgCheck((ut->data != NULL) &&
+              (((ut_pcal6524data_t*)ut->data)->pcal6524d != NULL));
+
+  // local variables
+  aos_utresult_t result = {0, 0};
+  uint32_t status;
+  uint8_t buffer[24];
+  memset(buffer, 0xAA, sizeof(buffer));
+
+// This test is currently not supported. See PCAL6524 driver implementation for further information.
+//  chprintf(stream, "reading device ID...\n");
+//  status = pcal6524_lld_read_id(((ut_pcal6524data_t*)ut->data)->pcal6524d, buffer, ((ut_pcal6524data_t*)ut->data)->timeout);
+//  chprintf(stream, "\t\traw: 0x%02X 0x%02X 0x%02X\n", buffer[0], buffer[1], buffer[2]);
+//  chprintf(stream, "\t\tname:     0x%03X\n", ((pcal6524_lld_deviceid_t*)buffer)->name);
+//  chprintf(stream, "\t\tpart:     0x%03X\n", ((pcal6524_lld_deviceid_t*)buffer)->part);
+//  chprintf(stream, "\t\trevision: 0x%01X\n", ((pcal6524_lld_deviceid_t*)buffer)->revision);
+//  if ((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) {
+//    aosUtPassed(stream, &result);
+//  } else {
+//    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+//  }
+
+  chprintf(stream, "reading register...\n");
+  status = pcal6524_lld_read_reg(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_SWITCHDEBOUNCECOUNT, buffer, ((ut_pcal6524data_t*)ut->data)->timeout);
+  chprintf(stream, "\t\tdebounce count: %u\n", buffer[0]);
+  if ((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "writing register...\n");
+  buffer[3] = 0xFF;
+  status = pcal6524_lld_write_reg(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_SWITCHDEBOUNCECOUNT, buffer[3], ((ut_pcal6524data_t*)ut->data)->timeout);
+  status |= pcal6524_lld_read_reg(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_SWITCHDEBOUNCECOUNT, &buffer[4], ((ut_pcal6524data_t*)ut->data)->timeout);
+  status |= pcal6524_lld_write_reg(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_SWITCHDEBOUNCECOUNT, buffer[0], ((ut_pcal6524data_t*)ut->data)->timeout);
+  status |= pcal6524_lld_read_reg(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_SWITCHDEBOUNCECOUNT, &buffer[1], ((ut_pcal6524data_t*)ut->data)->timeout);
+  if (((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) &&
+      ((buffer[1] == buffer[0]) && (buffer[4] == buffer[3]))) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "reading group...\n");
+  status = pcal6524_lld_read_group(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUTDRIVESTRENGTH_P0A, buffer, ((ut_pcal6524data_t*)ut->data)->timeout);
+  chprintf(stream, "\t\toutput drive strength: 0x%04X 0x%04X 0x%04X\n",
+           (((uint16_t)buffer[0]) << 8) | buffer[1],
+           (((uint16_t)buffer[2]) << 8) | buffer[3],
+           (((uint16_t)buffer[4]) << 8) | buffer[5]);
+  if ((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "writing group...\n");
+  memset(&buffer[6], PCAL6524_LL_OUTPUTDRIVESTRENGTH_0_25, 6);
+  status = pcal6524_lld_write_group(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUTDRIVESTRENGTH_P0A, &buffer[6], ((ut_pcal6524data_t*)ut->data)->timeout);
+  status |= pcal6524_lld_read_group(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUTDRIVESTRENGTH_P0A, &buffer[12], ((ut_pcal6524data_t*)ut->data)->timeout);
+  status |= pcal6524_lld_write_group(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUTDRIVESTRENGTH_P0A, &buffer[0], ((ut_pcal6524data_t*)ut->data)->timeout);
+  status |= pcal6524_lld_read_group(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUTDRIVESTRENGTH_P0A, &buffer[18], ((ut_pcal6524data_t*)ut->data)->timeout);
+  if (((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) &&
+      ((memcmp(&buffer[12], &buffer[6], 6) == 0) && (memcmp(&buffer[18], &buffer[0], 6) == 0))) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "reading continuously...\n");
+  // read the following registers continously (24 bytes):
+  // output 0-3 + polarity inversions 0-3 + configuration 0-3 + output drive strength 0A-2B + input latch 0-3 + pupd enable 0-3 + pupd selection 0-3
+  status = pcal6524_lld_read_continuous(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUT_P0, buffer, 24, ((ut_pcal6524data_t*)ut->data)->timeout);
+  chprintf(stream, "\t\toutput: 0x%02X 0x%02X 0x%02X\n", buffer[0], buffer[1], buffer[2]);
+  chprintf(stream, "\t\tpolarity inversion: 0x%02X 0x%02X 0x%02X\n", buffer[3], buffer[4], buffer[5]);
+  chprintf(stream, "\t\tconfiguration: 0x%02X 0x%02X 0x%02X\n", buffer[6], buffer[7], buffer[8]);
+  chprintf(stream, "\t\toutput drive strength: 0x%04X 0x%04X 0x%04X\n",
+           (((uint16_t)buffer[9]) << 8) | buffer[10],
+           (((uint16_t)buffer[11]) << 8) | buffer[12],
+           (((uint16_t)buffer[13]) << 8) | buffer[14]);
+  chprintf(stream, "\t\tinput latch: 0x%02X 0x%02X 0x%02X\n", buffer[15], buffer[16], buffer[17]);
+  chprintf(stream, "\t\tpupd enable: 0x%02X 0x%02X 0x%02X\n", buffer[18], buffer[19], buffer[20]);
+  chprintf(stream, "\t\tpupd selection: 0x%02X 0x%02X 0x%02X\n", buffer[21], buffer[22], buffer[23]);
+  if ((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "writing continuously...\n");
+  {
+    uint8_t writebuffer[24];
+    uint8_t readbuffer[2][24];
+    // copy the read configuration but set the output drive strength to factor 0.25
+    memcpy(writebuffer, buffer, sizeof(buffer));
+    memset(&writebuffer[9], PCAL6524_LL_OUTPUTDRIVESTRENGTH_0_25, 6);
+    status = pcal6524_lld_write_continuous(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUT_P0, writebuffer, 24, ((ut_pcal6524data_t*)ut->data)->timeout);
+    status |= pcal6524_lld_read_continuous(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUT_P0, readbuffer[0], 24, ((ut_pcal6524data_t*)ut->data)->timeout);
+    status |= pcal6524_lld_write_continuous(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUT_P0, buffer, 24, ((ut_pcal6524data_t*)ut->data)->timeout);
+    status |= pcal6524_lld_read_continuous(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUT_P0, readbuffer[1], 24, ((ut_pcal6524data_t*)ut->data)->timeout);
+    if (((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) &&
+        ((memcmp(writebuffer, readbuffer[0], 24) == 0) && (memcmp(buffer, readbuffer[1], 24) == 0))) {
+      aosUtPassed(stream, &result);
+    } else {
+      aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+    }
+  }
+
+  aosUtInfoMsg(stream, "driver object memory footprint: %u bytes\n", sizeof(PCAL6524Driver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_PCAL6524) && (AMIROLLD_CFG_PCAL6524 == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_PKxxxExxx_v1.c b/unittests/periphery-lld/src/ut_alld_PKxxxExxx_v1.c
new file mode 100644
index 0000000..e304403
--- /dev/null
+++ b/unittests/periphery-lld/src/ut_alld_PKxxxExxx_v1.c
@@ -0,0 +1,80 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_PKxxxExxx) && (AMIROLLD_CFG_PKxxxExxx == 1)) || defined(__DOXYGEN__)
+
+#include <ut_alld_PKxxxExxx_v1.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+aos_utresult_t utAlldPkxxxexxxFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
+{
+  aosDbgCheck(ut->data != NULL && ((ut_pkxxxexxx_t*)ut->data)->driver != NULL);
+
+  // local variables
+  aos_utresult_t result = {0, 0};
+  uint32_t status;
+
+  chprintf(stream, "checking PWM configuration...\n");
+  status = pkxxxexxx_lld_checkPWMconfiguration(((ut_pkxxxexxx_t*)ut->data)->driver);
+  if (status == APAL_STATUS_OK) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+    // abort at this point
+    return result;
+  }
+
+  chprintf(stream, "buzzing for one second...\n");
+  status = pkxxxexxx_lld_enable(((ut_pkxxxexxx_t*)ut->data)->driver, ((ut_pkxxxexxx_t*)ut->data)->channel, true);
+  aosThdSSleep(1);
+  status |= pkxxxexxx_lld_enable(((ut_pkxxxexxx_t*)ut->data)->driver, ((ut_pkxxxexxx_t*)ut->data)->channel, false);
+  if (status == APAL_STATUS_OK) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  return result;
+}
+
+#endif /* AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_PKxxxExxx) && (AMIROLLD_CFG_PKxxxExxx == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_TLC5947_v1.c b/unittests/periphery-lld/src/ut_alld_TLC5947_v1.c
new file mode 100644
index 0000000..a57a41c
--- /dev/null
+++ b/unittests/periphery-lld/src/ut_alld_TLC5947_v1.c
@@ -0,0 +1,199 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TLC5947) && (AMIROLLD_CFG_TLC5947 == 1)) || defined(__DOXYGEN__)
+
+#include <ut_alld_TLC5947_v1.h>
+#include <string.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+/**
+ * @brief   TLC9547 unit test function
+ *
+ * @param[in] stream  Stream for input/output.
+ * @param[in] ut      Unit test object.
+ *
+ * @return            Unit test result value.
+ */
+aos_utresult_t utAlldTlc5947Func(BaseSequentialStream *stream, aos_unittest_t *ut)
+{
+  aosDbgCheck(ut->data != NULL);
+
+  // local variables
+  aos_utresult_t result = {0, 0};
+  uint32_t status = 0;
+  tlc5947_lld_blank_t blank;
+  tlc5947_lld_buffer_t buffer;
+
+  chprintf(stream, "reading blank pin...\n");
+  status = tlc5947_lld_getBlank((TLC5947Driver*)ut->data, &blank);
+  if (status == APAL_STATUS_OK) {
+    aosUtPassedMsg(stream, &result, "blank is %s\n", (blank == TLC5947_LLD_BLANK_ENABLE) ? "enabled" : "disabled");
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  // enabling/disabling blank pin
+  for (uint8_t i = 0; i < 2; ++i) {
+    blank = (blank == TLC5947_LLD_BLANK_ENABLE) ? TLC5947_LLD_BLANK_DISABLE : TLC5947_LLD_BLANK_ENABLE;
+    tlc5947_lld_blank_t blank_after = (blank == TLC5947_LLD_BLANK_ENABLE) ? TLC5947_LLD_BLANK_DISABLE : TLC5947_LLD_BLANK_ENABLE;
+    chprintf(stream, "%s blank pin...\n", (blank == TLC5947_LLD_BLANK_ENABLE) ? "enabling" : "disabling");
+    status = tlc5947_lld_setBlank((TLC5947Driver*)ut->data, blank);
+    status |= tlc5947_lld_getBlank((TLC5947Driver*)ut->data, &blank_after);
+    if (status == APAL_STATUS_OK && blank_after == blank) {
+      aosUtPassed(stream, &result);
+    } else {
+      aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+    }
+  }
+
+  chprintf(stream, "setting all black and dimming white...\n");
+  status = tlc5947_lld_setBlank((TLC5947Driver*)ut->data, TLC5947_LLD_BLANK_ENABLE);
+  memset(buffer.data, 0, TLC5947_LLD_BUFFER_SIZE);
+  status |= tlc5947_lld_write((TLC5947Driver*)ut->data, &buffer);
+  status |= tlc5947_lld_update((TLC5947Driver*)ut->data);
+  status |= tlc5947_lld_setBlank((TLC5947Driver*)ut->data, TLC5947_LLD_BLANK_DISABLE);
+  for (uint8_t bit = 0; bit < TLC5947_LLD_PWM_RESOLUTION_BITS; ++bit) {
+    for (uint8_t channel = 0; channel < TLC5947_LLD_NUM_CHANNELS; ++channel) {
+      tlc5947_lld_setBuffer(&buffer, channel, (1 << (bit+1)) - 1);
+    }
+    status |= tlc5947_lld_write((TLC5947Driver*)ut->data, &buffer);
+    status |= tlc5947_lld_update((TLC5947Driver*)ut->data);
+    aosThdMSleep(100);
+  }
+  if (status == APAL_STATUS_OK) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "NOT dimming black again...\n");
+  status = APAL_STATUS_OK;
+  for (uint8_t bit = TLC5947_LLD_PWM_RESOLUTION_BITS; bit > 0; --bit) {
+    for (uint8_t channel = 0; channel < TLC5947_LLD_NUM_CHANNELS; ++channel) {
+      tlc5947_lld_setBuffer(&buffer, channel, (1 << bit) - 1);
+    }
+    status |= tlc5947_lld_setBlank((TLC5947Driver*)ut->data, TLC5947_LLD_BLANK_ENABLE);
+    status |= tlc5947_lld_write((TLC5947Driver*)ut->data, &buffer);
+    status |= tlc5947_lld_setBlank((TLC5947Driver*)ut->data, TLC5947_LLD_BLANK_ENABLE);
+    // Grayscale data is not updated this time (tlc5947_lld_update() not called).
+    // TODO: For some reason the PWMs are updated nevertheless.
+    aosThdMSleep(100);
+  }
+  status |= tlc5947_lld_setBlank((TLC5947Driver*)ut->data, TLC5947_LLD_BLANK_ENABLE);
+  if (status == APAL_STATUS_OK) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "setting each channel incrementally...\n");
+  status = APAL_STATUS_OK;
+  memset(buffer.data, 0, TLC5947_LLD_BUFFER_SIZE);
+  status |= tlc5947_lld_write((TLC5947Driver*)ut->data, &buffer);
+  status |= tlc5947_lld_update((TLC5947Driver*)ut->data);
+  status |= tlc5947_lld_setBlank((TLC5947Driver*)ut->data, TLC5947_LLD_BLANK_DISABLE);
+  for (uint8_t channel = 0; channel < TLC5947_LLD_NUM_CHANNELS; ++channel) {
+    uint16_t value = 0x0000u;
+    for (uint8_t byte = 0; byte < 3; ++byte) {
+      switch (byte) {
+        case 0:
+          value |= 0x00Fu;
+          break;
+        case 1:
+          value |= 0x0F0u;
+          break;
+        case 2:
+          value |= 0xF00u;
+          break;
+      }
+      tlc5947_lld_setBuffer(&buffer, channel, value);
+      status |= tlc5947_lld_write((TLC5947Driver*)ut->data, &buffer);
+      status |= tlc5947_lld_update((TLC5947Driver*)ut->data);
+      aosThdSleep(1.0f / 3.0f);
+      tlc5947_lld_setBuffer(&buffer, channel, 0);
+    }
+  }
+  if (status == APAL_STATUS_OK) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "setting one color after another...\n");
+  status = APAL_STATUS_OK;
+  for (int8_t color = 0; color < 3; ++color) {
+    for (uint8_t channel = color; channel < TLC5947_LLD_NUM_CHANNELS; channel += 3) {
+      const uint16_t val = 0xAF5u; // some deterministic value with high entropy
+      tlc5947_lld_setBuffer(&buffer, channel, val);
+      status |= tlc5947_lld_write((TLC5947Driver*)ut->data, &buffer);
+      status |= tlc5947_lld_update((TLC5947Driver*)ut->data);
+      status |= (tlc5947_lld_getBuffer(&buffer, channel) != val) ? (1 << 31) : 0;
+      if (status != APAL_STATUS_OK) {
+        break;
+      } else {
+        aosThdSleep(1.0f / 8.0f);
+      }
+    }
+    for (uint8_t channel = 0; channel < TLC5947_LLD_NUM_CHANNELS; ++channel) {
+      tlc5947_lld_setBuffer(&buffer, channel, 0);
+    }
+  }
+  if (status == APAL_STATUS_OK) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  // turn LEDs off
+  tlc5947_lld_setBlank((TLC5947Driver*)ut->data, TLC5947_LLD_BLANK_ENABLE);
+  memset(buffer.data, 0, TLC5947_LLD_BUFFER_SIZE);
+  tlc5947_lld_write((TLC5947Driver*)ut->data, &buffer);
+  tlc5947_lld_update((TLC5947Driver*)ut->data);
+
+  aosUtInfoMsg(stream, "driver object memory footprint: %u bytes\n", sizeof(TLC5947Driver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TLC5947) && (AMIROLLD_CFG_TLC5947 == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_TPS20xxB_v1.c b/unittests/periphery-lld/src/ut_alld_TPS20xxB_v1.c
new file mode 100644
index 0000000..7911e4e
--- /dev/null
+++ b/unittests/periphery-lld/src/ut_alld_TPS20xxB_v1.c
@@ -0,0 +1,104 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TPS20xxB) && (AMIROLLD_CFG_TPS20xxB == 1)) || defined(__DOXYGEN__)
+
+#include <ut_alld_TPS20xxB_v1.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+/**
+ * @brief   TPS20xxB unit test function.
+ *
+ * @param[in] stream  Stream for input/output.
+ * @param[in] ut      Unit test object.
+ *
+ * @return            Unit test result value.
+ */
+aos_utresult_t utAlldTps20xxbFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
+{
+  aosDbgCheck(ut->data != NULL);
+
+  // local variables
+  aos_utresult_t result = {0, 0};
+  uint32_t status = AOS_OK;
+  tps20xxb_lld_enable_t en;
+  tps20xxb_lld_overcurrent_t oc;
+
+  chprintf(stream, "write laser enable...\n");
+  status = tps20xxb_lld_set_enable((TPS20xxBDriver*)ut->data, TPS20xxB_LLD_ENABLE);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "read laser enable...\n");
+  status = tps20xxb_lld_read_enable((TPS20xxBDriver*)ut->data, &en);
+  if (status == APAL_STATUS_SUCCESS && en == TPS20xxB_LLD_ENABLE) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "read laser oc...\n");
+  status = tps20xxb_lld_read_overcurrent((TPS20xxBDriver*)ut->data, &oc);
+  if (status == APAL_STATUS_SUCCESS && oc == TPS20xxB_LLD_NO_OVERCURRENT) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  chprintf(stream, "disable laser...\n");
+  status = tps20xxb_lld_set_enable((TPS20xxBDriver*)ut->data, TPS20xxB_LLD_DISABLE);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailed(stream, &result);
+  }
+
+  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(TPS20xxBDriver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TPS20xxB) && (AMIROLLD_CFG_TPS20xxB == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_TPS6211x_v1.c b/unittests/periphery-lld/src/ut_alld_TPS6211x_v1.c
new file mode 100644
index 0000000..b44c50b
--- /dev/null
+++ b/unittests/periphery-lld/src/ut_alld_TPS6211x_v1.c
@@ -0,0 +1,81 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TPS6211x) && (AMIROLLD_CFG_TPS6211x == 1)) || defined(__DOXYGEN__)
+
+#include <ut_alld_TPS6211x_v1.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+aos_utresult_t utAlldTps6211xFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
+{
+  aosDbgCheck(ut->data != NULL);
+
+  // local variables
+  aos_utresult_t result = {0,0};
+  uint32_t status;
+  tps6211x_lld_power_en_t power;
+
+  chprintf(stream, "read pin... \n");
+  status = tps6211x_lld_get_power_en((TPS6211xDriver*)ut->data, &power);
+  if(status == APAL_STATUS_SUCCESS){
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "write pin... \n");
+  status = tps6211x_lld_set_power_en((TPS6211xDriver*)ut->data, TPS6211x_LLD_POWER_ENABLED);
+  status |= tps6211x_lld_get_power_en((TPS6211xDriver*)ut->data, &power);
+  if(status == APAL_STATUS_SUCCESS && power == TPS6211x_LLD_POWER_ENABLED){
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(TPS6211xDriver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TPS6211x) && (AMIROLLD_CFG_TPS6211x == 1) */
+
diff --git a/unittests/periphery-lld/src/ut_alld_TPS6211x_v1_INA219_v1.c b/unittests/periphery-lld/src/ut_alld_TPS6211x_v1_INA219_v1.c
new file mode 100644
index 0000000..c2c6d23
--- /dev/null
+++ b/unittests/periphery-lld/src/ut_alld_TPS6211x_v1_INA219_v1.c
@@ -0,0 +1,89 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TPS6211x) && (AMIROLLD_CFG_TPS6211x == 1) && defined(AMIROLLD_CFG_INA219) && (AMIROLLD_CFG_INA219 == 1)) || defined(__DOXYGEN__)
+
+#include <ut_alld_TPS6211x_v1_INA219_v1.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+aos_utresult_t utAlldTps6211xIna219Func(BaseSequentialStream *stream, aos_unittest_t *ut)
+{
+  aosDbgCheck(ut->data != NULL && ((ut_tps6211xina219data_t*)ut->data)->tps6211x != NULL && ((ut_tps6211xina219data_t*)ut->data)->ina219 != NULL);
+
+  // local variables
+  aos_utresult_t result = {0, 0};
+  uint32_t status;
+  tps6211x_lld_power_en_t power;
+  uint32_t v_buson, v_busoff;
+
+  chprintf(stream, "read pin... \n");
+  status = tps6211x_lld_get_power_en(((ut_tps6211xina219data_t*)ut->data)->tps6211x, &power);
+  aosThdSSleep(1);
+  status |= ina219_lld_read_bus_voltage(((ut_tps6211xina219data_t*)ut->data)->ina219, &v_buson, ((ut_tps6211xina219data_t*)ut->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS && power == TPS6211x_LLD_POWER_ENABLED) {
+    aosUtPassedMsg(stream, &result, "enabled, %fV\n", (float)v_buson / 1000000.0f);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "write pin... \n");
+  status = tps6211x_lld_set_power_en(((ut_tps6211xina219data_t*)ut->data)->tps6211x, TPS6211x_LLD_POWER_DISABLED);
+  status |= tps6211x_lld_get_power_en(((ut_tps6211xina219data_t*)ut->data)->tps6211x, &power);
+  aosThdSSleep(1);
+  status |= ina219_lld_read_bus_voltage(((ut_tps6211xina219data_t*)ut->data)->ina219, &v_busoff, ((ut_tps6211xina219data_t*)ut->data)->timeout);
+  status |= tps6211x_lld_set_power_en(((ut_tps6211xina219data_t*)ut->data)->tps6211x, TPS6211x_LLD_POWER_ENABLED);
+  if (status == APAL_STATUS_SUCCESS && power == TPS6211x_LLD_POWER_DISABLED) {
+    chprintf(stream, "\tdisabled, %fV\n", (float)v_busoff / 1000000.0f);
+    if (v_buson > v_busoff) {
+      aosUtPassed(stream, &result);
+    } else {
+      aosUtFailedMsg(stream, &result, "on: %fV; off: %fV\n", (float)v_buson / 1000000.0f, (float)v_busoff / 1000000.0f);
+    }
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TPS6211x) && (AMIROLLD_CFG_TPS6211x == 1) && defined(AMIROLLD_CFG_INA219) && (AMIROLLD_CFG_INA219 == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_VCNL4020_v1.c b/unittests/periphery-lld/src/ut_alld_VCNL4020_v1.c
new file mode 100644
index 0000000..bb70a03
--- /dev/null
+++ b/unittests/periphery-lld/src/ut_alld_VCNL4020_v1.c
@@ -0,0 +1,245 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_VCNL4020) && (AMIROLLD_CFG_VCNL4020 == 1)) || defined(__DOXYGEN__)
+
+#include <ut_alld_VCNL4020_v1.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+#define INTERRUPT_EVENT_ID            1
+
+#define INTERRUPT_THRESHOLD           0x2000
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+aos_utresult_t utAlldVcnl4020Func(BaseSequentialStream* stream, aos_unittest_t* ut)
+{
+  aosDbgCheck((ut->data != NULL) &&
+              (((ut_vcnl4020data_t*)(ut->data))->vcnld != NULL) &&
+              (((ut_vcnl4020data_t*)(ut->data))->evtsource != NULL));
+
+  // local variables
+  aos_utresult_t result = {0, 0};
+  uint32_t status;
+  uint8_t reg_buf[4];
+  uint8_t* reg_8 = (uint8_t*)(reg_buf);
+  uint16_t* reg_16 = (uint16_t*)(reg_buf);
+  event_listener_t event_listener;
+  aos_timestamp_t tcurrent, tend;
+
+  chprintf(stream, "reading register...\n");
+  status = vcnl4020_lld_readreg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_IDREV, &reg_8[0], ((ut_vcnl4020data_t*)(ut->data))->timeout);
+  if ((status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) && reg_8[0] == 0x21u) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X; 0x%08X\n", status, reg_8[0]);
+  }
+
+  chprintf(stream, "writing register...\n");
+  status = vcnl4020_lld_writereg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_PROXRATE, VCNL4020_LLD_PROXRATEREG_250_HZ, ((ut_vcnl4020data_t*)(ut->data))->timeout);
+  status |= vcnl4020_lld_readreg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_PROXRATE, &reg_8[0], ((ut_vcnl4020data_t*)(ut->data))->timeout);
+  status |= (reg_8[0] == VCNL4020_LLD_PROXRATEREG_250_HZ) ? 0x0000 : 0x0100;
+  status |= vcnl4020_lld_writereg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_CMD, (VCNL4020_LLD_CMDREG_ALSEN | VCNL4020_LLD_CMDREG_PROXEN | VCNL4020_LLD_CMDREG_SELFTIMED), ((ut_vcnl4020data_t*)(ut->data))->timeout);
+  status |= vcnl4020_lld_readreg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_CMD, &reg_8[0], ((ut_vcnl4020data_t*)(ut->data))->timeout);
+  status |= (reg_8[0] & (VCNL4020_LLD_CMDREG_ALSEN | VCNL4020_LLD_CMDREG_PROXEN | VCNL4020_LLD_CMDREG_SELFTIMED)) ? 0x0000 : 0x0200;
+
+  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X, 0x%02X\n", status, reg_8[0]);
+  }
+
+  chprintf(stream, "reading ambient light for ten seconds...\n");
+  status = APAL_STATUS_OK;
+  for (uint8_t i = 0; i < 10; ++i) {
+    aosThdSSleep(1);
+    status |= vcnl4020_lld_readals(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[0], ((ut_vcnl4020data_t*)(ut->data))->timeout);
+    chprintf(stream, "\t\tambient light: 0x%04X\n", reg_16[0]);
+  }
+  status |= (reg_16[0] == 0x0000) ? 0x10 : 0x00;
+  if (status == APAL_STATUS_OK) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "reading proximity for ten seconds...\n");
+  status = APAL_STATUS_OK;
+  for (uint8_t i = 0; i < 10; ++i) {
+    aosThdSSleep(1);
+    status |= vcnl4020_lld_readprox(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[1], ((ut_vcnl4020data_t*)(ut->data))->timeout);
+    chprintf(stream, "\t\tproximity: 0x%04X\n", reg_16[1]);
+  }
+  status |= (reg_16[1] == 0x0000) ? 0x10 : 0x00;
+  if (status == APAL_STATUS_OK) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "reading ambient light and proximity for ten seconds...\n");
+  status = APAL_STATUS_OK;
+  for (uint8_t i = 0; i < 10; ++i) {
+    aosThdSSleep(1);
+    status |= vcnl4020_lld_readalsandprox(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[0], &reg_16[1], ((ut_vcnl4020data_t*)(ut->data))->timeout);
+    chprintf(stream, "\t\tambient light: 0x%04X\tproximity: 0x%04X\n", reg_16[0], reg_16[1]);
+  }
+  status |= (reg_16[0] == 0x0000 || reg_16[1] == 0x0000) ? 0x10 : 0x00;
+  if (status == APAL_STATUS_OK) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "reading low threshold register...\n");
+  status = vcnl4020_lld_readlth(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[0], ((ut_vcnl4020data_t*)(ut->data))->timeout);
+  if (status == APAL_STATUS_OK) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "reading high threshold register...\n");
+  status = vcnl4020_lld_readhth(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[1], ((ut_vcnl4020data_t*)(ut->data))->timeout);
+  if (status == APAL_STATUS_OK) {
+    aosUtPassedMsg(stream, &result, "0x%04X\n", reg_16[1]);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "reading both threshold registers...\n");
+  status = vcnl4020_lld_readth(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[0], &reg_16[1], ((ut_vcnl4020data_t*)(ut->data))->timeout);
+  if (status == APAL_STATUS_OK) {
+    aosUtPassedMsg(stream, &result, "low: 0x%04X; high: 0x%04X\n", reg_16[0], reg_16[1]);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "writing low threshold register...\n");
+  status = vcnl4020_lld_writelth(((ut_vcnl4020data_t*)(ut->data))->vcnld, 0xFFFFu, ((ut_vcnl4020data_t*)(ut->data))->timeout);
+  status |= vcnl4020_lld_readlth(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[0], ((ut_vcnl4020data_t*)(ut->data))->timeout);
+  if (status == APAL_STATUS_OK && reg_16[0] == 0xFFFFu) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X, 0x%04X\n", status, reg_16[0]);
+  }
+
+  chprintf(stream, "writing high threshold register...\n");
+  status = vcnl4020_lld_writehth(((ut_vcnl4020data_t*)(ut->data))->vcnld, 0xFFFFu, ((ut_vcnl4020data_t*)(ut->data))->timeout);
+  status |= vcnl4020_lld_readhth(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[1], ((ut_vcnl4020data_t*)(ut->data))->timeout);
+  if (status == APAL_STATUS_OK && reg_16[1] == 0xFFFFu) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X, 0x%04X\n", status, reg_16[1]);
+  }
+
+  chprintf(stream, "writing both threshold registers...\n");
+  status = vcnl4020_lld_writeth(((ut_vcnl4020data_t*)(ut->data))->vcnld, 0x5555u, 0xAAAAu, ((ut_vcnl4020data_t*)(ut->data))->timeout);
+  status |= vcnl4020_lld_readth(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[0], &reg_16[1], ((ut_vcnl4020data_t*)(ut->data))->timeout);
+  if (status == APAL_STATUS_OK && reg_16[0] == 0x5555u && reg_16[1] == 0xAAAAu) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X, 0x%04X, 0x%04X\n", status, reg_16[0], reg_16[1]);
+  }
+
+  chprintf(stream, "test interrupts...\n");
+  chprintf(stream, "(thresholds are 0x%04X and 0x%04X)\n", 0, INTERRUPT_THRESHOLD);
+  chEvtRegister(((ut_vcnl4020data_t*)(ut->data))->evtsource, &event_listener, INTERRUPT_EVENT_ID);
+  aosSysGetUptime(&tend);
+  tend += 30 * MICROSECONDS_PER_SECOND;
+  status = vcnl4020_lld_writeth(((ut_vcnl4020data_t*)(ut->data))->vcnld, 0x0000, INTERRUPT_THRESHOLD, ((ut_vcnl4020data_t*)(ut->data))->timeout);
+  status |= vcnl4020_lld_writereg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_INTCTRL, VCNL4020_LLD_INTCTRLREG_THRES_EN, ((ut_vcnl4020data_t*)(ut->data))->timeout);
+  do {
+    // read proximity data, interrupt event information and interrupt status
+    const eventmask_t emask = chEvtWaitOneTimeout(EVENT_MASK(INTERRUPT_EVENT_ID), chTimeUS2I(10*MICROSECONDS_PER_MILLISECOND));
+    const eventflags_t eflags = chEvtGetAndClearFlags(&event_listener);
+    status |= vcnl4020_lld_readprox(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[0], ((ut_vcnl4020data_t*)(ut->data))->timeout);
+    status |= vcnl4020_lld_readreg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_INTSTATUS, &reg_8[2], ((ut_vcnl4020data_t*)(ut->data))->timeout);
+    if (emask == EVENT_MASK(INTERRUPT_EVENT_ID) &&
+        eflags == ((ut_vcnl4020data_t*)(ut->data))->evtflags &&
+        reg_8[2] == VCNL4020_LLD_INTSTATUSREG_THHIGH) {
+      // true positive (correct case)
+      chprintf(stream, "\t\tinterrupt detected: prox = 0x%04X\n", reg_16[0]);
+      aosThdMSleep(100);
+    }
+    else if (emask != EVENT_MASK(INTERRUPT_EVENT_ID) &&
+             eflags != ((ut_vcnl4020data_t*)(ut->data))->evtflags &&
+             reg_8[2] != VCNL4020_LLD_INTSTATUSREG_THHIGH) {
+      // true negative (correct case)
+      // do nothing, just keep on looping
+    }
+    else if (emask == EVENT_MASK(INTERRUPT_EVENT_ID) &&
+             eflags == ((ut_vcnl4020data_t*)(ut->data))->evtflags &&
+             reg_8[2] != 0 ) {
+      // false positive
+      status |= 0x1000;
+      chprintf(stream, "\t\tfalse positive: intstatus = 0x%02X; prox = 0x%04X\n", reg_8[2], reg_16[0]);
+    }
+    else if (emask != EVENT_MASK(INTERRUPT_EVENT_ID) &&
+             eflags != ((ut_vcnl4020data_t*)(ut->data))->evtflags &&
+             reg_8[2] == 0) {
+      // false negative
+      status |= 0x2000;
+      chprintf(stream, "\t\tfalse negative: intstatus = 0x%02X; prox = 0x%04X\n", reg_8[2], reg_16[0]);
+    } // any other events are just ignored
+    // reset interrupt status
+    if (reg_8[2] != 0) {
+      status |= vcnl4020_lld_writereg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_INTSTATUS, reg_8[2], ((ut_vcnl4020data_t*)(ut->data))->timeout);
+    }
+    aosSysGetUptime(&tcurrent);
+  } while (tcurrent < tend);
+  chEvtUnregister(((ut_vcnl4020data_t*)(ut->data))->evtsource, &event_listener);
+  status |= vcnl4020_lld_writereg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_INTCTRL, 0, ((ut_vcnl4020data_t*)(ut->data))->timeout);
+  status |= vcnl4020_lld_readreg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_INTSTATUS, &reg_8[2], ((ut_vcnl4020data_t*)(ut->data))->timeout);
+  status |= vcnl4020_lld_writereg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_INTSTATUS, reg_8[2], ((ut_vcnl4020data_t*)(ut->data))->timeout);
+  if (status == APAL_STATUS_SUCCESS || status == APAL_STATUS_WARNING) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  aosUtInfoMsg(stream, "driver object memory footprint: %u bytes\n", sizeof(VCNL4020Driver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_VCNL4020) && (AMIROLLD_CFG_VCNL4020 == 1) */
+
diff --git a/unittests/periphery-lld/src/ut_alld_a3906.c b/unittests/periphery-lld/src/ut_alld_a3906.c
deleted file mode 100644
index 95e29ca..0000000
--- a/unittests/periphery-lld/src/ut_alld_a3906.c
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <ut_alld_a3906.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_A3906)) || defined(__DOXYGEN__)
-
-#include <stdlib.h>
-#include <math.h>
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/**
- * @brief   Interval to poll QEI in certain tests.
- */
-#define QEI_POLL_INTERVAL_MS          100
-
-/**
- * @brief   Threshold for QEI differences.
- * @details Differences smaller than or equal to this value are neglected (interpreted as zero).
- *          The value can be interpreted as encoder ticks per second (tps).
- * @note    The expected value is about 7000 tps and a jitter of up to ±2% is ok.
- */
-#define QEI_DIFF_THRESHOLD            (apalQEICount_t)(7000 * 0.02f)
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/**
- * @brief   Enumerator to distinguish between left and right wheel.
- */
-typedef enum {
-  WHEEL_LEFT    = 0,  /**< left wheel identifier */
-  WHEEL_RIGHT   = 1,  /**< right wheel identifier */
-} wheel_t;
-
-/**
- * @brief   Enumerator to distinguish directions.
- */
-typedef enum {
-  DIRECTION_FORWARD   = 0,  /**< forward direction identifier */
-  DIRECTION_BACKWARD  = 1,  /**< backward direction identifier */
-} direction_t;
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/**
- * @brief   helper function to test each wheel and direction separately.
- *
- * @param[in] stream      Stream for input/output.
- * @param[in] data        Unit test meta data.
- * @param[in] wheel       Wheel to test.
- * @param[in] direction   Direction to test.
- * @param[in,out] result  Result variable to modify.
- */
-void _wheelDirectionTest(BaseSequentialStream* stream, ut_a3906data_t* data, wheel_t wheel, direction_t direction, aos_utresult_t* result)
-{
-  // local variables
-  uint32_t status;
-  bool qei_valid;
-  apalQEICount_t qei_count[2];
-  apalQEIDirection_t qei_direction;
-  uint32_t timeout_counter;
-
-  chprintf(stream, "%s wheel %s...\n", (wheel == WHEEL_LEFT) ? "left" : "right", (direction == DIRECTION_FORWARD) ? "forward" : "backward");
-  qei_valid = false;
-  status = apalQEIGetPosition((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_count[0]);
-  // increase PWM incrementally and read QEI data
-  for (apalPWMwidth_t pwm_width = APAL_PWM_WIDTH_MIN; pwm_width < APAL_PWM_WIDTH_MAX; ++pwm_width) {
-    status |= a3906_lld_set_pwm(data->pwm.driver, (wheel == WHEEL_LEFT) ?
-                                  ((direction == DIRECTION_FORWARD) ? data->pwm.channel.left_forward : data->pwm.channel.left_backward) :
-                                  ((direction == DIRECTION_FORWARD) ? data->pwm.channel.right_forward : data->pwm.channel.right_backward),
-                                pwm_width);
-    status |= apalQEIGetPosition((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_count[1]);
-    qei_valid = qei_valid || (qei_count[0] != qei_count[1]);
-    aosThdUSleep(5 * MICROSECONDS_PER_SECOND / (APAL_PWM_WIDTH_MAX - APAL_PWM_WIDTH_MIN));
-    qei_count[0] = qei_count[1];
-  }
-  status |= qei_valid ? 0x00 : 0x10;
-  status |= apalQEIGetDirection((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_direction);
-  status |= (qei_direction == ((direction == DIRECTION_FORWARD) ? APAL_QEI_DIRECTION_UP : APAL_QEI_DIRECTION_DOWN)) ? 0x00 : 0x20;
-
-  // let the wheel spin free until it stops
-  status |= a3906_lld_set_pwm(data->pwm.driver, (wheel == WHEEL_LEFT) ?
-                                ((direction == DIRECTION_FORWARD) ? data->pwm.channel.left_forward : data->pwm.channel.left_backward) :
-                                ((direction == DIRECTION_FORWARD) ? data->pwm.channel.right_forward : data->pwm.channel.right_backward),
-                              0);
-  qei_count[0] = 0;
-  qei_count[1] = 0;
-  timeout_counter = 0;
-  do {
-    status |= apalQEIGetPosition((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_count[0]);
-    aosThdMSleep(1);
-    status |= apalQEIGetPosition((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_count[1]);
-    ++timeout_counter;
-  } while ((qei_count[0] != qei_count[1]) && (timeout_counter * MICROSECONDS_PER_MILLISECOND <= data->timeout));
-  status |= (timeout_counter * MICROSECONDS_PER_MILLISECOND > data->timeout) ? APAL_STATUS_TIMEOUT : 0x00;
-
-  // report result
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, result);
-  } else {
-    aosUtFailedMsg(stream, result, "0x%08X\n", status);
-  }
-
-  return;
-}
-
-void _wheelSpeedTest(BaseSequentialStream* stream, ut_a3906data_t* data, wheel_t wheel, direction_t direction, aos_utresult_t* result)
-{
-  // local variables
-  uint32_t status;
-  apalQEICount_t qei_range;
-  apalQEICount_t qei_count[2] = {0};
-  apalQEICount_t qei_increments[2] = {0};
-  apalQEICount_t qei_increments_diff = 0;
-  uint32_t timeout_counter = 0;
-  uint32_t stable_counter = 0;
-
-  chprintf(stream, "%s wheel full speed %s...\n", (wheel == WHEEL_LEFT) ? "left" : "right", (direction == DIRECTION_FORWARD) ? "forward" : "backward");
-  // spin up the wheel with full speed
-  status = apalQEIGetRange((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_range);
-  status |= a3906_lld_set_pwm(data->pwm.driver, (wheel == WHEEL_LEFT) ?
-                               ((direction == DIRECTION_FORWARD) ? data->pwm.channel.left_forward : data->pwm.channel.left_backward) :
-                               ((direction == DIRECTION_FORWARD) ? data->pwm.channel.right_forward : data->pwm.channel.right_backward),
-                             APAL_PWM_WIDTH_MAX);
-  aosThdMSleep(100);
-  do {
-    // read QEI data to determine speed
-    status |= apalQEIGetPosition((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_count[0]);
-    aosThdMSleep(QEI_POLL_INTERVAL_MS);
-    status |= apalQEIGetPosition((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_count[1]);
-    timeout_counter += QEI_POLL_INTERVAL_MS;
-    qei_increments[0] = qei_increments[1];
-    qei_increments[1] = (direction == DIRECTION_FORWARD) ?
-                          ((qei_count[1] > qei_count[0]) ? (qei_count[1] - qei_count[0]) : (qei_count[1] + (qei_range - qei_count[0]))) :
-                          ((qei_count[0] > qei_count[1]) ? (qei_count[0] - qei_count[1]) : (qei_count[0] + (qei_range - qei_count[1])));
-    qei_increments_diff = abs((int32_t)qei_increments[0] - (int32_t)qei_increments[1]) * ((float)MILLISECONDS_PER_SECOND / (float)QEI_POLL_INTERVAL_MS);
-    stable_counter = ((qei_increments[0] != 0 || qei_increments[1] != 0) && qei_increments_diff <= QEI_DIFF_THRESHOLD) ? stable_counter+1 : 0;
-    if (qei_increments[0] != 0 && stable_counter == 0) {
-      chprintf(stream, "\tunstable speed? jitter of %u tps is above threshold (%u tps).\n", qei_increments_diff, QEI_DIFF_THRESHOLD);
-    }
-  } while ((stable_counter* QEI_POLL_INTERVAL_MS < MILLISECONDS_PER_SECOND) && (timeout_counter * MICROSECONDS_PER_MILLISECOND <= data->timeout));
-  status |= a3906_lld_set_pwm(data->pwm.driver, (wheel == WHEEL_LEFT) ?
-                               ((direction == DIRECTION_FORWARD) ? data->pwm.channel.left_forward : data->pwm.channel.left_backward) :
-                               ((direction == DIRECTION_FORWARD) ? data->pwm.channel.right_forward : data->pwm.channel.right_backward),
-                             APAL_PWM_WIDTH_OFF);
-  status |= (timeout_counter * MICROSECONDS_PER_MILLISECOND > data->timeout) ? APAL_STATUS_TIMEOUT : 0x00;
-
-  // report results
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, result);
-    const float tps = qei_increments[1] * ((float)MILLISECONDS_PER_SECOND / (float)QEI_POLL_INTERVAL_MS);
-    const float rpm = tps * SECONDS_PER_MINUTE / (float)data->qei.increments_per_revolution;
-    const float velocity = tps / (float)data->qei.increments_per_revolution * ((wheel == WHEEL_LEFT) ? data->wheel_diameter.left : data->wheel_diameter.right) * acos(-1);
-    chprintf(stream, "\t%f tps\n", tps);
-    chprintf(stream, "\t%f RPM\n", rpm);
-    chprintf(stream, "\t%f m/s\n", velocity);
-    chprintf(stream, "\n");
-  }
-  else {
-    aosUtFailedMsg(stream, result, "0x%08X\n", status);
-  }
-}
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-/**
- * @brief   A3905 unit test function.
- *
- * @param[in] stream  Stream for input/output.
- * @param[in] ut      Unit test object.
- *
- * @return            Unit test result value.
- */
-aos_utresult_t utAlldA3906Func(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck((ut->data != NULL) &&
-              (((ut_a3906data_t*)ut->data)->driver != NULL) &&
-              (((ut_a3906data_t*)ut->data)->pwm.driver != NULL) &&
-              (((ut_a3906data_t*)ut->data)->qei.left != NULL) &&
-              (((ut_a3906data_t*)ut->data)->qei.right != NULL));
-
-
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status = 0;
-  a3906_lld_power_t power_state;
-  apalQEICount_t qei_count[2][2];
-  uint32_t timeout_counter;
-  uint32_t stable_counter;
-
-  chprintf(stream, "enable power...\n");
-  power_state = A3906_LLD_POWER_ON;
-  status = a3906_lld_set_power(((ut_a3906data_t*)ut->data)->driver, power_state);
-  status |= a3906_lld_get_power(((ut_a3906data_t*)ut->data)->driver, &power_state);
-  status |= (power_state != A3906_LLD_POWER_ON) ? 0x10 : 0x00;
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  _wheelDirectionTest(stream, (ut_a3906data_t*)ut->data, WHEEL_LEFT, DIRECTION_FORWARD, &result);
-
-  _wheelDirectionTest(stream, (ut_a3906data_t*)ut->data, WHEEL_RIGHT, DIRECTION_FORWARD, &result);
-
-  _wheelDirectionTest(stream, (ut_a3906data_t*)ut->data, WHEEL_LEFT, DIRECTION_BACKWARD, &result);
-
-  _wheelDirectionTest(stream, (ut_a3906data_t*)ut->data, WHEEL_RIGHT, DIRECTION_BACKWARD, &result);
-
-  _wheelSpeedTest(stream, (ut_a3906data_t*)ut->data, WHEEL_LEFT, DIRECTION_FORWARD, &result);
-
-  _wheelSpeedTest(stream, (ut_a3906data_t*)ut->data, WHEEL_RIGHT, DIRECTION_FORWARD, &result);
-
-  _wheelSpeedTest(stream, (ut_a3906data_t*)ut->data, WHEEL_LEFT, DIRECTION_BACKWARD, &result);
-
-  _wheelSpeedTest(stream, (ut_a3906data_t*)ut->data, WHEEL_RIGHT, DIRECTION_BACKWARD, &result);
-
-  chprintf(stream, "disable power... \n");
-  power_state = A3906_LLD_POWER_OFF;
-  status = a3906_lld_set_power(((ut_a3906data_t*)ut->data)->driver, power_state);
-  status |= a3906_lld_get_power(((ut_a3906data_t*)ut->data)->driver, &power_state);
-  status |= (power_state != A3906_LLD_POWER_OFF) ? 0x10 : 0x00;
-  qei_count[WHEEL_LEFT][0] = 0;
-  qei_count[WHEEL_LEFT][1] = 0;
-  qei_count[WHEEL_RIGHT][0] = 0;
-  qei_count[WHEEL_RIGHT][1] = 0;
-  timeout_counter = 0;
-  stable_counter = 0;
-  do {
-    status |= apalQEIGetPosition(((ut_a3906data_t*)ut->data)->qei.left, &qei_count[WHEEL_LEFT][0]);
-    status |= apalQEIGetPosition(((ut_a3906data_t*)ut->data)->qei.right, &qei_count[WHEEL_RIGHT][0]);
-    aosThdMSleep(1);
-    status |= apalQEIGetPosition(((ut_a3906data_t*)ut->data)->qei.left, &qei_count[WHEEL_LEFT][1]);
-    status |= apalQEIGetPosition(((ut_a3906data_t*)ut->data)->qei.right, &qei_count[WHEEL_RIGHT][1]);
-    ++timeout_counter;
-    stable_counter = (qei_count[WHEEL_LEFT][0] == qei_count[WHEEL_LEFT][1] && qei_count[WHEEL_RIGHT][0] == qei_count[WHEEL_RIGHT][1]) ? stable_counter+1 : 0;
-  } while((stable_counter < 100) && (timeout_counter * MICROSECONDS_PER_MILLISECOND <= ((ut_a3906data_t*)ut->data)->timeout));
-  status |= (timeout_counter * MICROSECONDS_PER_MILLISECOND > ((ut_a3906data_t*)ut->data)->timeout) ? APAL_STATUS_TIMEOUT : 0x00;
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  // stop the PWM
-  a3906_lld_set_pwm(((ut_a3906data_t*)ut->data)->pwm.driver, ((ut_a3906data_t*)ut->data)->pwm.channel.left_forward, APAL_PWM_WIDTH_OFF);
-  a3906_lld_set_pwm(((ut_a3906data_t*)ut->data)->pwm.driver, ((ut_a3906data_t*)ut->data)->pwm.channel.left_backward, APAL_PWM_WIDTH_OFF);
-  a3906_lld_set_pwm(((ut_a3906data_t*)ut->data)->pwm.driver, ((ut_a3906data_t*)ut->data)->pwm.channel.right_forward, APAL_PWM_WIDTH_OFF);
-  a3906_lld_set_pwm(((ut_a3906data_t*)ut->data)->pwm.driver, ((ut_a3906data_t*)ut->data)->pwm.channel.right_backward, APAL_PWM_WIDTH_OFF);
-
-  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(A3906Driver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_A3906) */
diff --git a/unittests/periphery-lld/src/ut_alld_at24c01bn-sh-b.c b/unittests/periphery-lld/src/ut_alld_at24c01bn-sh-b.c
deleted file mode 100644
index b73f880..0000000
--- a/unittests/periphery-lld/src/ut_alld_at24c01bn-sh-b.c
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <ut_alld_at24c01bn-sh-b.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_AT24C01BN)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/**
- * @brief   EEPROM address for page write/read access.
- */
-#define _pageAddress                  (AT24C01BN_LLD_SIZE_BYTES - 2*AT24C01BN_LLD_PAGE_SIZE_BYTES)
-
-/**
- * @brief   EEPROM address for byte write/read access.
- */
-#define _byteAddress                  (_pageAddress + AT24C01BN_LLD_PAGE_SIZE_BYTES - 1)
-
-/**
- * @brief   Offset for overflow tests.
- */
-#define _overflowOffset               3
-
-/**
- * @brief   EEPROM address for page write/read access with overflow.
- */
-#define _overflowAddress              (_pageAddress + _overflowOffset)
-
-/**
- * @brief   Test data byte.
- */
-#define _bytedata                     0xA5
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-/**
- * @brief   AT24C01BN-SH-B unit test function.
- *
- * @param[in] stream  Stream for inout/outout.
- * @param[in] ut      Unit test object.
- *
- * @return            Unit test result value.
- */
-aos_utresult_t utAlldAt24c01bnFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL && ((ut_at24c01bndata_t*)(ut->data))->driver != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status = 0;
-  uint8_t page_data[AT24C01BN_LLD_PAGE_SIZE_BYTES];
-  uint8_t original_data[AT24C01BN_LLD_PAGE_SIZE_BYTES];
-  uint8_t read_data[AT24C01BN_LLD_PAGE_SIZE_BYTES];
-  size_t errors = 0;
-  for (size_t dataIdx = 0; dataIdx < AT24C01BN_LLD_PAGE_SIZE_BYTES; ++dataIdx) {
-    page_data[dataIdx] = dataIdx;
-  }
-
-  chprintf(stream, "reading byte...\n");
-  status = at24c01bn_lld_read(((ut_at24c01bndata_t*)(ut->data))->driver, _byteAddress, original_data, 1, ((ut_at24c01bndata_t*)(ut->data))->timeout);
-  if (status == APAL_STATUS_SUCCESS || status == APAL_STATUS_WARNING) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "writing byte...\n");
-  status = at24c01bn_lld_write_byte(((ut_at24c01bndata_t*)(ut->data))->driver, _byteAddress, _bytedata, ((ut_at24c01bndata_t*)(ut->data))->timeout);
-  while (at24c01bn_lld_poll_ack(((ut_at24c01bndata_t*)(ut->data))->driver, ((ut_at24c01bndata_t*)(ut->data))->timeout) == APAL_STATUS_FAILURE) {
-    continue;
-  }
-  status |= at24c01bn_lld_read(((ut_at24c01bndata_t*)(ut->data))->driver, _byteAddress, &read_data[0], 1, ((ut_at24c01bndata_t*)(ut->data))->timeout);
-  status |= (read_data[0] == _bytedata) ? 0x00 : 0x20;
-  status = at24c01bn_lld_write_byte(((ut_at24c01bndata_t*)(ut->data))->driver, _byteAddress, (uint8_t)~_bytedata, ((ut_at24c01bndata_t*)(ut->data))->timeout);
-  while (at24c01bn_lld_poll_ack(((ut_at24c01bndata_t*)(ut->data))->driver, ((ut_at24c01bndata_t*)(ut->data))->timeout) == APAL_STATUS_FAILURE) {
-    continue;
-  }
-  status |= at24c01bn_lld_read(((ut_at24c01bndata_t*)(ut->data))->driver, _byteAddress, &read_data[1], 1, ((ut_at24c01bndata_t*)(ut->data))->timeout);
-  status |= (read_data[1] == (uint8_t)~_bytedata) ? 0x00 : 0x40;
-  status |= at24c01bn_lld_write_byte(((ut_at24c01bndata_t*)(ut->data))->driver, _byteAddress, original_data[0], ((ut_at24c01bndata_t*)(ut->data))->timeout);
-  while (at24c01bn_lld_poll_ack(((ut_at24c01bndata_t*)(ut->data))->driver, ((ut_at24c01bndata_t*)(ut->data))->timeout) == APAL_STATUS_FAILURE) {
-    continue;
-  }
-  status |= at24c01bn_lld_read(((ut_at24c01bndata_t*)(ut->data))->driver, _byteAddress, &read_data[2], 1, ((ut_at24c01bndata_t*)(ut->data))->timeout);
-  status |= (read_data[2] == original_data[0]) ? 0x00 : 0x80;
-  if (status == APAL_STATUS_SUCCESS || status == APAL_STATUS_WARNING) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "reading page...\n");
-  status = at24c01bn_lld_read(((ut_at24c01bndata_t*)(ut->data))->driver, _pageAddress, original_data, AT24C01BN_LLD_PAGE_SIZE_BYTES, ((ut_at24c01bndata_t*)(ut->data))->timeout);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "writing page...\n");
-  status = at24c01bn_lld_write_page(((ut_at24c01bndata_t*)(ut->data))->driver, _pageAddress, page_data, AT24C01BN_LLD_PAGE_SIZE_BYTES, ((ut_at24c01bndata_t*)(ut->data))->timeout);
-  while (at24c01bn_lld_poll_ack(((ut_at24c01bndata_t*)(ut->data))->driver, ((ut_at24c01bndata_t*)(ut->data))->timeout) == APAL_STATUS_FAILURE) {
-    continue;
-  }
-  status |= at24c01bn_lld_read(((ut_at24c01bndata_t*)(ut->data))->driver, _pageAddress, read_data, AT24C01BN_LLD_PAGE_SIZE_BYTES, ((ut_at24c01bndata_t*)(ut->data))->timeout);
-  errors = 0;
-  for (size_t dataIdx = 0; dataIdx < AT24C01BN_LLD_PAGE_SIZE_BYTES; dataIdx++) {
-    if (read_data[dataIdx] != page_data[dataIdx]) {
-      ++errors;
-    }
-  }
-  if (status == APAL_STATUS_OK && errors == 0) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X; %u\n", status, errors);
-  }
-
-  chprintf(stream, "reading page at current address...\n");
-  // set address counter to UT_ALLD_AT24C01BN_PAGE_ADDRESS
-  status = at24c01bn_lld_read(((ut_at24c01bndata_t*)(ut->data))->driver, _pageAddress-1, read_data, 1, ((ut_at24c01bndata_t*)(ut->data))->timeout);
-  if (status == APAL_STATUS_WARNING) {
-    // on STM32F1 platform the address gets incremented by 2 after reading
-    status = at24c01bn_lld_read(((ut_at24c01bndata_t*)(ut->data))->driver, _pageAddress-2, read_data, 1, ((ut_at24c01bndata_t*)(ut->data))->timeout);
-  }
-  // read page from the current address
-  status = at24c01bn_lld_read_current_address(((ut_at24c01bndata_t*)(ut->data))->driver, read_data, AT24C01BN_LLD_PAGE_SIZE_BYTES, ((ut_at24c01bndata_t*)(ut->data))->timeout);
-  errors = 0;
-  for (uint8_t dataIdx = 0; dataIdx < 8; dataIdx++) {
-    if (read_data[dataIdx] != page_data[dataIdx]) {
-      ++errors;
-    }
-  }
-  if (status == APAL_STATUS_OK && errors == 0) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X; %u\n", status, errors);
-  }
-
-  chprintf(stream, "writing page with overflow (7 bytes)...\n");
-  status = at24c01bn_lld_write_page(((ut_at24c01bndata_t*)(ut->data))->driver, _overflowAddress, page_data, AT24C01BN_LLD_PAGE_SIZE_BYTES-1, ((ut_at24c01bndata_t*)(ut->data))->timeout);
-  while (at24c01bn_lld_poll_ack(((ut_at24c01bndata_t*)(ut->data))->driver, ((ut_at24c01bndata_t*)(ut->data))->timeout) == APAL_STATUS_FAILURE) {
-    continue;
-  }
-  status |= at24c01bn_lld_read(((ut_at24c01bndata_t*)(ut->data))->driver, _overflowAddress, read_data, AT24C01BN_LLD_PAGE_SIZE_BYTES-_overflowOffset, ((ut_at24c01bndata_t*)(ut->data))->timeout);
-  status |= at24c01bn_lld_read(((ut_at24c01bndata_t*)(ut->data))->driver, _overflowAddress-_overflowOffset, read_data+(AT24C01BN_LLD_PAGE_SIZE_BYTES-_overflowOffset), _overflowOffset-1, ((ut_at24c01bndata_t*)(ut->data))->timeout);
-  errors = 0;
-  for (uint8_t dataIdx = 0; dataIdx < AT24C01BN_LLD_PAGE_SIZE_BYTES-1; dataIdx++) {
-    if (read_data[dataIdx] != page_data[dataIdx]) {
-      ++errors;
-    }
-  }
-  if (status == APAL_STATUS_OK && errors == 0) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X; %u\n", status, errors);
-  }
-
-  chprintf(stream, "writing page with overflow (8 bytes)...\n");
-  status = at24c01bn_lld_write_page(((ut_at24c01bndata_t*)(ut->data))->driver, _overflowAddress, page_data, AT24C01BN_LLD_PAGE_SIZE_BYTES, ((ut_at24c01bndata_t*)(ut->data))->timeout);
-  while (at24c01bn_lld_poll_ack(((ut_at24c01bndata_t*)(ut->data))->driver, ((ut_at24c01bndata_t*)(ut->data))->timeout) == APAL_STATUS_FAILURE) {
-    continue;
-  }
-  status |= at24c01bn_lld_read(((ut_at24c01bndata_t*)(ut->data))->driver, _overflowAddress, read_data, AT24C01BN_LLD_PAGE_SIZE_BYTES-_overflowOffset, ((ut_at24c01bndata_t*)(ut->data))->timeout);
-  status |= at24c01bn_lld_read(((ut_at24c01bndata_t*)(ut->data))->driver, _overflowAddress-_overflowOffset, read_data+(AT24C01BN_LLD_PAGE_SIZE_BYTES-_overflowOffset), _overflowOffset, ((ut_at24c01bndata_t*)(ut->data))->timeout);
-  errors = 0;
-  for (uint8_t dataIdx = 0; dataIdx < AT24C01BN_LLD_PAGE_SIZE_BYTES; dataIdx++) {
-    if (read_data[dataIdx] != page_data[dataIdx]) {
-      ++errors;
-    }
-  }
-  if (status == APAL_STATUS_OK && errors == 0) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X; %u\n", status, errors);
-  }
-
-  chprintf(stream, "write back original data...\n");
-  status = at24c01bn_lld_write_page(((ut_at24c01bndata_t*)(ut->data))->driver, _pageAddress, original_data, AT24C01BN_LLD_PAGE_SIZE_BYTES, ((ut_at24c01bndata_t*)(ut->data))->timeout);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(AT24C01BNDriver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_AT24C01BN) */
diff --git a/unittests/periphery-lld/src/ut_alld_at42qt1050.c b/unittests/periphery-lld/src/ut_alld_at42qt1050.c
deleted file mode 100644
index 394a35c..0000000
--- a/unittests/periphery-lld/src/ut_alld_at42qt1050.c
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <ut_alld_at42qt1050.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_AT42QT1050)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-#define INTERRUPT_EVENT_ID            1
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-aos_utresult_t utAlldAt42qt1050Func(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL && ((ut_at42qt1050data_t*)ut->data)->at42qt1050d != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status;
-  uint8_t buffer8[4] = {0, 0};
-  uint16_t buffer16[5];
-  event_listener_t event_listener;
-  aos_timestamp_t tstart, tcurrent, tend;
-
-  chprintf(stream, "read register...\n");
-  status = at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_CHIPID, &buffer8[0], ((ut_at42qt1050data_t*)ut->data)->timeout);
-  status |= at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_FIRMWAREVERSION, &buffer8[1], ((ut_at42qt1050data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tchip ID: 0x%02X\n", buffer8[0]);
-  chprintf(stream, "\t\tfirmware version: %u.%u (0x%02X)\n", ((at42qt1050_lld_firmwarereg_t)buffer8[1]).major, ((at42qt1050_lld_firmwarereg_t)buffer8[1]).minor, buffer8[1]);
-  if (status == APAL_STATUS_SUCCESS && buffer8[0] == AT42QT1050_LLD_CHIPID) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "write register...\n");
-  buffer8[1] = (((uint8_t)(at42qt1050_lld_samples2pulse(4096) + 0.5f)) << 4) | ((uint8_t)(at42qt1050_lld_scaling2scale(1024) + 0.5f));
-  status = at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_PULSE_SCALE_1, &buffer8[0], ((ut_at42qt1050data_t*)ut->data)->timeout);
-  status |= at42qt1050_lld_write_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_PULSE_SCALE_1, buffer8[1] , ((ut_at42qt1050data_t*)ut->data)->timeout);
-  status |= at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_PULSE_SCALE_1, &buffer8[2], ((ut_at42qt1050data_t*)ut->data)->timeout);
-  status |= at42qt1050_lld_write_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_PULSE_SCALE_1, buffer8[0] , ((ut_at42qt1050data_t*)ut->data)->timeout);
-  status |= at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_PULSE_SCALE_1, &buffer8[3], ((ut_at42qt1050data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS &&
-      buffer8[3] == buffer8[0] &&
-      buffer8[2] == buffer8[1] &&
-      at42qt1050_lld_pulse2samples(((at42qt1050_lld_pulsescalereg_t)buffer8[2]).pulse) == 4096 &&
-      at42qt1050_lld_scale2scaling(((at42qt1050_lld_pulsescalereg_t)buffer8[2]).scale) == 1024) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X [0x%02X 0x%02X 0x%02X 0x%02X]\n", status, buffer8[0], buffer8[1], buffer8[2], buffer8[3]);
-  }
-
-  chprintf(stream, "read reference data...\n");
-  status = APAL_STATUS_OK;
-  for (uint8_t key = 0; key < AT42QT1050_LLD_NUM_KEYS; ++key) {
-    status |= at42qt1050_lld_read_referencedata(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, key, &buffer16[key], ((ut_at42qt1050data_t*)ut->data)->timeout);
-    chprintf(stream, "\t\tkey %u: 0x%04X\n", key, buffer16[key]);
-  }
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "read key signal for ten seconds...\n");
-  status = APAL_STATUS_OK;
-  chprintf(stream, "\t\t key 0  key 1  key 2  key 3  key 4\n");
-  for (uint8_t s = 0; s < 10; ++s) {
-    aosThdSSleep(1);
-    for (uint8_t key = 0; key < AT42QT1050_LLD_NUM_KEYS; ++key) {
-      status |= at42qt1050_lld_read_keyssignal(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, key, &buffer16[key], ((ut_at42qt1050data_t*)ut->data)->timeout);
-    }
-    chprintf(stream, "\t\t0x%04X 0x%04X 0x%04X 0x%04X 0x%04X\n", buffer16[0], buffer16[1], buffer16[2], buffer16[3], buffer16[4]);
-  }
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "test interrupts...\n");
-  status = AOS_OK;
-  chEvtRegister(((ut_at42qt1050data_t*)ut->data)->evtsource, &event_listener, INTERRUPT_EVENT_ID);
-  aosSysGetUptime(&tstart);
-  tend = tstart + (30 * MICROSECONDS_PER_SECOND);
-  do {
-    aosSysGetUptime(&tcurrent);
-    const aos_timestamp_t ttimeout = MICROSECONDS_PER_SECOND - ((tcurrent - tstart) % MICROSECONDS_PER_SECOND);
-    const eventmask_t emask = chEvtWaitOneTimeout(EVENT_MASK(INTERRUPT_EVENT_ID), chTimeUS2I(ttimeout));
-    const eventflags_t eflags = chEvtGetAndClearFlags(&event_listener);
-    if (emask == EVENT_MASK(INTERRUPT_EVENT_ID) && eflags == ((ut_at42qt1050data_t*)ut->data)->evtflags) {
-      // interrupt detected
-      chprintf(stream, "\t\tinterrupt detected\n");
-    } // else: timeout
-    status |= at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_KEYSTATUS, &buffer8[0], ((ut_at42qt1050data_t*)ut->data)->timeout);
-    chprintf(stream, "\t\tkey status: %u %u %u %u %u\n",
-             (((buffer8[0] & AT42QT1050_LLD_KEYSTATUS_KEY0) == 0) ? 0 : 1),
-             (((buffer8[0] & AT42QT1050_LLD_KEYSTATUS_KEY1) == 0) ? 0 : 1),
-             (((buffer8[0] & AT42QT1050_LLD_KEYSTATUS_KEY2) == 0) ? 0 : 1),
-             (((buffer8[0] & AT42QT1050_LLD_KEYSTATUS_KEY3) == 0) ? 0 : 1),
-             (((buffer8[0] & AT42QT1050_LLD_KEYSTATUS_KEY4) == 0) ? 0 : 1));
-    aosSysGetUptime(&tcurrent);
-  } while (tcurrent < tend);
-  chEvtUnregister(((ut_at42qt1050data_t*)ut->data)->evtsource, &event_listener);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(AT42QT1050Driver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_AT42QT1050) */
diff --git a/unittests/periphery-lld/src/ut_alld_bq24103a.c b/unittests/periphery-lld/src/ut_alld_bq24103a.c
deleted file mode 100644
index 81c2d5e..0000000
--- a/unittests/periphery-lld/src/ut_alld_bq24103a.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <ut_alld_bq24103a.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_BQ24103A)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-
-aos_utresult_t utAlldBq24103aFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status;
-  bq24103a_lld_enable_t en[3];
-  bq24103a_lld_charge_state_t charge;
-
-  chprintf(stream, "read enable pin...\n");
-  status = bq24103a_lld_get_enabled((BQ24103ADriver*)ut->data, &en[0]);
-  chprintf(stream, "\t\tcurrently %s\n", (en[0] == BQ24103A_LLD_ENABLED) ? "enabled" : "disabled");
-  if(status == APAL_STATUS_SUCCESS){
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "write enable pin...\n");
-  status = bq24103a_lld_set_enabled((BQ24103ADriver*)ut->data, (en[0] == BQ24103A_LLD_ENABLED) ? BQ24103A_LLD_DISABLED : BQ24103A_LLD_ENABLED);
-  aosThdMSleep(1);
-  status |= bq24103a_lld_get_enabled((BQ24103ADriver*)ut->data, &en[1]);
-  status |= bq24103a_lld_set_enabled((BQ24103ADriver*)ut->data, en[0]);
-  aosThdMSleep(1);
-  status |= bq24103a_lld_get_enabled((BQ24103ADriver*)ut->data, &en[2]);
-  if(status == APAL_STATUS_SUCCESS && en[0] != en[1] && en[0] == en[2] && en[1] != en[2]){
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X, %u-%u\n", status, en[1], en[2]);
-  }
-
-  chprintf(stream, "read status pin...\n");
-  aosThdMSleep(500);
-  status = bq24103a_lld_get_charge_status((BQ24103ADriver*)ut->data, &charge);
-  chprintf(stream, "\t\tcharge status: %scharging\n", (charge == BQ24103A_LLD_CHARGING) ? "" : "not ");
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(BQ24103ADriver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_BQ24103A) */
diff --git a/unittests/periphery-lld/src/ut_alld_bq241xx_v1.c b/unittests/periphery-lld/src/ut_alld_bq241xx_v1.c
new file mode 100644
index 0000000..de4ca1b
--- /dev/null
+++ b/unittests/periphery-lld/src/ut_alld_bq241xx_v1.c
@@ -0,0 +1,97 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_BQ241xx) && (AMIROLLD_CFG_BQ241xx == 1)) || defined(__DOXYGEN__)
+
+#include <ut_alld_bq241xx_v1.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+
+aos_utresult_t utAlldBq241xxFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
+{
+  aosDbgCheck(ut->data != NULL);
+
+  // local variables
+  aos_utresult_t result = {0, 0};
+  uint32_t status;
+  bq241xx_lld_enable_t en[3];
+  bq241xx_lld_charge_state_t charge;
+
+  chprintf(stream, "read enable pin...\n");
+  status = bq241xx_lld_get_enabled((BQ241xxDriver*)ut->data, &en[0]);
+  chprintf(stream, "\t\tcurrently %s\n", (en[0] == BQ241xx_LLD_ENABLED) ? "enabled" : "disabled");
+  if(status == APAL_STATUS_SUCCESS){
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "write enable pin...\n");
+  status = bq241xx_lld_set_enabled((BQ241xxDriver*)ut->data, (en[0] == BQ241xx_LLD_ENABLED) ? BQ241xx_LLD_DISABLED : BQ241xx_LLD_ENABLED);
+  aosThdMSleep(1);
+  status |= bq241xx_lld_get_enabled((BQ241xxDriver*)ut->data, &en[1]);
+  status |= bq241xx_lld_set_enabled((BQ241xxDriver*)ut->data, en[0]);
+  aosThdMSleep(1);
+  status |= bq241xx_lld_get_enabled((BQ241xxDriver*)ut->data, &en[2]);
+  if(status == APAL_STATUS_SUCCESS && en[0] != en[1] && en[0] == en[2] && en[1] != en[2]){
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X, %u-%u\n", status, en[1], en[2]);
+  }
+
+  chprintf(stream, "read status pin...\n");
+  aosThdMSleep(500);
+  status = bq241xx_lld_get_charge_status((BQ241xxDriver*)ut->data, &charge);
+  chprintf(stream, "\t\tcharge status: %scharging\n", (charge == BQ241xx_LLD_CHARGING) ? "" : "not ");
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(BQ241xxDriver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_BQ241xx) && (AMIROLLD_CFG_BQ241xx == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_bq27500.c b/unittests/periphery-lld/src/ut_alld_bq27500.c
deleted file mode 100644
index a627919..0000000
--- a/unittests/periphery-lld/src/ut_alld_bq27500.c
+++ /dev/null
@@ -1,554 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <ut_alld_bq27500.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_BQ27500)) || defined(__DOXYGEN__)
-
-#include <string.h>
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-// change saved unseal keys to test bruteforcing
-#ifdef BQ27500_UT_TEST_BRUTEFORCE
-
-#ifdef BQ27500_LLD_DEFAULT_UNSEAL_KEY0
-#undef BQ27500_LLD_DEFAULT_UNSEAL_KEY0
-#define BQ27500_LLD_DEFAULT_UNSEAL_KEY0 0x1234
-#endif
-
-#ifdef BQ27500_LLD_DEFAULT_UNSEAL_KEY1
-#undef BQ27500_LLD_DEFAULT_UNSEAL_KEY1
-#define BQ27500_LLD_DEFAULT_UNSEAL_KEY1 0x5678
-#endif
-
-#endif
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-bq27500_lld_control_status_t _try_unseal(BQ27500Driver* driver, uint16_t key0, uint16_t key1, apalTime_t timeout) {
-  uint16_t dst;
-  bq27500_lld_control_status_t ctrl;
-  bq27500_lld_send_ctnl_data(driver, key1, timeout);
-  aosThdUSleep(1);
-  bq27500_lld_send_ctnl_data(driver, key0, timeout);
-  aosThdUSleep(1);
-  bq27500_lld_sub_command_call(driver, BQ27500_LLD_SUB_CMD_CONTROL_STATUS, timeout);
-  aosThdUSleep(1);
-  bq27500_lld_std_command(driver, BQ27500_LLD_STD_CMD_Control, &dst, timeout);
-  bq27500_lld_sub_command_read(driver, &ctrl.value, timeout);
-  return ctrl;
-}
-
-uint8_t _bruteforce_sealed_key_bitflips(BaseSequentialStream* stream, BQ27500Driver* driver, uint16_t key0, uint16_t key1, apalTime_t timeout) {
-  bq27500_lld_control_status_t ctrl;
-  uint16_t k0;
-  uint16_t k1 = key1;
-  for (uint8_t i = 0; i < 16; i++) {
-    k0 = key0 ^ (1 << i); // flip bit i
-    ctrl = _try_unseal(driver, k0, k1, timeout);
-    if (ctrl.content.ss == 0x0) {
-      chprintf(stream, "\t\tSUCCESS!\n");
-      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", k0, k1);
-      return 1;
-    }
-  }
-  k0 = key0;
-  for (uint8_t i = 0; i < 16; i++) {
-    k1 = key1 ^ (1 << i); // flip bit i
-    ctrl = _try_unseal(driver, k0, k1, timeout);
-    if (ctrl.content.ss == 0x0) {
-      chprintf(stream, "\t\tSUCCESS!\n");
-      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", k0, k1);
-      return 1;
-    }
-  }
-  return 0;
-}
-
-void _bruteforce_sealed_key(BaseSequentialStream* stream, BQ27500Driver* driver, apalTime_t timeout) {
-  chprintf(stream, "start bruteforcing sealed keys...\n");
-  bq27500_lld_control_status_t ctrl;
-  uint16_t key0_reversed = 0x7236;
-  uint16_t key1_reversed = 0x1404;
-  uint16_t key0 = BQ27500_LLD_DEFAULT_UNSEAL_KEY0;
-  uint16_t key1 = BQ27500_LLD_DEFAULT_UNSEAL_KEY1;
-  uint16_t k0 = key0;
-  uint16_t k1 = key1;
-
-  // testing default keys in different orders
-  chprintf(stream, "\ttry reversed byte order and different key order...\n");
-  // default unseal keys
-  ctrl = _try_unseal(driver, k0, k1, timeout);
-  if (ctrl.content.ss == 0x0) {
-    chprintf(stream, "\t\tSUCCESS!\n");
-    chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", k0, k1);
-    return;
-  }
-  // default unseal keys in reversed order
-  ctrl = _try_unseal(driver, k1, k0, timeout);
-  if (ctrl.content.ss == 0x0) {
-    chprintf(stream, "\t\tSUCCESS!\n");
-    chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", k0, k1);
-    return;
-  }
-  // byte reversed keys
-  k0 = key0_reversed;
-  k1 = key1_reversed;
-  ctrl = _try_unseal(driver, k0, k1, timeout);
-  if (ctrl.content.ss == 0x0) {
-    chprintf(stream, "\t\tSUCCESS!\n");
-    chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", k0, k1);
-    return;
-  }
-  // byte reversed keys in reversed order
-  ctrl = _try_unseal(driver, k1, k0, timeout);
-  if (ctrl.content.ss == 0x0) {
-    chprintf(stream, "\t\tSUCCESS!\n");
-    chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", k0, k1);
-    return;
-  }
-  chprintf(stream, "\t\tfailed\n");
-
-
-  // testing single bit flips of the default keys in different orders
-  chprintf(stream, "\ttry single bit flips of default keys...\n");
-  // default unseal keys
-  uint8_t result = 0;
-  result = _bruteforce_sealed_key_bitflips(stream, driver, key0, key1, timeout);
-  if (result == 1) {
-    return;
-  }
-  // default unseal keys in reversed order
-  result = _bruteforce_sealed_key_bitflips(stream, driver, key1, key0, timeout);
-  if (result == 1) {
-    return;
-  }
-  // byte reversed keys
-  result = _bruteforce_sealed_key_bitflips(stream, driver, key0_reversed, key1_reversed, timeout);
-  if (result == 1) {
-    return;
-  }
-  // byte reversed keys in reversed order
-  result = _bruteforce_sealed_key_bitflips(stream, driver, key1_reversed, key0_reversed, timeout);
-  if (result == 1) {
-    return;
-  }
-  chprintf(stream, "\t\tfailed\n");
-
-
-  // bruteforcing one of the keys, assuming only one of them was changed
-  chprintf(stream, "\ttry bruteforcing a single key...\n");
-  // default unseal key0
-  for (uint32_t i = 0; i <= 0xFFFF; i++) {
-    ctrl = _try_unseal(driver, key0, i, timeout);
-    if (ctrl.content.ss == 0x0) {
-      chprintf(stream, "\t\tSUCCESS!\n");
-      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", key0, i);
-      return;
-    }
-  }
-  chprintf(stream, "\t\tkey failed. 1/8\n");
-  // reversed unseal key0
-  for (uint32_t i = 0; i <= 0xFFFF; i++) {
-    ctrl = _try_unseal(driver, key0_reversed, i, timeout);
-    if (ctrl.content.ss == 0x0) {
-      chprintf(stream, "\t\tSUCCESS!\n");
-      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", key0_reversed, i);
-      return;
-    }
-  }
-  chprintf(stream, "\t\tkey failed. 2/8\n");
-  // default unseal key0 in reversed order
-  for (uint32_t i = 0; i <= 0xFFFF; i++) {
-    ctrl = _try_unseal(driver, i, key0, timeout);
-    if (ctrl.content.ss == 0x0) {
-      chprintf(stream, "\t\tSUCCESS!\n");
-      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", i, key0);
-      return;
-    }
-  }
-  chprintf(stream, "\t\tkey failed. 3/8\n");
-  // reversed unseal key0 in reversed order
-  for (uint32_t i = 0; i <= 0xFFFF; i++) {
-    ctrl = _try_unseal(driver, i, key0_reversed, timeout);
-    if (ctrl.content.ss == 0x0) {
-      chprintf(stream, "\t\tSUCCESS!\n");
-      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", i, key0_reversed);
-      return;
-    }
-  }
-  chprintf(stream, "\t\tkey failed. 4/8\n");
-  // default unseal key1
-  for (uint32_t i = 0; i <= 0xFFFF; i++) {
-    ctrl = _try_unseal(driver, i, key1, timeout);
-    if (ctrl.content.ss == 0x0) {
-      chprintf(stream, "\t\tSUCCESS!\n");
-      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", i, key1);
-      return;
-    }
-  }
-  chprintf(stream, "\t\tkey failed. 5/8\n");
-  // reversed unseal key1
-  for (uint32_t i = 0; i <= 0xFFFF; i++) {
-    ctrl = _try_unseal(driver, i, key1_reversed, timeout);
-    if (ctrl.content.ss == 0x0) {
-      chprintf(stream, "\t\tSUCCESS!\n");
-      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", i, key1_reversed);
-      return;
-    }
-  }
-  chprintf(stream, "\t\tkey failed. 6/8\n");
-  // default unseal key1 in reversed order
-  for (uint32_t i = 0; i <= 0xFFFF; i++) {
-    ctrl = _try_unseal(driver, key1, i, timeout);
-    if (ctrl.content.ss == 0x0) {
-      chprintf(stream, "\t\tSUCCESS!\n");
-      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", key1, i);
-      return;
-    }
-  }
-  chprintf(stream, "\t\tkey failed. 7/8\n");
-  // reversed unseal key1 in reversed order
-  for (uint32_t i = 0; i <= 0xFFFF; i++) {
-    ctrl = _try_unseal(driver, key1_reversed, i, timeout);
-    if (ctrl.content.ss == 0x0) {
-      chprintf(stream, "\t\tSUCCESS!\n");
-      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", key1_reversed, i);
-      return;
-    }
-  }
-  chprintf(stream, "\t\tkey failed. 8/8\n");
-  chprintf(stream, "\t\tfailed\n");
-
-
-  // full bruteforce
-  chprintf(stream, "\tbruteforcing both keys...\t");
-  for (uint32_t i = 0; i <= 0xFFFF; i++) {
-    chprintf(stream, "\t\ti: %u\n", i);
-    for (uint32_t j = 0; j <= 0xFFFF; j++) {
-      ctrl = _try_unseal(driver, i, j, timeout);
-      if (ctrl.content.ss == 0x0) {
-        chprintf(stream, "\t\tSUCCESS!\n");
-        chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", i, j);
-        return;
-      }
-    }
-  }
-
-  chprintf(stream, "\t\tfailed, no keys could be found");
-}
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-aos_utresult_t utAlldBq27500Func(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL && ((ut_bq27500data_t*)(ut->data))->driver != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status;
-  bq27500_lld_batlow_t bl;
-  bq27500_lld_batgood_t bg;
-  uint16_t dst;
-  bq27500_lld_flags_t flags;
-  uint16_t subdata = 0;
-  uint8_t original_length;
-  char original_name[8+1];
-  uint8_t val = 0x00;
-  uint8_t block[32];
-  char new_name[] = "test";
-  uint8_t new_lenght;
-  char name[8+1] = {'\0'};
-  uint8_t sum = 0;
-  bool success;
-  bool success2;
-
-  chprintf(stream, "read battery low gpio...\n");
-  status = bq27500_lld_read_batlow(((ut_bq27500data_t*)ut->data)->driver, &bl);
-  chprintf(stream, "\t\tbattery low: 0x%X\n", bl);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "read battery good gpio...\n");
-  status = bq27500_lld_read_batgood(((ut_bq27500data_t*)ut->data)->driver, &bg);
-  chprintf(stream, "\t\tbattery good: 0x%X\n", bg);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "std command FLAGS...\n");
-  status = bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Flags, &flags.value, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tflags: 0x%04X\n", flags.value);
-  chprintf(stream, "\t\tbattery detected: 0x%X\n", flags.content.bat_det);
-  chprintf(stream, "\t\tbattery fully charged: 0x%X\n", flags.content.fc);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "std command CTNL...\n");
-  status = bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Control, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "sub command: CTRL Status...\n");
-  aosThdUSleep(1);
-  status = bq27500_lld_sub_command_call(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_SUB_CMD_CONTROL_STATUS, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdUSleep(1);
-  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Control, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdUSleep(1);
-  bq27500_lld_control_status_t ctrl;
-  status |= bq27500_lld_sub_command_read(((ut_bq27500data_t*)ut->data)->driver, &ctrl.value, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tdst: 0x%X\n", ctrl.value);
-  chprintf(stream, "\t\tsleep: 0x%X\n", ctrl.content.sleep);
-  chprintf(stream, "\t\thibernate: 0x%X\n", ctrl.content.hibernate);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "sub command: firmware version...\n");
-  status = bq27500_lld_sub_command_call(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_SUB_CMD_FW_VERSION, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(1);
-  bq27500_lld_version_t version;
-  status |= bq27500_lld_sub_command_read(((ut_bq27500data_t*)ut->data)->driver, &version.value, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tfirmware version: %X%X-%X%X\n", version.content.major_high, version.content.major_low, version.content.minor_high, version.content.minor_low);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "sub command: hardware version...\n");
-  status = bq27500_lld_sub_command_call(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_SUB_CMD_HW_VERSION, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(1);
-  status |= bq27500_lld_sub_command_read(((ut_bq27500data_t*)ut->data)->driver, &version.value, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\thardware version: %X%X-%X%X\n", version.content.major_high, version.content.major_low, version.content.minor_high, version.content.minor_low);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "ext command: device name length...\n");
-  status = bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DeviceNameLength, BQ27500_LLD_EXT_CMD_READ, &original_length, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tdevice name length: %d \n", original_length);
-  if (status == APAL_STATUS_SUCCESS && original_length <= 8) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-    original_length = 8;
-  }
-
-  chprintf(stream, "ext command: device name (read)...\n");
-  status = bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DeviceName, BQ27500_LLD_EXT_CMD_READ, (uint8_t*)original_name, original_length, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  original_name[original_length] = '\0';
-  chprintf(stream, "\t\tdevice name: %s\n", original_name);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "battery info std commands...\n");
-  status = bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Temperatur, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\ttemperature: %fK (%fC) \n", (float)dst/10.0f, (float)dst/10.0f-273.5f);
-  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_FullAvailableCapacity, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tfull available capacity: %umAh \n", dst);
-  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_FullChargeCapacity, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tfull charge capacity: %umAh \n", dst);
-  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_RemainingCapacity, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tremaining capacity: %umAh \n", dst);
-  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Voltage, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tvoltage: %umV \n", dst);
-  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_AverageCurrent, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\taverage current: %dmA \n", (int8_t)dst);
-  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_AveragePower, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\taverage power: %dmW \n", (int8_t)dst);
-  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_TimeToFull, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  if (dst != (uint16_t)~0) {
-    chprintf(stream, "\t\ttime to full: %umin \n", dst);
-  } else {
-    chprintf(stream, "\t\ttime to full: (not charging) \n", dst);
-  }
-  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_TimeToEmpty, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  if (dst != (uint16_t)~0) {
-    chprintf(stream, "\t\ttime to empty: %umin \n", dst);
-  } else {
-    chprintf(stream, "\t\ttime to empty: (not discharging) \n", dst);
-  }
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "check sealed state...\n");
-  status = bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Control, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  status |= bq27500_lld_sub_command_call(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_SUB_CMD_CONTROL_STATUS, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(1);
-  status |= bq27500_lld_sub_command_read(((ut_bq27500data_t*)ut->data)->driver, &ctrl.value, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tsealed: 0x%X\n", ctrl.content.ss);
-  chprintf(stream, "\t\tfull access sealed: 0x%X\n", ctrl.content.fas);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "unseale...\n");
-  status = bq27500_lld_send_ctnl_data(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_DEFAULT_UNSEAL_KEY1, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(1);
-  status |= bq27500_lld_send_ctnl_data(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_DEFAULT_UNSEAL_KEY0, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(1);
-  status |= bq27500_lld_sub_command_call(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_SUB_CMD_CONTROL_STATUS, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(1);
-  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Control, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  status |= bq27500_lld_sub_command_read(((ut_bq27500data_t*)ut->data)->driver, &ctrl.value, ((ut_bq27500data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS && ctrl.content.ss == 0x0) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-    _bruteforce_sealed_key(stream, ((ut_bq27500data_t*)ut->data)->driver, ((ut_bq27500data_t*)ut->data)->timeout);
-  }
-
-  chprintf(stream, "read device name from data flash...\n");
-  status = bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockDataControl, BQ27500_LLD_EXT_CMD_WRITE, &val, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  val = 0x30;
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DataFlashClass, BQ27500_LLD_EXT_CMD_WRITE, &val, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  val = 0;
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DataFlashBlock, BQ27500_LLD_EXT_CMD_WRITE, &val, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockData, BQ27500_LLD_EXT_CMD_READ, (uint8_t*)block, original_length, 13, ((ut_bq27500data_t*)ut->data)->timeout);
-  block[original_length] = '\0';
-  chprintf(stream, "\t\tdevice name: %s\n", block);
-  if (status == APAL_STATUS_SUCCESS && (strcmp((char*)block, (char*)original_name) == 0)) {
-    aosUtPassed(stream, &result);
-  } else {
-    chprintf(stream, "\t\tread data: ");
-    for (uint8_t blockIdx = 0; blockIdx < original_length; blockIdx++) {
-      chprintf(stream, "0x%02X\n", block[blockIdx]);
-    }
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "change device name in data flash to \"test\"...\n");
-  status = bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockData, BQ27500_LLD_EXT_CMD_WRITE, (uint8_t*)new_name, 5, 13, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockData, BQ27500_LLD_EXT_CMD_READ, (uint8_t*)block, 32, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  // compute blockdata checksum
-  status |= bq27500_lld_compute_blockdata_checksum(block, &sum);
-  // write checksum to BlockDataChecksum, triggering the write of BlackData
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockDataCheckSum, BQ27500_LLD_EXT_CMD_WRITE, &sum, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DeviceNameLength, BQ27500_LLD_EXT_CMD_READ, &new_lenght, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  // read out device name, to see if changing it was successfull
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DeviceName, BQ27500_LLD_EXT_CMD_READ, (uint8_t*)name, new_lenght, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  name[new_lenght] = '\0';
-  chprintf(stream, "\t\tdevice name: %s\n", name);
-  success = (strcmp(name, new_name) == 0);
-
-  // change device name back to original name
-  val = 0x00;
-  status = bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockDataControl, BQ27500_LLD_EXT_CMD_WRITE, &val, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  val = 0x30;
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DataFlashClass, BQ27500_LLD_EXT_CMD_WRITE, &val, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  val = 0;
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DataFlashBlock, BQ27500_LLD_EXT_CMD_WRITE, &val, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockData, BQ27500_LLD_EXT_CMD_WRITE, (uint8_t*)original_name, 7, 13, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockData, BQ27500_LLD_EXT_CMD_READ, (uint8_t*)block, 32, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  // compute blockdata checksum
-  sum = 0;
-  status |= bq27500_lld_compute_blockdata_checksum(block, &sum);
-  // write checksum to BlockDataChecksum, triggering the write of BlackData
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockDataCheckSum, BQ27500_LLD_EXT_CMD_WRITE, &sum, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(1000);
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DeviceNameLength, BQ27500_LLD_EXT_CMD_READ, &original_length, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  // read device name, to see if changing it back to the original name was successfull
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DeviceName, BQ27500_LLD_EXT_CMD_READ, (uint8_t*)name, original_length, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  success2 = (strcmp(name, original_name) == 0);
-  name[original_length] = '\0';
-  chprintf(stream, "\t\tchanged back to name: %s, original_name: %s\n", name, original_name);
-  if (status == APAL_STATUS_OK && ((success && success2) || (ctrl.content.sleep == 0))) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X, changing: 0x%X - changing back: 0x%X\n", status, success, success2);
-  }
-
-  chprintf(stream, "seal...\n");
-  status = bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Control, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  status |= bq27500_lld_sub_command_call(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_SUB_CMD_SEALED, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Control, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  status |= bq27500_lld_sub_command_call(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_SUB_CMD_CONTROL_STATUS, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  status |= bq27500_lld_sub_command_read(((ut_bq27500data_t*)ut->data)->driver, &ctrl.value, ((ut_bq27500data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS && ctrl.content.ss == 0x1) {
-    aosUtPassed(stream, &result);
-  } else {
-    chprintf(stream, "\tfailed (0x%X)\n", status);
-    aosUtFailedMsg(stream, &result, "0x%08X, ctrl 0x%X\n", status, subdata);
-    ++result.failed;
-  }
-
-  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(BQ27500Driver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_BQ27500) */
-
diff --git a/unittests/periphery-lld/src/ut_alld_bq27500_bq24103a.c b/unittests/periphery-lld/src/ut_alld_bq27500_bq24103a.c
deleted file mode 100644
index c188df2..0000000
--- a/unittests/periphery-lld/src/ut_alld_bq27500_bq24103a.c
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <ut_alld_bq27500_bq24103a.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_BQ27500) && defined(AMIROLLD_CFG_USE_BQ24103A)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-
-aos_utresult_t utAlldBq27500Bq24103aFunc(BaseSequentialStream *stream, aos_unittest_t *ut)
-{
-  aosDbgCheck(ut->data != NULL && ((ut_bq27500bq24103adata_t*)ut->data)->bq27500 != NULL && ((ut_bq27500bq24103adata_t*)ut->data)->bq24103a != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status;
-  uint16_t dst;
-  bq27500_lld_flags_t flags;
-  bq27500_lld_batgood_t bg;
-  bq24103a_lld_enable_t charger_enabled;
-  uint32_t sleeptime_s;
-  bq24103a_lld_charge_state_t charge;
-
-  chprintf(stream, "check for battery...\n");
-  status = bq27500_lld_std_command(((ut_bq27500bq24103adata_t*)ut->data)->bq27500, BQ27500_LLD_STD_CMD_Flags, &dst, ((ut_bq27500bq24103adata_t*)ut->data)->timeout);
-  flags.value = dst;
-  chprintf(stream, "\t\tbattery detected: %s\n", flags.content.bat_det ? "yes" : "no");
-  chprintf(stream, "\t\tbattery fully charged: %s\n", flags.content.fc ? "yes" : "no");
-  status |= bq27500_lld_read_batgood(((ut_bq27500bq24103adata_t*)ut->data)->bq27500, &bg);
-  chprintf(stream, "\t\tbattery good: %s\n", (bg == BQ27500_LLD_BATTERY_GOOD) ? "yes" : "no");
-  if (status == APAL_STATUS_SUCCESS) {
-    if (!flags.content.bat_det) {
-      aosUtPassedMsg(stream, &result, "no battery detected, aborting\n");
-      return result;
-    } else if (!bg) {
-      aosUtPassedMsg(stream, &result, "battery damaged, aborting\n");
-      return result;
-    } else {
-      aosUtPassed(stream, &result);
-    }
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X; aborting\n", status);
-    return result;
-  }
-
-  chprintf(stream, "get current charger setting...\n");
-  status = bq24103a_lld_get_enabled(((ut_bq27500bq24103adata_t*)ut->data)->bq24103a, &charger_enabled);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassedMsg(stream, &result, "currently %s\n", (charger_enabled == BQ24103A_LLD_ENABLED) ? "enabled" : "disabled");
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  // disable/enable charger
-  for (uint8_t iteration = 0; iteration < 2; ++iteration) {
-    if (charger_enabled == BQ24103A_LLD_ENABLED) {
-      sleeptime_s = 120;
-      chprintf(stream, "disable charger...\n");
-      status = bq24103a_lld_set_enabled(((ut_bq27500bq24103adata_t*)ut->data)->bq24103a, BQ24103A_LLD_DISABLED);
-      aosThdSSleep(1);
-      status |= bq24103a_lld_get_enabled(((ut_bq27500bq24103adata_t*)ut->data)->bq24103a, &charger_enabled);
-      status |= (charger_enabled == BQ24103A_LLD_DISABLED) ? 0x0000 : 0x0100;
-      for (uint32_t s = 0; s < sleeptime_s; ++s) {
-        int nchars = chprintf(stream, "%us / %us", s, sleeptime_s);
-        aosThdSSleep(1);
-        for (int c = 0; c < nchars; ++c) {
-          chprintf(stream, "\b \b");
-        }
-      }
-      status |= bq24103a_lld_get_charge_status(((ut_bq27500bq24103adata_t*)ut->data)->bq24103a, &charge);
-      chprintf(stream, "\t\tcharge status: %scharging\n", (charge == BQ24103A_LLD_CHARGING) ? "" : "not ");
-      status |= bq27500_lld_std_command(((ut_bq27500bq24103adata_t*)ut->data)->bq27500, BQ27500_LLD_STD_CMD_TimeToFull, &dst, ((ut_bq27500bq24103adata_t*)ut->data)->timeout);
-      if (status == APAL_STATUS_SUCCESS) {
-        if (dst == 0xFFFF || dst == 0) {
-          aosUtPassedMsg(stream, &result, "battery %sfull\n", flags.content.fc ? "" : "not ");
-        } else {
-          aosUtFailedMsg(stream, &result, "battery %sfull but charging (TTF = %umin)\n", flags.content.fc ? "" : "not ", dst);
-        }
-      } else {
-        aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-      }
-    }
-    else { /* charger_enabled != BQ24103A_LLD_ENABLED */
-      sleeptime_s = 90;
-      chprintf(stream, "enable charger...\n");
-      status = bq24103a_lld_set_enabled(((ut_bq27500bq24103adata_t*)ut->data)->bq24103a, BQ24103A_LLD_ENABLED);
-      aosThdSSleep(1);
-      status |= bq24103a_lld_get_enabled(((ut_bq27500bq24103adata_t*)ut->data)->bq24103a, &charger_enabled);
-      status |= (charger_enabled == BQ24103A_LLD_ENABLED) ? 0x0000 : 0x0100;
-      for (uint32_t s = 0; s < sleeptime_s; ++s) {
-        int nchars = chprintf(stream, "%us / %us", s, sleeptime_s);
-        aosThdSSleep(1);
-        for (int c = 0; c < nchars; ++c) {
-          chprintf(stream, "\b \b");
-        }
-      }
-      status |= bq24103a_lld_get_charge_status(((ut_bq27500bq24103adata_t*)ut->data)->bq24103a, &charge);
-      chprintf(stream, "\t\tcharge status: %scharging\n", (charge == BQ24103A_LLD_CHARGING) ? "" : "not ");
-      status |= bq27500_lld_std_command(((ut_bq27500bq24103adata_t*)ut->data)->bq27500, BQ27500_LLD_STD_CMD_TimeToFull, &dst, ((ut_bq27500bq24103adata_t*)ut->data)->timeout);
-      if (status == APAL_STATUS_SUCCESS) {
-        if (((dst == 0xFFFF || dst == 0) && flags.content.fc) || (!(dst == 0xFFFF || dst == 0) && !flags.content.fc)) {
-          aosUtPassedMsg(stream, &result, "battery %sfull and %scharging (TTF = %umin)\n", flags.content.fc ? "" : "not ", (dst != 0xFFFF || dst != 0) ? "" : "not ", dst);
-        } else {
-          aosUtFailedMsg(stream, &result, "battery %sfull and %scharging (TTF = %umin)\n", flags.content.fc ? "" : "not ", (dst != 0xFFFF || dst != 0) ? "" : "not ", dst);
-        }
-      } else {
-        aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-      }
-    }
-
-    bq24103a_lld_get_enabled(((ut_bq27500bq24103adata_t*)ut->data)->bq24103a, &charger_enabled);
-  }
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_BQ27500) && defined(AMIROLLD_CFG_USE_BQ24103A) */
diff --git a/unittests/periphery-lld/src/ut_alld_bq27500_v1.c b/unittests/periphery-lld/src/ut_alld_bq27500_v1.c
new file mode 100644
index 0000000..662b3bd
--- /dev/null
+++ b/unittests/periphery-lld/src/ut_alld_bq27500_v1.c
@@ -0,0 +1,555 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_BQ27500) && (AMIROLLD_CFG_BQ27500 == 1)) || defined(__DOXYGEN__)
+
+#include <ut_alld_bq27500_v1.h>
+#include <string.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+// change saved unseal keys to test bruteforcing
+#ifdef BQ27500_UT_TEST_BRUTEFORCE
+
+#ifdef BQ27500_LLD_DEFAULT_UNSEAL_KEY0
+#undef BQ27500_LLD_DEFAULT_UNSEAL_KEY0
+#define BQ27500_LLD_DEFAULT_UNSEAL_KEY0 0x1234
+#endif
+
+#ifdef BQ27500_LLD_DEFAULT_UNSEAL_KEY1
+#undef BQ27500_LLD_DEFAULT_UNSEAL_KEY1
+#define BQ27500_LLD_DEFAULT_UNSEAL_KEY1 0x5678
+#endif
+
+#endif
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+bq27500_lld_control_status_t _try_unseal(BQ27500Driver* driver, uint16_t key0, uint16_t key1, apalTime_t timeout) {
+  uint16_t dst;
+  bq27500_lld_control_status_t ctrl;
+  bq27500_lld_send_ctnl_data(driver, key1, timeout);
+  aosThdUSleep(1);
+  bq27500_lld_send_ctnl_data(driver, key0, timeout);
+  aosThdUSleep(1);
+  bq27500_lld_sub_command_call(driver, BQ27500_LLD_SUB_CMD_CONTROL_STATUS, timeout);
+  aosThdUSleep(1);
+  bq27500_lld_std_command(driver, BQ27500_LLD_STD_CMD_Control, &dst, timeout);
+  bq27500_lld_sub_command_read(driver, &ctrl.value, timeout);
+  return ctrl;
+}
+
+uint8_t _bruteforce_sealed_key_bitflips(BaseSequentialStream* stream, BQ27500Driver* driver, uint16_t key0, uint16_t key1, apalTime_t timeout) {
+  bq27500_lld_control_status_t ctrl;
+  uint16_t k0;
+  uint16_t k1 = key1;
+  for (uint8_t i = 0; i < 16; i++) {
+    k0 = key0 ^ (1 << i); // flip bit i
+    ctrl = _try_unseal(driver, k0, k1, timeout);
+    if (ctrl.content.ss == 0x0) {
+      chprintf(stream, "\t\tSUCCESS!\n");
+      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", k0, k1);
+      return 1;
+    }
+  }
+  k0 = key0;
+  for (uint8_t i = 0; i < 16; i++) {
+    k1 = key1 ^ (1 << i); // flip bit i
+    ctrl = _try_unseal(driver, k0, k1, timeout);
+    if (ctrl.content.ss == 0x0) {
+      chprintf(stream, "\t\tSUCCESS!\n");
+      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", k0, k1);
+      return 1;
+    }
+  }
+  return 0;
+}
+
+void _bruteforce_sealed_key(BaseSequentialStream* stream, BQ27500Driver* driver, apalTime_t timeout) {
+  chprintf(stream, "start bruteforcing sealed keys...\n");
+  bq27500_lld_control_status_t ctrl;
+  uint16_t key0_reversed = 0x7236;
+  uint16_t key1_reversed = 0x1404;
+  uint16_t key0 = BQ27500_LLD_DEFAULT_UNSEAL_KEY0;
+  uint16_t key1 = BQ27500_LLD_DEFAULT_UNSEAL_KEY1;
+  uint16_t k0 = key0;
+  uint16_t k1 = key1;
+
+  // testing default keys in different orders
+  chprintf(stream, "\ttry reversed byte order and different key order...\n");
+  // default unseal keys
+  ctrl = _try_unseal(driver, k0, k1, timeout);
+  if (ctrl.content.ss == 0x0) {
+    chprintf(stream, "\t\tSUCCESS!\n");
+    chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", k0, k1);
+    return;
+  }
+  // default unseal keys in reversed order
+  ctrl = _try_unseal(driver, k1, k0, timeout);
+  if (ctrl.content.ss == 0x0) {
+    chprintf(stream, "\t\tSUCCESS!\n");
+    chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", k0, k1);
+    return;
+  }
+  // byte reversed keys
+  k0 = key0_reversed;
+  k1 = key1_reversed;
+  ctrl = _try_unseal(driver, k0, k1, timeout);
+  if (ctrl.content.ss == 0x0) {
+    chprintf(stream, "\t\tSUCCESS!\n");
+    chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", k0, k1);
+    return;
+  }
+  // byte reversed keys in reversed order
+  ctrl = _try_unseal(driver, k1, k0, timeout);
+  if (ctrl.content.ss == 0x0) {
+    chprintf(stream, "\t\tSUCCESS!\n");
+    chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", k0, k1);
+    return;
+  }
+  chprintf(stream, "\t\tfailed\n");
+
+
+  // testing single bit flips of the default keys in different orders
+  chprintf(stream, "\ttry single bit flips of default keys...\n");
+  // default unseal keys
+  uint8_t result = 0;
+  result = _bruteforce_sealed_key_bitflips(stream, driver, key0, key1, timeout);
+  if (result == 1) {
+    return;
+  }
+  // default unseal keys in reversed order
+  result = _bruteforce_sealed_key_bitflips(stream, driver, key1, key0, timeout);
+  if (result == 1) {
+    return;
+  }
+  // byte reversed keys
+  result = _bruteforce_sealed_key_bitflips(stream, driver, key0_reversed, key1_reversed, timeout);
+  if (result == 1) {
+    return;
+  }
+  // byte reversed keys in reversed order
+  result = _bruteforce_sealed_key_bitflips(stream, driver, key1_reversed, key0_reversed, timeout);
+  if (result == 1) {
+    return;
+  }
+  chprintf(stream, "\t\tfailed\n");
+
+
+  // bruteforcing one of the keys, assuming only one of them was changed
+  chprintf(stream, "\ttry bruteforcing a single key...\n");
+  // default unseal key0
+  for (uint32_t i = 0; i <= 0xFFFF; i++) {
+    ctrl = _try_unseal(driver, key0, i, timeout);
+    if (ctrl.content.ss == 0x0) {
+      chprintf(stream, "\t\tSUCCESS!\n");
+      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", key0, i);
+      return;
+    }
+  }
+  chprintf(stream, "\t\tkey failed. 1/8\n");
+  // reversed unseal key0
+  for (uint32_t i = 0; i <= 0xFFFF; i++) {
+    ctrl = _try_unseal(driver, key0_reversed, i, timeout);
+    if (ctrl.content.ss == 0x0) {
+      chprintf(stream, "\t\tSUCCESS!\n");
+      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", key0_reversed, i);
+      return;
+    }
+  }
+  chprintf(stream, "\t\tkey failed. 2/8\n");
+  // default unseal key0 in reversed order
+  for (uint32_t i = 0; i <= 0xFFFF; i++) {
+    ctrl = _try_unseal(driver, i, key0, timeout);
+    if (ctrl.content.ss == 0x0) {
+      chprintf(stream, "\t\tSUCCESS!\n");
+      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", i, key0);
+      return;
+    }
+  }
+  chprintf(stream, "\t\tkey failed. 3/8\n");
+  // reversed unseal key0 in reversed order
+  for (uint32_t i = 0; i <= 0xFFFF; i++) {
+    ctrl = _try_unseal(driver, i, key0_reversed, timeout);
+    if (ctrl.content.ss == 0x0) {
+      chprintf(stream, "\t\tSUCCESS!\n");
+      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", i, key0_reversed);
+      return;
+    }
+  }
+  chprintf(stream, "\t\tkey failed. 4/8\n");
+  // default unseal key1
+  for (uint32_t i = 0; i <= 0xFFFF; i++) {
+    ctrl = _try_unseal(driver, i, key1, timeout);
+    if (ctrl.content.ss == 0x0) {
+      chprintf(stream, "\t\tSUCCESS!\n");
+      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", i, key1);
+      return;
+    }
+  }
+  chprintf(stream, "\t\tkey failed. 5/8\n");
+  // reversed unseal key1
+  for (uint32_t i = 0; i <= 0xFFFF; i++) {
+    ctrl = _try_unseal(driver, i, key1_reversed, timeout);
+    if (ctrl.content.ss == 0x0) {
+      chprintf(stream, "\t\tSUCCESS!\n");
+      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", i, key1_reversed);
+      return;
+    }
+  }
+  chprintf(stream, "\t\tkey failed. 6/8\n");
+  // default unseal key1 in reversed order
+  for (uint32_t i = 0; i <= 0xFFFF; i++) {
+    ctrl = _try_unseal(driver, key1, i, timeout);
+    if (ctrl.content.ss == 0x0) {
+      chprintf(stream, "\t\tSUCCESS!\n");
+      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", key1, i);
+      return;
+    }
+  }
+  chprintf(stream, "\t\tkey failed. 7/8\n");
+  // reversed unseal key1 in reversed order
+  for (uint32_t i = 0; i <= 0xFFFF; i++) {
+    ctrl = _try_unseal(driver, key1_reversed, i, timeout);
+    if (ctrl.content.ss == 0x0) {
+      chprintf(stream, "\t\tSUCCESS!\n");
+      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", key1_reversed, i);
+      return;
+    }
+  }
+  chprintf(stream, "\t\tkey failed. 8/8\n");
+  chprintf(stream, "\t\tfailed\n");
+
+
+  // full bruteforce
+  chprintf(stream, "\tbruteforcing both keys...\t");
+  for (uint32_t i = 0; i <= 0xFFFF; i++) {
+    chprintf(stream, "\t\ti: %u\n", i);
+    for (uint32_t j = 0; j <= 0xFFFF; j++) {
+      ctrl = _try_unseal(driver, i, j, timeout);
+      if (ctrl.content.ss == 0x0) {
+        chprintf(stream, "\t\tSUCCESS!\n");
+        chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", i, j);
+        return;
+      }
+    }
+  }
+
+  chprintf(stream, "\t\tfailed, no keys could be found");
+}
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+aos_utresult_t utAlldBq27500Func(BaseSequentialStream* stream, aos_unittest_t* ut)
+{
+  aosDbgCheck(ut->data != NULL && ((ut_bq27500data_t*)(ut->data))->driver != NULL);
+
+  // local variables
+  aos_utresult_t result = {0, 0};
+  uint32_t status;
+  bq27500_lld_batlow_t bl;
+  bq27500_lld_batgood_t bg;
+  uint16_t dst;
+  bq27500_lld_flags_t flags;
+  uint16_t subdata = 0;
+  uint8_t original_length;
+  char original_name[8+1];
+  uint8_t val = 0x00;
+  uint8_t block[32];
+  char new_name[] = "test";
+  uint8_t new_lenght;
+  char name[8+1] = {'\0'};
+  uint8_t sum = 0;
+  bool success;
+  bool success2;
+
+  chprintf(stream, "read battery low gpio...\n");
+  status = bq27500_lld_read_batlow(((ut_bq27500data_t*)ut->data)->driver, &bl);
+  chprintf(stream, "\t\tbattery low: 0x%X\n", bl);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "read battery good gpio...\n");
+  status = bq27500_lld_read_batgood(((ut_bq27500data_t*)ut->data)->driver, &bg);
+  chprintf(stream, "\t\tbattery good: 0x%X\n", bg);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "std command FLAGS...\n");
+  status = bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Flags, &flags.value, ((ut_bq27500data_t*)ut->data)->timeout);
+  chprintf(stream, "\t\tflags: 0x%04X\n", flags.value);
+  chprintf(stream, "\t\tbattery detected: 0x%X\n", flags.content.bat_det);
+  chprintf(stream, "\t\tbattery fully charged: 0x%X\n", flags.content.fc);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "std command CTNL...\n");
+  status = bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Control, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "sub command: CTRL Status...\n");
+  aosThdUSleep(1);
+  status = bq27500_lld_sub_command_call(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_SUB_CMD_CONTROL_STATUS, ((ut_bq27500data_t*)ut->data)->timeout);
+  aosThdUSleep(1);
+  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Control, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
+  aosThdUSleep(1);
+  bq27500_lld_control_status_t ctrl;
+  status |= bq27500_lld_sub_command_read(((ut_bq27500data_t*)ut->data)->driver, &ctrl.value, ((ut_bq27500data_t*)ut->data)->timeout);
+  chprintf(stream, "\t\tdst: 0x%X\n", ctrl.value);
+  chprintf(stream, "\t\tsleep: 0x%X\n", ctrl.content.sleep);
+  chprintf(stream, "\t\thibernate: 0x%X\n", ctrl.content.hibernate);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "sub command: firmware version...\n");
+  status = bq27500_lld_sub_command_call(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_SUB_CMD_FW_VERSION, ((ut_bq27500data_t*)ut->data)->timeout);
+  aosThdMSleep(1);
+  bq27500_lld_version_t version;
+  status |= bq27500_lld_sub_command_read(((ut_bq27500data_t*)ut->data)->driver, &version.value, ((ut_bq27500data_t*)ut->data)->timeout);
+  chprintf(stream, "\t\tfirmware version: %X%X-%X%X\n", version.content.major_high, version.content.major_low, version.content.minor_high, version.content.minor_low);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "sub command: hardware version...\n");
+  status = bq27500_lld_sub_command_call(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_SUB_CMD_HW_VERSION, ((ut_bq27500data_t*)ut->data)->timeout);
+  aosThdMSleep(1);
+  status |= bq27500_lld_sub_command_read(((ut_bq27500data_t*)ut->data)->driver, &version.value, ((ut_bq27500data_t*)ut->data)->timeout);
+  chprintf(stream, "\t\thardware version: %X%X-%X%X\n", version.content.major_high, version.content.major_low, version.content.minor_high, version.content.minor_low);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "ext command: device name length...\n");
+  status = bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DeviceNameLength, BQ27500_LLD_EXT_CMD_READ, &original_length, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
+  chprintf(stream, "\t\tdevice name length: %d \n", original_length);
+  if (status == APAL_STATUS_SUCCESS && original_length <= 8) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+    original_length = 8;
+  }
+
+  chprintf(stream, "ext command: device name (read)...\n");
+  status = bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DeviceName, BQ27500_LLD_EXT_CMD_READ, (uint8_t*)original_name, original_length, 0, ((ut_bq27500data_t*)ut->data)->timeout);
+  original_name[original_length] = '\0';
+  chprintf(stream, "\t\tdevice name: %s\n", original_name);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "battery info std commands...\n");
+  status = bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Temperatur, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
+  chprintf(stream, "\t\ttemperature: %fK (%fC) \n", (float)dst/10.0f, (float)dst/10.0f-273.5f);
+  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_FullAvailableCapacity, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
+  chprintf(stream, "\t\tfull available capacity: %umAh \n", dst);
+  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_FullChargeCapacity, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
+  chprintf(stream, "\t\tfull charge capacity: %umAh \n", dst);
+  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_RemainingCapacity, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
+  chprintf(stream, "\t\tremaining capacity: %umAh \n", dst);
+  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Voltage, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
+  chprintf(stream, "\t\tvoltage: %umV \n", dst);
+  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_AverageCurrent, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
+  chprintf(stream, "\t\taverage current: %dmA \n", (int8_t)dst);
+  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_AveragePower, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
+  chprintf(stream, "\t\taverage power: %dmW \n", (int8_t)dst);
+  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_TimeToFull, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
+  if (dst != (uint16_t)~0) {
+    chprintf(stream, "\t\ttime to full: %umin \n", dst);
+  } else {
+    chprintf(stream, "\t\ttime to full: (not charging) \n", dst);
+  }
+  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_TimeToEmpty, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
+  if (dst != (uint16_t)~0) {
+    chprintf(stream, "\t\ttime to empty: %umin \n", dst);
+  } else {
+    chprintf(stream, "\t\ttime to empty: (not discharging) \n", dst);
+  }
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "check sealed state...\n");
+  status = bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Control, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
+  status |= bq27500_lld_sub_command_call(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_SUB_CMD_CONTROL_STATUS, ((ut_bq27500data_t*)ut->data)->timeout);
+  aosThdMSleep(1);
+  status |= bq27500_lld_sub_command_read(((ut_bq27500data_t*)ut->data)->driver, &ctrl.value, ((ut_bq27500data_t*)ut->data)->timeout);
+  chprintf(stream, "\t\tsealed: 0x%X\n", ctrl.content.ss);
+  chprintf(stream, "\t\tfull access sealed: 0x%X\n", ctrl.content.fas);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "unseale...\n");
+  status = bq27500_lld_send_ctnl_data(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_DEFAULT_UNSEAL_KEY1, ((ut_bq27500data_t*)ut->data)->timeout);
+  aosThdMSleep(1);
+  status |= bq27500_lld_send_ctnl_data(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_DEFAULT_UNSEAL_KEY0, ((ut_bq27500data_t*)ut->data)->timeout);
+  aosThdMSleep(1);
+  status |= bq27500_lld_sub_command_call(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_SUB_CMD_CONTROL_STATUS, ((ut_bq27500data_t*)ut->data)->timeout);
+  aosThdMSleep(1);
+  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Control, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
+  status |= bq27500_lld_sub_command_read(((ut_bq27500data_t*)ut->data)->driver, &ctrl.value, ((ut_bq27500data_t*)ut->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS && ctrl.content.ss == 0x0) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+    _bruteforce_sealed_key(stream, ((ut_bq27500data_t*)ut->data)->driver, ((ut_bq27500data_t*)ut->data)->timeout);
+  }
+
+  chprintf(stream, "read device name from data flash...\n");
+  status = bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockDataControl, BQ27500_LLD_EXT_CMD_WRITE, &val, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
+  aosThdMSleep(50);
+  val = 0x30;
+  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DataFlashClass, BQ27500_LLD_EXT_CMD_WRITE, &val, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
+  aosThdMSleep(50);
+  val = 0;
+  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DataFlashBlock, BQ27500_LLD_EXT_CMD_WRITE, &val, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
+  aosThdMSleep(50);
+  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockData, BQ27500_LLD_EXT_CMD_READ, (uint8_t*)block, original_length, 13, ((ut_bq27500data_t*)ut->data)->timeout);
+  block[original_length] = '\0';
+  chprintf(stream, "\t\tdevice name: %s\n", block);
+  if (status == APAL_STATUS_SUCCESS && (strcmp((char*)block, (char*)original_name) == 0)) {
+    aosUtPassed(stream, &result);
+  } else {
+    chprintf(stream, "\t\tread data: ");
+    for (uint8_t blockIdx = 0; blockIdx < original_length; blockIdx++) {
+      chprintf(stream, "0x%02X\n", block[blockIdx]);
+    }
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "change device name in data flash to \"test\"...\n");
+  status = bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockData, BQ27500_LLD_EXT_CMD_WRITE, (uint8_t*)new_name, 5, 13, ((ut_bq27500data_t*)ut->data)->timeout);
+  aosThdMSleep(50);
+  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockData, BQ27500_LLD_EXT_CMD_READ, (uint8_t*)block, 32, 0, ((ut_bq27500data_t*)ut->data)->timeout);
+  // compute blockdata checksum
+  status |= bq27500_lld_compute_blockdata_checksum(block, &sum);
+  // write checksum to BlockDataChecksum, triggering the write of BlackData
+  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockDataCheckSum, BQ27500_LLD_EXT_CMD_WRITE, &sum, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
+  aosThdMSleep(50);
+  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DeviceNameLength, BQ27500_LLD_EXT_CMD_READ, &new_lenght, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
+  aosThdMSleep(50);
+  // read out device name, to see if changing it was successfull
+  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DeviceName, BQ27500_LLD_EXT_CMD_READ, (uint8_t*)name, new_lenght, 0, ((ut_bq27500data_t*)ut->data)->timeout);
+  name[new_lenght] = '\0';
+  chprintf(stream, "\t\tdevice name: %s\n", name);
+  success = (strcmp(name, new_name) == 0);
+
+  // change device name back to original name
+  val = 0x00;
+  status = bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockDataControl, BQ27500_LLD_EXT_CMD_WRITE, &val, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
+  aosThdMSleep(50);
+  val = 0x30;
+  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DataFlashClass, BQ27500_LLD_EXT_CMD_WRITE, &val, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
+  aosThdMSleep(50);
+  val = 0;
+  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DataFlashBlock, BQ27500_LLD_EXT_CMD_WRITE, &val, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
+  aosThdMSleep(50);
+  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockData, BQ27500_LLD_EXT_CMD_WRITE, (uint8_t*)original_name, 7, 13, ((ut_bq27500data_t*)ut->data)->timeout);
+  aosThdMSleep(50);
+  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockData, BQ27500_LLD_EXT_CMD_READ, (uint8_t*)block, 32, 0, ((ut_bq27500data_t*)ut->data)->timeout);
+  // compute blockdata checksum
+  sum = 0;
+  status |= bq27500_lld_compute_blockdata_checksum(block, &sum);
+  // write checksum to BlockDataChecksum, triggering the write of BlackData
+  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockDataCheckSum, BQ27500_LLD_EXT_CMD_WRITE, &sum, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
+  aosThdMSleep(1000);
+  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DeviceNameLength, BQ27500_LLD_EXT_CMD_READ, &original_length, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
+  aosThdMSleep(50);
+  // read device name, to see if changing it back to the original name was successfull
+  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DeviceName, BQ27500_LLD_EXT_CMD_READ, (uint8_t*)name, original_length, 0, ((ut_bq27500data_t*)ut->data)->timeout);
+  success2 = (strcmp(name, original_name) == 0);
+  name[original_length] = '\0';
+  chprintf(stream, "\t\tchanged back to name: %s, original_name: %s\n", name, original_name);
+  if (status == APAL_STATUS_OK && ((success && success2) || (ctrl.content.sleep == 0))) {
+    aosUtPassed(stream, &result);
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X, changing: 0x%X - changing back: 0x%X\n", status, success, success2);
+  }
+
+  chprintf(stream, "seal...\n");
+  status = bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Control, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
+  aosThdMSleep(50);
+  status |= bq27500_lld_sub_command_call(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_SUB_CMD_SEALED, ((ut_bq27500data_t*)ut->data)->timeout);
+  aosThdMSleep(50);
+  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Control, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
+  aosThdMSleep(50);
+  status |= bq27500_lld_sub_command_call(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_SUB_CMD_CONTROL_STATUS, ((ut_bq27500data_t*)ut->data)->timeout);
+  aosThdMSleep(50);
+  status |= bq27500_lld_sub_command_read(((ut_bq27500data_t*)ut->data)->driver, &ctrl.value, ((ut_bq27500data_t*)ut->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS && ctrl.content.ss == 0x1) {
+    aosUtPassed(stream, &result);
+  } else {
+    chprintf(stream, "\tfailed (0x%X)\n", status);
+    aosUtFailedMsg(stream, &result, "0x%08X, ctrl 0x%X\n", status, subdata);
+    ++result.failed;
+  }
+
+  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(BQ27500Driver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_BQ27500) && (AMIROLLD_CFG_BQ27500 == 1) */
+
diff --git a/unittests/periphery-lld/src/ut_alld_bq27500_v1_bq241xx_v1.c b/unittests/periphery-lld/src/ut_alld_bq27500_v1_bq241xx_v1.c
new file mode 100644
index 0000000..dd703eb
--- /dev/null
+++ b/unittests/periphery-lld/src/ut_alld_bq27500_v1_bq241xx_v1.c
@@ -0,0 +1,157 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..2019  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_BQ27500) && (AMIROLLD_CFG_BQ27500 == 1) && defined(AMIROLLD_CFG_BQ241xx) && (AMIROLLD_CFG_BQ241xx == 1)) || defined(__DOXYGEN__)
+
+#include <ut_alld_bq27500_v1_bq241xx_v1.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+
+aos_utresult_t utAlldBq27500Bq241xxFunc(BaseSequentialStream *stream, aos_unittest_t *ut)
+{
+  aosDbgCheck(ut->data != NULL && ((ut_bq27500bq241xxdata_t*)ut->data)->bq27500 != NULL && ((ut_bq27500bq241xxdata_t*)ut->data)->bq241xx != NULL);
+
+  // local variables
+  aos_utresult_t result = {0, 0};
+  uint32_t status;
+  uint16_t dst;
+  bq27500_lld_flags_t flags;
+  bq27500_lld_batgood_t bg;
+  bq241xx_lld_enable_t charger_enabled;
+  uint32_t sleeptime_s;
+  bq241xx_lld_charge_state_t charge;
+
+  chprintf(stream, "check for battery...\n");
+  status = bq27500_lld_std_command(((ut_bq27500bq241xxdata_t*)ut->data)->bq27500, BQ27500_LLD_STD_CMD_Flags, &dst, ((ut_bq27500bq241xxdata_t*)ut->data)->timeout);
+  flags.value = dst;
+  chprintf(stream, "\t\tbattery detected: %s\n", flags.content.bat_det ? "yes" : "no");
+  chprintf(stream, "\t\tbattery fully charged: %s\n", flags.content.fc ? "yes" : "no");
+  status |= bq27500_lld_read_batgood(((ut_bq27500bq241xxdata_t*)ut->data)->bq27500, &bg);
+  chprintf(stream, "\t\tbattery good: %s\n", (bg == BQ27500_LLD_BATTERY_GOOD) ? "yes" : "no");
+  if (status == APAL_STATUS_SUCCESS) {
+    if (!flags.content.bat_det) {
+      aosUtPassedMsg(stream, &result, "no battery detected, aborting\n");
+      return result;
+    } else if (!bg) {
+      aosUtPassedMsg(stream, &result, "battery damaged, aborting\n");
+      return result;
+    } else {
+      aosUtPassed(stream, &result);
+    }
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X; aborting\n", status);
+    return result;
+  }
+
+  chprintf(stream, "get current charger setting...\n");
+  status = bq241xx_lld_get_enabled(((ut_bq27500bq241xxdata_t*)ut->data)->bq241xx, &charger_enabled);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosUtPassedMsg(stream, &result, "currently %s\n", (charger_enabled == BQ241xx_LLD_ENABLED) ? "enabled" : "disabled");
+  } else {
+    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  // disable/enable charger
+  for (uint8_t iteration = 0; iteration < 2; ++iteration) {
+    if (charger_enabled == BQ241xx_LLD_ENABLED) {
+      sleeptime_s = 120;
+      chprintf(stream, "disable charger...\n");
+      status = bq241xx_lld_set_enabled(((ut_bq27500bq241xxdata_t*)ut->data)->bq241xx, BQ241xx_LLD_DISABLED);
+      aosThdSSleep(1);
+      status |= bq241xx_lld_get_enabled(((ut_bq27500bq241xxdata_t*)ut->data)->bq241xx, &charger_enabled);
+      status |= (charger_enabled == BQ241xx_LLD_DISABLED) ? 0x0000 : 0x0100;
+      for (uint32_t s = 0; s < sleeptime_s; ++s) {
+        int nchars = chprintf(stream, "%us / %us", s, sleeptime_s);
+        aosThdSSleep(1);
+        for (int c = 0; c < nchars; ++c) {
+          chprintf(stream, "\b \b");
+        }
+      }
+      status |= bq241xx_lld_get_charge_status(((ut_bq27500bq241xxdata_t*)ut->data)->bq241xx, &charge);
+      chprintf(stream, "\t\tcharge status: %scharging\n", (charge == BQ241xx_LLD_CHARGING) ? "" : "not ");
+      status |= bq27500_lld_std_command(((ut_bq27500bq241xxdata_t*)ut->data)->bq27500, BQ27500_LLD_STD_CMD_TimeToFull, &dst, ((ut_bq27500bq241xxdata_t*)ut->data)->timeout);
+      if (status == APAL_STATUS_SUCCESS) {
+        if (dst == 0xFFFF || dst == 0) {
+          aosUtPassedMsg(stream, &result, "battery %sfull\n", flags.content.fc ? "" : "not ");
+        } else {
+          aosUtFailedMsg(stream, &result, "battery %sfull but charging (TTF = %umin)\n", flags.content.fc ? "" : "not ", dst);
+        }
+      } else {
+        aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+      }
+    }
+    else { /* charger_enabled != BQ241xx_LLD_ENABLED */
+      sleeptime_s = 90;
+      chprintf(stream, "enable charger...\n");
+      status = bq241xx_lld_set_enabled(((ut_bq27500bq241xxdata_t*)ut->data)->bq241xx, BQ241xx_LLD_ENABLED);
+      aosThdSSleep(1);
+      status |= bq241xx_lld_get_enabled(((ut_bq27500bq241xxdata_t*)ut->data)->bq241xx, &charger_enabled);
+      status |= (charger_enabled == BQ241xx_LLD_ENABLED) ? 0x0000 : 0x0100;
+      for (uint32_t s = 0; s < sleeptime_s; ++s) {
+        int nchars = chprintf(stream, "%us / %us", s, sleeptime_s);
+        aosThdSSleep(1);
+        for (int c = 0; c < nchars; ++c) {
+          chprintf(stream, "\b \b");
+        }
+      }
+      status |= bq241xx_lld_get_charge_status(((ut_bq27500bq241xxdata_t*)ut->data)->bq241xx, &charge);
+      chprintf(stream, "\t\tcharge status: %scharging\n", (charge == BQ241xx_LLD_CHARGING) ? "" : "not ");
+      status |= bq27500_lld_std_command(((ut_bq27500bq241xxdata_t*)ut->data)->bq27500, BQ27500_LLD_STD_CMD_TimeToFull, &dst, ((ut_bq27500bq241xxdata_t*)ut->data)->timeout);
+      if (status == APAL_STATUS_SUCCESS) {
+        if (((dst == 0xFFFF || dst == 0) && flags.content.fc) || (!(dst == 0xFFFF || dst == 0) && !flags.content.fc)) {
+          aosUtPassedMsg(stream, &result, "battery %sfull and %scharging (TTF = %umin)\n", flags.content.fc ? "" : "not ", (dst != 0xFFFF || dst != 0) ? "" : "not ", dst);
+        } else {
+          aosUtFailedMsg(stream, &result, "battery %sfull and %scharging (TTF = %umin)\n", flags.content.fc ? "" : "not ", (dst != 0xFFFF || dst != 0) ? "" : "not ", dst);
+        }
+      } else {
+        aosUtFailedMsg(stream, &result, "0x%08X\n", status);
+      }
+    }
+
+    bq241xx_lld_get_enabled(((ut_bq27500bq241xxdata_t*)ut->data)->bq241xx, &charger_enabled);
+  }
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_BQ27500) && (AMIROLLD_CFG_BQ27500 == 1) && defined(AMIROLLD_CFG_BQ241xx) && (AMIROLLD_CFG_BQ241xx == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_dw1000.c b/unittests/periphery-lld/src/ut_alld_dw1000.c
deleted file mode 100755
index 3bebeef..0000000
--- a/unittests/periphery-lld/src/ut_alld_dw1000.c
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <ut_alld_dw1000.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_DW1000)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-aos_utresult_t utAlldDw1000Func(BaseSequentialStream* stream, aos_unittest_t* ut) {
-
-    aosDbgCheck(ut->data != NULL);
-
-    aos_utresult_t result = {0, 0};
-
-    chprintf(stream, "init DW1000...\n");
-    dwt_initialise(DWT_LOADUCODE, (DW1000Driver*) ut->data);
-    chprintf(stream, "device ID should be: 0xDECA0130\nget device ID...\n");
-    uint32_t actual_deviceId = dwt_readdevid();
-    chprintf(stream, "actual device ID is: 0x%x\n", actual_deviceId);
-    aosThdMSleep(1);
-
-    if (actual_deviceId == DWT_DEVICE_ID){
-      aosUtPassed(stream, &result);
-    } else {
-      aosUtFailed(stream, &result);
-    }
-
-    /*chprintf(stream, "write-read test...\n");
-    uint32_t testvalue = 0x0A;
-    uint16_t panid = 0x00;
-
-    dwt_readfromdevice(PANADR_ID, PANADR_PAN_ID_OFFSET, 2, (uint8_t*) &panid);
-    chprintf(stream, "value PANADR register before write: %x\n", panid);
-    chprintf(stream, "write 0x%x to PANADR register...\n", testvalue);
-    dwt_setpanid(testvalue);
-    dwt_readfromdevice(PANADR_ID, PANADR_PAN_ID_OFFSET, 2, (uint8_t*) &panid);
-
-    chprintf(stream, "PANADR register is now: 0x%x\n", panid);
-
-    if (panid == testvalue){
-      aosUtPassed(stream, &result);
-    } else {
-      aosUtFailed(stream, &result);
-    }
-*/
-
-    dwt_setleds(0x03);
-
-    // RUN DECA-DEMO
-
-    instanceConfig_t chConfig;
-    chConfig.channelNumber = 2;            // channel
-    chConfig.preambleCode = 4;             // preambleCode
-    chConfig.pulseRepFreq = DWT_PRF_16M;   // prf
-    chConfig.dataRate = DWT_BR_6M8;        // datarate
-    chConfig.preambleLen = DWT_PLEN_128;   // preambleLength
-    chConfig.pacSize = DWT_PAC8;           // pacSize
-    chConfig.nsSFD = 0;                    // non-standard SFD
-    chConfig.sfdTO = (129 + 8 - 8);        // SFD timeout
-
-    sfConfig_t sfConfig;
-    sfConfig.slotDuration_ms = (10);        //slot duration in milliseconds (NOTE: the ranging exchange must be able to complete in this time
-                                            //e.g. tag sends a poll, 4 anchors send responses and tag sends the final + processing time
-    sfConfig.numSlots = (10);               //number of slots in the superframe (8 tag slots and 2 used for anchor to anchor ranging),
-    sfConfig.sfPeriod_ms = (10*10);         //in ms => 100 ms frame means 10 Hz location rate
-    sfConfig.tagPeriod_ms = (10*10);        //tag period in ms (sleep time + ranging time)
-    sfConfig.pollTxToFinalTxDly_us = (2500); //poll to final delay in microseconds (needs to be adjusted according to lengths of ranging frames)
-
-    //TODO Disable EXTI IRQ
-    //port_DisableEXT_IRQ();
-
-    // inittestapplication
-    // dwt_softreset(); // already done in instance_init()
-
-    // Set this instance mode (tag/anchor)
-    (void) instance_init(TAG, (DW1000Driver*) ut->data);
-    //int err = instance_init(TAG, (DW1000Driver*) ut->data);
-    (void) instance_readdeviceid();
-    //uint32_t deca_dev_id = instance_readdeviceid();
-
-    // TAG ID 0
-    instance_set_16bit_address(0);
-    // simulate DECA config Mode 2 (DIP 1100000)
-    instance_config(&chConfig, &sfConfig) ;
-
-    //TODO Enable EXTI IRQ
-    //port_EnableEXT_IRQ();
-
-    // Start Ranging
-
-    chprintf(stream, "start ranging...\n");
-
-
-    while(1) {
-        //int n = 0;
-        instance_data_t* inst = instance_get_local_structure_ptr(0);
-
-        int monitor_local = inst->monitor ;
-        int txdiff = (chVTGetSystemTimeX() - inst->timeofTx);
-
-        tag_run();
-        //if delayed TX scheduled but did not happen after expected time then it has failed... (has to be < slot period)
-        //if anchor just go into RX and wait for next message from tags/anchors
-        //if tag handle as a timeout
-        if( (monitor_local == 1) && ( txdiff > inst->slotDuration_ms) )  {
-            inst->wait4ack = 0;
-            tag_process_rx_timeout(inst);
-            inst->monitor = 0;
-        }
-    }
-
-    (void) instance_newrange();
-    //int rx = instance_newrange();
-
-    return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_DW1000) */
diff --git a/unittests/periphery-lld/src/ut_alld_hmc5883l.c b/unittests/periphery-lld/src/ut_alld_hmc5883l.c
deleted file mode 100644
index 20dd776..0000000
--- a/unittests/periphery-lld/src/ut_alld_hmc5883l.c
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <ut_alld_hmc5883l.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_HMC5883L)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-/**
- * @brief   HMC5338L unit test function.
- *
- * @param[in] stream  Stream for intput/output.
- * @param[in] ut      Unit test object.
- *
- * @return            Unit test result value.
- */
-aos_utresult_t utAlldHmc5883lFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL && (((ut_hmc5883ldata_t*)(ut->data))->drdyEvtSrc != NULL));
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status;
-  uint8_t rxbuffer[3];
-  uint8_t data;
-  uint8_t conf = 0x70;
-  hmc5883l_lld_config_t cfg;
-  uint16_t mdata[3];
-  uint8_t state;
-  eventmask_t event_mask = 0;
-  event_listener_t el;
-  uint16_t data_reads = 0;
-  aos_timestamp_t start;
-  aos_timestamp_t t;
-
-  chprintf(stream, "check ID...\n");
-  status = hmc5883l_lld_check(((ut_hmc5883ldata_t*)ut->data)->driver, rxbuffer, 3, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS && rxbuffer[0] == HMC5883L_LLD_IDENTIFICATION_A
-                                   && rxbuffer[1] == HMC5883L_LLD_IDENTIFICATION_B
-                                   && rxbuffer[2] == HMC5883L_LLD_IDENTIFICATION_C) {
-    aosUtPassed(stream, &result);
-  } else {
-    chprintf(stream, "\tfailed\n");
-    ++result.failed;
-    chprintf(stream, "\t\tstatus: %d, idA: %d, idB: %d, idC: %d\n", status, rxbuffer[0], rxbuffer[1], rxbuffer[2]);
-    chprintf(stream, "\t\texpected idA: %d, idB: %d, idC: %d\n", HMC5883L_LLD_IDENTIFICATION_A, HMC5883L_LLD_IDENTIFICATION_B, HMC5883L_LLD_IDENTIFICATION_C);
-  }
-
-  chprintf(stream, "read register...\n");
-  status = hmc5883l_lld_read_register(((ut_hmc5883ldata_t*)ut->data)->driver, HMC5883L_LLD_REGISTER_IDENTIFICATION_A, &data, 1, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  if ((status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) && data == HMC5883L_LLD_IDENTIFICATION_A) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "write register...\n");
-  status = hmc5883l_lld_write_register(((ut_hmc5883ldata_t*)ut->data)->driver, HMC5883L_LLD_REGISTER_CONFIG_A, &conf, 1, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  status |= hmc5883l_lld_read_register(((ut_hmc5883ldata_t*)ut->data)->driver, HMC5883L_LLD_REGISTER_CONFIG_A, &data, 1, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  if ((status == APAL_STATUS_SUCCESS || status == APAL_STATUS_WARNING) && data == 0x70) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n, data: d", status, data);
-  }
-
-  chprintf(stream, "read configuration\n");
-  status = hmc5883l_lld_read_config(((ut_hmc5883ldata_t*)ut->data)->driver, &cfg, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "write configuration\n");
-  cfg.avg = HMC5883L_LLD_AVG1;
-  cfg.outrate = HMC5883L_LLD_75_HZ;
-  cfg.mbias = HMC5883L_LLD_MB_NORMAL;
-  cfg.gain = HMC5883L_LLD_GN_0_GA;
-  cfg.highspeed = HMC5883L_LLD_HS_DISABLE;
-  cfg.mode = HMC5883L_LLD_MM_CONTINUOUS;
-  status = hmc5883l_lld_write_config(((ut_hmc5883ldata_t*)ut->data)->driver, cfg, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  status |= hmc5883l_lld_read_config(((ut_hmc5883ldata_t*)ut->data)->driver, &cfg, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_OK &&
-      cfg.avg == HMC5883L_LLD_AVG1 &&
-      cfg.outrate == HMC5883L_LLD_75_HZ &&
-      cfg.mbias == HMC5883L_LLD_MB_NORMAL &&
-      cfg.gain == HMC5883L_LLD_GN_0_GA &&
-      cfg.highspeed == HMC5883L_LLD_HS_DISABLE &&
-      cfg.mode == HMC5883L_LLD_MM_CONTINUOUS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "read all data for five seconds...\n");
-  status = hmc5883l_lld_set_register(((ut_hmc5883ldata_t*)ut->data)->driver,HMC5883L_LLD_REGISTER_MODE,HMC5883L_LLD_MM_CONTINUOUS,((ut_hmc5883ldata_t*)ut->data)->timeout);
-  for (uint8_t i = 0; i < 5; ++i) {
-    status |= hmc5883l_lld_read_data(((ut_hmc5883ldata_t*)ut->data)->driver, mdata, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-    chprintf(stream, "\t\tX = 0x%04X\tY = 0x%04X\tZ = 0x%04X\n",mdata[0],mdata[1],mdata[2]);
-    aosThdSSleep(1);
-  }
-  if (status == APAL_STATUS_OK) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "read status...\n");
-  status = hmc5883l_lld_read_lock(((ut_hmc5883ldata_t*)ut->data)->driver, &state, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tsensor lock: %d\n", state);
-  status |= hmc5883l_lld_read_rdy(((ut_hmc5883ldata_t*)ut->data)->driver, &state, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tsensor rdy: %d\n", state);
-  status |= hmc5883l_lld_read_status(((ut_hmc5883ldata_t*)ut->data)->driver, &state, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tsensor status: %d\n", state);
-  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "interrupt (partial data read)...\n");
-  chEvtRegister(((ut_hmc5883ldata_t*)ut->data)->drdyEvtSrc, &el, 0);
-  status = hmc5883l_lld_write_config(((ut_hmc5883ldata_t*)ut->data)->driver, cfg, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  aosThdSSleep(1);
-  status |= hmc5883l_lld_read_data(((ut_hmc5883ldata_t*)ut->data)->driver, mdata, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  aosThdMSleep(10);
-  event_mask = chEvtWaitOneTimeout(EVENT_MASK(0), TIME_IMMEDIATE);
-  status |= hmc5883l_lld_read_register(((ut_hmc5883ldata_t*)ut->data)->driver, HMC5883L_LLD_REGISTER_DATA_OUT_X_MSB, &data, 1, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  aosThdMSleep(10);
-  status |= hmc5883l_lld_read_register(((ut_hmc5883ldata_t*)ut->data)->driver, HMC5883L_LLD_REGISTER_DATA_OUT_X_LSB, &data, 1, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  aosThdMSleep(10);
-  event_mask = chEvtWaitOneTimeout(EVENT_MASK(0), TIME_IMMEDIATE);
-  chprintf(stream, "\t\teventmask = 0x%08X (should be 0)\n", event_mask);
-  if (event_mask != EVENT_MASK(0)) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "interrupt (full data read)...\n");
-  status |= hmc5883l_lld_read_data(((ut_hmc5883ldata_t*)ut->data)->driver, mdata, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  event_mask = chEvtWaitOneTimeout(EVENT_MASK(0), chTimeUS2I(100 * MICROSECONDS_PER_MILLISECOND));
-  chprintf(stream, "\t\teventmask = 0x%08X (should be 1)\n", event_mask);
-  if (event_mask == EVENT_MASK(0)) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read data based on interrupt...\n");
-  status = hmc5883l_lld_read_config(((ut_hmc5883ldata_t*)ut->data)->driver, &cfg, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  uint8_t mode = HMC5883L_LLD_MM_SINGLE;
-  cfg.mode = mode;
-  status |= hmc5883l_lld_write_config(((ut_hmc5883ldata_t*)ut->data)->driver, cfg, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  aosSysGetUptime(&start);
-  aosSysGetUptime(&t);
-  status |= hmc5883l_lld_read_data(((ut_hmc5883ldata_t*)ut->data)->driver, mdata, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  while (t - start < MICROSECONDS_PER_SECOND) {
-    event_mask = chEvtWaitOneTimeout(EVENT_MASK(0), chTimeUS2I(1000));
-    if (event_mask == EVENT_MASK(0)) {
-      status |= hmc5883l_lld_read_data(((ut_hmc5883ldata_t*)ut->data)->driver, mdata, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-      data_reads++;
-      status = hmc5883l_lld_write_register(((ut_hmc5883ldata_t*)ut->data)->driver, HMC5883L_LLD_REGISTER_CONFIG_A+2, &mode, 1, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-    }
-    aosSysGetUptime(&t);
-  }
-  chEvtUnregister(((ut_hmc5883ldata_t*)ut->data)->drdyEvtSrc, &el);
-  aosUtInfoMsg(stream,"Read data %u times in a second\n", data_reads);
-
-  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(HMC5883LDriver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_HMC5883L) */
diff --git a/unittests/periphery-lld/src/ut_alld_ina219.c b/unittests/periphery-lld/src/ut_alld_ina219.c
deleted file mode 100644
index 1178617..0000000
--- a/unittests/periphery-lld/src/ut_alld_ina219.c
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <ut_alld_ina219.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_INA219)) || defined(__DOXYGEN__)
-
-#include <math.h>
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-aos_utresult_t utAlldIna219Func(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL && ((ut_ina219data_t*)(ut->data))->inad != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status;
-  uint16_t data[6];
-  uint16_t write_data = 0x1011;
-  uint16_t new_data[6];
-  uint16_t reset_data;
-  uint16_t test_calib = 0;
-  int16_t usensor_data = 0;
-  uint16_t busready = 0;
-  uint32_t power = 0;
-  int32_t shunt;
-  uint32_t bus;
-
-  chprintf(stream, "read registers...\n");
-  status = ina219_lld_read_register(((ut_ina219data_t*)ut->data)->inad, INA219_LLD_REGISTER_CONFIGURATION, data, 6, ((ut_ina219data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "write registers...\n");
-  status = ina219_lld_write_register(((ut_ina219data_t*)ut->data)->inad, INA219_LLD_REGISTER_CONFIGURATION, &write_data, 1, ((ut_ina219data_t*)ut->data)->timeout);
-  status |= ina219_lld_read_register(((ut_ina219data_t*)ut->data)->inad, INA219_LLD_REGISTER_CONFIGURATION, new_data, 6, ((ut_ina219data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS && new_data[0] == write_data) {
-    uint8_t errors = 0;
-    for (uint8_t dataIdx = 1; dataIdx < 6; dataIdx++) {
-      if (new_data[dataIdx] != data[dataIdx]) {
-        ++errors;
-      }
-    }
-    if (errors == 0) {
-      aosUtPassed(stream, &result);
-    } else {
-      aosUtFailed(stream, &result);
-    }
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "reset...\n");
-  status = ina219_lld_reset(((ut_ina219data_t*)ut->data)->inad, ((ut_ina219data_t*)ut->data)->timeout);
-  status |= ina219_lld_read_register(((ut_ina219data_t*)ut->data)->inad, INA219_LLD_REGISTER_CONFIGURATION, &reset_data, 1, ((ut_ina219data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS && reset_data == 0x399F) {
-    aosUtPassed(stream, &result);
-  } else {
-    chprintf(stream, "\tfailed\n");
-    ++result.failed;
-  }
-
-  chprintf(stream, "read config...\n");
-  ina219_lld_cfg_t ina_config;
-  status = ina219_lld_read_config(((ut_ina219data_t*)ut->data)->inad, &ina_config, ((ut_ina219data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "write config...\n");
-  ina_config.data = 0x7FFu;
-  status = ina219_lld_write_config(((ut_ina219data_t*)ut->data)->inad, ina_config, ((ut_ina219data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-
-  chprintf(stream, "calibrate...\n");
-  ina219_lld_calib_input_t calib_in;
-  calib_in.shunt_resistance_0 = 0.1;
-  calib_in.max_expected_current_A = 0.075;
-  calib_in.current_lsb_uA = 10;
-  calib_in.cfg_reg = ina_config;
-  ina219_lld_calib_output_t calib_out;
-  status = ina219_lld_calibration(((ut_ina219data_t*)ut->data)->inad, &calib_in, &calib_out);
-  status |= ina219_lld_write_calibration(((ut_ina219data_t*)ut->data)->inad, calib_out.calibration & 0xFFFEu, ((ut_ina219data_t*)ut->data)->timeout);
-  status |= ina219_lld_write_calibration(((ut_ina219data_t*)ut->data)->inad, 0xA000, ((ut_ina219data_t*)ut->data)->timeout);
-  ina219_lld_cfg_t test_config;
-  ((ut_ina219data_t*)ut->data)->inad->current_lsb_uA = 0xA;
-  status |= ina219_lld_read_config(((ut_ina219data_t*)ut->data)->inad, &test_config, ((ut_ina219data_t*)ut->data)->timeout);
-  status |= ina219_lld_read_calibration(((ut_ina219data_t*)ut->data)->inad, &test_calib, ((ut_ina219data_t*)ut->data)->timeout);
-  while (!busready || power == 0) {
-    aosThdMSleep(20);
-    status |= ina219_lld_bus_conversion_ready(((ut_ina219data_t*)ut->data)->inad, &busready, ((ut_ina219data_t*)ut->data)->timeout);
-    status |= ina219_lld_read_power(((ut_ina219data_t*)ut->data)->inad, &power, ((ut_ina219data_t*)ut->data)->timeout);
-  }
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read shunt voltage...\n");
-  status = ina219_lld_read_shunt_voltage(((ut_ina219data_t*)ut->data)->inad, &shunt, ((ut_ina219data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tshunt voltage: %fV\n", (float)shunt/1000000.f);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read bus voltage (%u%% tolerance)...\n", (uint8_t)(((ut_ina219data_t*)ut->data)->tolerance * 100.f + 0.5f));
-  status = ina219_lld_read_bus_voltage(((ut_ina219data_t*)ut->data)->inad, &bus, ((ut_ina219data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tbus voltage: %fV\n", (float)bus/1000000.f);
-  if ((status == APAL_STATUS_SUCCESS) && (fabs(((float)bus/1000000.f) - ((ut_ina219data_t*)ut->data)->v_expected) < ((ut_ina219data_t*)ut->data)->v_expected * ((ut_ina219data_t*)ut->data)->tolerance)) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read power...\n");
-  status = ina219_lld_read_power(((ut_ina219data_t*)ut->data)->inad, &power, ((ut_ina219data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tpower: %fW\n", (float)(power)/1000000.f);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read current...\n");
-  status = ina219_lld_read_current(((ut_ina219data_t*)ut->data)->inad, &usensor_data, ((ut_ina219data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tcurrent: %fA\n", (float)(usensor_data)/1000000.f);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  aosUtInfoMsg(stream, "driver object memory footprint: %u bytes\n", sizeof(INA219Driver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_INA219) */
diff --git a/unittests/periphery-lld/src/ut_alld_l3g4200d.c b/unittests/periphery-lld/src/ut_alld_l3g4200d.c
deleted file mode 100644
index c16692e..0000000
--- a/unittests/periphery-lld/src/ut_alld_l3g4200d.c
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <ut_alld_l3g4200d.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_L3G4200D)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-/**
- * @brief   L3G4200D unit test function.
- *
- * @param[in] stream  Stream for input/output.
- * @param[in] ut      Unit test object.
- *
- * @return            Unit test result value.
- */
-aos_utresult_t utAlldL3g4200dFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL && ((ut_l3g4200ddata_t*)(ut->data)) != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status;
-  uint8_t data = 0;
-  uint8_t write_data[5];
-  uint8_t read_data[5];
-  int16_t sdata[3];
-  uint8_t status_reg;
-  eventmask_t event_mask;
-  bool success = false;
-  uint8_t fifo = 0x5F;
-  event_listener_t el;
-
-  for (uint8_t dataIdx = 0; dataIdx < 4; dataIdx++) {
-    write_data[dataIdx] = (dataIdx+1)*11;
-  }
-  write_data[4] = 0;
-
-  chprintf(stream, "check identity...\n");
-  status = l3g4200d_lld_read_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd, L3G4200D_LLD_REGISTER_WHO_AM_I, &data, 1);
-  if(status == APAL_STATUS_SUCCESS && data == L3G4200D_LLD_WHO_AM_I){
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X, data: %d\n", status, data);
-  }
-
-  chprintf(stream, "write register...\n");
-  status = l3g4200d_lld_write_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd, L3G4200D_LLD_REGISTER_CTRL_REG1, write_data, 1);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read register...\n");
-  status = l3g4200d_lld_read_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd, L3G4200D_LLD_REGISTER_CTRL_REG1, &data, 1);
-  if (status == APAL_STATUS_SUCCESS && data == write_data[0]) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X, data: %d\n", status, data);
-  }
-
-  chprintf(stream, "write multiple registers...\n");
-  status = l3g4200d_lld_write_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd, L3G4200D_LLD_REGISTER_CTRL_REG1, write_data, 5);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read multiple registers...\n");
-  status = l3g4200d_lld_read_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd, L3G4200D_LLD_REGISTER_CTRL_REG1, read_data, 5);
-  uint8_t errors = 0;
-  for (uint8_t dataIdx = 0; dataIdx < 5; dataIdx++) {
-    if (read_data[dataIdx] != write_data[dataIdx]) {
-      ++errors;
-    }
-  }
-  if (status == APAL_STATUS_SUCCESS && errors == 0) {
-    aosUtPassed(stream, &result);
-  } else {
-    for (uint8_t dataIdx = 0; dataIdx < 5; dataIdx++) {
-      chprintf(stream, "\t\tStatus: %d, CTRL_REG%d: %d, write_data: %d\n", status, dataIdx+1, read_data[dataIdx], write_data[dataIdx]);
-    }
-    aosUtFailedMsg(stream, &result, "0x%08X, errors: %d\n", status, errors);
-  }
-
-  chprintf(stream, "read config...\n");
-  l3g4200d_lld_cfg_t cfg;
-  status = l3g4200d_lld_read_config(((ut_l3g4200ddata_t*)(ut->data))->l3gd, &cfg);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "write config...\n");
-  cfg.registers.ctrl_reg1 = L3G4200D_LLD_PD | L3G4200D_LLD_DR_100_HZ | L3G4200D_LLD_BW_12_5 | L3G4200D_LLD_ZEN | L3G4200D_LLD_YEN | L3G4200D_LLD_XEN;
-  //cfg.registers.ctrl_reg1 = L3G4200D_LLD_PD | L3G4200D_LLD_DR_800_HZ | L3G4200D_LLD_BW_20 | L3G4200D_LLD_ZEN | L3G4200D_LLD_YEN | L3G4200D_LLD_XEN;
-  cfg.registers.ctrl_reg3 = 0x07;
-  cfg.registers.ctrl_reg5 |= L3G4200D_LLD_FIFO_EN;
-  status = l3g4200d_lld_write_config(((ut_l3g4200ddata_t*)(ut->data))->l3gd, cfg);
-  uint8_t reg1 = cfg.data[0];
-  status |= l3g4200d_lld_read_config(((ut_l3g4200ddata_t*)(ut->data))->l3gd, &cfg);
-  if (status == APAL_STATUS_SUCCESS && cfg.data[0] == reg1) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read gyro data for five seconds...\n");
-  status = APAL_STATUS_OK;
-  for (uint8_t i = 0; i < 5; ++i) {
-    status |= l3g4200d_lld_read_all_data(((ut_l3g4200ddata_t*)(ut->data))->l3gd, sdata, &cfg);
-    chprintf(stream, "\t\tX = %6d\tY = %6d\tZ = %6d\n", sdata[0], sdata[1], sdata[2]);
-    aosThdSSleep(1);
-  }
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read X axis for five seconds...\n");
-  status = APAL_STATUS_SUCCESS;
-  for (uint32_t i = 0; i <= 5; i++) {
-    status |= l3g4200d_lld_read_data(((ut_l3g4200ddata_t*)(ut->data))->l3gd, &(sdata[0]), L3G4200D_LLD_X_AXIS, &cfg);
-    chprintf(stream, "\t\tX = %6d\n", sdata[0]);
-    aosThdSSleep(1);
-  }
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read Y axis for five seconds...\n");
-  status = APAL_STATUS_SUCCESS;
-  for (uint32_t i = 0; i <= 5; i++) {
-    status |= l3g4200d_lld_read_data(((ut_l3g4200ddata_t*)(ut->data))->l3gd, &(sdata[0]), L3G4200D_LLD_Y_AXIS, &cfg);
-    chprintf(stream, "\t\tY = %6d\n", sdata[0]);
-    aosThdSSleep(1);
-  }
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read Z axis for five seconds...\n");
-  status = APAL_STATUS_SUCCESS;
-  for (uint32_t i = 0; i <= 5; i++) {
-    status |= l3g4200d_lld_read_data(((ut_l3g4200ddata_t*)(ut->data))->l3gd, &(sdata[0]), L3G4200D_LLD_Z_AXIS, &cfg);
-    chprintf(stream, "\t\tZ = %6d\n", sdata[0]);
-    aosThdSSleep(1);
-  }
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-  aosThdMSleep(10);
-
-  chprintf(stream, "read status register...\n");
-  status = l3g4200d_lld_read_status_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd, &status_reg);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read interrupt config...\n");
-  l3g4200d_lld_int_cfg_t int_cfg;
-  status = l3g4200d_lld_read_int_config(((ut_l3g4200ddata_t*)(ut->data))->l3gd, &int_cfg);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "write interrupt config...\n");
-  int_cfg.registers.int1_tsh_xh = 10;
-  status = l3g4200d_lld_write_int_config(((ut_l3g4200ddata_t*)(ut->data))->l3gd, int_cfg);
-  l3g4200d_lld_int_cfg_t int_cfg2;
-  status |= l3g4200d_lld_read_int_config(((ut_l3g4200ddata_t*)(ut->data))->l3gd, &int_cfg2);
-  if (status == APAL_STATUS_SUCCESS && int_cfg.registers.int1_tsh_xh == 10) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "interrupt test: read fifo until empty...\n");
-  chEvtRegister(((ut_l3g4200ddata_t*)(ut->data))->src, &el, 0);
-  status = l3g4200d_lld_write_fifo_ctrl_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd,fifo);
-  fifo = 0;
-  status |= l3g4200d_lld_read_fifo_ctrl_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd,&fifo);
-  status |= l3g4200d_lld_read_all_data(((ut_l3g4200ddata_t*)(ut->data))->l3gd, sdata, &cfg);
-  chEvtGetAndClearFlags(&el);
-  aosThdSSleep(1);
-  chEvtGetAndClearFlags(&el);
-  success = false;
-  for (uint8_t i = 0; i < 200; i++) {
-    status |= l3g4200d_lld_read_all_data(((ut_l3g4200ddata_t*)(ut->data))->l3gd, sdata, &cfg);
-    event_mask = chEvtWaitAnyTimeout(~0, TIME_IMMEDIATE);
-    status |= l3g4200d_lld_read_fifo_src_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd,&fifo);
-    if (event_mask != 0 && ((fifo & L3G4200D_LLD_EMPTY) || fifo == 0)) {
-      success = true;
-      break;
-    }
-    aosThdMSleep(1);
-  }
-  if (status == APAL_STATUS_SUCCESS && success) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  fifo = 0x4A;
-  status |= l3g4200d_lld_write_fifo_ctrl_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd,fifo);
-  cfg.registers.ctrl_reg1 = L3G4200D_LLD_PD | L3G4200D_LLD_DR_800_HZ | L3G4200D_LLD_BW_20 | L3G4200D_LLD_ZEN | L3G4200D_LLD_YEN | L3G4200D_LLD_XEN;
-  cfg.registers.ctrl_reg3 = 0x04;
-  status |= l3g4200d_lld_write_config(((ut_l3g4200ddata_t*)(ut->data))->l3gd, cfg);
-  chprintf(stream, "interrupt test: wait until wtm reached...\n");
-  for (uint8_t i = 0; i < 200; i++) {
-    status |= l3g4200d_lld_read_all_data(((ut_l3g4200ddata_t*)(ut->data))->l3gd, sdata, &cfg);
-    event_mask = chEvtWaitAnyTimeout(~0, TIME_IMMEDIATE);
-    status |= l3g4200d_lld_read_fifo_src_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd,&fifo);
-    if (event_mask != 0 && (fifo & L3G4200D_LLD_WTM)) {
-      success = true;
-      break;
-    }
-    aosThdMSleep(10);
-  }
-  if (status == APAL_STATUS_SUCCESS && success) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chEvtUnregister(((ut_l3g4200ddata_t*)(ut->data))->src, &el);
-  aosThdMSleep(10);
-
-  aosUtInfoMsg(stream, "driver object memory footprint: %u bytes\n", sizeof(L3G4200DDriver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_L3G4200D) */
-
-
diff --git a/unittests/periphery-lld/src/ut_alld_led.c b/unittests/periphery-lld/src/ut_alld_led.c
deleted file mode 100644
index 93033b5..0000000
--- a/unittests/periphery-lld/src/ut_alld_led.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <ut_alld_led.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_LED)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-/**
- * @brief   LED unit test function.
- *
- * @param[in] stream  Stream for input/output.
- * @param[in] ut      Unit test object.
- *
- * @return            Unit test result value.
- */
-aos_utresult_t utAlldLedFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status = AOS_OK;
-
-  chprintf(stream, "lighting up for two seconds...\n");
-  led_lld_state_t state = LED_LLD_STATE_ON;
-  status = led_lld_set((LEDDriver*)ut->data, state);
-  aosThdSSleep(2);
-  status |= led_lld_get((LEDDriver*)ut->data, &state);
-  if (status == APAL_STATUS_OK && state == LED_LLD_STATE_ON) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "turning off for two seconds...\n");
-  state = LED_LLD_STATE_OFF;
-  status = led_lld_set((LEDDriver*)ut->data, state);
-  aosThdSSleep(2);
-  status |= led_lld_get((LEDDriver*)ut->data, &state);
-  if (status == APAL_STATUS_OK && state == LED_LLD_STATE_OFF) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "toggling for two seconds...\n");
-  status = led_lld_set((LEDDriver*)ut->data, LED_LLD_STATE_ON);
-  for (uint32_t i = 0; i < 2000/100; ++i) {
-    status |= led_lld_toggle((LEDDriver*)ut->data);
-    status |= led_lld_get((LEDDriver*)ut->data, &state);
-    status |= ((uint8_t)state != (i & 0x01u)) ? APAL_STATUS_ERROR : APAL_STATUS_OK;
-    aosThdMSleep(100);
-  }
-  status = led_lld_set((LEDDriver*)ut->data, LED_LLD_STATE_OFF);
-  if (status == APAL_STATUS_OK) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(LEDDriver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_LED) */
diff --git a/unittests/periphery-lld/src/ut_alld_lis331dlh.c b/unittests/periphery-lld/src/ut_alld_lis331dlh.c
deleted file mode 100644
index e29ebcf..0000000
--- a/unittests/periphery-lld/src/ut_alld_lis331dlh.c
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <ut_alld_lis331dlh.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_LIS331DLH)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-/**
- * @brief   LIS331DLH unit test function.
- *
- * @param[in] stream  Stream for input/output.
- * @param[in] ut      Unit test object.
- *
- * @return            Unit test result value.
- */
-aos_utresult_t utAlldLis331dlhFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL && ((ut_lis331dlhdata_t*)(ut->data)) != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status;
-  uint8_t data = 0;
-  uint8_t write_data[5];
-  uint8_t read_data[5];
-  uint8_t errors = 0;
-  uint8_t reg1;
-  int16_t sdata[3];
-  uint8_t status_reg;
-  lis331dlh_lld_int_cfg_t intcfg;
-  event_listener_t el;
-  eventmask_t event_mask;
-  uint8_t success = 0;
-
-  for (uint8_t dataIdx = 0; dataIdx < 4; dataIdx++) {
-    write_data[dataIdx] = (dataIdx+1)*11;
-  }
-  write_data[4] = 0;
-
-  chprintf(stream, "check identity...\n");
-  status = lis331dlh_lld_read_register(((ut_lis331dlhdata_t*)(ut->data))->lisd, LIS331DLH_LLD_REGISTER_WHO_AM_I, &data, 1);
-  if (status == APAL_STATUS_SUCCESS &&
-      data == LIS331DLH_LLD_WHO_AM_I) {
-    aosUtPassed(stream, &result);
-  } else {
-    chprintf(stream, "\tfailed\n");
-    aosUtFailedMsg(stream, &result, "0x%08X, data: %d\n", status, data);
-    ++result.failed;
-  }
-
-  chprintf(stream, "write register...\n");
-  status = lis331dlh_lld_write_register(((ut_lis331dlhdata_t*)(ut->data))->lisd, LIS331DLH_LLD_REGISTER_CTRL_REG1, write_data, 1);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read register...\n");
-  status = lis331dlh_lld_read_register(((ut_lis331dlhdata_t*)(ut->data))->lisd, LIS331DLH_LLD_REGISTER_CTRL_REG1, &data, 1);
-  if (status == APAL_STATUS_SUCCESS && data == write_data[0]) {
-    aosUtPassed(stream, &result);
-  } else {
-    chprintf(stream, "\tfailed\n");
-    aosUtFailedMsg(stream, &result, "0x%08X, data: %d\n", status, data);
-    ++result.failed;
-  }
-
-  chprintf(stream, "write multiple registers...\n");
-  status = lis331dlh_lld_write_register(((ut_lis331dlhdata_t*)(ut->data))->lisd, LIS331DLH_LLD_REGISTER_CTRL_REG1, write_data, 5);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read multiple registers...\n");
-  status = lis331dlh_lld_read_register(((ut_lis331dlhdata_t*)(ut->data))->lisd, LIS331DLH_LLD_REGISTER_CTRL_REG1, read_data, 5);
-  for (uint8_t dataIdx = 0; dataIdx < 5; dataIdx++) {
-    if (read_data[dataIdx] != write_data[dataIdx]) {
-      ++errors;
-    }
-  }
-  if (status == APAL_STATUS_SUCCESS &&
-      errors == 0) {
-    aosUtPassed(stream, &result);
-  } else {
-    chprintf(stream, "\tfailed\n");
-    for (uint8_t dataIdx = 0; dataIdx < 5; dataIdx++) {
-      chprintf(stream, "\t\tStatus: %d, CTRL_REG%d: %d, write_data: %d\n", status, dataIdx+1, read_data[dataIdx], write_data[dataIdx]);
-    }
-    aosUtFailedMsg(stream, &result, "0x%08X, errors: %d\n", status, errors);
-  }
-
-  chprintf(stream, "read config...\n");
-  lis331dlh_lld_cfg_t cfg;
-  status = lis331dlh_lld_read_config(((ut_lis331dlhdata_t*)(ut->data))->lisd, &cfg);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "write config...\n");
-  cfg.registers.ctrl_reg1 = LIS331DLH_LLD_PM_ODR |
-      LIS331DLH_LLD_DR_1000HZ_780LP |
-      LIS331DLH_LLD_X_AXIS_ENABLE |
-      LIS331DLH_LLD_Y_AXIS_ENABLE |
-      LIS331DLH_LLD_Z_AXIS_ENABLE;
-  cfg.registers.ctrl_reg3 = 0x00;
-  status = lis331dlh_lld_write_config(((ut_lis331dlhdata_t*)(ut->data))->lisd, &cfg);
-  reg1 = cfg.data[0];
-  lis331dlh_lld_read_config(((ut_lis331dlhdata_t*)(ut->data))->lisd, &cfg);
-  if (status == APAL_STATUS_SUCCESS && cfg.data[0] == reg1) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read acceleration for five seconds...\n");
-  status = APAL_STATUS_SUCCESS;
-  for (uint8_t i = 0; i < 5; ++i) {
-    status |= lis331dlh_lld_read_all_data(((ut_lis331dlhdata_t*)(ut->data))->lisd, sdata, &cfg);
-    chprintf(stream, "\t\tX = %6d\tY = %6d\tZ = %6d\n", sdata[0], sdata[1], sdata[2]);
-    aosThdSSleep(1);
-  }
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read X acceleration for five seconds...\n");
-  status = APAL_STATUS_SUCCESS;
-  for (uint8_t i = 0; i < 5; ++i) {
-    status |= lis331dlh_lld_read_data(((ut_lis331dlhdata_t*)(ut->data))->lisd, &(sdata[0]), LIS331DLH_LLD_X_AXIS, &cfg);
-    chprintf(stream, "\t\tX = %6d\n", sdata[0]);
-    aosThdSSleep(1);
-  }
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read Y acceleration for five seconds...\n");
-  status = APAL_STATUS_SUCCESS;
-  for (uint8_t i = 0; i < 5; ++i) {
-    status |= lis331dlh_lld_read_data(((ut_lis331dlhdata_t*)(ut->data))->lisd, &(sdata[0]), LIS331DLH_LLD_Y_AXIS, &cfg);
-    chprintf(stream, "\t\tY = %6d\n", sdata[0]);
-    aosThdSSleep(1);
-  }
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read Z acceleration for five seconds...\n");
-  status = APAL_STATUS_SUCCESS;
-  for (uint8_t i = 0; i < 5; ++i) {
-    status |= lis331dlh_lld_read_data(((ut_lis331dlhdata_t*)(ut->data))->lisd, &(sdata[0]), LIS331DLH_LLD_Z_AXIS, &cfg);
-    chprintf(stream, "\t\tZ = %6d\n", sdata[0]);
-    aosThdSSleep(1);
-  }
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read status register...\n");
-  status = lis331dlh_lld_read_status_register(((ut_lis331dlhdata_t*)(ut->data))->lisd, &status_reg);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "interrupt...\n");
-  intcfg.cfg_reg = LIS331DLH_LLD_INT_CFG_X_HIGH_ENABLE | LIS331DLH_LLD_INT_CFG_Y_HIGH_ENABLE | LIS331DLH_LLD_INT_CFG_Z_HIGH_ENABLE;
-  intcfg.threshold = 10;
-  intcfg.duration = 1;
-  lis331dlh_lld_write_int_config(((ut_lis331dlhdata_t*)(ut->data))->lisd, &intcfg, LIS331DLH_LLD_INT1);
-  aosThdSSleep(1);
-  chEvtRegister(((ut_lis331dlhdata_t*)(ut->data))->src, &el, 3);
-  chprintf(stream, "\t\tmove the AMiRo now to generate interrupts\n");
-  aosThdSSleep(1);
-  for (uint8_t i = 0; i < 10; i++) {
-    event_mask = chEvtWaitOneTimeout(EVENT_MASK(3), TIME_IMMEDIATE);
-    status |= lis331dlh_lld_read_all_data(((ut_lis331dlhdata_t*)(ut->data))->lisd, sdata, &cfg);
-    status = lis331dlh_lld_read_register(((ut_lis331dlhdata_t*)(ut->data))->lisd, LIS331DLH_LLD_REGISTER_INT1_SOURCE, &data, 1);
-    eventflags_t flags = chEvtGetAndClearFlags(&el);
-    if (event_mask == EVENT_MASK(3) && (flags & ((ut_lis331dlhdata_t*)(ut->data))->evtflags)) {
-      ++success;
-      chprintf(stream, "\t\tX = %6d INTERRUPT\n", sdata[0]);
-    } else {
-      chprintf(stream, "\t\tX = %6d\n", sdata[0]);
-    }
-    aosThdSSleep(1);
-  }
-  event_mask = chEvtWaitOneTimeout(EVENT_MASK(3), TIME_IMMEDIATE);
-  chEvtUnregister(((ut_lis331dlhdata_t*)(ut->data))->src, &el);
-  if (status == APAL_STATUS_SUCCESS && success > 0) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  aosUtInfoMsg(stream, "driver object memory footprint: %u bytes\n", sizeof(LIS331DLHDriver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_LIS331DLH) */
-
diff --git a/unittests/periphery-lld/src/ut_alld_ltc4412.c b/unittests/periphery-lld/src/ut_alld_ltc4412.c
deleted file mode 100644
index 588289a..0000000
--- a/unittests/periphery-lld/src/ut_alld_ltc4412.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <ut_alld_ltc4412.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_LTC4412)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-aos_utresult_t utAlldLtc4412Func(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL);
-
-  // local variables
-  aos_utresult_t result = {0,0};
-  uint32_t status;
-
-  chprintf(stream, "read ctrl pin... \n");
-  ltc4412_lld_ctrl_t ctrl;
-  status = ltc4412_lld_get_ctrl((LTC4412Driver*)ut->data, &ctrl);
-  if(status == APAL_STATUS_SUCCESS){
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "write ctrl pin... \n");
-  status = ltc4412_lld_set_ctrl((LTC4412Driver*)ut->data, LTC4412_LLD_CTRL_ACTIVE);
-  status |= ltc4412_lld_get_ctrl((LTC4412Driver*)ut->data, &ctrl);
-  if (status == APAL_STATUS_SUCCESS && ctrl == LTC4412_LLD_CTRL_ACTIVE) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "read stat pin... \n");
-  ltc4412_lld_stat_t stat;
-  status = ltc4412_lld_get_stat((LTC4412Driver*)ut->data, &stat);
-  if(status == APAL_STATUS_SUCCESS){
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(LTC4412Driver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_LTC4412) */
diff --git a/unittests/periphery-lld/src/ut_alld_mpr121.c b/unittests/periphery-lld/src/ut_alld_mpr121.c
deleted file mode 100644
index 5ba5374..0000000
--- a/unittests/periphery-lld/src/ut_alld_mpr121.c
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <ut_alld_mpr121.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_MPR121)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-#define INTERRUPT_EVENT_ID            1
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-aos_utresult_t utAlldMpr121Func(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL && ((ut_mpr121data_t*)ut->data)->mprd != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status;
-  mpr121_lld_config_t cfg;
-  uint8_t data, wdata, rdata;
-  uint16_t edata[4];
-  uint8_t tstate = 0;
-  event_listener_t event_listener;
-  aos_timestamp_t tstart, tcurrent, tend;
-
-  chprintf(stream, "soft reset...\n");
-  status = mpr121_lld_soft_reset(((ut_mpr121data_t*)ut->data)->mprd, ((ut_mpr121data_t*)ut->data)->timeout);
-  status |= mpr121_lld_read_config(((ut_mpr121data_t*)ut->data)->mprd, &cfg, ((ut_mpr121data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS && cfg.registers.ele_config == 0) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "read register...\n");
-  status = mpr121_lld_read_register(((ut_mpr121data_t*)ut->data)->mprd, MPR121_LLD_REGISTER_CONFIG_2, 0, 1, &data, ((ut_mpr121data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tdata: 0x%02X\n", data);
-  if (status == APAL_STATUS_SUCCESS && data == (MPR121_LLD_CDT_0_5 | MPR121_LLD_ESI_16)) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "write register...\n");
-  wdata = MPR121_LLD_CDT_32 | MPR121_LLD_SFI_10 | MPR121_LLD_ESI_16;
-  status = mpr121_lld_write_register(((ut_mpr121data_t*)ut->data)->mprd, MPR121_LLD_REGISTER_CONFIG_2, 0, 1, &wdata, ((ut_mpr121data_t*)ut->data)->timeout);
-  aosThdMSleep(500);
-  status |= mpr121_lld_read_register(((ut_mpr121data_t*)ut->data)->mprd, MPR121_LLD_REGISTER_CONFIG_2, 0, 1, &rdata, ((ut_mpr121data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tdata: 0x%02X\n", rdata);
-  status |= mpr121_lld_write_register(((ut_mpr121data_t*)ut->data)->mprd, MPR121_LLD_REGISTER_CONFIG_2, 0, 1, &data, ((ut_mpr121data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS && rdata == wdata) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "read config...\n");
-  status = mpr121_lld_read_config(((ut_mpr121data_t*)ut->data)->mprd, &cfg, ((ut_mpr121data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS && cfg.registers.config_1 == 0x10 && cfg.registers.config_2 == 0x24) {
-    aosUtPassed(stream, &result);
-  } else {
-    chprintf(stream, "\t\tconfig 1: 0x%02X\n", cfg.registers.config_1);
-    chprintf(stream, "\t\tconfig 2: 0x%02X\n", cfg.registers.config_2);
-    mpr121_lld_read_register(((ut_mpr121data_t*)ut->data)->mprd, MPR121_LLD_REGISTER_CONFIG_1, 0, 1, &rdata, ((ut_mpr121data_t*)ut->data)->timeout);
-    chprintf(stream, "\t\tconfig 1: 0x%02X\n", rdata);
-    mpr121_lld_read_register(((ut_mpr121data_t*)ut->data)->mprd, MPR121_LLD_REGISTER_CONFIG_2, 0, 1, &rdata, ((ut_mpr121data_t*)ut->data)->timeout);
-    chprintf(stream, "\t\tconfig 2: 0x%02X\n", rdata);
-    for (uint8_t valueIdx = 0; valueIdx < 8; valueIdx++) {
-      chprintf(stream, "\t\tdata %d: 0x%02X\n", valueIdx, cfg.values[valueIdx]);
-    }
-    chprintf(stream, "ele_config: 0x%02X\n", cfg.registers.ele_config);
-    chprintf(stream, "config_1: 0x%02X\n", cfg.registers.config_1);
-    chprintf(stream, "config_2: 0x%02X\n", cfg.registers.config_2);
-    chprintf(stream, "target_level: 0x%02X\n", cfg.registers.target_level);
-    chprintf(stream, "low_side_limit: 0x%02X\n", cfg.registers.low_side_limit);
-    chprintf(stream, "up_side_limit: 0x%02X\n", cfg.registers.up_side_limit);
-    chprintf(stream, "auto_config_2: 0x%02X\n", cfg.registers.auto_config_2);
-    chprintf(stream, "auto_config_1: 0x%02X\n", cfg.registers.auto_config_1);
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "write config...\n");
-  cfg.registers.ele_config = MPR121_LLD_CL_ON_ALL | MPR121_LLD_ELEPROX_0 | 4;
-  cfg.registers.config_1 = MPR121_LLD_FFI_18 | 16;
-  cfg.registers.config_2 = MPR121_LLD_CDT_1 | MPR121_LLD_SFI_10 | MPR121_LLD_ESI_32;
-  cfg.registers.up_side_limit = 0x96u;
-  cfg.registers.low_side_limit = 0x58u;
-  cfg.registers.target_level = 0x68u;
-  cfg.registers.auto_config_1 = MPR121_LLD_FFI_18 | MPR121_LLD_RETRY_2 | MPR121_LLD_BVA_ON_ALL | MPR121_LLD_AC_RECONF_EN;
-  status = mpr121_lld_write_config(((ut_mpr121data_t*)ut->data)->mprd, cfg, ((ut_mpr121data_t*)ut->data)->timeout);
-  aosThdMSleep(500);
-  status |= mpr121_lld_read_config(((ut_mpr121data_t*)ut->data)->mprd, &cfg, ((ut_mpr121data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS && cfg.registers.up_side_limit == 0x96u) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "read filtered data for ten seconds...\n");
-  chprintf(stream, "(values should change if you touch the sensors now)\n");
-  for (uint8_t i = 0; i < 10; i++) {
-    status = mpr121_lld_read_filtered_data(((ut_mpr121data_t*)ut->data)->mprd, 0, 4, edata, ((ut_mpr121data_t*)ut->data)->timeout);
-    chprintf(stream, "\t\t0x%04X | 0x%04X | 0x%04X | 0x%04X\n", edata[0], edata[1], edata[2], edata[3]);
-    aosThdSSleep(1);
-  }
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "test interrupts...\n");
-  status = AOS_OK;
-  chEvtRegister(((ut_mpr121data_t*)ut->data)->evtsource, &event_listener, INTERRUPT_EVENT_ID);
-  aosSysGetUptime(&tstart);
-  tend = tstart + (30 * MICROSECONDS_PER_SECOND);
-  do {
-    aosSysGetUptime(&tcurrent);
-    const aos_timestamp_t ttimeout = MICROSECONDS_PER_SECOND - ((tcurrent - tstart) % MICROSECONDS_PER_SECOND);
-    const eventmask_t emask = chEvtWaitOneTimeout(EVENT_MASK(INTERRUPT_EVENT_ID), chTimeUS2I(ttimeout));
-    const eventflags_t eflags = chEvtGetAndClearFlags(&event_listener);
-    if (emask == EVENT_MASK(INTERRUPT_EVENT_ID) && eflags == ((ut_mpr121data_t*)ut->data)->evtflags) {
-      // interrupt detected
-      status |= mpr121_lld_read_register(((ut_mpr121data_t*)ut->data)->mprd, MPR121_LLD_REGISTER_TOUCH_STATUS, 0, 1, &tstate, ((ut_mpr121data_t*)ut->data)->timeout);
-      chprintf(stream, "\t\tinterrupt detected\n");
-      chprintf(stream, "\t\ttstate: %X %X %X %X\n", tstate & 1, (tstate >> 1) & 1, (tstate >> 2) & 1, (tstate >> 3) & 1);
-    }
-    else if (emask == 0) {
-      // timeout
-      status |= mpr121_lld_read_register(((ut_mpr121data_t*)ut->data)->mprd, MPR121_LLD_REGISTER_TOUCH_STATUS, 0, 1, &tstate, ((ut_mpr121data_t*)ut->data)->timeout);
-      chprintf(stream, "\t\ttstate: %X %X %X %X\n", tstate & 1, (tstate >> 1) & 1, (tstate >> 2) & 1, (tstate >> 3) & 1);
-    }
-    aosSysGetUptime(&tcurrent);
-  } while (tcurrent < tend);
-  chEvtUnregister(((ut_mpr121data_t*)ut->data)->evtsource, &event_listener);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(MPR121Driver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_MPR121) */
diff --git a/unittests/periphery-lld/src/ut_alld_mpu6050.c b/unittests/periphery-lld/src/ut_alld_mpu6050.c
deleted file mode 100644
index 10f9fc7..0000000
--- a/unittests/periphery-lld/src/ut_alld_mpu6050.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2018  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <ut_alld_mpu6050.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_MPU6050)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-aos_utresult_t utAlldMpu6050Func(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-    aos_utresult_t result = {0, 0};
-
-    const mpu6050_lld_register_t addr = 0x75; // register to read from
-    uint16_t const data; // buffer for data
-    const uint8_t num = 1; // read one register
-    const apalTime_t timeout = 100; // TODO: Check units
-
-
-    mpu6050_lld_read_register(((ut_mpu6050data_t*)ut->data)->mpu, addr, &data, num, ((ut_mpu6050data_t*)ut->data)->timeout);
-            /** registers to read:
-            0x75: WHO AM I (should return I2C-Adress without the last bit, which is determined by the state of the AO pin!) returns 0x68
-                      */
-
-  return result; // TODO: Adjust
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_MPU6050) */
diff --git a/unittests/periphery-lld/src/ut_alld_pca9544a.c b/unittests/periphery-lld/src/ut_alld_pca9544a.c
deleted file mode 100644
index e90dc76..0000000
--- a/unittests/periphery-lld/src/ut_alld_pca9544a.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <ut_alld_pca9544a.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_PCA9544A)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-aos_utresult_t utAlldPca9544aFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL && ((ut_pca9544adata_t*)ut->data)->driver != NULL);
-
-  // local variables
-  aos_utresult_t result = {0,0};
-  uint32_t status;
-  uint8_t ctrlreg;
-  pca9544a_lld_intstatus_t interrupt;
-  pca9544a_lld_chid_t channel;
-  uint8_t test_mask = 0x00u;
-
-  chprintf(stream, "reading control register...\n");
-  status = pca9544a_lld_read(((ut_pca9544adata_t*)ut->data)->driver, &ctrlreg, ((ut_pca9544adata_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "writing control register...\n");
-  status = APAL_STATUS_OK;
-  status |= pca9544a_lld_write(((ut_pca9544adata_t*)ut->data)->driver, (uint8_t)(PCA9544A_LLD_CTRLREG_EN), ((ut_pca9544adata_t*)ut->data)->timeout);
-  status |= pca9544a_lld_read(((ut_pca9544adata_t*)ut->data)->driver, &ctrlreg, ((ut_pca9544adata_t*)ut->data)->timeout);
-  if ((status == APAL_STATUS_OK  || status == APAL_STATUS_WARNING) && ctrlreg == PCA9544A_LLD_CTRLREG_EN) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X, 0x%X\n", status, ctrlreg);
-  }
-
-  chprintf(stream, "reading interrupt status...\n");
-  status = pca9544a_lld_getintstatus(((ut_pca9544adata_t*)ut->data)->driver, &interrupt, ((ut_pca9544adata_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
-    aosUtPassedMsg(stream, &result, "0x%08X\n", interrupt);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "reading current channel...\n");
-  status = pca9544a_lld_getcurrentchannel(((ut_pca9544adata_t*)ut->data)->driver, &channel, ((ut_pca9544adata_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
-    aosUtPassedMsg(stream, &result, "0x%08X\n", channel);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "setting current channel...\n");
-  status = APAL_STATUS_OK;
-  status |= pca9544a_lld_setchannel(((ut_pca9544adata_t*)ut->data)->driver, PCA9544A_LLD_CH0, ((ut_pca9544adata_t*)ut->data)->timeout);
-  status |= pca9544a_lld_getcurrentchannel(((ut_pca9544adata_t*)ut->data)->driver, &channel, ((ut_pca9544adata_t*)ut->data)->timeout);
-  test_mask |= (channel != PCA9544A_LLD_CH0) ? 0x01u : 0x00u;
-  status |= pca9544a_lld_setchannel(((ut_pca9544adata_t*)ut->data)->driver, PCA9544A_LLD_CH1, ((ut_pca9544adata_t*)ut->data)->timeout);
-  status |= pca9544a_lld_getcurrentchannel(((ut_pca9544adata_t*)ut->data)->driver, &channel, ((ut_pca9544adata_t*)ut->data)->timeout);
-  test_mask |= (channel != PCA9544A_LLD_CH1) ? 0x02u : 0x00u;
-  status |= pca9544a_lld_setchannel(((ut_pca9544adata_t*)ut->data)->driver, PCA9544A_LLD_CH2, ((ut_pca9544adata_t*)ut->data)->timeout);
-  status |= pca9544a_lld_getcurrentchannel(((ut_pca9544adata_t*)ut->data)->driver, &channel, ((ut_pca9544adata_t*)ut->data)->timeout);
-  test_mask |= (channel != PCA9544A_LLD_CH2) ? 0x04u : 0x00u;
-  status |= pca9544a_lld_setchannel(((ut_pca9544adata_t*)ut->data)->driver, PCA9544A_LLD_CH3, ((ut_pca9544adata_t*)ut->data)->timeout);
-  status |= pca9544a_lld_getcurrentchannel(((ut_pca9544adata_t*)ut->data)->driver, &channel, ((ut_pca9544adata_t*)ut->data)->timeout);
-  test_mask |= (channel != PCA9544A_LLD_CH3) ? 0x08u : 0x00u;
-  status |= pca9544a_lld_setchannel(((ut_pca9544adata_t*)ut->data)->driver, PCA9544A_LLD_CH_NONE, ((ut_pca9544adata_t*)ut->data)->timeout);
-  status |= pca9544a_lld_getcurrentchannel(((ut_pca9544adata_t*)ut->data)->driver, &channel, ((ut_pca9544adata_t*)ut->data)->timeout);
-  test_mask |= (channel != PCA9544A_LLD_CH_NONE) ? 0x10u : 0x00u;
-  if ((status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) && test_mask == 0x00u) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X, 0x%X\n", status, test_mask);
-  }
-
-  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(PCA9544ADriver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_PCA9544A) */
-
diff --git a/unittests/periphery-lld/src/ut_alld_pcal6524.c b/unittests/periphery-lld/src/ut_alld_pcal6524.c
deleted file mode 100644
index 8aae922..0000000
--- a/unittests/periphery-lld/src/ut_alld_pcal6524.c
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <ut_alld_pcal6524.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_PCAL6524)) || defined(__DOXYGEN__)
-
-#include <string.h>
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-aos_utresult_t utAlldPcal6524Func(BaseSequentialStream* stream, aos_unittest_t *ut)
-{
-  aosDbgCheck((ut->data != NULL) &&
-              (((ut_pcal6524data_t*)ut->data)->pcal6524d != NULL));
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status;
-  uint8_t buffer[24];
-  memset(buffer, 0xAA, sizeof(buffer));
-
-// This test is currently not supported. See PCAL6524 driver implementation for further information.
-//  chprintf(stream, "reading device ID...\n");
-//  status = pcal6524_lld_read_id(((ut_pcal6524data_t*)ut->data)->pcal6524d, buffer, ((ut_pcal6524data_t*)ut->data)->timeout);
-//  chprintf(stream, "\t\traw: 0x%02X 0x%02X 0x%02X\n", buffer[0], buffer[1], buffer[2]);
-//  chprintf(stream, "\t\tname:     0x%03X\n", ((pcal6524_lld_deviceid_t*)buffer)->name);
-//  chprintf(stream, "\t\tpart:     0x%03X\n", ((pcal6524_lld_deviceid_t*)buffer)->part);
-//  chprintf(stream, "\t\trevision: 0x%01X\n", ((pcal6524_lld_deviceid_t*)buffer)->revision);
-//  if ((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) {
-//    aosUtPassed(stream, &result);
-//  } else {
-//    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-//  }
-
-  chprintf(stream, "reading register...\n");
-  status = pcal6524_lld_read_reg(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_SWITCHDEBOUNCECOUNT, buffer, ((ut_pcal6524data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tdebounce count: %u\n", buffer[0]);
-  if ((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "writing register...\n");
-  buffer[3] = 0xFF;
-  status = pcal6524_lld_write_reg(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_SWITCHDEBOUNCECOUNT, buffer[3], ((ut_pcal6524data_t*)ut->data)->timeout);
-  status |= pcal6524_lld_read_reg(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_SWITCHDEBOUNCECOUNT, &buffer[4], ((ut_pcal6524data_t*)ut->data)->timeout);
-  status |= pcal6524_lld_write_reg(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_SWITCHDEBOUNCECOUNT, buffer[0], ((ut_pcal6524data_t*)ut->data)->timeout);
-  status |= pcal6524_lld_read_reg(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_SWITCHDEBOUNCECOUNT, &buffer[1], ((ut_pcal6524data_t*)ut->data)->timeout);
-  if (((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) &&
-      ((buffer[1] == buffer[0]) && (buffer[4] == buffer[3]))) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "reading group...\n");
-  status = pcal6524_lld_read_group(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUTDRIVESTRENGTH_P0A, buffer, ((ut_pcal6524data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\toutput drive strength: 0x%04X 0x%04X 0x%04X\n",
-           (((uint16_t)buffer[0]) << 8) | buffer[1],
-           (((uint16_t)buffer[2]) << 8) | buffer[3],
-           (((uint16_t)buffer[4]) << 8) | buffer[5]);
-  if ((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "writing group...\n");
-  memset(&buffer[6], PCAL6524_LL_OUTPUTDRIVESTRENGTH_0_25, 6);
-  status = pcal6524_lld_write_group(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUTDRIVESTRENGTH_P0A, &buffer[6], ((ut_pcal6524data_t*)ut->data)->timeout);
-  status |= pcal6524_lld_read_group(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUTDRIVESTRENGTH_P0A, &buffer[12], ((ut_pcal6524data_t*)ut->data)->timeout);
-  status |= pcal6524_lld_write_group(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUTDRIVESTRENGTH_P0A, &buffer[0], ((ut_pcal6524data_t*)ut->data)->timeout);
-  status |= pcal6524_lld_read_group(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUTDRIVESTRENGTH_P0A, &buffer[18], ((ut_pcal6524data_t*)ut->data)->timeout);
-  if (((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) &&
-      ((memcmp(&buffer[12], &buffer[6], 6) == 0) && (memcmp(&buffer[18], &buffer[0], 6) == 0))) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "reading continuously...\n");
-  // read the following registers continously (24 bytes):
-  // output 0-3 + polarity inversions 0-3 + configuration 0-3 + output drive strength 0A-2B + input latch 0-3 + pupd enable 0-3 + pupd selection 0-3
-  status = pcal6524_lld_read_continuous(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUT_P0, buffer, 24, ((ut_pcal6524data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\toutput: 0x%02X 0x%02X 0x%02X\n", buffer[0], buffer[1], buffer[2]);
-  chprintf(stream, "\t\tpolarity inversion: 0x%02X 0x%02X 0x%02X\n", buffer[3], buffer[4], buffer[5]);
-  chprintf(stream, "\t\tconfiguration: 0x%02X 0x%02X 0x%02X\n", buffer[6], buffer[7], buffer[8]);
-  chprintf(stream, "\t\toutput drive strength: 0x%04X 0x%04X 0x%04X\n",
-           (((uint16_t)buffer[9]) << 8) | buffer[10],
-           (((uint16_t)buffer[11]) << 8) | buffer[12],
-           (((uint16_t)buffer[13]) << 8) | buffer[14]);
-  chprintf(stream, "\t\tinput latch: 0x%02X 0x%02X 0x%02X\n", buffer[15], buffer[16], buffer[17]);
-  chprintf(stream, "\t\tpupd enable: 0x%02X 0x%02X 0x%02X\n", buffer[18], buffer[19], buffer[20]);
-  chprintf(stream, "\t\tpupd selection: 0x%02X 0x%02X 0x%02X\n", buffer[21], buffer[22], buffer[23]);
-  if ((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "writing continuously...\n");
-  {
-    uint8_t writebuffer[24];
-    uint8_t readbuffer[2][24];
-    // copy the read configuration but set the output drive strength to factor 0.25
-    memcpy(writebuffer, buffer, sizeof(buffer));
-    memset(&writebuffer[9], PCAL6524_LL_OUTPUTDRIVESTRENGTH_0_25, 6);
-    status = pcal6524_lld_write_continuous(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUT_P0, writebuffer, 24, ((ut_pcal6524data_t*)ut->data)->timeout);
-    status |= pcal6524_lld_read_continuous(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUT_P0, readbuffer[0], 24, ((ut_pcal6524data_t*)ut->data)->timeout);
-    status |= pcal6524_lld_write_continuous(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUT_P0, buffer, 24, ((ut_pcal6524data_t*)ut->data)->timeout);
-    status |= pcal6524_lld_read_continuous(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUT_P0, readbuffer[1], 24, ((ut_pcal6524data_t*)ut->data)->timeout);
-    if (((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) &&
-        ((memcmp(writebuffer, readbuffer[0], 24) == 0) && (memcmp(buffer, readbuffer[1], 24) == 0))) {
-      aosUtPassed(stream, &result);
-    } else {
-      aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-    }
-  }
-
-  aosUtInfoMsg(stream, "driver object memory footprint: %u bytes\n", sizeof(PCAL6524Driver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_PCAL6524) */
diff --git a/unittests/periphery-lld/src/ut_alld_pklcs1212e4001.c b/unittests/periphery-lld/src/ut_alld_pklcs1212e4001.c
deleted file mode 100644
index adddb01..0000000
--- a/unittests/periphery-lld/src/ut_alld_pklcs1212e4001.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <ut_alld_pklcs1212e4001.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_PKLCS1212E4001)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-aos_utresult_t utAlldPklcs1212e4001Func(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL && ((ut_pklcs1212e4001_t*)ut->data)->driver != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status;
-
-  chprintf(stream, "checking PWM configuration...\n");
-  status = pklcs1212e4001_lld_checkPWMconfiguration(((ut_pklcs1212e4001_t*)ut->data)->driver);
-  if (status == APAL_STATUS_OK) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-    // abort at this point
-    return result;
-  }
-
-  chprintf(stream, "buzzing for one second...\n");
-  status = pklcs1212e4001_lld_enable(((ut_pklcs1212e4001_t*)ut->data)->driver, ((ut_pklcs1212e4001_t*)ut->data)->channel, true);
-  aosThdSSleep(1);
-  status |= pklcs1212e4001_lld_enable(((ut_pklcs1212e4001_t*)ut->data)->driver, ((ut_pklcs1212e4001_t*)ut->data)->channel, false);
-  if (status == APAL_STATUS_OK) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_PKLCS1212E4001) */
diff --git a/unittests/periphery-lld/src/ut_alld_tlc5947.c b/unittests/periphery-lld/src/ut_alld_tlc5947.c
deleted file mode 100644
index eb10845..0000000
--- a/unittests/periphery-lld/src/ut_alld_tlc5947.c
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <ut_alld_tlc5947.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_TLC5947)) || defined(__DOXYGEN__)
-
-#include <string.h>
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-/**
- * @brief   TLC9547 unit test function
- *
- * @param[in] stream  Stream for input/output.
- * @param[in] ut      Unit test object.
- *
- * @return            Unit test result value.
- */
-aos_utresult_t utAlldTlc5947Func(BaseSequentialStream *stream, aos_unittest_t *ut)
-{
-  aosDbgCheck(ut->data != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status = 0;
-  tlc5947_lld_blank_t blank;
-  tlc5947_lld_buffer_t buffer;
-
-  chprintf(stream, "reading blank pin...\n");
-  status = tlc5947_lld_getBlank((TLC5947Driver*)ut->data, &blank);
-  if (status == APAL_STATUS_OK) {
-    aosUtPassedMsg(stream, &result, "blank is %s\n", (blank == TLC5947_LLD_BLANK_ENABLE) ? "enabled" : "disabled");
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  // enabling/disabling blank pin
-  for (uint8_t i = 0; i < 2; ++i) {
-    blank = (blank == TLC5947_LLD_BLANK_ENABLE) ? TLC5947_LLD_BLANK_DISABLE : TLC5947_LLD_BLANK_ENABLE;
-    tlc5947_lld_blank_t blank_after = (blank == TLC5947_LLD_BLANK_ENABLE) ? TLC5947_LLD_BLANK_DISABLE : TLC5947_LLD_BLANK_ENABLE;
-    chprintf(stream, "%s blank pin...\n", (blank == TLC5947_LLD_BLANK_ENABLE) ? "enabling" : "disabling");
-    status = tlc5947_lld_setBlank((TLC5947Driver*)ut->data, blank);
-    status |= tlc5947_lld_getBlank((TLC5947Driver*)ut->data, &blank_after);
-    if (status == APAL_STATUS_OK && blank_after == blank) {
-      aosUtPassed(stream, &result);
-    } else {
-      aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-    }
-  }
-
-  chprintf(stream, "setting all black and dimming white...\n");
-  status = tlc5947_lld_setBlank((TLC5947Driver*)ut->data, TLC5947_LLD_BLANK_ENABLE);
-  memset(buffer.data, 0, TLC5947_LLD_BUFFER_SIZE);
-  status |= tlc5947_lld_write((TLC5947Driver*)ut->data, &buffer);
-  status |= tlc5947_lld_update((TLC5947Driver*)ut->data);
-  status |= tlc5947_lld_setBlank((TLC5947Driver*)ut->data, TLC5947_LLD_BLANK_DISABLE);
-  for (uint8_t bit = 0; bit < TLC5947_LLD_PWM_RESOLUTION_BITS; ++bit) {
-    for (uint8_t channel = 0; channel < TLC5947_LLD_NUM_CHANNELS; ++channel) {
-      tlc5947_lld_setBuffer(&buffer, channel, (1 << (bit+1)) - 1);
-    }
-    status |= tlc5947_lld_write((TLC5947Driver*)ut->data, &buffer);
-    status |= tlc5947_lld_update((TLC5947Driver*)ut->data);
-    aosThdMSleep(100);
-  }
-  if (status == APAL_STATUS_OK) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "NOT dimming black again...\n");
-  status = APAL_STATUS_OK;
-  for (uint8_t bit = TLC5947_LLD_PWM_RESOLUTION_BITS; bit > 0; --bit) {
-    for (uint8_t channel = 0; channel < TLC5947_LLD_NUM_CHANNELS; ++channel) {
-      tlc5947_lld_setBuffer(&buffer, channel, (1 << bit) - 1);
-    }
-    status |= tlc5947_lld_setBlank((TLC5947Driver*)ut->data, TLC5947_LLD_BLANK_ENABLE);
-    status |= tlc5947_lld_write((TLC5947Driver*)ut->data, &buffer);
-    status |= tlc5947_lld_setBlank((TLC5947Driver*)ut->data, TLC5947_LLD_BLANK_ENABLE);
-    // Grayscale data is not updated this time (tlc5947_lld_update() not called).
-    // TODO: For some reason the PWMs are updated nevertheless.
-    aosThdMSleep(100);
-  }
-  status |= tlc5947_lld_setBlank((TLC5947Driver*)ut->data, TLC5947_LLD_BLANK_ENABLE);
-  if (status == APAL_STATUS_OK) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "setting each channel incrementally...\n");
-  status = APAL_STATUS_OK;
-  memset(buffer.data, 0, TLC5947_LLD_BUFFER_SIZE);
-  status |= tlc5947_lld_write((TLC5947Driver*)ut->data, &buffer);
-  status |= tlc5947_lld_update((TLC5947Driver*)ut->data);
-  status |= tlc5947_lld_setBlank((TLC5947Driver*)ut->data, TLC5947_LLD_BLANK_DISABLE);
-  for (uint8_t channel = 0; channel < TLC5947_LLD_NUM_CHANNELS; ++channel) {
-    uint16_t value = 0x0000u;
-    for (uint8_t byte = 0; byte < 3; ++byte) {
-      switch (byte) {
-        case 0:
-          value |= 0x00Fu;
-          break;
-        case 1:
-          value |= 0x0F0u;
-          break;
-        case 2:
-          value |= 0xF00u;
-          break;
-      }
-      tlc5947_lld_setBuffer(&buffer, channel, value);
-      status |= tlc5947_lld_write((TLC5947Driver*)ut->data, &buffer);
-      status |= tlc5947_lld_update((TLC5947Driver*)ut->data);
-      aosThdSleep(1.0f / 3.0f);
-      tlc5947_lld_setBuffer(&buffer, channel, 0);
-    }
-  }
-  if (status == APAL_STATUS_OK) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "setting one color after another...\n");
-  status = APAL_STATUS_OK;
-  for (int8_t color = 0; color < 3; ++color) {
-    for (uint8_t channel = color; channel < TLC5947_LLD_NUM_CHANNELS; channel += 3) {
-      const uint16_t val = 0xAF5u; // some deterministic value with high entropy
-      tlc5947_lld_setBuffer(&buffer, channel, val);
-      status |= tlc5947_lld_write((TLC5947Driver*)ut->data, &buffer);
-      status |= tlc5947_lld_update((TLC5947Driver*)ut->data);
-      status |= (tlc5947_lld_getBuffer(&buffer, channel) != val) ? (1 << 31) : 0;
-      if (status != APAL_STATUS_OK) {
-        break;
-      } else {
-        aosThdSleep(1.0f / 8.0f);
-      }
-    }
-    for (uint8_t channel = 0; channel < TLC5947_LLD_NUM_CHANNELS; ++channel) {
-      tlc5947_lld_setBuffer(&buffer, channel, 0);
-    }
-  }
-  if (status == APAL_STATUS_OK) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  // turn LEDs off
-  tlc5947_lld_setBlank((TLC5947Driver*)ut->data, TLC5947_LLD_BLANK_ENABLE);
-  memset(buffer.data, 0, TLC5947_LLD_BUFFER_SIZE);
-  tlc5947_lld_write((TLC5947Driver*)ut->data, &buffer);
-  tlc5947_lld_update((TLC5947Driver*)ut->data);
-
-  aosUtInfoMsg(stream, "driver object memory footprint: %u bytes\n", sizeof(TLC5947Driver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_TLC5947) */
diff --git a/unittests/periphery-lld/src/ut_alld_tps2051bdbv.c b/unittests/periphery-lld/src/ut_alld_tps2051bdbv.c
deleted file mode 100644
index b528b76..0000000
--- a/unittests/periphery-lld/src/ut_alld_tps2051bdbv.c
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <ut_alld_tps2051bdbv.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_TPS2051BDBV)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-/**
- * @brief   TPS2051BDBV unit test function.
- *
- * @param[in] stream  Stream for input/output.
- * @param[in] ut      Unit test object.
- *
- * @return            Unit test result value.
- */
-aos_utresult_t utAlldTps2051bdbvFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status = AOS_OK;
-  tps2051b_lld_enable_t en;
-  tps2051b_lld_overcurrent_t oc;
-
-  chprintf(stream, "write laser enable...\n");
-  status = tps2051b_lld_set_enable((TPS2051BDriver*)ut->data, TPS2051B_LLD_ENABLE);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read laser enable...\n");
-  status = tps2051b_lld_read_enable((TPS2051BDriver*)ut->data, &en);
-  if (status == APAL_STATUS_SUCCESS && en == TPS2051B_LLD_ENABLE) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read laser oc...\n");
-  status = tps2051b_lld_read_overcurrent((TPS2051BDriver*)ut->data, &oc);
-  if (status == APAL_STATUS_SUCCESS && oc == TPS2051B_LLD_NO_OVERCURRENT) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "disable laser...\n");
-  status = tps2051b_lld_set_enable((TPS2051BDriver*)ut->data, TPS2051B_LLD_DISABLE);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(TPS2051BDriver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_TPS2051BDBV) */
diff --git a/unittests/periphery-lld/src/ut_alld_tps62113.c b/unittests/periphery-lld/src/ut_alld_tps62113.c
deleted file mode 100644
index 57032e5..0000000
--- a/unittests/periphery-lld/src/ut_alld_tps62113.c
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <ut_alld_tps62113.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_TPS62113)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-aos_utresult_t utAlldTps62113Func(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL);
-
-  // local variables
-  aos_utresult_t result = {0,0};
-  uint32_t status;
-  tps62113_lld_power_en_t power;
-
-  chprintf(stream, "read pin... \n");
-  status = tps62113_lld_get_power_en((TPS62113Driver*)ut->data, &power);
-  if(status == APAL_STATUS_SUCCESS){
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "write pin... \n");
-  status = tps62113_lld_set_power_en((TPS62113Driver*)ut->data, TPS62113_LLD_POWER_ENABLED);
-  status |= tps62113_lld_get_power_en((TPS62113Driver*)ut->data, &power);
-  if(status == APAL_STATUS_SUCCESS && power == TPS62113_LLD_POWER_ENABLED){
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(TPS62113Driver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_TPS62113) */
-
-
diff --git a/unittests/periphery-lld/src/ut_alld_tps62113_ina219.c b/unittests/periphery-lld/src/ut_alld_tps62113_ina219.c
deleted file mode 100644
index 75dd3c7..0000000
--- a/unittests/periphery-lld/src/ut_alld_tps62113_ina219.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <ut_alld_tps62113_ina219.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_TPS62113) && defined(AMIROLLD_CFG_USE_INA219)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-aos_utresult_t utAlldTps62113Ina219Func(BaseSequentialStream *stream, aos_unittest_t *ut)
-{
-  aosDbgCheck(ut->data != NULL && ((ut_tps62113ina219data_t*)ut->data)->tps62113 != NULL && ((ut_tps62113ina219data_t*)ut->data)->ina219 != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status;
-  tps62113_lld_power_en_t power;
-  uint32_t v_buson, v_busoff;
-
-  chprintf(stream, "read pin... \n");
-  status = tps62113_lld_get_power_en(((ut_tps62113ina219data_t*)ut->data)->tps62113, &power);
-  aosThdSSleep(1);
-  status |= ina219_lld_read_bus_voltage(((ut_tps62113ina219data_t*)ut->data)->ina219, &v_buson, ((ut_tps62113ina219data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS && power == TPS62113_LLD_POWER_ENABLED) {
-    aosUtPassedMsg(stream, &result, "enabled, %fV\n", (float)v_buson / 1000000.0f);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "write pin... \n");
-  status = tps62113_lld_set_power_en(((ut_tps62113ina219data_t*)ut->data)->tps62113, TPS62113_LLD_POWER_DISABLED);
-  status |= tps62113_lld_get_power_en(((ut_tps62113ina219data_t*)ut->data)->tps62113, &power);
-  aosThdSSleep(1);
-  status |= ina219_lld_read_bus_voltage(((ut_tps62113ina219data_t*)ut->data)->ina219, &v_busoff, ((ut_tps62113ina219data_t*)ut->data)->timeout);
-  status |= tps62113_lld_set_power_en(((ut_tps62113ina219data_t*)ut->data)->tps62113, TPS62113_LLD_POWER_ENABLED);
-  if (status == APAL_STATUS_SUCCESS && power == TPS62113_LLD_POWER_DISABLED) {
-    chprintf(stream, "\tdisabled, %fV\n", (float)v_busoff / 1000000.0f);
-    if (v_buson > v_busoff) {
-      aosUtPassed(stream, &result);
-    } else {
-      aosUtFailedMsg(stream, &result, "on: %fV; off: %fV\n", (float)v_buson / 1000000.0f, (float)v_busoff / 1000000.0f);
-    }
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_TPS62113) && defined(AMIROLLD_CFG_USE_INA219) */
diff --git a/unittests/periphery-lld/src/ut_alld_vcnl4020.c b/unittests/periphery-lld/src/ut_alld_vcnl4020.c
deleted file mode 100644
index edad61a..0000000
--- a/unittests/periphery-lld/src/ut_alld_vcnl4020.c
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <ut_alld_vcnl4020.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_VCNL4020)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-#define INTERRUPT_EVENT_ID            1
-
-#define INTERRUPT_THRESHOLD           0x2000
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-aos_utresult_t utAlldVcnl4020Func(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck((ut->data != NULL) &&
-              (((ut_vcnl4020data_t*)(ut->data))->vcnld != NULL) &&
-              (((ut_vcnl4020data_t*)(ut->data))->evtsource != NULL));
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status;
-  uint8_t reg_buf[4];
-  uint8_t* reg_8 = (uint8_t*)(reg_buf);
-  uint16_t* reg_16 = (uint16_t*)(reg_buf);
-  event_listener_t event_listener;
-  aos_timestamp_t tcurrent, tend;
-
-  chprintf(stream, "reading register...\n");
-  status = vcnl4020_lld_readreg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_IDREV, &reg_8[0], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  if ((status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) && reg_8[0] == 0x21u) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X; 0x%08X\n", status, reg_8[0]);
-  }
-
-  chprintf(stream, "writing register...\n");
-  status = vcnl4020_lld_writereg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_PROXRATE, VCNL4020_LLD_PROXRATEREG_250_HZ, ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  status |= vcnl4020_lld_readreg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_PROXRATE, &reg_8[0], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  status |= (reg_8[0] == VCNL4020_LLD_PROXRATEREG_250_HZ) ? 0x0000 : 0x0100;
-  status |= vcnl4020_lld_writereg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_CMD, (VCNL4020_LLD_CMDREG_ALSEN | VCNL4020_LLD_CMDREG_PROXEN | VCNL4020_LLD_CMDREG_SELFTIMED), ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  status |= vcnl4020_lld_readreg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_CMD, &reg_8[0], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  status |= (reg_8[0] & (VCNL4020_LLD_CMDREG_ALSEN | VCNL4020_LLD_CMDREG_PROXEN | VCNL4020_LLD_CMDREG_SELFTIMED)) ? 0x0000 : 0x0200;
-
-  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X, 0x%02X\n", status, reg_8[0]);
-  }
-
-  chprintf(stream, "reading ambient light for ten seconds...\n");
-  status = APAL_STATUS_OK;
-  for (uint8_t i = 0; i < 10; ++i) {
-    aosThdSSleep(1);
-    status |= vcnl4020_lld_readals(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[0], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-    chprintf(stream, "\t\tambient light: 0x%04X\n", reg_16[0]);
-  }
-  status |= (reg_16[0] == 0x0000) ? 0x10 : 0x00;
-  if (status == APAL_STATUS_OK) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "reading proximity for ten seconds...\n");
-  status = APAL_STATUS_OK;
-  for (uint8_t i = 0; i < 10; ++i) {
-    aosThdSSleep(1);
-    status |= vcnl4020_lld_readprox(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[1], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-    chprintf(stream, "\t\tproximity: 0x%04X\n", reg_16[1]);
-  }
-  status |= (reg_16[1] == 0x0000) ? 0x10 : 0x00;
-  if (status == APAL_STATUS_OK) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "reading ambient light and proximity for ten seconds...\n");
-  status = APAL_STATUS_OK;
-  for (uint8_t i = 0; i < 10; ++i) {
-    aosThdSSleep(1);
-    status |= vcnl4020_lld_readalsandprox(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[0], &reg_16[1], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-    chprintf(stream, "\t\tambient light: 0x%04X\tproximity: 0x%04X\n", reg_16[0], reg_16[1]);
-  }
-  status |= (reg_16[0] == 0x0000 || reg_16[1] == 0x0000) ? 0x10 : 0x00;
-  if (status == APAL_STATUS_OK) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "reading low threshold register...\n");
-  status = vcnl4020_lld_readlth(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[0], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  if (status == APAL_STATUS_OK) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "reading high threshold register...\n");
-  status = vcnl4020_lld_readhth(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[1], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  if (status == APAL_STATUS_OK) {
-    aosUtPassedMsg(stream, &result, "0x%04X\n", reg_16[1]);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "reading both threshold registers...\n");
-  status = vcnl4020_lld_readth(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[0], &reg_16[1], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  if (status == APAL_STATUS_OK) {
-    aosUtPassedMsg(stream, &result, "low: 0x%04X; high: 0x%04X\n", reg_16[0], reg_16[1]);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "writing low threshold register...\n");
-  status = vcnl4020_lld_writelth(((ut_vcnl4020data_t*)(ut->data))->vcnld, 0xFFFFu, ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  status |= vcnl4020_lld_readlth(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[0], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  if (status == APAL_STATUS_OK && reg_16[0] == 0xFFFFu) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X, 0x%04X\n", status, reg_16[0]);
-  }
-
-  chprintf(stream, "writing high threshold register...\n");
-  status = vcnl4020_lld_writehth(((ut_vcnl4020data_t*)(ut->data))->vcnld, 0xFFFFu, ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  status |= vcnl4020_lld_readhth(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[1], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  if (status == APAL_STATUS_OK && reg_16[1] == 0xFFFFu) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X, 0x%04X\n", status, reg_16[1]);
-  }
-
-  chprintf(stream, "writing both threshold registers...\n");
-  status = vcnl4020_lld_writeth(((ut_vcnl4020data_t*)(ut->data))->vcnld, 0x5555u, 0xAAAAu, ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  status |= vcnl4020_lld_readth(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[0], &reg_16[1], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  if (status == APAL_STATUS_OK && reg_16[0] == 0x5555u && reg_16[1] == 0xAAAAu) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X, 0x%04X, 0x%04X\n", status, reg_16[0], reg_16[1]);
-  }
-
-  chprintf(stream, "test interrupts...\n");
-  chprintf(stream, "(thresholds are 0x%04X and 0x%04X)\n", 0, INTERRUPT_THRESHOLD);
-  chEvtRegister(((ut_vcnl4020data_t*)(ut->data))->evtsource, &event_listener, INTERRUPT_EVENT_ID);
-  aosSysGetUptime(&tend);
-  tend += 30 * MICROSECONDS_PER_SECOND;
-  status = vcnl4020_lld_writeth(((ut_vcnl4020data_t*)(ut->data))->vcnld, 0x0000, INTERRUPT_THRESHOLD, ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  status |= vcnl4020_lld_writereg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_INTCTRL, VCNL4020_LLD_INTCTRLREG_THRES_EN, ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  do {
-    // read proximity data, interrupt event information and interrupt status
-    const eventmask_t emask = chEvtWaitOneTimeout(EVENT_MASK(INTERRUPT_EVENT_ID), chTimeUS2I(10*MICROSECONDS_PER_MILLISECOND));
-    const eventflags_t eflags = chEvtGetAndClearFlags(&event_listener);
-    status |= vcnl4020_lld_readprox(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[0], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-    status |= vcnl4020_lld_readreg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_INTSTATUS, &reg_8[2], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-    if (emask == EVENT_MASK(INTERRUPT_EVENT_ID) &&
-        eflags == ((ut_vcnl4020data_t*)(ut->data))->evtflags &&
-        reg_8[2] == VCNL4020_LLD_INTSTATUSREG_THHIGH) {
-      // true positive (correct case)
-      chprintf(stream, "\t\tinterrupt detected: prox = 0x%04X\n", reg_16[0]);
-      aosThdMSleep(100);
-    }
-    else if (emask != EVENT_MASK(INTERRUPT_EVENT_ID) &&
-             eflags != ((ut_vcnl4020data_t*)(ut->data))->evtflags &&
-             reg_8[2] != VCNL4020_LLD_INTSTATUSREG_THHIGH) {
-      // true negative (correct case)
-      // do nothing, just keep on looping
-    }
-    else if (emask == EVENT_MASK(INTERRUPT_EVENT_ID) &&
-             eflags == ((ut_vcnl4020data_t*)(ut->data))->evtflags &&
-             reg_8[2] != 0 ) {
-      // false positive
-      status |= 0x1000;
-      chprintf(stream, "\t\tfalse positive: intstatus = 0x%02X; prox = 0x%04X\n", reg_8[2], reg_16[0]);
-    }
-    else if (emask != EVENT_MASK(INTERRUPT_EVENT_ID) &&
-             eflags != ((ut_vcnl4020data_t*)(ut->data))->evtflags &&
-             reg_8[2] == 0) {
-      // false negative
-      status |= 0x2000;
-      chprintf(stream, "\t\tfalse negative: intstatus = 0x%02X; prox = 0x%04X\n", reg_8[2], reg_16[0]);
-    } // any other events are just ignored
-    // reset interrupt status
-    if (reg_8[2] != 0) {
-      status |= vcnl4020_lld_writereg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_INTSTATUS, reg_8[2], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-    }
-    aosSysGetUptime(&tcurrent);
-  } while (tcurrent < tend);
-  chEvtUnregister(((ut_vcnl4020data_t*)(ut->data))->evtsource, &event_listener);
-  status |= vcnl4020_lld_writereg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_INTCTRL, 0, ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  status |= vcnl4020_lld_readreg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_INTSTATUS, &reg_8[2], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  status |= vcnl4020_lld_writereg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_INTSTATUS, reg_8[2], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  if (status == APAL_STATUS_SUCCESS || status == APAL_STATUS_WARNING) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  aosUtInfoMsg(stream, "driver object memory footprint: %u bytes\n", sizeof(VCNL4020Driver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_USE_VCNL4020) */
