1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00

tests/pkg/flashdb: add test for FAL config initialization

This commit is contained in:
Fabian Hüßler 2024-01-02 23:53:26 +01:00
parent 3167d58e0d
commit 057695bdde
3 changed files with 181 additions and 0 deletions

View File

@ -0,0 +1,29 @@
include ../Makefile.pkg_common
# select the MTD backend
USEMODULE += flashdb_mtd
# enable key-value database
USEMODULE += flashdb_kvdb
# enable time series database
USEMODULE += flashdb_tsdb
# rtc_localtime()
USEMODULE += rtc_utils
# prefer periph_rtc over periph_rtt
FEATURES_OPTIONAL += periph_rtc
FEATURES_REQUIRED_ANY += periph_rtc|periph_rtt
CFLAGS += -DFAL_PART1_LABEL=\"part1\"
CFLAGS += -DFAL_PART1_LENGTH=FAL_PART0_LENGTH
CFLAGS += -DFAL_PART2_LABEL=\"part2\"
CFLAGS += -DFAL_PART2_LENGTH=FAL_PART0_LENGTH
CFLAGS += -DFAL_PART3_LABEL=\"part3\"
CFLAGS += -DFAL_PART3_LENGTH=FAL_PART0_LENGTH
include $(RIOTBASE)/Makefile.include
# handle RTC backend after inclusion of $(RIOTBASE)/Makefile.include
ifeq (,$(filter periph_rtc,$(FEATURES_USED)))
USEMODULE += rtt_rtc
USEMODULE += ztimer_no_periph_rtt
endif

View File

@ -0,0 +1,3 @@
BOARD_INSUFFICIENT_MEMORY := \
stk3200 \
#

View File

@ -0,0 +1,149 @@
/*
* Copyright (C) 2023 ML!PA Consulting Gmbh
*
* This file is subject to the terms and conditions of the GNU Lesser General
* Public License v2.1. See the file LICENSE in the top level directory for more
* details.
*/
/**
* @ingroup tests
* @{
*
* @file
* @brief Short test for the FlashDB FAL configuration initialization
*
* @author Fabian Hüßler <fabian.huessler@ml-pa.com>
*
* @}
*/
#include <stdio.h>
#include "container.h"
#include "fal.h"
#include "macros/math.h"
#include "mutex.h"
#include "periph/rtc.h"
#include <flashdb.h>
/**
* @brief FlashDB Magic Word
*
* The value here is not relevant but it must be defined.
*/
#define FAL_PART_MAGIC_WORD 0x45503130
/**
* @brief Number of FAL partitions
*/
#define FAL_PART_TABLE_NUMOF ARRAY_SIZE(((const struct fal_partition[])FAL_PART_TABLE))
#if !defined(FAL_TSDB_MAX) || defined(DOXYGEN)
/**
* @brief Maximum length of a TSDB entry
*/
#define FAL_TSDB_MAX 128
#endif
#if !defined(FAL_PART_TABLE_KVDB) || defined(DOXYGEN)
/**
* @brief Indices of partitions in @ref FAL_PART_TABLE that can be initialized as a Key-Value-DB
*/
#define FAL_PART_TABLE_KVDB \
{ \
0, \
1, \
}
#endif
#if !defined(FAL_PART_TABLE_TSDB) || defined(DOXYGEN)
/**
* @brief Indices of partitions in @ref FAL_PART_TABLE that can be initialized as a Time-Series-DB
*/
#define FAL_PART_TABLE_TSDB \
{ \
2, \
3, \
}
#endif
extern void fdb_mtd_init(mtd_dev_t *mtd);
static mutex_t _locker = MUTEX_INIT;
static const unsigned _fdb_part_kvdb[] = FAL_PART_TABLE_KVDB;
static const unsigned _fdb_part_tsdb[] = FAL_PART_TABLE_TSDB;
static struct fdb_kvdb _kvdb[ARRAY_SIZE(_fdb_part_kvdb)];
static struct fdb_tsdb _tsdb[ARRAY_SIZE(_fdb_part_tsdb)];
/**
* @brief Select MTD device to use for FlashDB
*/
#if !defined(FDB_MTD)
#define FDB_MTD FAL_MTD
#endif
static void _lock(fdb_db_t db)
{
mutex_lock(db->user_data);
}
static void _unlock(fdb_db_t db)
{
mutex_unlock(db->user_data);
}
static fdb_time_t _get_time(void)
{
struct tm now;
rtc_get_time(&now);
return mktime(&now);
}
int main(void)
{
int init_failed;
fdb_mtd_init(FDB_MTD);
size_t size = FDB_MTD->pages_per_sector * FDB_MTD->page_size;
/* scale hardware sector size to minimum required virtual sector size */
size = DIV_ROUND_UP((CONFIG_FLASHDB_MIN_SECTOR_SIZE_DEFAULT_KiB * KiB(1)), size) * size;
printf("Informational: Make sure the following requirements are fulfilled for a successful initialization:\n");
printf("The virtual sector size is a multiple of the physical sector size: %lu %% %lu == 0\n",
(unsigned long)size, (unsigned long)FDB_MTD->pages_per_sector * FDB_MTD->page_size);
printf("The maximum partition size is a multiple of the virtual sector size: %lu %% %lu == 0\n",
(unsigned long)FAL_PART0_LENGTH, (unsigned long)size);
for (unsigned i = 0; i < ARRAY_SIZE(_fdb_part_kvdb); i++) {
unsigned part = _fdb_part_kvdb[i];
if (part >= FAL_PART_TABLE_NUMOF) {
continue;
}
fdb_kvdb_control(&_kvdb[i], FDB_KVDB_CTRL_SET_SEC_SIZE, &size);
fdb_kvdb_control(&_kvdb[i], FDB_KVDB_CTRL_SET_LOCK, (void *)(uintptr_t)_lock);
fdb_kvdb_control(&_kvdb[i], FDB_KVDB_CTRL_SET_UNLOCK, (void *)(uintptr_t)_unlock);
const char *spart = ((const struct fal_partition[])FAL_PART_TABLE)[part].name;
printf("Initializing FlashDB KVDB partition %s\n", spart);
if ((init_failed = fdb_kvdb_init(&_kvdb[i], "kvdb", spart, NULL, &_locker)) != FDB_NO_ERR) {
printf("Failed to initialize FlashDB KVDB partition %s (%d)\n", spart, init_failed);
return 1;
}
}
for (unsigned i = 0; i < ARRAY_SIZE(_fdb_part_tsdb); i++) {
unsigned part = _fdb_part_tsdb[i];
if (part >= FAL_PART_TABLE_NUMOF) {
continue;
}
fdb_tsdb_control(&_tsdb[i], FDB_TSDB_CTRL_SET_LOCK, (void *)(uintptr_t)_lock);
fdb_tsdb_control(&_tsdb[i], FDB_TSDB_CTRL_SET_UNLOCK, (void *)(uintptr_t)_unlock);
fdb_tsdb_control(&_tsdb[i], FDB_TSDB_CTRL_SET_SEC_SIZE, &size);
const char *spart = ((const struct fal_partition[])FAL_PART_TABLE)[part].name;
printf("Initializing FlashDB TSDB partition %s\n", spart);
if ((init_failed = fdb_tsdb_init(&_tsdb[i], "tsdb", spart, _get_time, FAL_TSDB_MAX, &_locker)) != FDB_NO_ERR) {
printf("Failed to initialize FlashDB TSDB partition %s (%d)\n", spart, init_failed);
return 1;
}
}
puts("SUCCESS");
return 0;
}