![]() |
Kinetis Bootloader
2.0.0
Common bootloader for Kinetis devices
|
Collaboration diagram for CRC driver:Data Structures | |
| struct | crc_config_t |
| CRC protocol configuration. More... | |
Enumerations | |
| enum | crc_bits_t { kCrcBits16 = 0U, kCrcBits32 = 1U } |
| CRC bit width. More... | |
| enum | crc_result_t { kCrcFinalChecksum = 0U, kCrcIntermediateChecksum = 1U } |
| CRC result type. More... | |
Functions | |
| void | CRC_Init (CRC_Type *base, const crc_config_t *config) |
| Enable and configure the CRC peripheral module. More... | |
| static void | CRC_Deinit (CRC_Type *base) |
| Disable the CRC peripheral module. More... | |
| void | CRC_GetDefaultConfig (crc_config_t *config) |
| Loads default values to CRC protocol configuration structure. More... | |
| void | CRC_WriteData (CRC_Type *base, const uint8_t *data, size_t dataSize) |
| Write data to the CRC module. More... | |
| static uint32_t | CRC_Get32bitResult (CRC_Type *base) |
| Read 32-bit checksum from the CRC module. More... | |
| uint16_t | CRC_Get16bitResult (CRC_Type *base) |
| Read 16-bit checksum from the CRC module. More... | |
This section describes the programming interface of the CRC driver.
CRC_Init() function enables the clock gate for the CRC module in the Kinetis SIM module and fully (re-)configures the CRC module according to configuration structure. The seed member of the configuration structure is the initial checksum for which new data can be added to. When starting new checksum computation, the seed shall be set to the initial checksum per the CRC protocol specification. For continued checksum operation, the seed shall be set to the intermediate checksum value as obtained from previous calls to CRC_Get16bitResult() or CRC_Get32bitResult() function. After CRC_Init(), one or multiple CRC_WriteData() calls follow to update checksum with data, then CRC_Get16bitResult() or CRC_Get32bitResult() follows to read the result. The crcResult member of confiration structure determines if CRC_Get16bitResult() or CRC_Get32bitResult() return value is final checksum or intermediate checksum. CRC_Init() can be called as many times as required, thus, allows for runtime changes of CRC protocol.
CRC_GetDefaultConfig() function can be used to set the module configuration structure with parameters for CRC-16/CCIT-FALSE protocol.
The CRC_WriteData() function is used to add data to actual CRC. Internally it tries to use 32-bit reads and writes for all aligned data in the user buffer and it uses 8-bit reads and writes for all unaligned data in the user buffer. This function can update CRC with user supplied data chunks of arbitrary size, so one can update CRC byte by byte or with all bytes at once. Prior call CRC configuration function CRC_Init() fully specifies the CRC module configuration for CRC_WriteData() call.
The CRC_Get16bitResult() or CRC_Get32bitResult() function is used to read the CRC module data register. Depending on prior CRC module usage the return value is either intermediate checksum or final checksum. Example: for 16-bit CRCs the following call sequences can be used:
CRC_Init() / CRC_WriteData() / CRC_Get16bitResult() to get final checksum.
CRC_Init() / CRC_WriteData() / ... / CRC_WriteData() / CRC_Get16bitResult() to get final checksum.
CRC_Init() / CRC_WriteData() / CRC_Get16bitResult() to get intermediate checksum.
CRC_Init() / CRC_WriteData() / ... / CRC_WriteData() / CRC_Get16bitResult() to get intermediate checksum.
If multiple RTOS tasks will share the CRC module to compute checksums with different data and/or protocols, the following shall be implemented by user:
The triplets
CRC_Init() / CRC_WriteData() / CRC_Get16bitResult() or CRC_Get32bitResult()
shall be protected by RTOS mutex to protect CRC module against concurrent accesses from different tasks. Example:
All APIs can be used from interrupt handler although execution time shall be considered (interrupt latency of equal and lower priority interrupts increases). Protection against concurrent accesses from different interrupt handlers and/or tasks shall be assured by the user.
Simple example with default CRC-16/CCIT-FALSE protocol
Simple example with CRC-32 protocol configuration
Per-partes data updates with context switch between. Assuming we have 3 tasks/threads, each using CRC module to compute checksums of different protocol, with context switches.
Firstly, we prepare 3 CRC module init functions for 3 different protocols: CRC-16 (ARC), CRC-16/CCIT-FALSE and CRC-32. Table below lists the individual protocol specifications. See also: http://reveng.sourceforge.net/crc-catalogue/
| CRC-16/CCIT-FALSE | CRC-16 | CRC-32 | |
|---|---|---|---|
| Width | 16 bits | 16 bits | 32 bits |
| Polynomial | 0x1021 | 0x8005 | 0x04C11DB7 |
| Initial seed | 0xFFFF | 0x0000 | 0xFFFFFFFF |
| Complement checksum | No | No | Yes |
| Reflect In | No | Yes | Yes |
| Reflect Out | No | Yes | Yes |
Corresponding init functions:
The following context switches show possible API usage:
| struct crc_config_t |
CRC protocol configuration.
This structure holds the configuration for the CRC protocol.
| Data Fields | ||
|---|---|---|
| bool | complementChecksum |
True if the result shall be complement of the actual checksum. |
| crc_bits_t | crcBits |
Selects 16- or 32- bit CRC protocol. |
| crc_result_t | crcResult |
Selects final or intermediate checksum return from CRC_Get16bitResult() or CRC_Get32bitResult() |
| uint32_t | polynomial |
CRC Polynomial, MSBit first. Example polynomial: 0x1021 = 1_0000_0010_0001 = x^12+x^5+1 |
| bool | reflectIn |
Reflect bits on input. |
| bool | reflectOut |
Reflect bits on output. |
| uint32_t | seed |
Starting checksum value |
| enum crc_bits_t |
| enum crc_result_t |
|
inlinestatic |
Disable the CRC peripheral module.
This functions disables the clock gate in the Kinetis SIM module for the CRC peripheral.
| base | CRC peripheral address. |
| uint16_t CRC_Get16bitResult | ( | CRC_Type * | base | ) |
Read 16-bit checksum from the CRC module.
Reads CRC data register (intermediate or final checksum). The configured type of transpose and complement are applied.
| base | CRC peripheral address. |
|
inlinestatic |
Read 32-bit checksum from the CRC module.
Reads CRC data register (intermediate or final checksum). The configured type of transpose and complement are applied.
| base | CRC peripheral address. |
| void CRC_GetDefaultConfig | ( | crc_config_t * | config | ) |
Loads default values to CRC protocol configuration structure.
Loads default values to CRC protocol configuration structure. The default values are:
| config | CRC protocol configuration structure |
| void CRC_Init | ( | CRC_Type * | base, |
| const crc_config_t * | config | ||
| ) |
Enable and configure the CRC peripheral module.
This functions enables the clock gate in the Kinetis SIM module for the CRC peripheral. It also configures the CRC module and starts checksum computation by writing the seed.
| base | CRC peripheral address. |
| config | CRC module configuration structure |
| void CRC_WriteData | ( | CRC_Type * | base, |
| const uint8_t * | data, | ||
| size_t | dataSize | ||
| ) |
Write data to the CRC module.
Writes input data buffer bytes to CRC data register. The configured type of transpose is applied.
| base | CRC peripheral address. |
| data | Input data stream, MSByte in data[0]. |
| dataSize | Size in bytes of the input data buffer. |