Hardware Abstraction Layer (HAL)
CRC (Cyclic Redundancy Check)

General Description

High level interface for interacting with the CRC, which provides hardware accelerated CRC computations.

The CRC APIs are structured to enable usage in situations where the entire input data set is not available in memory at the same time. Therefore, each conversion consists of three steps:

Many of the algorithm parameters can be customized.

See crc_algorithm_t and Snippet1: CRC Generation for more details.

Quick Start

cyhal_crc_init initializes the CRC generator and passes the pointer to the CRC block through the obj object of type cyhal_crc_t.

Snippet1: CRC Generation

The following snippet initializes a CRC generator and computes the CRC for a sample message.

/* CRC parameters for some CRC algorithms:
+---------------------+-----+------------+------------+------+------+-----+------------+------------+
| CRC algorithm Name | CRC | Polynom | Initial | Data | Data | Rem | Remainder | Expected |
| | len | | seed | REV | XOR | REV | XOR | CRC |
| ------------------- | --- | ---------- |----------- | ---- | ---- | --- | ---------- | ---------- |
| CRC-6 / CDMA2000-A | 6 | 0x27 | 0x3F | 0 | 0 | 0 | 0x00 | 0x0D |
| CRC-6 / CDMA2000-B | 6 | 0x07 | 0x3F | 0 | 0 | 0 | 0x00 | 0x3B |
| CRC-6 / DARC | 6 | 0x19 | 0x00 | 1 | 0 | 1 | 0x00 | 0x26 |
| CRC-6 / ITU | 6 | 0x03 | 0x00 | 1 | 0 | 1 | 0x00 | 0x06 |
| CRC-8 / ITU | 8 | 0x07 | 0x00 | 0 | 0 | 0 | 0x55 | 0xA1 |
| CRC-8 / MAXIM | 8 | 0x31 | 0x00 | 1 | 0 | 1 | 0x00 | 0xA1 |
| CRC-8 / ROHC | 8 | 0x07 | 0xFF | 1 | 0 | 1 | 0x00 | 0xD0 |
| CRC-8 / WCDMA | 8 | 0x9B | 0x00 | 1 | 0 | 1 | 0x00 | 0x25 |
| CRC-16 / CCITT-0 | 16 | 0x1021 | 0xFFFF | 0 | 0 | 0 | 0x0000 | 0x29B1 |
| CRC-16 / CDMA2000 | 16 | 0xC867 | 0xFFFF | 0 | 0 | 0 | 0x0000 | 0x4C06 |
| CRC-32 | 32 | 0x04C11DB7 | 0xFFFFFFFF | 1 | 0 | 1 | 0xFFFFFFFF | 0xCBF43926 |
| CRC-32 / BZIP2 | 32 | 0x04C11DB7 | 0xFFFFFFFF | 0 | 0 | 0 | 0xFFFFFFFF | 0xFC891918 |
+---------------------+-----+------------+------------+------+------+-----+------------+------------+
*/
/* Using CRC-16/CCITT-0 Algorithm */
#define CRC_BITLEN (16u)
#define CRC_POLYNOMIAL (0x1021u)
#define CRC_LFSR_SEED (0xffffu)
#define CRC_DATA_REVERSE (0u)
#define CRC_DATA_XOR (0u)
#define CRC_REM_REVERSE (0u)
#define CRC_REM_XOR (0x0000u)
#define MSG_LENGTH 9
CY_ALIGN(4) uint8_t message[MSG_LENGTH] = "123456789";
CY_ALIGN(4) uint32_t calc_crc = 0;
/* Set CRC algorithm parameters */
crc_algorithm_t my_algorithm = {
.width = CRC_BITLEN,
.polynomial = CRC_POLYNOMIAL,
.lfsrInitState = CRC_LFSR_SEED,
.dataReverse = CRC_DATA_REVERSE,
.dataXor = CRC_DATA_XOR,
.remReverse = CRC_REM_REVERSE,
.remXor = CRC_REM_XOR
};
cy_rslt_t rslt;
cyhal_crc_t crc_obj;
/* Initialize the CRC Generator */
rslt = cyhal_crc_init(&crc_obj);
/* Initialize the CRC algorithm parameters */
rslt = cyhal_crc_start(&crc_obj, &my_algorithm);
/* Compute CRC */
rslt = cyhal_crc_compute(&crc_obj, message, MSG_LENGTH);
/* Finish computation */
rslt = cyhal_crc_finish(&crc_obj, &calc_crc);
/* Release the CRC generator
* Note: Free only if not required anymore
*/
cyhal_crc_free(&crc_obj);

