mirror of https://github.com/ARMmbed/mbed-os.git
Adapt MbedCRC class to support Hardware CRC
- Move CRC polynomial enum into HAL layer, so it's accessible from platform implementations - Add enum to CRC class to indicate which mode the CRC class should use: HARDWARE, TABLE, or BITWISE - Add calls to HAL Hardware CRC API to each of the compute functions when the class is in HARDWARE mode. - Add missing constructor call to template constructor, and remove const from delegating constructor.pull/6708/head
parent
bad3aa0b6b
commit
e0d98bfe2c
|
@ -16,8 +16,8 @@
|
||||||
#ifndef MBED_CRC_API_H
|
#ifndef MBED_CRC_API_H
|
||||||
#define MBED_CRC_API_H
|
#define MBED_CRC_API_H
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include "drivers/TableCRC.h"
|
#include "drivers/TableCRC.h"
|
||||||
|
#include "hal/crc_api.h"
|
||||||
#include "platform/mbed_assert.h"
|
#include "platform/mbed_assert.h"
|
||||||
|
|
||||||
/* This is invalid warning from the compiler for below section of code
|
/* This is invalid warning from the compiler for below section of code
|
||||||
|
@ -38,19 +38,6 @@ namespace mbed {
|
||||||
/** \addtogroup drivers */
|
/** \addtogroup drivers */
|
||||||
/** @{*/
|
/** @{*/
|
||||||
|
|
||||||
/** CRC Polynomial value
|
|
||||||
*
|
|
||||||
* Different polynomial values supported
|
|
||||||
*/
|
|
||||||
typedef enum crc_polynomial {
|
|
||||||
POLY_OTHER = 0,
|
|
||||||
POLY_8BIT_CCITT = 0x07, // x8+x2+x+1
|
|
||||||
POLY_7BIT_SD = 0x9, // x7+x3+1;
|
|
||||||
POLY_16BIT_CCITT = 0x1021, // x16+x12+x5+1
|
|
||||||
POLY_16BIT_IBM = 0x8005, // x16+x15+x2+1
|
|
||||||
POLY_32BIT_ANSI = 0x04C11DB7, // x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
|
|
||||||
} crc_polynomial_t;
|
|
||||||
|
|
||||||
/** CRC object provides CRC generation through hardware/software
|
/** CRC object provides CRC generation through hardware/software
|
||||||
*
|
*
|
||||||
* ROM polynomial tables for supported polynomials (:: crc_polynomial_t) will be used for
|
* ROM polynomial tables for supported polynomials (:: crc_polynomial_t) will be used for
|
||||||
|
@ -106,6 +93,9 @@ typedef enum crc_polynomial {
|
||||||
template <uint32_t polynomial=POLY_32BIT_ANSI, uint8_t width=32>
|
template <uint32_t polynomial=POLY_32BIT_ANSI, uint8_t width=32>
|
||||||
class MbedCRC
|
class MbedCRC
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
enum crc_mode { HARDWARE = 0, TABLE, BITWISE };
|
||||||
|
|
||||||
public:
|
public:
|
||||||
typedef uint64_t crc_data_size_t;
|
typedef uint64_t crc_data_size_t;
|
||||||
|
|
||||||
|
@ -178,13 +168,21 @@ public:
|
||||||
*/
|
*/
|
||||||
int32_t compute_partial(void *buffer, crc_data_size_t size, uint32_t *crc)
|
int32_t compute_partial(void *buffer, crc_data_size_t size, uint32_t *crc)
|
||||||
{
|
{
|
||||||
if (NULL == _crc_table) {
|
switch (mode_)
|
||||||
// Compute bitwise CRC
|
{
|
||||||
return bitwise_compute_partial(buffer, size, crc);
|
case HARDWARE:
|
||||||
} else {
|
#ifdef DEVICE_CRC
|
||||||
// Table CRC
|
hal_crc_compute_partial((uint8_t *)buffer, size);
|
||||||
|
#endif // DEVICE_CRC
|
||||||
|
*crc = 0;
|
||||||
|
return 0;
|
||||||
|
case TABLE:
|
||||||
return table_compute_partial(buffer, size, crc);
|
return table_compute_partial(buffer, size, crc);
|
||||||
|
case BITWISE:
|
||||||
|
return bitwise_compute_partial(buffer, size, crc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Compute partial start, indicate start of partial computation
|
/** Compute partial start, indicate start of partial computation
|
||||||
|
@ -200,6 +198,13 @@ public:
|
||||||
int32_t compute_partial_start(uint32_t *crc)
|
int32_t compute_partial_start(uint32_t *crc)
|
||||||
{
|
{
|
||||||
MBED_ASSERT(crc != NULL);
|
MBED_ASSERT(crc != NULL);
|
||||||
|
|
||||||
|
#ifdef DEVICE_CRC
|
||||||
|
if (mode_ == HARDWARE) {
|
||||||
|
hal_crc_compute_partial_start(polynomial);
|
||||||
|
}
|
||||||
|
#endif // DEVICE_CRC
|
||||||
|
|
||||||
*crc = _initial_value;
|
*crc = _initial_value;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -215,6 +220,16 @@ public:
|
||||||
int32_t compute_partial_stop(uint32_t *crc)
|
int32_t compute_partial_stop(uint32_t *crc)
|
||||||
{
|
{
|
||||||
MBED_ASSERT(crc != NULL);
|
MBED_ASSERT(crc != NULL);
|
||||||
|
|
||||||
|
if (mode_ == HARDWARE) {
|
||||||
|
#ifdef DEVICE_CRC
|
||||||
|
*crc = hal_crc_get_result();
|
||||||
|
return 0;
|
||||||
|
#else
|
||||||
|
return -1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t p_crc = *crc;
|
uint32_t p_crc = *crc;
|
||||||
if ((width < 8) && (NULL == _crc_table)) {
|
if ((width < 8) && (NULL == _crc_table)) {
|
||||||
p_crc = (uint32_t)(p_crc << (8 - width));
|
p_crc = (uint32_t)(p_crc << (8 - width));
|
||||||
|
@ -247,6 +262,7 @@ private:
|
||||||
bool _reflect_data;
|
bool _reflect_data;
|
||||||
bool _reflect_remainder;
|
bool _reflect_remainder;
|
||||||
uint32_t *_crc_table;
|
uint32_t *_crc_table;
|
||||||
|
crc_mode mode_;
|
||||||
|
|
||||||
/** Get the current CRC data size
|
/** Get the current CRC data size
|
||||||
*
|
*
|
||||||
|
@ -408,9 +424,17 @@ private:
|
||||||
/** Constructor init called from all specialized cases of constructor
|
/** Constructor init called from all specialized cases of constructor
|
||||||
* Note: All construtor common code should be in this function.
|
* Note: All construtor common code should be in this function.
|
||||||
*/
|
*/
|
||||||
void mbed_crc_ctor(void) const
|
void mbed_crc_ctor(void)
|
||||||
{
|
{
|
||||||
MBED_STATIC_ASSERT(width <= 32, "Max 32-bit CRC supported");
|
MBED_STATIC_ASSERT(width <= 32, "Max 32-bit CRC supported");
|
||||||
|
|
||||||
|
mode_ = (_crc_table == NULL) ? TABLE : BITWISE;
|
||||||
|
|
||||||
|
#ifdef DEVICE_CRC
|
||||||
|
if (hal_crc_is_supported(polynomial)) {
|
||||||
|
mode_ = HARDWARE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,19 @@
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/** CRC Polynomial value
|
||||||
|
*
|
||||||
|
* Different polynomial values supported
|
||||||
|
*/
|
||||||
|
typedef enum crc_polynomial {
|
||||||
|
POLY_OTHER = 0,
|
||||||
|
POLY_8BIT_CCITT = 0x07, // x8+x2+x+1
|
||||||
|
POLY_7BIT_SD = 0x9, // x7+x3+1;
|
||||||
|
POLY_16BIT_CCITT = 0x1021, // x16+x12+x5+1
|
||||||
|
POLY_16BIT_IBM = 0x8005, // x16+x15+x2+1
|
||||||
|
POLY_32BIT_ANSI = 0x04C11DB7, // x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
|
||||||
|
} crc_polynomial_t;
|
||||||
|
|
||||||
#ifdef DEVICE_CRC
|
#ifdef DEVICE_CRC
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
Loading…
Reference in New Issue