aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--os/hal/include/hal_persistent.h2
-rw-r--r--os/hal/include/hal_rtc.h60
-rw-r--r--os/hal/ports/STM32/LLD/RTCv1/hal_rtc_lld.h51
-rw-r--r--os/hal/ports/STM32/LLD/RTCv2/hal_rtc_lld.c71
-rw-r--r--os/hal/ports/STM32/LLD/RTCv2/hal_rtc_lld.h45
-rw-r--r--os/hal/templates/hal_rtc_lld.h38
-rw-r--r--readme.txt2
7 files changed, 84 insertions, 185 deletions
diff --git a/os/hal/include/hal_persistent.h b/os/hal/include/hal_persistent.h
index d0d6c4472..f0aed89b9 100644
--- a/os/hal/include/hal_persistent.h
+++ b/os/hal/include/hal_persistent.h
@@ -49,7 +49,7 @@
typedef enum {
PS_NO_ERROR = 0, /* No error. */
PS_ERROR_READ = 2, /* ECC or other error during read operation.*/
- PS_ERROR_PROGRAM = 3, /* Program operation failed. */
+ PS_ERROR_WRITE= 3, /* Program operation failed. */
PS_ERROR_VERIFY = 5, /* Verify operation failed. */
PS_ERROR_HW_FAILURE = 6 /* Controller or communication error. */
} ps_error_t;
diff --git a/os/hal/include/hal_rtc.h b/os/hal/include/hal_rtc.h
index 63a916b22..342d61815 100644
--- a/os/hal/include/hal_rtc.h
+++ b/os/hal/include/hal_rtc.h
@@ -88,6 +88,11 @@
typedef struct RTCDriver RTCDriver;
/**
+ * @brief Type of an RTC alarm number.
+ */
+typedef unsigned int rtcalarm_t;
+
+/**
* @brief Type of a structure representing an RTC date/time stamp.
*/
typedef struct {
@@ -101,8 +106,56 @@ typedef struct {
/*lint -restore*/
} RTCDateTime;
+/**
+ * @brief BasePersistentStorage specific methods.
+ */
+#define _rtc_driver_methods \
+ _base_persistent_storage_methods
+
#include "hal_rtc_lld.h"
+/* Some more checks, must happen after inclusion of the LLD header, this is
+ why are placed here.*/
+#if !defined(RTC_SUPPORTS_CALLBACKS)
+#error "RTC LLD does not define the required RTC_SUPPORTS_CALLBACKS macro"
+#endif
+
+#if !defined(RTC_ALARMS)
+#error "RTC LLD does not define the required RTC_ALARMS macro"
+#endif
+
+#if !defined(RTC_HAS_STORAGE)
+#error "RTC LLD does not define the required RTC_HAS_STORAGE macro"
+#endif
+
+#if RTC_HAS_STORAGE || defined(__DOXYGEN__)
+/**
+ * @extends FileStream
+ *
+ * @brief @p RTCDriver virtual methods table.
+ */
+struct RTCDriverVMT {
+ _rtc_driver_methods
+};
+#endif
+
+/**
+ * @brief Structure representing an RTC driver.
+ */
+struct RTCDriver {
+#if RTC_HAS_STORAGE || defined(__DOXYGEN__)
+ /**
+ * @brief Virtual Methods Table.
+ */
+ const struct RTCDriverVMT *vmt;
+#endif
+#if defined(RTC_DRIVER_EXT_FIELDS)
+ RTC_DRIVER_EXT_FIELDS
+#endif
+ /* End of the mandatory fields.*/
+ _rtc_lld_driver_fields
+};
+
/*===========================================================================*/
/* Driver macros. */
/*===========================================================================*/
@@ -111,6 +164,13 @@ typedef struct {
/* External declarations. */
/*===========================================================================*/
+#if !defined(__DOXYGEN__)
+extern RTCDriver RTCD1;
+#if RTC_HAS_STORAGE == TRUE
+extern struct RTCDriverVMT _rtc_lld_vmt;
+#endif
+#endif
+
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/os/hal/ports/STM32/LLD/RTCv1/hal_rtc_lld.h b/os/hal/ports/STM32/LLD/RTCv1/hal_rtc_lld.h
index 98f750dc7..1903af378 100644
--- a/os/hal/ports/STM32/LLD/RTCv1/hal_rtc_lld.h
+++ b/os/hal/ports/STM32/LLD/RTCv1/hal_rtc_lld.h
@@ -85,23 +85,11 @@
/*===========================================================================*/
/**
- * @brief FileStream specific methods.
- */
-#define _rtc_driver_methods \
- _file_stream_methods
-
-/**
* @brief Type of a structure representing an RTC alarm time stamp.
*/
typedef struct RTCAlarm RTCAlarm;
/**
- * @brief Type of an RTC alarm.
- * @details Meaningful on platforms with more than 1 alarm comparator.
- */
-typedef uint32_t rtcalarm_t;
-
-/**
* @brief Type of an RTC event.
*/
typedef enum {
@@ -125,36 +113,14 @@ struct RTCAlarm {
uint32_t tv_sec;
};
-#if RTC_HAS_STORAGE || defined(__DOXYGEN__)
-/**
- * @extends FileStream
- *
- * @brief @p RTCDriver virtual methods table.
- */
-struct RTCDriverVMT {
- _rtc_driver_methods
-};
-#endif
-
/**
- * @brief Structure representing an RTC driver.
+ * @brief Implementation-specific @p RTCDriver fields.
*/
-struct RTCDriver{
-#if RTC_HAS_STORAGE || defined(__DOXYGEN__)
- /**
- * @brief Virtual Methods Table.
- */
- const struct RTCDriverVMT *vmt;
-#endif
- /**
- * @brief Pointer to the RTC registers block.
- */
- RTC_TypeDef *rtc;
- /**
- * @brief Callback pointer.
- */
+#define _rtc_lld_driver_fields \
+ /* Pointer to the RTC registers block.*/ \
+ RTC_TypeDef *rtc; \
+ /* Callback pointer.*/ \
rtccb_t callback;
-};
/*===========================================================================*/
/* Driver macros. */
@@ -164,13 +130,6 @@ struct RTCDriver{
/* External declarations. */
/*===========================================================================*/
-#if !defined(__DOXYGEN__)
-extern RTCDriver RTCD1;
-#if RTC_HAS_STORAGE
-extern struct RTCDriverVMT _rtc_lld_vmt;
-#endif
-#endif
-
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/os/hal/ports/STM32/LLD/RTCv2/hal_rtc_lld.c b/os/hal/ports/STM32/LLD/RTCv2/hal_rtc_lld.c
index 547b9e98c..19ed93e14 100644
--- a/os/hal/ports/STM32/LLD/RTCv2/hal_rtc_lld.c
+++ b/os/hal/ports/STM32/LLD/RTCv2/hal_rtc_lld.c
@@ -199,86 +199,37 @@ static uint32_t rtc_encode_date(const RTCDateTime *timespec) {
return dr;
}
-#if RTC_HAS_STORAGE
+#if RTC_HAS_STORAGE == TRUE
/* TODO: Map on the backup SRAM on devices that have it.*/
-static size_t _write(void *instance, const uint8_t *bp, size_t n) {
+static size_t _read(void *instance, ps_offset_t offset,
+ size_t n, uint8_t *rp) {
(void)instance;
- (void)bp;
+ (void)offset;
(void)n;
+ (void)rp;
return 0;
}
-static size_t _read(void *instance, uint8_t *bp, size_t n) {
+static ps_error_t _write(void *instance, ps_offset_t offset,
+ size_t n, const uint8_t *wp) {
(void)instance;
- (void)bp;
+ (void)offset;
(void)n;
+ (void)wp;
return 0;
}
-static msg_t _put(void *instance, uint8_t b) {
-
- (void)instance;
- (void)b;
-
- return FILE_OK;
-}
-
-static msg_t _get(void *instance) {
-
- (void)instance;
-
- return FILE_OK;
-}
-
-static msg_t _close(void *instance) {
-
- /* Close is not supported.*/
- (void)instance;
-
- return FILE_OK;
-}
-
-static msg_t _geterror(void *instance) {
-
- (void)instance;
-
- return (msg_t)0;
-}
-
-static msg_t _getsize(void *instance) {
-
- (void)instance;
-
- return 0;
-}
-
-static msg_t _getposition(void *instance) {
-
- (void)instance;
-
- return 0;
-}
-
-static msg_t _lseek(void *instance, fileoffset_t offset) {
-
- (void)instance;
- (void)offset;
-
- return FILE_OK;
-}
-
/**
* @brief VMT for the RTC storage file interface.
*/
struct RTCDriverVMT _rtc_lld_vmt = {
- _write, _read, _put, _get,
- _close, _geterror, _getsize, _getposition, _lseek
+ _getsize, _read, _write
};
-#endif /* RTC_HAS_STORAGE */
+#endif /* RTC_HAS_STORAGE == TRUE */
/*===========================================================================*/
/* Driver interrupt handlers. */
diff --git a/os/hal/ports/STM32/LLD/RTCv2/hal_rtc_lld.h b/os/hal/ports/STM32/LLD/RTCv2/hal_rtc_lld.h
index 51b3244d5..e6dbcbefd 100644
--- a/os/hal/ports/STM32/LLD/RTCv2/hal_rtc_lld.h
+++ b/os/hal/ports/STM32/LLD/RTCv2/hal_rtc_lld.h
@@ -134,17 +134,6 @@
/*===========================================================================*/
/**
- * @brief FileStream specific methods.
- */
-#define _rtc_driver_methods \
- _file_stream_methods
-
-/**
- * @brief Type of an RTC alarm number.
- */
-typedef uint32_t rtcalarm_t;
-
-/**
* @brief Type of a structure representing an RTC alarm time stamp.
*/
typedef struct {
@@ -168,33 +157,12 @@ typedef struct {
} RTCWakeup;
#endif
-#if RTC_HAS_STORAGE || defined(__DOXYGEN__)
/**
- * @extends FileStream
- *
- * @brief @p RTCDriver virtual methods table.
+ * @brief Implementation-specific @p RTCDriver fields.
*/
-struct RTCDriverVMT {
- _rtc_driver_methods
-};
-#endif
-
-/**
- * @brief Structure representing an RTC driver.
- */
-struct RTCDriver {
-#if RTC_HAS_STORAGE || defined(__DOXYGEN__)
- /**
- * @brief Virtual Methods Table.
- */
- const struct RTCDriverVMT *vmt;
-#endif
- /* End of the mandatory fields.*/
- /**
- * @brief Pointer to the RTC registers block.
- */
+#define _rtc_lld_driver_fields \
+ /* Pointer to the RTC registers block.*/ \
RTC_TypeDef *rtc;
-};
/*===========================================================================*/
/* Driver macros. */
@@ -204,13 +172,6 @@ struct RTCDriver {
/* External declarations. */
/*===========================================================================*/
-#if !defined(__DOXYGEN__)
-extern RTCDriver RTCD1;
-#if RTC_HAS_STORAGE
-extern struct RTCDriverVMT _rtc_lld_vmt;
-#endif
-#endif
-
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/os/hal/templates/hal_rtc_lld.h b/os/hal/templates/hal_rtc_lld.h
index 0c1131173..40ca8b1ef 100644
--- a/os/hal/templates/hal_rtc_lld.h
+++ b/os/hal/templates/hal_rtc_lld.h
@@ -80,17 +80,6 @@
/* Driver data structures and types. */
/*===========================================================================*/
-/**
- * @brief FileStream specific methods.
- */
-#define _rtc_driver_methods \
- _file_stream_methods
-
-/**
- * @brief Type of an RTC alarm number.
- */
-typedef uint32_t rtcalarm_t;
-
#if (RTC_SUPPORTS_CALLBACKS == TRUE) || defined(__DOXYGEN__)
/**
* @brief Type of an RTC event.
@@ -113,30 +102,11 @@ typedef struct {
uint32_t dummy;
} RTCAlarm;
-#if (RTC_HAS_STORAGE == TRUE) || defined(__DOXYGEN__)
/**
- * @extends FileStream
- *
- * @brief @p RTCDriver virtual methods table.
+ * @brief Implementation-specific @p RTCDriver fields.
*/
-struct RTCDriverVMT {
- _rtc_driver_methods
-};
-#endif
-
-/**
- * @brief Structure representing an RTC driver.
- */
-struct RTCDriver {
-#if (RTC_HAS_STORAGE == TRUE) || defined(__DOXYGEN__)
- /**
- * @brief Virtual Methods Table.
- */
- const struct RTCDriverVMT *vmt;
-#endif
- /* End of the mandatory fields.*/
+#define _rtc_lld_driver_fields \
uint32_t dummy;
-};
/*===========================================================================*/
/* Driver macros. */
@@ -150,10 +120,6 @@ struct RTCDriver {
extern RTCDriver RTCD1;
#endif
-#if (RTC_HAS_STORAGE == TRUE) && !defined(__DOXYGEN__)
-extern struct RTCDriverVMT _rtc_lld_vmt;
-#endif
-
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/readme.txt b/readme.txt
index b5f0c00e8..caa24044f 100644
--- a/readme.txt
+++ b/readme.txt
@@ -75,6 +75,8 @@
*****************************************************************************
*** Next ***
+- NEW_ Modified the RTC driver to implement the persistent storage interface
+ instead of files interface.
- NEW: Added a new "persistent storage" base class to HAL.
- NEW: Added support for TIM21 and TIM22 in STM32 GPT driver.
- NEW: Reinforced checks in TIM-related drivers.