Changes to the RTC driver to use the persistent storage interface,

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@12366 110e8d01-0319-4d1e-a829-52ad28d1bb01
This commit is contained in:
Giovanni Di Sirio 2018-10-14 12:31:41 +00:00
parent 8ec0f1a753
commit dbf616f8b3
7 changed files with 92 additions and 193 deletions

View File

@ -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;

View File

@ -87,6 +87,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.
*/
@ -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

View File

@ -84,23 +84,11 @@
/* Driver data structures and types. */
/*===========================================================================*/
/**
* @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.
*/
@ -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.
*/
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.
* @brief Implementation-specific @p RTCDriver fields.
*/
#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

View File

@ -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) {
(void)instance;
(void)bp;
(void)n;
return 0;
}
static size_t _read(void *instance, uint8_t *bp, size_t n) {
(void)instance;
(void)bp;
(void)n;
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) {
static size_t _read(void *instance, ps_offset_t offset,
size_t n, uint8_t *rp) {
(void)instance;
(void)offset;
(void)n;
(void)rp;
return FILE_OK;
return 0;
}
static ps_error_t _write(void *instance, ps_offset_t offset,
size_t n, const uint8_t *wp) {
(void)instance;
(void)offset;
(void)n;
(void)wp;
return 0;
}
/**
* @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. */

View File

@ -133,17 +133,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;
/**
* @brief Type of a structure representing an RTC alarm time stamp.
*/
@ -168,33 +157,12 @@ typedef struct {
} RTCWakeup;
#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
/* End of the mandatory fields.*/
/**
* @brief Pointer to the RTC registers block.
* @brief Implementation-specific @p RTCDriver fields.
*/
#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

View File

@ -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

View File

@ -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.