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:

The table below provides CRC parameters for some common CRC algorithms.

Note
The Expected CRC column shows the computed CRC when the value "123456789" is passed to cyhal_crc_compute.
CRC algorithm Name Len Polynomial Initial seed Data REV Data XOR Rem REV Remainder XOR Expected CRC
CRC-6 / CDMA2000-A 6 0x27 0x3F false 0 false 0x00 0x0D
CRC-6 / CDMA2000-B 6 0x07 0x3F false 0 false 0x00 0x3B
CRC-6 / DARC 6 0x19 0x00 true 0 true 0x00 0x26
CRC-6 / ITU 6 0x03 0x00 true 0 true 0x00 0x06
CRC-8 / ITU 8 0x07 0x00 false 0 false 0x55 0xA1
CRC-8 / MAXIM 8 0x31 0x00 true 0 true 0x00 0xA1
CRC-8 / ROHC 8 0x07 0xFF true 0 true 0x00 0xD0
CRC-8 / WCDMA 8 0x9B 0x00 true 0 true 0x00 0x25
CRC-16 / CCITT-0 16 0x1021 0xFFFF false 0 false 0x0000 0x29B1
CRC-16 / CDMA2000 16 0xC867 0xFFFF false 0 false 0x0000 0x4C06
CRC-32 32 0x04C11DB7 0xFFFFFFFF true 0 true 0xFFFFFFFF 0xCBF43926
CRC-32 / BZIP2 32 0x04C11DB7 0xFFFFFFFF false 0 false 0xFFFFFFFF 0xFC891918
Note
Algorithms that have less than 8 bits, like CRC-6, populate the lower bits and leave the high order bits 0.
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.

// 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);
// Additional computations can be done here if needed
// 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
Note
The state of the CRC Block will be reset to the state provided by in the argument algorithm.

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 to Snippet1: CRC Generation for more details.
If the length of the CRC is less than a full word, the result will be in the lower bits allowing the result to be downcast if desired.
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.