[sw] add CRC HAL

This commit is contained in:
stnolting 2023-06-17 18:48:08 +02:00
parent 70fd575c05
commit 05f9f74e35
5 changed files with 202 additions and 0 deletions

View file

@ -205,6 +205,7 @@ enum NEORV32_CLOCK_PRSC_enum {
#define NEORV32_SDI_BASE (0xFFFFFF00U) /**< Serial Data Interface (SDI) */
#define NEORV32_SLINK_BASE (0xFFFFFF08U) /**< Stream Link Interface (SLINK) */
#define NEORV32_DMA_BASE (0xFFFFFF10U) /**< Direct Memory Access Controller (DMA) */
#define NEORV32_CRC_BASE (0xFFFFFF20U) /**< Cyclic Redundancy Check Unit (DMA) */
#define NEORV32_XIP_BASE (0xFFFFFF40U) /**< Execute In Place Module (XIP) */
#define NEORV32_PWM_BASE (0xFFFFFF50U) /**< Pulse Width Modulation Controller (PWM) */
#define NEORV32_GPTMR_BASE (0xFFFFFF60U) /**< General Purpose Timer (GPTMR) */
@ -241,6 +242,7 @@ enum NEORV32_CLOCK_PRSC_enum {
// IO/peripheral devices
#include "neorv32_buskeeper.h"
#include "neorv32_cfs.h"
#include "neorv32_crc.h"
#include "neorv32_dm.h"
#include "neorv32_dma.h"
#include "neorv32_gpio.h"

View file

@ -0,0 +1,82 @@
// #################################################################################################
// # << NEORV32: neorv32_crc.h - Cyclic Redundancy Check Unit (CRC) HW Driver >> #
// # ********************************************************************************************* #
// # BSD 3-Clause License #
// # #
// # Copyright (c) 2023, Stephan Nolting. All rights reserved. #
// # #
// # Redistribution and use in source and binary forms, with or without modification, are #
// # permitted provided that the following conditions are met: #
// # #
// # 1. Redistributions of source code must retain the above copyright notice, this list of #
// # conditions and the following disclaimer. #
// # #
// # 2. Redistributions in binary form must reproduce the above copyright notice, this list of #
// # conditions and the following disclaimer in the documentation and/or other materials #
// # provided with the distribution. #
// # #
// # 3. Neither the name of the copyright holder nor the names of its contributors may be used to #
// # endorse or promote products derived from this software without specific prior written #
// # permission. #
// # #
// # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS #
// # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF #
// # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE #
// # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, #
// # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
// # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED #
// # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING #
// # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED #
// # OF THE POSSIBILITY OF SUCH DAMAGE. #
// # ********************************************************************************************* #
// # The NEORV32 Processor - https://github.com/stnolting/neorv32 (c) Stephan Nolting #
// #################################################################################################
/**********************************************************************//**
* @file neorv32_crc.h
* @brief Cyclic redundancy check unit (CRC) HW driver header file.
*
* @note These functions should only be used if the CRC unit was synthesized (IO_CRC_EN = true).
**************************************************************************/
#ifndef neorv32_crc_h
#define neorv32_crc_h
/**********************************************************************//**
* @name IO Device: Cyclic Redundancy Check Unit (CRC)
**************************************************************************/
/**@{*/
/** CRC module prototype */
typedef volatile struct __attribute__((packed,aligned(4))) {
uint32_t MODE; /**< offset 0: mode register (#NEORV32_CRC_MODE_enum) */
uint32_t POLY; /**< offset 4: polynomial register */
uint32_t DATA; /**< offset 8: data input register */
uint32_t SREG; /**< offset 12: CRC shift register */
} neorv32_crc_t;
/** CRC module hardware access (#neorv32_crc_t) */
#define NEORV32_CRC ((neorv32_crc_t*) (NEORV32_CRC_BASE))
/** CRC mode select */
enum NEORV32_CRC_MODE_enum {
CRC_MODE8 = 0b00, /**< (0) crc8 */
CRC_MODE16 = 0b01, /**< (1) crc16 */
CRC_MODE32 = 0b10, /**< (3) crc32 */
};
/**@}*/
/**********************************************************************//**
* @name Prototypes
**************************************************************************/
/**@{*/
int neorv32_crc_available(void);
void neorv32_crc_setup(uint32_t mode, uint32_t poly, uint32_t start);
uint32_t neorv32_crc_block(uint8_t *byte, int length);
void neorv32_crc_single(uint8_t byte);
uint32_t neorv32_crc_get(void);
/**@}*/
#endif // neorv32_crc_h

View file

@ -72,6 +72,7 @@ enum NEORV32_SYSINFO_SOC_enum {
SYSINFO_SOC_OCD = 10, /**< SYSINFO_FEATURES (10) (r/-): On-chip debugger implemented when 1 (via ON_CHIP_DEBUGGER_EN generic) */
SYSINFO_SOC_IO_CRC = 13, /**< SYSINFO_FEATURES (13) (r/-):Cyclic redundancy check unit implemented when 1 (via IO_CRC_EN generic) */
SYSINFO_SOC_IO_SLINK = 14, /**< SYSINFO_FEATURES (14) (r/-): Stream link interface implemented when 1 (via IO_SLINK_EN generic) */
SYSINFO_SOC_IO_DMA = 15, /**< SYSINFO_FEATURES (15) (r/-): Direct memory access controller implemented when 1 (via IO_DMA_EN generic) */
SYSINFO_SOC_IO_GPIO = 16, /**< SYSINFO_FEATURES (16) (r/-): General purpose input/output port unit implemented when 1 (via IO_GPIO_EN generic) */

116
sw/lib/source/neorv32_crc.c Normal file
View file

@ -0,0 +1,116 @@
// #################################################################################################
// # << NEORV32: neorv32_crc.c - Cyclic Redundancy Check Unit (CRC) HW Driver >> #
// # ********************************************************************************************* #
// # BSD 3-Clause License #
// # #
// # Copyright (c) 2023, Stephan Nolting. All rights reserved. #
// # #
// # Redistribution and use in source and binary forms, with or without modification, are #
// # permitted provided that the following conditions are met: #
// # #
// # 1. Redistributions of source code must retain the above copyright notice, this list of #
// # conditions and the following disclaimer. #
// # #
// # 2. Redistributions in binary form must reproduce the above copyright notice, this list of #
// # conditions and the following disclaimer in the documentation and/or other materials #
// # provided with the distribution. #
// # #
// # 3. Neither the name of the copyright holder nor the names of its contributors may be used to #
// # endorse or promote products derived from this software without specific prior written #
// # permission. #
// # #
// # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS #
// # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF #
// # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE #
// # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, #
// # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
// # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED #
// # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING #
// # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED #
// # OF THE POSSIBILITY OF SUCH DAMAGE. #
// # ********************************************************************************************* #
// # The NEORV32 Processor - https://github.com/stnolting/neorv32 (c) Stephan Nolting #
// #################################################################################################
/**********************************************************************//**
* @file neorv32_crc.c
* @brief Cyclic redundancy check unit (CRC) HW driver source file.
*
* @note These functions should only be used if the CRC unit was synthesized (IO_CRC_EN = true).
**************************************************************************/
#include "neorv32.h"
#include "neorv32_crc.h"
/**********************************************************************//**
* Check if CRC unit was synthesized.
*
* @return 0 if CRC was not synthesized, 1 if CRC is available.
**************************************************************************/
int neorv32_crc_available(void) {
if (NEORV32_SYSINFO->SOC & (1 << SYSINFO_SOC_IO_CRC)) {
return 1;
}
else {
return 0;
}
}
/**********************************************************************//**
* Setup CRC unit.
*
* @param[in] mode Operation mode (#NEORV32_CRC_MODE_enum).
* @param[in] poly CRC polynomial.
* @param[in] start CRC shift register start value.
**************************************************************************/
void neorv32_crc_setup(uint32_t mode, uint32_t poly, uint32_t start) {
NEORV32_CRC->MODE = mode;
NEORV32_CRC->POLY = poly;
NEORV32_CRC->SREG = start;
}
/**********************************************************************//**
* Compute pre-configured CRC for entire data block.
*
* @param[in] byte Pointer to byte (uint8_t) source data array.
* @param[in] length Length of source data array.
* @return 32-bit CRC result.
**************************************************************************/
uint32_t neorv32_crc_block(uint8_t *byte, int length) {
int i;
for (i=0; i<length; i++) {
NEORV32_CRC->DATA = (uint32_t)byte[i];
}
return NEORV32_CRC->SREG;
}
/**********************************************************************//**
* Compute pre-configured CRC for single data byte.
*
* @param[in] byte Data byte (uint8_t).
**************************************************************************/
void neorv32_crc_single(uint8_t byte) {
NEORV32_CRC->DATA = (uint32_t)byte;
}
/**********************************************************************//**
* Get current CRC shift register data.
*
* @return 32-bit CRC result.
**************************************************************************/
uint32_t neorv32_crc_get(void) {
return NEORV32_CRC->SREG;
}

View file

@ -521,6 +521,7 @@ void neorv32_rte_print_hw_config(void) {
__neorv32_rte_print_checkbox(tmp & (1 << SYSINFO_SOC_IO_ONEWIRE)); neorv32_uart0_printf(" ONEWIRE\n");
__neorv32_rte_print_checkbox(tmp & (1 << SYSINFO_SOC_IO_DMA)); neorv32_uart0_printf(" DMA\n");
__neorv32_rte_print_checkbox(tmp & (1 << SYSINFO_SOC_IO_SLINK)); neorv32_uart0_printf(" SLINK\n");
__neorv32_rte_print_checkbox(tmp & (1 << SYSINFO_SOC_IO_CRC)); neorv32_uart0_printf(" CRC\n");
}