API Reference

 CRC HAL Results
 CRC specific return codes.
 

Data Structures

struct  crc_algorithm_t
 CRC algorithm parameters. More...
 

Functions

cy_rslt_t cyhal_crc_init (cyhal_crc_t *obj)
 Initialize the CRC generator. More...
 
void cyhal_crc_free (cyhal_crc_t *obj)
 Release the CRC generator. More...
 
cy_rslt_t cyhal_crc_start (cyhal_crc_t *obj, const crc_algorithm_t *algorithm)
 The CRC block is setup to perform CRC computation. More...
 
cy_rslt_t cyhal_crc_compute (const cyhal_crc_t *obj, const uint8_t *data, size_t length)
 Computes the CRC for the given data and accumulates the CRC with the CRC generated from previous calls. More...
 
cy_rslt_t cyhal_crc_finish (const cyhal_crc_t *obj, uint32_t *crc)
 Finalizes the CRC computation and returns the CRC for the complete set of data passed through a single call or multiple calls to cyhal_crc_compute. More...
 

Data Structure Documentation

◆ crc_algorithm_t

struct crc_algorithm_t
Data Fields
uint32_t width Bit width of the CRC.
uint32_t polynomial The polynomial to use.
uint32_t lfsrInitState Initial state of the LFSR.
uint32_t dataXor Byte mask to xor with the data.
uint32_t remXor Mask to xor with the remainder.
bool dataReverse The order in which data should be processed.

If 0, data is processed MSB first. If 1, data is processed LSB first.

bool remReverse If 1, the remainder is reversed. If 0, it is not.

Function Documentation

◆ cyhal_crc_init()

cy_rslt_t cyhal_crc_init ( cyhal_crc_t obj)

Initialize the CRC generator.

This function reserves the CRYPTO block for CRC calculations.

Parameters
[out]objPointer to a CRC generator object. The caller must allocate the memory for this object but the init function will initialize its contents.
Returns
The status of the init request.

Returns CY_RSLT_SUCCESS if the operation was successful. Refer Snippet1: CRC Generation for more information.

◆ cyhal_crc_free()

void cyhal_crc_free ( cyhal_crc_t obj)

Release the CRC generator.

Parameters
[in,out]objThe CRC generator object

◆ cyhal_crc_start()

cy_rslt_t cyhal_crc_start ( cyhal_crc_t obj,
const crc_algorithm_t algorithm 
)

The CRC block is setup to perform CRC computation.

Parameters
[in,out]objThe CRC generator object
[in]algorithmThe CRC algorithm to use for computations Refer crc_algorithm_t.
Returns
The status of the compute request

Returns CY_RSLT_SUCCESS if the operation was successful.

◆ cyhal_crc_compute()

cy_rslt_t cyhal_crc_compute ( const cyhal_crc_t obj,
const uint8_t *  data,
size_t  length 
)

Computes the CRC for the given data and accumulates the CRC with the CRC generated from previous calls.

This function can be called multiple times to provide additional data.

Note
Input data must be 4-byte aligned. Refer Snippet1: CRC Generation for more details.
Parameters
[in]objThe CRC generator object
[in]dataThe input data
[in]lengthThe number of bytes in the data
Returns
The status of the compute request

Returns CY_RSLT_SUCCESS if the operation was successful.

◆ cyhal_crc_finish()

cy_rslt_t cyhal_crc_finish ( const cyhal_crc_t obj,
uint32_t *  crc 
)

Finalizes the CRC computation and returns the CRC for the complete set of data passed through a single call or multiple calls to cyhal_crc_compute.

Note
The computed CRC pointer provided must be 4 byte aligned. Refer Snippet1: CRC Generation for more details.
Parameters
[in]objThe CRC generator object
[out]crcThe computed CRC
Returns
The status of the compute request

Returns CY_RSLT_SUCCESS if the operation was successful.