diff options
author | Michael Spradling <mike@mspradling.com> | 2015-06-29 21:54:13 -0400 |
---|---|---|
committer | Michael Spradling <mike@mspradling.com> | 2015-08-16 01:26:07 -0400 |
commit | 316c3b4825689afca170576e5a5681302f64fdfa (patch) | |
tree | a00655dd3e1a38efa06b030f3051863a1eb15b2e /os/various/crcsw.h | |
parent | ab80aabfd48b50e122f6ff43adeedd1af4a5a607 (diff) | |
download | ChibiOS-Contrib-316c3b4825689afca170576e5a5681302f64fdfa.tar.gz ChibiOS-Contrib-316c3b4825689afca170576e5a5681302f64fdfa.tar.bz2 ChibiOS-Contrib-316c3b4825689afca170576e5a5681302f64fdfa.zip |
Add CRC Driver
This patch includes a high level and two low level drivers.
The high level driver is enabled with flag HAL_USE_CRC
The low level drivers include:
* Hardware CRC for the STM32 cortex processor lines.(when supported)
* Enabled with flag STM32_CRC_USE_CRC1
* DMA is enabled with CRC_USE_DMA
* SYNC api will use DMA, but put calling thread to sleep
* ASYNC api enabled.
* DMA Disabled
* SYNC api spin while calculating CRC
* ASYNC api disabled
* Software CRC (3 modes)
* CRCSW_CRC32_TABLE - Enables crc32 with lookup table.
* CRCSW_CRC16_TABLE - Enables crc16 with lookup tables.
* CRCSW_PROGRAMMBLE - Enables any crc done with computation.
* Can calculate any crc configuration.
* CRC_USE_DMA obviously not support with software CRC
Diffstat (limited to 'os/various/crcsw.h')
-rw-r--r-- | os/various/crcsw.h | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/os/various/crcsw.h b/os/various/crcsw.h new file mode 100644 index 0000000..4483a34 --- /dev/null +++ b/os/various/crcsw.h @@ -0,0 +1,215 @@ +/* + ChibiOS - Copyright (C) 2015 Michael D. Spradling + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file crcsw.h + * @brief CRC software driver. + * + * @addtogroup CRC + * @{ + */ + +#include "hal.h" + +#if HAL_USE_CRC || defined(__DOXYGEN__) + +#if CRCSW_USE_CRC1 || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Driver pre-compile time settings. */ +/*===========================================================================*/ + +/** + * @name Configuration options + * @{ + */ +/** + * @brief CRC1 software driver enable switch. + * @details If set to @p TRUE the support for CRC1 is included. + * @note The default is @p FALSE + */ +#if !defined(CRCSW_USE_CRC1) || defined(__DOXYGEN__) +#define CRCSW_USE_CRC1 FALSE +#endif + +/** + * @brief Enables software CRC32 + */ +#if !defined(CRCSW_CRC32_TABLE) || defined(__DOXYGEN__) +#define CRCSW_CRC32_TABLE FALSE +#endif + +/** + * @brief Enables software CRC16 + */ +#if !defined(CRCSW_CRC16_TABLE) || defined(__DOXYGEN__) +#define CRCSW_CRC16_TABLE FALSE +#endif + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +#if CRCSW_USE_CRC1 && CRC_USE_DMA +#error "Software CRC does not support DMA(CRC_USE_DMA)" +#endif + +#if CRCSW_CRC32_TABLE == FALSE && CRCSW_CRC16_TABLE == FALSE && \ + CRCSW_PROGRAMMABLE == FALSE +#error "At least one of CRCSW_PROGRAMMABLE, CRCSW_CRC32_TABLE, or CRCSW_CRC16_TABLE must be defined" +#endif + +/*===========================================================================*/ +/* Driver data structures and types. */ +/*===========================================================================*/ +/** + * @brief Type of a structure representing an CRC driver. + */ +typedef struct CRCDriver CRCDriver; + +/** + * @brief Driver configuration structure. + */ +typedef struct { + /** + * @brief The size of polynomial to be used for CRC. + */ + uint32_t poly_size; + /** + * @brief The coefficients of the polynomial to be used for CRC. + */ + uint32_t poly; + /** + * @brief The inital value + */ + uint32_t initial_val; + /** + * @brief The final XOR value + */ + uint32_t final_val; + /** + * @brief Reflect bit order data going into CRC + */ + bool reflect_data; + /** + * @brief Reflect bit order of final remainder + */ + bool reflect_remainder; + /* End of the mandatory fields.*/ + /** + * @brief The crc lookup table to use when calculating CRC. + */ + const uint32_t *table; +} CRCConfig; + + +/** + * @brief Structure representing an CRC driver. + */ +struct CRCDriver { + /** + * @brief Driver state. + */ + crcstate_t state; + /** + * @brief Current configuration data. + */ + const CRCConfig *config; +#if CRC_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__) + /** + * @brief Mutex protecting the peripheral. + */ + mutex_t mutex; +#endif /* CRC_USE_MUTUAL_EXCLUSION */ + /* End of the mandatory fields.*/ + /** + * @brief Current value of calculated CRC. + */ + uint32_t crc; +}; + +/*===========================================================================*/ +/* Driver macros. */ +/*===========================================================================*/ +#if CRCSW_CRC32_TABLE || defined(__DOXYGEN__) +/** + * @brief Configuration that represents CRC32 + */ +#define CRCSW_CRC32_TABLE_CONFIG (&crcsw_crc32_config) +#endif + +#if CRCSW_CRC16_TABLE || defined(__DOXYGEN__) +/** + * @brief Configuration that represents CRC16 + */ +#define CRCSW_CRC16_TABLE_CONFIG (&crcsw_crc16_config) +#endif + +/*===========================================================================*/ +/* Driver local definitions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver exported variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local variables and types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local functions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver interrupt handlers. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver exported functions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +extern CRCDriver CRCD1; + +#if CRCSW_CRC32_TABLE +extern const CRCConfig crcsw_crc32_config; +#endif + +#if CRCSW_CRC16_TABLE +extern const CRCConfig crcsw_crc16_config; +#endif + +#ifdef __cplusplus +extern "C" { +#endif + void crc_lld_init(void); + void crc_lld_start(CRCDriver *crcp); + void crc_lld_stop(CRCDriver *crcp); + void crc_lld_reset(CRCDriver *crcp); + uint32_t crc_lld_calc(CRCDriver *crcp, size_t n, const void *buf); +#ifdef __cplusplus +} +#endif + +#endif /* CRCSW_USE_CRC1 */ + +#endif /* HAL_USE_CRC */ + +/** @} */ |