mirror of
https://github.com/stnolting/neorv32.git
synced 2025-04-24 06:07:52 -04:00
[sw] add CRC HAL
This commit is contained in:
parent
70fd575c05
commit
05f9f74e35
5 changed files with 202 additions and 0 deletions
|
@ -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"
|
||||
|
|
82
sw/lib/include/neorv32_crc.h
Normal file
82
sw/lib/include/neorv32_crc.h
Normal 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
|
|
@ -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
116
sw/lib/source/neorv32_crc.c
Normal 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;
|
||||
}
|
||||
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue