mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-08-19 09:38:32 -04:00
Add starting point for IGLOO2 RISV-V demo project.
This commit is contained in:
parent
483f4a8c4b
commit
9119e1e0e3
42 changed files with 13068 additions and 0 deletions
|
@ -0,0 +1,31 @@
|
|||
/*******************************************************************************
|
||||
* (c) Copyright 2007-2018 Microsemi SoC Products Group. All rights reserved.
|
||||
*
|
||||
* SVN $Revision: 9661 $
|
||||
* SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $
|
||||
*/
|
||||
#ifndef __CPU_TYPES_H
|
||||
#define __CPU_TYPES_H 1
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
*/
|
||||
typedef unsigned int size_t;
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* addr_t: address type.
|
||||
* Used to specify the address of peripherals present in the processor's memory
|
||||
* map.
|
||||
*/
|
||||
typedef unsigned int addr_t;
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* psr_t: processor state register.
|
||||
* Used by HAL_disable_interrupts() and HAL_restore_interrupts() to store the
|
||||
* processor's state between disabling and restoring interrupts.
|
||||
*/
|
||||
typedef unsigned int psr_t;
|
||||
|
||||
#endif /* __CPU_TYPES_H */
|
||||
|
207
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/hal/hal.h
Normal file
207
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/hal/hal.h
Normal file
|
@ -0,0 +1,207 @@
|
|||
/***************************************************************************//**
|
||||
* (c) Copyright 2007-2018 Microsemi SoC Products Group. All rights reserved.
|
||||
*
|
||||
* Hardware abstraction layer functions.
|
||||
*
|
||||
* SVN $Revision: 9661 $
|
||||
* SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $
|
||||
*/
|
||||
#ifndef HAL_H_
|
||||
#define HAL_H_
|
||||
|
||||
#include "cpu_types.h"
|
||||
#include "hw_reg_access.h"
|
||||
|
||||
/***************************************************************************//**
|
||||
* Enable all interrupts at the processor level.
|
||||
*/
|
||||
void HAL_enable_interrupts( void );
|
||||
|
||||
/***************************************************************************//**
|
||||
* Disable all interrupts at the processor core level.
|
||||
* Return the interrupts enable state before disabling occured so that it can
|
||||
* later be restored.
|
||||
*/
|
||||
psr_t HAL_disable_interrupts( void );
|
||||
|
||||
/***************************************************************************//**
|
||||
* Restore the interrupts enable state at the processor core level.
|
||||
* This function is normally passed the value returned from a previous call to
|
||||
* HAL_disable_interrupts().
|
||||
*/
|
||||
void HAL_restore_interrupts( psr_t saved_psr );
|
||||
|
||||
/***************************************************************************//**
|
||||
*/
|
||||
#define FIELD_OFFSET(FIELD_NAME) (FIELD_NAME##_OFFSET)
|
||||
#define FIELD_SHIFT(FIELD_NAME) (FIELD_NAME##_SHIFT)
|
||||
#define FIELD_MASK(FIELD_NAME) (FIELD_NAME##_MASK)
|
||||
|
||||
/***************************************************************************//**
|
||||
* The macro HAL_set_32bit_reg() allows writing a 32 bits wide register.
|
||||
*
|
||||
* BASE_ADDR: A variable of type addr_t specifying the base address of the
|
||||
* peripheral containing the register.
|
||||
* REG_NAME: A string identifying the register to write. These strings are
|
||||
* specified in a header file associated with the peripheral.
|
||||
* VALUE: A variable of type uint32_t containing the value to write.
|
||||
*/
|
||||
#define HAL_set_32bit_reg(BASE_ADDR, REG_NAME, VALUE) \
|
||||
(HW_set_32bit_reg( ((BASE_ADDR) + (REG_NAME##_REG_OFFSET)), (VALUE) ))
|
||||
|
||||
/***************************************************************************//**
|
||||
* The macro HAL_get_32bit_reg() is used to read the value of a 32 bits wide
|
||||
* register.
|
||||
*
|
||||
* BASE_ADDR: A variable of type addr_t specifying the base address of the
|
||||
* peripheral containing the register.
|
||||
* REG_NAME: A string identifying the register to read. These strings are
|
||||
* specified in a header file associated with the peripheral.
|
||||
* RETURN: This function-like macro returns a uint32_t value.
|
||||
*/
|
||||
#define HAL_get_32bit_reg(BASE_ADDR, REG_NAME) \
|
||||
(HW_get_32bit_reg( ((BASE_ADDR) + (REG_NAME##_REG_OFFSET)) ))
|
||||
|
||||
/***************************************************************************//**
|
||||
* The macro HAL_set_32bit_reg_field() is used to write a field within a
|
||||
* 32 bits wide register. The field written can be one or more bits.
|
||||
*
|
||||
* BASE_ADDR: A variable of type addr_t specifying the base address of the
|
||||
* peripheral containing the register.
|
||||
* FIELD_NAME: A string identifying the register field to write. These strings
|
||||
* are specified in a header file associated with the peripheral.
|
||||
* VALUE: A variable of type uint32_t containing the field value to write.
|
||||
*/
|
||||
#define HAL_set_32bit_reg_field(BASE_ADDR, FIELD_NAME, VALUE) \
|
||||
(HW_set_32bit_reg_field(\
|
||||
(BASE_ADDR) + FIELD_OFFSET(FIELD_NAME),\
|
||||
FIELD_SHIFT(FIELD_NAME),\
|
||||
FIELD_MASK(FIELD_NAME),\
|
||||
(VALUE)))
|
||||
|
||||
/***************************************************************************//**
|
||||
* The macro HAL_get_32bit_reg_field() is used to read a register field from
|
||||
* within a 32 bit wide peripheral register. The field can be one or more bits.
|
||||
*
|
||||
* BASE_ADDR: A variable of type addr_t specifying the base address of the
|
||||
* peripheral containing the register.
|
||||
* FIELD_NAME: A string identifying the register field to write. These strings
|
||||
* are specified in a header file associated with the peripheral.
|
||||
* RETURN: This function-like macro returns a uint32_t value.
|
||||
*/
|
||||
#define HAL_get_32bit_reg_field(BASE_ADDR, FIELD_NAME) \
|
||||
(HW_get_32bit_reg_field(\
|
||||
(BASE_ADDR) + FIELD_OFFSET(FIELD_NAME),\
|
||||
FIELD_SHIFT(FIELD_NAME),\
|
||||
FIELD_MASK(FIELD_NAME)))
|
||||
|
||||
/***************************************************************************//**
|
||||
* The macro HAL_set_16bit_reg() allows writing a 16 bits wide register.
|
||||
*
|
||||
* BASE_ADDR: A variable of type addr_t specifying the base address of the
|
||||
* peripheral containing the register.
|
||||
* REG_NAME: A string identifying the register to write. These strings are
|
||||
* specified in a header file associated with the peripheral.
|
||||
* VALUE: A variable of type uint_fast16_t containing the value to write.
|
||||
*/
|
||||
#define HAL_set_16bit_reg(BASE_ADDR, REG_NAME, VALUE) \
|
||||
(HW_set_16bit_reg( ((BASE_ADDR) + (REG_NAME##_REG_OFFSET)), (VALUE) ))
|
||||
|
||||
/***************************************************************************//**
|
||||
* The macro HAL_get_16bit_reg() is used to read the value of a 16 bits wide
|
||||
* register.
|
||||
*
|
||||
* BASE_ADDR: A variable of type addr_t specifying the base address of the
|
||||
* peripheral containing the register.
|
||||
* REG_NAME: A string identifying the register to read. These strings are
|
||||
* specified in a header file associated with the peripheral.
|
||||
* RETURN: This function-like macro returns a uint16_t value.
|
||||
*/
|
||||
#define HAL_get_16bit_reg(BASE_ADDR, REG_NAME) \
|
||||
(HW_get_16bit_reg( (BASE_ADDR) + (REG_NAME##_REG_OFFSET) ))
|
||||
|
||||
/***************************************************************************//**
|
||||
* The macro HAL_set_16bit_reg_field() is used to write a field within a
|
||||
* 16 bits wide register. The field written can be one or more bits.
|
||||
*
|
||||
* BASE_ADDR: A variable of type addr_t specifying the base address of the
|
||||
* peripheral containing the register.
|
||||
* FIELD_NAME: A string identifying the register field to write. These strings
|
||||
* are specified in a header file associated with the peripheral.
|
||||
* VALUE: A variable of type uint16_t containing the field value to write.
|
||||
*/
|
||||
#define HAL_set_16bit_reg_field(BASE_ADDR, FIELD_NAME, VALUE) \
|
||||
(HW_set_16bit_reg_field(\
|
||||
(BASE_ADDR) + FIELD_OFFSET(FIELD_NAME),\
|
||||
FIELD_SHIFT(FIELD_NAME),\
|
||||
FIELD_MASK(FIELD_NAME),\
|
||||
(VALUE)))
|
||||
|
||||
/***************************************************************************//**
|
||||
* The macro HAL_get_16bit_reg_field() is used to read a register field from
|
||||
* within a 8 bit wide peripheral register. The field can be one or more bits.
|
||||
*
|
||||
* BASE_ADDR: A variable of type addr_t specifying the base address of the
|
||||
* peripheral containing the register.
|
||||
* FIELD_NAME: A string identifying the register field to write. These strings
|
||||
* are specified in a header file associated with the peripheral.
|
||||
* RETURN: This function-like macro returns a uint16_t value.
|
||||
*/
|
||||
#define HAL_get_16bit_reg_field(BASE_ADDR, FIELD_NAME) \
|
||||
(HW_get_16bit_reg_field(\
|
||||
(BASE_ADDR) + FIELD_OFFSET(FIELD_NAME),\
|
||||
FIELD_SHIFT(FIELD_NAME),\
|
||||
FIELD_MASK(FIELD_NAME)))
|
||||
|
||||
/***************************************************************************//**
|
||||
* The macro HAL_set_8bit_reg() allows writing a 8 bits wide register.
|
||||
*
|
||||
* BASE_ADDR: A variable of type addr_t specifying the base address of the
|
||||
* peripheral containing the register.
|
||||
* REG_NAME: A string identifying the register to write. These strings are
|
||||
* specified in a header file associated with the peripheral.
|
||||
* VALUE: A variable of type uint_fast8_t containing the value to write.
|
||||
*/
|
||||
#define HAL_set_8bit_reg(BASE_ADDR, REG_NAME, VALUE) \
|
||||
(HW_set_8bit_reg( ((BASE_ADDR) + (REG_NAME##_REG_OFFSET)), (VALUE) ))
|
||||
|
||||
/***************************************************************************//**
|
||||
* The macro HAL_get_8bit_reg() is used to read the value of a 8 bits wide
|
||||
* register.
|
||||
*
|
||||
* BASE_ADDR: A variable of type addr_t specifying the base address of the
|
||||
* peripheral containing the register.
|
||||
* REG_NAME: A string identifying the register to read. These strings are
|
||||
* specified in a header file associated with the peripheral.
|
||||
* RETURN: This function-like macro returns a uint8_t value.
|
||||
*/
|
||||
#define HAL_get_8bit_reg(BASE_ADDR, REG_NAME) \
|
||||
(HW_get_8bit_reg( (BASE_ADDR) + (REG_NAME##_REG_OFFSET) ))
|
||||
|
||||
/***************************************************************************//**
|
||||
*/
|
||||
#define HAL_set_8bit_reg_field(BASE_ADDR, FIELD_NAME, VALUE) \
|
||||
(HW_set_8bit_reg_field(\
|
||||
(BASE_ADDR) + FIELD_OFFSET(FIELD_NAME),\
|
||||
FIELD_SHIFT(FIELD_NAME),\
|
||||
FIELD_MASK(FIELD_NAME),\
|
||||
(VALUE)))
|
||||
|
||||
/***************************************************************************//**
|
||||
* The macro HAL_get_8bit_reg_field() is used to read a register field from
|
||||
* within a 8 bit wide peripheral register. The field can be one or more bits.
|
||||
*
|
||||
* BASE_ADDR: A variable of type addr_t specifying the base address of the
|
||||
* peripheral containing the register.
|
||||
* FIELD_NAME: A string identifying the register field to write. These strings
|
||||
* are specified in a header file associated with the peripheral.
|
||||
* RETURN: This function-like macro returns a uint8_t value.
|
||||
*/
|
||||
#define HAL_get_8bit_reg_field(BASE_ADDR, FIELD_NAME) \
|
||||
(HW_get_8bit_reg_field(\
|
||||
(BASE_ADDR) + FIELD_OFFSET(FIELD_NAME),\
|
||||
FIELD_SHIFT(FIELD_NAME),\
|
||||
FIELD_MASK(FIELD_NAME)))
|
||||
|
||||
#endif /*HAL_H_*/
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
/*******************************************************************************
|
||||
* (c) Copyright 2008-2018 Microsemi SoC Products Group. All rights reserved.
|
||||
*
|
||||
* SVN $Revision: 9661 $
|
||||
* SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $
|
||||
*/
|
||||
#ifndef HAL_ASSERT_HEADER
|
||||
#define HAL_ASSERT_HEADER
|
||||
|
||||
#define NDEBUG 1
|
||||
|
||||
#if defined(NDEBUG)
|
||||
/***************************************************************************//**
|
||||
* HAL_ASSERT() is defined out when the NDEBUG symbol is used.
|
||||
******************************************************************************/
|
||||
#define HAL_ASSERT(CHECK)
|
||||
|
||||
#else
|
||||
/***************************************************************************//**
|
||||
* Default behaviour for HAL_ASSERT() macro:
|
||||
*------------------------------------------------------------------------------
|
||||
The behaviour is toolchain specific and project setting specific.
|
||||
******************************************************************************/
|
||||
#define HAL_ASSERT(CHECK) ASSERT(CHECK);
|
||||
|
||||
#endif /* NDEBUG */
|
||||
|
||||
#endif /* HAL_ASSERT_HEADER */
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
/***************************************************************************//**
|
||||
* (c) Copyright 2007-2018 Microsemi SoC Products Group. All rights reserved.
|
||||
*
|
||||
* Legacy interrupt control functions for the Microsemi driver library hardware
|
||||
* abstraction layer.
|
||||
*
|
||||
* SVN $Revision: 9661 $
|
||||
* SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $
|
||||
*/
|
||||
#include "hal.h"
|
||||
#include "riscv_hal.h"
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
*
|
||||
*/
|
||||
void HAL_enable_interrupts(void) {
|
||||
__enable_irq();
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
*
|
||||
*/
|
||||
psr_t HAL_disable_interrupts(void) {
|
||||
psr_t psr;
|
||||
psr = read_csr(mstatus);
|
||||
__disable_irq();
|
||||
return(psr);
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
*
|
||||
*/
|
||||
void HAL_restore_interrupts(psr_t saved_psr) {
|
||||
write_csr(mstatus, saved_psr);
|
||||
}
|
||||
|
|
@ -0,0 +1,97 @@
|
|||
/*******************************************************************************
|
||||
* (c) Copyright 2007-2018 Microsemi SoC Products Group. All rights reserved.
|
||||
*
|
||||
* Hardware registers access macros.
|
||||
*
|
||||
* THE MACROS DEFINED IN THIS FILE ARE DEPRECATED. DO NOT USED FOR NEW
|
||||
* DEVELOPMENT.
|
||||
*
|
||||
* These macros are used to access peripheral's registers. They allow access to
|
||||
* 8, 16 and 32 bit wide registers. All accesses to peripheral registers should
|
||||
* be done through these macros in order to ease porting across different
|
||||
* processors/bus architectures.
|
||||
*
|
||||
* Some of these macros also allow to access a specific register field.
|
||||
*
|
||||
* SVN $Revision: 9661 $
|
||||
* SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $
|
||||
*/
|
||||
#ifndef __HW_REGISTER_MACROS_H
|
||||
#define __HW_REGISTER_MACROS_H 1
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* 32 bits registers access:
|
||||
*/
|
||||
#define HW_get_uint32_reg(BASE_ADDR, REG_OFFSET) (*((uint32_t volatile *)(BASE_ADDR + REG_OFFSET##_REG_OFFSET)))
|
||||
|
||||
#define HW_set_uint32_reg(BASE_ADDR, REG_OFFSET, VALUE) (*((uint32_t volatile *)(BASE_ADDR + REG_OFFSET##_REG_OFFSET)) = (VALUE))
|
||||
|
||||
#define HW_set_uint32_reg_field(BASE_ADDR, FIELD, VALUE) \
|
||||
(*((uint32_t volatile *)(BASE_ADDR + FIELD##_OFFSET)) = \
|
||||
( \
|
||||
(uint32_t) \
|
||||
( \
|
||||
(*((uint32_t volatile *)(BASE_ADDR + FIELD##_OFFSET))) & ~FIELD##_MASK) | \
|
||||
(uint32_t)(((VALUE) << FIELD##_SHIFT) & FIELD##_MASK) \
|
||||
) \
|
||||
)
|
||||
|
||||
#define HW_get_uint32_reg_field( BASE_ADDR, FIELD ) \
|
||||
(( (*((uint32_t volatile *)(BASE_ADDR + FIELD##_OFFSET))) & FIELD##_MASK) >> FIELD##_SHIFT)
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* 32 bits memory access:
|
||||
*/
|
||||
#define HW_get_uint32(BASE_ADDR) (*((uint32_t volatile *)(BASE_ADDR)))
|
||||
|
||||
#define HW_set_uint32(BASE_ADDR, VALUE) (*((uint32_t volatile *)(BASE_ADDR)) = (VALUE))
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* 16 bits registers access:
|
||||
*/
|
||||
#define HW_get_uint16_reg(BASE_ADDR, REG_OFFSET) (*((uint16_t volatile *)(BASE_ADDR + REG_OFFSET##_REG_OFFSET)))
|
||||
|
||||
#define HW_set_uint16_reg(BASE_ADDR, REG_OFFSET, VALUE) (*((uint16_t volatile *)(BASE_ADDR + REG_OFFSET##_REG_OFFSET)) = (VALUE))
|
||||
|
||||
#define HW_set_uint16_reg_field(BASE_ADDR, FIELD, VALUE) \
|
||||
(*((uint16_t volatile *)(BASE_ADDR + FIELD##_OFFSET)) = \
|
||||
( \
|
||||
(uint16_t) \
|
||||
( \
|
||||
(*((uint16_t volatile *)(BASE_ADDR + FIELD##_OFFSET))) & ~FIELD##_MASK) | \
|
||||
(uint16_t)(((VALUE) << FIELD##_SHIFT) & FIELD##_MASK) \
|
||||
) \
|
||||
)
|
||||
|
||||
#define HW_get_uint16_reg_field( BASE_ADDR, FIELD ) \
|
||||
(( (*((uint16_t volatile *)(BASE_ADDR + FIELD##_OFFSET))) & FIELD##_MASK) >> FIELD##_SHIFT)
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* 8 bits registers access:
|
||||
*/
|
||||
#define HW_get_uint8_reg(BASE_ADDR, REG_OFFSET) (*((uint8_t volatile *)(BASE_ADDR + REG_OFFSET##_REG_OFFSET)))
|
||||
|
||||
#define HW_set_uint8_reg(BASE_ADDR, REG_OFFSET, VALUE) (*((uint8_t volatile *)(BASE_ADDR + REG_OFFSET##_REG_OFFSET)) = (VALUE))
|
||||
|
||||
#define HW_set_uint8_reg_field(BASE_ADDR, FIELD, VALUE) \
|
||||
(*((uint8_t volatile *)(BASE_ADDR + FIELD##_OFFSET)) = \
|
||||
( \
|
||||
(uint8_t) \
|
||||
( \
|
||||
(*((uint8_t volatile *)(BASE_ADDR + FIELD##_OFFSET))) & ~FIELD##_MASK) | \
|
||||
(uint8_t)(((VALUE) << FIELD##_SHIFT) & FIELD##_MASK) \
|
||||
) \
|
||||
)
|
||||
|
||||
#define HW_get_uint8_reg_field( BASE_ADDR, FIELD ) \
|
||||
(( (*((uint8_t volatile *)(BASE_ADDR + FIELD##_OFFSET))) & FIELD##_MASK) >> FIELD##_SHIFT)
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* 8 bits memory access:
|
||||
*/
|
||||
#define HW_get_uint8(BASE_ADDR) (*((uint8_t volatile *)(BASE_ADDR)))
|
||||
|
||||
#define HW_set_uint8(BASE_ADDR, VALUE) (*((uint8_t volatile *)(BASE_ADDR)) = (VALUE))
|
||||
|
||||
#endif /* __HW_REGISTER_MACROS_H */
|
||||
|
|
@ -0,0 +1,209 @@
|
|||
/***************************************************************************//**
|
||||
* (c) Copyright 2007-2018 Microsemi SoC Products Group. All rights reserved.
|
||||
*
|
||||
* Hardware registers access functions.
|
||||
* The implementation of these function is platform and toolchain specific.
|
||||
* The functions declared here are implemented using assembler as part of the
|
||||
* processor/toolchain specific HAL.
|
||||
*
|
||||
* SVN $Revision: 9661 $
|
||||
* SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $
|
||||
*/
|
||||
|
||||
.section .text
|
||||
.globl HW_set_32bit_reg
|
||||
.globl HW_get_32bit_reg
|
||||
.globl HW_set_32bit_reg_field
|
||||
.globl HW_get_32bit_reg_field
|
||||
.globl HW_set_16bit_reg
|
||||
.globl HW_get_16bit_reg
|
||||
.globl HW_set_16bit_reg_field
|
||||
.globl HW_get_16bit_reg_field
|
||||
.globl HW_set_8bit_reg
|
||||
.globl HW_get_8bit_reg
|
||||
.globl HW_set_8bit_reg_field
|
||||
.globl HW_get_8bit_reg_field
|
||||
|
||||
|
||||
/***************************************************************************//**
|
||||
* HW_set_32bit_reg is used to write the content of a 32 bits wide peripheral
|
||||
* register.
|
||||
*
|
||||
* a0: addr_t reg_addr
|
||||
* a1: uint32_t value
|
||||
*/
|
||||
HW_set_32bit_reg:
|
||||
sw a1, 0(a0)
|
||||
ret
|
||||
|
||||
/***************************************************************************//**
|
||||
* HW_get_32bit_reg is used to read the content of a 32 bits wide peripheral
|
||||
* register.
|
||||
*
|
||||
* R0: addr_t reg_addr
|
||||
* @return 32 bits value read from the peripheral register.
|
||||
*/
|
||||
HW_get_32bit_reg:
|
||||
lw a0, 0(a0)
|
||||
ret
|
||||
|
||||
/***************************************************************************//**
|
||||
* HW_set_32bit_reg_field is used to set the content of a field in a 32 bits
|
||||
* wide peripheral register.
|
||||
*
|
||||
* a0: addr_t reg_addr
|
||||
* a1: int_fast8_t shift
|
||||
* a2: uint32_t mask
|
||||
* a3: uint32_t value
|
||||
*/
|
||||
HW_set_32bit_reg_field:
|
||||
mv t3, a3
|
||||
sll t3, t3, a1
|
||||
and t3, t3, a2
|
||||
lw t1, 0(a0)
|
||||
mv t2, a2
|
||||
not t2, t2
|
||||
and t1, t1, t2
|
||||
or t1, t1, t3
|
||||
sw t1, 0(a0)
|
||||
ret
|
||||
|
||||
/***************************************************************************//**
|
||||
* HW_get_32bit_reg_field is used to read the content of a field out of a
|
||||
* 32 bits wide peripheral register.
|
||||
*
|
||||
* a0: addr_t reg_addr
|
||||
* a1: int_fast8_t shift
|
||||
* a2: uint32_t mask
|
||||
*
|
||||
* @return 32 bits value containing the register field value specified
|
||||
* as parameter.
|
||||
*/
|
||||
HW_get_32bit_reg_field:
|
||||
lw a0, 0(a0)
|
||||
and a0, a0, a2
|
||||
srl a0, a0, a1
|
||||
ret
|
||||
|
||||
/***************************************************************************//**
|
||||
* HW_set_16bit_reg is used to write the content of a 16 bits wide peripheral
|
||||
* register.
|
||||
*
|
||||
* a0: addr_t reg_addr
|
||||
* a1: uint_fast16_t value
|
||||
*/
|
||||
HW_set_16bit_reg:
|
||||
sh a1, 0(a0)
|
||||
ret
|
||||
|
||||
/***************************************************************************//**
|
||||
* HW_get_16bit_reg is used to read the content of a 16 bits wide peripheral
|
||||
* register.
|
||||
*
|
||||
* a0: addr_t reg_addr
|
||||
* @return 16 bits value read from the peripheral register.
|
||||
*/
|
||||
HW_get_16bit_reg:
|
||||
lh a0, (a0)
|
||||
ret
|
||||
|
||||
/***************************************************************************//**
|
||||
* HW_set_16bit_reg_field is used to set the content of a field in a 16 bits
|
||||
* wide peripheral register.
|
||||
*
|
||||
* a0: addr_t reg_addr
|
||||
* a1: int_fast8_t shift
|
||||
* a2: uint_fast16_t mask
|
||||
* a3: uint_fast16_t value
|
||||
* @param value Value to be written in the specified field.
|
||||
*/
|
||||
HW_set_16bit_reg_field:
|
||||
mv t3, a3
|
||||
sll t3, t3, a1
|
||||
and t3, t3, a2
|
||||
lh t1, 0(a0)
|
||||
mv t2, a2
|
||||
not t2, t2
|
||||
and t1, t1, t2
|
||||
or t1, t1, t3
|
||||
sh t1, 0(a0)
|
||||
ret
|
||||
|
||||
/***************************************************************************//**
|
||||
* HW_get_16bit_reg_field is used to read the content of a field from a
|
||||
* 16 bits wide peripheral register.
|
||||
*
|
||||
* a0: addr_t reg_addr
|
||||
* a1: int_fast8_t shift
|
||||
* a2: uint_fast16_t mask
|
||||
*
|
||||
* @return 16 bits value containing the register field value specified
|
||||
* as parameter.
|
||||
*/
|
||||
HW_get_16bit_reg_field:
|
||||
lh a0, 0(a0)
|
||||
and a0, a0, a2
|
||||
srl a0, a0, a1
|
||||
ret
|
||||
|
||||
/***************************************************************************//**
|
||||
* HW_set_8bit_reg is used to write the content of a 8 bits wide peripheral
|
||||
* register.
|
||||
*
|
||||
* a0: addr_t reg_addr
|
||||
* a1: uint_fast8_t value
|
||||
*/
|
||||
HW_set_8bit_reg:
|
||||
sb a1, 0(a0)
|
||||
ret
|
||||
|
||||
/***************************************************************************//**
|
||||
* HW_get_8bit_reg is used to read the content of a 8 bits wide peripheral
|
||||
* register.
|
||||
*
|
||||
* a0: addr_t reg_addr
|
||||
* @return 8 bits value read from the peripheral register.
|
||||
*/
|
||||
HW_get_8bit_reg:
|
||||
lb a0, 0(a0)
|
||||
ret
|
||||
|
||||
/***************************************************************************//**
|
||||
* HW_set_8bit_reg_field is used to set the content of a field in a 8 bits
|
||||
* wide peripheral register.
|
||||
*
|
||||
* a0: addr_t reg_addr,
|
||||
* a1: int_fast8_t shift
|
||||
* a2: uint_fast8_t mask
|
||||
* a3: uint_fast8_t value
|
||||
*/
|
||||
HW_set_8bit_reg_field:
|
||||
mv t3, a3
|
||||
sll t3, t3, a1
|
||||
and t3, t3, a2
|
||||
lb t1, 0(a0)
|
||||
mv t2, a2
|
||||
not t2, t2
|
||||
and t1, t1, t2
|
||||
or t1, t1, t3
|
||||
sb t1, 0(a0)
|
||||
ret
|
||||
|
||||
/***************************************************************************//**
|
||||
* HW_get_8bit_reg_field is used to read the content of a field from a
|
||||
* 8 bits wide peripheral register.
|
||||
*
|
||||
* a0: addr_t reg_addr
|
||||
* a1: int_fast8_t shift
|
||||
* a2: uint_fast8_t mask
|
||||
*
|
||||
* @return 8 bits value containing the register field value specified
|
||||
* as parameter.
|
||||
*/
|
||||
HW_get_8bit_reg_field:
|
||||
lb a0, 0(a0)
|
||||
and a0, a0, a2
|
||||
srl a0, a0, a1
|
||||
ret
|
||||
|
||||
.end
|
|
@ -0,0 +1,229 @@
|
|||
/***************************************************************************//**
|
||||
* (c) Copyright 2007-2018 Microsemi SoC Products Group. All rights reserved.
|
||||
*
|
||||
* Hardware registers access functions.
|
||||
* The implementation of these function is platform and toolchain specific.
|
||||
* The functions declared here are implemented using assembler as part of the
|
||||
* processor/toolchain specific HAL.
|
||||
*
|
||||
* SVN $Revision: 9661 $
|
||||
* SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $
|
||||
*/
|
||||
#ifndef HW_REG_ACCESS
|
||||
#define HW_REG_ACCESS
|
||||
|
||||
#include "cpu_types.h"
|
||||
/***************************************************************************//**
|
||||
* HW_set_32bit_reg is used to write the content of a 32 bits wide peripheral
|
||||
* register.
|
||||
*
|
||||
* @param reg_addr Address in the processor's memory map of the register to
|
||||
* write.
|
||||
* @param value Value to be written into the peripheral register.
|
||||
*/
|
||||
void
|
||||
HW_set_32bit_reg
|
||||
(
|
||||
addr_t reg_addr,
|
||||
uint32_t value
|
||||
);
|
||||
|
||||
/***************************************************************************//**
|
||||
* HW_get_32bit_reg is used to read the content of a 32 bits wide peripheral
|
||||
* register.
|
||||
*
|
||||
* @param reg_addr Address in the processor's memory map of the register to
|
||||
* read.
|
||||
* @return 32 bits value read from the peripheral register.
|
||||
*/
|
||||
uint32_t
|
||||
HW_get_32bit_reg
|
||||
(
|
||||
addr_t reg_addr
|
||||
);
|
||||
|
||||
/***************************************************************************//**
|
||||
* HW_set_32bit_reg_field is used to set the content of a field in a 32 bits
|
||||
* wide peripheral register.
|
||||
*
|
||||
* @param reg_addr Address in the processor's memory map of the register to
|
||||
* be written.
|
||||
* @param shift Bit offset of the register field to be read within the
|
||||
* register.
|
||||
* @param mask Bit mask to be applied to the raw register value to filter
|
||||
* out the other register fields values.
|
||||
* @param value Value to be written in the specified field.
|
||||
*/
|
||||
void
|
||||
HW_set_32bit_reg_field
|
||||
(
|
||||
addr_t reg_addr,
|
||||
int_fast8_t shift,
|
||||
uint32_t mask,
|
||||
uint32_t value
|
||||
);
|
||||
|
||||
/***************************************************************************//**
|
||||
* HW_get_32bit_reg_field is used to read the content of a field out of a
|
||||
* 32 bits wide peripheral register.
|
||||
*
|
||||
* @param reg_addr Address in the processor's memory map of the register to
|
||||
* read.
|
||||
* @param shift Bit offset of the register field to be written within the
|
||||
* register.
|
||||
* @param mask Bit mask to be applied to the raw register value to filter
|
||||
* out the other register fields values.
|
||||
*
|
||||
* @return 32 bits value containing the register field value specified
|
||||
* as parameter.
|
||||
*/
|
||||
uint32_t
|
||||
HW_get_32bit_reg_field
|
||||
(
|
||||
addr_t reg_addr,
|
||||
int_fast8_t shift,
|
||||
uint32_t mask
|
||||
);
|
||||
|
||||
/***************************************************************************//**
|
||||
* HW_set_16bit_reg is used to write the content of a 16 bits wide peripheral
|
||||
* register.
|
||||
*
|
||||
* @param reg_addr Address in the processor's memory map of the register to
|
||||
* write.
|
||||
* @param value Value to be written into the peripheral register.
|
||||
*/
|
||||
void
|
||||
HW_set_16bit_reg
|
||||
(
|
||||
addr_t reg_addr,
|
||||
uint_fast16_t value
|
||||
);
|
||||
|
||||
/***************************************************************************//**
|
||||
* HW_get_16bit_reg is used to read the content of a 16 bits wide peripheral
|
||||
* register.
|
||||
*
|
||||
* @param reg_addr Address in the processor's memory map of the register to
|
||||
* read.
|
||||
* @return 16 bits value read from the peripheral register.
|
||||
*/
|
||||
uint16_t
|
||||
HW_get_16bit_reg
|
||||
(
|
||||
addr_t reg_addr
|
||||
);
|
||||
|
||||
/***************************************************************************//**
|
||||
* HW_set_16bit_reg_field is used to set the content of a field in a 16 bits
|
||||
* wide peripheral register.
|
||||
*
|
||||
* @param reg_addr Address in the processor's memory map of the register to
|
||||
* be written.
|
||||
* @param shift Bit offset of the register field to be read within the
|
||||
* register.
|
||||
* @param mask Bit mask to be applied to the raw register value to filter
|
||||
* out the other register fields values.
|
||||
* @param value Value to be written in the specified field.
|
||||
*/
|
||||
void HW_set_16bit_reg_field
|
||||
(
|
||||
addr_t reg_addr,
|
||||
int_fast8_t shift,
|
||||
uint_fast16_t mask,
|
||||
uint_fast16_t value
|
||||
);
|
||||
|
||||
/***************************************************************************//**
|
||||
* HW_get_16bit_reg_field is used to read the content of a field from a
|
||||
* 16 bits wide peripheral register.
|
||||
*
|
||||
* @param reg_addr Address in the processor's memory map of the register to
|
||||
* read.
|
||||
* @param shift Bit offset of the register field to be written within the
|
||||
* register.
|
||||
* @param mask Bit mask to be applied to the raw register value to filter
|
||||
* out the other register fields values.
|
||||
*
|
||||
* @return 16 bits value containing the register field value specified
|
||||
* as parameter.
|
||||
*/
|
||||
uint16_t HW_get_16bit_reg_field
|
||||
(
|
||||
addr_t reg_addr,
|
||||
int_fast8_t shift,
|
||||
uint_fast16_t mask
|
||||
);
|
||||
|
||||
/***************************************************************************//**
|
||||
* HW_set_8bit_reg is used to write the content of a 8 bits wide peripheral
|
||||
* register.
|
||||
*
|
||||
* @param reg_addr Address in the processor's memory map of the register to
|
||||
* write.
|
||||
* @param value Value to be written into the peripheral register.
|
||||
*/
|
||||
void
|
||||
HW_set_8bit_reg
|
||||
(
|
||||
addr_t reg_addr,
|
||||
uint_fast8_t value
|
||||
);
|
||||
|
||||
/***************************************************************************//**
|
||||
* HW_get_8bit_reg is used to read the content of a 8 bits wide peripheral
|
||||
* register.
|
||||
*
|
||||
* @param reg_addr Address in the processor's memory map of the register to
|
||||
* read.
|
||||
* @return 8 bits value read from the peripheral register.
|
||||
*/
|
||||
uint8_t
|
||||
HW_get_8bit_reg
|
||||
(
|
||||
addr_t reg_addr
|
||||
);
|
||||
|
||||
/***************************************************************************//**
|
||||
* HW_set_8bit_reg_field is used to set the content of a field in a 8 bits
|
||||
* wide peripheral register.
|
||||
*
|
||||
* @param reg_addr Address in the processor's memory map of the register to
|
||||
* be written.
|
||||
* @param shift Bit offset of the register field to be read within the
|
||||
* register.
|
||||
* @param mask Bit mask to be applied to the raw register value to filter
|
||||
* out the other register fields values.
|
||||
* @param value Value to be written in the specified field.
|
||||
*/
|
||||
void HW_set_8bit_reg_field
|
||||
(
|
||||
addr_t reg_addr,
|
||||
int_fast8_t shift,
|
||||
uint_fast8_t mask,
|
||||
uint_fast8_t value
|
||||
);
|
||||
|
||||
/***************************************************************************//**
|
||||
* HW_get_8bit_reg_field is used to read the content of a field from a
|
||||
* 8 bits wide peripheral register.
|
||||
*
|
||||
* @param reg_addr Address in the processor's memory map of the register to
|
||||
* read.
|
||||
* @param shift Bit offset of the register field to be written within the
|
||||
* register.
|
||||
* @param mask Bit mask to be applied to the raw register value to filter
|
||||
* out the other register fields values.
|
||||
*
|
||||
* @return 8 bits value containing the register field value specified
|
||||
* as parameter.
|
||||
*/
|
||||
uint8_t HW_get_8bit_reg_field
|
||||
(
|
||||
addr_t reg_addr,
|
||||
int_fast8_t shift,
|
||||
uint_fast8_t mask
|
||||
);
|
||||
|
||||
#endif /* HW_REG_ACCESS */
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue