mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-12-09 21:25:15 -05:00
Added Safe interrupt demo (#685)
Add project to be used for safer interrupts
This commit is contained in:
parent
0390b0fc9b
commit
4c779335d6
77 changed files with 67427 additions and 0 deletions
|
|
@ -0,0 +1,61 @@
|
||||||
|
/*
|
||||||
|
* FreeRTOS V202107.00
|
||||||
|
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
* the Software without restriction, including without limitation the rights to
|
||||||
|
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
* subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* http://www.FreeRTOS.org
|
||||||
|
* http://aws.amazon.com/freertos
|
||||||
|
*
|
||||||
|
* 1 tab == 4 spaces!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* FreeRTOS includes. */
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include"queue.h"
|
||||||
|
|
||||||
|
/* Interface includes. */
|
||||||
|
#include "interrupt_handler_task.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Time to block while waiting for a interrupt request on the interrupt queue.
|
||||||
|
*/
|
||||||
|
#define USER_IRQ_RECEIVE_TIMEOUT ( pdMS_TO_TICKS( 1000 ) )
|
||||||
|
|
||||||
|
void vInterruptHandlerTask( void * pvParams )
|
||||||
|
{
|
||||||
|
BaseType_t xStatus;
|
||||||
|
UserIrqRequest_t xIrqRequest;
|
||||||
|
QueueHandle_t xInterruptQueueHandle = ( QueueHandle_t ) pvParams;
|
||||||
|
|
||||||
|
for( ;; )
|
||||||
|
{
|
||||||
|
xStatus = xQueueReceive( xInterruptQueueHandle,
|
||||||
|
&( xIrqRequest ),
|
||||||
|
USER_IRQ_RECEIVE_TIMEOUT );
|
||||||
|
if ( xStatus != pdTRUE )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If a valid IRQ request is received, invoke the corresponding handler
|
||||||
|
* function. */
|
||||||
|
xIrqRequest.xHandlerFunction( xIrqRequest.ulData );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
@ -0,0 +1,65 @@
|
||||||
|
/*
|
||||||
|
* FreeRTOS V202107.00
|
||||||
|
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
* the Software without restriction, including without limitation the rights to
|
||||||
|
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
* subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* http://www.FreeRTOS.org
|
||||||
|
* http://aws.amazon.com/freertos
|
||||||
|
*
|
||||||
|
* 1 tab == 4 spaces!
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef INTERRUPT_HANDLER_TASK_H_
|
||||||
|
#define INTERRUPT_HANDLER_H_
|
||||||
|
|
||||||
|
/* Standard includes. */
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* The interrupt handler task serves user IRQ requests sent to the interrupt
|
||||||
|
* queue. A user IRQ request comprises of the following 2 things:
|
||||||
|
*
|
||||||
|
* 1. Data.
|
||||||
|
* 2. IRQ handler function.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Type of the handler function for every user IRQ request.
|
||||||
|
*/
|
||||||
|
typedef void ( * UserIrqHandlerFunction_t )( uint32_t ulData );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Represents user IRQ requests sent to the interrupt queue.
|
||||||
|
*/
|
||||||
|
typedef struct UserIrqRequest
|
||||||
|
{
|
||||||
|
uint32_t ulData;
|
||||||
|
UserIrqHandlerFunction_t xHandlerFunction;
|
||||||
|
} UserIrqRequest_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function that implements the interrupt handler task.
|
||||||
|
*
|
||||||
|
* A FreeRTOS queue, known as interrupt queue, which holds UserIrqRequest_t items,
|
||||||
|
* is passed as the parameter to this task. The interrupt handler task reads the
|
||||||
|
* user IRQ requests from the interrupt queue and invokes the corresponding
|
||||||
|
* handlers.
|
||||||
|
*/
|
||||||
|
void vInterruptHandlerTask( void * pvParams );
|
||||||
|
|
||||||
|
#endif /* INTERRUPT_HANDLER_H_ */
|
||||||
|
|
@ -0,0 +1,125 @@
|
||||||
|
/*
|
||||||
|
* FreeRTOS V202107.00
|
||||||
|
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
* the Software without restriction, including without limitation the rights to
|
||||||
|
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
* subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* http://www.FreeRTOS.org
|
||||||
|
* http://aws.amazon.com/freertos
|
||||||
|
*
|
||||||
|
* 1 tab == 4 spaces!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* FreeRTOS includes. */
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "task.h"
|
||||||
|
|
||||||
|
/* BSP includes. */
|
||||||
|
#include "board.h"
|
||||||
|
|
||||||
|
/* Demo interface include. */
|
||||||
|
#include "led_demo.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents which LEDs are on or off. pdTRUE is on.
|
||||||
|
*/
|
||||||
|
typedef struct LedState
|
||||||
|
{
|
||||||
|
BaseType_t xRed;
|
||||||
|
BaseType_t xGreen;
|
||||||
|
BaseType_t xBlue;
|
||||||
|
} LedState_t;
|
||||||
|
|
||||||
|
/* The following needs to be placed in the shared memory as it is accessed in
|
||||||
|
* the button pressed IRQ handler which is unprivileged. */
|
||||||
|
static LedState_t xLedState __attribute__( ( section( "user_irq_shared_memory" ) ) );
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Turn on RGB Led according to the xLedState.
|
||||||
|
*/
|
||||||
|
static void prvTurnOnRgbLed( void );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Turn off RGB Led.
|
||||||
|
*/
|
||||||
|
static void prvTurnOffRgbLed( void );
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void prvTurnOnRgbLed( void )
|
||||||
|
{
|
||||||
|
/* Setting the GPIO pin activates the color in RGB LED. */
|
||||||
|
if( xLedState.xRed == pdTRUE )
|
||||||
|
{
|
||||||
|
GPIO_PortClear( GPIO, BOARD_LED_RED_GPIO_PORT, 1u << BOARD_LED_RED_GPIO_PIN );
|
||||||
|
}
|
||||||
|
if( xLedState.xGreen == pdTRUE )
|
||||||
|
{
|
||||||
|
GPIO_PortClear( GPIO, BOARD_LED_GREEN_GPIO_PORT, 1u << BOARD_LED_GREEN_GPIO_PIN );
|
||||||
|
}
|
||||||
|
if( xLedState.xBlue == pdTRUE )
|
||||||
|
{
|
||||||
|
GPIO_PortClear( GPIO, BOARD_LED_BLUE_GPIO_PORT, 1u << BOARD_LED_BLUE_GPIO_PIN );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void prvTurnOffRgbLed( void )
|
||||||
|
{
|
||||||
|
/* Setting the pins high turns off the LED. */
|
||||||
|
GPIO_PortSet( GPIO, BOARD_LED_RED_GPIO_PORT, 1u << BOARD_LED_RED_GPIO_PIN );
|
||||||
|
GPIO_PortSet( GPIO, BOARD_LED_GREEN_GPIO_PORT, 1u << BOARD_LED_GREEN_GPIO_PIN );
|
||||||
|
GPIO_PortSet( GPIO, BOARD_LED_BLUE_GPIO_PORT, 1u << BOARD_LED_BLUE_GPIO_PIN );
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vLedDemoTask( void * pvParams )
|
||||||
|
{
|
||||||
|
/* Set the initial LED state. */
|
||||||
|
xLedState.xRed = pdTRUE;
|
||||||
|
xLedState.xGreen = pdTRUE;
|
||||||
|
xLedState.xBlue = pdFALSE;
|
||||||
|
|
||||||
|
/* Silence compiler warnings about unused variables. */
|
||||||
|
( void ) pvParams;
|
||||||
|
|
||||||
|
for( ;; )
|
||||||
|
{
|
||||||
|
prvTurnOnRgbLed();
|
||||||
|
vTaskDelay( pdMS_TO_TICKS( 1000 ) );
|
||||||
|
|
||||||
|
prvTurnOffRgbLed();
|
||||||
|
vTaskDelay( pdMS_TO_TICKS( 1000 ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vButtonPressedIRQHandler( uint32_t ulData )
|
||||||
|
{
|
||||||
|
BaseType_t xPreviousRed;
|
||||||
|
|
||||||
|
/* Data is not used. */
|
||||||
|
( void ) ulData;
|
||||||
|
|
||||||
|
/* Shift to the next color. */
|
||||||
|
xPreviousRed = xLedState.xRed;
|
||||||
|
xLedState.xRed = xLedState.xGreen;
|
||||||
|
xLedState.xGreen = xLedState.xBlue;
|
||||||
|
xLedState.xBlue = xPreviousRed;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* FreeRTOS V202107.00
|
||||||
|
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
* the Software without restriction, including without limitation the rights to
|
||||||
|
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
* subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* http://www.FreeRTOS.org
|
||||||
|
* http://aws.amazon.com/freertos
|
||||||
|
*
|
||||||
|
* 1 tab == 4 spaces!
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LED_DEMO_H_
|
||||||
|
#define LED_DEMO_H_
|
||||||
|
|
||||||
|
/* Standard includes. */
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The function that implements the LED demo task.
|
||||||
|
*
|
||||||
|
* It periodically toggles the on board RGB led. The color of the LED changes
|
||||||
|
* whenever the user presses the USER button on the NXP LPC55S69-EVK board.
|
||||||
|
*/
|
||||||
|
void vLedDemoTask( void * pvParams );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handler for the button pressed IRQ.
|
||||||
|
*
|
||||||
|
* It changes the color of the LED.
|
||||||
|
*
|
||||||
|
* @param [in] ulData Not used.
|
||||||
|
*/
|
||||||
|
void vButtonPressedIRQHandler( uint32_t ulData );
|
||||||
|
|
||||||
|
#endif /* LED_DEMO_H_ */
|
||||||
|
|
@ -0,0 +1,393 @@
|
||||||
|
/*
|
||||||
|
* FreeRTOS V202107.00
|
||||||
|
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
* the Software without restriction, including without limitation the rights to
|
||||||
|
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
* subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* http://www.FreeRTOS.org
|
||||||
|
* http://aws.amazon.com/freertos
|
||||||
|
*
|
||||||
|
* 1 tab == 4 spaces!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This demo demonstrates the best practice of deferring majority of the
|
||||||
|
* interrupt processing work from IRQ handlers to an unprivileged task. IRQ
|
||||||
|
* handlers execute in privileged mode and therefore, have access to all the
|
||||||
|
* memories. Keeping the IRQ handlers small and deferring most of the work to
|
||||||
|
* unprivileged task provides better security.
|
||||||
|
*
|
||||||
|
* This demo creates a queue, known as interrupt queue. IRQ handlers post
|
||||||
|
* requests to this queue which are later served by an unprivileged interrupt
|
||||||
|
* handler task.
|
||||||
|
*
|
||||||
|
* +-------------------------+
|
||||||
|
* +--------->+ Interrupt Queue +------------+
|
||||||
|
* | +-------------------------+ |
|
||||||
|
* | | Fetch and Serve
|
||||||
|
* Post | |
|
||||||
|
* | v
|
||||||
|
* | +------+--------+
|
||||||
|
* +------+--------+ | |
|
||||||
|
* | IRQ Handler | | |
|
||||||
|
* | (Privileged) | | Interrupt |
|
||||||
|
* +---------------+ | Handler |
|
||||||
|
* | Task |
|
||||||
|
* | (Unprivileged)|
|
||||||
|
* | |
|
||||||
|
* | |
|
||||||
|
* +---------------+
|
||||||
|
*
|
||||||
|
* This demo show-cases the following 2 demos:
|
||||||
|
* 1. LED Demo - The LED demo creates a task which periodically toggles the on
|
||||||
|
* board RGB LED. Whenever user presses the USER button, the
|
||||||
|
* user button pressed IRQ handler changes the color of the LED.
|
||||||
|
* The user button pressed IRQ handler posts a request to the
|
||||||
|
* interrupt queue and task of changing the LED color is deferred
|
||||||
|
* to the unprivileged handler.
|
||||||
|
* 2. UART Demo - The UART demo creates a task which prints a command menu on
|
||||||
|
* the serial console and then waits for the user input. Whenever
|
||||||
|
* user enters any input on the serial console to run a command,
|
||||||
|
* the UART received IRQ handler handles it and prints the
|
||||||
|
* appropriate response on the serial console. The UART received
|
||||||
|
* IRQ handler posts a request to the interrupt queue and task of
|
||||||
|
* handling the command and providing the response is deferred
|
||||||
|
* to the unprivileged handler.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* FreeRTOS kernel includes. */
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "task.h"
|
||||||
|
#include "queue.h"
|
||||||
|
|
||||||
|
/* BSP includes. */
|
||||||
|
#include "board.h"
|
||||||
|
#include "clock_config.h"
|
||||||
|
#include "fsl_debug_console.h"
|
||||||
|
#include "fsl_device_registers.h"
|
||||||
|
#include "fsl_inputmux.h"
|
||||||
|
#include "fsl_power.h"
|
||||||
|
#include "fsl_pint.h"
|
||||||
|
#include "fsl_usart.h"
|
||||||
|
#include "pin_mux.h"
|
||||||
|
|
||||||
|
/* Demo includes. */
|
||||||
|
#include "led_demo.h"
|
||||||
|
#include "uart_demo.h"
|
||||||
|
#include "interrupt_handler_task.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Length of the interrupt queue.
|
||||||
|
*/
|
||||||
|
#define USER_IRQ_QUEUE_LEN 8
|
||||||
|
#define USER_IRQ_QUEUE_BUF_SIZE ( sizeof( UserIrqRequest_t ) * USER_IRQ_QUEUE_LEN )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief UART_MEM_START to (UART_MEM_START + UART_MEM_LEN) cover the range
|
||||||
|
* used by USART_WriteBlocking().
|
||||||
|
*/
|
||||||
|
#define UART_MEM_START ( USART0 )
|
||||||
|
#define UART_MEM_LEN ( 3648 )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief GPIO_MEM_START to (GPIO_MEM_START + GPIO_MEM_LEN) covers the range
|
||||||
|
* used for setting and clearing GPIO pins.
|
||||||
|
*/
|
||||||
|
#define GPIO_MEM_START ( 0x4008E200u )
|
||||||
|
#define GPIO_MEM_LEN ( 256 )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle and storage for the interrupt queue shared between IRQ handlers
|
||||||
|
* and the interrupt handler task.
|
||||||
|
*/
|
||||||
|
static QueueHandle_t xUserIrqQueueHandle;
|
||||||
|
static StaticQueue_t xStaticQueue;
|
||||||
|
static uint8_t ucQueueBuffer[ USER_IRQ_QUEUE_BUF_SIZE ];
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialize hardware.
|
||||||
|
*/
|
||||||
|
static void prvInitializeHardware( void );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialize user button pressed interrupt.
|
||||||
|
*/
|
||||||
|
static void prvInitializeUserButtonInterrupt( void );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialize UART received interrupt.
|
||||||
|
*/
|
||||||
|
static void prvInitializeUartReceivedInterrupt( void );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handler for pin interrupt when USER button is pressed.
|
||||||
|
*
|
||||||
|
* The handler enqueues a user IRQ request for the IRQ to be further processed
|
||||||
|
* in the unprivileged interrupt handler.
|
||||||
|
*/
|
||||||
|
static void userButtonPressedHandler( pint_pin_int_t xInterruptType, uint32_t ulMatchStatus );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handler for UART interrupt when UART data is received.
|
||||||
|
*
|
||||||
|
* The handler enqueues a user IRQ request for the IRQ to be further processed
|
||||||
|
* in the unprivileged interrupt handler.
|
||||||
|
*/
|
||||||
|
void FLEXCOMM0_IRQHandler( void );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Create the demo tasks.
|
||||||
|
*/
|
||||||
|
static void prvCreateDemoTasks( void );
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void prvInitializeHardware( void )
|
||||||
|
{
|
||||||
|
/* Set BOD VBAT level to 1.65V. */
|
||||||
|
POWER_SetBodVbatLevel( kPOWER_BodVbatLevel1650mv, kPOWER_BodHystLevel50mv, false );
|
||||||
|
|
||||||
|
/* Attach main clock divide to FLEXCOMM0 (debug console). */
|
||||||
|
CLOCK_AttachClk( BOARD_DEBUG_UART_CLK_ATTACH );
|
||||||
|
|
||||||
|
/* Board initialization. */
|
||||||
|
BOARD_InitBootPins();
|
||||||
|
BOARD_InitBootClocks();
|
||||||
|
BOARD_InitDebugConsole();
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void prvInitializeUserButtonInterrupt( void )
|
||||||
|
{
|
||||||
|
/* Connect trigger sources to PINT. */
|
||||||
|
INPUTMUX_Init( INPUTMUX );
|
||||||
|
INPUTMUX_AttachSignal( INPUTMUX, kPINT_PinInt0, kINPUTMUX_GpioPort1Pin9ToPintsel );
|
||||||
|
|
||||||
|
/* Turnoff clock to inputmux to save power. Clock is only needed to make changes. */
|
||||||
|
INPUTMUX_Deinit( INPUTMUX );
|
||||||
|
|
||||||
|
/* Initialize PINT. */
|
||||||
|
PINT_Init( PINT );
|
||||||
|
|
||||||
|
/* Setup Pin Interrupt 0 for rising edge. */
|
||||||
|
PINT_PinInterruptConfig( PINT, kPINT_PinInt0, kPINT_PinIntEnableRiseEdge, userButtonPressedHandler );
|
||||||
|
|
||||||
|
/* Enable callback for PINT0 by Index. */
|
||||||
|
PINT_EnableCallbackByIndex( PINT, kPINT_PinInt0 );
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void prvInitializeUartReceivedInterrupt( void )
|
||||||
|
{
|
||||||
|
usart_config_t config;
|
||||||
|
USART_GetDefaultConfig( &( config ) );
|
||||||
|
config.enableTx = true;
|
||||||
|
config.enableRx = true;
|
||||||
|
USART_Init( USART0, &( config ), CLOCK_GetFlexCommClkFreq( 0U ) );
|
||||||
|
|
||||||
|
/* Enable RX interrupt. */
|
||||||
|
USART_EnableInterrupts( USART0, kUSART_RxLevelInterruptEnable | kUSART_RxErrorInterruptEnable );
|
||||||
|
EnableIRQ( FLEXCOMM0_IRQn );
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void userButtonPressedHandler( pint_pin_int_t xInterruptType, uint32_t ulMatchStatus )
|
||||||
|
{
|
||||||
|
UserIrqRequest_t xIrqRequest;
|
||||||
|
|
||||||
|
/* Silence warnings about unused variables. */
|
||||||
|
( void ) xInterruptType;
|
||||||
|
( void ) ulMatchStatus;
|
||||||
|
|
||||||
|
/* Enqueue a request to user IRQ queue to be processed in the unprivileged
|
||||||
|
* interrupt handler. */
|
||||||
|
xIrqRequest.xHandlerFunction = vButtonPressedIRQHandler;
|
||||||
|
xIrqRequest.ulData = 0; /* Not used. */
|
||||||
|
xQueueSendFromISR( xUserIrqQueueHandle, &( xIrqRequest ), NULL );
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Override weak definition of FLEXCOMM0_IRQHandler */
|
||||||
|
void FLEXCOMM0_IRQHandler(void)
|
||||||
|
{
|
||||||
|
UserIrqRequest_t xIrqRequest;
|
||||||
|
|
||||||
|
/* If new data arrived. */
|
||||||
|
if( ( kUSART_RxFifoNotEmptyFlag | kUSART_RxError ) & USART_GetStatusFlags( USART0 ) )
|
||||||
|
{
|
||||||
|
/* Enqueue a request to user IRQ queue to be processed in the unprivileged
|
||||||
|
* interrupt handler. */
|
||||||
|
xIrqRequest.xHandlerFunction = vUartDataReceivedIRQHandler;
|
||||||
|
xIrqRequest.ulData = ( uint32_t ) USART_ReadByte( USART0 );
|
||||||
|
xQueueSendFromISR( xUserIrqQueueHandle, &( xIrqRequest ), NULL );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void prvCreateDemoTasks( void )
|
||||||
|
{
|
||||||
|
static StackType_t xInterruptHandlerTaskStack[ configMINIMAL_STACK_SIZE ] __attribute__( ( aligned( 32 ) ) );
|
||||||
|
static StackType_t xLedDemoTaskStack[ configMINIMAL_STACK_SIZE ] __attribute__( ( aligned( 32 ) ) );
|
||||||
|
static StackType_t xUartDemoTaskStack[ configMINIMAL_STACK_SIZE ] __attribute__( ( aligned( 32 ) ) );
|
||||||
|
|
||||||
|
extern TaskHandle_t xUartDemoTaskHandle;
|
||||||
|
extern uint32_t __user_irq_shared_memory_start__[];
|
||||||
|
extern uint32_t __user_irq_shared_memory_end__[];
|
||||||
|
uint32_t ulSharedMemoryLength = ( uint32_t )__user_irq_shared_memory_end__ - ( uint32_t )__user_irq_shared_memory_start__ + 1;
|
||||||
|
|
||||||
|
/* The interrupt handler task needs access to UART memory region too as we
|
||||||
|
* write the response to UART from the interrupt handler in the UART demo. */
|
||||||
|
TaskParameters_t xInterruptHandlerTaskParameters =
|
||||||
|
{
|
||||||
|
.pvTaskCode = vInterruptHandlerTask,
|
||||||
|
.pcName = "InterruptHandlerTask",
|
||||||
|
.usStackDepth = configMINIMAL_STACK_SIZE,
|
||||||
|
.pvParameters = xUserIrqQueueHandle,
|
||||||
|
.uxPriority = configMAX_PRIORITIES - 1, /* Run the interrupt handler task at the highest priority. */
|
||||||
|
.puxStackBuffer = xInterruptHandlerTaskStack,
|
||||||
|
.xRegions =
|
||||||
|
{
|
||||||
|
{ __user_irq_shared_memory_start__, ulSharedMemoryLength, tskMPU_REGION_READ_WRITE | tskMPU_REGION_EXECUTE_NEVER },
|
||||||
|
{ ( void * ) UART_MEM_START, UART_MEM_LEN, tskMPU_REGION_READ_WRITE | tskMPU_REGION_EXECUTE_NEVER },
|
||||||
|
{ 0, 0, 0 },
|
||||||
|
}
|
||||||
|
};
|
||||||
|
TaskParameters_t xLedDemoTaskParameters =
|
||||||
|
{
|
||||||
|
.pvTaskCode = vLedDemoTask,
|
||||||
|
.pcName = "LedDemoTask",
|
||||||
|
.usStackDepth = configMINIMAL_STACK_SIZE,
|
||||||
|
.pvParameters = NULL,
|
||||||
|
.uxPriority = tskIDLE_PRIORITY,
|
||||||
|
.puxStackBuffer = xLedDemoTaskStack,
|
||||||
|
.xRegions =
|
||||||
|
{
|
||||||
|
{ __user_irq_shared_memory_start__, ulSharedMemoryLength, tskMPU_REGION_READ_WRITE | tskMPU_REGION_EXECUTE_NEVER },
|
||||||
|
{ ( void * ) GPIO_MEM_START, GPIO_MEM_LEN, tskMPU_REGION_READ_WRITE | tskMPU_REGION_EXECUTE_NEVER },
|
||||||
|
{ 0, 0, 0 },
|
||||||
|
}
|
||||||
|
};
|
||||||
|
TaskParameters_t xUartDemoTaskParameters =
|
||||||
|
{
|
||||||
|
.pvTaskCode = vUartDemoTask,
|
||||||
|
.pcName = "UartDemoTask",
|
||||||
|
.usStackDepth = configMINIMAL_STACK_SIZE,
|
||||||
|
.pvParameters = NULL,
|
||||||
|
.uxPriority = tskIDLE_PRIORITY,
|
||||||
|
.puxStackBuffer = xUartDemoTaskStack,
|
||||||
|
.xRegions =
|
||||||
|
{
|
||||||
|
{ __user_irq_shared_memory_start__, ulSharedMemoryLength, tskMPU_REGION_READ_WRITE | tskMPU_REGION_EXECUTE_NEVER },
|
||||||
|
{ ( void * ) UART_MEM_START, UART_MEM_LEN, tskMPU_REGION_READ_WRITE | tskMPU_REGION_EXECUTE_NEVER },
|
||||||
|
{ 0, 0, 0 },
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
xTaskCreateRestricted( &( xInterruptHandlerTaskParameters ), NULL );
|
||||||
|
xTaskCreateRestricted( &( xLedDemoTaskParameters ), NULL );
|
||||||
|
xTaskCreateRestricted( &( xUartDemoTaskParameters ), &( xUartDemoTaskHandle ) );
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Entry point.
|
||||||
|
*/
|
||||||
|
int main( void )
|
||||||
|
{
|
||||||
|
/* Initialize board hardware. */
|
||||||
|
prvInitializeHardware();
|
||||||
|
|
||||||
|
/* Create the interrupt queue for deferring work from ISRs to the
|
||||||
|
* unprivileged interrupt handler task. */
|
||||||
|
xUserIrqQueueHandle = xQueueCreateStatic( USER_IRQ_QUEUE_LEN,
|
||||||
|
sizeof( UserIrqRequest_t ),
|
||||||
|
ucQueueBuffer,
|
||||||
|
&( xStaticQueue ) );
|
||||||
|
|
||||||
|
prvCreateDemoTasks();
|
||||||
|
prvInitializeUserButtonInterrupt();
|
||||||
|
prvInitializeUartReceivedInterrupt();
|
||||||
|
|
||||||
|
vTaskStartScheduler();
|
||||||
|
|
||||||
|
/* Should never reach here. */
|
||||||
|
for( ; ; );
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Stack overflow hook. */
|
||||||
|
void vApplicationStackOverflowHook( TaskHandle_t xTask, char *pcTaskName )
|
||||||
|
{
|
||||||
|
/* Force an assert. */
|
||||||
|
configASSERT( pcTaskName == 0 );
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* configUSE_STATIC_ALLOCATION is set to 1, so the application must provide an
|
||||||
|
* implementation of vApplicationGetIdleTaskMemory() to provide the memory that
|
||||||
|
* is used by the Idle task. */
|
||||||
|
void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,
|
||||||
|
StackType_t ** ppxIdleTaskStackBuffer,
|
||||||
|
uint32_t * pulIdleTaskStackSize )
|
||||||
|
{
|
||||||
|
/* If the buffers to be provided to the Idle task are declared inside this
|
||||||
|
* function then they must be declared static - otherwise they will be
|
||||||
|
* allocated on the stack and so not exists after this function exits. */
|
||||||
|
static StaticTask_t xIdleTaskTCB;
|
||||||
|
static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ] __attribute__( ( aligned( 32 ) ) );
|
||||||
|
|
||||||
|
/* Pass out a pointer to the StaticTask_t structure in which the Idle
|
||||||
|
* task's state will be stored. */
|
||||||
|
*ppxIdleTaskTCBBuffer = &xIdleTaskTCB;
|
||||||
|
|
||||||
|
/* Pass out the array that will be used as the Idle task's stack. */
|
||||||
|
*ppxIdleTaskStackBuffer = uxIdleTaskStack;
|
||||||
|
|
||||||
|
/* Pass out the size of the array pointed to by *ppxIdleTaskStackBuffer.
|
||||||
|
* Note that, as the array is necessarily of type StackType_t,
|
||||||
|
* configMINIMAL_STACK_SIZE is specified in words, not bytes. */
|
||||||
|
*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* configUSE_STATIC_ALLOCATION and configUSE_TIMERS are both set to 1, so the
|
||||||
|
* application must provide an implementation of vApplicationGetTimerTaskMemory()
|
||||||
|
* to provide the memory that is used by the Timer service task. */
|
||||||
|
void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer,
|
||||||
|
StackType_t ** ppxTimerTaskStackBuffer,
|
||||||
|
uint32_t * pulTimerTaskStackSize )
|
||||||
|
{
|
||||||
|
/* If the buffers to be provided to the Timer task are declared inside this
|
||||||
|
* function then they must be declared static - otherwise they will be
|
||||||
|
* allocated on the stack and so not exists after this function exits. */
|
||||||
|
static StaticTask_t xTimerTaskTCB;
|
||||||
|
static StackType_t uxTimerTaskStack[ configTIMER_TASK_STACK_DEPTH ] __attribute__( ( aligned( 32 ) ) );
|
||||||
|
|
||||||
|
/* Pass out a pointer to the StaticTask_t structure in which the Timer
|
||||||
|
* task's state will be stored. */
|
||||||
|
*ppxTimerTaskTCBBuffer = &xTimerTaskTCB;
|
||||||
|
|
||||||
|
/* Pass out the array that will be used as the Timer task's stack. */
|
||||||
|
*ppxTimerTaskStackBuffer = uxTimerTaskStack;
|
||||||
|
|
||||||
|
/* Pass out the size of the array pointed to by *ppxTimerTaskStackBuffer.
|
||||||
|
* Note that, as the array is necessarily of type StackType_t,
|
||||||
|
* configTIMER_TASK_STACK_DEPTH is specified in words, not bytes. */
|
||||||
|
*pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
@ -0,0 +1,110 @@
|
||||||
|
/*
|
||||||
|
* FreeRTOS V202107.00
|
||||||
|
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
* the Software without restriction, including without limitation the rights to
|
||||||
|
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
* subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* http://www.FreeRTOS.org
|
||||||
|
* http://aws.amazon.com/freertos
|
||||||
|
*
|
||||||
|
* 1 tab == 4 spaces!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Standard includes. */
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
/* FreeRTOS includes. */
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "task.h"
|
||||||
|
|
||||||
|
#include "board.h"
|
||||||
|
#include "fsl_usart.h"
|
||||||
|
|
||||||
|
/* Demo interface include. */
|
||||||
|
#include "uart_demo.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The command menu presented to the user.
|
||||||
|
*/
|
||||||
|
#define UART_COMMAND_MENU "\r\nChoose one of the following:\r\n" \
|
||||||
|
"1. Get current tick count.\r\n" \
|
||||||
|
"2. Get number of tasks.\r\n"
|
||||||
|
#define UART_COMMAND_MENU_LEN ( sizeof( UART_COMMAND_MENU ) - 1 )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Prompt for the user input.
|
||||||
|
*/
|
||||||
|
#define UART_PROMPT_STR "> "
|
||||||
|
#define UART_PROMPT_STR_LEN ( sizeof( UART_PROMPT_STR ) - 1 )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Valid commands entered by the user.
|
||||||
|
*/
|
||||||
|
#define GET_TICK_COUNT_COMMAND 49 /* ASCII code for char '1'. */
|
||||||
|
#define GET_NUM_TASKS_COMMAND 50 /* ASCII code for char '2'. */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Length of the buffer used for the response.
|
||||||
|
*/
|
||||||
|
#define UART_RESPONSE_BUF_LEN ( 32 )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* The following needs to be placed in the shared memory as it is accessed in
|
||||||
|
* the UART received IRQ handler which is unprivileged. */
|
||||||
|
TaskHandle_t xUartDemoTaskHandle __attribute__( ( section( "user_irq_shared_memory" ) ) );
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vUartDemoTask( void * pvParams )
|
||||||
|
{
|
||||||
|
/* Silence compiler warnings about unused variables. */
|
||||||
|
( void ) pvParams;
|
||||||
|
|
||||||
|
for( ;; )
|
||||||
|
{
|
||||||
|
USART_WriteBlocking( USART0, UART_COMMAND_MENU, UART_COMMAND_MENU_LEN );
|
||||||
|
USART_WriteBlocking( USART0, UART_PROMPT_STR, UART_PROMPT_STR_LEN );
|
||||||
|
|
||||||
|
ulTaskNotifyTake( pdFALSE, portMAX_DELAY );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vUartDataReceivedIRQHandler( uint32_t ulData )
|
||||||
|
{
|
||||||
|
char response[ UART_RESPONSE_BUF_LEN ];
|
||||||
|
|
||||||
|
if( ulData == GET_TICK_COUNT_COMMAND )
|
||||||
|
{
|
||||||
|
TickType_t xTickCount = xTaskGetTickCount();
|
||||||
|
snprintf( response, sizeof( response ), "%c\r\nTick Count: %u\r\n", ( char ) ulData, xTickCount );
|
||||||
|
}
|
||||||
|
else if( ulData == GET_NUM_TASKS_COMMAND )
|
||||||
|
{
|
||||||
|
UBaseType_t xTaskCount = uxTaskGetNumberOfTasks();
|
||||||
|
snprintf( response, sizeof( response ), "%c\r\nTask Count: %u\r\n", ( char ) ulData, xTaskCount );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
snprintf( response, sizeof( response ), "\r\nInvalid command: %c.\r\n", ( char ) ulData );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print the response and unblock the UART demo task. */
|
||||||
|
USART_WriteBlocking( USART0, response, strlen( response ) );
|
||||||
|
xTaskNotifyGive( xUartDemoTaskHandle );
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* FreeRTOS V202107.00
|
||||||
|
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
* the Software without restriction, including without limitation the rights to
|
||||||
|
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
* subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* http://www.FreeRTOS.org
|
||||||
|
* http://aws.amazon.com/freertos
|
||||||
|
*
|
||||||
|
* 1 tab == 4 spaces!
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef UART_DEMO_H_
|
||||||
|
#define UART_DEMO_H_
|
||||||
|
|
||||||
|
/* Standard includes. */
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The function that implements the UART demo.
|
||||||
|
*
|
||||||
|
* It prints a command menu on the serial console and then waits for a task
|
||||||
|
* notification. Whenever user enters any input on the serial console to run a
|
||||||
|
* command, the UART received IRQ handler handles it and prints the appropriate
|
||||||
|
* response on the serial console. The IRQ handler then unblocks the UART task
|
||||||
|
* using task notification.
|
||||||
|
*/
|
||||||
|
void vUartDemoTask( void * pvParams );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handler for the UART received IRQ.
|
||||||
|
*
|
||||||
|
* @param [in] ulData Data entered by the user.
|
||||||
|
*/
|
||||||
|
void vUartDataReceivedIRQHandler( uint32_t ulData );
|
||||||
|
|
||||||
|
#endif /* UART_DEMO_H_ */
|
||||||
|
|
@ -0,0 +1,173 @@
|
||||||
|
/*
|
||||||
|
* FreeRTOS V202107.00
|
||||||
|
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
* the Software without restriction, including without limitation the rights to
|
||||||
|
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
* subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* http://www.FreeRTOS.org
|
||||||
|
* http://aws.amazon.com/freertos
|
||||||
|
*
|
||||||
|
* 1 tab == 4 spaces!
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FREERTOS_CONFIG_H
|
||||||
|
#define FREERTOS_CONFIG_H
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------
|
||||||
|
* Application specific definitions.
|
||||||
|
*
|
||||||
|
* These definitions should be adjusted for your particular hardware and
|
||||||
|
* application requirements.
|
||||||
|
*
|
||||||
|
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
|
||||||
|
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
|
||||||
|
*
|
||||||
|
* See http://www.freertos.org/a00110.html.
|
||||||
|
*----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define configUSE_PREEMPTION 1
|
||||||
|
#define configUSE_TICKLESS_IDLE 0
|
||||||
|
#define configCPU_CLOCK_HZ ( SystemCoreClock )
|
||||||
|
#define configTICK_RATE_HZ ( ( TickType_t ) 200 )
|
||||||
|
#define configMAX_PRIORITIES 5
|
||||||
|
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 )
|
||||||
|
#define configMAX_TASK_NAME_LEN 20
|
||||||
|
#define configUSE_16_BIT_TICKS 0
|
||||||
|
#define configIDLE_SHOULD_YIELD 1
|
||||||
|
#define configUSE_TASK_NOTIFICATIONS 1
|
||||||
|
#define configUSE_MUTEXES 1
|
||||||
|
#define configUSE_RECURSIVE_MUTEXES 1
|
||||||
|
#define configUSE_COUNTING_SEMAPHORES 1
|
||||||
|
#define configUSE_ALTERNATIVE_API 0 /* Deprecated! */
|
||||||
|
#define configQUEUE_REGISTRY_SIZE 8
|
||||||
|
#define configUSE_QUEUE_SETS 0
|
||||||
|
#define configUSE_TIME_SLICING 0
|
||||||
|
#define configUSE_NEWLIB_REENTRANT 0
|
||||||
|
#define configENABLE_BACKWARD_COMPATIBILITY 0
|
||||||
|
#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 5
|
||||||
|
|
||||||
|
/* Used memory allocation (heap_x.c). */
|
||||||
|
#define configFRTOS_MEMORY_SCHEME 4
|
||||||
|
/* Tasks.c additions (e.g. Thread Aware Debug capability) */
|
||||||
|
#define configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H 1
|
||||||
|
|
||||||
|
/* Memory allocation related definitions. */
|
||||||
|
#define configSUPPORT_STATIC_ALLOCATION 1
|
||||||
|
#define configSUPPORT_DYNAMIC_ALLOCATION 1
|
||||||
|
#define configTOTAL_HEAP_SIZE ( ( size_t )( 10 * 1024 ) )
|
||||||
|
#define configAPPLICATION_ALLOCATED_HEAP 0
|
||||||
|
|
||||||
|
/* Hook function related definitions. */
|
||||||
|
#define configUSE_IDLE_HOOK 0
|
||||||
|
#define configUSE_TICK_HOOK 0
|
||||||
|
#define configCHECK_FOR_STACK_OVERFLOW 0
|
||||||
|
#define configUSE_MALLOC_FAILED_HOOK 0
|
||||||
|
#define configUSE_DAEMON_TASK_STARTUP_HOOK 0
|
||||||
|
|
||||||
|
/* Run time and task stats gathering related definitions. */
|
||||||
|
#define configGENERATE_RUN_TIME_STATS 0
|
||||||
|
#define configUSE_TRACE_FACILITY 1
|
||||||
|
#define configUSE_STATS_FORMATTING_FUNCTIONS 0
|
||||||
|
|
||||||
|
/* Task aware debugging. */
|
||||||
|
#define configRECORD_STACK_HIGH_ADDRESS 1
|
||||||
|
|
||||||
|
/* Co-routine related definitions. */
|
||||||
|
#define configUSE_CO_ROUTINES 0
|
||||||
|
#define configMAX_CO_ROUTINE_PRIORITIES 2
|
||||||
|
|
||||||
|
/* Software timer related definitions. */
|
||||||
|
#define configUSE_TIMERS 1
|
||||||
|
#define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES - 1 )
|
||||||
|
#define configTIMER_QUEUE_LENGTH 10
|
||||||
|
#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2 )
|
||||||
|
|
||||||
|
/* Define to trap errors during development. */
|
||||||
|
#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for (;;); }
|
||||||
|
|
||||||
|
/* Optional functions - most linkers will remove unused functions anyway. */
|
||||||
|
#define INCLUDE_vTaskPrioritySet 1
|
||||||
|
#define INCLUDE_uxTaskPriorityGet 1
|
||||||
|
#define INCLUDE_vTaskDelete 1
|
||||||
|
#define INCLUDE_vTaskSuspend 1
|
||||||
|
#define INCLUDE_vTaskDelayUntil 1
|
||||||
|
#define INCLUDE_vTaskDelay 1
|
||||||
|
#define INCLUDE_xTaskGetSchedulerState 1
|
||||||
|
#define INCLUDE_xTaskGetCurrentTaskHandle 1
|
||||||
|
#define INCLUDE_uxTaskGetStackHighWaterMark 0
|
||||||
|
#define INCLUDE_xTaskGetIdleTaskHandle 0
|
||||||
|
#define INCLUDE_eTaskGetState 0
|
||||||
|
#define INCLUDE_xTimerPendFunctionCall 1
|
||||||
|
#define INCLUDE_xTaskAbortDelay 0
|
||||||
|
#define INCLUDE_xTaskGetHandle 0
|
||||||
|
#define INCLUDE_xTaskResumeFromISR 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__ICCARM__)||defined(__CC_ARM)||defined(__GNUC__)
|
||||||
|
/* Clock manager provides in this variable system core clock frequency */
|
||||||
|
#include <stdint.h>
|
||||||
|
extern uint32_t SystemCoreClock;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef configENABLE_FPU
|
||||||
|
#define configENABLE_FPU 1
|
||||||
|
#endif
|
||||||
|
#ifndef configENABLE_MPU
|
||||||
|
#define configENABLE_MPU 1
|
||||||
|
#endif
|
||||||
|
#ifndef configENABLE_TRUSTZONE
|
||||||
|
#define configENABLE_TRUSTZONE 0
|
||||||
|
#endif
|
||||||
|
#ifndef configRUN_FREERTOS_SECURE_ONLY
|
||||||
|
#define configRUN_FREERTOS_SECURE_ONLY 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Interrupt nesting behaviour configuration. Cortex-M specific. */
|
||||||
|
#ifdef __NVIC_PRIO_BITS
|
||||||
|
/* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
|
||||||
|
#define configPRIO_BITS __NVIC_PRIO_BITS
|
||||||
|
#else
|
||||||
|
#define configPRIO_BITS 3 /* 8 priority levels */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The lowest interrupt priority that can be used in a call to a "set priority"
|
||||||
|
function. */
|
||||||
|
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY ( ( 1U << ( configPRIO_BITS ) ) - 1 )
|
||||||
|
|
||||||
|
/* The highest interrupt priority that can be used by any interrupt service
|
||||||
|
routine that makes calls to interrupt safe FreeRTOS API functions. DO NOT CALL
|
||||||
|
INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER
|
||||||
|
PRIORITY THAN THIS! (higher priorities are lower numeric values. */
|
||||||
|
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 2
|
||||||
|
|
||||||
|
/* Interrupt priorities used by the kernel port layer itself. These are generic
|
||||||
|
to all Cortex-M ports, and do not rely on any particular library functions. */
|
||||||
|
#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << ( 8 - configPRIO_BITS ) )
|
||||||
|
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
|
||||||
|
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
|
||||||
|
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << ( 8 - configPRIO_BITS ) )
|
||||||
|
|
||||||
|
/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
|
||||||
|
standard names. */
|
||||||
|
#define vPortSVCHandler SVC_Handler
|
||||||
|
#define vPortPendSVHandler PendSV_Handler
|
||||||
|
#define vPortSysTickHandler SysTick_Handler
|
||||||
|
|
||||||
|
#endif /* FREERTOS_CONFIG_H */
|
||||||
|
|
@ -0,0 +1,894 @@
|
||||||
|
/**************************************************************************//**
|
||||||
|
* @file cmsis_armcc.h
|
||||||
|
* @brief CMSIS compiler ARMCC (Arm Compiler 5) header file
|
||||||
|
* @version V5.1.0
|
||||||
|
* @date 08. May 2019
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2009-2019 Arm Limited. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __CMSIS_ARMCC_H
|
||||||
|
#define __CMSIS_ARMCC_H
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677)
|
||||||
|
#error "Please use Arm Compiler Toolchain V4.0.677 or later!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* CMSIS compiler control architecture macros */
|
||||||
|
#if ((defined (__TARGET_ARCH_6_M ) && (__TARGET_ARCH_6_M == 1)) || \
|
||||||
|
(defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M == 1)) )
|
||||||
|
#define __ARM_ARCH_6M__ 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M == 1))
|
||||||
|
#define __ARM_ARCH_7M__ 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1))
|
||||||
|
#define __ARM_ARCH_7EM__ 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* __ARM_ARCH_8M_BASE__ not applicable */
|
||||||
|
/* __ARM_ARCH_8M_MAIN__ not applicable */
|
||||||
|
|
||||||
|
/* CMSIS compiler control DSP macros */
|
||||||
|
#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
|
||||||
|
#define __ARM_FEATURE_DSP 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* CMSIS compiler specific defines */
|
||||||
|
#ifndef __ASM
|
||||||
|
#define __ASM __asm
|
||||||
|
#endif
|
||||||
|
#ifndef __INLINE
|
||||||
|
#define __INLINE __inline
|
||||||
|
#endif
|
||||||
|
#ifndef __STATIC_INLINE
|
||||||
|
#define __STATIC_INLINE static __inline
|
||||||
|
#endif
|
||||||
|
#ifndef __STATIC_FORCEINLINE
|
||||||
|
#define __STATIC_FORCEINLINE static __forceinline
|
||||||
|
#endif
|
||||||
|
#ifndef __NO_RETURN
|
||||||
|
#define __NO_RETURN __declspec(noreturn)
|
||||||
|
#endif
|
||||||
|
#ifndef __USED
|
||||||
|
#define __USED __attribute__((used))
|
||||||
|
#endif
|
||||||
|
#ifndef __WEAK
|
||||||
|
#define __WEAK __attribute__((weak))
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED
|
||||||
|
#define __PACKED __attribute__((packed))
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED_STRUCT
|
||||||
|
#define __PACKED_STRUCT __packed struct
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED_UNION
|
||||||
|
#define __PACKED_UNION __packed union
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32 /* deprecated */
|
||||||
|
#define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x)))
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT16_WRITE
|
||||||
|
#define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val))
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT16_READ
|
||||||
|
#define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr)))
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32_WRITE
|
||||||
|
#define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val))
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32_READ
|
||||||
|
#define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr)))
|
||||||
|
#endif
|
||||||
|
#ifndef __ALIGNED
|
||||||
|
#define __ALIGNED(x) __attribute__((aligned(x)))
|
||||||
|
#endif
|
||||||
|
#ifndef __RESTRICT
|
||||||
|
#define __RESTRICT __restrict
|
||||||
|
#endif
|
||||||
|
#ifndef __COMPILER_BARRIER
|
||||||
|
#define __COMPILER_BARRIER() __memory_changed()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ######################### Startup and Lowlevel Init ######################## */
|
||||||
|
|
||||||
|
#ifndef __PROGRAM_START
|
||||||
|
#define __PROGRAM_START __main
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __INITIAL_SP
|
||||||
|
#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __STACK_LIMIT
|
||||||
|
#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __VECTOR_TABLE
|
||||||
|
#define __VECTOR_TABLE __Vectors
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __VECTOR_TABLE_ATTRIBUTE
|
||||||
|
#define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section("RESET")))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ########################### Core Function Access ########################### */
|
||||||
|
/** \ingroup CMSIS_Core_FunctionInterface
|
||||||
|
\defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Enable IRQ Interrupts
|
||||||
|
\details Enables IRQ interrupts by clearing the I-bit in the CPSR.
|
||||||
|
Can only be executed in Privileged modes.
|
||||||
|
*/
|
||||||
|
/* intrinsic void __enable_irq(); */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Disable IRQ Interrupts
|
||||||
|
\details Disables IRQ interrupts by setting the I-bit in the CPSR.
|
||||||
|
Can only be executed in Privileged modes.
|
||||||
|
*/
|
||||||
|
/* intrinsic void __disable_irq(); */
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Control Register
|
||||||
|
\details Returns the content of the Control Register.
|
||||||
|
\return Control Register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_CONTROL(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regControl __ASM("control");
|
||||||
|
return(__regControl);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Control Register
|
||||||
|
\details Writes the given value to the Control Register.
|
||||||
|
\param [in] control Control Register value to set
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_CONTROL(uint32_t control)
|
||||||
|
{
|
||||||
|
register uint32_t __regControl __ASM("control");
|
||||||
|
__regControl = control;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get IPSR Register
|
||||||
|
\details Returns the content of the IPSR Register.
|
||||||
|
\return IPSR Register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_IPSR(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regIPSR __ASM("ipsr");
|
||||||
|
return(__regIPSR);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get APSR Register
|
||||||
|
\details Returns the content of the APSR Register.
|
||||||
|
\return APSR Register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_APSR(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regAPSR __ASM("apsr");
|
||||||
|
return(__regAPSR);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get xPSR Register
|
||||||
|
\details Returns the content of the xPSR Register.
|
||||||
|
\return xPSR Register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_xPSR(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regXPSR __ASM("xpsr");
|
||||||
|
return(__regXPSR);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Process Stack Pointer
|
||||||
|
\details Returns the current value of the Process Stack Pointer (PSP).
|
||||||
|
\return PSP Register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_PSP(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regProcessStackPointer __ASM("psp");
|
||||||
|
return(__regProcessStackPointer);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Process Stack Pointer
|
||||||
|
\details Assigns the given value to the Process Stack Pointer (PSP).
|
||||||
|
\param [in] topOfProcStack Process Stack Pointer value to set
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
|
||||||
|
{
|
||||||
|
register uint32_t __regProcessStackPointer __ASM("psp");
|
||||||
|
__regProcessStackPointer = topOfProcStack;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Main Stack Pointer
|
||||||
|
\details Returns the current value of the Main Stack Pointer (MSP).
|
||||||
|
\return MSP Register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_MSP(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regMainStackPointer __ASM("msp");
|
||||||
|
return(__regMainStackPointer);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Main Stack Pointer
|
||||||
|
\details Assigns the given value to the Main Stack Pointer (MSP).
|
||||||
|
\param [in] topOfMainStack Main Stack Pointer value to set
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
|
||||||
|
{
|
||||||
|
register uint32_t __regMainStackPointer __ASM("msp");
|
||||||
|
__regMainStackPointer = topOfMainStack;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Priority Mask
|
||||||
|
\details Returns the current state of the priority mask bit from the Priority Mask Register.
|
||||||
|
\return Priority Mask value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_PRIMASK(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regPriMask __ASM("primask");
|
||||||
|
return(__regPriMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Priority Mask
|
||||||
|
\details Assigns the given value to the Priority Mask Register.
|
||||||
|
\param [in] priMask Priority Mask
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
|
||||||
|
{
|
||||||
|
register uint32_t __regPriMask __ASM("primask");
|
||||||
|
__regPriMask = (priMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
|
||||||
|
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Enable FIQ
|
||||||
|
\details Enables FIQ interrupts by clearing the F-bit in the CPSR.
|
||||||
|
Can only be executed in Privileged modes.
|
||||||
|
*/
|
||||||
|
#define __enable_fault_irq __enable_fiq
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Disable FIQ
|
||||||
|
\details Disables FIQ interrupts by setting the F-bit in the CPSR.
|
||||||
|
Can only be executed in Privileged modes.
|
||||||
|
*/
|
||||||
|
#define __disable_fault_irq __disable_fiq
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Base Priority
|
||||||
|
\details Returns the current value of the Base Priority register.
|
||||||
|
\return Base Priority register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_BASEPRI(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regBasePri __ASM("basepri");
|
||||||
|
return(__regBasePri);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Base Priority
|
||||||
|
\details Assigns the given value to the Base Priority register.
|
||||||
|
\param [in] basePri Base Priority value to set
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_BASEPRI(uint32_t basePri)
|
||||||
|
{
|
||||||
|
register uint32_t __regBasePri __ASM("basepri");
|
||||||
|
__regBasePri = (basePri & 0xFFU);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Base Priority with condition
|
||||||
|
\details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled,
|
||||||
|
or the new value increases the BASEPRI priority level.
|
||||||
|
\param [in] basePri Base Priority value to set
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri)
|
||||||
|
{
|
||||||
|
register uint32_t __regBasePriMax __ASM("basepri_max");
|
||||||
|
__regBasePriMax = (basePri & 0xFFU);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Fault Mask
|
||||||
|
\details Returns the current value of the Fault Mask register.
|
||||||
|
\return Fault Mask register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_FAULTMASK(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regFaultMask __ASM("faultmask");
|
||||||
|
return(__regFaultMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Fault Mask
|
||||||
|
\details Assigns the given value to the Fault Mask register.
|
||||||
|
\param [in] faultMask Fault Mask value to set
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
|
||||||
|
{
|
||||||
|
register uint32_t __regFaultMask __ASM("faultmask");
|
||||||
|
__regFaultMask = (faultMask & (uint32_t)1U);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
|
||||||
|
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get FPSCR
|
||||||
|
\details Returns the current value of the Floating Point Status/Control register.
|
||||||
|
\return Floating Point Status/Control register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_FPSCR(void)
|
||||||
|
{
|
||||||
|
#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
|
||||||
|
(defined (__FPU_USED ) && (__FPU_USED == 1U)) )
|
||||||
|
register uint32_t __regfpscr __ASM("fpscr");
|
||||||
|
return(__regfpscr);
|
||||||
|
#else
|
||||||
|
return(0U);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set FPSCR
|
||||||
|
\details Assigns the given value to the Floating Point Status/Control register.
|
||||||
|
\param [in] fpscr Floating Point Status/Control value to set
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
|
||||||
|
{
|
||||||
|
#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
|
||||||
|
(defined (__FPU_USED ) && (__FPU_USED == 1U)) )
|
||||||
|
register uint32_t __regfpscr __ASM("fpscr");
|
||||||
|
__regfpscr = (fpscr);
|
||||||
|
#else
|
||||||
|
(void)fpscr;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*@} end of CMSIS_Core_RegAccFunctions */
|
||||||
|
|
||||||
|
|
||||||
|
/* ########################## Core Instruction Access ######################### */
|
||||||
|
/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface
|
||||||
|
Access to dedicated instructions
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief No Operation
|
||||||
|
\details No Operation does nothing. This instruction can be used for code alignment purposes.
|
||||||
|
*/
|
||||||
|
#define __NOP __nop
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Wait For Interrupt
|
||||||
|
\details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs.
|
||||||
|
*/
|
||||||
|
#define __WFI __wfi
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Wait For Event
|
||||||
|
\details Wait For Event is a hint instruction that permits the processor to enter
|
||||||
|
a low-power state until one of a number of events occurs.
|
||||||
|
*/
|
||||||
|
#define __WFE __wfe
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Send Event
|
||||||
|
\details Send Event is a hint instruction. It causes an event to be signaled to the CPU.
|
||||||
|
*/
|
||||||
|
#define __SEV __sev
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Instruction Synchronization Barrier
|
||||||
|
\details Instruction Synchronization Barrier flushes the pipeline in the processor,
|
||||||
|
so that all instructions following the ISB are fetched from cache or memory,
|
||||||
|
after the instruction has been completed.
|
||||||
|
*/
|
||||||
|
#define __ISB() do {\
|
||||||
|
__schedule_barrier();\
|
||||||
|
__isb(0xF);\
|
||||||
|
__schedule_barrier();\
|
||||||
|
} while (0U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Data Synchronization Barrier
|
||||||
|
\details Acts as a special kind of Data Memory Barrier.
|
||||||
|
It completes when all explicit memory accesses before this instruction complete.
|
||||||
|
*/
|
||||||
|
#define __DSB() do {\
|
||||||
|
__schedule_barrier();\
|
||||||
|
__dsb(0xF);\
|
||||||
|
__schedule_barrier();\
|
||||||
|
} while (0U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Data Memory Barrier
|
||||||
|
\details Ensures the apparent order of the explicit memory operations before
|
||||||
|
and after the instruction, without ensuring their completion.
|
||||||
|
*/
|
||||||
|
#define __DMB() do {\
|
||||||
|
__schedule_barrier();\
|
||||||
|
__dmb(0xF);\
|
||||||
|
__schedule_barrier();\
|
||||||
|
} while (0U)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Reverse byte order (32 bit)
|
||||||
|
\details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412.
|
||||||
|
\param [in] value Value to reverse
|
||||||
|
\return Reversed value
|
||||||
|
*/
|
||||||
|
#define __REV __rev
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Reverse byte order (16 bit)
|
||||||
|
\details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856.
|
||||||
|
\param [in] value Value to reverse
|
||||||
|
\return Reversed value
|
||||||
|
*/
|
||||||
|
#ifndef __NO_EMBEDDED_ASM
|
||||||
|
__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value)
|
||||||
|
{
|
||||||
|
rev16 r0, r0
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Reverse byte order (16 bit)
|
||||||
|
\details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000.
|
||||||
|
\param [in] value Value to reverse
|
||||||
|
\return Reversed value
|
||||||
|
*/
|
||||||
|
#ifndef __NO_EMBEDDED_ASM
|
||||||
|
__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value)
|
||||||
|
{
|
||||||
|
revsh r0, r0
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Rotate Right in unsigned value (32 bit)
|
||||||
|
\details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
|
||||||
|
\param [in] op1 Value to rotate
|
||||||
|
\param [in] op2 Number of Bits to rotate
|
||||||
|
\return Rotated value
|
||||||
|
*/
|
||||||
|
#define __ROR __ror
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Breakpoint
|
||||||
|
\details Causes the processor to enter Debug state.
|
||||||
|
Debug tools can use this to investigate system state when the instruction at a particular address is reached.
|
||||||
|
\param [in] value is ignored by the processor.
|
||||||
|
If required, a debugger can use it to store additional information about the breakpoint.
|
||||||
|
*/
|
||||||
|
#define __BKPT(value) __breakpoint(value)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Reverse bit order of value
|
||||||
|
\details Reverses the bit order of the given value.
|
||||||
|
\param [in] value Value to reverse
|
||||||
|
\return Reversed value
|
||||||
|
*/
|
||||||
|
#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
|
||||||
|
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
|
||||||
|
#define __RBIT __rbit
|
||||||
|
#else
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */
|
||||||
|
|
||||||
|
result = value; /* r will be reversed bits of v; first get LSB of v */
|
||||||
|
for (value >>= 1U; value != 0U; value >>= 1U)
|
||||||
|
{
|
||||||
|
result <<= 1U;
|
||||||
|
result |= value & 1U;
|
||||||
|
s--;
|
||||||
|
}
|
||||||
|
result <<= s; /* shift when v's highest bits are zero */
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Count leading zeros
|
||||||
|
\details Counts the number of leading zeros of a data value.
|
||||||
|
\param [in] value Value to count the leading zeros
|
||||||
|
\return number of leading zeros in value
|
||||||
|
*/
|
||||||
|
#define __CLZ __clz
|
||||||
|
|
||||||
|
|
||||||
|
#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
|
||||||
|
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief LDR Exclusive (8 bit)
|
||||||
|
\details Executes a exclusive LDR instruction for 8 bit value.
|
||||||
|
\param [in] ptr Pointer to data
|
||||||
|
\return value of type uint8_t at (*ptr)
|
||||||
|
*/
|
||||||
|
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
|
||||||
|
#define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr))
|
||||||
|
#else
|
||||||
|
#define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief LDR Exclusive (16 bit)
|
||||||
|
\details Executes a exclusive LDR instruction for 16 bit values.
|
||||||
|
\param [in] ptr Pointer to data
|
||||||
|
\return value of type uint16_t at (*ptr)
|
||||||
|
*/
|
||||||
|
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
|
||||||
|
#define __LDREXH(ptr) ((uint16_t) __ldrex(ptr))
|
||||||
|
#else
|
||||||
|
#define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief LDR Exclusive (32 bit)
|
||||||
|
\details Executes a exclusive LDR instruction for 32 bit values.
|
||||||
|
\param [in] ptr Pointer to data
|
||||||
|
\return value of type uint32_t at (*ptr)
|
||||||
|
*/
|
||||||
|
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
|
||||||
|
#define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr))
|
||||||
|
#else
|
||||||
|
#define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief STR Exclusive (8 bit)
|
||||||
|
\details Executes a exclusive STR instruction for 8 bit values.
|
||||||
|
\param [in] value Value to store
|
||||||
|
\param [in] ptr Pointer to location
|
||||||
|
\return 0 Function succeeded
|
||||||
|
\return 1 Function failed
|
||||||
|
*/
|
||||||
|
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
|
||||||
|
#define __STREXB(value, ptr) __strex(value, ptr)
|
||||||
|
#else
|
||||||
|
#define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief STR Exclusive (16 bit)
|
||||||
|
\details Executes a exclusive STR instruction for 16 bit values.
|
||||||
|
\param [in] value Value to store
|
||||||
|
\param [in] ptr Pointer to location
|
||||||
|
\return 0 Function succeeded
|
||||||
|
\return 1 Function failed
|
||||||
|
*/
|
||||||
|
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
|
||||||
|
#define __STREXH(value, ptr) __strex(value, ptr)
|
||||||
|
#else
|
||||||
|
#define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief STR Exclusive (32 bit)
|
||||||
|
\details Executes a exclusive STR instruction for 32 bit values.
|
||||||
|
\param [in] value Value to store
|
||||||
|
\param [in] ptr Pointer to location
|
||||||
|
\return 0 Function succeeded
|
||||||
|
\return 1 Function failed
|
||||||
|
*/
|
||||||
|
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
|
||||||
|
#define __STREXW(value, ptr) __strex(value, ptr)
|
||||||
|
#else
|
||||||
|
#define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Remove the exclusive lock
|
||||||
|
\details Removes the exclusive lock which is created by LDREX.
|
||||||
|
*/
|
||||||
|
#define __CLREX __clrex
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Signed Saturate
|
||||||
|
\details Saturates a signed value.
|
||||||
|
\param [in] value Value to be saturated
|
||||||
|
\param [in] sat Bit position to saturate to (1..32)
|
||||||
|
\return Saturated value
|
||||||
|
*/
|
||||||
|
#define __SSAT __ssat
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Unsigned Saturate
|
||||||
|
\details Saturates an unsigned value.
|
||||||
|
\param [in] value Value to be saturated
|
||||||
|
\param [in] sat Bit position to saturate to (0..31)
|
||||||
|
\return Saturated value
|
||||||
|
*/
|
||||||
|
#define __USAT __usat
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Rotate Right with Extend (32 bit)
|
||||||
|
\details Moves each bit of a bitstring right by one bit.
|
||||||
|
The carry input is shifted in at the left end of the bitstring.
|
||||||
|
\param [in] value Value to rotate
|
||||||
|
\return Rotated value
|
||||||
|
*/
|
||||||
|
#ifndef __NO_EMBEDDED_ASM
|
||||||
|
__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value)
|
||||||
|
{
|
||||||
|
rrx r0, r0
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief LDRT Unprivileged (8 bit)
|
||||||
|
\details Executes a Unprivileged LDRT instruction for 8 bit value.
|
||||||
|
\param [in] ptr Pointer to data
|
||||||
|
\return value of type uint8_t at (*ptr)
|
||||||
|
*/
|
||||||
|
#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr))
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief LDRT Unprivileged (16 bit)
|
||||||
|
\details Executes a Unprivileged LDRT instruction for 16 bit values.
|
||||||
|
\param [in] ptr Pointer to data
|
||||||
|
\return value of type uint16_t at (*ptr)
|
||||||
|
*/
|
||||||
|
#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr))
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief LDRT Unprivileged (32 bit)
|
||||||
|
\details Executes a Unprivileged LDRT instruction for 32 bit values.
|
||||||
|
\param [in] ptr Pointer to data
|
||||||
|
\return value of type uint32_t at (*ptr)
|
||||||
|
*/
|
||||||
|
#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr))
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief STRT Unprivileged (8 bit)
|
||||||
|
\details Executes a Unprivileged STRT instruction for 8 bit values.
|
||||||
|
\param [in] value Value to store
|
||||||
|
\param [in] ptr Pointer to location
|
||||||
|
*/
|
||||||
|
#define __STRBT(value, ptr) __strt(value, ptr)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief STRT Unprivileged (16 bit)
|
||||||
|
\details Executes a Unprivileged STRT instruction for 16 bit values.
|
||||||
|
\param [in] value Value to store
|
||||||
|
\param [in] ptr Pointer to location
|
||||||
|
*/
|
||||||
|
#define __STRHT(value, ptr) __strt(value, ptr)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief STRT Unprivileged (32 bit)
|
||||||
|
\details Executes a Unprivileged STRT instruction for 32 bit values.
|
||||||
|
\param [in] value Value to store
|
||||||
|
\param [in] ptr Pointer to location
|
||||||
|
*/
|
||||||
|
#define __STRT(value, ptr) __strt(value, ptr)
|
||||||
|
|
||||||
|
#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
|
||||||
|
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Signed Saturate
|
||||||
|
\details Saturates a signed value.
|
||||||
|
\param [in] value Value to be saturated
|
||||||
|
\param [in] sat Bit position to saturate to (1..32)
|
||||||
|
\return Saturated value
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat)
|
||||||
|
{
|
||||||
|
if ((sat >= 1U) && (sat <= 32U))
|
||||||
|
{
|
||||||
|
const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U);
|
||||||
|
const int32_t min = -1 - max ;
|
||||||
|
if (val > max)
|
||||||
|
{
|
||||||
|
return max;
|
||||||
|
}
|
||||||
|
else if (val < min)
|
||||||
|
{
|
||||||
|
return min;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Unsigned Saturate
|
||||||
|
\details Saturates an unsigned value.
|
||||||
|
\param [in] value Value to be saturated
|
||||||
|
\param [in] sat Bit position to saturate to (0..31)
|
||||||
|
\return Saturated value
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat)
|
||||||
|
{
|
||||||
|
if (sat <= 31U)
|
||||||
|
{
|
||||||
|
const uint32_t max = ((1U << sat) - 1U);
|
||||||
|
if (val > (int32_t)max)
|
||||||
|
{
|
||||||
|
return max;
|
||||||
|
}
|
||||||
|
else if (val < 0)
|
||||||
|
{
|
||||||
|
return 0U;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (uint32_t)val;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
|
||||||
|
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */
|
||||||
|
|
||||||
|
/*@}*/ /* end of group CMSIS_Core_InstructionInterface */
|
||||||
|
|
||||||
|
|
||||||
|
/* ################### Compiler specific Intrinsics ########################### */
|
||||||
|
/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics
|
||||||
|
Access to dedicated SIMD instructions
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
|
||||||
|
|
||||||
|
#define __SADD8 __sadd8
|
||||||
|
#define __QADD8 __qadd8
|
||||||
|
#define __SHADD8 __shadd8
|
||||||
|
#define __UADD8 __uadd8
|
||||||
|
#define __UQADD8 __uqadd8
|
||||||
|
#define __UHADD8 __uhadd8
|
||||||
|
#define __SSUB8 __ssub8
|
||||||
|
#define __QSUB8 __qsub8
|
||||||
|
#define __SHSUB8 __shsub8
|
||||||
|
#define __USUB8 __usub8
|
||||||
|
#define __UQSUB8 __uqsub8
|
||||||
|
#define __UHSUB8 __uhsub8
|
||||||
|
#define __SADD16 __sadd16
|
||||||
|
#define __QADD16 __qadd16
|
||||||
|
#define __SHADD16 __shadd16
|
||||||
|
#define __UADD16 __uadd16
|
||||||
|
#define __UQADD16 __uqadd16
|
||||||
|
#define __UHADD16 __uhadd16
|
||||||
|
#define __SSUB16 __ssub16
|
||||||
|
#define __QSUB16 __qsub16
|
||||||
|
#define __SHSUB16 __shsub16
|
||||||
|
#define __USUB16 __usub16
|
||||||
|
#define __UQSUB16 __uqsub16
|
||||||
|
#define __UHSUB16 __uhsub16
|
||||||
|
#define __SASX __sasx
|
||||||
|
#define __QASX __qasx
|
||||||
|
#define __SHASX __shasx
|
||||||
|
#define __UASX __uasx
|
||||||
|
#define __UQASX __uqasx
|
||||||
|
#define __UHASX __uhasx
|
||||||
|
#define __SSAX __ssax
|
||||||
|
#define __QSAX __qsax
|
||||||
|
#define __SHSAX __shsax
|
||||||
|
#define __USAX __usax
|
||||||
|
#define __UQSAX __uqsax
|
||||||
|
#define __UHSAX __uhsax
|
||||||
|
#define __USAD8 __usad8
|
||||||
|
#define __USADA8 __usada8
|
||||||
|
#define __SSAT16 __ssat16
|
||||||
|
#define __USAT16 __usat16
|
||||||
|
#define __UXTB16 __uxtb16
|
||||||
|
#define __UXTAB16 __uxtab16
|
||||||
|
#define __SXTB16 __sxtb16
|
||||||
|
#define __SXTAB16 __sxtab16
|
||||||
|
#define __SMUAD __smuad
|
||||||
|
#define __SMUADX __smuadx
|
||||||
|
#define __SMLAD __smlad
|
||||||
|
#define __SMLADX __smladx
|
||||||
|
#define __SMLALD __smlald
|
||||||
|
#define __SMLALDX __smlaldx
|
||||||
|
#define __SMUSD __smusd
|
||||||
|
#define __SMUSDX __smusdx
|
||||||
|
#define __SMLSD __smlsd
|
||||||
|
#define __SMLSDX __smlsdx
|
||||||
|
#define __SMLSLD __smlsld
|
||||||
|
#define __SMLSLDX __smlsldx
|
||||||
|
#define __SEL __sel
|
||||||
|
#define __QADD __qadd
|
||||||
|
#define __QSUB __qsub
|
||||||
|
|
||||||
|
#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \
|
||||||
|
((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) )
|
||||||
|
|
||||||
|
#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \
|
||||||
|
((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) )
|
||||||
|
|
||||||
|
#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \
|
||||||
|
((int64_t)(ARG3) << 32U) ) >> 32U))
|
||||||
|
|
||||||
|
#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */
|
||||||
|
/*@} end of group CMSIS_SIMD_intrinsics */
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __CMSIS_ARMCC_H */
|
||||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,283 @@
|
||||||
|
/**************************************************************************//**
|
||||||
|
* @file cmsis_compiler.h
|
||||||
|
* @brief CMSIS compiler generic header file
|
||||||
|
* @version V5.1.0
|
||||||
|
* @date 09. October 2018
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2009-2018 Arm Limited. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __CMSIS_COMPILER_H
|
||||||
|
#define __CMSIS_COMPILER_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Arm Compiler 4/5
|
||||||
|
*/
|
||||||
|
#if defined ( __CC_ARM )
|
||||||
|
#include "cmsis_armcc.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Arm Compiler 6.6 LTM (armclang)
|
||||||
|
*/
|
||||||
|
#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100)
|
||||||
|
#include "cmsis_armclang_ltm.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Arm Compiler above 6.10.1 (armclang)
|
||||||
|
*/
|
||||||
|
#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100)
|
||||||
|
#include "cmsis_armclang.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* GNU Compiler
|
||||||
|
*/
|
||||||
|
#elif defined ( __GNUC__ )
|
||||||
|
#include "cmsis_gcc.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IAR Compiler
|
||||||
|
*/
|
||||||
|
#elif defined ( __ICCARM__ )
|
||||||
|
#include <cmsis_iccarm.h>
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TI Arm Compiler
|
||||||
|
*/
|
||||||
|
#elif defined ( __TI_ARM__ )
|
||||||
|
#include <cmsis_ccs.h>
|
||||||
|
|
||||||
|
#ifndef __ASM
|
||||||
|
#define __ASM __asm
|
||||||
|
#endif
|
||||||
|
#ifndef __INLINE
|
||||||
|
#define __INLINE inline
|
||||||
|
#endif
|
||||||
|
#ifndef __STATIC_INLINE
|
||||||
|
#define __STATIC_INLINE static inline
|
||||||
|
#endif
|
||||||
|
#ifndef __STATIC_FORCEINLINE
|
||||||
|
#define __STATIC_FORCEINLINE __STATIC_INLINE
|
||||||
|
#endif
|
||||||
|
#ifndef __NO_RETURN
|
||||||
|
#define __NO_RETURN __attribute__((noreturn))
|
||||||
|
#endif
|
||||||
|
#ifndef __USED
|
||||||
|
#define __USED __attribute__((used))
|
||||||
|
#endif
|
||||||
|
#ifndef __WEAK
|
||||||
|
#define __WEAK __attribute__((weak))
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED
|
||||||
|
#define __PACKED __attribute__((packed))
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED_STRUCT
|
||||||
|
#define __PACKED_STRUCT struct __attribute__((packed))
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED_UNION
|
||||||
|
#define __PACKED_UNION union __attribute__((packed))
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32 /* deprecated */
|
||||||
|
struct __attribute__((packed)) T_UINT32 { uint32_t v; };
|
||||||
|
#define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v)
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT16_WRITE
|
||||||
|
__PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };
|
||||||
|
#define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val))
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT16_READ
|
||||||
|
__PACKED_STRUCT T_UINT16_READ { uint16_t v; };
|
||||||
|
#define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v)
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32_WRITE
|
||||||
|
__PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };
|
||||||
|
#define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32_READ
|
||||||
|
__PACKED_STRUCT T_UINT32_READ { uint32_t v; };
|
||||||
|
#define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v)
|
||||||
|
#endif
|
||||||
|
#ifndef __ALIGNED
|
||||||
|
#define __ALIGNED(x) __attribute__((aligned(x)))
|
||||||
|
#endif
|
||||||
|
#ifndef __RESTRICT
|
||||||
|
#define __RESTRICT __restrict
|
||||||
|
#endif
|
||||||
|
#ifndef __COMPILER_BARRIER
|
||||||
|
#warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored.
|
||||||
|
#define __COMPILER_BARRIER() (void)0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TASKING Compiler
|
||||||
|
*/
|
||||||
|
#elif defined ( __TASKING__ )
|
||||||
|
/*
|
||||||
|
* The CMSIS functions have been implemented as intrinsics in the compiler.
|
||||||
|
* Please use "carm -?i" to get an up to date list of all intrinsics,
|
||||||
|
* Including the CMSIS ones.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __ASM
|
||||||
|
#define __ASM __asm
|
||||||
|
#endif
|
||||||
|
#ifndef __INLINE
|
||||||
|
#define __INLINE inline
|
||||||
|
#endif
|
||||||
|
#ifndef __STATIC_INLINE
|
||||||
|
#define __STATIC_INLINE static inline
|
||||||
|
#endif
|
||||||
|
#ifndef __STATIC_FORCEINLINE
|
||||||
|
#define __STATIC_FORCEINLINE __STATIC_INLINE
|
||||||
|
#endif
|
||||||
|
#ifndef __NO_RETURN
|
||||||
|
#define __NO_RETURN __attribute__((noreturn))
|
||||||
|
#endif
|
||||||
|
#ifndef __USED
|
||||||
|
#define __USED __attribute__((used))
|
||||||
|
#endif
|
||||||
|
#ifndef __WEAK
|
||||||
|
#define __WEAK __attribute__((weak))
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED
|
||||||
|
#define __PACKED __packed__
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED_STRUCT
|
||||||
|
#define __PACKED_STRUCT struct __packed__
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED_UNION
|
||||||
|
#define __PACKED_UNION union __packed__
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32 /* deprecated */
|
||||||
|
struct __packed__ T_UINT32 { uint32_t v; };
|
||||||
|
#define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v)
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT16_WRITE
|
||||||
|
__PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };
|
||||||
|
#define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val))
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT16_READ
|
||||||
|
__PACKED_STRUCT T_UINT16_READ { uint16_t v; };
|
||||||
|
#define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v)
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32_WRITE
|
||||||
|
__PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };
|
||||||
|
#define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32_READ
|
||||||
|
__PACKED_STRUCT T_UINT32_READ { uint32_t v; };
|
||||||
|
#define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v)
|
||||||
|
#endif
|
||||||
|
#ifndef __ALIGNED
|
||||||
|
#define __ALIGNED(x) __align(x)
|
||||||
|
#endif
|
||||||
|
#ifndef __RESTRICT
|
||||||
|
#warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored.
|
||||||
|
#define __RESTRICT
|
||||||
|
#endif
|
||||||
|
#ifndef __COMPILER_BARRIER
|
||||||
|
#warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored.
|
||||||
|
#define __COMPILER_BARRIER() (void)0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* COSMIC Compiler
|
||||||
|
*/
|
||||||
|
#elif defined ( __CSMC__ )
|
||||||
|
#include <cmsis_csm.h>
|
||||||
|
|
||||||
|
#ifndef __ASM
|
||||||
|
#define __ASM _asm
|
||||||
|
#endif
|
||||||
|
#ifndef __INLINE
|
||||||
|
#define __INLINE inline
|
||||||
|
#endif
|
||||||
|
#ifndef __STATIC_INLINE
|
||||||
|
#define __STATIC_INLINE static inline
|
||||||
|
#endif
|
||||||
|
#ifndef __STATIC_FORCEINLINE
|
||||||
|
#define __STATIC_FORCEINLINE __STATIC_INLINE
|
||||||
|
#endif
|
||||||
|
#ifndef __NO_RETURN
|
||||||
|
// NO RETURN is automatically detected hence no warning here
|
||||||
|
#define __NO_RETURN
|
||||||
|
#endif
|
||||||
|
#ifndef __USED
|
||||||
|
#warning No compiler specific solution for __USED. __USED is ignored.
|
||||||
|
#define __USED
|
||||||
|
#endif
|
||||||
|
#ifndef __WEAK
|
||||||
|
#define __WEAK __weak
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED
|
||||||
|
#define __PACKED @packed
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED_STRUCT
|
||||||
|
#define __PACKED_STRUCT @packed struct
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED_UNION
|
||||||
|
#define __PACKED_UNION @packed union
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32 /* deprecated */
|
||||||
|
@packed struct T_UINT32 { uint32_t v; };
|
||||||
|
#define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v)
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT16_WRITE
|
||||||
|
__PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };
|
||||||
|
#define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val))
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT16_READ
|
||||||
|
__PACKED_STRUCT T_UINT16_READ { uint16_t v; };
|
||||||
|
#define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v)
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32_WRITE
|
||||||
|
__PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };
|
||||||
|
#define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32_READ
|
||||||
|
__PACKED_STRUCT T_UINT32_READ { uint32_t v; };
|
||||||
|
#define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v)
|
||||||
|
#endif
|
||||||
|
#ifndef __ALIGNED
|
||||||
|
#warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored.
|
||||||
|
#define __ALIGNED(x)
|
||||||
|
#endif
|
||||||
|
#ifndef __RESTRICT
|
||||||
|
#warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored.
|
||||||
|
#define __RESTRICT
|
||||||
|
#endif
|
||||||
|
#ifndef __COMPILER_BARRIER
|
||||||
|
#warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored.
|
||||||
|
#define __COMPILER_BARRIER() (void)0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#else
|
||||||
|
#error Unknown compiler.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __CMSIS_COMPILER_H */
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,964 @@
|
||||||
|
/**************************************************************************//**
|
||||||
|
* @file cmsis_iccarm.h
|
||||||
|
* @brief CMSIS compiler ICCARM (IAR Compiler for Arm) header file
|
||||||
|
* @version V5.1.0
|
||||||
|
* @date 08. May 2019
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// Copyright (c) 2017-2019 IAR Systems
|
||||||
|
// Copyright (c) 2017-2019 Arm Limited. All rights reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License")
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __CMSIS_ICCARM_H__
|
||||||
|
#define __CMSIS_ICCARM_H__
|
||||||
|
|
||||||
|
#ifndef __ICCARM__
|
||||||
|
#error This file should only be compiled by ICCARM
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#pragma system_include
|
||||||
|
|
||||||
|
#define __IAR_FT _Pragma("inline=forced") __intrinsic
|
||||||
|
|
||||||
|
#if (__VER__ >= 8000000)
|
||||||
|
#define __ICCARM_V8 1
|
||||||
|
#else
|
||||||
|
#define __ICCARM_V8 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __ALIGNED
|
||||||
|
#if __ICCARM_V8
|
||||||
|
#define __ALIGNED(x) __attribute__((aligned(x)))
|
||||||
|
#elif (__VER__ >= 7080000)
|
||||||
|
/* Needs IAR language extensions */
|
||||||
|
#define __ALIGNED(x) __attribute__((aligned(x)))
|
||||||
|
#else
|
||||||
|
#warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored.
|
||||||
|
#define __ALIGNED(x)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Define compiler macros for CPU architecture, used in CMSIS 5.
|
||||||
|
*/
|
||||||
|
#if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__ || __ARM_ARCH_8M_BASE__ || __ARM_ARCH_8M_MAIN__
|
||||||
|
/* Macros already defined */
|
||||||
|
#else
|
||||||
|
#if defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__)
|
||||||
|
#define __ARM_ARCH_8M_MAIN__ 1
|
||||||
|
#elif defined(__ARM8M_BASELINE__)
|
||||||
|
#define __ARM_ARCH_8M_BASE__ 1
|
||||||
|
#elif defined(__ARM_ARCH_PROFILE) && __ARM_ARCH_PROFILE == 'M'
|
||||||
|
#if __ARM_ARCH == 6
|
||||||
|
#define __ARM_ARCH_6M__ 1
|
||||||
|
#elif __ARM_ARCH == 7
|
||||||
|
#if __ARM_FEATURE_DSP
|
||||||
|
#define __ARM_ARCH_7EM__ 1
|
||||||
|
#else
|
||||||
|
#define __ARM_ARCH_7M__ 1
|
||||||
|
#endif
|
||||||
|
#endif /* __ARM_ARCH */
|
||||||
|
#endif /* __ARM_ARCH_PROFILE == 'M' */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Alternativ core deduction for older ICCARM's */
|
||||||
|
#if !defined(__ARM_ARCH_6M__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__) && \
|
||||||
|
!defined(__ARM_ARCH_8M_BASE__) && !defined(__ARM_ARCH_8M_MAIN__)
|
||||||
|
#if defined(__ARM6M__) && (__CORE__ == __ARM6M__)
|
||||||
|
#define __ARM_ARCH_6M__ 1
|
||||||
|
#elif defined(__ARM7M__) && (__CORE__ == __ARM7M__)
|
||||||
|
#define __ARM_ARCH_7M__ 1
|
||||||
|
#elif defined(__ARM7EM__) && (__CORE__ == __ARM7EM__)
|
||||||
|
#define __ARM_ARCH_7EM__ 1
|
||||||
|
#elif defined(__ARM8M_BASELINE__) && (__CORE == __ARM8M_BASELINE__)
|
||||||
|
#define __ARM_ARCH_8M_BASE__ 1
|
||||||
|
#elif defined(__ARM8M_MAINLINE__) && (__CORE == __ARM8M_MAINLINE__)
|
||||||
|
#define __ARM_ARCH_8M_MAIN__ 1
|
||||||
|
#elif defined(__ARM8EM_MAINLINE__) && (__CORE == __ARM8EM_MAINLINE__)
|
||||||
|
#define __ARM_ARCH_8M_MAIN__ 1
|
||||||
|
#else
|
||||||
|
#error "Unknown target."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__ARM_ARCH_6M__) && __ARM_ARCH_6M__==1
|
||||||
|
#define __IAR_M0_FAMILY 1
|
||||||
|
#elif defined(__ARM_ARCH_8M_BASE__) && __ARM_ARCH_8M_BASE__==1
|
||||||
|
#define __IAR_M0_FAMILY 1
|
||||||
|
#else
|
||||||
|
#define __IAR_M0_FAMILY 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __ASM
|
||||||
|
#define __ASM __asm
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __COMPILER_BARRIER
|
||||||
|
#define __COMPILER_BARRIER() __ASM volatile("":::"memory")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __INLINE
|
||||||
|
#define __INLINE inline
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __NO_RETURN
|
||||||
|
#if __ICCARM_V8
|
||||||
|
#define __NO_RETURN __attribute__((__noreturn__))
|
||||||
|
#else
|
||||||
|
#define __NO_RETURN _Pragma("object_attribute=__noreturn")
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __PACKED
|
||||||
|
#if __ICCARM_V8
|
||||||
|
#define __PACKED __attribute__((packed, aligned(1)))
|
||||||
|
#else
|
||||||
|
/* Needs IAR language extensions */
|
||||||
|
#define __PACKED __packed
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __PACKED_STRUCT
|
||||||
|
#if __ICCARM_V8
|
||||||
|
#define __PACKED_STRUCT struct __attribute__((packed, aligned(1)))
|
||||||
|
#else
|
||||||
|
/* Needs IAR language extensions */
|
||||||
|
#define __PACKED_STRUCT __packed struct
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __PACKED_UNION
|
||||||
|
#if __ICCARM_V8
|
||||||
|
#define __PACKED_UNION union __attribute__((packed, aligned(1)))
|
||||||
|
#else
|
||||||
|
/* Needs IAR language extensions */
|
||||||
|
#define __PACKED_UNION __packed union
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __RESTRICT
|
||||||
|
#if __ICCARM_V8
|
||||||
|
#define __RESTRICT __restrict
|
||||||
|
#else
|
||||||
|
/* Needs IAR language extensions */
|
||||||
|
#define __RESTRICT restrict
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __STATIC_INLINE
|
||||||
|
#define __STATIC_INLINE static inline
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __FORCEINLINE
|
||||||
|
#define __FORCEINLINE _Pragma("inline=forced")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __STATIC_FORCEINLINE
|
||||||
|
#define __STATIC_FORCEINLINE __FORCEINLINE __STATIC_INLINE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __UNALIGNED_UINT16_READ
|
||||||
|
#pragma language=save
|
||||||
|
#pragma language=extended
|
||||||
|
__IAR_FT uint16_t __iar_uint16_read(void const *ptr)
|
||||||
|
{
|
||||||
|
return *(__packed uint16_t*)(ptr);
|
||||||
|
}
|
||||||
|
#pragma language=restore
|
||||||
|
#define __UNALIGNED_UINT16_READ(PTR) __iar_uint16_read(PTR)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __UNALIGNED_UINT16_WRITE
|
||||||
|
#pragma language=save
|
||||||
|
#pragma language=extended
|
||||||
|
__IAR_FT void __iar_uint16_write(void const *ptr, uint16_t val)
|
||||||
|
{
|
||||||
|
*(__packed uint16_t*)(ptr) = val;;
|
||||||
|
}
|
||||||
|
#pragma language=restore
|
||||||
|
#define __UNALIGNED_UINT16_WRITE(PTR,VAL) __iar_uint16_write(PTR,VAL)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __UNALIGNED_UINT32_READ
|
||||||
|
#pragma language=save
|
||||||
|
#pragma language=extended
|
||||||
|
__IAR_FT uint32_t __iar_uint32_read(void const *ptr)
|
||||||
|
{
|
||||||
|
return *(__packed uint32_t*)(ptr);
|
||||||
|
}
|
||||||
|
#pragma language=restore
|
||||||
|
#define __UNALIGNED_UINT32_READ(PTR) __iar_uint32_read(PTR)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __UNALIGNED_UINT32_WRITE
|
||||||
|
#pragma language=save
|
||||||
|
#pragma language=extended
|
||||||
|
__IAR_FT void __iar_uint32_write(void const *ptr, uint32_t val)
|
||||||
|
{
|
||||||
|
*(__packed uint32_t*)(ptr) = val;;
|
||||||
|
}
|
||||||
|
#pragma language=restore
|
||||||
|
#define __UNALIGNED_UINT32_WRITE(PTR,VAL) __iar_uint32_write(PTR,VAL)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __UNALIGNED_UINT32 /* deprecated */
|
||||||
|
#pragma language=save
|
||||||
|
#pragma language=extended
|
||||||
|
__packed struct __iar_u32 { uint32_t v; };
|
||||||
|
#pragma language=restore
|
||||||
|
#define __UNALIGNED_UINT32(PTR) (((struct __iar_u32 *)(PTR))->v)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __USED
|
||||||
|
#if __ICCARM_V8
|
||||||
|
#define __USED __attribute__((used))
|
||||||
|
#else
|
||||||
|
#define __USED _Pragma("__root")
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __WEAK
|
||||||
|
#if __ICCARM_V8
|
||||||
|
#define __WEAK __attribute__((weak))
|
||||||
|
#else
|
||||||
|
#define __WEAK _Pragma("__weak")
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __PROGRAM_START
|
||||||
|
#define __PROGRAM_START __iar_program_start
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __INITIAL_SP
|
||||||
|
#define __INITIAL_SP CSTACK$$Limit
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __STACK_LIMIT
|
||||||
|
#define __STACK_LIMIT CSTACK$$Base
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __VECTOR_TABLE
|
||||||
|
#define __VECTOR_TABLE __vector_table
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __VECTOR_TABLE_ATTRIBUTE
|
||||||
|
#define __VECTOR_TABLE_ATTRIBUTE @".intvec"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __ICCARM_INTRINSICS_VERSION__
|
||||||
|
#define __ICCARM_INTRINSICS_VERSION__ 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __ICCARM_INTRINSICS_VERSION__ == 2
|
||||||
|
|
||||||
|
#if defined(__CLZ)
|
||||||
|
#undef __CLZ
|
||||||
|
#endif
|
||||||
|
#if defined(__REVSH)
|
||||||
|
#undef __REVSH
|
||||||
|
#endif
|
||||||
|
#if defined(__RBIT)
|
||||||
|
#undef __RBIT
|
||||||
|
#endif
|
||||||
|
#if defined(__SSAT)
|
||||||
|
#undef __SSAT
|
||||||
|
#endif
|
||||||
|
#if defined(__USAT)
|
||||||
|
#undef __USAT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "iccarm_builtin.h"
|
||||||
|
|
||||||
|
#define __disable_fault_irq __iar_builtin_disable_fiq
|
||||||
|
#define __disable_irq __iar_builtin_disable_interrupt
|
||||||
|
#define __enable_fault_irq __iar_builtin_enable_fiq
|
||||||
|
#define __enable_irq __iar_builtin_enable_interrupt
|
||||||
|
#define __arm_rsr __iar_builtin_rsr
|
||||||
|
#define __arm_wsr __iar_builtin_wsr
|
||||||
|
|
||||||
|
|
||||||
|
#define __get_APSR() (__arm_rsr("APSR"))
|
||||||
|
#define __get_BASEPRI() (__arm_rsr("BASEPRI"))
|
||||||
|
#define __get_CONTROL() (__arm_rsr("CONTROL"))
|
||||||
|
#define __get_FAULTMASK() (__arm_rsr("FAULTMASK"))
|
||||||
|
|
||||||
|
#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
|
||||||
|
(defined (__FPU_USED ) && (__FPU_USED == 1U)) )
|
||||||
|
#define __get_FPSCR() (__arm_rsr("FPSCR"))
|
||||||
|
#define __set_FPSCR(VALUE) (__arm_wsr("FPSCR", (VALUE)))
|
||||||
|
#else
|
||||||
|
#define __get_FPSCR() ( 0 )
|
||||||
|
#define __set_FPSCR(VALUE) ((void)VALUE)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define __get_IPSR() (__arm_rsr("IPSR"))
|
||||||
|
#define __get_MSP() (__arm_rsr("MSP"))
|
||||||
|
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
|
||||||
|
(!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
|
||||||
|
// without main extensions, the non-secure MSPLIM is RAZ/WI
|
||||||
|
#define __get_MSPLIM() (0U)
|
||||||
|
#else
|
||||||
|
#define __get_MSPLIM() (__arm_rsr("MSPLIM"))
|
||||||
|
#endif
|
||||||
|
#define __get_PRIMASK() (__arm_rsr("PRIMASK"))
|
||||||
|
#define __get_PSP() (__arm_rsr("PSP"))
|
||||||
|
|
||||||
|
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
|
||||||
|
(!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
|
||||||
|
// without main extensions, the non-secure PSPLIM is RAZ/WI
|
||||||
|
#define __get_PSPLIM() (0U)
|
||||||
|
#else
|
||||||
|
#define __get_PSPLIM() (__arm_rsr("PSPLIM"))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define __get_xPSR() (__arm_rsr("xPSR"))
|
||||||
|
|
||||||
|
#define __set_BASEPRI(VALUE) (__arm_wsr("BASEPRI", (VALUE)))
|
||||||
|
#define __set_BASEPRI_MAX(VALUE) (__arm_wsr("BASEPRI_MAX", (VALUE)))
|
||||||
|
#define __set_CONTROL(VALUE) (__arm_wsr("CONTROL", (VALUE)))
|
||||||
|
#define __set_FAULTMASK(VALUE) (__arm_wsr("FAULTMASK", (VALUE)))
|
||||||
|
#define __set_MSP(VALUE) (__arm_wsr("MSP", (VALUE)))
|
||||||
|
|
||||||
|
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
|
||||||
|
(!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
|
||||||
|
// without main extensions, the non-secure MSPLIM is RAZ/WI
|
||||||
|
#define __set_MSPLIM(VALUE) ((void)(VALUE))
|
||||||
|
#else
|
||||||
|
#define __set_MSPLIM(VALUE) (__arm_wsr("MSPLIM", (VALUE)))
|
||||||
|
#endif
|
||||||
|
#define __set_PRIMASK(VALUE) (__arm_wsr("PRIMASK", (VALUE)))
|
||||||
|
#define __set_PSP(VALUE) (__arm_wsr("PSP", (VALUE)))
|
||||||
|
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
|
||||||
|
(!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
|
||||||
|
// without main extensions, the non-secure PSPLIM is RAZ/WI
|
||||||
|
#define __set_PSPLIM(VALUE) ((void)(VALUE))
|
||||||
|
#else
|
||||||
|
#define __set_PSPLIM(VALUE) (__arm_wsr("PSPLIM", (VALUE)))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define __TZ_get_CONTROL_NS() (__arm_rsr("CONTROL_NS"))
|
||||||
|
#define __TZ_set_CONTROL_NS(VALUE) (__arm_wsr("CONTROL_NS", (VALUE)))
|
||||||
|
#define __TZ_get_PSP_NS() (__arm_rsr("PSP_NS"))
|
||||||
|
#define __TZ_set_PSP_NS(VALUE) (__arm_wsr("PSP_NS", (VALUE)))
|
||||||
|
#define __TZ_get_MSP_NS() (__arm_rsr("MSP_NS"))
|
||||||
|
#define __TZ_set_MSP_NS(VALUE) (__arm_wsr("MSP_NS", (VALUE)))
|
||||||
|
#define __TZ_get_SP_NS() (__arm_rsr("SP_NS"))
|
||||||
|
#define __TZ_set_SP_NS(VALUE) (__arm_wsr("SP_NS", (VALUE)))
|
||||||
|
#define __TZ_get_PRIMASK_NS() (__arm_rsr("PRIMASK_NS"))
|
||||||
|
#define __TZ_set_PRIMASK_NS(VALUE) (__arm_wsr("PRIMASK_NS", (VALUE)))
|
||||||
|
#define __TZ_get_BASEPRI_NS() (__arm_rsr("BASEPRI_NS"))
|
||||||
|
#define __TZ_set_BASEPRI_NS(VALUE) (__arm_wsr("BASEPRI_NS", (VALUE)))
|
||||||
|
#define __TZ_get_FAULTMASK_NS() (__arm_rsr("FAULTMASK_NS"))
|
||||||
|
#define __TZ_set_FAULTMASK_NS(VALUE)(__arm_wsr("FAULTMASK_NS", (VALUE)))
|
||||||
|
|
||||||
|
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
|
||||||
|
(!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
|
||||||
|
// without main extensions, the non-secure PSPLIM is RAZ/WI
|
||||||
|
#define __TZ_get_PSPLIM_NS() (0U)
|
||||||
|
#define __TZ_set_PSPLIM_NS(VALUE) ((void)(VALUE))
|
||||||
|
#else
|
||||||
|
#define __TZ_get_PSPLIM_NS() (__arm_rsr("PSPLIM_NS"))
|
||||||
|
#define __TZ_set_PSPLIM_NS(VALUE) (__arm_wsr("PSPLIM_NS", (VALUE)))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define __TZ_get_MSPLIM_NS() (__arm_rsr("MSPLIM_NS"))
|
||||||
|
#define __TZ_set_MSPLIM_NS(VALUE) (__arm_wsr("MSPLIM_NS", (VALUE)))
|
||||||
|
|
||||||
|
#define __NOP __iar_builtin_no_operation
|
||||||
|
|
||||||
|
#define __CLZ __iar_builtin_CLZ
|
||||||
|
#define __CLREX __iar_builtin_CLREX
|
||||||
|
|
||||||
|
#define __DMB __iar_builtin_DMB
|
||||||
|
#define __DSB __iar_builtin_DSB
|
||||||
|
#define __ISB __iar_builtin_ISB
|
||||||
|
|
||||||
|
#define __LDREXB __iar_builtin_LDREXB
|
||||||
|
#define __LDREXH __iar_builtin_LDREXH
|
||||||
|
#define __LDREXW __iar_builtin_LDREX
|
||||||
|
|
||||||
|
#define __RBIT __iar_builtin_RBIT
|
||||||
|
#define __REV __iar_builtin_REV
|
||||||
|
#define __REV16 __iar_builtin_REV16
|
||||||
|
|
||||||
|
__IAR_FT int16_t __REVSH(int16_t val)
|
||||||
|
{
|
||||||
|
return (int16_t) __iar_builtin_REVSH(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define __ROR __iar_builtin_ROR
|
||||||
|
#define __RRX __iar_builtin_RRX
|
||||||
|
|
||||||
|
#define __SEV __iar_builtin_SEV
|
||||||
|
|
||||||
|
#if !__IAR_M0_FAMILY
|
||||||
|
#define __SSAT __iar_builtin_SSAT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define __STREXB __iar_builtin_STREXB
|
||||||
|
#define __STREXH __iar_builtin_STREXH
|
||||||
|
#define __STREXW __iar_builtin_STREX
|
||||||
|
|
||||||
|
#if !__IAR_M0_FAMILY
|
||||||
|
#define __USAT __iar_builtin_USAT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define __WFE __iar_builtin_WFE
|
||||||
|
#define __WFI __iar_builtin_WFI
|
||||||
|
|
||||||
|
#if __ARM_MEDIA__
|
||||||
|
#define __SADD8 __iar_builtin_SADD8
|
||||||
|
#define __QADD8 __iar_builtin_QADD8
|
||||||
|
#define __SHADD8 __iar_builtin_SHADD8
|
||||||
|
#define __UADD8 __iar_builtin_UADD8
|
||||||
|
#define __UQADD8 __iar_builtin_UQADD8
|
||||||
|
#define __UHADD8 __iar_builtin_UHADD8
|
||||||
|
#define __SSUB8 __iar_builtin_SSUB8
|
||||||
|
#define __QSUB8 __iar_builtin_QSUB8
|
||||||
|
#define __SHSUB8 __iar_builtin_SHSUB8
|
||||||
|
#define __USUB8 __iar_builtin_USUB8
|
||||||
|
#define __UQSUB8 __iar_builtin_UQSUB8
|
||||||
|
#define __UHSUB8 __iar_builtin_UHSUB8
|
||||||
|
#define __SADD16 __iar_builtin_SADD16
|
||||||
|
#define __QADD16 __iar_builtin_QADD16
|
||||||
|
#define __SHADD16 __iar_builtin_SHADD16
|
||||||
|
#define __UADD16 __iar_builtin_UADD16
|
||||||
|
#define __UQADD16 __iar_builtin_UQADD16
|
||||||
|
#define __UHADD16 __iar_builtin_UHADD16
|
||||||
|
#define __SSUB16 __iar_builtin_SSUB16
|
||||||
|
#define __QSUB16 __iar_builtin_QSUB16
|
||||||
|
#define __SHSUB16 __iar_builtin_SHSUB16
|
||||||
|
#define __USUB16 __iar_builtin_USUB16
|
||||||
|
#define __UQSUB16 __iar_builtin_UQSUB16
|
||||||
|
#define __UHSUB16 __iar_builtin_UHSUB16
|
||||||
|
#define __SASX __iar_builtin_SASX
|
||||||
|
#define __QASX __iar_builtin_QASX
|
||||||
|
#define __SHASX __iar_builtin_SHASX
|
||||||
|
#define __UASX __iar_builtin_UASX
|
||||||
|
#define __UQASX __iar_builtin_UQASX
|
||||||
|
#define __UHASX __iar_builtin_UHASX
|
||||||
|
#define __SSAX __iar_builtin_SSAX
|
||||||
|
#define __QSAX __iar_builtin_QSAX
|
||||||
|
#define __SHSAX __iar_builtin_SHSAX
|
||||||
|
#define __USAX __iar_builtin_USAX
|
||||||
|
#define __UQSAX __iar_builtin_UQSAX
|
||||||
|
#define __UHSAX __iar_builtin_UHSAX
|
||||||
|
#define __USAD8 __iar_builtin_USAD8
|
||||||
|
#define __USADA8 __iar_builtin_USADA8
|
||||||
|
#define __SSAT16 __iar_builtin_SSAT16
|
||||||
|
#define __USAT16 __iar_builtin_USAT16
|
||||||
|
#define __UXTB16 __iar_builtin_UXTB16
|
||||||
|
#define __UXTAB16 __iar_builtin_UXTAB16
|
||||||
|
#define __SXTB16 __iar_builtin_SXTB16
|
||||||
|
#define __SXTAB16 __iar_builtin_SXTAB16
|
||||||
|
#define __SMUAD __iar_builtin_SMUAD
|
||||||
|
#define __SMUADX __iar_builtin_SMUADX
|
||||||
|
#define __SMMLA __iar_builtin_SMMLA
|
||||||
|
#define __SMLAD __iar_builtin_SMLAD
|
||||||
|
#define __SMLADX __iar_builtin_SMLADX
|
||||||
|
#define __SMLALD __iar_builtin_SMLALD
|
||||||
|
#define __SMLALDX __iar_builtin_SMLALDX
|
||||||
|
#define __SMUSD __iar_builtin_SMUSD
|
||||||
|
#define __SMUSDX __iar_builtin_SMUSDX
|
||||||
|
#define __SMLSD __iar_builtin_SMLSD
|
||||||
|
#define __SMLSDX __iar_builtin_SMLSDX
|
||||||
|
#define __SMLSLD __iar_builtin_SMLSLD
|
||||||
|
#define __SMLSLDX __iar_builtin_SMLSLDX
|
||||||
|
#define __SEL __iar_builtin_SEL
|
||||||
|
#define __QADD __iar_builtin_QADD
|
||||||
|
#define __QSUB __iar_builtin_QSUB
|
||||||
|
#define __PKHBT __iar_builtin_PKHBT
|
||||||
|
#define __PKHTB __iar_builtin_PKHTB
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else /* __ICCARM_INTRINSICS_VERSION__ == 2 */
|
||||||
|
|
||||||
|
#if __IAR_M0_FAMILY
|
||||||
|
/* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */
|
||||||
|
#define __CLZ __cmsis_iar_clz_not_active
|
||||||
|
#define __SSAT __cmsis_iar_ssat_not_active
|
||||||
|
#define __USAT __cmsis_iar_usat_not_active
|
||||||
|
#define __RBIT __cmsis_iar_rbit_not_active
|
||||||
|
#define __get_APSR __cmsis_iar_get_APSR_not_active
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
|
||||||
|
(defined (__FPU_USED ) && (__FPU_USED == 1U)) ))
|
||||||
|
#define __get_FPSCR __cmsis_iar_get_FPSR_not_active
|
||||||
|
#define __set_FPSCR __cmsis_iar_set_FPSR_not_active
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __INTRINSICS_INCLUDED
|
||||||
|
#error intrinsics.h is already included previously!
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <intrinsics.h>
|
||||||
|
|
||||||
|
#if __IAR_M0_FAMILY
|
||||||
|
/* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */
|
||||||
|
#undef __CLZ
|
||||||
|
#undef __SSAT
|
||||||
|
#undef __USAT
|
||||||
|
#undef __RBIT
|
||||||
|
#undef __get_APSR
|
||||||
|
|
||||||
|
__STATIC_INLINE uint8_t __CLZ(uint32_t data)
|
||||||
|
{
|
||||||
|
if (data == 0U) { return 32U; }
|
||||||
|
|
||||||
|
uint32_t count = 0U;
|
||||||
|
uint32_t mask = 0x80000000U;
|
||||||
|
|
||||||
|
while ((data & mask) == 0U)
|
||||||
|
{
|
||||||
|
count += 1U;
|
||||||
|
mask = mask >> 1U;
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE uint32_t __RBIT(uint32_t v)
|
||||||
|
{
|
||||||
|
uint8_t sc = 31U;
|
||||||
|
uint32_t r = v;
|
||||||
|
for (v >>= 1U; v; v >>= 1U)
|
||||||
|
{
|
||||||
|
r <<= 1U;
|
||||||
|
r |= v & 1U;
|
||||||
|
sc--;
|
||||||
|
}
|
||||||
|
return (r << sc);
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE uint32_t __get_APSR(void)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__asm("MRS %0,APSR" : "=r" (res));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
|
||||||
|
(defined (__FPU_USED ) && (__FPU_USED == 1U)) ))
|
||||||
|
#undef __get_FPSCR
|
||||||
|
#undef __set_FPSCR
|
||||||
|
#define __get_FPSCR() (0)
|
||||||
|
#define __set_FPSCR(VALUE) ((void)VALUE)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#pragma diag_suppress=Pe940
|
||||||
|
#pragma diag_suppress=Pe177
|
||||||
|
|
||||||
|
#define __enable_irq __enable_interrupt
|
||||||
|
#define __disable_irq __disable_interrupt
|
||||||
|
#define __NOP __no_operation
|
||||||
|
|
||||||
|
#define __get_xPSR __get_PSR
|
||||||
|
|
||||||
|
#if (!defined(__ARM_ARCH_6M__) || __ARM_ARCH_6M__==0)
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __LDREXW(uint32_t volatile *ptr)
|
||||||
|
{
|
||||||
|
return __LDREX((unsigned long *)ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __STREXW(uint32_t value, uint32_t volatile *ptr)
|
||||||
|
{
|
||||||
|
return __STREX(value, (unsigned long *)ptr);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */
|
||||||
|
#if (__CORTEX_M >= 0x03)
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __RRX(uint32_t value)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
__ASM("RRX %0, %1" : "=r"(result) : "r" (value) : "cc");
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __set_BASEPRI_MAX(uint32_t value)
|
||||||
|
{
|
||||||
|
__asm volatile("MSR BASEPRI_MAX,%0"::"r" (value));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define __enable_fault_irq __enable_fiq
|
||||||
|
#define __disable_fault_irq __disable_fiq
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* (__CORTEX_M >= 0x03) */
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __ROR(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
return (op1 >> op2) | (op1 << ((sizeof(op1)*8)-op2));
|
||||||
|
}
|
||||||
|
|
||||||
|
#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
|
||||||
|
(defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) )
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __get_MSPLIM(void)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
|
||||||
|
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
|
||||||
|
// without main extensions, the non-secure MSPLIM is RAZ/WI
|
||||||
|
res = 0U;
|
||||||
|
#else
|
||||||
|
__asm volatile("MRS %0,MSPLIM" : "=r" (res));
|
||||||
|
#endif
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __set_MSPLIM(uint32_t value)
|
||||||
|
{
|
||||||
|
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
|
||||||
|
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
|
||||||
|
// without main extensions, the non-secure MSPLIM is RAZ/WI
|
||||||
|
(void)value;
|
||||||
|
#else
|
||||||
|
__asm volatile("MSR MSPLIM,%0" :: "r" (value));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __get_PSPLIM(void)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
|
||||||
|
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
|
||||||
|
// without main extensions, the non-secure PSPLIM is RAZ/WI
|
||||||
|
res = 0U;
|
||||||
|
#else
|
||||||
|
__asm volatile("MRS %0,PSPLIM" : "=r" (res));
|
||||||
|
#endif
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __set_PSPLIM(uint32_t value)
|
||||||
|
{
|
||||||
|
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
|
||||||
|
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
|
||||||
|
// without main extensions, the non-secure PSPLIM is RAZ/WI
|
||||||
|
(void)value;
|
||||||
|
#else
|
||||||
|
__asm volatile("MSR PSPLIM,%0" :: "r" (value));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __TZ_get_CONTROL_NS(void)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__asm volatile("MRS %0,CONTROL_NS" : "=r" (res));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __TZ_set_CONTROL_NS(uint32_t value)
|
||||||
|
{
|
||||||
|
__asm volatile("MSR CONTROL_NS,%0" :: "r" (value));
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __TZ_get_PSP_NS(void)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__asm volatile("MRS %0,PSP_NS" : "=r" (res));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __TZ_set_PSP_NS(uint32_t value)
|
||||||
|
{
|
||||||
|
__asm volatile("MSR PSP_NS,%0" :: "r" (value));
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __TZ_get_MSP_NS(void)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__asm volatile("MRS %0,MSP_NS" : "=r" (res));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __TZ_set_MSP_NS(uint32_t value)
|
||||||
|
{
|
||||||
|
__asm volatile("MSR MSP_NS,%0" :: "r" (value));
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __TZ_get_SP_NS(void)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__asm volatile("MRS %0,SP_NS" : "=r" (res));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
__IAR_FT void __TZ_set_SP_NS(uint32_t value)
|
||||||
|
{
|
||||||
|
__asm volatile("MSR SP_NS,%0" :: "r" (value));
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __TZ_get_PRIMASK_NS(void)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__asm volatile("MRS %0,PRIMASK_NS" : "=r" (res));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __TZ_set_PRIMASK_NS(uint32_t value)
|
||||||
|
{
|
||||||
|
__asm volatile("MSR PRIMASK_NS,%0" :: "r" (value));
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __TZ_get_BASEPRI_NS(void)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__asm volatile("MRS %0,BASEPRI_NS" : "=r" (res));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __TZ_set_BASEPRI_NS(uint32_t value)
|
||||||
|
{
|
||||||
|
__asm volatile("MSR BASEPRI_NS,%0" :: "r" (value));
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __TZ_get_FAULTMASK_NS(void)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__asm volatile("MRS %0,FAULTMASK_NS" : "=r" (res));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __TZ_set_FAULTMASK_NS(uint32_t value)
|
||||||
|
{
|
||||||
|
__asm volatile("MSR FAULTMASK_NS,%0" :: "r" (value));
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __TZ_get_PSPLIM_NS(void)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
|
||||||
|
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
|
||||||
|
// without main extensions, the non-secure PSPLIM is RAZ/WI
|
||||||
|
res = 0U;
|
||||||
|
#else
|
||||||
|
__asm volatile("MRS %0,PSPLIM_NS" : "=r" (res));
|
||||||
|
#endif
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __TZ_set_PSPLIM_NS(uint32_t value)
|
||||||
|
{
|
||||||
|
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
|
||||||
|
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
|
||||||
|
// without main extensions, the non-secure PSPLIM is RAZ/WI
|
||||||
|
(void)value;
|
||||||
|
#else
|
||||||
|
__asm volatile("MSR PSPLIM_NS,%0" :: "r" (value));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __TZ_get_MSPLIM_NS(void)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__asm volatile("MRS %0,MSPLIM_NS" : "=r" (res));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __TZ_set_MSPLIM_NS(uint32_t value)
|
||||||
|
{
|
||||||
|
__asm volatile("MSR MSPLIM_NS,%0" :: "r" (value));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */
|
||||||
|
|
||||||
|
#endif /* __ICCARM_INTRINSICS_VERSION__ == 2 */
|
||||||
|
|
||||||
|
#define __BKPT(value) __asm volatile ("BKPT %0" : : "i"(value))
|
||||||
|
|
||||||
|
#if __IAR_M0_FAMILY
|
||||||
|
__STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat)
|
||||||
|
{
|
||||||
|
if ((sat >= 1U) && (sat <= 32U))
|
||||||
|
{
|
||||||
|
const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U);
|
||||||
|
const int32_t min = -1 - max ;
|
||||||
|
if (val > max)
|
||||||
|
{
|
||||||
|
return max;
|
||||||
|
}
|
||||||
|
else if (val < min)
|
||||||
|
{
|
||||||
|
return min;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat)
|
||||||
|
{
|
||||||
|
if (sat <= 31U)
|
||||||
|
{
|
||||||
|
const uint32_t max = ((1U << sat) - 1U);
|
||||||
|
if (val > (int32_t)max)
|
||||||
|
{
|
||||||
|
return max;
|
||||||
|
}
|
||||||
|
else if (val < 0)
|
||||||
|
{
|
||||||
|
return 0U;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (uint32_t)val;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (__CORTEX_M >= 0x03) /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */
|
||||||
|
|
||||||
|
__IAR_FT uint8_t __LDRBT(volatile uint8_t *addr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__ASM("LDRBT %0, [%1]" : "=r" (res) : "r" (addr) : "memory");
|
||||||
|
return ((uint8_t)res);
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint16_t __LDRHT(volatile uint16_t *addr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__ASM("LDRHT %0, [%1]" : "=r" (res) : "r" (addr) : "memory");
|
||||||
|
return ((uint16_t)res);
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __LDRT(volatile uint32_t *addr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__ASM("LDRT %0, [%1]" : "=r" (res) : "r" (addr) : "memory");
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __STRBT(uint8_t value, volatile uint8_t *addr)
|
||||||
|
{
|
||||||
|
__ASM("STRBT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __STRHT(uint16_t value, volatile uint16_t *addr)
|
||||||
|
{
|
||||||
|
__ASM("STRHT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __STRT(uint32_t value, volatile uint32_t *addr)
|
||||||
|
{
|
||||||
|
__ASM("STRT %1, [%0]" : : "r" (addr), "r" (value) : "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* (__CORTEX_M >= 0x03) */
|
||||||
|
|
||||||
|
#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
|
||||||
|
(defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) )
|
||||||
|
|
||||||
|
|
||||||
|
__IAR_FT uint8_t __LDAB(volatile uint8_t *ptr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__ASM volatile ("LDAB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory");
|
||||||
|
return ((uint8_t)res);
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint16_t __LDAH(volatile uint16_t *ptr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__ASM volatile ("LDAH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory");
|
||||||
|
return ((uint16_t)res);
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __LDA(volatile uint32_t *ptr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__ASM volatile ("LDA %0, [%1]" : "=r" (res) : "r" (ptr) : "memory");
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __STLB(uint8_t value, volatile uint8_t *ptr)
|
||||||
|
{
|
||||||
|
__ASM volatile ("STLB %1, [%0]" :: "r" (ptr), "r" (value) : "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __STLH(uint16_t value, volatile uint16_t *ptr)
|
||||||
|
{
|
||||||
|
__ASM volatile ("STLH %1, [%0]" :: "r" (ptr), "r" (value) : "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __STL(uint32_t value, volatile uint32_t *ptr)
|
||||||
|
{
|
||||||
|
__ASM volatile ("STL %1, [%0]" :: "r" (ptr), "r" (value) : "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint8_t __LDAEXB(volatile uint8_t *ptr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__ASM volatile ("LDAEXB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory");
|
||||||
|
return ((uint8_t)res);
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint16_t __LDAEXH(volatile uint16_t *ptr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__ASM volatile ("LDAEXH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory");
|
||||||
|
return ((uint16_t)res);
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __LDAEX(volatile uint32_t *ptr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__ASM volatile ("LDAEX %0, [%1]" : "=r" (res) : "r" (ptr) : "memory");
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__ASM volatile ("STLEXB %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory");
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__ASM volatile ("STLEXH %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory");
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__ASM volatile ("STLEX %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory");
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */
|
||||||
|
|
||||||
|
#undef __IAR_FT
|
||||||
|
#undef __IAR_M0_FAMILY
|
||||||
|
#undef __ICCARM_V8
|
||||||
|
|
||||||
|
#pragma diag_default=Pe940
|
||||||
|
#pragma diag_default=Pe177
|
||||||
|
|
||||||
|
#endif /* __CMSIS_ICCARM_H__ */
|
||||||
|
|
@ -0,0 +1,39 @@
|
||||||
|
/**************************************************************************//**
|
||||||
|
* @file cmsis_version.h
|
||||||
|
* @brief CMSIS Core(M) Version definitions
|
||||||
|
* @version V5.0.3
|
||||||
|
* @date 24. June 2019
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2009-2019 ARM Limited. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined ( __ICCARM__ )
|
||||||
|
#pragma system_include /* treat file as system include file for MISRA check */
|
||||||
|
#elif defined (__clang__)
|
||||||
|
#pragma clang system_header /* treat file as system include file */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __CMSIS_VERSION_H
|
||||||
|
#define __CMSIS_VERSION_H
|
||||||
|
|
||||||
|
/* CMSIS Version definitions */
|
||||||
|
#define __CM_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS Core(M) main version */
|
||||||
|
#define __CM_CMSIS_VERSION_SUB ( 3U) /*!< [15:0] CMSIS Core(M) sub version */
|
||||||
|
#define __CM_CMSIS_VERSION ((__CM_CMSIS_VERSION_MAIN << 16U) | \
|
||||||
|
__CM_CMSIS_VERSION_SUB ) /*!< CMSIS Core(M) version number */
|
||||||
|
#endif
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,346 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* @file mpu_armv8.h
|
||||||
|
* @brief CMSIS MPU API for Armv8-M and Armv8.1-M MPU
|
||||||
|
* @version V5.1.0
|
||||||
|
* @date 08. March 2019
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017-2019 Arm Limited. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined ( __ICCARM__ )
|
||||||
|
#pragma system_include /* treat file as system include file for MISRA check */
|
||||||
|
#elif defined (__clang__)
|
||||||
|
#pragma clang system_header /* treat file as system include file */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ARM_MPU_ARMV8_H
|
||||||
|
#define ARM_MPU_ARMV8_H
|
||||||
|
|
||||||
|
/** \brief Attribute for device memory (outer only) */
|
||||||
|
#define ARM_MPU_ATTR_DEVICE ( 0U )
|
||||||
|
|
||||||
|
/** \brief Attribute for non-cacheable, normal memory */
|
||||||
|
#define ARM_MPU_ATTR_NON_CACHEABLE ( 4U )
|
||||||
|
|
||||||
|
/** \brief Attribute for normal memory (outer and inner)
|
||||||
|
* \param NT Non-Transient: Set to 1 for non-transient data.
|
||||||
|
* \param WB Write-Back: Set to 1 to use write-back update policy.
|
||||||
|
* \param RA Read Allocation: Set to 1 to use cache allocation on read miss.
|
||||||
|
* \param WA Write Allocation: Set to 1 to use cache allocation on write miss.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_ATTR_MEMORY_(NT, WB, RA, WA) \
|
||||||
|
(((NT & 1U) << 3U) | ((WB & 1U) << 2U) | ((RA & 1U) << 1U) | (WA & 1U))
|
||||||
|
|
||||||
|
/** \brief Device memory type non Gathering, non Re-ordering, non Early Write Acknowledgement */
|
||||||
|
#define ARM_MPU_ATTR_DEVICE_nGnRnE (0U)
|
||||||
|
|
||||||
|
/** \brief Device memory type non Gathering, non Re-ordering, Early Write Acknowledgement */
|
||||||
|
#define ARM_MPU_ATTR_DEVICE_nGnRE (1U)
|
||||||
|
|
||||||
|
/** \brief Device memory type non Gathering, Re-ordering, Early Write Acknowledgement */
|
||||||
|
#define ARM_MPU_ATTR_DEVICE_nGRE (2U)
|
||||||
|
|
||||||
|
/** \brief Device memory type Gathering, Re-ordering, Early Write Acknowledgement */
|
||||||
|
#define ARM_MPU_ATTR_DEVICE_GRE (3U)
|
||||||
|
|
||||||
|
/** \brief Memory Attribute
|
||||||
|
* \param O Outer memory attributes
|
||||||
|
* \param I O == ARM_MPU_ATTR_DEVICE: Device memory attributes, else: Inner memory attributes
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_ATTR(O, I) (((O & 0xFU) << 4U) | (((O & 0xFU) != 0U) ? (I & 0xFU) : ((I & 0x3U) << 2U)))
|
||||||
|
|
||||||
|
/** \brief Normal memory non-shareable */
|
||||||
|
#define ARM_MPU_SH_NON (0U)
|
||||||
|
|
||||||
|
/** \brief Normal memory outer shareable */
|
||||||
|
#define ARM_MPU_SH_OUTER (2U)
|
||||||
|
|
||||||
|
/** \brief Normal memory inner shareable */
|
||||||
|
#define ARM_MPU_SH_INNER (3U)
|
||||||
|
|
||||||
|
/** \brief Memory access permissions
|
||||||
|
* \param RO Read-Only: Set to 1 for read-only memory.
|
||||||
|
* \param NP Non-Privileged: Set to 1 for non-privileged memory.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_AP_(RO, NP) (((RO & 1U) << 1U) | (NP & 1U))
|
||||||
|
|
||||||
|
/** \brief Region Base Address Register value
|
||||||
|
* \param BASE The base address bits [31:5] of a memory region. The value is zero extended. Effective address gets 32 byte aligned.
|
||||||
|
* \param SH Defines the Shareability domain for this memory region.
|
||||||
|
* \param RO Read-Only: Set to 1 for a read-only memory region.
|
||||||
|
* \param NP Non-Privileged: Set to 1 for a non-privileged memory region.
|
||||||
|
* \oaram XN eXecute Never: Set to 1 for a non-executable memory region.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_RBAR(BASE, SH, RO, NP, XN) \
|
||||||
|
((BASE & MPU_RBAR_BASE_Msk) | \
|
||||||
|
((SH << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk) | \
|
||||||
|
((ARM_MPU_AP_(RO, NP) << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) | \
|
||||||
|
((XN << MPU_RBAR_XN_Pos) & MPU_RBAR_XN_Msk))
|
||||||
|
|
||||||
|
/** \brief Region Limit Address Register value
|
||||||
|
* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended.
|
||||||
|
* \param IDX The attribute index to be associated with this memory region.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_RLAR(LIMIT, IDX) \
|
||||||
|
((LIMIT & MPU_RLAR_LIMIT_Msk) | \
|
||||||
|
((IDX << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \
|
||||||
|
(MPU_RLAR_EN_Msk))
|
||||||
|
|
||||||
|
#if defined(MPU_RLAR_PXN_Pos)
|
||||||
|
|
||||||
|
/** \brief Region Limit Address Register with PXN value
|
||||||
|
* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended.
|
||||||
|
* \param PXN Privileged execute never. Defines whether code can be executed from this privileged region.
|
||||||
|
* \param IDX The attribute index to be associated with this memory region.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_RLAR_PXN(LIMIT, PXN, IDX) \
|
||||||
|
((LIMIT & MPU_RLAR_LIMIT_Msk) | \
|
||||||
|
((PXN << MPU_RLAR_PXN_Pos) & MPU_RLAR_PXN_Msk) | \
|
||||||
|
((IDX << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \
|
||||||
|
(MPU_RLAR_EN_Msk))
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Struct for a single MPU Region
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
uint32_t RBAR; /*!< Region Base Address Register value */
|
||||||
|
uint32_t RLAR; /*!< Region Limit Address Register value */
|
||||||
|
} ARM_MPU_Region_t;
|
||||||
|
|
||||||
|
/** Enable the MPU.
|
||||||
|
* \param MPU_Control Default access permissions for unconfigured regions.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control)
|
||||||
|
{
|
||||||
|
MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk;
|
||||||
|
#ifdef SCB_SHCSR_MEMFAULTENA_Msk
|
||||||
|
SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;
|
||||||
|
#endif
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Disable the MPU.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_Disable(void)
|
||||||
|
{
|
||||||
|
__DMB();
|
||||||
|
#ifdef SCB_SHCSR_MEMFAULTENA_Msk
|
||||||
|
SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk;
|
||||||
|
#endif
|
||||||
|
MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MPU_NS
|
||||||
|
/** Enable the Non-secure MPU.
|
||||||
|
* \param MPU_Control Default access permissions for unconfigured regions.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_Enable_NS(uint32_t MPU_Control)
|
||||||
|
{
|
||||||
|
MPU_NS->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk;
|
||||||
|
#ifdef SCB_SHCSR_MEMFAULTENA_Msk
|
||||||
|
SCB_NS->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;
|
||||||
|
#endif
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Disable the Non-secure MPU.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_Disable_NS(void)
|
||||||
|
{
|
||||||
|
__DMB();
|
||||||
|
#ifdef SCB_SHCSR_MEMFAULTENA_Msk
|
||||||
|
SCB_NS->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk;
|
||||||
|
#endif
|
||||||
|
MPU_NS->CTRL &= ~MPU_CTRL_ENABLE_Msk;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Set the memory attribute encoding to the given MPU.
|
||||||
|
* \param mpu Pointer to the MPU to be configured.
|
||||||
|
* \param idx The attribute index to be set [0-7]
|
||||||
|
* \param attr The attribute value to be set.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_SetMemAttrEx(MPU_Type* mpu, uint8_t idx, uint8_t attr)
|
||||||
|
{
|
||||||
|
const uint8_t reg = idx / 4U;
|
||||||
|
const uint32_t pos = ((idx % 4U) * 8U);
|
||||||
|
const uint32_t mask = 0xFFU << pos;
|
||||||
|
|
||||||
|
if (reg >= (sizeof(mpu->MAIR) / sizeof(mpu->MAIR[0]))) {
|
||||||
|
return; // invalid index
|
||||||
|
}
|
||||||
|
|
||||||
|
mpu->MAIR[reg] = ((mpu->MAIR[reg] & ~mask) | ((attr << pos) & mask));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Set the memory attribute encoding.
|
||||||
|
* \param idx The attribute index to be set [0-7]
|
||||||
|
* \param attr The attribute value to be set.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_SetMemAttr(uint8_t idx, uint8_t attr)
|
||||||
|
{
|
||||||
|
ARM_MPU_SetMemAttrEx(MPU, idx, attr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MPU_NS
|
||||||
|
/** Set the memory attribute encoding to the Non-secure MPU.
|
||||||
|
* \param idx The attribute index to be set [0-7]
|
||||||
|
* \param attr The attribute value to be set.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_SetMemAttr_NS(uint8_t idx, uint8_t attr)
|
||||||
|
{
|
||||||
|
ARM_MPU_SetMemAttrEx(MPU_NS, idx, attr);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Clear and disable the given MPU region of the given MPU.
|
||||||
|
* \param mpu Pointer to MPU to be used.
|
||||||
|
* \param rnr Region number to be cleared.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_ClrRegionEx(MPU_Type* mpu, uint32_t rnr)
|
||||||
|
{
|
||||||
|
mpu->RNR = rnr;
|
||||||
|
mpu->RLAR = 0U;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Clear and disable the given MPU region.
|
||||||
|
* \param rnr Region number to be cleared.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr)
|
||||||
|
{
|
||||||
|
ARM_MPU_ClrRegionEx(MPU, rnr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MPU_NS
|
||||||
|
/** Clear and disable the given Non-secure MPU region.
|
||||||
|
* \param rnr Region number to be cleared.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_ClrRegion_NS(uint32_t rnr)
|
||||||
|
{
|
||||||
|
ARM_MPU_ClrRegionEx(MPU_NS, rnr);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Configure the given MPU region of the given MPU.
|
||||||
|
* \param mpu Pointer to MPU to be used.
|
||||||
|
* \param rnr Region number to be configured.
|
||||||
|
* \param rbar Value for RBAR register.
|
||||||
|
* \param rlar Value for RLAR register.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_SetRegionEx(MPU_Type* mpu, uint32_t rnr, uint32_t rbar, uint32_t rlar)
|
||||||
|
{
|
||||||
|
mpu->RNR = rnr;
|
||||||
|
mpu->RBAR = rbar;
|
||||||
|
mpu->RLAR = rlar;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Configure the given MPU region.
|
||||||
|
* \param rnr Region number to be configured.
|
||||||
|
* \param rbar Value for RBAR register.
|
||||||
|
* \param rlar Value for RLAR register.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rnr, uint32_t rbar, uint32_t rlar)
|
||||||
|
{
|
||||||
|
ARM_MPU_SetRegionEx(MPU, rnr, rbar, rlar);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MPU_NS
|
||||||
|
/** Configure the given Non-secure MPU region.
|
||||||
|
* \param rnr Region number to be configured.
|
||||||
|
* \param rbar Value for RBAR register.
|
||||||
|
* \param rlar Value for RLAR register.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_SetRegion_NS(uint32_t rnr, uint32_t rbar, uint32_t rlar)
|
||||||
|
{
|
||||||
|
ARM_MPU_SetRegionEx(MPU_NS, rnr, rbar, rlar);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Memcopy with strictly ordered memory access, e.g. for register targets.
|
||||||
|
* \param dst Destination data is copied to.
|
||||||
|
* \param src Source data is copied from.
|
||||||
|
* \param len Amount of data words to be copied.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_OrderedMemcpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
for (i = 0U; i < len; ++i)
|
||||||
|
{
|
||||||
|
dst[i] = src[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Load the given number of MPU regions from a table to the given MPU.
|
||||||
|
* \param mpu Pointer to the MPU registers to be used.
|
||||||
|
* \param rnr First region number to be configured.
|
||||||
|
* \param table Pointer to the MPU configuration table.
|
||||||
|
* \param cnt Amount of regions to be configured.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_LoadEx(MPU_Type* mpu, uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt)
|
||||||
|
{
|
||||||
|
const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U;
|
||||||
|
if (cnt == 1U) {
|
||||||
|
mpu->RNR = rnr;
|
||||||
|
ARM_MPU_OrderedMemcpy(&(mpu->RBAR), &(table->RBAR), rowWordSize);
|
||||||
|
} else {
|
||||||
|
uint32_t rnrBase = rnr & ~(MPU_TYPE_RALIASES-1U);
|
||||||
|
uint32_t rnrOffset = rnr % MPU_TYPE_RALIASES;
|
||||||
|
|
||||||
|
mpu->RNR = rnrBase;
|
||||||
|
while ((rnrOffset + cnt) > MPU_TYPE_RALIASES) {
|
||||||
|
uint32_t c = MPU_TYPE_RALIASES - rnrOffset;
|
||||||
|
ARM_MPU_OrderedMemcpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), c*rowWordSize);
|
||||||
|
table += c;
|
||||||
|
cnt -= c;
|
||||||
|
rnrOffset = 0U;
|
||||||
|
rnrBase += MPU_TYPE_RALIASES;
|
||||||
|
mpu->RNR = rnrBase;
|
||||||
|
}
|
||||||
|
|
||||||
|
ARM_MPU_OrderedMemcpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), cnt*rowWordSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Load the given number of MPU regions from a table.
|
||||||
|
* \param rnr First region number to be configured.
|
||||||
|
* \param table Pointer to the MPU configuration table.
|
||||||
|
* \param cnt Amount of regions to be configured.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_Load(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt)
|
||||||
|
{
|
||||||
|
ARM_MPU_LoadEx(MPU, rnr, table, cnt);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MPU_NS
|
||||||
|
/** Load the given number of MPU regions from a table to the Non-secure MPU.
|
||||||
|
* \param rnr First region number to be configured.
|
||||||
|
* \param table Pointer to the MPU configuration table.
|
||||||
|
* \param cnt Amount of regions to be configured.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_Load_NS(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt)
|
||||||
|
{
|
||||||
|
ARM_MPU_LoadEx(MPU_NS, rnr, table, cnt);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
@ -0,0 +1,70 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* @file tz_context.h
|
||||||
|
* @brief Context Management for Armv8-M TrustZone
|
||||||
|
* @version V1.0.1
|
||||||
|
* @date 10. January 2018
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017-2018 Arm Limited. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined ( __ICCARM__ )
|
||||||
|
#pragma system_include /* treat file as system include file for MISRA check */
|
||||||
|
#elif defined (__clang__)
|
||||||
|
#pragma clang system_header /* treat file as system include file */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TZ_CONTEXT_H
|
||||||
|
#define TZ_CONTEXT_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifndef TZ_MODULEID_T
|
||||||
|
#define TZ_MODULEID_T
|
||||||
|
/// \details Data type that identifies secure software modules called by a process.
|
||||||
|
typedef uint32_t TZ_ModuleId_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/// \details TZ Memory ID identifies an allocated memory slot.
|
||||||
|
typedef uint32_t TZ_MemoryId_t;
|
||||||
|
|
||||||
|
/// Initialize secure context memory system
|
||||||
|
/// \return execution status (1: success, 0: error)
|
||||||
|
uint32_t TZ_InitContextSystem_S (void);
|
||||||
|
|
||||||
|
/// Allocate context memory for calling secure software modules in TrustZone
|
||||||
|
/// \param[in] module identifies software modules called from non-secure mode
|
||||||
|
/// \return value != 0 id TrustZone memory slot identifier
|
||||||
|
/// \return value 0 no memory available or internal error
|
||||||
|
TZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module);
|
||||||
|
|
||||||
|
/// Free context memory that was previously allocated with \ref TZ_AllocModuleContext_S
|
||||||
|
/// \param[in] id TrustZone memory slot identifier
|
||||||
|
/// \return execution status (1: success, 0: error)
|
||||||
|
uint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id);
|
||||||
|
|
||||||
|
/// Load secure context (called on RTOS thread context switch)
|
||||||
|
/// \param[in] id TrustZone memory slot identifier
|
||||||
|
/// \return execution status (1: success, 0: error)
|
||||||
|
uint32_t TZ_LoadContext_S (TZ_MemoryId_t id);
|
||||||
|
|
||||||
|
/// Store secure context (called on RTOS thread context switch)
|
||||||
|
/// \param[in] id TrustZone memory slot identifier
|
||||||
|
/// \return execution status (1: success, 0: error)
|
||||||
|
uint32_t TZ_StoreContext_S (TZ_MemoryId_t id);
|
||||||
|
|
||||||
|
#endif // TZ_CONTEXT_H
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016, Freescale Semiconductor, Inc.
|
||||||
|
* Copyright 2016, NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
#include "fsl_common.h"
|
||||||
|
#include "fsl_power.h"
|
||||||
|
/* Component ID definition, used by tools. */
|
||||||
|
#ifndef FSL_COMPONENT_ID
|
||||||
|
#define FSL_COMPONENT_ID "platform.drivers.power"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/* Empty file since implementation is in header file and power library */
|
||||||
|
|
@ -0,0 +1,626 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017, NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
#ifndef _FSL_POWER_H_
|
||||||
|
#define _FSL_POWER_H_
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
#include "fsl_device_registers.h"
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @addtogroup power
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/*! @name Driver version */
|
||||||
|
/*@{*/
|
||||||
|
/*! @brief power driver version 1.0.0. */
|
||||||
|
#define FSL_POWER_DRIVER_VERSION (MAKE_VERSION(1, 0, 0))
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
/* Power mode configuration API parameter */
|
||||||
|
typedef enum _power_mode_config
|
||||||
|
{
|
||||||
|
kPmu_Sleep = 0U,
|
||||||
|
kPmu_Deep_Sleep = 1U,
|
||||||
|
kPmu_PowerDown = 2U,
|
||||||
|
kPmu_Deep_PowerDown = 3U,
|
||||||
|
} power_mode_cfg_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Analog components power modes control during low power modes
|
||||||
|
*/
|
||||||
|
typedef enum pd_bits
|
||||||
|
{
|
||||||
|
kPDRUNCFG_PD_DCDC = (1UL << 0),
|
||||||
|
kPDRUNCFG_PD_BIAS = (1UL << 1),
|
||||||
|
kPDRUNCFG_PD_BODCORE = (1UL << 2),
|
||||||
|
kPDRUNCFG_PD_BODVBAT = (1UL << 3),
|
||||||
|
kPDRUNCFG_PD_FRO1M = (1UL << 4),
|
||||||
|
kPDRUNCFG_PD_FRO192M = (1UL << 5),
|
||||||
|
kPDRUNCFG_PD_FRO32K = (1UL << 6),
|
||||||
|
kPDRUNCFG_PD_XTAL32K = (1UL << 7),
|
||||||
|
kPDRUNCFG_PD_XTAL32M = (1UL << 8),
|
||||||
|
kPDRUNCFG_PD_PLL0 = (1UL << 9),
|
||||||
|
kPDRUNCFG_PD_PLL1 = (1UL << 10),
|
||||||
|
kPDRUNCFG_PD_USB0_PHY = (1UL << 11),
|
||||||
|
kPDRUNCFG_PD_USB1_PHY = (1UL << 12),
|
||||||
|
kPDRUNCFG_PD_COMP = (1UL << 13),
|
||||||
|
kPDRUNCFG_PD_TEMPSENS = (1UL << 14),
|
||||||
|
kPDRUNCFG_PD_GPADC = (1UL << 15),
|
||||||
|
kPDRUNCFG_PD_LDOMEM = (1UL << 16),
|
||||||
|
kPDRUNCFG_PD_LDODEEPSLEEP = (1UL << 17),
|
||||||
|
kPDRUNCFG_PD_LDOUSBHS = (1UL << 18),
|
||||||
|
kPDRUNCFG_PD_LDOGPADC = (1UL << 19),
|
||||||
|
kPDRUNCFG_PD_LDOXO32M = (1UL << 20),
|
||||||
|
kPDRUNCFG_PD_LDOFLASHNV = (1UL << 21),
|
||||||
|
kPDRUNCFG_PD_RNG = (1UL << 22),
|
||||||
|
kPDRUNCFG_PD_PLL0_SSCG = (1UL << 23),
|
||||||
|
kPDRUNCFG_PD_ROM = (1UL << 24),
|
||||||
|
/*
|
||||||
|
This enum member has no practical meaning,it is used to avoid MISRA issue,
|
||||||
|
user should not trying to use it.
|
||||||
|
*/
|
||||||
|
kPDRUNCFG_ForceUnsigned = 0x80000000U,
|
||||||
|
} pd_bit_t;
|
||||||
|
|
||||||
|
/*! @brief BOD VBAT level */
|
||||||
|
typedef enum _power_bod_vbat_level
|
||||||
|
{
|
||||||
|
kPOWER_BodVbatLevel1000mv = 0, /*!< Brown out detector VBAT level 1V */
|
||||||
|
kPOWER_BodVbatLevel1100mv = 1, /*!< Brown out detector VBAT level 1.1V */
|
||||||
|
kPOWER_BodVbatLevel1200mv = 2, /*!< Brown out detector VBAT level 1.2V */
|
||||||
|
kPOWER_BodVbatLevel1300mv = 3, /*!< Brown out detector VBAT level 1.3V */
|
||||||
|
kPOWER_BodVbatLevel1400mv = 4, /*!< Brown out detector VBAT level 1.4V */
|
||||||
|
kPOWER_BodVbatLevel1500mv = 5, /*!< Brown out detector VBAT level 1.5V */
|
||||||
|
kPOWER_BodVbatLevel1600mv = 6, /*!< Brown out detector VBAT level 1.6V */
|
||||||
|
kPOWER_BodVbatLevel1650mv = 7, /*!< Brown out detector VBAT level 1.65V */
|
||||||
|
kPOWER_BodVbatLevel1700mv = 8, /*!< Brown out detector VBAT level 1.7V */
|
||||||
|
kPOWER_BodVbatLevel1750mv = 9, /*!< Brown out detector VBAT level 1.75V */
|
||||||
|
kPOWER_BodVbatLevel1800mv = 10, /*!< Brown out detector VBAT level 1.8V */
|
||||||
|
kPOWER_BodVbatLevel1900mv = 11, /*!< Brown out detector VBAT level 1.9V */
|
||||||
|
kPOWER_BodVbatLevel2000mv = 12, /*!< Brown out detector VBAT level 2V */
|
||||||
|
kPOWER_BodVbatLevel2100mv = 13, /*!< Brown out detector VBAT level 2.1V */
|
||||||
|
kPOWER_BodVbatLevel2200mv = 14, /*!< Brown out detector VBAT level 2.2V */
|
||||||
|
kPOWER_BodVbatLevel2300mv = 15, /*!< Brown out detector VBAT level 2.3V */
|
||||||
|
kPOWER_BodVbatLevel2400mv = 16, /*!< Brown out detector VBAT level 2.4V */
|
||||||
|
kPOWER_BodVbatLevel2500mv = 17, /*!< Brown out detector VBAT level 2.5V */
|
||||||
|
kPOWER_BodVbatLevel2600mv = 18, /*!< Brown out detector VBAT level 2.6V */
|
||||||
|
kPOWER_BodVbatLevel2700mv = 19, /*!< Brown out detector VBAT level 2.7V */
|
||||||
|
kPOWER_BodVbatLevel2806mv = 20, /*!< Brown out detector VBAT level 2.806V */
|
||||||
|
kPOWER_BodVbatLevel2900mv = 21, /*!< Brown out detector VBAT level 2.9V */
|
||||||
|
kPOWER_BodVbatLevel3000mv = 22, /*!< Brown out detector VBAT level 3.0V */
|
||||||
|
kPOWER_BodVbatLevel3100mv = 23, /*!< Brown out detector VBAT level 3.1V */
|
||||||
|
kPOWER_BodVbatLevel3200mv = 24, /*!< Brown out detector VBAT level 3.2V */
|
||||||
|
kPOWER_BodVbatLevel3300mv = 25, /*!< Brown out detector VBAT level 3.3V */
|
||||||
|
} power_bod_vbat_level_t;
|
||||||
|
|
||||||
|
/*! @brief BOD Hysteresis control */
|
||||||
|
typedef enum _power_bod_hyst
|
||||||
|
{
|
||||||
|
kPOWER_BodHystLevel25mv = 0U, /*!< BOD Hysteresis control level 25mv */
|
||||||
|
kPOWER_BodHystLevel50mv = 1U, /*!< BOD Hysteresis control level 50mv */
|
||||||
|
kPOWER_BodHystLevel75mv = 2U, /*!< BOD Hysteresis control level 75mv */
|
||||||
|
kPOWER_BodHystLevel100mv = 3U, /*!< BOD Hysteresis control level 100mv */
|
||||||
|
} power_bod_hyst_t;
|
||||||
|
|
||||||
|
/*! @brief BOD core level */
|
||||||
|
typedef enum _power_bod_core_level
|
||||||
|
{
|
||||||
|
kPOWER_BodCoreLevel600mv = 0, /*!< Brown out detector core level 600mV */
|
||||||
|
kPOWER_BodCoreLevel650mv = 1, /*!< Brown out detector core level 650mV */
|
||||||
|
kPOWER_BodCoreLevel700mv = 2, /*!< Brown out detector core level 700mV */
|
||||||
|
kPOWER_BodCoreLevel750mv = 3, /*!< Brown out detector core level 750mV */
|
||||||
|
kPOWER_BodCoreLevel800mv = 4, /*!< Brown out detector core level 800mV */
|
||||||
|
kPOWER_BodCoreLevel850mv = 5, /*!< Brown out detector core level 850mV */
|
||||||
|
kPOWER_BodCoreLevel900mv = 6, /*!< Brown out detector core level 900mV */
|
||||||
|
kPOWER_BodCoreLevel950mv = 7, /*!< Brown out detector core level 950mV */
|
||||||
|
} power_bod_core_level_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Device Reset Causes
|
||||||
|
*/
|
||||||
|
typedef enum _power_device_reset_cause
|
||||||
|
{
|
||||||
|
kRESET_CAUSE_POR = 0UL, /*!< Power On Reset */
|
||||||
|
kRESET_CAUSE_PADRESET = 1UL, /*!< Hardware Pin Reset */
|
||||||
|
kRESET_CAUSE_BODRESET = 2UL, /*!< Brown-out Detector reset (either BODVBAT or BODCORE) */
|
||||||
|
kRESET_CAUSE_ARMSYSTEMRESET = 3UL, /*!< ARM System Reset */
|
||||||
|
kRESET_CAUSE_WDTRESET = 4UL, /*!< Watchdog Timer Reset */
|
||||||
|
kRESET_CAUSE_SWRRESET = 5UL, /*!< Software Reset */
|
||||||
|
kRESET_CAUSE_CDOGRESET = 6UL, /*!< Code Watchdog Reset */
|
||||||
|
/* Reset causes in DEEP-POWER-DOWN low power mode */
|
||||||
|
kRESET_CAUSE_DPDRESET_WAKEUPIO = 7UL, /*!< Any of the 4 wake-up pins */
|
||||||
|
kRESET_CAUSE_DPDRESET_RTC = 8UL, /*!< Real Time Counter (RTC) */
|
||||||
|
kRESET_CAUSE_DPDRESET_OSTIMER = 9UL, /*!< OS Event Timer (OSTIMER) */
|
||||||
|
kRESET_CAUSE_DPDRESET_WAKEUPIO_RTC = 10UL, /*!< Any of the 4 wake-up pins and RTC (it is not possible to distinguish
|
||||||
|
which of these 2 events occured first) */
|
||||||
|
kRESET_CAUSE_DPDRESET_WAKEUPIO_OSTIMER = 11UL, /*!< Any of the 4 wake-up pins and OSTIMER (it is not possible to
|
||||||
|
distinguish which of these 2 events occured first) */
|
||||||
|
kRESET_CAUSE_DPDRESET_RTC_OSTIMER = 12UL, /*!< Real Time Counter or OS Event Timer (it is not possible to
|
||||||
|
distinguish which of these 2 events occured first) */
|
||||||
|
kRESET_CAUSE_DPDRESET_WAKEUPIO_RTC_OSTIMER = 13UL, /*!< Any of the 4 wake-up pins (it is not possible to distinguish
|
||||||
|
which of these 3 events occured first) */
|
||||||
|
/* Miscallenous */
|
||||||
|
kRESET_CAUSE_NOT_RELEVANT =
|
||||||
|
14UL, /*!< No reset cause (for example, this code is used when waking up from DEEP-SLEEP low power mode) */
|
||||||
|
kRESET_CAUSE_NOT_DETERMINISTIC = 15UL, /*!< Unknown Reset Cause. Should be treated like "Hardware Pin Reset" from an
|
||||||
|
application point of view. */
|
||||||
|
} power_device_reset_cause_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Device Boot Modes
|
||||||
|
*/
|
||||||
|
typedef enum _power_device_boot_mode
|
||||||
|
{
|
||||||
|
kBOOT_MODE_POWER_UP =
|
||||||
|
0UL, /*!< All non Low Power Mode wake up (Power On Reset, Pin Reset, BoD Reset, ARM System Reset ... ) */
|
||||||
|
kBOOT_MODE_LP_DEEP_SLEEP = 1UL, /*!< Wake up from DEEP-SLEEP Low Power mode */
|
||||||
|
kBOOT_MODE_LP_POWER_DOWN = 2UL, /*!< Wake up from POWER-DOWN Low Power mode */
|
||||||
|
kBOOT_MODE_LP_DEEP_POWER_DOWN = 4UL, /*!< Wake up from DEEP-POWER-DOWN Low Power mode */
|
||||||
|
} power_device_boot_mode_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SRAM instances retention control during low power modes
|
||||||
|
*/
|
||||||
|
#define LOWPOWER_SRAMRETCTRL_RETEN_RAMX0 \
|
||||||
|
(1UL << 0) /*!< Enable SRAMX_0 retention when entering in Low power modes */
|
||||||
|
#define LOWPOWER_SRAMRETCTRL_RETEN_RAMX1 \
|
||||||
|
(1UL << 1) /*!< Enable SRAMX_1 retention when entering in Low power modes */
|
||||||
|
#define LOWPOWER_SRAMRETCTRL_RETEN_RAMX2 \
|
||||||
|
(1UL << 2) /*!< Enable SRAMX_2 retention when entering in Low power modes */
|
||||||
|
#define LOWPOWER_SRAMRETCTRL_RETEN_RAMX3 \
|
||||||
|
(1UL << 3) /*!< Enable SRAMX_3 retention when entering in Low power modes */
|
||||||
|
#define LOWPOWER_SRAMRETCTRL_RETEN_RAM00 \
|
||||||
|
(1UL << 4) /*!< Enable SRAM0_0 retention when entering in Low power modes */
|
||||||
|
#define LOWPOWER_SRAMRETCTRL_RETEN_RAM01 \
|
||||||
|
(1UL << 5) /*!< Enable SRAM0_1 retention when entering in Low power modes */
|
||||||
|
#define LOWPOWER_SRAMRETCTRL_RETEN_RAM10 \
|
||||||
|
(1UL << 6) /*!< Enable SRAM1_0 retention when entering in Low power modes */
|
||||||
|
#define LOWPOWER_SRAMRETCTRL_RETEN_RAM20 \
|
||||||
|
(1UL << 7) /*!< Enable SRAM2_0 retention when entering in Low power modes */
|
||||||
|
#define LOWPOWER_SRAMRETCTRL_RETEN_RAM30 \
|
||||||
|
(1UL << 8) /*!< Enable SRAM3_0 retention when entering in Low power modes */
|
||||||
|
#define LOWPOWER_SRAMRETCTRL_RETEN_RAM31 \
|
||||||
|
(1UL << 9) /*!< Enable SRAM3_1 retention when entering in Low power modes */
|
||||||
|
#define LOWPOWER_SRAMRETCTRL_RETEN_RAM40 \
|
||||||
|
(1UL << 10) /*!< Enable SRAM4_0 retention when entering in Low power modes */
|
||||||
|
#define LOWPOWER_SRAMRETCTRL_RETEN_RAM41 \
|
||||||
|
(1UL << 11) /*!< Enable SRAM4_1 retention when entering in Low power modes */
|
||||||
|
#define LOWPOWER_SRAMRETCTRL_RETEN_RAM42 \
|
||||||
|
(1UL << 12) /*!< Enable SRAM4_2 retention when entering in Low power modes */
|
||||||
|
#define LOWPOWER_SRAMRETCTRL_RETEN_RAM43 \
|
||||||
|
(1UL << 13) /*!< Enable SRAM4_3 retention when entering in Low power modes */
|
||||||
|
#define LOWPOWER_SRAMRETCTRL_RETEN_RAM_USB_HS \
|
||||||
|
(1UL << 14) /*!< Enable SRAM USB HS retention when entering in Low power modes */
|
||||||
|
#define LOWPOWER_SRAMRETCTRL_RETEN_RAM_PUF \
|
||||||
|
(1UL << 15) /*!< Enable SRAM PUFF retention when entering in Low power modes */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Low Power Modes Wake up sources
|
||||||
|
*/
|
||||||
|
#define WAKEUP_SYS (1ULL << 0) /*!< [SLEEP, DEEP SLEEP ] */ /* WWDT0_IRQ and BOD_IRQ*/
|
||||||
|
#define WAKEUP_SDMA0 (1ULL << 1) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_GPIO_GLOBALINT0 (1ULL << 2) /*!< [SLEEP, DEEP SLEEP, POWER DOWN ] */
|
||||||
|
#define WAKEUP_GPIO_GLOBALINT1 (1ULL << 3) /*!< [SLEEP, DEEP SLEEP, POWER DOWN ] */
|
||||||
|
#define WAKEUP_GPIO_INT0_0 (1ULL << 4) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_GPIO_INT0_1 (1ULL << 5) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_GPIO_INT0_2 (1ULL << 6) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_GPIO_INT0_3 (1ULL << 7) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_UTICK (1ULL << 8) /*!< [SLEEP, ] */
|
||||||
|
#define WAKEUP_MRT (1ULL << 9) /*!< [SLEEP, ] */
|
||||||
|
#define WAKEUP_CTIMER0 (1ULL << 10) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_CTIMER1 (1ULL << 11) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_SCT (1ULL << 12) /*!< [SLEEP, ] */
|
||||||
|
#define WAKEUP_CTIMER3 (1ULL << 13) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_FLEXCOMM0 (1ULL << 14) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_FLEXCOMM1 (1ULL << 15) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_FLEXCOMM2 (1ULL << 16) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_FLEXCOMM3 (1ULL << 17) /*!< [SLEEP, DEEP SLEEP, POWER DOWN ] */
|
||||||
|
#define WAKEUP_FLEXCOMM4 (1ULL << 18) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_FLEXCOMM5 (1ULL << 19) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_FLEXCOMM6 (1ULL << 20) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_FLEXCOMM7 (1ULL << 21) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_ADC (1ULL << 22) /*!< [SLEEP, ] */
|
||||||
|
#define WAKEUP_ACMP_CAPT (1ULL << 24) /*!< [SLEEP, DEEP SLEEP, POWER DOWN ] */
|
||||||
|
// reserved (1ULL << 25)
|
||||||
|
// reserved (1ULL << 26)
|
||||||
|
#define WAKEUP_USB0_NEEDCLK (1ULL << 27) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_USB0 (1ULL << 28) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_RTC_LITE_ALARM_WAKEUP (1ULL << 29) /*!< [SLEEP, DEEP SLEEP, POWER DOWN, DEEP POWER DOWN] */
|
||||||
|
#define WAKEUP_EZH_ARCH_B (1ULL << 30) /*!< [SLEEP, ] */
|
||||||
|
#define WAKEUP_WAKEUP_MAILBOX (1ULL << 31) /*!< [SLEEP, DEEP SLEEP, POWER DOWN ] */
|
||||||
|
#define WAKEUP_GPIO_INT0_4 (1ULL << 32) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_GPIO_INT0_5 (1ULL << 33) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_GPIO_INT0_6 (1ULL << 34) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_GPIO_INT0_7 (1ULL << 35) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_CTIMER2 (1ULL << 36) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_CTIMER4 (1ULL << 37) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_OS_EVENT_TIMER (1ULL << 38) /*!< [SLEEP, DEEP SLEEP, POWER DOWN, DEEP POWER DOWN] */
|
||||||
|
// reserved (1ULL << 39)
|
||||||
|
// reserved (1ULL << 40)
|
||||||
|
// reserved (1ULL << 41)
|
||||||
|
#define WAKEUP_SDIO (1ULL << 42) /*!< [SLEEP, ] */
|
||||||
|
// reserved (1ULL << 43)
|
||||||
|
// reserved (1ULL << 44)
|
||||||
|
// reserved (1ULL << 45)
|
||||||
|
// reserved (1ULL << 46)
|
||||||
|
#define WAKEUP_USB1 (1ULL << 47) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_USB1_NEEDCLK (1ULL << 48) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_SEC_HYPERVISOR_CALL (1ULL << 49) /*!< [SLEEP, ] */
|
||||||
|
#define WAKEUP_SEC_GPIO_INT0_0 (1ULL << 50) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_SEC_GPIO_INT0_1 (1ULL << 51) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_PLU (1ULL << 52) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_SEC_VIO (1ULL << 53)
|
||||||
|
#define WAKEUP_SHA (1ULL << 54) /*!< [SLEEP, ] */
|
||||||
|
#define WAKEUP_CASPER (1ULL << 55) /*!< [SLEEP, ] */
|
||||||
|
#define WAKEUP_PUFF (1ULL << 56) /*!< [SLEEP, ] */
|
||||||
|
#define WAKEUP_PQ (1ULL << 57) /*!< [SLEEP, ] */
|
||||||
|
#define WAKEUP_SDMA1 (1ULL << 58) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
#define WAKEUP_LSPI_HS (1ULL << 59) /*!< [SLEEP, DEEP SLEEP ] */
|
||||||
|
// reserved WAKEUP_PVTVF0_AMBER (1ULL << 60)
|
||||||
|
// reserved WAKEUP_PVTVF0_RED (1ULL << 61)
|
||||||
|
// reserved WAKEUP_PVTVF1_AMBER (1ULL << 62)
|
||||||
|
#define WAKEUP_ALLWAKEUPIOS (1ULL << 63) /*!< [ , DEEP POWER DOWN] */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sleep Postpone
|
||||||
|
*/
|
||||||
|
#define LOWPOWER_HWWAKE_FORCED (1UL << 0) /*!< Force peripheral clocking to stay on during deep-sleep mode. */
|
||||||
|
#define LOWPOWER_HWWAKE_PERIPHERALS \
|
||||||
|
(1UL << 1) /*!< Wake for Flexcomms. Any Flexcomm FIFO reaching the level specified by its own TXLVL will cause \
|
||||||
|
peripheral clocking to wake up temporarily while the related status is asserted */
|
||||||
|
#define LOWPOWER_HWWAKE_SDMA0 \
|
||||||
|
(1UL << 3) /*!< Wake for DMA0. DMA0 being busy will cause peripheral clocking to remain running until DMA \
|
||||||
|
completes. Used in conjonction with LOWPOWER_HWWAKE_PERIPHERALS */
|
||||||
|
#define LOWPOWER_HWWAKE_SDMA1 \
|
||||||
|
(1UL << 5) /*!< Wake for DMA1. DMA0 being busy will cause peripheral clocking to remain running until DMA \
|
||||||
|
completes. Used in conjonction with LOWPOWER_HWWAKE_PERIPHERALS */
|
||||||
|
#define LOWPOWER_HWWAKE_ENABLE_FRO192M \
|
||||||
|
(1UL << 31) /*!< Need to be set if FRO192M is disable - via PDCTRL0 - in Deep Sleep mode and any of \
|
||||||
|
LOWPOWER_HWWAKE_PERIPHERALS, LOWPOWER_HWWAKE_SDMA0 or LOWPOWER_HWWAKE_SDMA1 is set */
|
||||||
|
|
||||||
|
#define LOWPOWER_CPURETCTRL_ENA_DISABLE 0 /*!< In POWER DOWN mode, CPU Retention is disabled */
|
||||||
|
#define LOWPOWER_CPURETCTRL_ENA_ENABLE 1 /*!< In POWER DOWN mode, CPU Retention is enabled */
|
||||||
|
/**
|
||||||
|
* @brief Wake up I/O sources
|
||||||
|
*/
|
||||||
|
#define LOWPOWER_WAKEUPIOSRC_PIO0_INDEX 0 /*!< Pin P1( 1) */
|
||||||
|
#define LOWPOWER_WAKEUPIOSRC_PIO1_INDEX 2 /*!< Pin P0(28) */
|
||||||
|
#define LOWPOWER_WAKEUPIOSRC_PIO2_INDEX 4 /*!< Pin P1(18) */
|
||||||
|
#define LOWPOWER_WAKEUPIOSRC_PIO3_INDEX 6 /*!< Pin P1(30) */
|
||||||
|
|
||||||
|
#define LOWPOWER_WAKEUPIOSRC_DISABLE 0 /*!< Wake up is disable */
|
||||||
|
#define LOWPOWER_WAKEUPIOSRC_RISING 1 /*!< Wake up on rising edge */
|
||||||
|
#define LOWPOWER_WAKEUPIOSRC_FALLING 2 /*!< Wake up on falling edge */
|
||||||
|
#define LOWPOWER_WAKEUPIOSRC_RISING_FALLING 3 /*!< Wake up on both rising or falling edges */
|
||||||
|
|
||||||
|
#define LOWPOWER_WAKEUPIO_PIO0_PULLUPDOWN_INDEX 8 /*!< Wake-up I/O 0 pull-up/down configuration index */
|
||||||
|
#define LOWPOWER_WAKEUPIO_PIO1_PULLUPDOWN_INDEX 9 /*!< Wake-up I/O 1 pull-up/down configuration index */
|
||||||
|
#define LOWPOWER_WAKEUPIO_PIO2_PULLUPDOWN_INDEX 10 /*!< Wake-up I/O 2 pull-up/down configuration index */
|
||||||
|
#define LOWPOWER_WAKEUPIO_PIO3_PULLUPDOWN_INDEX 11 /*!< Wake-up I/O 3 pull-up/down configuration index */
|
||||||
|
|
||||||
|
#define LOWPOWER_WAKEUPIO_PIO0_PULLUPDOWN_MASK \
|
||||||
|
(1UL << LOWPOWER_WAKEUPIO_PIO0_PULLUPDOWN_INDEX) /*!< Wake-up I/O 0 pull-up/down mask */
|
||||||
|
#define LOWPOWER_WAKEUPIO_PIO1_PULLUPDOWN_MASK \
|
||||||
|
(1UL << LOWPOWER_WAKEUPIO_PIO1_PULLUPDOWN_INDEX) /*!< Wake-up I/O 1 pull-up/down mask */
|
||||||
|
#define LOWPOWER_WAKEUPIO_PIO2_PULLUPDOWN_MASK \
|
||||||
|
(1UL << LOWPOWER_WAKEUPIO_PIO2_PULLUPDOWN_INDEX) /*!< Wake-up I/O 2 pull-up/down mask */
|
||||||
|
#define LOWPOWER_WAKEUPIO_PIO3_PULLUPDOWN_MASK \
|
||||||
|
(1UL << LOWPOWER_WAKEUPIO_PIO3_PULLUPDOWN_INDEX) /*!< Wake-up I/O 3 pull-up/down mask */
|
||||||
|
|
||||||
|
#define LOWPOWER_WAKEUPIO_PULLDOWN 0 /*!< Select pull-down */
|
||||||
|
#define LOWPOWER_WAKEUPIO_PULLUP 1 /*!< Select pull-up */
|
||||||
|
|
||||||
|
#define LOWPOWER_WAKEUPIO_PIO0_DISABLEPULLUPDOWN_INDEX \
|
||||||
|
12 /*!< Wake-up I/O 0 pull-up/down disable/enable control index */
|
||||||
|
#define LOWPOWER_WAKEUPIO_PIO1_DISABLEPULLUPDOWN_INDEX \
|
||||||
|
13 /*!< Wake-up I/O 1 pull-up/down disable/enable control index */
|
||||||
|
#define LOWPOWER_WAKEUPIO_PIO2_DISABLEPULLUPDOWN_INDEX \
|
||||||
|
14 /*!< Wake-up I/O 2 pull-up/down disable/enable control index */
|
||||||
|
#define LOWPOWER_WAKEUPIO_PIO3_DISABLEPULLUPDOWN_INDEX \
|
||||||
|
15 /*!< Wake-up I/O 3 pull-up/down disable/enable control index */
|
||||||
|
#define LOWPOWER_WAKEUPIO_PIO0_DISABLEPULLUPDOWN_MASK \
|
||||||
|
(1UL << LOWPOWER_WAKEUPIO_PIO0_DISABLEPULLUPDOWN_INDEX) /*!< Wake-up I/O 0 pull-up/down disable/enable mask */
|
||||||
|
#define LOWPOWER_WAKEUPIO_PIO1_DISABLEPULLUPDOWN_MASK \
|
||||||
|
(1UL << LOWPOWER_WAKEUPIO_PIO1_DISABLEPULLUPDOWN_INDEX) /*!< Wake-up I/O 1 pull-up/down disable/enable mask */
|
||||||
|
#define LOWPOWER_WAKEUPIO_PIO2_DISABLEPULLUPDOWN_MASK \
|
||||||
|
(1UL << LOWPOWER_WAKEUPIO_PIO2_DISABLEPULLUPDOWN_INDEX) /*!< Wake-up I/O 2 pull-up/down disable/enable mask */
|
||||||
|
#define LOWPOWER_WAKEUPIO_PIO3_DISABLEPULLUPDOWN_MASK \
|
||||||
|
(1UL << LOWPOWER_WAKEUPIO_PIO3_DISABLEPULLUPDOWN_INDEX) /*!< Wake-up I/O 3 pull-up/down disable/enable mask */
|
||||||
|
|
||||||
|
#define LOWPOWER_WAKEUPIO_PIO0_USEEXTERNALPULLUPDOWN_INDEX \
|
||||||
|
(16) /*!< Wake-up I/O 0 use external pull-up/down disable/enable control index*/
|
||||||
|
#define LOWPOWER_WAKEUPIO_PIO1_USEEXTERNALPULLUPDOWN_INDEX \
|
||||||
|
(17) /*!< Wake-up I/O 1 use external pull-up/down disable/enable control index */
|
||||||
|
#define LOWPOWER_WAKEUPIO_PIO2_USEEXTERNALPULLUPDOWN_INDEX \
|
||||||
|
(18) /*!< Wake-up I/O 2 use external pull-up/down disable/enable control index */
|
||||||
|
#define LOWPOWER_WAKEUPIO_PIO3_USEEXTERNALPULLUPDOWN_INDEX \
|
||||||
|
(19) /*!< Wake-up I/O 3 use external pull-up/down disable/enable control index */
|
||||||
|
#define LOWPOWER_WAKEUPIO_PIO0_USEEXTERNALPULLUPDOWN_MASK \
|
||||||
|
(1UL << LOWPOWER_WAKEUPIO_PIO0_USEEXTERNALPULLUPDOWN_INDEX) /*!< Wake-up I/O 0 use external pull-up/down \
|
||||||
|
disable/enable mask, 0: disable, 1: enable */
|
||||||
|
#define LOWPOWER_WAKEUPIO_PIO1_USEEXTERNALPULLUPDOWN_MASK \
|
||||||
|
(1UL << LOWPOWER_WAKEUPIO_PIO1_USEEXTERNALPULLUPDOWN_INDEX) /*!< Wake-up I/O 1 use external pull-up/down \
|
||||||
|
disable/enable mask, 0: disable, 1: enable */
|
||||||
|
#define LOWPOWER_WAKEUPIO_PIO2_USEEXTERNALPULLUPDOWN_MASK \
|
||||||
|
(1UL << LOWPOWER_WAKEUPIO_PIO2_USEEXTERNALPULLUPDOWN_INDEX) /*!< Wake-up I/O 2 use external pull-up/down \
|
||||||
|
disable/enable mask, 0: disable, 1: enable */
|
||||||
|
#define LOWPOWER_WAKEUPIO_PIO3_USEEXTERNALPULLUPDOWN_MASK \
|
||||||
|
(1UL << LOWPOWER_WAKEUPIO_PIO3_USEEXTERNALPULLUPDOWN_INDEX) /*!< Wake-up I/O 3 use external pull-up/down \
|
||||||
|
disable/enable mask, 0: disable, 1: enable */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*******************************************************************************
|
||||||
|
* API
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief API to enable PDRUNCFG bit in the Syscon. Note that enabling the bit powers down the peripheral
|
||||||
|
*
|
||||||
|
* @param en peripheral for which to enable the PDRUNCFG bit
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
static inline void POWER_EnablePD(pd_bit_t en)
|
||||||
|
{
|
||||||
|
/* PDRUNCFGSET */
|
||||||
|
PMC->PDRUNCFGSET0 = (uint32_t)en;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief API to disable PDRUNCFG bit in the Syscon. Note that disabling the bit powers up the peripheral
|
||||||
|
*
|
||||||
|
* @param en peripheral for which to disable the PDRUNCFG bit
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
static inline void POWER_DisablePD(pd_bit_t en)
|
||||||
|
{
|
||||||
|
/* PDRUNCFGCLR */
|
||||||
|
PMC->PDRUNCFGCLR0 = (uint32_t)en;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set BOD VBAT level.
|
||||||
|
*
|
||||||
|
* @param level BOD detect level
|
||||||
|
* @param hyst BoD Hysteresis control
|
||||||
|
* @param enBodVbatReset VBAT brown out detect reset
|
||||||
|
*/
|
||||||
|
static inline void POWER_SetBodVbatLevel(power_bod_vbat_level_t level, power_bod_hyst_t hyst, bool enBodVbatReset)
|
||||||
|
{
|
||||||
|
PMC->BODVBAT = (PMC->BODVBAT & (~(PMC_BODVBAT_TRIGLVL_MASK | PMC_BODVBAT_HYST_MASK))) | PMC_BODVBAT_TRIGLVL(level) |
|
||||||
|
PMC_BODVBAT_HYST(hyst);
|
||||||
|
PMC->RESETCTRL =
|
||||||
|
(PMC->RESETCTRL & (~PMC_RESETCTRL_BODVBATRESETENABLE_MASK)) | PMC_RESETCTRL_BODVBATRESETENABLE(enBodVbatReset);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(PMC_BODCORE_TRIGLVL_MASK)
|
||||||
|
/*!
|
||||||
|
* @brief set BOD core level.
|
||||||
|
*
|
||||||
|
* @param level BOD detect level
|
||||||
|
* @param hyst BoD Hysteresis control
|
||||||
|
* @param enBodCoreReset core brown out detect reset
|
||||||
|
*/
|
||||||
|
static inline void POWER_SetBodCoreLevel(power_bod_core_level_t level, power_bod_hyst_t hyst, bool enBodCoreReset)
|
||||||
|
{
|
||||||
|
PMC->BODCORE = (PMC->BODCORE & (~(PMC_BODCORE_TRIGLVL_MASK | PMC_BODCORE_HYST_MASK))) | PMC_BODCORE_TRIGLVL(level) |
|
||||||
|
PMC_BODCORE_HYST(hyst);
|
||||||
|
PMC->RESETCTRL =
|
||||||
|
(PMC->RESETCTRL & (~PMC_RESETCTRL_BODCORERESETENABLE_MASK)) | PMC_RESETCTRL_BODCORERESETENABLE(enBodCoreReset);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief API to enable deep sleep bit in the ARM Core.
|
||||||
|
*
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
static inline void POWER_EnableDeepSleep(void)
|
||||||
|
{
|
||||||
|
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief API to disable deep sleep bit in the ARM Core.
|
||||||
|
*
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
static inline void POWER_DisableDeepSleep(void)
|
||||||
|
{
|
||||||
|
SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Shut off the Flash and execute the _WFI(), then power up the Flash after wake-up event
|
||||||
|
* This MUST BE EXECUTED outside the Flash:
|
||||||
|
* either from ROM or from SRAM. The rest could stay in Flash. But, for consistency, it is
|
||||||
|
* preferable to have all functions defined in this file implemented in ROM.
|
||||||
|
*
|
||||||
|
* @return Nothing
|
||||||
|
*/
|
||||||
|
void POWER_CycleCpuAndFlash(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Configures and enters in DEEP-SLEEP low power mode
|
||||||
|
* @param exclude_from_pd:
|
||||||
|
* @param sram_retention_ctrl:
|
||||||
|
* @param wakeup_interrupts:
|
||||||
|
* @param hardware_wake_ctrl:
|
||||||
|
|
||||||
|
* @return Nothing
|
||||||
|
*
|
||||||
|
* !!! IMPORTANT NOTES :
|
||||||
|
0 - CPU0 & System CLock frequency is switched to FRO12MHz and is NOT restored back by the API.
|
||||||
|
* 1 - CPU0 Interrupt Enable registers (NVIC->ISER) are modified by this function. They are restored back in
|
||||||
|
case of CPU retention or if POWERDOWN is not taken (for instance because an interrupt is pending).
|
||||||
|
* 2 - The Non Maskable Interrupt (NMI) is disabled and its configuration before calling this function will be
|
||||||
|
restored back if POWERDOWN is not taken (for instance because an RTC or OSTIMER interrupt is pending).
|
||||||
|
* 3 - The HARD FAULT handler should execute from SRAM. (The Hard fault handler should initiate a full chip
|
||||||
|
reset) reset)
|
||||||
|
*/
|
||||||
|
void POWER_EnterDeepSleep(uint32_t exclude_from_pd,
|
||||||
|
uint32_t sram_retention_ctrl,
|
||||||
|
uint64_t wakeup_interrupts,
|
||||||
|
uint32_t hardware_wake_ctrl);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Configures and enters in POWERDOWN low power mode
|
||||||
|
* @param exclude_from_pd:
|
||||||
|
* @param sram_retention_ctrl:
|
||||||
|
* @param wakeup_interrupts:
|
||||||
|
* @param cpu_retention_ctrl: 0 = CPU retention is disable / 1 = CPU retention is enabled, all other values are
|
||||||
|
RESERVED.
|
||||||
|
|
||||||
|
* @return Nothing
|
||||||
|
*
|
||||||
|
* !!! IMPORTANT NOTES :
|
||||||
|
0 - CPU0 & System CLock frequency is switched to FRO12MHz and is NOT restored back by the API.
|
||||||
|
* 1 - CPU0 Interrupt Enable registers (NVIC->ISER) are modified by this function. They are restored back in
|
||||||
|
case of CPU retention or if POWERDOWN is not taken (for instance because an interrupt is pending).
|
||||||
|
* 2 - The Non Maskable Interrupt (NMI) is disabled and its configuration before calling this function will be
|
||||||
|
restored back if POWERDOWN is not taken (for instance because an RTC or OSTIMER interrupt is pending).
|
||||||
|
* 3 - In case of CPU retention, it is the responsability of the user to make sure that SRAM instance
|
||||||
|
containing the stack used to call this function WILL BE preserved during low power (via parameter
|
||||||
|
"sram_retention_ctrl")
|
||||||
|
* 4 - The HARD FAULT handler should execute from SRAM. (The Hard fault handler should initiate a full chip
|
||||||
|
reset) reset)
|
||||||
|
*/
|
||||||
|
|
||||||
|
void POWER_EnterPowerDown(uint32_t exclude_from_pd,
|
||||||
|
uint32_t sram_retention_ctrl,
|
||||||
|
uint64_t wakeup_interrupts,
|
||||||
|
uint32_t cpu_retention_ctrl);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Configures and enters in DEEPPOWERDOWN low power mode
|
||||||
|
* @param exclude_from_pd:
|
||||||
|
* @param sram_retention_ctrl:
|
||||||
|
* @param wakeup_interrupts:
|
||||||
|
* @param wakeup_io_ctrl:
|
||||||
|
|
||||||
|
* @return Nothing
|
||||||
|
*
|
||||||
|
* !!! IMPORTANT NOTES :
|
||||||
|
0 - CPU0 & System CLock frequency is switched to FRO12MHz and is NOT restored back by the API.
|
||||||
|
* 1 - CPU0 Interrupt Enable registers (NVIC->ISER) are modified by this function. They are restored back if
|
||||||
|
DEEPPOWERDOWN is not taken (for instance because an RTC or OSTIMER interrupt is pending).
|
||||||
|
* 2 - The Non Maskable Interrupt (NMI) is disabled and its configuration before calling this function will be
|
||||||
|
restored back if DEEPPOWERDOWN is not taken (for instance because an RTC or OSTIMER interrupt is pending).
|
||||||
|
* 3 - The HARD FAULT handler should execute from SRAM. (The Hard fault handler should initiate a full chip
|
||||||
|
reset)
|
||||||
|
*/
|
||||||
|
void POWER_EnterDeepPowerDown(uint32_t exclude_from_pd,
|
||||||
|
uint32_t sram_retention_ctrl,
|
||||||
|
uint64_t wakeup_interrupts,
|
||||||
|
uint32_t wakeup_io_ctrl);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Configures and enters in SLEEP low power mode
|
||||||
|
* @param :
|
||||||
|
* @return Nothing
|
||||||
|
*/
|
||||||
|
void POWER_EnterSleep(void);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Power Library API to choose normal regulation and set the voltage for the desired operating frequency.
|
||||||
|
*
|
||||||
|
* @param system_freq_hz - The desired frequency (in Hertz) at which the part would like to operate,
|
||||||
|
* note that the voltage and flash wait states should be set before changing frequency
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
void POWER_SetVoltageForFreq(uint32_t system_freq_hz);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Power Library API to return the library version.
|
||||||
|
*
|
||||||
|
* @return version number of the power library
|
||||||
|
*/
|
||||||
|
uint32_t POWER_GetLibVersion(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets board-specific trim values for 16MHz XTAL
|
||||||
|
* @param pi32_16MfXtalIecLoadpF_x100 Load capacitance, pF x 100. For example, 6pF becomes 600, 1.2pF becomes 120
|
||||||
|
* @param pi32_16MfXtalPPcbParCappF_x100 PCB +ve parasitic capacitance, pF x 100. For example, 6pF becomes 600, 1.2pF
|
||||||
|
* becomes 120
|
||||||
|
* @param pi32_16MfXtalNPcbParCappF_x100 PCB -ve parasitic capacitance, pF x 100. For example, 6pF becomes 600, 1.2pF
|
||||||
|
* becomes 120
|
||||||
|
* @return none
|
||||||
|
* @note Following default Values can be used:
|
||||||
|
* pi32_32MfXtalIecLoadpF_x100 Load capacitance, pF x 100 : 600
|
||||||
|
* pi32_32MfXtalPPcbParCappF_x100 PCB +ve parasitic capacitance, pF x 100 : 20
|
||||||
|
* pi32_32MfXtalNPcbParCappF_x100 PCB -ve parasitic capacitance, pF x 100 : 40
|
||||||
|
*/
|
||||||
|
extern void POWER_Xtal16mhzCapabankTrim(int32_t pi32_16MfXtalIecLoadpF_x100,
|
||||||
|
int32_t pi32_16MfXtalPPcbParCappF_x100,
|
||||||
|
int32_t pi32_16MfXtalNPcbParCappF_x100);
|
||||||
|
/**
|
||||||
|
* @brief Sets board-specific trim values for 32kHz XTAL
|
||||||
|
* @param pi32_32kfXtalIecLoadpF_x100 Load capacitance, pF x 100. For example, 6pF becomes 600, 1.2pF becomes 120
|
||||||
|
* @param pi32_32kfXtalPPcbParCappF_x100 PCB +ve parasitic capacitance, pF x 100. For example, 6pF becomes 600, 1.2pF
|
||||||
|
becomes 120
|
||||||
|
* @param pi32_32kfXtalNPcbParCappF_x100 PCB -ve parasitic capacitance, pF x 100. For example, 6pF becomes 600, 1.2pF
|
||||||
|
becomes 120
|
||||||
|
|
||||||
|
* @return none
|
||||||
|
* @note Following default Values can be used:
|
||||||
|
* pi32_32kfXtalIecLoadpF_x100 Load capacitance, pF x 100 : 600
|
||||||
|
* pi32_32kfXtalPPcbParCappF_x100 PCB +ve parasitic capacitance, pF x 100 : 40
|
||||||
|
* pi32_32kfXtalNPcbParCappF_x100 PCB -ve parasitic capacitance, pF x 100 : 40
|
||||||
|
*/
|
||||||
|
extern void POWER_Xtal32khzCapabankTrim(int32_t pi32_32kfXtalIecLoadpF_x100,
|
||||||
|
int32_t pi32_32kfXtalPPcbParCappF_x100,
|
||||||
|
int32_t pi32_32kfXtalNPcbParCappF_x100);
|
||||||
|
/**
|
||||||
|
* @brief Enables and sets LDO for 16MHz XTAL
|
||||||
|
*
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
extern void POWER_SetXtal16mhzLdo(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set up 16-MHz XTAL Trimmings
|
||||||
|
* @param amp Amplitude
|
||||||
|
* @param gm Transconductance
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
extern void POWER_SetXtal16mhzTrim(uint32_t amp, uint32_t gm);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Return some key information related to the device reset causes / wake-up sources, for all power modes.
|
||||||
|
* @param p_reset_cause : the device reset cause, according to the definition of power_device_reset_cause_t type.
|
||||||
|
* @param p_boot_mode : the device boot mode, according to the definition of power_device_boot_mode_t type.
|
||||||
|
* @param p_wakeupio_cause: the wake-up pin sources, according to the definition of register PMC->WAKEIOCAUSE[3:0].
|
||||||
|
|
||||||
|
* @return Nothing
|
||||||
|
*
|
||||||
|
* !!! IMPORTANT ERRATA - IMPORTANT ERRATA - IMPORTANT ERRATA !!!
|
||||||
|
* !!! valid ONLY for LPC55S69 (not for LPC55S16 and LPC55S06) !!!
|
||||||
|
* !!! when FALLING EDGE DETECTION is enabled on wake-up pins: !!!
|
||||||
|
* - 1. p_wakeupio_cause is NOT ACCURATE
|
||||||
|
* - 2. Spurious kRESET_CAUSE_DPDRESET_WAKEUPIO* event is reported when
|
||||||
|
* several wake-up sources are enabled during DEEP-POWER-DOWN
|
||||||
|
* (like enabling wake-up on RTC and Falling edge wake-up pins)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void POWER_GetWakeUpCause(power_device_reset_cause_t *p_reset_cause,
|
||||||
|
power_device_boot_mode_t *p_boot_mode,
|
||||||
|
uint32_t *p_wakeupio_cause);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* _FSL_POWER_H_ */
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,135 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017-2018 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "fsl_common.h"
|
||||||
|
#include "fsl_debug_console.h"
|
||||||
|
#include "board.h"
|
||||||
|
#if defined(SDK_I2C_BASED_COMPONENT_USED) && SDK_I2C_BASED_COMPONENT_USED
|
||||||
|
#include "fsl_i2c.h"
|
||||||
|
#endif /* SDK_I2C_BASED_COMPONENT_USED */
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Variables
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code
|
||||||
|
******************************************************************************/
|
||||||
|
/* Initialize debug console. */
|
||||||
|
void BOARD_InitDebugConsole(void)
|
||||||
|
{
|
||||||
|
/* attach 12 MHz clock to FLEXCOMM0 (debug console) */
|
||||||
|
CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
|
||||||
|
|
||||||
|
RESET_ClearPeripheralReset(BOARD_DEBUG_UART_RST);
|
||||||
|
|
||||||
|
uint32_t uartClkSrcFreq = BOARD_DEBUG_UART_CLK_FREQ;
|
||||||
|
|
||||||
|
DbgConsole_Init(BOARD_DEBUG_UART_INSTANCE, BOARD_DEBUG_UART_BAUDRATE, BOARD_DEBUG_UART_TYPE, uartClkSrcFreq);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BOARD_InitDebugConsole_Core1(void)
|
||||||
|
{
|
||||||
|
/* attach 12 MHz clock to FLEXCOMM1 (debug console) */
|
||||||
|
CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH_CORE1);
|
||||||
|
|
||||||
|
RESET_ClearPeripheralReset(BOARD_DEBUG_UART_RST_CORE1);
|
||||||
|
|
||||||
|
uint32_t uartClkSrcFreq = BOARD_DEBUG_UART_CLK_FREQ_CORE1;
|
||||||
|
|
||||||
|
DbgConsole_Init(BOARD_DEBUG_UART_INSTANCE_CORE1, BOARD_DEBUG_UART_BAUDRATE_CORE1, BOARD_DEBUG_UART_TYPE_CORE1,
|
||||||
|
uartClkSrcFreq);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(SDK_I2C_BASED_COMPONENT_USED) && SDK_I2C_BASED_COMPONENT_USED
|
||||||
|
void BOARD_I2C_Init(I2C_Type *base, uint32_t clkSrc_Hz)
|
||||||
|
{
|
||||||
|
i2c_master_config_t i2cConfig = {0};
|
||||||
|
|
||||||
|
I2C_MasterGetDefaultConfig(&i2cConfig);
|
||||||
|
I2C_MasterInit(base, &i2cConfig, clkSrc_Hz);
|
||||||
|
}
|
||||||
|
|
||||||
|
status_t BOARD_I2C_Send(I2C_Type *base,
|
||||||
|
uint8_t deviceAddress,
|
||||||
|
uint32_t subAddress,
|
||||||
|
uint8_t subaddressSize,
|
||||||
|
uint8_t *txBuff,
|
||||||
|
uint8_t txBuffSize)
|
||||||
|
{
|
||||||
|
i2c_master_transfer_t masterXfer;
|
||||||
|
|
||||||
|
/* Prepare transfer structure. */
|
||||||
|
masterXfer.slaveAddress = deviceAddress;
|
||||||
|
masterXfer.direction = kI2C_Write;
|
||||||
|
masterXfer.subaddress = subAddress;
|
||||||
|
masterXfer.subaddressSize = subaddressSize;
|
||||||
|
masterXfer.data = txBuff;
|
||||||
|
masterXfer.dataSize = txBuffSize;
|
||||||
|
masterXfer.flags = kI2C_TransferDefaultFlag;
|
||||||
|
|
||||||
|
return I2C_MasterTransferBlocking(base, &masterXfer);
|
||||||
|
}
|
||||||
|
|
||||||
|
status_t BOARD_I2C_Receive(I2C_Type *base,
|
||||||
|
uint8_t deviceAddress,
|
||||||
|
uint32_t subAddress,
|
||||||
|
uint8_t subaddressSize,
|
||||||
|
uint8_t *rxBuff,
|
||||||
|
uint8_t rxBuffSize)
|
||||||
|
{
|
||||||
|
i2c_master_transfer_t masterXfer;
|
||||||
|
|
||||||
|
/* Prepare transfer structure. */
|
||||||
|
masterXfer.slaveAddress = deviceAddress;
|
||||||
|
masterXfer.subaddress = subAddress;
|
||||||
|
masterXfer.subaddressSize = subaddressSize;
|
||||||
|
masterXfer.data = rxBuff;
|
||||||
|
masterXfer.dataSize = rxBuffSize;
|
||||||
|
masterXfer.direction = kI2C_Read;
|
||||||
|
masterXfer.flags = kI2C_TransferDefaultFlag;
|
||||||
|
|
||||||
|
return I2C_MasterTransferBlocking(base, &masterXfer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BOARD_Accel_I2C_Init(void)
|
||||||
|
{
|
||||||
|
BOARD_I2C_Init(BOARD_ACCEL_I2C_BASEADDR, BOARD_ACCEL_I2C_CLOCK_FREQ);
|
||||||
|
}
|
||||||
|
|
||||||
|
status_t BOARD_Accel_I2C_Send(uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize, uint32_t txBuff)
|
||||||
|
{
|
||||||
|
uint8_t data = (uint8_t)txBuff;
|
||||||
|
|
||||||
|
return BOARD_I2C_Send(BOARD_ACCEL_I2C_BASEADDR, deviceAddress, subAddress, subaddressSize, &data, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
status_t BOARD_Accel_I2C_Receive(
|
||||||
|
uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize, uint8_t *rxBuff, uint8_t rxBuffSize)
|
||||||
|
{
|
||||||
|
return BOARD_I2C_Receive(BOARD_ACCEL_I2C_BASEADDR, deviceAddress, subAddress, subaddressSize, rxBuff, rxBuffSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BOARD_Codec_I2C_Init(void)
|
||||||
|
{
|
||||||
|
BOARD_I2C_Init(BOARD_CODEC_I2C_BASEADDR, BOARD_CODEC_I2C_CLOCK_FREQ);
|
||||||
|
}
|
||||||
|
|
||||||
|
status_t BOARD_Codec_I2C_Send(
|
||||||
|
uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, const uint8_t *txBuff, uint8_t txBuffSize)
|
||||||
|
{
|
||||||
|
return BOARD_I2C_Send(BOARD_CODEC_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, (uint8_t *)txBuff,
|
||||||
|
txBuffSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
status_t BOARD_Codec_I2C_Receive(
|
||||||
|
uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize)
|
||||||
|
{
|
||||||
|
return BOARD_I2C_Receive(BOARD_CODEC_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, rxBuff, rxBuffSize);
|
||||||
|
}
|
||||||
|
#endif /* SDK_I2C_BASED_COMPONENT_USED */
|
||||||
|
|
@ -0,0 +1,218 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017-2018 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _BOARD_H_
|
||||||
|
#define _BOARD_H_
|
||||||
|
|
||||||
|
#include "clock_config.h"
|
||||||
|
#include "fsl_common.h"
|
||||||
|
#include "fsl_reset.h"
|
||||||
|
#include "fsl_gpio.h"
|
||||||
|
#include "fsl_iocon.h"
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
/*! @brief The board name */
|
||||||
|
#define BOARD_NAME "LPCXpresso55S69"
|
||||||
|
|
||||||
|
/*! @brief The UART to use for debug messages. */
|
||||||
|
/* TODO: rename UART to USART */
|
||||||
|
#define BOARD_DEBUG_UART_TYPE kSerialPort_Uart
|
||||||
|
#define BOARD_DEBUG_UART_BASEADDR (uint32_t) USART0
|
||||||
|
#define BOARD_DEBUG_UART_INSTANCE 0U
|
||||||
|
#define BOARD_DEBUG_UART_CLK_FREQ 12000000U
|
||||||
|
#define BOARD_DEBUG_UART_CLK_ATTACH kFRO12M_to_FLEXCOMM0
|
||||||
|
#define BOARD_DEBUG_UART_RST kFC0_RST_SHIFT_RSTn
|
||||||
|
#define BOARD_DEBUG_UART_CLKSRC kCLOCK_Flexcomm0
|
||||||
|
#define BOARD_UART_IRQ_HANDLER FLEXCOMM0_IRQHandler
|
||||||
|
#define BOARD_UART_IRQ FLEXCOMM0_IRQn
|
||||||
|
|
||||||
|
#define BOARD_ACCEL_I2C_BASEADDR I2C4
|
||||||
|
#define BOARD_ACCEL_I2C_CLOCK_FREQ 12000000
|
||||||
|
|
||||||
|
#define BOARD_DEBUG_UART_TYPE_CORE1 kSerialPort_Uart
|
||||||
|
#define BOARD_DEBUG_UART_BASEADDR_CORE1 (uint32_t) USART1
|
||||||
|
#define BOARD_DEBUG_UART_INSTANCE_CORE1 1U
|
||||||
|
#define BOARD_DEBUG_UART_CLK_FREQ_CORE1 12000000U
|
||||||
|
#define BOARD_DEBUG_UART_CLK_ATTACH_CORE1 kFRO12M_to_FLEXCOMM1
|
||||||
|
#define BOARD_DEBUG_UART_RST_CORE1 kFC1_RST_SHIFT_RSTn
|
||||||
|
#define BOARD_DEBUG_UART_CLKSRC_CORE1 kCLOCK_Flexcomm1
|
||||||
|
#define BOARD_UART_IRQ_HANDLER_CORE1 FLEXCOMM1_IRQHandler
|
||||||
|
#define BOARD_UART_IRQ_CORE1 FLEXCOMM1_IRQn
|
||||||
|
|
||||||
|
#ifndef BOARD_DEBUG_UART_BAUDRATE
|
||||||
|
#define BOARD_DEBUG_UART_BAUDRATE 115200U
|
||||||
|
#endif /* BOARD_DEBUG_UART_BAUDRATE */
|
||||||
|
|
||||||
|
#ifndef BOARD_DEBUG_UART_BAUDRATE_CORE1
|
||||||
|
#define BOARD_DEBUG_UART_BAUDRATE_CORE1 115200U
|
||||||
|
#endif /* BOARD_DEBUG_UART_BAUDRATE_CORE1 */
|
||||||
|
|
||||||
|
#define BOARD_CODEC_I2C_BASEADDR I2C4
|
||||||
|
#define BOARD_CODEC_I2C_CLOCK_FREQ 12000000
|
||||||
|
#define BOARD_CODEC_I2C_INSTANCE 4
|
||||||
|
#ifndef BOARD_LED_RED_GPIO
|
||||||
|
#define BOARD_LED_RED_GPIO GPIO
|
||||||
|
#endif
|
||||||
|
#define BOARD_LED_RED_GPIO_PORT 1U
|
||||||
|
#ifndef BOARD_LED_RED_GPIO_PIN
|
||||||
|
#define BOARD_LED_RED_GPIO_PIN 6U
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef BOARD_LED_BLUE_GPIO
|
||||||
|
#define BOARD_LED_BLUE_GPIO GPIO
|
||||||
|
#endif
|
||||||
|
#define BOARD_LED_BLUE_GPIO_PORT 1U
|
||||||
|
#ifndef BOARD_LED_BLUE_GPIO_PIN
|
||||||
|
#define BOARD_LED_BLUE_GPIO_PIN 4U
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef BOARD_LED_GREEN_GPIO
|
||||||
|
#define BOARD_LED_GREEN_GPIO GPIO
|
||||||
|
#endif
|
||||||
|
#define BOARD_LED_GREEN_GPIO_PORT 1U
|
||||||
|
#ifndef BOARD_LED_GREEN_GPIO_PIN
|
||||||
|
#define BOARD_LED_GREEN_GPIO_PIN 7U
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef BOARD_SW1_GPIO
|
||||||
|
#define BOARD_SW1_GPIO GPIO
|
||||||
|
#endif
|
||||||
|
#define BOARD_SW1_GPIO_PORT 0U
|
||||||
|
#ifndef BOARD_SW1_GPIO_PIN
|
||||||
|
#define BOARD_SW1_GPIO_PIN 5U
|
||||||
|
#endif
|
||||||
|
#define BOARD_SW1_NAME "SW1"
|
||||||
|
#define BOARD_SW1_IRQ PIN_INT0_IRQn
|
||||||
|
#define BOARD_SW1_IRQ_HANDLER PIN_INT0_IRQHandler
|
||||||
|
|
||||||
|
#ifndef BOARD_SW2_GPIO
|
||||||
|
#define BOARD_SW2_GPIO GPIO
|
||||||
|
#endif
|
||||||
|
#define BOARD_SW2_GPIO_PORT 1U
|
||||||
|
#ifndef BOARD_SW2_GPIO_PIN
|
||||||
|
#define BOARD_SW2_GPIO_PIN 18U
|
||||||
|
#endif
|
||||||
|
#define BOARD_SW2_NAME "SW2"
|
||||||
|
#define BOARD_SW2_IRQ PIN_INT1_IRQn
|
||||||
|
#define BOARD_SW2_IRQ_HANDLER PIN_INT1_IRQHandler
|
||||||
|
#define BOARD_SW2_GPIO_PININT_INDEX 1
|
||||||
|
|
||||||
|
#ifndef BOARD_SW3_GPIO
|
||||||
|
#define BOARD_SW3_GPIO GPIO
|
||||||
|
#endif
|
||||||
|
#define BOARD_SW3_GPIO_PORT 1U
|
||||||
|
#ifndef BOARD_SW3_GPIO_PIN
|
||||||
|
#define BOARD_SW3_GPIO_PIN 9U
|
||||||
|
#endif
|
||||||
|
#define BOARD_SW3_NAME "SW3"
|
||||||
|
#define BOARD_SW3_IRQ PIN_INT1_IRQn
|
||||||
|
#define BOARD_SW3_IRQ_HANDLER PIN_INT1_IRQHandler
|
||||||
|
#define BOARD_SW3_GPIO_PININT_INDEX 1
|
||||||
|
|
||||||
|
/* Board led color mapping */
|
||||||
|
#define LOGIC_LED_ON 0U
|
||||||
|
#define LOGIC_LED_OFF 1U
|
||||||
|
|
||||||
|
#define LED_RED_INIT(output) \
|
||||||
|
{ \
|
||||||
|
IOCON_PinMuxSet(IOCON, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, IOCON_DIGITAL_EN); \
|
||||||
|
GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \
|
||||||
|
&(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED1 */ \
|
||||||
|
}
|
||||||
|
#define LED_RED_ON() \
|
||||||
|
GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \
|
||||||
|
1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED1 */
|
||||||
|
#define LED_RED_OFF() \
|
||||||
|
GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \
|
||||||
|
1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED1 \ \ \ \ \ \ \ \ \ \ \
|
||||||
|
*/
|
||||||
|
#define LED_RED_TOGGLE() \
|
||||||
|
GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \
|
||||||
|
1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED1 */
|
||||||
|
|
||||||
|
#define LED_BLUE_INIT(output) \
|
||||||
|
{ \
|
||||||
|
IOCON_PinMuxSet(IOCON, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, IOCON_DIGITAL_EN); \
|
||||||
|
GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \
|
||||||
|
&(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED1 */ \
|
||||||
|
}
|
||||||
|
#define LED_BLUE_ON() \
|
||||||
|
GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \
|
||||||
|
1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED1 */
|
||||||
|
#define LED_BLUE_OFF() \
|
||||||
|
GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \
|
||||||
|
1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED1 */
|
||||||
|
#define LED_BLUE_TOGGLE() \
|
||||||
|
GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \
|
||||||
|
1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED1 */
|
||||||
|
|
||||||
|
#define LED_GREEN_INIT(output) \
|
||||||
|
GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \
|
||||||
|
&(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}) /*!< Enable target LED1 */
|
||||||
|
#define LED_GREEN_ON() \
|
||||||
|
GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \
|
||||||
|
1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED1 */
|
||||||
|
#define LED_GREEN_OFF() \
|
||||||
|
GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \
|
||||||
|
1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED1 */
|
||||||
|
#define LED_GREEN_TOGGLE() \
|
||||||
|
GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \
|
||||||
|
1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED1 */
|
||||||
|
|
||||||
|
/* Display. */
|
||||||
|
#define BOARD_LCD_DC_GPIO GPIO
|
||||||
|
#define BOARD_LCD_DC_GPIO_PORT 1U
|
||||||
|
#define BOARD_LCD_DC_GPIO_PIN 5U
|
||||||
|
|
||||||
|
/* Serial MWM WIFI */
|
||||||
|
#define BOARD_SERIAL_MWM_PORT_CLK_FREQ CLOCK_GetFlexCommClkFreq(2)
|
||||||
|
#define BOARD_SERIAL_MWM_PORT USART2
|
||||||
|
#define BOARD_SERIAL_MWM_PORT_IRQn FLEXCOMM2_IRQn
|
||||||
|
#define BOARD_SERIAL_MWM_RST_WRITE(output)
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
void BOARD_InitDebugConsole(void);
|
||||||
|
void BOARD_InitDebugConsole_Core1(void);
|
||||||
|
#if defined(SDK_I2C_BASED_COMPONENT_USED) && SDK_I2C_BASED_COMPONENT_USED
|
||||||
|
void BOARD_I2C_Init(I2C_Type *base, uint32_t clkSrc_Hz);
|
||||||
|
status_t BOARD_I2C_Send(I2C_Type *base,
|
||||||
|
uint8_t deviceAddress,
|
||||||
|
uint32_t subAddress,
|
||||||
|
uint8_t subaddressSize,
|
||||||
|
uint8_t *txBuff,
|
||||||
|
uint8_t txBuffSize);
|
||||||
|
status_t BOARD_I2C_Receive(I2C_Type *base,
|
||||||
|
uint8_t deviceAddress,
|
||||||
|
uint32_t subAddress,
|
||||||
|
uint8_t subaddressSize,
|
||||||
|
uint8_t *rxBuff,
|
||||||
|
uint8_t rxBuffSize);
|
||||||
|
void BOARD_Accel_I2C_Init(void);
|
||||||
|
status_t BOARD_Accel_I2C_Send(uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize, uint32_t txBuff);
|
||||||
|
status_t BOARD_Accel_I2C_Receive(
|
||||||
|
uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize, uint8_t *rxBuff, uint8_t rxBuffSize);
|
||||||
|
void BOARD_Codec_I2C_Init(void);
|
||||||
|
status_t BOARD_Codec_I2C_Send(
|
||||||
|
uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, const uint8_t *txBuff, uint8_t txBuffSize);
|
||||||
|
status_t BOARD_Codec_I2C_Receive(
|
||||||
|
uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize);
|
||||||
|
#endif /* SDK_I2C_BASED_COMPONENT_USED */
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#endif /* _BOARD_H_ */
|
||||||
|
|
@ -0,0 +1,367 @@
|
||||||
|
/***********************************************************************************************************************
|
||||||
|
* This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file
|
||||||
|
* will be overwritten if the respective MCUXpresso Config Tools is used to update this file.
|
||||||
|
**********************************************************************************************************************/
|
||||||
|
/*
|
||||||
|
* How to set up clock using clock driver functions:
|
||||||
|
*
|
||||||
|
* 1. Setup clock sources.
|
||||||
|
*
|
||||||
|
* 2. Set up wait states of the flash.
|
||||||
|
*
|
||||||
|
* 3. Set up all dividers.
|
||||||
|
*
|
||||||
|
* 4. Set up all selectors to provide selected clocks.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* clang-format off */
|
||||||
|
/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
|
||||||
|
!!GlobalInfo
|
||||||
|
product: Clocks v8.0
|
||||||
|
processor: LPC55S69
|
||||||
|
package_id: LPC55S69JBD100
|
||||||
|
mcu_data: ksdk2_0
|
||||||
|
processor_version: 10.0.0
|
||||||
|
* BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
|
||||||
|
/* clang-format on */
|
||||||
|
|
||||||
|
#include "fsl_power.h"
|
||||||
|
#include "fsl_clock.h"
|
||||||
|
#include "clock_config.h"
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Variables
|
||||||
|
******************************************************************************/
|
||||||
|
/* System clock frequency. */
|
||||||
|
extern uint32_t SystemCoreClock;
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
************************ BOARD_InitBootClocks function ************************
|
||||||
|
******************************************************************************/
|
||||||
|
void BOARD_InitBootClocks(void)
|
||||||
|
{
|
||||||
|
BOARD_BootClockPLL150M();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
******************** Configuration BOARD_BootClockFRO12M **********************
|
||||||
|
******************************************************************************/
|
||||||
|
/* clang-format off */
|
||||||
|
/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
|
||||||
|
!!Configuration
|
||||||
|
name: BOARD_BootClockFRO12M
|
||||||
|
outputs:
|
||||||
|
- {id: System_clock.outFreq, value: 12 MHz}
|
||||||
|
settings:
|
||||||
|
- {id: ANALOG_CONTROL_FRO192M_CTRL_ENDI_FRO_96M_CFG, value: Enable}
|
||||||
|
sources:
|
||||||
|
- {id: ANACTRL.fro_hf.outFreq, value: 96 MHz}
|
||||||
|
* BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
|
||||||
|
/* clang-format on */
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Variables for BOARD_BootClockFRO12M configuration
|
||||||
|
******************************************************************************/
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code for BOARD_BootClockFRO12M configuration
|
||||||
|
******************************************************************************/
|
||||||
|
void BOARD_BootClockFRO12M(void)
|
||||||
|
{
|
||||||
|
#ifndef SDK_SECONDARY_CORE
|
||||||
|
/*!< Set up the clock sources */
|
||||||
|
/*!< Configure FRO192M */
|
||||||
|
POWER_DisablePD(kPDRUNCFG_PD_FRO192M); /*!< Ensure FRO is on */
|
||||||
|
CLOCK_SetupFROClocking(12000000U); /*!< Set up FRO to the 12 MHz, just for sure */
|
||||||
|
CLOCK_AttachClk(kFRO12M_to_MAIN_CLK); /*!< Switch to FRO 12MHz first to ensure we can change the clock setting */
|
||||||
|
|
||||||
|
CLOCK_SetupFROClocking(96000000U); /* Enable FRO HF(96MHz) output */
|
||||||
|
|
||||||
|
POWER_SetVoltageForFreq(12000000U); /*!< Set voltage for the one of the fastest clock outputs: System clock output */
|
||||||
|
CLOCK_SetFLASHAccessCyclesForFreq(12000000U); /*!< Set FLASH wait states for core */
|
||||||
|
|
||||||
|
/*!< Set up dividers */
|
||||||
|
CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false); /*!< Set AHBCLKDIV divider to value 1 */
|
||||||
|
|
||||||
|
/*!< Set up clock selectors - Attach clocks to the peripheries */
|
||||||
|
CLOCK_AttachClk(kFRO12M_to_MAIN_CLK); /*!< Switch MAIN_CLK to FRO12M */
|
||||||
|
|
||||||
|
/*!< Set SystemCoreClock variable. */
|
||||||
|
SystemCoreClock = BOARD_BOOTCLOCKFRO12M_CORE_CLOCK;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
******************* Configuration BOARD_BootClockFROHF96M *********************
|
||||||
|
******************************************************************************/
|
||||||
|
/* clang-format off */
|
||||||
|
/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
|
||||||
|
!!Configuration
|
||||||
|
name: BOARD_BootClockFROHF96M
|
||||||
|
outputs:
|
||||||
|
- {id: System_clock.outFreq, value: 96 MHz}
|
||||||
|
settings:
|
||||||
|
- {id: ANALOG_CONTROL_FRO192M_CTRL_ENDI_FRO_96M_CFG, value: Enable}
|
||||||
|
- {id: SYSCON.MAINCLKSELA.sel, value: ANACTRL.fro_hf_clk}
|
||||||
|
sources:
|
||||||
|
- {id: ANACTRL.fro_hf.outFreq, value: 96 MHz}
|
||||||
|
* BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
|
||||||
|
/* clang-format on */
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Variables for BOARD_BootClockFROHF96M configuration
|
||||||
|
******************************************************************************/
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code for BOARD_BootClockFROHF96M configuration
|
||||||
|
******************************************************************************/
|
||||||
|
void BOARD_BootClockFROHF96M(void)
|
||||||
|
{
|
||||||
|
#ifndef SDK_SECONDARY_CORE
|
||||||
|
/*!< Set up the clock sources */
|
||||||
|
/*!< Configure FRO192M */
|
||||||
|
POWER_DisablePD(kPDRUNCFG_PD_FRO192M); /*!< Ensure FRO is on */
|
||||||
|
CLOCK_SetupFROClocking(12000000U); /*!< Set up FRO to the 12 MHz, just for sure */
|
||||||
|
CLOCK_AttachClk(kFRO12M_to_MAIN_CLK); /*!< Switch to FRO 12MHz first to ensure we can change the clock setting */
|
||||||
|
|
||||||
|
CLOCK_SetupFROClocking(96000000U); /* Enable FRO HF(96MHz) output */
|
||||||
|
|
||||||
|
POWER_SetVoltageForFreq(96000000U); /*!< Set voltage for the one of the fastest clock outputs: System clock output */
|
||||||
|
CLOCK_SetFLASHAccessCyclesForFreq(96000000U); /*!< Set FLASH wait states for core */
|
||||||
|
|
||||||
|
/*!< Set up dividers */
|
||||||
|
CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false); /*!< Set AHBCLKDIV divider to value 1 */
|
||||||
|
|
||||||
|
/*!< Set up clock selectors - Attach clocks to the peripheries */
|
||||||
|
CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK); /*!< Switch MAIN_CLK to FRO_HF */
|
||||||
|
|
||||||
|
/*!< Set SystemCoreClock variable. */
|
||||||
|
SystemCoreClock = BOARD_BOOTCLOCKFROHF96M_CORE_CLOCK;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
******************** Configuration BOARD_BootClockPLL100M *********************
|
||||||
|
******************************************************************************/
|
||||||
|
/* clang-format off */
|
||||||
|
/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
|
||||||
|
!!Configuration
|
||||||
|
name: BOARD_BootClockPLL100M
|
||||||
|
outputs:
|
||||||
|
- {id: System_clock.outFreq, value: 100 MHz}
|
||||||
|
settings:
|
||||||
|
- {id: PLL0_Mode, value: Normal}
|
||||||
|
- {id: ANALOG_CONTROL_FRO192M_CTRL_ENDI_FRO_96M_CFG, value: Enable}
|
||||||
|
- {id: ENABLE_CLKIN_ENA, value: Enabled}
|
||||||
|
- {id: ENABLE_SYSTEM_CLK_OUT, value: Enabled}
|
||||||
|
- {id: SYSCON.MAINCLKSELB.sel, value: SYSCON.PLL0_BYPASS}
|
||||||
|
- {id: SYSCON.PLL0CLKSEL.sel, value: SYSCON.CLK_IN_EN}
|
||||||
|
- {id: SYSCON.PLL0M_MULT.scale, value: '100', locked: true}
|
||||||
|
- {id: SYSCON.PLL0N_DIV.scale, value: '4', locked: true}
|
||||||
|
- {id: SYSCON.PLL0_PDEC.scale, value: '4', locked: true}
|
||||||
|
sources:
|
||||||
|
- {id: ANACTRL.fro_hf.outFreq, value: 96 MHz}
|
||||||
|
- {id: SYSCON.XTAL32M.outFreq, value: 16 MHz, enabled: true}
|
||||||
|
* BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
|
||||||
|
/* clang-format on */
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Variables for BOARD_BootClockPLL100M configuration
|
||||||
|
******************************************************************************/
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code for BOARD_BootClockPLL100M configuration
|
||||||
|
******************************************************************************/
|
||||||
|
void BOARD_BootClockPLL100M(void)
|
||||||
|
{
|
||||||
|
#ifndef SDK_SECONDARY_CORE
|
||||||
|
/*!< Set up the clock sources */
|
||||||
|
/*!< Configure FRO192M */
|
||||||
|
POWER_DisablePD(kPDRUNCFG_PD_FRO192M); /*!< Ensure FRO is on */
|
||||||
|
CLOCK_SetupFROClocking(12000000U); /*!< Set up FRO to the 12 MHz, just for sure */
|
||||||
|
CLOCK_AttachClk(kFRO12M_to_MAIN_CLK); /*!< Switch to FRO 12MHz first to ensure we can change the clock setting */
|
||||||
|
|
||||||
|
CLOCK_SetupFROClocking(96000000U); /* Enable FRO HF(96MHz) output */
|
||||||
|
|
||||||
|
/*!< Configure XTAL32M */
|
||||||
|
POWER_DisablePD(kPDRUNCFG_PD_XTAL32M); /* Ensure XTAL32M is powered */
|
||||||
|
POWER_DisablePD(kPDRUNCFG_PD_LDOXO32M); /* Ensure XTAL32M is powered */
|
||||||
|
CLOCK_SetupExtClocking(16000000U); /* Enable clk_in clock */
|
||||||
|
SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_CLKIN_ENA_MASK; /* Enable clk_in from XTAL32M clock */
|
||||||
|
ANACTRL->XO32M_CTRL |= ANACTRL_XO32M_CTRL_ENABLE_SYSTEM_CLK_OUT_MASK; /* Enable clk_in to system */
|
||||||
|
|
||||||
|
POWER_SetVoltageForFreq(100000000U); /*!< Set voltage for the one of the fastest clock outputs: System clock output */
|
||||||
|
CLOCK_SetFLASHAccessCyclesForFreq(100000000U); /*!< Set FLASH wait states for core */
|
||||||
|
|
||||||
|
/*!< Set up PLL */
|
||||||
|
CLOCK_AttachClk(kEXT_CLK_to_PLL0); /*!< Switch PLL0CLKSEL to EXT_CLK */
|
||||||
|
POWER_DisablePD(kPDRUNCFG_PD_PLL0); /* Ensure PLL is on */
|
||||||
|
POWER_DisablePD(kPDRUNCFG_PD_PLL0_SSCG);
|
||||||
|
const pll_setup_t pll0Setup = {
|
||||||
|
.pllctrl = SYSCON_PLL0CTRL_CLKEN_MASK | SYSCON_PLL0CTRL_SELI(53U) | SYSCON_PLL0CTRL_SELP(26U),
|
||||||
|
.pllndec = SYSCON_PLL0NDEC_NDIV(4U),
|
||||||
|
.pllpdec = SYSCON_PLL0PDEC_PDIV(2U),
|
||||||
|
.pllsscg = {0x0U,(SYSCON_PLL0SSCG1_MDIV_EXT(100U) | SYSCON_PLL0SSCG1_SEL_EXT_MASK)},
|
||||||
|
.pllRate = 100000000U,
|
||||||
|
.flags = PLL_SETUPFLAG_WAITLOCK
|
||||||
|
};
|
||||||
|
CLOCK_SetPLL0Freq(&pll0Setup); /*!< Configure PLL0 to the desired values */
|
||||||
|
|
||||||
|
/*!< Set up dividers */
|
||||||
|
CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false); /*!< Set AHBCLKDIV divider to value 1 */
|
||||||
|
|
||||||
|
/*!< Set up clock selectors - Attach clocks to the peripheries */
|
||||||
|
CLOCK_AttachClk(kPLL0_to_MAIN_CLK); /*!< Switch MAIN_CLK to PLL0 */
|
||||||
|
|
||||||
|
/*!< Set SystemCoreClock variable. */
|
||||||
|
SystemCoreClock = BOARD_BOOTCLOCKPLL100M_CORE_CLOCK;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
******************** Configuration BOARD_BootClockPLL150M *********************
|
||||||
|
******************************************************************************/
|
||||||
|
/* clang-format off */
|
||||||
|
/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
|
||||||
|
!!Configuration
|
||||||
|
name: BOARD_BootClockPLL150M
|
||||||
|
called_from_default_init: true
|
||||||
|
outputs:
|
||||||
|
- {id: System_clock.outFreq, value: 150 MHz}
|
||||||
|
settings:
|
||||||
|
- {id: PLL0_Mode, value: Normal}
|
||||||
|
- {id: ENABLE_CLKIN_ENA, value: Enabled}
|
||||||
|
- {id: ENABLE_SYSTEM_CLK_OUT, value: Enabled}
|
||||||
|
- {id: SYSCON.MAINCLKSELB.sel, value: SYSCON.PLL0_BYPASS}
|
||||||
|
- {id: SYSCON.PLL0CLKSEL.sel, value: SYSCON.CLK_IN_EN}
|
||||||
|
- {id: SYSCON.PLL0M_MULT.scale, value: '150', locked: true}
|
||||||
|
- {id: SYSCON.PLL0N_DIV.scale, value: '8', locked: true}
|
||||||
|
- {id: SYSCON.PLL0_PDEC.scale, value: '2', locked: true}
|
||||||
|
sources:
|
||||||
|
- {id: SYSCON.XTAL32M.outFreq, value: 16 MHz, enabled: true}
|
||||||
|
* BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
|
||||||
|
/* clang-format on */
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Variables for BOARD_BootClockPLL150M configuration
|
||||||
|
******************************************************************************/
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code for BOARD_BootClockPLL150M configuration
|
||||||
|
******************************************************************************/
|
||||||
|
void BOARD_BootClockPLL150M(void)
|
||||||
|
{
|
||||||
|
#ifndef SDK_SECONDARY_CORE
|
||||||
|
/*!< Set up the clock sources */
|
||||||
|
/*!< Configure FRO192M */
|
||||||
|
POWER_DisablePD(kPDRUNCFG_PD_FRO192M); /*!< Ensure FRO is on */
|
||||||
|
CLOCK_SetupFROClocking(12000000U); /*!< Set up FRO to the 12 MHz, just for sure */
|
||||||
|
CLOCK_AttachClk(kFRO12M_to_MAIN_CLK); /*!< Switch to FRO 12MHz first to ensure we can change the clock setting */
|
||||||
|
|
||||||
|
/*!< Configure XTAL32M */
|
||||||
|
POWER_DisablePD(kPDRUNCFG_PD_XTAL32M); /* Ensure XTAL32M is powered */
|
||||||
|
POWER_DisablePD(kPDRUNCFG_PD_LDOXO32M); /* Ensure XTAL32M is powered */
|
||||||
|
CLOCK_SetupExtClocking(16000000U); /* Enable clk_in clock */
|
||||||
|
SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_CLKIN_ENA_MASK; /* Enable clk_in from XTAL32M clock */
|
||||||
|
ANACTRL->XO32M_CTRL |= ANACTRL_XO32M_CTRL_ENABLE_SYSTEM_CLK_OUT_MASK; /* Enable clk_in to system */
|
||||||
|
|
||||||
|
POWER_SetVoltageForFreq(150000000U); /*!< Set voltage for the one of the fastest clock outputs: System clock output */
|
||||||
|
CLOCK_SetFLASHAccessCyclesForFreq(150000000U); /*!< Set FLASH wait states for core */
|
||||||
|
|
||||||
|
/*!< Set up PLL */
|
||||||
|
CLOCK_AttachClk(kEXT_CLK_to_PLL0); /*!< Switch PLL0CLKSEL to EXT_CLK */
|
||||||
|
POWER_DisablePD(kPDRUNCFG_PD_PLL0); /* Ensure PLL is on */
|
||||||
|
POWER_DisablePD(kPDRUNCFG_PD_PLL0_SSCG);
|
||||||
|
const pll_setup_t pll0Setup = {
|
||||||
|
.pllctrl = SYSCON_PLL0CTRL_CLKEN_MASK | SYSCON_PLL0CTRL_SELI(53U) | SYSCON_PLL0CTRL_SELP(31U),
|
||||||
|
.pllndec = SYSCON_PLL0NDEC_NDIV(8U),
|
||||||
|
.pllpdec = SYSCON_PLL0PDEC_PDIV(1U),
|
||||||
|
.pllsscg = {0x0U,(SYSCON_PLL0SSCG1_MDIV_EXT(150U) | SYSCON_PLL0SSCG1_SEL_EXT_MASK)},
|
||||||
|
.pllRate = 150000000U,
|
||||||
|
.flags = PLL_SETUPFLAG_WAITLOCK
|
||||||
|
};
|
||||||
|
CLOCK_SetPLL0Freq(&pll0Setup); /*!< Configure PLL0 to the desired values */
|
||||||
|
|
||||||
|
/*!< Set up dividers */
|
||||||
|
CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false); /*!< Set AHBCLKDIV divider to value 1 */
|
||||||
|
|
||||||
|
/*!< Set up clock selectors - Attach clocks to the peripheries */
|
||||||
|
CLOCK_AttachClk(kPLL0_to_MAIN_CLK); /*!< Switch MAIN_CLK to PLL0 */
|
||||||
|
|
||||||
|
/*!< Set SystemCoreClock variable. */
|
||||||
|
SystemCoreClock = BOARD_BOOTCLOCKPLL150M_CORE_CLOCK;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
******************* Configuration BOARD_BootClockPLL1_150M ********************
|
||||||
|
******************************************************************************/
|
||||||
|
/* clang-format off */
|
||||||
|
/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
|
||||||
|
!!Configuration
|
||||||
|
name: BOARD_BootClockPLL1_150M
|
||||||
|
outputs:
|
||||||
|
- {id: System_clock.outFreq, value: 150 MHz}
|
||||||
|
settings:
|
||||||
|
- {id: PLL1_Mode, value: Normal}
|
||||||
|
- {id: ENABLE_CLKIN_ENA, value: Enabled}
|
||||||
|
- {id: ENABLE_SYSTEM_CLK_OUT, value: Enabled}
|
||||||
|
- {id: SYSCON.MAINCLKSELB.sel, value: SYSCON.PLL1_BYPASS}
|
||||||
|
- {id: SYSCON.PLL1CLKSEL.sel, value: SYSCON.CLK_IN_EN}
|
||||||
|
- {id: SYSCON.PLL1M_MULT.scale, value: '150', locked: true}
|
||||||
|
- {id: SYSCON.PLL1N_DIV.scale, value: '8', locked: true}
|
||||||
|
- {id: SYSCON.PLL1_PDEC.scale, value: '2', locked: true}
|
||||||
|
sources:
|
||||||
|
- {id: SYSCON.XTAL32M.outFreq, value: 16 MHz, enabled: true}
|
||||||
|
* BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
|
||||||
|
/* clang-format on */
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Variables for BOARD_BootClockPLL1_150M configuration
|
||||||
|
******************************************************************************/
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code for BOARD_BootClockPLL1_150M configuration
|
||||||
|
******************************************************************************/
|
||||||
|
void BOARD_BootClockPLL1_150M(void)
|
||||||
|
{
|
||||||
|
#ifndef SDK_SECONDARY_CORE
|
||||||
|
/*!< Set up the clock sources */
|
||||||
|
/*!< Configure FRO192M */
|
||||||
|
POWER_DisablePD(kPDRUNCFG_PD_FRO192M); /*!< Ensure FRO is on */
|
||||||
|
CLOCK_SetupFROClocking(12000000U); /*!< Set up FRO to the 12 MHz, just for sure */
|
||||||
|
CLOCK_AttachClk(kFRO12M_to_MAIN_CLK); /*!< Switch to FRO 12MHz first to ensure we can change the clock setting */
|
||||||
|
|
||||||
|
/*!< Configure XTAL32M */
|
||||||
|
POWER_DisablePD(kPDRUNCFG_PD_XTAL32M); /* Ensure XTAL32M is powered */
|
||||||
|
POWER_DisablePD(kPDRUNCFG_PD_LDOXO32M); /* Ensure XTAL32M is powered */
|
||||||
|
CLOCK_SetupExtClocking(16000000U); /* Enable clk_in clock */
|
||||||
|
SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_CLKIN_ENA_MASK; /* Enable clk_in from XTAL32M clock */
|
||||||
|
ANACTRL->XO32M_CTRL |= ANACTRL_XO32M_CTRL_ENABLE_SYSTEM_CLK_OUT_MASK; /* Enable clk_in to system */
|
||||||
|
|
||||||
|
POWER_SetVoltageForFreq(150000000U); /*!< Set voltage for the one of the fastest clock outputs: System clock output */
|
||||||
|
CLOCK_SetFLASHAccessCyclesForFreq(150000000U); /*!< Set FLASH wait states for core */
|
||||||
|
|
||||||
|
/*!< Set up PLL1 */
|
||||||
|
CLOCK_AttachClk(kEXT_CLK_to_PLL1); /*!< Switch PLL1CLKSEL to EXT_CLK */
|
||||||
|
POWER_DisablePD(kPDRUNCFG_PD_PLL1); /* Ensure PLL is on */
|
||||||
|
const pll_setup_t pll1Setup = {
|
||||||
|
.pllctrl = SYSCON_PLL1CTRL_CLKEN_MASK | SYSCON_PLL1CTRL_SELI(53U) | SYSCON_PLL1CTRL_SELP(31U),
|
||||||
|
.pllndec = SYSCON_PLL1NDEC_NDIV(8U),
|
||||||
|
.pllpdec = SYSCON_PLL1PDEC_PDIV(1U),
|
||||||
|
.pllmdec = SYSCON_PLL1MDEC_MDIV(150U),
|
||||||
|
.pllRate = 150000000U,
|
||||||
|
.flags = PLL_SETUPFLAG_WAITLOCK
|
||||||
|
};
|
||||||
|
CLOCK_SetPLL1Freq(&pll1Setup); /*!< Configure PLL1 to the desired values */
|
||||||
|
|
||||||
|
/*!< Set up dividers */
|
||||||
|
CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false); /*!< Set AHBCLKDIV divider to value 1 */
|
||||||
|
|
||||||
|
/*!< Set up clock selectors - Attach clocks to the peripheries */
|
||||||
|
CLOCK_AttachClk(kPLL1_to_MAIN_CLK); /*!< Switch MAIN_CLK to PLL1 */
|
||||||
|
|
||||||
|
/*!< Set SystemCoreClock variable. */
|
||||||
|
SystemCoreClock = BOARD_BOOTCLOCKPLL1_150M_CORE_CLOCK;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,166 @@
|
||||||
|
/***********************************************************************************************************************
|
||||||
|
* This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file
|
||||||
|
* will be overwritten if the respective MCUXpresso Config Tools is used to update this file.
|
||||||
|
**********************************************************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _CLOCK_CONFIG_H_
|
||||||
|
#define _CLOCK_CONFIG_H_
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
#define BOARD_XTAL0_CLK_HZ 16000000U /*!< Board xtal frequency in Hz */
|
||||||
|
#define BOARD_XTAL32K_CLK_HZ 32768U /*!< Board xtal32K frequency in Hz */
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
************************ BOARD_InitBootClocks function ************************
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This function executes default configuration of clocks.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void BOARD_InitBootClocks(void);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
******************** Configuration BOARD_BootClockFRO12M **********************
|
||||||
|
******************************************************************************/
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions for BOARD_BootClockFRO12M configuration
|
||||||
|
******************************************************************************/
|
||||||
|
#define BOARD_BOOTCLOCKFRO12M_CORE_CLOCK 12000000U /*!< Core clock frequency: 12000000Hz */
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API for BOARD_BootClockFRO12M configuration
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This function executes configuration of clocks.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void BOARD_BootClockFRO12M(void);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
******************* Configuration BOARD_BootClockFROHF96M *********************
|
||||||
|
******************************************************************************/
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions for BOARD_BootClockFROHF96M configuration
|
||||||
|
******************************************************************************/
|
||||||
|
#define BOARD_BOOTCLOCKFROHF96M_CORE_CLOCK 96000000U /*!< Core clock frequency: 96000000Hz */
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API for BOARD_BootClockFROHF96M configuration
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This function executes configuration of clocks.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void BOARD_BootClockFROHF96M(void);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
******************** Configuration BOARD_BootClockPLL100M *********************
|
||||||
|
******************************************************************************/
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions for BOARD_BootClockPLL100M configuration
|
||||||
|
******************************************************************************/
|
||||||
|
#define BOARD_BOOTCLOCKPLL100M_CORE_CLOCK 100000000U /*!< Core clock frequency: 100000000Hz */
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API for BOARD_BootClockPLL100M configuration
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This function executes configuration of clocks.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void BOARD_BootClockPLL100M(void);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
******************** Configuration BOARD_BootClockPLL150M *********************
|
||||||
|
******************************************************************************/
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions for BOARD_BootClockPLL150M configuration
|
||||||
|
******************************************************************************/
|
||||||
|
#define BOARD_BOOTCLOCKPLL150M_CORE_CLOCK 150000000U /*!< Core clock frequency: 150000000Hz */
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API for BOARD_BootClockPLL150M configuration
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This function executes configuration of clocks.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void BOARD_BootClockPLL150M(void);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
******************* Configuration BOARD_BootClockPLL1_150M ********************
|
||||||
|
******************************************************************************/
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions for BOARD_BootClockPLL1_150M configuration
|
||||||
|
******************************************************************************/
|
||||||
|
#define BOARD_BOOTCLOCKPLL1_150M_CORE_CLOCK 150000000U /*!< Core clock frequency: 150000000Hz */
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API for BOARD_BootClockPLL1_150M configuration
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This function executes configuration of clocks.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void BOARD_BootClockPLL1_150M(void);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
#endif /* _CLOCK_CONFIG_H_ */
|
||||||
|
|
||||||
|
|
@ -0,0 +1,198 @@
|
||||||
|
/***********************************************************************************************************************
|
||||||
|
* This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file
|
||||||
|
* will be overwritten if the respective MCUXpresso Config Tools is used to update this file.
|
||||||
|
**********************************************************************************************************************/
|
||||||
|
|
||||||
|
/* clang-format off */
|
||||||
|
/*
|
||||||
|
* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
|
||||||
|
!!GlobalInfo
|
||||||
|
product: Pins v10.0
|
||||||
|
processor: LPC55S69
|
||||||
|
package_id: LPC55S69JBD100
|
||||||
|
mcu_data: ksdk2_0
|
||||||
|
processor_version: 10.0.0
|
||||||
|
pin_labels:
|
||||||
|
- {pin_num: '1', pin_signal: PIO1_4/FC0_SCK/SD0_D0/CTIMER2_MAT1/SCT0_OUT0/FREQME_GPIO_CLK_A, label: LED_BLUE, identifier: LED_BLUE}
|
||||||
|
- {pin_num: '5', pin_signal: PIO1_6/FC0_TXD_SCL_MISO_WS/SD0_D3/CTIMER2_MAT1/SCT_GPI3, label: LED_RED, identifier: LED_RED}
|
||||||
|
- {pin_num: '9', pin_signal: PIO1_7/FC0_RTS_SCL_SSEL1/SD0_D1/CTIMER2_MAT2/SCT_GPI4, label: LED_GREEN, identifier: LED_GREEN}
|
||||||
|
- {pin_num: '10', pin_signal: PIO1_9/FC1_SCK/CT_INP4/SCT0_OUT2/FC4_CTS_SDA_SSEL0/ADC0_12, label: USER_BUTTON, identifier: USER_BUTTON}
|
||||||
|
- {pin_num: '94', pin_signal: PIO0_30/FC0_TXD_SCL_MISO_WS/SD1_D3/CTIMER0_MAT0/SCT0_OUT9/SECURE_GPIO0_30, label: UART_TX, identifier: UART_TX}
|
||||||
|
- {pin_num: '92', pin_signal: PIO0_29/FC0_RXD_SDA_MOSI_DATA/SD1_D2/CTIMER2_MAT3/SCT0_OUT8/CMP0_OUT/PLU_OUT2/SECURE_GPIO0_29, label: UART_RX, identifier: UART_RX}
|
||||||
|
* BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********
|
||||||
|
*/
|
||||||
|
/* clang-format on */
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
#include "fsl_gpio.h"
|
||||||
|
#include "fsl_iocon.h"
|
||||||
|
#include "pin_mux.h"
|
||||||
|
|
||||||
|
/* FUNCTION ************************************************************************************************************
|
||||||
|
*
|
||||||
|
* Function Name : BOARD_InitBootPins
|
||||||
|
* Description : Calls initialization functions.
|
||||||
|
*
|
||||||
|
* END ****************************************************************************************************************/
|
||||||
|
void BOARD_InitBootPins(void)
|
||||||
|
{
|
||||||
|
BOARD_InitPins();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* clang-format off */
|
||||||
|
/*
|
||||||
|
* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
|
||||||
|
BOARD_InitPins:
|
||||||
|
- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}
|
||||||
|
- pin_list:
|
||||||
|
- {pin_num: '92', peripheral: FLEXCOMM0, signal: RXD_SDA_MOSI_DATA, pin_signal: PIO0_29/FC0_RXD_SDA_MOSI_DATA/SD1_D2/CTIMER2_MAT3/SCT0_OUT8/CMP0_OUT/PLU_OUT2/SECURE_GPIO0_29,
|
||||||
|
direction: INPUT, mode: inactive, slew_rate: standard, invert: disabled, open_drain: disabled}
|
||||||
|
- {pin_num: '94', peripheral: FLEXCOMM0, signal: TXD_SCL_MISO_WS, pin_signal: PIO0_30/FC0_TXD_SCL_MISO_WS/SD1_D3/CTIMER0_MAT0/SCT0_OUT9/SECURE_GPIO0_30, direction: OUTPUT,
|
||||||
|
mode: inactive, slew_rate: standard, invert: disabled, open_drain: disabled}
|
||||||
|
- {pin_num: '1', peripheral: GPIO, signal: 'PIO1, 4', pin_signal: PIO1_4/FC0_SCK/SD0_D0/CTIMER2_MAT1/SCT0_OUT0/FREQME_GPIO_CLK_A, direction: OUTPUT, gpio_init_state: 'true'}
|
||||||
|
- {pin_num: '5', peripheral: GPIO, signal: 'PIO1, 6', pin_signal: PIO1_6/FC0_TXD_SCL_MISO_WS/SD0_D3/CTIMER2_MAT1/SCT_GPI3, direction: OUTPUT, gpio_init_state: 'true'}
|
||||||
|
- {pin_num: '9', peripheral: GPIO, signal: 'PIO1, 7', pin_signal: PIO1_7/FC0_RTS_SCL_SSEL1/SD0_D1/CTIMER2_MAT2/SCT_GPI4, direction: OUTPUT, gpio_init_state: 'true'}
|
||||||
|
- {pin_num: '10', peripheral: GPIO, signal: 'PIO1, 9', pin_signal: PIO1_9/FC1_SCK/CT_INP4/SCT0_OUT2/FC4_CTS_SDA_SSEL0/ADC0_12}
|
||||||
|
* BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********
|
||||||
|
*/
|
||||||
|
/* clang-format on */
|
||||||
|
|
||||||
|
/* FUNCTION ************************************************************************************************************
|
||||||
|
*
|
||||||
|
* Function Name : BOARD_InitPins
|
||||||
|
* Description : Configures pin routing and optionally pin electrical features.
|
||||||
|
*
|
||||||
|
* END ****************************************************************************************************************/
|
||||||
|
/* Function assigned for the Cortex-M33 (Core #0) */
|
||||||
|
void BOARD_InitPins(void)
|
||||||
|
{
|
||||||
|
/* Enables the clock for the I/O controller.: Enable Clock. */
|
||||||
|
CLOCK_EnableClock(kCLOCK_Iocon);
|
||||||
|
|
||||||
|
/* Enables the clock for the GPIO1 module */
|
||||||
|
CLOCK_EnableClock(kCLOCK_Gpio1);
|
||||||
|
|
||||||
|
gpio_pin_config_t LED_BLUE_config = {
|
||||||
|
.pinDirection = kGPIO_DigitalOutput,
|
||||||
|
.outputLogic = 1U
|
||||||
|
};
|
||||||
|
/* Initialize GPIO functionality on pin PIO1_4 (pin 1) */
|
||||||
|
GPIO_PinInit(BOARD_INITPINS_LED_BLUE_GPIO, BOARD_INITPINS_LED_BLUE_PORT, BOARD_INITPINS_LED_BLUE_PIN, &LED_BLUE_config);
|
||||||
|
|
||||||
|
gpio_pin_config_t LED_RED_config = {
|
||||||
|
.pinDirection = kGPIO_DigitalOutput,
|
||||||
|
.outputLogic = 1U
|
||||||
|
};
|
||||||
|
/* Initialize GPIO functionality on pin PIO1_6 (pin 5) */
|
||||||
|
GPIO_PinInit(BOARD_INITPINS_LED_RED_GPIO, BOARD_INITPINS_LED_RED_PORT, BOARD_INITPINS_LED_RED_PIN, &LED_RED_config);
|
||||||
|
|
||||||
|
gpio_pin_config_t LED_GREEN_config = {
|
||||||
|
.pinDirection = kGPIO_DigitalOutput,
|
||||||
|
.outputLogic = 1U
|
||||||
|
};
|
||||||
|
/* Initialize GPIO functionality on pin PIO1_7 (pin 9) */
|
||||||
|
GPIO_PinInit(BOARD_INITPINS_LED_GREEN_GPIO, BOARD_INITPINS_LED_GREEN_PORT, BOARD_INITPINS_LED_GREEN_PIN, &LED_GREEN_config);
|
||||||
|
|
||||||
|
const uint32_t UART_RX = (/* Pin is configured as FC0_RXD_SDA_MOSI_DATA */
|
||||||
|
IOCON_PIO_FUNC1 |
|
||||||
|
/* No addition pin function */
|
||||||
|
IOCON_PIO_MODE_INACT |
|
||||||
|
/* Standard mode, output slew rate control is enabled */
|
||||||
|
IOCON_PIO_SLEW_STANDARD |
|
||||||
|
/* Input function is not inverted */
|
||||||
|
IOCON_PIO_INV_DI |
|
||||||
|
/* Enables digital function */
|
||||||
|
IOCON_PIO_DIGITAL_EN |
|
||||||
|
/* Open drain is disabled */
|
||||||
|
IOCON_PIO_OPENDRAIN_DI);
|
||||||
|
/* PORT0 PIN29 (coords: 92) is configured as FC0_RXD_SDA_MOSI_DATA */
|
||||||
|
IOCON_PinMuxSet(IOCON, BOARD_INITPINS_UART_RX_PORT, BOARD_INITPINS_UART_RX_PIN, UART_RX);
|
||||||
|
|
||||||
|
const uint32_t UART_TX = (/* Pin is configured as FC0_TXD_SCL_MISO_WS */
|
||||||
|
IOCON_PIO_FUNC1 |
|
||||||
|
/* No addition pin function */
|
||||||
|
IOCON_PIO_MODE_INACT |
|
||||||
|
/* Standard mode, output slew rate control is enabled */
|
||||||
|
IOCON_PIO_SLEW_STANDARD |
|
||||||
|
/* Input function is not inverted */
|
||||||
|
IOCON_PIO_INV_DI |
|
||||||
|
/* Enables digital function */
|
||||||
|
IOCON_PIO_DIGITAL_EN |
|
||||||
|
/* Open drain is disabled */
|
||||||
|
IOCON_PIO_OPENDRAIN_DI);
|
||||||
|
/* PORT0 PIN30 (coords: 94) is configured as FC0_TXD_SCL_MISO_WS */
|
||||||
|
IOCON_PinMuxSet(IOCON, BOARD_INITPINS_UART_TX_PORT, BOARD_INITPINS_UART_TX_PIN, UART_TX);
|
||||||
|
|
||||||
|
IOCON->PIO[1][4] = ((IOCON->PIO[1][4] &
|
||||||
|
/* Mask bits to zero which are setting */
|
||||||
|
(~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK)))
|
||||||
|
|
||||||
|
/* Selects pin function.
|
||||||
|
* : PORT14 (pin 1) is configured as PIO1_4. */
|
||||||
|
| IOCON_PIO_FUNC(PIO1_4_FUNC_ALT0)
|
||||||
|
|
||||||
|
/* Select Digital mode.
|
||||||
|
* : Enable Digital mode.
|
||||||
|
* Digital input is enabled. */
|
||||||
|
| IOCON_PIO_DIGIMODE(PIO1_4_DIGIMODE_DIGITAL));
|
||||||
|
|
||||||
|
IOCON->PIO[1][6] = ((IOCON->PIO[1][6] &
|
||||||
|
/* Mask bits to zero which are setting */
|
||||||
|
(~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK)))
|
||||||
|
|
||||||
|
/* Selects pin function.
|
||||||
|
* : PORT16 (pin 5) is configured as PIO1_6. */
|
||||||
|
| IOCON_PIO_FUNC(PIO1_6_FUNC_ALT0)
|
||||||
|
|
||||||
|
/* Select Digital mode.
|
||||||
|
* : Enable Digital mode.
|
||||||
|
* Digital input is enabled. */
|
||||||
|
| IOCON_PIO_DIGIMODE(PIO1_6_DIGIMODE_DIGITAL));
|
||||||
|
|
||||||
|
IOCON->PIO[1][7] = ((IOCON->PIO[1][7] &
|
||||||
|
/* Mask bits to zero which are setting */
|
||||||
|
(~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK)))
|
||||||
|
|
||||||
|
/* Selects pin function.
|
||||||
|
* : PORT17 (pin 9) is configured as PIO1_7. */
|
||||||
|
| IOCON_PIO_FUNC(PIO1_7_FUNC_ALT0)
|
||||||
|
|
||||||
|
/* Select Digital mode.
|
||||||
|
* : Enable Digital mode.
|
||||||
|
* Digital input is enabled. */
|
||||||
|
| IOCON_PIO_DIGIMODE(PIO1_7_DIGIMODE_DIGITAL));
|
||||||
|
|
||||||
|
if (Chip_GetVersion()==1)
|
||||||
|
{
|
||||||
|
IOCON->PIO[1][9] = ((IOCON->PIO[1][9] &
|
||||||
|
/* Mask bits to zero which are setting */
|
||||||
|
(~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK)))
|
||||||
|
|
||||||
|
/* Selects pin function.
|
||||||
|
* : PORT19 (pin 10) is configured as PIO1_9. */
|
||||||
|
| IOCON_PIO_FUNC(PIO1_9_FUNC_ALT0)
|
||||||
|
|
||||||
|
/* Select Digital mode.
|
||||||
|
* : Enable Digital mode.
|
||||||
|
* Digital input is enabled. */
|
||||||
|
| IOCON_PIO_DIGIMODE(PIO1_9_DIGIMODE_DIGITAL));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
IOCON->PIO[1][9] = ((IOCON->PIO[1][9] &
|
||||||
|
/* Mask bits to zero which are setting */
|
||||||
|
(~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK)))
|
||||||
|
|
||||||
|
/* Selects pin function.
|
||||||
|
* : PORT19 (pin 10) is configured as PIO1_9. */
|
||||||
|
| IOCON_PIO_FUNC(PIO1_9_FUNC_ALT0)
|
||||||
|
|
||||||
|
/* Select Digital mode.
|
||||||
|
* : Enable Digital mode.
|
||||||
|
* Digital input is enabled. */
|
||||||
|
| IOCON_PIO_DIGIMODE(PIO1_9_DIGIMODE_DIGITAL));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/***********************************************************************************************************************
|
||||||
|
* EOF
|
||||||
|
**********************************************************************************************************************/
|
||||||
|
|
@ -0,0 +1,118 @@
|
||||||
|
/***********************************************************************************************************************
|
||||||
|
* This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file
|
||||||
|
* will be overwritten if the respective MCUXpresso Config Tools is used to update this file.
|
||||||
|
**********************************************************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _PIN_MUX_H_
|
||||||
|
#define _PIN_MUX_H_
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @addtogroup pin_mux
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/***********************************************************************************************************************
|
||||||
|
* API
|
||||||
|
**********************************************************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Calls initialization functions.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void BOARD_InitBootPins(void);
|
||||||
|
|
||||||
|
#define IOCON_PIO_DIGITAL_EN 0x0100u /*!<@brief Enables digital function */
|
||||||
|
#define IOCON_PIO_FUNC1 0x01u /*!<@brief Selects pin function 1 */
|
||||||
|
#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input function is not inverted */
|
||||||
|
#define IOCON_PIO_MODE_INACT 0x00u /*!<@brief No addition pin function */
|
||||||
|
#define IOCON_PIO_OPENDRAIN_DI 0x00u /*!<@brief Open drain is disabled */
|
||||||
|
#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */
|
||||||
|
#define PIO1_4_DIGIMODE_DIGITAL 0x01u /*!<@brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */
|
||||||
|
#define PIO1_4_FUNC_ALT0 0x00u /*!<@brief Selects pin function.: Alternative connection 0. */
|
||||||
|
#define PIO1_6_DIGIMODE_DIGITAL 0x01u /*!<@brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */
|
||||||
|
#define PIO1_6_FUNC_ALT0 0x00u /*!<@brief Selects pin function.: Alternative connection 0. */
|
||||||
|
#define PIO1_7_DIGIMODE_DIGITAL 0x01u /*!<@brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */
|
||||||
|
#define PIO1_7_FUNC_ALT0 0x00u /*!<@brief Selects pin function.: Alternative connection 0. */
|
||||||
|
#define PIO1_9_DIGIMODE_DIGITAL 0x01u /*!<@brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */
|
||||||
|
#define PIO1_9_FUNC_ALT0 0x00u /*!<@brief Selects pin function.: Alternative connection 0. */
|
||||||
|
|
||||||
|
/*! @name PIO0_29 (number 92), UART_RX
|
||||||
|
@{ */
|
||||||
|
#define BOARD_INITPINS_UART_RX_PORT 0U /*!<@brief PORT peripheral base pointer */
|
||||||
|
#define BOARD_INITPINS_UART_RX_PIN 29U /*!<@brief PORT pin number */
|
||||||
|
#define BOARD_INITPINS_UART_RX_PIN_MASK (1U << 29U) /*!<@brief PORT pin mask */
|
||||||
|
/* @} */
|
||||||
|
|
||||||
|
/*! @name PIO0_30 (number 94), UART_TX
|
||||||
|
@{ */
|
||||||
|
#define BOARD_INITPINS_UART_TX_PORT 0U /*!<@brief PORT peripheral base pointer */
|
||||||
|
#define BOARD_INITPINS_UART_TX_PIN 30U /*!<@brief PORT pin number */
|
||||||
|
#define BOARD_INITPINS_UART_TX_PIN_MASK (1U << 30U) /*!<@brief PORT pin mask */
|
||||||
|
/* @} */
|
||||||
|
|
||||||
|
/*! @name PIO1_4 (number 1), LED_BLUE
|
||||||
|
@{ */
|
||||||
|
|
||||||
|
/* Symbols to be used with GPIO driver */
|
||||||
|
#define BOARD_INITPINS_LED_BLUE_GPIO GPIO /*!<@brief GPIO peripheral base pointer */
|
||||||
|
#define BOARD_INITPINS_LED_BLUE_GPIO_PIN_MASK (1U << 4U) /*!<@brief GPIO pin mask */
|
||||||
|
#define BOARD_INITPINS_LED_BLUE_PORT 1U /*!<@brief PORT peripheral base pointer */
|
||||||
|
#define BOARD_INITPINS_LED_BLUE_PIN 4U /*!<@brief PORT pin number */
|
||||||
|
#define BOARD_INITPINS_LED_BLUE_PIN_MASK (1U << 4U) /*!<@brief PORT pin mask */
|
||||||
|
/* @} */
|
||||||
|
|
||||||
|
/*! @name PIO1_6 (number 5), LED_RED
|
||||||
|
@{ */
|
||||||
|
|
||||||
|
/* Symbols to be used with GPIO driver */
|
||||||
|
#define BOARD_INITPINS_LED_RED_GPIO GPIO /*!<@brief GPIO peripheral base pointer */
|
||||||
|
#define BOARD_INITPINS_LED_RED_GPIO_PIN_MASK (1U << 6U) /*!<@brief GPIO pin mask */
|
||||||
|
#define BOARD_INITPINS_LED_RED_PORT 1U /*!<@brief PORT peripheral base pointer */
|
||||||
|
#define BOARD_INITPINS_LED_RED_PIN 6U /*!<@brief PORT pin number */
|
||||||
|
#define BOARD_INITPINS_LED_RED_PIN_MASK (1U << 6U) /*!<@brief PORT pin mask */
|
||||||
|
/* @} */
|
||||||
|
|
||||||
|
/*! @name PIO1_7 (number 9), LED_GREEN
|
||||||
|
@{ */
|
||||||
|
|
||||||
|
/* Symbols to be used with GPIO driver */
|
||||||
|
#define BOARD_INITPINS_LED_GREEN_GPIO GPIO /*!<@brief GPIO peripheral base pointer */
|
||||||
|
#define BOARD_INITPINS_LED_GREEN_GPIO_PIN_MASK (1U << 7U) /*!<@brief GPIO pin mask */
|
||||||
|
#define BOARD_INITPINS_LED_GREEN_PORT 1U /*!<@brief PORT peripheral base pointer */
|
||||||
|
#define BOARD_INITPINS_LED_GREEN_PIN 7U /*!<@brief PORT pin number */
|
||||||
|
#define BOARD_INITPINS_LED_GREEN_PIN_MASK (1U << 7U) /*!<@brief PORT pin mask */
|
||||||
|
/* @} */
|
||||||
|
|
||||||
|
/*! @name PIO1_9 (number 10), USER_BUTTON
|
||||||
|
@{ */
|
||||||
|
|
||||||
|
/* Symbols to be used with GPIO driver */
|
||||||
|
#define BOARD_INITPINS_USER_BUTTON_GPIO GPIO /*!<@brief GPIO peripheral base pointer */
|
||||||
|
#define BOARD_INITPINS_USER_BUTTON_GPIO_PIN_MASK (1U << 9U) /*!<@brief GPIO pin mask */
|
||||||
|
#define BOARD_INITPINS_USER_BUTTON_PORT 1U /*!<@brief PORT peripheral base pointer */
|
||||||
|
#define BOARD_INITPINS_USER_BUTTON_PIN 9U /*!<@brief PORT pin number */
|
||||||
|
#define BOARD_INITPINS_USER_BUTTON_PIN_MASK (1U << 9U) /*!<@brief PORT pin mask */
|
||||||
|
/* @} */
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Configures pin routing and optionally pin electrical features.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void BOARD_InitPins(void); /* Function assigned for the Cortex-M33 (Core #0) */
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
#endif /* _PIN_MUX_H_ */
|
||||||
|
|
||||||
|
/***********************************************************************************************************************
|
||||||
|
* EOF
|
||||||
|
**********************************************************************************************************************/
|
||||||
|
|
@ -0,0 +1,493 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2018-2019 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*! *********************************************************************************
|
||||||
|
*************************************************************************************
|
||||||
|
* Include
|
||||||
|
*************************************************************************************
|
||||||
|
********************************************************************************** */
|
||||||
|
#include "fsl_component_generic_list.h"
|
||||||
|
|
||||||
|
#if defined(OSA_USED)
|
||||||
|
#include "fsl_os_abstraction.h"
|
||||||
|
#if (defined(USE_RTOS) && (USE_RTOS > 0U))
|
||||||
|
#define LIST_ENTER_CRITICAL() \
|
||||||
|
OSA_SR_ALLOC(); \
|
||||||
|
OSA_ENTER_CRITICAL()
|
||||||
|
#define LIST_EXIT_CRITICAL() OSA_EXIT_CRITICAL()
|
||||||
|
#else
|
||||||
|
#define LIST_ENTER_CRITICAL()
|
||||||
|
#define LIST_EXIT_CRITICAL()
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#define LIST_ENTER_CRITICAL() uint32_t regPrimask = DisableGlobalIRQ();
|
||||||
|
#define LIST_EXIT_CRITICAL() EnableGlobalIRQ(regPrimask);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static list_status_t LIST_Error_Check(list_handle_t list, list_element_handle_t newElement)
|
||||||
|
{
|
||||||
|
list_status_t listStatus = kLIST_Ok;
|
||||||
|
#if (defined(GENERIC_LIST_DUPLICATED_CHECKING) && (GENERIC_LIST_DUPLICATED_CHECKING > 0U))
|
||||||
|
list_element_handle_t element = list->head;
|
||||||
|
#endif
|
||||||
|
if ((list->max != 0U) && (list->max == list->size))
|
||||||
|
{
|
||||||
|
listStatus = kLIST_Full; /*List is full*/
|
||||||
|
}
|
||||||
|
#if (defined(GENERIC_LIST_DUPLICATED_CHECKING) && (GENERIC_LIST_DUPLICATED_CHECKING > 0U))
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (element != NULL) /*Scan list*/
|
||||||
|
{
|
||||||
|
/* Determine if element is duplicated */
|
||||||
|
if (element == newElement)
|
||||||
|
{
|
||||||
|
listStatus = kLIST_DuplicateError;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
element = element->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return listStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! *********************************************************************************
|
||||||
|
*************************************************************************************
|
||||||
|
* Public functions
|
||||||
|
*************************************************************************************
|
||||||
|
********************************************************************************** */
|
||||||
|
/*! *********************************************************************************
|
||||||
|
* \brief Initialises the list descriptor.
|
||||||
|
*
|
||||||
|
* \param[in] list - LIST_ handle to init.
|
||||||
|
* max - Maximum number of elements in list. 0 for unlimited.
|
||||||
|
*
|
||||||
|
* \return void.
|
||||||
|
*
|
||||||
|
* \pre
|
||||||
|
*
|
||||||
|
* \post
|
||||||
|
*
|
||||||
|
* \remarks
|
||||||
|
*
|
||||||
|
********************************************************************************** */
|
||||||
|
void LIST_Init(list_handle_t list, uint32_t max)
|
||||||
|
{
|
||||||
|
list->head = NULL;
|
||||||
|
list->tail = NULL;
|
||||||
|
list->max = (uint16_t)max;
|
||||||
|
list->size = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! *********************************************************************************
|
||||||
|
* \brief Gets the list that contains the given element.
|
||||||
|
*
|
||||||
|
* \param[in] element - Handle of the element.
|
||||||
|
*
|
||||||
|
* \return NULL if element is orphan.
|
||||||
|
* Handle of the list the element is inserted into.
|
||||||
|
*
|
||||||
|
* \pre
|
||||||
|
*
|
||||||
|
* \post
|
||||||
|
*
|
||||||
|
* \remarks
|
||||||
|
*
|
||||||
|
********************************************************************************** */
|
||||||
|
list_handle_t LIST_GetList(list_element_handle_t element)
|
||||||
|
{
|
||||||
|
return element->list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! *********************************************************************************
|
||||||
|
* \brief Links element to the tail of the list.
|
||||||
|
*
|
||||||
|
* \param[in] list - ID of list to insert into.
|
||||||
|
* element - element to add
|
||||||
|
*
|
||||||
|
* \return kLIST_Full if list is full.
|
||||||
|
* kLIST_Ok if insertion was successful.
|
||||||
|
*
|
||||||
|
* \pre
|
||||||
|
*
|
||||||
|
* \post
|
||||||
|
*
|
||||||
|
* \remarks
|
||||||
|
*
|
||||||
|
********************************************************************************** */
|
||||||
|
list_status_t LIST_AddTail(list_handle_t list, list_element_handle_t element)
|
||||||
|
{
|
||||||
|
LIST_ENTER_CRITICAL();
|
||||||
|
list_status_t listStatus = kLIST_Ok;
|
||||||
|
|
||||||
|
listStatus = LIST_Error_Check(list, element);
|
||||||
|
if (listStatus == kLIST_Ok) /* Avoiding list status error */
|
||||||
|
{
|
||||||
|
if (list->size == 0U)
|
||||||
|
{
|
||||||
|
list->head = element;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
list->tail->next = element;
|
||||||
|
}
|
||||||
|
#if (defined(GENERIC_LIST_LIGHT) && (GENERIC_LIST_LIGHT > 0U))
|
||||||
|
#else
|
||||||
|
element->prev = list->tail;
|
||||||
|
#endif
|
||||||
|
element->list = list;
|
||||||
|
element->next = NULL;
|
||||||
|
list->tail = element;
|
||||||
|
list->size++;
|
||||||
|
}
|
||||||
|
|
||||||
|
LIST_EXIT_CRITICAL();
|
||||||
|
return listStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! *********************************************************************************
|
||||||
|
* \brief Links element to the head of the list.
|
||||||
|
*
|
||||||
|
* \param[in] list - ID of list to insert into.
|
||||||
|
* element - element to add
|
||||||
|
*
|
||||||
|
* \return kLIST_Full if list is full.
|
||||||
|
* kLIST_Ok if insertion was successful.
|
||||||
|
*
|
||||||
|
* \pre
|
||||||
|
*
|
||||||
|
* \post
|
||||||
|
*
|
||||||
|
* \remarks
|
||||||
|
*
|
||||||
|
********************************************************************************** */
|
||||||
|
list_status_t LIST_AddHead(list_handle_t list, list_element_handle_t element)
|
||||||
|
{
|
||||||
|
LIST_ENTER_CRITICAL();
|
||||||
|
list_status_t listStatus = kLIST_Ok;
|
||||||
|
|
||||||
|
listStatus = LIST_Error_Check(list, element);
|
||||||
|
if (listStatus == kLIST_Ok) /* Avoiding list status error */
|
||||||
|
{
|
||||||
|
/* Links element to the head of the list */
|
||||||
|
if (list->size == 0U)
|
||||||
|
{
|
||||||
|
list->tail = element;
|
||||||
|
}
|
||||||
|
#if (defined(GENERIC_LIST_LIGHT) && (GENERIC_LIST_LIGHT > 0U))
|
||||||
|
#else
|
||||||
|
else
|
||||||
|
{
|
||||||
|
list->head->prev = element;
|
||||||
|
}
|
||||||
|
element->prev = NULL;
|
||||||
|
#endif
|
||||||
|
element->list = list;
|
||||||
|
element->next = list->head;
|
||||||
|
list->head = element;
|
||||||
|
list->size++;
|
||||||
|
}
|
||||||
|
|
||||||
|
LIST_EXIT_CRITICAL();
|
||||||
|
return listStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! *********************************************************************************
|
||||||
|
* \brief Unlinks element from the head of the list.
|
||||||
|
*
|
||||||
|
* \param[in] list - ID of list to remove from.
|
||||||
|
*
|
||||||
|
* \return NULL if list is empty.
|
||||||
|
* ID of removed element(pointer) if removal was successful.
|
||||||
|
*
|
||||||
|
* \pre
|
||||||
|
*
|
||||||
|
* \post
|
||||||
|
*
|
||||||
|
* \remarks
|
||||||
|
*
|
||||||
|
********************************************************************************** */
|
||||||
|
list_element_handle_t LIST_RemoveHead(list_handle_t list)
|
||||||
|
{
|
||||||
|
list_element_handle_t element;
|
||||||
|
|
||||||
|
LIST_ENTER_CRITICAL();
|
||||||
|
|
||||||
|
if ((NULL == list) || (list->size == 0U))
|
||||||
|
{
|
||||||
|
element = NULL; /*LIST_ is empty*/
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
element = list->head;
|
||||||
|
list->size--;
|
||||||
|
if (list->size == 0U)
|
||||||
|
{
|
||||||
|
list->tail = NULL;
|
||||||
|
}
|
||||||
|
#if (defined(GENERIC_LIST_LIGHT) && (GENERIC_LIST_LIGHT > 0U))
|
||||||
|
#else
|
||||||
|
else
|
||||||
|
{
|
||||||
|
element->next->prev = NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
element->list = NULL;
|
||||||
|
list->head = element->next; /*Is NULL if element is head*/
|
||||||
|
}
|
||||||
|
|
||||||
|
LIST_EXIT_CRITICAL();
|
||||||
|
return element;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! *********************************************************************************
|
||||||
|
* \brief Gets head element ID.
|
||||||
|
*
|
||||||
|
* \param[in] list - ID of list.
|
||||||
|
*
|
||||||
|
* \return NULL if list is empty.
|
||||||
|
* ID of head element if list is not empty.
|
||||||
|
*
|
||||||
|
* \pre
|
||||||
|
*
|
||||||
|
* \post
|
||||||
|
*
|
||||||
|
* \remarks
|
||||||
|
*
|
||||||
|
********************************************************************************** */
|
||||||
|
list_element_handle_t LIST_GetHead(list_handle_t list)
|
||||||
|
{
|
||||||
|
return list->head;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! *********************************************************************************
|
||||||
|
* \brief Gets next element ID.
|
||||||
|
*
|
||||||
|
* \param[in] element - ID of the element.
|
||||||
|
*
|
||||||
|
* \return NULL if element is tail.
|
||||||
|
* ID of next element if exists.
|
||||||
|
*
|
||||||
|
* \pre
|
||||||
|
*
|
||||||
|
* \post
|
||||||
|
*
|
||||||
|
* \remarks
|
||||||
|
*
|
||||||
|
********************************************************************************** */
|
||||||
|
list_element_handle_t LIST_GetNext(list_element_handle_t element)
|
||||||
|
{
|
||||||
|
return element->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! *********************************************************************************
|
||||||
|
* \brief Gets previous element ID.
|
||||||
|
*
|
||||||
|
* \param[in] element - ID of the element.
|
||||||
|
*
|
||||||
|
* \return NULL if element is head.
|
||||||
|
* ID of previous element if exists.
|
||||||
|
*
|
||||||
|
* \pre
|
||||||
|
*
|
||||||
|
* \post
|
||||||
|
*
|
||||||
|
* \remarks
|
||||||
|
*
|
||||||
|
********************************************************************************** */
|
||||||
|
list_element_handle_t LIST_GetPrev(list_element_handle_t element)
|
||||||
|
{
|
||||||
|
#if (defined(GENERIC_LIST_LIGHT) && (GENERIC_LIST_LIGHT > 0U))
|
||||||
|
return NULL;
|
||||||
|
#else
|
||||||
|
return element->prev;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! *********************************************************************************
|
||||||
|
* \brief Unlinks an element from its list.
|
||||||
|
*
|
||||||
|
* \param[in] element - ID of the element to remove.
|
||||||
|
*
|
||||||
|
* \return kLIST_OrphanElement if element is not part of any list.
|
||||||
|
* kLIST_Ok if removal was successful.
|
||||||
|
*
|
||||||
|
* \pre
|
||||||
|
*
|
||||||
|
* \post
|
||||||
|
*
|
||||||
|
* \remarks
|
||||||
|
*
|
||||||
|
********************************************************************************** */
|
||||||
|
list_status_t LIST_RemoveElement(list_element_handle_t element)
|
||||||
|
{
|
||||||
|
list_status_t listStatus = kLIST_Ok;
|
||||||
|
LIST_ENTER_CRITICAL();
|
||||||
|
|
||||||
|
if (element->list == NULL)
|
||||||
|
{
|
||||||
|
listStatus = kLIST_OrphanElement; /*Element was previusly removed or never added*/
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if (defined(GENERIC_LIST_LIGHT) && (GENERIC_LIST_LIGHT > 0U))
|
||||||
|
list_element_handle_t element_list = element->list->head;
|
||||||
|
while (NULL != element_list)
|
||||||
|
{
|
||||||
|
if (element->list->head == element)
|
||||||
|
{
|
||||||
|
element->list->head = element_list->next;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (element_list->next == element)
|
||||||
|
{
|
||||||
|
element_list->next = element->next;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
element_list = element_list->next;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (element->prev == NULL) /*Element is head or solo*/
|
||||||
|
{
|
||||||
|
element->list->head = element->next; /*is null if solo*/
|
||||||
|
}
|
||||||
|
if (element->next == NULL) /*Element is tail or solo*/
|
||||||
|
{
|
||||||
|
element->list->tail = element->prev; /*is null if solo*/
|
||||||
|
}
|
||||||
|
if (element->prev != NULL) /*Element is not head*/
|
||||||
|
{
|
||||||
|
element->prev->next = element->next;
|
||||||
|
}
|
||||||
|
if (element->next != NULL) /*Element is not tail*/
|
||||||
|
{
|
||||||
|
element->next->prev = element->prev;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
element->list->size--;
|
||||||
|
element->list = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
LIST_EXIT_CRITICAL();
|
||||||
|
return listStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! *********************************************************************************
|
||||||
|
* \brief Links an element in the previous position relative to a given member
|
||||||
|
* of a list.
|
||||||
|
*
|
||||||
|
* \param[in] element - ID of a member of a list.
|
||||||
|
* newElement - new element to insert before the given member.
|
||||||
|
*
|
||||||
|
* \return kLIST_OrphanElement if element is not part of any list.
|
||||||
|
* kLIST_Full if list is full.
|
||||||
|
* kLIST_Ok if insertion was successful.
|
||||||
|
*
|
||||||
|
* \pre
|
||||||
|
*
|
||||||
|
* \post
|
||||||
|
*
|
||||||
|
* \remarks
|
||||||
|
*
|
||||||
|
********************************************************************************** */
|
||||||
|
list_status_t LIST_AddPrevElement(list_element_handle_t element, list_element_handle_t newElement)
|
||||||
|
{
|
||||||
|
list_status_t listStatus = kLIST_Ok;
|
||||||
|
LIST_ENTER_CRITICAL();
|
||||||
|
|
||||||
|
if (element->list == NULL)
|
||||||
|
{
|
||||||
|
listStatus = kLIST_OrphanElement; /*Element was previusly removed or never added*/
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
listStatus = LIST_Error_Check(element->list, newElement);
|
||||||
|
if (listStatus == kLIST_Ok)
|
||||||
|
{
|
||||||
|
#if (defined(GENERIC_LIST_LIGHT) && (GENERIC_LIST_LIGHT > 0U))
|
||||||
|
list_element_handle_t element_list = element->list->head;
|
||||||
|
while (NULL != element_list)
|
||||||
|
{
|
||||||
|
if ((element_list->next == element) || (element_list == element))
|
||||||
|
{
|
||||||
|
if (element_list == element)
|
||||||
|
{
|
||||||
|
element->list->head = newElement;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
element_list->next = newElement;
|
||||||
|
}
|
||||||
|
newElement->list = element->list;
|
||||||
|
newElement->next = element;
|
||||||
|
element->list->size++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
element_list = element_list->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
if (element->prev == NULL) /*Element is list head*/
|
||||||
|
{
|
||||||
|
element->list->head = newElement;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
element->prev->next = newElement;
|
||||||
|
}
|
||||||
|
newElement->list = element->list;
|
||||||
|
element->list->size++;
|
||||||
|
newElement->next = element;
|
||||||
|
newElement->prev = element->prev;
|
||||||
|
element->prev = newElement;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LIST_EXIT_CRITICAL();
|
||||||
|
return listStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! *********************************************************************************
|
||||||
|
* \brief Gets the current size of a list.
|
||||||
|
*
|
||||||
|
* \param[in] list - ID of the list.
|
||||||
|
*
|
||||||
|
* \return Current size of the list.
|
||||||
|
*
|
||||||
|
* \pre
|
||||||
|
*
|
||||||
|
* \post
|
||||||
|
*
|
||||||
|
* \remarks
|
||||||
|
*
|
||||||
|
********************************************************************************** */
|
||||||
|
uint32_t LIST_GetSize(list_handle_t list)
|
||||||
|
{
|
||||||
|
return list->size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! *********************************************************************************
|
||||||
|
* \brief Gets the number of free places in the list.
|
||||||
|
*
|
||||||
|
* \param[in] list - ID of the list.
|
||||||
|
*
|
||||||
|
* \return Available size of the list.
|
||||||
|
*
|
||||||
|
* \pre
|
||||||
|
*
|
||||||
|
* \post
|
||||||
|
*
|
||||||
|
* \remarks
|
||||||
|
*
|
||||||
|
********************************************************************************** */
|
||||||
|
uint32_t LIST_GetAvailableSize(list_handle_t list)
|
||||||
|
{
|
||||||
|
return ((uint32_t)list->max - (uint32_t)list->size); /*Gets the number of free places in the list*/
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,201 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2018-2020 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _GENERIC_LIST_H_
|
||||||
|
#define _GENERIC_LIST_H_
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
/*!
|
||||||
|
* @addtogroup GenericList
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**********************************************************************************
|
||||||
|
* Include
|
||||||
|
***********************************************************************************/
|
||||||
|
|
||||||
|
/**********************************************************************************
|
||||||
|
* Public macro definitions
|
||||||
|
***********************************************************************************/
|
||||||
|
/*! @brief Definition to determine whether use list light. */
|
||||||
|
#ifndef GENERIC_LIST_LIGHT
|
||||||
|
#define GENERIC_LIST_LIGHT (1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @brief Definition to determine whether enable list duplicated checking. */
|
||||||
|
#ifndef GENERIC_LIST_DUPLICATED_CHECKING
|
||||||
|
#define GENERIC_LIST_DUPLICATED_CHECKING (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**********************************************************************************
|
||||||
|
* Public type definitions
|
||||||
|
***********************************************************************************/
|
||||||
|
/*! @brief The list status */
|
||||||
|
typedef enum _list_status
|
||||||
|
{
|
||||||
|
kLIST_Ok = kStatus_Success, /*!< Success */
|
||||||
|
kLIST_DuplicateError = MAKE_STATUS(kStatusGroup_LIST, 1), /*!< Duplicate Error */
|
||||||
|
kLIST_Full = MAKE_STATUS(kStatusGroup_LIST, 2), /*!< FULL */
|
||||||
|
kLIST_Empty = MAKE_STATUS(kStatusGroup_LIST, 3), /*!< Empty */
|
||||||
|
kLIST_OrphanElement = MAKE_STATUS(kStatusGroup_LIST, 4), /*!< Orphan Element */
|
||||||
|
kLIST_NotSupport = MAKE_STATUS(kStatusGroup_LIST, 5), /*!< Not Support */
|
||||||
|
} list_status_t;
|
||||||
|
|
||||||
|
/*! @brief The list structure*/
|
||||||
|
typedef struct list_label
|
||||||
|
{
|
||||||
|
struct list_element_tag *head; /*!< list head */
|
||||||
|
struct list_element_tag *tail; /*!< list tail */
|
||||||
|
uint16_t size; /*!< list size */
|
||||||
|
uint16_t max; /*!< list max number of elements */
|
||||||
|
} list_label_t, *list_handle_t;
|
||||||
|
#if (defined(GENERIC_LIST_LIGHT) && (GENERIC_LIST_LIGHT > 0U))
|
||||||
|
/*! @brief The list element*/
|
||||||
|
typedef struct list_element_tag
|
||||||
|
{
|
||||||
|
struct list_element_tag *next; /*!< next list element */
|
||||||
|
struct list_label *list; /*!< pointer to the list */
|
||||||
|
} list_element_t, *list_element_handle_t;
|
||||||
|
#else
|
||||||
|
/*! @brief The list element*/
|
||||||
|
typedef struct list_element_tag
|
||||||
|
{
|
||||||
|
struct list_element_tag *next; /*!< next list element */
|
||||||
|
struct list_element_tag *prev; /*!< previous list element */
|
||||||
|
struct list_label *list; /*!< pointer to the list */
|
||||||
|
} list_element_t, *list_element_handle_t;
|
||||||
|
#endif
|
||||||
|
/**********************************************************************************
|
||||||
|
* Public prototypes
|
||||||
|
***********************************************************************************/
|
||||||
|
/**********************************************************************************
|
||||||
|
* API
|
||||||
|
**********************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* _cplusplus */
|
||||||
|
/*!
|
||||||
|
* @brief Initialize the list.
|
||||||
|
*
|
||||||
|
* This function initialize the list.
|
||||||
|
*
|
||||||
|
* @param list - List handle to initialize.
|
||||||
|
* @param max - Maximum number of elements in list. 0 for unlimited.
|
||||||
|
*/
|
||||||
|
void LIST_Init(list_handle_t list, uint32_t max);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Gets the list that contains the given element.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param element - Handle of the element.
|
||||||
|
* @retval NULL if element is orphan, Handle of the list the element is inserted into.
|
||||||
|
*/
|
||||||
|
list_handle_t LIST_GetList(list_element_handle_t element);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Links element to the head of the list.
|
||||||
|
*
|
||||||
|
* @param list - Handle of the list.
|
||||||
|
* @param element - Handle of the element.
|
||||||
|
* @retval kLIST_Full if list is full, kLIST_Ok if insertion was successful.
|
||||||
|
*/
|
||||||
|
list_status_t LIST_AddHead(list_handle_t list, list_element_handle_t element);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Links element to the tail of the list.
|
||||||
|
*
|
||||||
|
* @param list - Handle of the list.
|
||||||
|
* @param element - Handle of the element.
|
||||||
|
* @retval kLIST_Full if list is full, kLIST_Ok if insertion was successful.
|
||||||
|
*/
|
||||||
|
list_status_t LIST_AddTail(list_handle_t list, list_element_handle_t element);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Unlinks element from the head of the list.
|
||||||
|
*
|
||||||
|
* @param list - Handle of the list.
|
||||||
|
*
|
||||||
|
* @retval NULL if list is empty, handle of removed element(pointer) if removal was successful.
|
||||||
|
*/
|
||||||
|
list_element_handle_t LIST_RemoveHead(list_handle_t list);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Gets head element handle.
|
||||||
|
*
|
||||||
|
* @param list - Handle of the list.
|
||||||
|
*
|
||||||
|
* @retval NULL if list is empty, handle of removed element(pointer) if removal was successful.
|
||||||
|
*/
|
||||||
|
list_element_handle_t LIST_GetHead(list_handle_t list);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Gets next element handle for given element handle.
|
||||||
|
*
|
||||||
|
* @param element - Handle of the element.
|
||||||
|
*
|
||||||
|
* @retval NULL if list is empty, handle of removed element(pointer) if removal was successful.
|
||||||
|
*/
|
||||||
|
list_element_handle_t LIST_GetNext(list_element_handle_t element);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Gets previous element handle for given element handle.
|
||||||
|
*
|
||||||
|
* @param element - Handle of the element.
|
||||||
|
*
|
||||||
|
* @retval NULL if list is empty, handle of removed element(pointer) if removal was successful.
|
||||||
|
*/
|
||||||
|
list_element_handle_t LIST_GetPrev(list_element_handle_t element);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Unlinks an element from its list.
|
||||||
|
*
|
||||||
|
* @param element - Handle of the element.
|
||||||
|
*
|
||||||
|
* @retval kLIST_OrphanElement if element is not part of any list.
|
||||||
|
* @retval kLIST_Ok if removal was successful.
|
||||||
|
*/
|
||||||
|
list_status_t LIST_RemoveElement(list_element_handle_t element);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Links an element in the previous position relative to a given member of a list.
|
||||||
|
*
|
||||||
|
* @param element - Handle of the element.
|
||||||
|
* @param newElement - New element to insert before the given member.
|
||||||
|
*
|
||||||
|
* @retval kLIST_OrphanElement if element is not part of any list.
|
||||||
|
* @retval kLIST_Ok if removal was successful.
|
||||||
|
*/
|
||||||
|
list_status_t LIST_AddPrevElement(list_element_handle_t element, list_element_handle_t newElement);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Gets the current size of a list.
|
||||||
|
*
|
||||||
|
* @param list - Handle of the list.
|
||||||
|
*
|
||||||
|
* @retval Current size of the list.
|
||||||
|
*/
|
||||||
|
uint32_t LIST_GetSize(list_handle_t list);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Gets the number of free places in the list.
|
||||||
|
*
|
||||||
|
* @param list - Handle of the list.
|
||||||
|
*
|
||||||
|
* @retval Available size of the list.
|
||||||
|
*/
|
||||||
|
uint32_t LIST_GetAvailableSize(list_handle_t list);
|
||||||
|
|
||||||
|
/* @} */
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/*! @}*/
|
||||||
|
#endif /*_GENERIC_LIST_H_*/
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,772 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2018-2020 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SERIAL_MANAGER_H__
|
||||||
|
#define __SERIAL_MANAGER_H__
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @addtogroup serialmanager
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
/*! @brief Enable or disable serial manager non-blocking mode (1 - enable, 0 - disable) */
|
||||||
|
#ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE == 0U))
|
||||||
|
#error When SERIAL_MANAGER_NON_BLOCKING_MODE=0, DEBUG_CONSOLE_TRANSFER_NON_BLOCKING can not be set.
|
||||||
|
#else
|
||||||
|
#define SERIAL_MANAGER_NON_BLOCKING_MODE (1U)
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifndef SERIAL_MANAGER_NON_BLOCKING_MODE
|
||||||
|
#define SERIAL_MANAGER_NON_BLOCKING_MODE (0U)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
/*! @brief Enable or disable serial manager dual(block and non-block) mode (1 - enable, 0 - disable) */
|
||||||
|
#ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
|
||||||
|
#else
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
#ifndef SERIAL_MANAGER_NON_BLOCKING_DUAL_MODE
|
||||||
|
#define SERIAL_MANAGER_NON_BLOCKING_DUAL_MODE (1U)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifndef SERIAL_MANAGER_NON_BLOCKING_DUAL_MODE
|
||||||
|
#define SERIAL_MANAGER_NON_BLOCKING_DUAL_MODE (0U)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @brief Enable or disable uart port (1 - enable, 0 - disable) */
|
||||||
|
#ifndef SERIAL_PORT_TYPE_UART
|
||||||
|
#define SERIAL_PORT_TYPE_UART (0U)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @brief Enable or disable USB CDC port (1 - enable, 0 - disable) */
|
||||||
|
#ifndef SERIAL_PORT_TYPE_USBCDC
|
||||||
|
#define SERIAL_PORT_TYPE_USBCDC (0U)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @brief Enable or disable SWO port (1 - enable, 0 - disable) */
|
||||||
|
#ifndef SERIAL_PORT_TYPE_SWO
|
||||||
|
#define SERIAL_PORT_TYPE_SWO (0U)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @brief Enable or disable USB CDC virtual port (1 - enable, 0 - disable) */
|
||||||
|
#ifndef SERIAL_PORT_TYPE_VIRTUAL
|
||||||
|
#define SERIAL_PORT_TYPE_VIRTUAL (0U)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @brief Enable or disable rPMSG port (1 - enable, 0 - disable) */
|
||||||
|
#ifndef SERIAL_PORT_TYPE_RPMSG
|
||||||
|
#define SERIAL_PORT_TYPE_RPMSG (0U)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @brief Enable or disable SerialManager_Task() handle TX to prevent recursive calling */
|
||||||
|
#ifndef SERIAL_MANAGER_TASK_HANDLE_TX
|
||||||
|
#define SERIAL_MANAGER_TASK_HANDLE_TX (0U)
|
||||||
|
#endif
|
||||||
|
#if (defined(SERIAL_MANAGER_TASK_HANDLE_TX) && (SERIAL_MANAGER_TASK_HANDLE_TX > 0U))
|
||||||
|
#ifndef OSA_USED
|
||||||
|
#error When SERIAL_MANAGER_TASK_HANDLE_TX=1, OSA_USED must be set.
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @brief Set the default delay time in ms used by SerialManager_WriteTimeDelay(). */
|
||||||
|
#ifndef SERIAL_MANAGER_WRITE_TIME_DELAY_DEFAULT_VALUE
|
||||||
|
#define SERIAL_MANAGER_WRITE_TIME_DELAY_DEFAULT_VALUE (1U)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @brief Set the default delay time in ms used by SerialManager_ReadTimeDelay(). */
|
||||||
|
#ifndef SERIAL_MANAGER_READ_TIME_DELAY_DEFAULT_VALUE
|
||||||
|
#define SERIAL_MANAGER_READ_TIME_DELAY_DEFAULT_VALUE (1U)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @brief Enable or disable SerialManager_Task() handle RX data available notify */
|
||||||
|
#ifndef SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY
|
||||||
|
#define SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY (0U)
|
||||||
|
#endif
|
||||||
|
#if (defined(SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY) && (SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY > 0U))
|
||||||
|
#ifndef OSA_USED
|
||||||
|
#error When SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY=1, OSA_USED must be set.
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @brief Set serial manager write handle size */
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
#define SERIAL_MANAGER_WRITE_HANDLE_SIZE (44U)
|
||||||
|
#define SERIAL_MANAGER_READ_HANDLE_SIZE (44U)
|
||||||
|
#define SERIAL_MANAGER_WRITE_BLOCK_HANDLE_SIZE (4U)
|
||||||
|
#define SERIAL_MANAGER_READ_BLOCK_HANDLE_SIZE (4U)
|
||||||
|
#else
|
||||||
|
#define SERIAL_MANAGER_WRITE_HANDLE_SIZE (4U)
|
||||||
|
#define SERIAL_MANAGER_READ_HANDLE_SIZE (4U)
|
||||||
|
#define SERIAL_MANAGER_WRITE_BLOCK_HANDLE_SIZE (4U)
|
||||||
|
#define SERIAL_MANAGER_READ_BLOCK_HANDLE_SIZE (4U)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))
|
||||||
|
#include "fsl_component_serial_port_uart.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(SERIAL_PORT_TYPE_RPMSG) && (SERIAL_PORT_TYPE_RPMSG > 0U))
|
||||||
|
#include "fsl_component_serial_port_rpmsg.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))
|
||||||
|
|
||||||
|
#if !(defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
#error The serial manager blocking mode cannot be supported for USB CDC.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "fsl_component_serial_port_usb.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))
|
||||||
|
#include "fsl_component_serial_port_swo.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))
|
||||||
|
|
||||||
|
#if !(defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
#error The serial manager blocking mode cannot be supported for USB CDC.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "fsl_component_serial_port_virtual.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SERIAL_MANAGER_HANDLE_SIZE_TEMP 0U
|
||||||
|
#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))
|
||||||
|
|
||||||
|
#if (SERIAL_PORT_UART_HANDLE_SIZE > SERIAL_MANAGER_HANDLE_SIZE_TEMP)
|
||||||
|
#undef SERIAL_MANAGER_HANDLE_SIZE_TEMP
|
||||||
|
#define SERIAL_MANAGER_HANDLE_SIZE_TEMP SERIAL_PORT_UART_HANDLE_SIZE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))
|
||||||
|
|
||||||
|
#if (SERIAL_PORT_USB_CDC_HANDLE_SIZE > SERIAL_MANAGER_HANDLE_SIZE_TEMP)
|
||||||
|
#undef SERIAL_MANAGER_HANDLE_SIZE_TEMP
|
||||||
|
#define SERIAL_MANAGER_HANDLE_SIZE_TEMP SERIAL_PORT_USB_CDC_HANDLE_SIZE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))
|
||||||
|
|
||||||
|
#if (SERIAL_PORT_SWO_HANDLE_SIZE > SERIAL_MANAGER_HANDLE_SIZE_TEMP)
|
||||||
|
#undef SERIAL_MANAGER_HANDLE_SIZE_TEMP
|
||||||
|
#define SERIAL_MANAGER_HANDLE_SIZE_TEMP SERIAL_PORT_SWO_HANDLE_SIZE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))
|
||||||
|
|
||||||
|
#if (SERIAL_PORT_VIRTUAL_HANDLE_SIZE > SERIAL_MANAGER_HANDLE_SIZE_TEMP)
|
||||||
|
#undef SERIAL_MANAGER_HANDLE_SIZE_TEMP
|
||||||
|
#define SERIAL_MANAGER_HANDLE_SIZE_TEMP SERIAL_PORT_VIRTUAL_HANDLE_SIZE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(SERIAL_PORT_TYPE_RPMSG) && (SERIAL_PORT_TYPE_RPMSG > 0U))
|
||||||
|
|
||||||
|
#if (SERIAL_PORT_RPMSG_HANDLE_SIZE > SERIAL_MANAGER_HANDLE_SIZE_TEMP)
|
||||||
|
#undef SERIAL_MANAGER_HANDLE_SIZE_TEMP
|
||||||
|
#define SERIAL_MANAGER_HANDLE_SIZE_TEMP SERIAL_PORT_RPMSG_HANDLE_SIZE
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @brief SERIAL_PORT_UART_HANDLE_SIZE/SERIAL_PORT_USB_CDC_HANDLE_SIZE + serial manager dedicated size */
|
||||||
|
#if ((defined(SERIAL_MANAGER_HANDLE_SIZE_TEMP) && (SERIAL_MANAGER_HANDLE_SIZE_TEMP > 0U)))
|
||||||
|
#else
|
||||||
|
#error SERIAL_PORT_TYPE_UART, SERIAL_PORT_TYPE_USBCDC, SERIAL_PORT_TYPE_SWO and SERIAL_PORT_TYPE_VIRTUAL should not be cleared at same time.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(OSA_USED)
|
||||||
|
#include "fsl_component_common_task.h"
|
||||||
|
#endif
|
||||||
|
/*! @brief Macro to determine whether use common task. */
|
||||||
|
#ifndef SERIAL_MANAGER_USE_COMMON_TASK
|
||||||
|
#define SERIAL_MANAGER_USE_COMMON_TASK (0U)
|
||||||
|
#if (defined(COMMON_TASK_ENABLE) && (COMMON_TASK_ENABLE == 0U))
|
||||||
|
#undef SERIAL_MANAGER_USE_COMMON_TASK
|
||||||
|
#define SERIAL_MANAGER_USE_COMMON_TASK (0U)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
#if (defined(OSA_USED) && !(defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U)))
|
||||||
|
#include "fsl_os_abstraction.h"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(OSA_USED)
|
||||||
|
#include "fsl_component_common_task.h"
|
||||||
|
#endif
|
||||||
|
/*! @brief Macro to determine whether use common task. */
|
||||||
|
#ifndef SERIAL_MANAGER_USE_COMMON_TASK
|
||||||
|
#define SERIAL_MANAGER_USE_COMMON_TASK (0U)
|
||||||
|
#if (defined(COMMON_TASK_ENABLE) && (COMMON_TASK_ENABLE == 0U))
|
||||||
|
#undef SERIAL_MANAGER_USE_COMMON_TASK
|
||||||
|
#define SERIAL_MANAGER_USE_COMMON_TASK (0U)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
#if (defined(OSA_USED) && !(defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U)))
|
||||||
|
#include "fsl_os_abstraction.h"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @brief Definition of serial manager handle size. */
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
#if (defined(OSA_USED) && !(defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U)))
|
||||||
|
#define SERIAL_MANAGER_HANDLE_SIZE \
|
||||||
|
(SERIAL_MANAGER_HANDLE_SIZE_TEMP + 124U + OSA_TASK_HANDLE_SIZE + OSA_EVENT_HANDLE_SIZE)
|
||||||
|
#else /*defined(OSA_USED)*/
|
||||||
|
#define SERIAL_MANAGER_HANDLE_SIZE (SERIAL_MANAGER_HANDLE_SIZE_TEMP + 124U)
|
||||||
|
#endif /*defined(OSA_USED)*/
|
||||||
|
#define SERIAL_MANAGER_BLOCK_HANDLE_SIZE (SERIAL_MANAGER_HANDLE_SIZE_TEMP + 16U)
|
||||||
|
#else
|
||||||
|
#define SERIAL_MANAGER_HANDLE_SIZE (SERIAL_MANAGER_HANDLE_SIZE_TEMP + 12U)
|
||||||
|
#define SERIAL_MANAGER_BLOCK_HANDLE_SIZE (SERIAL_MANAGER_HANDLE_SIZE_TEMP + 12U)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Defines the serial manager handle
|
||||||
|
*
|
||||||
|
* This macro is used to define a 4 byte aligned serial manager handle.
|
||||||
|
* Then use "(serial_handle_t)name" to get the serial manager handle.
|
||||||
|
*
|
||||||
|
* The macro should be global and could be optional. You could also define serial manager handle by yourself.
|
||||||
|
*
|
||||||
|
* This is an example,
|
||||||
|
* @code
|
||||||
|
* SERIAL_MANAGER_HANDLE_DEFINE(serialManagerHandle);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @param name The name string of the serial manager handle.
|
||||||
|
*/
|
||||||
|
#define SERIAL_MANAGER_HANDLE_DEFINE(name) \
|
||||||
|
uint32_t name[((SERIAL_MANAGER_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))]
|
||||||
|
#define SERIAL_MANAGER_BLOCK_HANDLE_DEFINE(name) \
|
||||||
|
uint32_t name[((SERIAL_MANAGER_BLOCK_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))]
|
||||||
|
/*!
|
||||||
|
* @brief Defines the serial manager write handle
|
||||||
|
*
|
||||||
|
* This macro is used to define a 4 byte aligned serial manager write handle.
|
||||||
|
* Then use "(serial_write_handle_t)name" to get the serial manager write handle.
|
||||||
|
*
|
||||||
|
* The macro should be global and could be optional. You could also define serial manager write handle by yourself.
|
||||||
|
*
|
||||||
|
* This is an example,
|
||||||
|
* @code
|
||||||
|
* SERIAL_MANAGER_WRITE_HANDLE_DEFINE(serialManagerwriteHandle);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @param name The name string of the serial manager write handle.
|
||||||
|
*/
|
||||||
|
#define SERIAL_MANAGER_WRITE_HANDLE_DEFINE(name) \
|
||||||
|
uint32_t name[((SERIAL_MANAGER_WRITE_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))]
|
||||||
|
#define SERIAL_MANAGER_WRITE_BLOCK_HANDLE_DEFINE(name) \
|
||||||
|
uint32_t name[((SERIAL_MANAGER_WRITE_BLOCK_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))]
|
||||||
|
/*!
|
||||||
|
* @brief Defines the serial manager read handle
|
||||||
|
*
|
||||||
|
* This macro is used to define a 4 byte aligned serial manager read handle.
|
||||||
|
* Then use "(serial_read_handle_t)name" to get the serial manager read handle.
|
||||||
|
*
|
||||||
|
* The macro should be global and could be optional. You could also define serial manager read handle by yourself.
|
||||||
|
*
|
||||||
|
* This is an example,
|
||||||
|
* @code
|
||||||
|
* SERIAL_MANAGER_READ_HANDLE_DEFINE(serialManagerReadHandle);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @param name The name string of the serial manager read handle.
|
||||||
|
*/
|
||||||
|
#define SERIAL_MANAGER_READ_HANDLE_DEFINE(name) \
|
||||||
|
uint32_t name[((SERIAL_MANAGER_READ_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))]
|
||||||
|
#define SERIAL_MANAGER_READ_BLOCK_HANDLE_DEFINE(name) \
|
||||||
|
uint32_t name[((SERIAL_MANAGER_READ_BLOCK_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))]
|
||||||
|
|
||||||
|
/*! @brief Macro to set serial manager task priority. */
|
||||||
|
#ifndef SERIAL_MANAGER_TASK_PRIORITY
|
||||||
|
#define SERIAL_MANAGER_TASK_PRIORITY (2U)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @brief Macro to set serial manager task stack size. */
|
||||||
|
#ifndef SERIAL_MANAGER_TASK_STACK_SIZE
|
||||||
|
#define SERIAL_MANAGER_TASK_STACK_SIZE (1000U)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @brief The handle of the serial manager module */
|
||||||
|
typedef void *serial_handle_t;
|
||||||
|
|
||||||
|
/*! @brief The write handle of the serial manager module */
|
||||||
|
typedef void *serial_write_handle_t;
|
||||||
|
|
||||||
|
/*! @brief The read handle of the serial manager module */
|
||||||
|
typedef void *serial_read_handle_t;
|
||||||
|
|
||||||
|
/*! @brief serial port type*/
|
||||||
|
typedef enum _serial_port_type
|
||||||
|
{
|
||||||
|
kSerialPort_Uart = 1U, /*!< Serial port UART */
|
||||||
|
kSerialPort_UsbCdc, /*!< Serial port USB CDC */
|
||||||
|
kSerialPort_Swo, /*!< Serial port SWO */
|
||||||
|
kSerialPort_Virtual, /*!< Serial port Virtual */
|
||||||
|
kSerialPort_Rpmsg, /*!< Serial port RPMSG */
|
||||||
|
} serial_port_type_t;
|
||||||
|
|
||||||
|
/*! @brief serial manager type*/
|
||||||
|
typedef enum _serial_manager_type
|
||||||
|
{
|
||||||
|
kSerialManager_NonBlocking = 0x0U, /*!< None blocking handle*/
|
||||||
|
kSerialManager_Blocking = 0x8F41U, /*!< Blocking handle*/
|
||||||
|
} serial_manager_type_t;
|
||||||
|
/*! @brief serial manager config structure*/
|
||||||
|
typedef struct _serial_manager_config
|
||||||
|
{
|
||||||
|
#if defined(SERIAL_MANAGER_NON_BLOCKING_MODE)
|
||||||
|
uint8_t *ringBuffer; /*!< Ring buffer address, it is used to buffer data received by the hardware.
|
||||||
|
Besides, the memory space cannot be free during the lifetime of the serial
|
||||||
|
manager module. */
|
||||||
|
uint32_t ringBufferSize; /*!< The size of the ring buffer */
|
||||||
|
#endif
|
||||||
|
serial_port_type_t type; /*!< Serial port type */
|
||||||
|
serial_manager_type_t blockType; /*!< Serial manager port type */
|
||||||
|
void *portConfig; /*!< Serial port configuration */
|
||||||
|
} serial_manager_config_t;
|
||||||
|
|
||||||
|
/*! @brief serial manager error code*/
|
||||||
|
typedef enum _serial_manager_status
|
||||||
|
{
|
||||||
|
kStatus_SerialManager_Success = kStatus_Success, /*!< Success */
|
||||||
|
kStatus_SerialManager_Error = MAKE_STATUS(kStatusGroup_SERIALMANAGER, 1), /*!< Failed */
|
||||||
|
kStatus_SerialManager_Busy = MAKE_STATUS(kStatusGroup_SERIALMANAGER, 2), /*!< Busy */
|
||||||
|
kStatus_SerialManager_Notify = MAKE_STATUS(kStatusGroup_SERIALMANAGER, 3), /*!< Ring buffer is not empty */
|
||||||
|
kStatus_SerialManager_Canceled =
|
||||||
|
MAKE_STATUS(kStatusGroup_SERIALMANAGER, 4), /*!< the non-blocking request is canceled */
|
||||||
|
kStatus_SerialManager_HandleConflict = MAKE_STATUS(kStatusGroup_SERIALMANAGER, 5), /*!< The handle is opened */
|
||||||
|
kStatus_SerialManager_RingBufferOverflow =
|
||||||
|
MAKE_STATUS(kStatusGroup_SERIALMANAGER, 6), /*!< The ring buffer is overflowed */
|
||||||
|
kStatus_SerialManager_NotConnected = MAKE_STATUS(kStatusGroup_SERIALMANAGER, 7), /*!< The host is not connected */
|
||||||
|
} serial_manager_status_t;
|
||||||
|
|
||||||
|
/*! @brief Callback message structure */
|
||||||
|
typedef struct _serial_manager_callback_message
|
||||||
|
{
|
||||||
|
uint8_t *buffer; /*!< Transferred buffer */
|
||||||
|
uint32_t length; /*!< Transferred data length */
|
||||||
|
} serial_manager_callback_message_t;
|
||||||
|
|
||||||
|
/*! @brief callback function */
|
||||||
|
typedef void (*serial_manager_callback_t)(void *callbackParam,
|
||||||
|
serial_manager_callback_message_t *message,
|
||||||
|
serial_manager_status_t status);
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* _cplusplus */
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Initializes a serial manager module with the serial manager handle and the user configuration structure.
|
||||||
|
*
|
||||||
|
* This function configures the Serial Manager module with user-defined settings.
|
||||||
|
* The user can configure the configuration structure.
|
||||||
|
* The parameter serialHandle is a pointer to point to a memory space of size #SERIAL_MANAGER_HANDLE_SIZE
|
||||||
|
* allocated by the caller.
|
||||||
|
* The Serial Manager module supports three types of serial port, UART (includes UART, USART, LPSCI, LPUART, etc), USB
|
||||||
|
* CDC and swo.
|
||||||
|
* Please refer to #serial_port_type_t for serial port setting.
|
||||||
|
* These three types can be set by using #serial_manager_config_t.
|
||||||
|
*
|
||||||
|
* Example below shows how to use this API to configure the Serial Manager.
|
||||||
|
* For UART,
|
||||||
|
* @code
|
||||||
|
* #define SERIAL_MANAGER_RING_BUFFER_SIZE (256U)
|
||||||
|
* static SERIAL_MANAGER_HANDLE_DEFINE(s_serialHandle);
|
||||||
|
* static uint8_t s_ringBuffer[SERIAL_MANAGER_RING_BUFFER_SIZE];
|
||||||
|
*
|
||||||
|
* serial_manager_config_t config;
|
||||||
|
* serial_port_uart_config_t uartConfig;
|
||||||
|
* config.type = kSerialPort_Uart;
|
||||||
|
* config.ringBuffer = &s_ringBuffer[0];
|
||||||
|
* config.ringBufferSize = SERIAL_MANAGER_RING_BUFFER_SIZE;
|
||||||
|
* uartConfig.instance = 0;
|
||||||
|
* uartConfig.clockRate = 24000000;
|
||||||
|
* uartConfig.baudRate = 115200;
|
||||||
|
* uartConfig.parityMode = kSerialManager_UartParityDisabled;
|
||||||
|
* uartConfig.stopBitCount = kSerialManager_UartOneStopBit;
|
||||||
|
* uartConfig.enableRx = 1;
|
||||||
|
* uartConfig.enableTx = 1;
|
||||||
|
* uartConfig.enableRxRTS = 0;
|
||||||
|
* uartConfig.enableTxCTS = 0;
|
||||||
|
* config.portConfig = &uartConfig;
|
||||||
|
* SerialManager_Init((serial_handle_t)s_serialHandle, &config);
|
||||||
|
* @endcode
|
||||||
|
* For USB CDC,
|
||||||
|
* @code
|
||||||
|
* #define SERIAL_MANAGER_RING_BUFFER_SIZE (256U)
|
||||||
|
* static SERIAL_MANAGER_HANDLE_DEFINE(s_serialHandle);
|
||||||
|
* static uint8_t s_ringBuffer[SERIAL_MANAGER_RING_BUFFER_SIZE];
|
||||||
|
*
|
||||||
|
* serial_manager_config_t config;
|
||||||
|
* serial_port_usb_cdc_config_t usbCdcConfig;
|
||||||
|
* config.type = kSerialPort_UsbCdc;
|
||||||
|
* config.ringBuffer = &s_ringBuffer[0];
|
||||||
|
* config.ringBufferSize = SERIAL_MANAGER_RING_BUFFER_SIZE;
|
||||||
|
* usbCdcConfig.controllerIndex = kSerialManager_UsbControllerKhci0;
|
||||||
|
* config.portConfig = &usbCdcConfig;
|
||||||
|
* SerialManager_Init((serial_handle_t)s_serialHandle, &config);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @param serialHandle Pointer to point to a memory space of size #SERIAL_MANAGER_HANDLE_SIZE allocated by the caller.
|
||||||
|
* The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.
|
||||||
|
* You can define the handle in the following two ways:
|
||||||
|
* #SERIAL_MANAGER_HANDLE_DEFINE(serialHandle);
|
||||||
|
* or
|
||||||
|
* uint32_t serialHandle[((SERIAL_MANAGER_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))];
|
||||||
|
* @param config Pointer to user-defined configuration structure.
|
||||||
|
* @retval kStatus_SerialManager_Error An error occurred.
|
||||||
|
* @retval kStatus_SerialManager_Success The Serial Manager module initialization succeed.
|
||||||
|
*/
|
||||||
|
serial_manager_status_t SerialManager_Init(serial_handle_t serialHandle, const serial_manager_config_t *config);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief De-initializes the serial manager module instance.
|
||||||
|
*
|
||||||
|
* This function de-initializes the serial manager module instance. If the opened writing or
|
||||||
|
* reading handle is not closed, the function will return kStatus_SerialManager_Busy.
|
||||||
|
*
|
||||||
|
* @param serialHandle The serial manager module handle pointer.
|
||||||
|
* @retval kStatus_SerialManager_Success The serial manager de-initialization succeed.
|
||||||
|
* @retval kStatus_SerialManager_Busy Opened reading or writing handle is not closed.
|
||||||
|
*/
|
||||||
|
serial_manager_status_t SerialManager_Deinit(serial_handle_t serialHandle);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Opens a writing handle for the serial manager module.
|
||||||
|
*
|
||||||
|
* This function Opens a writing handle for the serial manager module. If the serial manager needs to
|
||||||
|
* be used in different tasks, the task should open a dedicated write handle for itself by calling
|
||||||
|
* #SerialManager_OpenWriteHandle. Since there can only one buffer for transmission for the writing
|
||||||
|
* handle at the same time, multiple writing handles need to be opened when the multiple transmission
|
||||||
|
* is needed for a task.
|
||||||
|
*
|
||||||
|
* @param serialHandle The serial manager module handle pointer.
|
||||||
|
* The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.
|
||||||
|
* @param writeHandle The serial manager module writing handle pointer.
|
||||||
|
* The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.
|
||||||
|
* You can define the handle in the following two ways:
|
||||||
|
* #SERIAL_MANAGER_WRITE_HANDLE_DEFINE(writeHandle);
|
||||||
|
* or
|
||||||
|
* uint32_t writeHandle[((SERIAL_MANAGER_WRITE_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))];
|
||||||
|
* @retval kStatus_SerialManager_Error An error occurred.
|
||||||
|
* @retval kStatus_SerialManager_HandleConflict The writing handle was opened.
|
||||||
|
* @retval kStatus_SerialManager_Success The writing handle is opened.
|
||||||
|
*
|
||||||
|
* Example below shows how to use this API to write data.
|
||||||
|
* For task 1,
|
||||||
|
* @code
|
||||||
|
* static SERIAL_MANAGER_WRITE_HANDLE_DEFINE(s_serialWriteHandle1);
|
||||||
|
* static uint8_t s_nonBlockingWelcome1[] = "This is non-blocking writing log for task1!\r\n";
|
||||||
|
* SerialManager_OpenWriteHandle((serial_handle_t)serialHandle, (serial_write_handle_t)s_serialWriteHandle1);
|
||||||
|
* SerialManager_InstallTxCallback((serial_write_handle_t)s_serialWriteHandle1,
|
||||||
|
* Task1_SerialManagerTxCallback,
|
||||||
|
* s_serialWriteHandle1);
|
||||||
|
* SerialManager_WriteNonBlocking((serial_write_handle_t)s_serialWriteHandle1,
|
||||||
|
* s_nonBlockingWelcome1,
|
||||||
|
* sizeof(s_nonBlockingWelcome1) - 1U);
|
||||||
|
* @endcode
|
||||||
|
* For task 2,
|
||||||
|
* @code
|
||||||
|
* static SERIAL_MANAGER_WRITE_HANDLE_DEFINE(s_serialWriteHandle2);
|
||||||
|
* static uint8_t s_nonBlockingWelcome2[] = "This is non-blocking writing log for task2!\r\n";
|
||||||
|
* SerialManager_OpenWriteHandle((serial_handle_t)serialHandle, (serial_write_handle_t)s_serialWriteHandle2);
|
||||||
|
* SerialManager_InstallTxCallback((serial_write_handle_t)s_serialWriteHandle2,
|
||||||
|
* Task2_SerialManagerTxCallback,
|
||||||
|
* s_serialWriteHandle2);
|
||||||
|
* SerialManager_WriteNonBlocking((serial_write_handle_t)s_serialWriteHandle2,
|
||||||
|
* s_nonBlockingWelcome2,
|
||||||
|
* sizeof(s_nonBlockingWelcome2) - 1U);
|
||||||
|
* @endcode
|
||||||
|
*/
|
||||||
|
serial_manager_status_t SerialManager_OpenWriteHandle(serial_handle_t serialHandle, serial_write_handle_t writeHandle);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Closes a writing handle for the serial manager module.
|
||||||
|
*
|
||||||
|
* This function Closes a writing handle for the serial manager module.
|
||||||
|
*
|
||||||
|
* @param writeHandle The serial manager module writing handle pointer.
|
||||||
|
* @retval kStatus_SerialManager_Success The writing handle is closed.
|
||||||
|
*/
|
||||||
|
serial_manager_status_t SerialManager_CloseWriteHandle(serial_write_handle_t writeHandle);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Opens a reading handle for the serial manager module.
|
||||||
|
*
|
||||||
|
* This function Opens a reading handle for the serial manager module. The reading handle can not be
|
||||||
|
* opened multiple at the same time. The error code kStatus_SerialManager_Busy would be returned when
|
||||||
|
* the previous reading handle is not closed. And there can only be one buffer for receiving for the
|
||||||
|
* reading handle at the same time.
|
||||||
|
*
|
||||||
|
* @param serialHandle The serial manager module handle pointer.
|
||||||
|
* The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.
|
||||||
|
* @param readHandle The serial manager module reading handle pointer.
|
||||||
|
* The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.
|
||||||
|
* You can define the handle in the following two ways:
|
||||||
|
* #SERIAL_MANAGER_READ_HANDLE_DEFINE(readHandle);
|
||||||
|
* or
|
||||||
|
* uint32_t readHandle[((SERIAL_MANAGER_READ_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))];
|
||||||
|
* @retval kStatus_SerialManager_Error An error occurred.
|
||||||
|
* @retval kStatus_SerialManager_Success The reading handle is opened.
|
||||||
|
* @retval kStatus_SerialManager_Busy Previous reading handle is not closed.
|
||||||
|
*
|
||||||
|
* Example below shows how to use this API to read data.
|
||||||
|
* @code
|
||||||
|
* static SERIAL_MANAGER_READ_HANDLE_DEFINE(s_serialReadHandle);
|
||||||
|
* SerialManager_OpenReadHandle((serial_handle_t)serialHandle, (serial_read_handle_t)s_serialReadHandle);
|
||||||
|
* static uint8_t s_nonBlockingBuffer[64];
|
||||||
|
* SerialManager_InstallRxCallback((serial_read_handle_t)s_serialReadHandle,
|
||||||
|
* APP_SerialManagerRxCallback,
|
||||||
|
* s_serialReadHandle);
|
||||||
|
* SerialManager_ReadNonBlocking((serial_read_handle_t)s_serialReadHandle,
|
||||||
|
* s_nonBlockingBuffer,
|
||||||
|
* sizeof(s_nonBlockingBuffer));
|
||||||
|
* @endcode
|
||||||
|
*/
|
||||||
|
serial_manager_status_t SerialManager_OpenReadHandle(serial_handle_t serialHandle, serial_read_handle_t readHandle);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Closes a reading for the serial manager module.
|
||||||
|
*
|
||||||
|
* This function Closes a reading for the serial manager module.
|
||||||
|
*
|
||||||
|
* @param readHandle The serial manager module reading handle pointer.
|
||||||
|
* @retval kStatus_SerialManager_Success The reading handle is closed.
|
||||||
|
*/
|
||||||
|
serial_manager_status_t SerialManager_CloseReadHandle(serial_read_handle_t readHandle);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Transmits data with the blocking mode.
|
||||||
|
*
|
||||||
|
* This is a blocking function, which polls the sending queue, waits for the sending queue to be empty.
|
||||||
|
* This function sends data using an interrupt method. The interrupt of the hardware could not be disabled.
|
||||||
|
* And There can only one buffer for transmission for the writing handle at the same time.
|
||||||
|
*
|
||||||
|
* @note The function #SerialManager_WriteBlocking and the function SerialManager_WriteNonBlocking
|
||||||
|
* cannot be used at the same time.
|
||||||
|
* And, the function SerialManager_CancelWriting cannot be used to abort the transmission of this function.
|
||||||
|
*
|
||||||
|
* @param writeHandle The serial manager module handle pointer.
|
||||||
|
* @param buffer Start address of the data to write.
|
||||||
|
* @param length Length of the data to write.
|
||||||
|
* @retval kStatus_SerialManager_Success Successfully sent all data.
|
||||||
|
* @retval kStatus_SerialManager_Busy Previous transmission still not finished; data not all sent yet.
|
||||||
|
* @retval kStatus_SerialManager_Error An error occurred.
|
||||||
|
*/
|
||||||
|
serial_manager_status_t SerialManager_WriteBlocking(serial_write_handle_t writeHandle,
|
||||||
|
uint8_t *buffer,
|
||||||
|
uint32_t length);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reads data with the blocking mode.
|
||||||
|
*
|
||||||
|
* This is a blocking function, which polls the receiving buffer, waits for the receiving buffer to be full.
|
||||||
|
* This function receives data using an interrupt method. The interrupt of the hardware could not be disabled.
|
||||||
|
* And There can only one buffer for receiving for the reading handle at the same time.
|
||||||
|
*
|
||||||
|
* @note The function #SerialManager_ReadBlocking and the function SerialManager_ReadNonBlocking
|
||||||
|
* cannot be used at the same time.
|
||||||
|
* And, the function SerialManager_CancelReading cannot be used to abort the transmission of this function.
|
||||||
|
*
|
||||||
|
* @param readHandle The serial manager module handle pointer.
|
||||||
|
* @param buffer Start address of the data to store the received data.
|
||||||
|
* @param length The length of the data to be received.
|
||||||
|
* @retval kStatus_SerialManager_Success Successfully received all data.
|
||||||
|
* @retval kStatus_SerialManager_Busy Previous transmission still not finished; data not all received yet.
|
||||||
|
* @retval kStatus_SerialManager_Error An error occurred.
|
||||||
|
*/
|
||||||
|
serial_manager_status_t SerialManager_ReadBlocking(serial_read_handle_t readHandle, uint8_t *buffer, uint32_t length);
|
||||||
|
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
/*!
|
||||||
|
* @brief Transmits data with the non-blocking mode.
|
||||||
|
*
|
||||||
|
* This is a non-blocking function, which returns directly without waiting for all data to be sent.
|
||||||
|
* When all data is sent, the module notifies the upper layer through a TX callback function and passes
|
||||||
|
* the status parameter @ref kStatus_SerialManager_Success.
|
||||||
|
* This function sends data using an interrupt method. The interrupt of the hardware could not be disabled.
|
||||||
|
* And There can only one buffer for transmission for the writing handle at the same time.
|
||||||
|
*
|
||||||
|
* @note The function #SerialManager_WriteBlocking and the function #SerialManager_WriteNonBlocking
|
||||||
|
* cannot be used at the same time. And, the TX callback is mandatory before the function could be used.
|
||||||
|
*
|
||||||
|
* @param writeHandle The serial manager module handle pointer.
|
||||||
|
* @param buffer Start address of the data to write.
|
||||||
|
* @param length Length of the data to write.
|
||||||
|
* @retval kStatus_SerialManager_Success Successfully sent all data.
|
||||||
|
* @retval kStatus_SerialManager_Busy Previous transmission still not finished; data not all sent yet.
|
||||||
|
* @retval kStatus_SerialManager_Error An error occurred.
|
||||||
|
*/
|
||||||
|
serial_manager_status_t SerialManager_WriteNonBlocking(serial_write_handle_t writeHandle,
|
||||||
|
uint8_t *buffer,
|
||||||
|
uint32_t length);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reads data with the non-blocking mode.
|
||||||
|
*
|
||||||
|
* This is a non-blocking function, which returns directly without waiting for all data to be received.
|
||||||
|
* When all data is received, the module driver notifies the upper layer
|
||||||
|
* through a RX callback function and passes the status parameter @ref kStatus_SerialManager_Success.
|
||||||
|
* This function receives data using an interrupt method. The interrupt of the hardware could not be disabled.
|
||||||
|
* And There can only one buffer for receiving for the reading handle at the same time.
|
||||||
|
*
|
||||||
|
* @note The function #SerialManager_ReadBlocking and the function #SerialManager_ReadNonBlocking
|
||||||
|
* cannot be used at the same time. And, the RX callback is mandatory before the function could be used.
|
||||||
|
*
|
||||||
|
* @param readHandle The serial manager module handle pointer.
|
||||||
|
* @param buffer Start address of the data to store the received data.
|
||||||
|
* @param length The length of the data to be received.
|
||||||
|
* @retval kStatus_SerialManager_Success Successfully received all data.
|
||||||
|
* @retval kStatus_SerialManager_Busy Previous transmission still not finished; data not all received yet.
|
||||||
|
* @retval kStatus_SerialManager_Error An error occurred.
|
||||||
|
*/
|
||||||
|
serial_manager_status_t SerialManager_ReadNonBlocking(serial_read_handle_t readHandle,
|
||||||
|
uint8_t *buffer,
|
||||||
|
uint32_t length);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Tries to read data.
|
||||||
|
*
|
||||||
|
* The function tries to read data from internal ring buffer. If the ring buffer is not empty, the data will be
|
||||||
|
* copied from ring buffer to up layer buffer. The copied length is the minimum of the ring buffer and up layer length.
|
||||||
|
* After the data is copied, the actual data length is passed by the parameter length.
|
||||||
|
* And There can only one buffer for receiving for the reading handle at the same time.
|
||||||
|
*
|
||||||
|
* @param readHandle The serial manager module handle pointer.
|
||||||
|
* @param buffer Start address of the data to store the received data.
|
||||||
|
* @param length The length of the data to be received.
|
||||||
|
* @param receivedLength Length received from the ring buffer directly.
|
||||||
|
* @retval kStatus_SerialManager_Success Successfully received all data.
|
||||||
|
* @retval kStatus_SerialManager_Busy Previous transmission still not finished; data not all received yet.
|
||||||
|
* @retval kStatus_SerialManager_Error An error occurred.
|
||||||
|
*/
|
||||||
|
serial_manager_status_t SerialManager_TryRead(serial_read_handle_t readHandle,
|
||||||
|
uint8_t *buffer,
|
||||||
|
uint32_t length,
|
||||||
|
uint32_t *receivedLength);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Cancels unfinished send transmission.
|
||||||
|
*
|
||||||
|
* The function cancels unfinished send transmission. When the transfer is canceled, the module notifies the upper layer
|
||||||
|
* through a TX callback function and passes the status parameter @ref kStatus_SerialManager_Canceled.
|
||||||
|
*
|
||||||
|
* @note The function #SerialManager_CancelWriting cannot be used to abort the transmission of
|
||||||
|
* the function #SerialManager_WriteBlocking.
|
||||||
|
*
|
||||||
|
* @param writeHandle The serial manager module handle pointer.
|
||||||
|
* @retval kStatus_SerialManager_Success Get successfully abort the sending.
|
||||||
|
* @retval kStatus_SerialManager_Error An error occurred.
|
||||||
|
*/
|
||||||
|
serial_manager_status_t SerialManager_CancelWriting(serial_write_handle_t writeHandle);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Cancels unfinished receive transmission.
|
||||||
|
*
|
||||||
|
* The function cancels unfinished receive transmission. When the transfer is canceled, the module notifies the upper
|
||||||
|
* layer
|
||||||
|
* through a RX callback function and passes the status parameter @ref kStatus_SerialManager_Canceled.
|
||||||
|
*
|
||||||
|
* @note The function #SerialManager_CancelReading cannot be used to abort the transmission of
|
||||||
|
* the function #SerialManager_ReadBlocking.
|
||||||
|
*
|
||||||
|
* @param readHandle The serial manager module handle pointer.
|
||||||
|
* @retval kStatus_SerialManager_Success Get successfully abort the receiving.
|
||||||
|
* @retval kStatus_SerialManager_Error An error occurred.
|
||||||
|
*/
|
||||||
|
serial_manager_status_t SerialManager_CancelReading(serial_read_handle_t readHandle);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Installs a TX callback and callback parameter.
|
||||||
|
*
|
||||||
|
* This function is used to install the TX callback and callback parameter for the serial manager module.
|
||||||
|
* When any status of TX transmission changed, the driver will notify the upper layer by the installed callback
|
||||||
|
* function. And the status is also passed as status parameter when the callback is called.
|
||||||
|
*
|
||||||
|
* @param writeHandle The serial manager module handle pointer.
|
||||||
|
* @param callback The callback function.
|
||||||
|
* @param callbackParam The parameter of the callback function.
|
||||||
|
* @retval kStatus_SerialManager_Success Successfully install the callback.
|
||||||
|
*/
|
||||||
|
serial_manager_status_t SerialManager_InstallTxCallback(serial_write_handle_t writeHandle,
|
||||||
|
serial_manager_callback_t callback,
|
||||||
|
void *callbackParam);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Installs a RX callback and callback parameter.
|
||||||
|
*
|
||||||
|
* This function is used to install the RX callback and callback parameter for the serial manager module.
|
||||||
|
* When any status of RX transmission changed, the driver will notify the upper layer by the installed callback
|
||||||
|
* function. And the status is also passed as status parameter when the callback is called.
|
||||||
|
*
|
||||||
|
* @param readHandle The serial manager module handle pointer.
|
||||||
|
* @param callback The callback function.
|
||||||
|
* @param callbackParam The parameter of the callback function.
|
||||||
|
* @retval kStatus_SerialManager_Success Successfully install the callback.
|
||||||
|
*/
|
||||||
|
serial_manager_status_t SerialManager_InstallRxCallback(serial_read_handle_t readHandle,
|
||||||
|
serial_manager_callback_t callback,
|
||||||
|
void *callbackParam);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Prepares to enter low power consumption.
|
||||||
|
*
|
||||||
|
* This function is used to prepare to enter low power consumption.
|
||||||
|
*
|
||||||
|
* @param serialHandle The serial manager module handle pointer.
|
||||||
|
* @retval kStatus_SerialManager_Success Successful operation.
|
||||||
|
*/
|
||||||
|
serial_manager_status_t SerialManager_EnterLowpower(serial_handle_t serialHandle);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Restores from low power consumption.
|
||||||
|
*
|
||||||
|
* This function is used to restore from low power consumption.
|
||||||
|
*
|
||||||
|
* @param serialHandle The serial manager module handle pointer.
|
||||||
|
* @retval kStatus_SerialManager_Success Successful operation.
|
||||||
|
*/
|
||||||
|
serial_manager_status_t SerialManager_ExitLowpower(serial_handle_t serialHandle);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/*! @} */
|
||||||
|
#endif /* __SERIAL_MANAGER_H__ */
|
||||||
|
|
@ -0,0 +1,130 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2019-2020 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SERIAL_PORT_INTERNAL_H__
|
||||||
|
#define __SERIAL_PORT_INTERNAL_H__
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* _cplusplus */
|
||||||
|
|
||||||
|
#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))
|
||||||
|
serial_manager_status_t Serial_UartInit(serial_handle_t serialHandle, void *serialConfig);
|
||||||
|
serial_manager_status_t Serial_UartDeinit(serial_handle_t serialHandle);
|
||||||
|
serial_manager_status_t Serial_UartWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);
|
||||||
|
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
serial_manager_status_t Serial_UartWriteBlocking(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);
|
||||||
|
#endif /* SERIAL_MANAGER_NON_BLOCKING_MODE */
|
||||||
|
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_DUAL_MODE) && (SERIAL_MANAGER_NON_BLOCKING_DUAL_MODE > 0U))
|
||||||
|
serial_manager_status_t Serial_UartRead(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
serial_manager_status_t Serial_UartRead(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
serial_manager_status_t Serial_UartCancelWrite(serial_handle_t serialHandle);
|
||||||
|
serial_manager_status_t Serial_UartInstallTxCallback(serial_handle_t serialHandle,
|
||||||
|
serial_manager_callback_t callback,
|
||||||
|
void *callbackParam);
|
||||||
|
serial_manager_status_t Serial_UartInstallRxCallback(serial_handle_t serialHandle,
|
||||||
|
serial_manager_callback_t callback,
|
||||||
|
void *callbackParam);
|
||||||
|
void Serial_UartIsrFunction(serial_handle_t serialHandle);
|
||||||
|
#endif
|
||||||
|
serial_manager_status_t Serial_UartEnterLowpower(serial_handle_t serialHandle);
|
||||||
|
serial_manager_status_t Serial_UartExitLowpower(serial_handle_t serialHandle);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(SERIAL_PORT_TYPE_RPMSG) && (SERIAL_PORT_TYPE_RPMSG > 0U))
|
||||||
|
serial_manager_status_t Serial_RpmsgInit(serial_handle_t serialHandle, void *serialConfig);
|
||||||
|
serial_manager_status_t Serial_RpmsgDeinit(serial_handle_t serialHandle);
|
||||||
|
serial_manager_status_t Serial_RpmsgWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);
|
||||||
|
serial_manager_status_t Serial_RpmsgWriteBlocking(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);
|
||||||
|
#if !(defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
serial_manager_status_t Serial_RpmsgRead(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
serial_manager_status_t Serial_RpmsgCancelWrite(serial_handle_t serialHandle);
|
||||||
|
serial_manager_status_t Serial_RpmsgInstallTxCallback(serial_handle_t serialHandle,
|
||||||
|
serial_manager_callback_t callback,
|
||||||
|
void *callbackParam);
|
||||||
|
serial_manager_status_t Serial_RpmsgInstallRxCallback(serial_handle_t serialHandle,
|
||||||
|
serial_manager_callback_t callback,
|
||||||
|
void *callbackParam);
|
||||||
|
#endif
|
||||||
|
serial_manager_status_t Serial_RpmsgEnterLowpower(serial_handle_t serialHandle);
|
||||||
|
serial_manager_status_t Serial_RpmsgExitLowpower(serial_handle_t serialHandle);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))
|
||||||
|
serial_manager_status_t Serial_UsbCdcInit(serial_handle_t serialHandle, void *config);
|
||||||
|
serial_manager_status_t Serial_UsbCdcDeinit(serial_handle_t serialHandle);
|
||||||
|
serial_manager_status_t Serial_UsbCdcWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);
|
||||||
|
serial_manager_status_t Serial_UsbCdcRead(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);
|
||||||
|
serial_manager_status_t Serial_UsbCdcCancelWrite(serial_handle_t serialHandle);
|
||||||
|
serial_manager_status_t Serial_UsbCdcInstallTxCallback(serial_handle_t serialHandle,
|
||||||
|
serial_manager_callback_t callback,
|
||||||
|
void *callbackParam);
|
||||||
|
serial_manager_status_t Serial_UsbCdcInstallRxCallback(serial_handle_t serialHandle,
|
||||||
|
serial_manager_callback_t callback,
|
||||||
|
void *callbackParam);
|
||||||
|
void Serial_UsbCdcIsrFunction(serial_handle_t serialHandle);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))
|
||||||
|
serial_manager_status_t Serial_SwoInit(serial_handle_t serialHandle, void *config);
|
||||||
|
serial_manager_status_t Serial_SwoDeinit(serial_handle_t serialHandle);
|
||||||
|
serial_manager_status_t Serial_SwoWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);
|
||||||
|
#if !(defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
serial_manager_status_t Serial_SwoRead(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);
|
||||||
|
#endif
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
serial_manager_status_t Serial_SwoCancelWrite(serial_handle_t serialHandle);
|
||||||
|
serial_manager_status_t Serial_SwoInstallTxCallback(serial_handle_t serialHandle,
|
||||||
|
serial_manager_callback_t callback,
|
||||||
|
void *callbackParam);
|
||||||
|
serial_manager_status_t Serial_SwoInstallRxCallback(serial_handle_t serialHandle,
|
||||||
|
serial_manager_callback_t callback,
|
||||||
|
void *callbackParam);
|
||||||
|
void Serial_SwoIsrFunction(serial_handle_t serialHandle);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))
|
||||||
|
serial_manager_status_t Serial_PortVirtualInit(serial_handle_t serialHandle, void *config);
|
||||||
|
serial_manager_status_t Serial_PortVirtualDeinit(serial_handle_t serialHandle);
|
||||||
|
serial_manager_status_t Serial_PortVirtualWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);
|
||||||
|
serial_manager_status_t Serial_PortVirtualRead(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);
|
||||||
|
serial_manager_status_t Serial_PortVirtualCancelWrite(serial_handle_t serialHandle);
|
||||||
|
serial_manager_status_t Serial_PortVirtualInstallTxCallback(serial_handle_t serialHandle,
|
||||||
|
serial_manager_callback_t callback,
|
||||||
|
void *callbackParam);
|
||||||
|
serial_manager_status_t Serial_PortVirtualInstallRxCallback(serial_handle_t serialHandle,
|
||||||
|
serial_manager_callback_t callback,
|
||||||
|
void *callbackParam);
|
||||||
|
void Serial_PortVirtualIsrFunction(serial_handle_t serialHandle);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __SERIAL_PORT_INTERNAL_H__ */
|
||||||
|
|
@ -0,0 +1,460 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2018 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "fsl_component_serial_manager.h"
|
||||||
|
#include "fsl_component_serial_port_internal.h"
|
||||||
|
|
||||||
|
#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))
|
||||||
|
#include "fsl_adapter_uart.h"
|
||||||
|
|
||||||
|
#include "fsl_component_serial_port_uart.h"
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
#ifndef NDEBUG
|
||||||
|
#if (defined(DEBUG_CONSOLE_ASSERT_DISABLE) && (DEBUG_CONSOLE_ASSERT_DISABLE > 0U))
|
||||||
|
#undef assert
|
||||||
|
#define assert(n)
|
||||||
|
#else
|
||||||
|
/* MISRA C-2012 Rule 17.2 */
|
||||||
|
#undef assert
|
||||||
|
#define assert(n) \
|
||||||
|
while (!(n)) \
|
||||||
|
{ \
|
||||||
|
; \
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
#define SERIAL_PORT_UART_RECEIVE_DATA_LENGTH 1U
|
||||||
|
#define SERIAL_MANAGER_BLOCK_OFFSET (12U)
|
||||||
|
typedef struct _serial_uart_send_state
|
||||||
|
{
|
||||||
|
uint8_t *buffer;
|
||||||
|
uint32_t length;
|
||||||
|
serial_manager_callback_t callback;
|
||||||
|
void *callbackParam;
|
||||||
|
volatile uint8_t busy;
|
||||||
|
} serial_uart_send_state_t;
|
||||||
|
|
||||||
|
typedef struct _serial_uart_recv_state
|
||||||
|
{
|
||||||
|
serial_manager_callback_t callback;
|
||||||
|
void *callbackParam;
|
||||||
|
volatile uint8_t busy;
|
||||||
|
volatile uint8_t rxEnable;
|
||||||
|
uint8_t readBuffer[SERIAL_PORT_UART_RECEIVE_DATA_LENGTH];
|
||||||
|
} serial_uart_recv_state_t;
|
||||||
|
typedef struct _serial_uart_block_state
|
||||||
|
{
|
||||||
|
UART_HANDLE_DEFINE(usartHandleBuffer);
|
||||||
|
} serial_uart_block_state_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct _serial_uart_state
|
||||||
|
{
|
||||||
|
UART_HANDLE_DEFINE(usartHandleBuffer);
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
serial_uart_send_state_t tx;
|
||||||
|
serial_uart_recv_state_t rx;
|
||||||
|
#endif
|
||||||
|
} serial_uart_state_t;
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Prototypes
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
static serial_manager_status_t Serial_UartEnableReceiving(serial_uart_state_t *serialUartHandle)
|
||||||
|
{
|
||||||
|
#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))
|
||||||
|
hal_uart_transfer_t transfer;
|
||||||
|
#endif
|
||||||
|
if (1U == serialUartHandle->rx.rxEnable)
|
||||||
|
{
|
||||||
|
serialUartHandle->rx.busy = 1U;
|
||||||
|
#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))
|
||||||
|
transfer.data = &serialUartHandle->rx.readBuffer[0];
|
||||||
|
transfer.dataSize = sizeof(serialUartHandle->rx.readBuffer);
|
||||||
|
if (kStatus_HAL_UartSuccess !=
|
||||||
|
HAL_UartTransferReceiveNonBlocking(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), &transfer))
|
||||||
|
#else
|
||||||
|
if (kStatus_HAL_UartSuccess !=
|
||||||
|
HAL_UartReceiveNonBlocking(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]),
|
||||||
|
&serialUartHandle->rx.readBuffer[0], sizeof(serialUartHandle->rx.readBuffer)))
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
serialUartHandle->rx.busy = 0U;
|
||||||
|
return kStatus_SerialManager_Error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return kStatus_SerialManager_Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* UART user callback */
|
||||||
|
static void Serial_UartCallback(hal_uart_handle_t handle, hal_uart_status_t status, void *userData)
|
||||||
|
{
|
||||||
|
serial_uart_state_t *serialUartHandle;
|
||||||
|
serial_manager_callback_message_t msg;
|
||||||
|
#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))
|
||||||
|
hal_uart_transfer_t transfer;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
assert(userData);
|
||||||
|
serialUartHandle = (serial_uart_state_t *)userData;
|
||||||
|
|
||||||
|
if ((hal_uart_status_t)kStatus_HAL_UartRxIdle == status)
|
||||||
|
{
|
||||||
|
if ((NULL != serialUartHandle->rx.callback))
|
||||||
|
{
|
||||||
|
msg.buffer = &serialUartHandle->rx.readBuffer[0];
|
||||||
|
msg.length = sizeof(serialUartHandle->rx.readBuffer);
|
||||||
|
serialUartHandle->rx.callback(serialUartHandle->rx.callbackParam, &msg, kStatus_SerialManager_Success);
|
||||||
|
}
|
||||||
|
#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))
|
||||||
|
transfer.data = &serialUartHandle->rx.readBuffer[0];
|
||||||
|
transfer.dataSize = sizeof(serialUartHandle->rx.readBuffer);
|
||||||
|
serialUartHandle->rx.busy = 0U;
|
||||||
|
if (kStatus_HAL_UartSuccess ==
|
||||||
|
HAL_UartTransferReceiveNonBlocking(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), &transfer))
|
||||||
|
#else
|
||||||
|
if ((hal_uart_status_t)kStatus_HAL_UartSuccess ==
|
||||||
|
HAL_UartReceiveNonBlocking(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]),
|
||||||
|
&serialUartHandle->rx.readBuffer[0], sizeof(serialUartHandle->rx.readBuffer)))
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
serialUartHandle->rx.busy = 1U;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((hal_uart_status_t)kStatus_HAL_UartTxIdle == status)
|
||||||
|
{
|
||||||
|
if (0U != serialUartHandle->tx.busy)
|
||||||
|
{
|
||||||
|
serialUartHandle->tx.busy = 0U;
|
||||||
|
if ((NULL != serialUartHandle->tx.callback))
|
||||||
|
{
|
||||||
|
msg.buffer = serialUartHandle->tx.buffer;
|
||||||
|
msg.length = serialUartHandle->tx.length;
|
||||||
|
serialUartHandle->tx.callback(serialUartHandle->tx.callbackParam, &msg, kStatus_SerialManager_Success);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
serial_manager_status_t Serial_UartInit(serial_handle_t serialHandle, void *serialConfig)
|
||||||
|
{
|
||||||
|
serial_uart_state_t *serialUartHandle;
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
serial_port_uart_config_t *uartConfig = (serial_port_uart_config_t *)serialConfig;
|
||||||
|
#endif
|
||||||
|
serial_manager_status_t serialManagerStatus = kStatus_SerialManager_Success;
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))
|
||||||
|
#if 0 /* Not used below! */
|
||||||
|
hal_uart_transfer_t transfer;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
assert(serialConfig);
|
||||||
|
assert(serialHandle);
|
||||||
|
assert(SERIAL_PORT_UART_HANDLE_SIZE >= sizeof(serial_uart_state_t));
|
||||||
|
|
||||||
|
serialUartHandle = (serial_uart_state_t *)serialHandle;
|
||||||
|
serialManagerStatus = (serial_manager_status_t)HAL_UartInit(
|
||||||
|
((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), (const hal_uart_config_t *)serialConfig);
|
||||||
|
assert(kStatus_SerialManager_Success == serialManagerStatus);
|
||||||
|
(void)serialManagerStatus;
|
||||||
|
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_DUAL_MODE) && (SERIAL_MANAGER_NON_BLOCKING_DUAL_MODE > 0U))
|
||||||
|
serial_manager_type_t type = *(serial_manager_type_t *)((uint32_t)serialHandle - SERIAL_MANAGER_BLOCK_OFFSET);
|
||||||
|
if (type == kSerialManager_Blocking)
|
||||||
|
{
|
||||||
|
return serialManagerStatus;
|
||||||
|
}
|
||||||
|
#endif /* SERIAL_MANAGER_NON_BLOCKING_DUAL_MODE */
|
||||||
|
serialUartHandle->rx.rxEnable = uartConfig->enableRx;
|
||||||
|
#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))
|
||||||
|
|
||||||
|
(void)HAL_UartTransferInstallCallback(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]),
|
||||||
|
Serial_UartCallback, serialUartHandle);
|
||||||
|
#else
|
||||||
|
(void)HAL_UartInstallCallback(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), Serial_UartCallback,
|
||||||
|
serialUartHandle);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
serialManagerStatus = Serial_UartEnableReceiving(serialUartHandle);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return serialManagerStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
serial_manager_status_t Serial_UartDeinit(serial_handle_t serialHandle)
|
||||||
|
{
|
||||||
|
serial_uart_state_t *serialUartHandle;
|
||||||
|
|
||||||
|
assert(serialHandle);
|
||||||
|
|
||||||
|
serialUartHandle = (serial_uart_state_t *)serialHandle;
|
||||||
|
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))
|
||||||
|
(void)HAL_UartTransferAbortReceive(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));
|
||||||
|
#else
|
||||||
|
(void)HAL_UartAbortReceive(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
(void)HAL_UartDeinit(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));
|
||||||
|
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
serialUartHandle->tx.busy = 0U;
|
||||||
|
serialUartHandle->rx.busy = 0U;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return kStatus_SerialManager_Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
|
||||||
|
serial_manager_status_t Serial_UartWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length)
|
||||||
|
{
|
||||||
|
serial_uart_state_t *serialUartHandle;
|
||||||
|
hal_uart_status_t uartstatus;
|
||||||
|
#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))
|
||||||
|
hal_uart_transfer_t transfer;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
assert(serialHandle);
|
||||||
|
assert(buffer);
|
||||||
|
assert(length);
|
||||||
|
|
||||||
|
serialUartHandle = (serial_uart_state_t *)serialHandle;
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_DUAL_MODE) && (SERIAL_MANAGER_NON_BLOCKING_DUAL_MODE > 0U))
|
||||||
|
serial_manager_type_t type = *(serial_manager_type_t *)((uint32_t)serialHandle - SERIAL_MANAGER_BLOCK_OFFSET);
|
||||||
|
if (type == kSerialManager_Blocking)
|
||||||
|
{
|
||||||
|
return (serial_manager_status_t)HAL_UartSendBlocking(
|
||||||
|
((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), buffer, length);
|
||||||
|
}
|
||||||
|
#endif /* SERIAL_MANAGER_NON_BLOCKING_DUAL_MODE */
|
||||||
|
if (0U != serialUartHandle->tx.busy)
|
||||||
|
{
|
||||||
|
return kStatus_SerialManager_Busy;
|
||||||
|
}
|
||||||
|
serialUartHandle->tx.busy = 1U;
|
||||||
|
|
||||||
|
serialUartHandle->tx.buffer = buffer;
|
||||||
|
serialUartHandle->tx.length = length;
|
||||||
|
|
||||||
|
#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))
|
||||||
|
transfer.data = buffer;
|
||||||
|
transfer.dataSize = length;
|
||||||
|
uartstatus =
|
||||||
|
HAL_UartTransferSendNonBlocking(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), &transfer);
|
||||||
|
#else
|
||||||
|
|
||||||
|
uartstatus = HAL_UartSendNonBlocking(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), buffer, length);
|
||||||
|
#endif
|
||||||
|
assert(kStatus_HAL_UartSuccess == uartstatus);
|
||||||
|
(void)uartstatus;
|
||||||
|
|
||||||
|
return kStatus_SerialManager_Success;
|
||||||
|
}
|
||||||
|
serial_manager_status_t Serial_UartWriteBlocking(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length)
|
||||||
|
{
|
||||||
|
serial_uart_state_t *serialUartHandle;
|
||||||
|
|
||||||
|
assert(serialHandle);
|
||||||
|
assert(buffer);
|
||||||
|
assert(length);
|
||||||
|
|
||||||
|
serialUartHandle = (serial_uart_state_t *)serialHandle;
|
||||||
|
|
||||||
|
return (serial_manager_status_t)HAL_UartSendBlocking(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]),
|
||||||
|
buffer, length);
|
||||||
|
}
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_DUAL_MODE) && (SERIAL_MANAGER_NON_BLOCKING_DUAL_MODE > 0U))
|
||||||
|
serial_manager_status_t Serial_UartRead(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length)
|
||||||
|
{
|
||||||
|
serial_uart_state_t *serialUartHandle;
|
||||||
|
|
||||||
|
assert(serialHandle);
|
||||||
|
assert(buffer);
|
||||||
|
assert(length);
|
||||||
|
|
||||||
|
serialUartHandle = (serial_uart_state_t *)serialHandle;
|
||||||
|
|
||||||
|
return (serial_manager_status_t)HAL_UartReceiveBlocking(
|
||||||
|
((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), buffer, length);
|
||||||
|
}
|
||||||
|
#endif /* SERIAL_MANAGER_NON_BLOCKING_DUAL_MODE */
|
||||||
|
#else
|
||||||
|
|
||||||
|
serial_manager_status_t Serial_UartWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length)
|
||||||
|
{
|
||||||
|
serial_uart_state_t *serialUartHandle;
|
||||||
|
|
||||||
|
assert(serialHandle);
|
||||||
|
assert(buffer);
|
||||||
|
assert(length);
|
||||||
|
|
||||||
|
serialUartHandle = (serial_uart_state_t *)serialHandle;
|
||||||
|
|
||||||
|
return (serial_manager_status_t)HAL_UartSendBlocking(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]),
|
||||||
|
buffer, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
serial_manager_status_t Serial_UartRead(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length)
|
||||||
|
{
|
||||||
|
serial_uart_state_t *serialUartHandle;
|
||||||
|
|
||||||
|
assert(serialHandle);
|
||||||
|
assert(buffer);
|
||||||
|
assert(length);
|
||||||
|
|
||||||
|
serialUartHandle = (serial_uart_state_t *)serialHandle;
|
||||||
|
|
||||||
|
return (serial_manager_status_t)HAL_UartReceiveBlocking(
|
||||||
|
((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), buffer, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
serial_manager_status_t Serial_UartCancelWrite(serial_handle_t serialHandle)
|
||||||
|
{
|
||||||
|
serial_uart_state_t *serialUartHandle;
|
||||||
|
serial_manager_callback_message_t msg;
|
||||||
|
uint32_t primask;
|
||||||
|
uint8_t isBusy = 0U;
|
||||||
|
|
||||||
|
assert(serialHandle);
|
||||||
|
|
||||||
|
serialUartHandle = (serial_uart_state_t *)serialHandle;
|
||||||
|
|
||||||
|
primask = DisableGlobalIRQ();
|
||||||
|
isBusy = serialUartHandle->tx.busy;
|
||||||
|
serialUartHandle->tx.busy = 0U;
|
||||||
|
EnableGlobalIRQ(primask);
|
||||||
|
|
||||||
|
#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))
|
||||||
|
(void)HAL_UartTransferAbortSend(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));
|
||||||
|
#else
|
||||||
|
(void)HAL_UartAbortSend(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));
|
||||||
|
#endif
|
||||||
|
if (0U != isBusy)
|
||||||
|
{
|
||||||
|
if ((NULL != serialUartHandle->tx.callback))
|
||||||
|
{
|
||||||
|
msg.buffer = serialUartHandle->tx.buffer;
|
||||||
|
msg.length = serialUartHandle->tx.length;
|
||||||
|
serialUartHandle->tx.callback(serialUartHandle->tx.callbackParam, &msg, kStatus_SerialManager_Canceled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return kStatus_SerialManager_Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
serial_manager_status_t Serial_UartInstallTxCallback(serial_handle_t serialHandle,
|
||||||
|
serial_manager_callback_t callback,
|
||||||
|
void *callbackParam)
|
||||||
|
{
|
||||||
|
serial_uart_state_t *serialUartHandle;
|
||||||
|
|
||||||
|
assert(serialHandle);
|
||||||
|
|
||||||
|
serialUartHandle = (serial_uart_state_t *)serialHandle;
|
||||||
|
|
||||||
|
serialUartHandle->tx.callback = callback;
|
||||||
|
serialUartHandle->tx.callbackParam = callbackParam;
|
||||||
|
|
||||||
|
return kStatus_SerialManager_Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
serial_manager_status_t Serial_UartInstallRxCallback(serial_handle_t serialHandle,
|
||||||
|
serial_manager_callback_t callback,
|
||||||
|
void *callbackParam)
|
||||||
|
{
|
||||||
|
serial_uart_state_t *serialUartHandle;
|
||||||
|
|
||||||
|
assert(serialHandle);
|
||||||
|
|
||||||
|
serialUartHandle = (serial_uart_state_t *)serialHandle;
|
||||||
|
|
||||||
|
serialUartHandle->rx.callback = callback;
|
||||||
|
serialUartHandle->rx.callbackParam = callbackParam;
|
||||||
|
|
||||||
|
return kStatus_SerialManager_Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Serial_UartIsrFunction(serial_handle_t serialHandle)
|
||||||
|
{
|
||||||
|
serial_uart_state_t *serialUartHandle;
|
||||||
|
|
||||||
|
assert(serialHandle);
|
||||||
|
|
||||||
|
serialUartHandle = (serial_uart_state_t *)serialHandle;
|
||||||
|
|
||||||
|
HAL_UartIsrFunction(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
serial_manager_status_t Serial_UartEnterLowpower(serial_handle_t serialHandle)
|
||||||
|
{
|
||||||
|
serial_uart_state_t *serialUartHandle;
|
||||||
|
hal_uart_status_t uartstatus;
|
||||||
|
|
||||||
|
assert(serialHandle);
|
||||||
|
|
||||||
|
serialUartHandle = (serial_uart_state_t *)serialHandle;
|
||||||
|
|
||||||
|
uartstatus = HAL_UartEnterLowpower(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));
|
||||||
|
assert(kStatus_HAL_UartSuccess == uartstatus);
|
||||||
|
(void)uartstatus;
|
||||||
|
|
||||||
|
return kStatus_SerialManager_Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
serial_manager_status_t Serial_UartExitLowpower(serial_handle_t serialHandle)
|
||||||
|
{
|
||||||
|
serial_uart_state_t *serialUartHandle;
|
||||||
|
serial_manager_status_t status = kStatus_SerialManager_Success;
|
||||||
|
hal_uart_status_t uartstatus;
|
||||||
|
|
||||||
|
assert(serialHandle);
|
||||||
|
|
||||||
|
serialUartHandle = (serial_uart_state_t *)serialHandle;
|
||||||
|
|
||||||
|
uartstatus = HAL_UartExitLowpower(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));
|
||||||
|
assert(kStatus_HAL_UartSuccess == uartstatus);
|
||||||
|
(void)uartstatus;
|
||||||
|
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
serial_manager_type_t type =
|
||||||
|
*(serial_manager_type_t *)(void *)((uint8_t *)serialHandle - SERIAL_MANAGER_BLOCK_OFFSET);
|
||||||
|
if (type != kSerialManager_Blocking)
|
||||||
|
{
|
||||||
|
status = Serial_UartEnableReceiving(serialUartHandle);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2018 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SERIAL_PORT_UART_H__
|
||||||
|
#define __SERIAL_PORT_UART_H__
|
||||||
|
|
||||||
|
#include "fsl_adapter_uart.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @addtogroup serial_port_uart
|
||||||
|
* @ingroup serialmanager
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
/*! @brief serial port uart handle size*/
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
#define SERIAL_PORT_UART_HANDLE_SIZE (76U + HAL_UART_HANDLE_SIZE)
|
||||||
|
#define SERIAL_PORT_UART_BLOCK_HANDLE_SIZE (HAL_UART_BLOCK_HANDLE_SIZE)
|
||||||
|
#else
|
||||||
|
#define SERIAL_PORT_UART_HANDLE_SIZE (HAL_UART_HANDLE_SIZE)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SERIAL_USE_CONFIGURE_STRUCTURE
|
||||||
|
#define SERIAL_USE_CONFIGURE_STRUCTURE (0U) /*!< Enable or disable the confgure structure pointer */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @brief serial port uart parity mode*/
|
||||||
|
typedef enum _serial_port_uart_parity_mode
|
||||||
|
{
|
||||||
|
kSerialManager_UartParityDisabled = 0x0U, /*!< Parity disabled */
|
||||||
|
kSerialManager_UartParityEven = 0x2U, /*!< Parity even enabled */
|
||||||
|
kSerialManager_UartParityOdd = 0x3U, /*!< Parity odd enabled */
|
||||||
|
} serial_port_uart_parity_mode_t;
|
||||||
|
|
||||||
|
/*! @brief serial port uart stop bit count*/
|
||||||
|
typedef enum _serial_port_uart_stop_bit_count
|
||||||
|
{
|
||||||
|
kSerialManager_UartOneStopBit = 0U, /*!< One stop bit */
|
||||||
|
kSerialManager_UartTwoStopBit = 1U, /*!< Two stop bits */
|
||||||
|
} serial_port_uart_stop_bit_count_t;
|
||||||
|
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
/*! @brief serial port uart block mode*/
|
||||||
|
typedef enum _serial_port_uart_block_mode
|
||||||
|
{
|
||||||
|
kSerialManager_UartNonBlockMode = 0x0U, /*!< Uart NonBlock Mode */
|
||||||
|
kSerialManager_UartBlockMode = 0x1U, /*!< Uart Block Mode */
|
||||||
|
} serial_port_uart_block_mode_t;
|
||||||
|
#endif /* SERIAL_MANAGER_NON_BLOCKING_MODE */
|
||||||
|
|
||||||
|
typedef struct _serial_port_uart_config
|
||||||
|
{
|
||||||
|
uint32_t clockRate; /*!< clock rate */
|
||||||
|
uint32_t baudRate; /*!< baud rate */
|
||||||
|
serial_port_uart_parity_mode_t parityMode; /*!< Parity mode, disabled (default), even, odd */
|
||||||
|
serial_port_uart_stop_bit_count_t stopBitCount; /*!< Number of stop bits, 1 stop bit (default) or 2 stop bits */
|
||||||
|
|
||||||
|
uint8_t enableRx; /*!< Enable RX */
|
||||||
|
uint8_t enableTx; /*!< Enable TX */
|
||||||
|
uint8_t enableRxRTS; /*!< Enable RX RTS */
|
||||||
|
uint8_t enableTxCTS; /*!< Enable TX CTS */
|
||||||
|
uint8_t instance; /*!< Instance (0 - UART0, 1 - UART1, ...), detail information
|
||||||
|
please refer to the SOC corresponding RM. */
|
||||||
|
#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
|
||||||
|
serial_port_uart_block_mode_t mode; /*!< serial port uart block mode */
|
||||||
|
#endif /* SERIAL_MANAGER_NON_BLOCKING_MODE */
|
||||||
|
#if (defined(HAL_UART_ADAPTER_FIFO) && (HAL_UART_ADAPTER_FIFO > 0u))
|
||||||
|
uint8_t txFifoWatermark;
|
||||||
|
uint8_t rxFifoWatermark;
|
||||||
|
#endif
|
||||||
|
} serial_port_uart_config_t;
|
||||||
|
/*! @} */
|
||||||
|
#endif /* __SERIAL_PORT_UART_H__ */
|
||||||
|
|
@ -0,0 +1,812 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2018-2020 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __HAL_UART_ADAPTER_H__
|
||||||
|
#define __HAL_UART_ADAPTER_H__
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
#if defined(SDK_OS_FREE_RTOS)
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @addtogroup UART_Adapter
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/*! @brief Enable or disable UART adapter non-blocking mode (1 - enable, 0 - disable) */
|
||||||
|
#ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
|
||||||
|
#define UART_ADAPTER_NON_BLOCKING_MODE (1U)
|
||||||
|
#else
|
||||||
|
#ifndef SERIAL_MANAGER_NON_BLOCKING_MODE
|
||||||
|
#define UART_ADAPTER_NON_BLOCKING_MODE (0U)
|
||||||
|
#else
|
||||||
|
#define UART_ADAPTER_NON_BLOCKING_MODE SERIAL_MANAGER_NON_BLOCKING_MODE
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__GIC_PRIO_BITS)
|
||||||
|
#ifndef HAL_UART_ISR_PRIORITY
|
||||||
|
#define HAL_UART_ISR_PRIORITY (25U)
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#if defined(configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY)
|
||||||
|
#ifndef HAL_UART_ISR_PRIORITY
|
||||||
|
#define HAL_UART_ISR_PRIORITY (configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY)
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
/* The default value 3 is used to support different ARM Core, such as CM0P, CM4, CM7, and CM33, etc.
|
||||||
|
* The minimum number of priority bits implemented in the NVIC is 2 on these SOCs. The value of mininum
|
||||||
|
* priority is 3 (2^2 - 1). So, the default value is 3.
|
||||||
|
*/
|
||||||
|
#ifndef HAL_UART_ISR_PRIORITY
|
||||||
|
#define HAL_UART_ISR_PRIORITY (3U)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAL_UART_ADAPTER_LOWPOWER
|
||||||
|
#define HAL_UART_ADAPTER_LOWPOWER (0U)
|
||||||
|
#endif /* HAL_UART_ADAPTER_LOWPOWER */
|
||||||
|
|
||||||
|
#ifndef HAL_UART_ADAPTER_FIFO
|
||||||
|
#define HAL_UART_ADAPTER_FIFO (0U)
|
||||||
|
#endif /* HAL_UART_ADAPTER_FIFO */
|
||||||
|
|
||||||
|
#ifndef HAL_UART_DMA_ENABLE
|
||||||
|
#define HAL_UART_DMA_ENABLE (0U)
|
||||||
|
#endif /* HAL_UART_DMA_ENABLE */
|
||||||
|
|
||||||
|
/*! @brief Definition of uart dma adapter software idleline detection timeout value in ms. */
|
||||||
|
#ifndef HAL_UART_DMA_IDLELINE_TIMEOUT
|
||||||
|
#define HAL_UART_DMA_IDLELINE_TIMEOUT (1U)
|
||||||
|
#endif /* HAL_UART_DMA_IDLELINE_TIMEOUT */
|
||||||
|
|
||||||
|
/*! @brief Definition of uart adapter handle size. */
|
||||||
|
#if (defined(UART_ADAPTER_NON_BLOCKING_MODE) && (UART_ADAPTER_NON_BLOCKING_MODE > 0U))
|
||||||
|
#define HAL_UART_HANDLE_SIZE (92U + HAL_UART_ADAPTER_LOWPOWER * 16U + HAL_UART_DMA_ENABLE * 4)
|
||||||
|
#define HAL_UART_BLOCK_HANDLE_SIZE (8U + HAL_UART_ADAPTER_LOWPOWER * 16U + HAL_UART_DMA_ENABLE * 4)
|
||||||
|
#else
|
||||||
|
#define HAL_UART_HANDLE_SIZE (8U + HAL_UART_ADAPTER_LOWPOWER * 16U + HAL_UART_DMA_ENABLE * 4)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @brief Definition of uart dma adapter handle size. */
|
||||||
|
#if (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U))
|
||||||
|
#if (defined(FSL_FEATURE_SOC_DMA_COUNT) && (FSL_FEATURE_SOC_DMA_COUNT > 0U))
|
||||||
|
#define HAL_UART_DMA_HANDLE_SIZE (124U)
|
||||||
|
#elif (defined(FSL_FEATURE_SOC_EDMA_COUNT) && (FSL_FEATURE_SOC_EDMA_COUNT > 0U))
|
||||||
|
#define HAL_UART_DMA_HANDLE_SIZE (140U)
|
||||||
|
#else
|
||||||
|
#error This SOC does not have DMA or EDMA available!
|
||||||
|
#endif
|
||||||
|
#endif /* HAL_UART_DMA_ENABLE */
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Defines the uart handle
|
||||||
|
*
|
||||||
|
* This macro is used to define a 4 byte aligned uart handle.
|
||||||
|
* Then use "(hal_uart_handle_t)name" to get the uart handle.
|
||||||
|
*
|
||||||
|
* The macro should be global and could be optional. You could also define uart handle by yourself.
|
||||||
|
*
|
||||||
|
* This is an example,
|
||||||
|
* @code
|
||||||
|
* UART_HANDLE_DEFINE(uartHandle);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @param name The name string of the uart handle.
|
||||||
|
*/
|
||||||
|
#define UART_HANDLE_DEFINE(name) uint32_t name[((HAL_UART_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))]
|
||||||
|
|
||||||
|
#if (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U))
|
||||||
|
#define UART_DMA_HANDLE_DEFINE(name) \
|
||||||
|
uint32_t name[((HAL_UART_DMA_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))]
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @brief Whether enable transactional function of the UART. (0 - disable, 1 - enable) */
|
||||||
|
#ifndef HAL_UART_TRANSFER_MODE
|
||||||
|
#define HAL_UART_TRANSFER_MODE (0U)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @brief The handle of uart adapter. */
|
||||||
|
typedef void *hal_uart_handle_t;
|
||||||
|
|
||||||
|
/*! @brief The handle of uart dma adapter. */
|
||||||
|
typedef void *hal_uart_dma_handle_t;
|
||||||
|
|
||||||
|
/*! @brief UART status */
|
||||||
|
typedef enum _hal_uart_status
|
||||||
|
{
|
||||||
|
kStatus_HAL_UartSuccess = kStatus_Success, /*!< Successfully */
|
||||||
|
kStatus_HAL_UartTxBusy = MAKE_STATUS(kStatusGroup_HAL_UART, 1), /*!< TX busy */
|
||||||
|
kStatus_HAL_UartRxBusy = MAKE_STATUS(kStatusGroup_HAL_UART, 2), /*!< RX busy */
|
||||||
|
kStatus_HAL_UartTxIdle = MAKE_STATUS(kStatusGroup_HAL_UART, 3), /*!< HAL UART transmitter is idle. */
|
||||||
|
kStatus_HAL_UartRxIdle = MAKE_STATUS(kStatusGroup_HAL_UART, 4), /*!< HAL UART receiver is idle */
|
||||||
|
kStatus_HAL_UartBaudrateNotSupport =
|
||||||
|
MAKE_STATUS(kStatusGroup_HAL_UART, 5), /*!< Baudrate is not support in current clock source */
|
||||||
|
kStatus_HAL_UartProtocolError = MAKE_STATUS(
|
||||||
|
kStatusGroup_HAL_UART,
|
||||||
|
6), /*!< Error occurs for Noise, Framing, Parity, etc.
|
||||||
|
For transactional transfer, The up layer needs to abort the transfer and then starts again */
|
||||||
|
kStatus_HAL_UartError = MAKE_STATUS(kStatusGroup_HAL_UART, 7), /*!< Error occurs on HAL UART */
|
||||||
|
} hal_uart_status_t;
|
||||||
|
|
||||||
|
/*! @brief UART parity mode. */
|
||||||
|
typedef enum _hal_uart_parity_mode
|
||||||
|
{
|
||||||
|
kHAL_UartParityDisabled = 0x0U, /*!< Parity disabled */
|
||||||
|
kHAL_UartParityEven = 0x2U, /*!< Parity even enabled */
|
||||||
|
kHAL_UartParityOdd = 0x3U, /*!< Parity odd enabled */
|
||||||
|
} hal_uart_parity_mode_t;
|
||||||
|
|
||||||
|
#if (defined(UART_ADAPTER_NON_BLOCKING_MODE) && (UART_ADAPTER_NON_BLOCKING_MODE > 0U))
|
||||||
|
/*! @brief UART Block Mode. */
|
||||||
|
typedef enum _hal_uart_block_mode
|
||||||
|
{
|
||||||
|
kHAL_UartNonBlockMode = 0x0U, /*!< Uart NonBlock Mode */
|
||||||
|
kHAL_UartBlockMode = 0x1U, /*!< Uart Block Mode */
|
||||||
|
} hal_uart_block_mode_t;
|
||||||
|
#endif /* UART_ADAPTER_NON_BLOCKING_MODE */
|
||||||
|
|
||||||
|
/*! @brief UART stop bit count. */
|
||||||
|
typedef enum _hal_uart_stop_bit_count
|
||||||
|
{
|
||||||
|
kHAL_UartOneStopBit = 0U, /*!< One stop bit */
|
||||||
|
kHAL_UartTwoStopBit = 1U, /*!< Two stop bits */
|
||||||
|
} hal_uart_stop_bit_count_t;
|
||||||
|
|
||||||
|
/*! @brief UART configuration structure. */
|
||||||
|
typedef struct _hal_uart_config
|
||||||
|
{
|
||||||
|
uint32_t srcClock_Hz; /*!< Source clock */
|
||||||
|
uint32_t baudRate_Bps; /*!< Baud rate */
|
||||||
|
hal_uart_parity_mode_t parityMode; /*!< Parity mode, disabled (default), even, odd */
|
||||||
|
hal_uart_stop_bit_count_t stopBitCount; /*!< Number of stop bits, 1 stop bit (default) or 2 stop bits */
|
||||||
|
uint8_t enableRx; /*!< Enable RX */
|
||||||
|
uint8_t enableTx; /*!< Enable TX */
|
||||||
|
uint8_t enableRxRTS; /*!< Enable RX RTS */
|
||||||
|
uint8_t enableTxCTS; /*!< Enable TX CTS */
|
||||||
|
uint8_t instance; /*!< Instance (0 - UART0, 1 - UART1, ...), detail information please refer to the
|
||||||
|
SOC corresponding RM.
|
||||||
|
Invalid instance value will cause initialization failure. */
|
||||||
|
#if (defined(UART_ADAPTER_NON_BLOCKING_MODE) && (UART_ADAPTER_NON_BLOCKING_MODE > 0U))
|
||||||
|
hal_uart_block_mode_t mode; /*!< Uart block mode */
|
||||||
|
#endif /* UART_ADAPTER_NON_BLOCKING_MODE */
|
||||||
|
#if (defined(HAL_UART_ADAPTER_FIFO) && (HAL_UART_ADAPTER_FIFO > 0u))
|
||||||
|
uint8_t txFifoWatermark;
|
||||||
|
uint8_t rxFifoWatermark;
|
||||||
|
#endif
|
||||||
|
} hal_uart_config_t;
|
||||||
|
|
||||||
|
#if (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U))
|
||||||
|
/*! @brief UART DMA status */
|
||||||
|
typedef enum _hal_uart_dma_status
|
||||||
|
{
|
||||||
|
kStatus_HAL_UartDmaSuccess = 0U,
|
||||||
|
kStatus_HAL_UartDmaRxIdle = (1U << 1U),
|
||||||
|
kStatus_HAL_UartDmaRxBusy = (1U << 2U),
|
||||||
|
kStatus_HAL_UartDmaTxIdle = (1U << 3U),
|
||||||
|
kStatus_HAL_UartDmaTxBusy = (1U << 4U),
|
||||||
|
kStatus_HAL_UartDmaIdleline = (1U << 5U),
|
||||||
|
kStatus_HAL_UartDmaError = (1U << 6U),
|
||||||
|
} hal_uart_dma_status_t;
|
||||||
|
|
||||||
|
typedef struct _hal_uart_dma_config_t
|
||||||
|
{
|
||||||
|
uint8_t uart_instance;
|
||||||
|
uint8_t dma_instance;
|
||||||
|
uint8_t rx_channel;
|
||||||
|
uint8_t tx_channel;
|
||||||
|
#if defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && FSL_FEATURE_SOC_DMAMUX_COUNT
|
||||||
|
uint8_t dma_mux_instance;
|
||||||
|
dma_request_source_t rx_request;
|
||||||
|
dma_request_source_t tx_request;
|
||||||
|
#endif
|
||||||
|
#if defined(FSL_FEATURE_EDMA_HAS_CHANNEL_MUX) && FSL_FEATURE_EDMA_HAS_CHANNEL_MUX
|
||||||
|
uint32_t dma_rx_channel_mux;
|
||||||
|
uint32_t dma_tx_channel_mux;
|
||||||
|
#endif
|
||||||
|
} hal_uart_dma_config_t;
|
||||||
|
#endif /* HAL_UART_DMA_ENABLE */
|
||||||
|
|
||||||
|
/*! @brief UART transfer callback function. */
|
||||||
|
typedef void (*hal_uart_transfer_callback_t)(hal_uart_handle_t handle, hal_uart_status_t status, void *callbackParam);
|
||||||
|
|
||||||
|
#if (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U))
|
||||||
|
typedef struct _dma_callback_msg
|
||||||
|
{
|
||||||
|
hal_uart_dma_status_t status;
|
||||||
|
uint8_t *data;
|
||||||
|
uint32_t dataSize;
|
||||||
|
} hal_dma_callback_msg_t;
|
||||||
|
|
||||||
|
/*! @brief UART transfer callback function. */
|
||||||
|
typedef void (*hal_uart_dma_transfer_callback_t)(hal_uart_dma_handle_t handle,
|
||||||
|
hal_dma_callback_msg_t *msg,
|
||||||
|
void *callbackParam);
|
||||||
|
#endif /* HAL_UART_DMA_ENABLE */
|
||||||
|
|
||||||
|
/*! @brief UART transfer structure. */
|
||||||
|
typedef struct _hal_uart_transfer
|
||||||
|
{
|
||||||
|
uint8_t *data; /*!< The buffer of data to be transfer.*/
|
||||||
|
size_t dataSize; /*!< The byte count to be transfer. */
|
||||||
|
} hal_uart_transfer_t;
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* _cplusplus */
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Initialization and deinitialization
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Initializes a UART instance with the UART handle and the user configuration structure.
|
||||||
|
*
|
||||||
|
* This function configures the UART module with user-defined settings. The user can configure the configuration
|
||||||
|
* structure. The parameter handle is a pointer to point to a memory space of size #HAL_UART_HANDLE_SIZE allocated by
|
||||||
|
* the caller. Example below shows how to use this API to configure the UART.
|
||||||
|
* @code
|
||||||
|
* UART_HANDLE_DEFINE(g_UartHandle);
|
||||||
|
* hal_uart_config_t config;
|
||||||
|
* config.srcClock_Hz = 48000000;
|
||||||
|
* config.baudRate_Bps = 115200U;
|
||||||
|
* config.parityMode = kHAL_UartParityDisabled;
|
||||||
|
* config.stopBitCount = kHAL_UartOneStopBit;
|
||||||
|
* config.enableRx = 1;
|
||||||
|
* config.enableTx = 1;
|
||||||
|
* config.enableRxRTS = 0;
|
||||||
|
* config.enableTxCTS = 0;
|
||||||
|
* config.instance = 0;
|
||||||
|
* HAL_UartInit((hal_uart_handle_t)g_UartHandle, &config);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @param handle Pointer to point to a memory space of size #HAL_UART_HANDLE_SIZE allocated by the caller.
|
||||||
|
* The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.
|
||||||
|
* You can define the handle in the following two ways:
|
||||||
|
* #UART_HANDLE_DEFINE(handle);
|
||||||
|
* or
|
||||||
|
* uint32_t handle[((HAL_UART_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))];
|
||||||
|
* @param config Pointer to user-defined configuration structure.
|
||||||
|
* @retval kStatus_HAL_UartBaudrateNotSupport Baudrate is not support in current clock source.
|
||||||
|
* @retval kStatus_HAL_UartSuccess UART initialization succeed
|
||||||
|
*/
|
||||||
|
hal_uart_status_t HAL_UartInit(hal_uart_handle_t handle, const hal_uart_config_t *config);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Deinitializes a UART instance.
|
||||||
|
*
|
||||||
|
* This function waits for TX complete, disables TX and RX, and disables the UART clock.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @retval kStatus_HAL_UartSuccess UART de-initialization succeed
|
||||||
|
*/
|
||||||
|
hal_uart_status_t HAL_UartDeinit(hal_uart_handle_t handle);
|
||||||
|
|
||||||
|
/*! @}*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Blocking bus Operations
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reads RX data register using a blocking method.
|
||||||
|
*
|
||||||
|
* This function polls the RX register, waits for the RX register to be full or for RX FIFO to
|
||||||
|
* have data, and reads data from the RX register.
|
||||||
|
*
|
||||||
|
* @note The function #HAL_UartReceiveBlocking and the function HAL_UartTransferReceiveNonBlocking
|
||||||
|
* cannot be used at the same time.
|
||||||
|
* And, the function HAL_UartTransferAbortReceive cannot be used to abort the transmission of this function.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @param data Start address of the buffer to store the received data.
|
||||||
|
* @param length Size of the buffer.
|
||||||
|
* @retval kStatus_HAL_UartError An error occurred while receiving data.
|
||||||
|
* @retval kStatus_HAL_UartParityError A parity error occurred while receiving data.
|
||||||
|
* @retval kStatus_HAL_UartSuccess Successfully received all data.
|
||||||
|
*/
|
||||||
|
hal_uart_status_t HAL_UartReceiveBlocking(hal_uart_handle_t handle, uint8_t *data, size_t length);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Writes to the TX register using a blocking method.
|
||||||
|
*
|
||||||
|
* This function polls the TX register, waits for the TX register to be empty or for the TX FIFO
|
||||||
|
* to have room and writes data to the TX buffer.
|
||||||
|
*
|
||||||
|
* @note The function #HAL_UartSendBlocking and the function HAL_UartTransferSendNonBlocking
|
||||||
|
* cannot be used at the same time.
|
||||||
|
* And, the function HAL_UartTransferAbortSend cannot be used to abort the transmission of this function.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @param data Start address of the data to write.
|
||||||
|
* @param length Size of the data to write.
|
||||||
|
* @retval kStatus_HAL_UartSuccess Successfully sent all data.
|
||||||
|
*/
|
||||||
|
hal_uart_status_t HAL_UartSendBlocking(hal_uart_handle_t handle, const uint8_t *data, size_t length);
|
||||||
|
|
||||||
|
/*! @}*/
|
||||||
|
|
||||||
|
#if (defined(UART_ADAPTER_NON_BLOCKING_MODE) && (UART_ADAPTER_NON_BLOCKING_MODE > 0U))
|
||||||
|
#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Transactional
|
||||||
|
* @note The transactional API and the functional API cannot be used at the same time. The macro
|
||||||
|
* #HAL_UART_TRANSFER_MODE is used to set which one will be used. If #HAL_UART_TRANSFER_MODE is zero, the
|
||||||
|
* functional API with non-blocking mode will be used. Otherwise, transactional API will be used.
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Installs a callback and callback parameter.
|
||||||
|
*
|
||||||
|
* This function is used to install the callback and callback parameter for UART module.
|
||||||
|
* When any status of the UART changed, the driver will notify the upper layer by the installed callback
|
||||||
|
* function. And the status is also passed as status parameter when the callback is called.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @param callback The callback function.
|
||||||
|
* @param callbackParam The parameter of the callback function.
|
||||||
|
* @retval kStatus_HAL_UartSuccess Successfully install the callback.
|
||||||
|
*/
|
||||||
|
hal_uart_status_t HAL_UartTransferInstallCallback(hal_uart_handle_t handle,
|
||||||
|
hal_uart_transfer_callback_t callback,
|
||||||
|
void *callbackParam);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Receives a buffer of data using an interrupt method.
|
||||||
|
*
|
||||||
|
* This function receives data using an interrupt method. This is a non-blocking function, which
|
||||||
|
* returns directly without waiting for all data to be received.
|
||||||
|
* The receive request is saved by the UART driver.
|
||||||
|
* When the new data arrives, the receive request is serviced first.
|
||||||
|
* When all data is received, the UART driver notifies the upper layer
|
||||||
|
* through a callback function and passes the status parameter @ref kStatus_UART_RxIdle.
|
||||||
|
*
|
||||||
|
* @note The function #HAL_UartReceiveBlocking and the function #HAL_UartTransferReceiveNonBlocking
|
||||||
|
* cannot be used at the same time.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @param transfer UART transfer structure, see #hal_uart_transfer_t.
|
||||||
|
* @retval kStatus_HAL_UartSuccess Successfully queue the transfer into transmit queue.
|
||||||
|
* @retval kStatus_HAL_UartRxBusy Previous receive request is not finished.
|
||||||
|
* @retval kStatus_HAL_UartError An error occurred.
|
||||||
|
*/
|
||||||
|
hal_uart_status_t HAL_UartTransferReceiveNonBlocking(hal_uart_handle_t handle, hal_uart_transfer_t *transfer);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Transmits a buffer of data using the interrupt method.
|
||||||
|
*
|
||||||
|
* This function sends data using an interrupt method. This is a non-blocking function, which
|
||||||
|
* returns directly without waiting for all data to be written to the TX register. When
|
||||||
|
* all data is written to the TX register in the ISR, the UART driver calls the callback
|
||||||
|
* function and passes the @ref kStatus_UART_TxIdle as status parameter.
|
||||||
|
*
|
||||||
|
* @note The function #HAL_UartSendBlocking and the function #HAL_UartTransferSendNonBlocking
|
||||||
|
* cannot be used at the same time.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @param transfer UART transfer structure. See #hal_uart_transfer_t.
|
||||||
|
* @retval kStatus_HAL_UartSuccess Successfully start the data transmission.
|
||||||
|
* @retval kStatus_HAL_UartTxBusy Previous transmission still not finished; data not all written to TX register yet.
|
||||||
|
* @retval kStatus_HAL_UartError An error occurred.
|
||||||
|
*/
|
||||||
|
hal_uart_status_t HAL_UartTransferSendNonBlocking(hal_uart_handle_t handle, hal_uart_transfer_t *transfer);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Gets the number of bytes that have been received.
|
||||||
|
*
|
||||||
|
* This function gets the number of bytes that have been received.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @param count Receive bytes count.
|
||||||
|
* @retval kStatus_HAL_UartError An error occurred.
|
||||||
|
* @retval kStatus_Success Get successfully through the parameter \p count.
|
||||||
|
*/
|
||||||
|
hal_uart_status_t HAL_UartTransferGetReceiveCount(hal_uart_handle_t handle, uint32_t *count);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Gets the number of bytes written to the UART TX register.
|
||||||
|
*
|
||||||
|
* This function gets the number of bytes written to the UART TX
|
||||||
|
* register by using the interrupt method.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @param count Send bytes count.
|
||||||
|
* @retval kStatus_HAL_UartError An error occurred.
|
||||||
|
* @retval kStatus_Success Get successfully through the parameter \p count.
|
||||||
|
*/
|
||||||
|
hal_uart_status_t HAL_UartTransferGetSendCount(hal_uart_handle_t handle, uint32_t *count);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Aborts the interrupt-driven data receiving.
|
||||||
|
*
|
||||||
|
* This function aborts the interrupt-driven data receiving. The user can get the remainBytes to know
|
||||||
|
* how many bytes are not received yet.
|
||||||
|
*
|
||||||
|
* @note The function #HAL_UartTransferAbortReceive cannot be used to abort the transmission of
|
||||||
|
* the function #HAL_UartReceiveBlocking.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @retval kStatus_Success Get successfully abort the receiving.
|
||||||
|
*/
|
||||||
|
hal_uart_status_t HAL_UartTransferAbortReceive(hal_uart_handle_t handle);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Aborts the interrupt-driven data sending.
|
||||||
|
*
|
||||||
|
* This function aborts the interrupt-driven data sending. The user can get the remainBytes to find out
|
||||||
|
* how many bytes are not sent out.
|
||||||
|
*
|
||||||
|
* @note The function #HAL_UartTransferAbortSend cannot be used to abort the transmission of
|
||||||
|
* the function #HAL_UartSendBlocking.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @retval kStatus_Success Get successfully abort the sending.
|
||||||
|
*/
|
||||||
|
hal_uart_status_t HAL_UartTransferAbortSend(hal_uart_handle_t handle);
|
||||||
|
|
||||||
|
/*! @}*/
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Functional API with non-blocking mode.
|
||||||
|
* @note The functional API and the transactional API cannot be used at the same time. The macro
|
||||||
|
* #HAL_UART_TRANSFER_MODE is used to set which one will be used. If #HAL_UART_TRANSFER_MODE is zero, the
|
||||||
|
* functional API with non-blocking mode will be used. Otherwise, transactional API will be used.
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Installs a callback and callback parameter.
|
||||||
|
*
|
||||||
|
* This function is used to install the callback and callback parameter for UART module.
|
||||||
|
* When non-blocking sending or receiving finished, the adapter will notify the upper layer by the installed callback
|
||||||
|
* function. And the status is also passed as status parameter when the callback is called.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @param callback The callback function.
|
||||||
|
* @param callbackParam The parameter of the callback function.
|
||||||
|
* @retval kStatus_HAL_UartSuccess Successfully install the callback.
|
||||||
|
*/
|
||||||
|
hal_uart_status_t HAL_UartInstallCallback(hal_uart_handle_t handle,
|
||||||
|
hal_uart_transfer_callback_t callback,
|
||||||
|
void *callbackParam);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Receives a buffer of data using an interrupt method.
|
||||||
|
*
|
||||||
|
* This function receives data using an interrupt method. This is a non-blocking function, which
|
||||||
|
* returns directly without waiting for all data to be received.
|
||||||
|
* The receive request is saved by the UART adapter.
|
||||||
|
* When the new data arrives, the receive request is serviced first.
|
||||||
|
* When all data is received, the UART adapter notifies the upper layer
|
||||||
|
* through a callback function and passes the status parameter @ref kStatus_UART_RxIdle.
|
||||||
|
*
|
||||||
|
* @note The function #HAL_UartReceiveBlocking and the function #HAL_UartReceiveNonBlocking
|
||||||
|
* cannot be used at the same time.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @param data Start address of the data to write.
|
||||||
|
* @param length Size of the data to write.
|
||||||
|
* @retval kStatus_HAL_UartSuccess Successfully queue the transfer into transmit queue.
|
||||||
|
* @retval kStatus_HAL_UartRxBusy Previous receive request is not finished.
|
||||||
|
* @retval kStatus_HAL_UartError An error occurred.
|
||||||
|
*/
|
||||||
|
hal_uart_status_t HAL_UartReceiveNonBlocking(hal_uart_handle_t handle, uint8_t *data, size_t length);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Transmits a buffer of data using the interrupt method.
|
||||||
|
*
|
||||||
|
* This function sends data using an interrupt method. This is a non-blocking function, which
|
||||||
|
* returns directly without waiting for all data to be written to the TX register. When
|
||||||
|
* all data is written to the TX register in the ISR, the UART driver calls the callback
|
||||||
|
* function and passes the @ref kStatus_UART_TxIdle as status parameter.
|
||||||
|
*
|
||||||
|
* @note The function #HAL_UartSendBlocking and the function #HAL_UartSendNonBlocking
|
||||||
|
* cannot be used at the same time.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @param data Start address of the data to write.
|
||||||
|
* @param length Size of the data to write.
|
||||||
|
* @retval kStatus_HAL_UartSuccess Successfully start the data transmission.
|
||||||
|
* @retval kStatus_HAL_UartTxBusy Previous transmission still not finished; data not all written to TX register yet.
|
||||||
|
* @retval kStatus_HAL_UartError An error occurred.
|
||||||
|
*/
|
||||||
|
hal_uart_status_t HAL_UartSendNonBlocking(hal_uart_handle_t handle, uint8_t *data, size_t length);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Gets the number of bytes that have been received.
|
||||||
|
*
|
||||||
|
* This function gets the number of bytes that have been received.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @param count Receive bytes count.
|
||||||
|
* @retval kStatus_HAL_UartError An error occurred.
|
||||||
|
* @retval kStatus_Success Get successfully through the parameter \p count.
|
||||||
|
*/
|
||||||
|
hal_uart_status_t HAL_UartGetReceiveCount(hal_uart_handle_t handle, uint32_t *reCount);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Gets the number of bytes written to the UART TX register.
|
||||||
|
*
|
||||||
|
* This function gets the number of bytes written to the UART TX
|
||||||
|
* register by using the interrupt method.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @param count Send bytes count.
|
||||||
|
* @retval kStatus_HAL_UartError An error occurred.
|
||||||
|
* @retval kStatus_Success Get successfully through the parameter \p count.
|
||||||
|
*/
|
||||||
|
hal_uart_status_t HAL_UartGetSendCount(hal_uart_handle_t handle, uint32_t *seCount);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Aborts the interrupt-driven data receiving.
|
||||||
|
*
|
||||||
|
* This function aborts the interrupt-driven data receiving. The user can get the remainBytes to know
|
||||||
|
* how many bytes are not received yet.
|
||||||
|
*
|
||||||
|
* @note The function #HAL_UartAbortReceive cannot be used to abort the transmission of
|
||||||
|
* the function #HAL_UartReceiveBlocking.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @retval kStatus_Success Get successfully abort the receiving.
|
||||||
|
*/
|
||||||
|
hal_uart_status_t HAL_UartAbortReceive(hal_uart_handle_t handle);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Aborts the interrupt-driven data sending.
|
||||||
|
*
|
||||||
|
* This function aborts the interrupt-driven data sending. The user can get the remainBytes to find out
|
||||||
|
* how many bytes are not sent out.
|
||||||
|
*
|
||||||
|
* @note The function #HAL_UartAbortSend cannot be used to abort the transmission of
|
||||||
|
* the function #HAL_UartSendBlocking.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @retval kStatus_Success Get successfully abort the sending.
|
||||||
|
*/
|
||||||
|
hal_uart_status_t HAL_UartAbortSend(hal_uart_handle_t handle);
|
||||||
|
|
||||||
|
/*! @}*/
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U))
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Initializes a UART dma instance with the UART dma handle and the user configuration structure.
|
||||||
|
*
|
||||||
|
* This function configures the UART dma module with user-defined settings. The user can configure the configuration
|
||||||
|
* structure. The parameter handle is a pointer to point to a memory space of size #HAL_UART_DMA_HANDLE_SIZE allocated
|
||||||
|
* by the caller. Example below shows how to use this API to configure the UART.
|
||||||
|
* @code
|
||||||
|
*
|
||||||
|
* Init TimerManager, only used in UART without Idleline interrupt
|
||||||
|
* timer_config_t timerConfig;
|
||||||
|
* timerConfig.srcClock_Hz = 16000000;
|
||||||
|
* timerConfig.instance = 0;
|
||||||
|
* TM_Init(&timerConfig);
|
||||||
|
*
|
||||||
|
* Init the DMA module
|
||||||
|
* DMA_Init(DMA0);
|
||||||
|
*
|
||||||
|
* Define a uart dma handle
|
||||||
|
* UART_HANDLE_DEFINE(g_uartHandle);
|
||||||
|
* UART_DMA_HANDLE_DEFINE(g_UartDmaHandle);
|
||||||
|
*
|
||||||
|
* Configure uart settings
|
||||||
|
* hal_uart_config_t uartConfig;
|
||||||
|
* uartConfig.srcClock_Hz = 48000000;
|
||||||
|
* uartConfig.baudRate_Bps = 115200;
|
||||||
|
* uartConfig.parityMode = kHAL_UartParityDisabled;
|
||||||
|
* uartConfig.stopBitCount = kHAL_UartOneStopBit;
|
||||||
|
* uartConfig.enableRx = 1;
|
||||||
|
* uartConfig.enableTx = 1;
|
||||||
|
* uartConfig.enableRxRTS = 0;
|
||||||
|
* uartConfig.enableTxCTS = 0;
|
||||||
|
* uartConfig.instance = 0;
|
||||||
|
*
|
||||||
|
* Init uart
|
||||||
|
* HAL_UartInit((hal_uart_handle_t *)g_uartHandle, &uartConfig);
|
||||||
|
*
|
||||||
|
* Configure uart dma settings
|
||||||
|
* hal_uart_dma_config_t dmaConfig;
|
||||||
|
* dmaConfig.uart_instance = 0;
|
||||||
|
* dmaConfig.dma_instance = 0;
|
||||||
|
* dmaConfig.rx_channel = 0;
|
||||||
|
* dmaConfig.tx_channel = 1;
|
||||||
|
*
|
||||||
|
* Init uart dma
|
||||||
|
* HAL_UartDMAInit((hal_uart_handle_t *)g_uartHandle, (hal_uart_dma_handle_t *)g_uartDmaHandle, &dmaConfig);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @param dmaHandle Pointer to point to a memory space of size #HAL_UART_DMA_HANDLE_SIZE allocated by the caller.
|
||||||
|
* The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.
|
||||||
|
* You can define the handle in the following two ways:
|
||||||
|
* #UART_DMA_HANDLE_DEFINE(handle);
|
||||||
|
* or
|
||||||
|
* uint32_t handle[((HAL_UART_DMA_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))];
|
||||||
|
* @param dmaConfig Pointer to user-defined configuration structure.
|
||||||
|
* @retval kStatus_HAL_UartDmaError UART dma initialization failed.
|
||||||
|
* @retval kStatus_HAL_UartDmaSuccess UART dma initialization succeed.
|
||||||
|
*/
|
||||||
|
hal_uart_dma_status_t HAL_UartDMAInit(hal_uart_handle_t handle,
|
||||||
|
hal_uart_dma_handle_t dmaHandle,
|
||||||
|
hal_uart_dma_config_t *dmaConfig);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Deinitializes a UART DMA instance.
|
||||||
|
*
|
||||||
|
* This function will abort uart dma receive/send transfer and deinitialize UART.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @retval kStatus_HAL_UartDmaSuccess UART DMA de-initialization succeed
|
||||||
|
*/
|
||||||
|
hal_uart_dma_status_t HAL_UartDMADeinit(hal_uart_handle_t handle);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Installs a callback and callback parameter.
|
||||||
|
*
|
||||||
|
* This function is used to install the callback and callback parameter for UART DMA module.
|
||||||
|
* When any status of the UART DMA changed, the driver will notify the upper layer by the installed callback
|
||||||
|
* function. And the status is also passed as status parameter when the callback is called.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @param callback The callback function.
|
||||||
|
* @param callbackParam The parameter of the callback function.
|
||||||
|
* @retval kStatus_HAL_UartDmaSuccess Successfully install the callback.
|
||||||
|
*/
|
||||||
|
hal_uart_dma_status_t HAL_UartDMATransferInstallCallback(hal_uart_handle_t handle,
|
||||||
|
hal_uart_dma_transfer_callback_t callback,
|
||||||
|
void *callbackParam);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Receives a buffer of data using an dma method.
|
||||||
|
*
|
||||||
|
* This function receives data using an dma method. This is a non-blocking function, which
|
||||||
|
* returns directly without waiting for all data to be received.
|
||||||
|
* The receive request is saved by the UART DMA driver.
|
||||||
|
* When all data is received, the UART DMA adapter notifies the upper layer
|
||||||
|
* through a callback function and passes the status parameter @ref kStatus_HAL_UartDmaRxIdle.
|
||||||
|
*
|
||||||
|
* When an idleline is detected, the UART DMA adapter notifies the upper layer through a callback function,
|
||||||
|
* and passes the status parameter @ref kStatus_HAL_UartDmaIdleline. For the UARTs without hardware idleline
|
||||||
|
* interrupt(like usart), it will use a software idleline detection method with the help of TimerManager.
|
||||||
|
*
|
||||||
|
* When the soc support cache, uplayer should do cache maintain operations for transfer buffer before call this API.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @param data data Start address of the buffer to store the received data.
|
||||||
|
* @param length Size of the buffer.
|
||||||
|
* @param receiveAll Idleline interrupt will not end transfer process if set true.
|
||||||
|
* @retval kStatus_HAL_UartDmaSuccess Successfully start the data receive.
|
||||||
|
* @retval kStatus_HAL_UartDmaRxBusy Previous receive request is not finished.
|
||||||
|
*/
|
||||||
|
hal_uart_dma_status_t HAL_UartDMATransferReceive(hal_uart_handle_t handle,
|
||||||
|
uint8_t *data,
|
||||||
|
size_t length,
|
||||||
|
bool receiveAll);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Transmits a buffer of data using an dma method.
|
||||||
|
*
|
||||||
|
* This function sends data using an dma method. This is a non-blocking function, which
|
||||||
|
* returns directly without waiting for all data to be written to the TX register. When
|
||||||
|
* all data is written to the TX register by DMA, the UART DMA driver calls the callback
|
||||||
|
* function and passes the @ref kStatus_HAL_UartDmaTxIdle as status parameter.
|
||||||
|
*
|
||||||
|
* When the soc support cache, uplayer should do cache maintain operations for transfer buffer before call this API.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @param data data Start address of the data to write.
|
||||||
|
* @param length Size of the data to write.
|
||||||
|
* @retval kStatus_HAL_UartDmaSuccess Successfully start the data transmission.
|
||||||
|
* @retval kStatus_HAL_UartDmaTxBusy Previous send request is not finished.
|
||||||
|
*/
|
||||||
|
hal_uart_dma_status_t HAL_UartDMATransferSend(hal_uart_handle_t handle, uint8_t *data, size_t length);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Gets the number of bytes that have been received.
|
||||||
|
*
|
||||||
|
* This function gets the number of bytes that have been received.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @param reCount Receive bytes count.
|
||||||
|
* @retval kStatus_HAL_UartDmaError An error occurred.
|
||||||
|
* @retval kStatus_HAL_UartDmaSuccess Get successfully through the parameter \p reCount.
|
||||||
|
*/
|
||||||
|
hal_uart_dma_status_t HAL_UartDMAGetReceiveCount(hal_uart_handle_t handle, uint32_t *reCount);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Gets the number of bytes written to the UART TX register.
|
||||||
|
*
|
||||||
|
* This function gets the number of bytes written to the UART TX
|
||||||
|
* register by using the DMA method.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @param count Send bytes count.
|
||||||
|
* @retval kStatus_HAL_UartDmaError An error occurred.
|
||||||
|
* @retval kStatus_HAL_UartDmaSuccess Get successfully through the parameter \p seCount.
|
||||||
|
*/
|
||||||
|
hal_uart_dma_status_t HAL_UartDMAGetSendCount(hal_uart_handle_t handle, uint32_t *seCount);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Aborts the DMA-driven data receiving.
|
||||||
|
*
|
||||||
|
* This function aborts the DMA-driven data receiving.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @retval kStatus_HAL_UartDmaSuccess Get successfully abort the receiving.
|
||||||
|
*/
|
||||||
|
hal_uart_dma_status_t HAL_UartDMAAbortReceive(hal_uart_handle_t handle);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Aborts the DMA-driven data sending.
|
||||||
|
*
|
||||||
|
* This function aborts the DMA-driven data sending.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @retval kStatus_Success Get successfully abort the sending.
|
||||||
|
*/
|
||||||
|
hal_uart_dma_status_t HAL_UartDMAAbortSend(hal_uart_handle_t handle);
|
||||||
|
#endif /* HAL_UART_DMA_ENABLE */
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Prepares to enter low power consumption.
|
||||||
|
*
|
||||||
|
* This function is used to prepare to enter low power consumption.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @retval kStatus_HAL_UartSuccess Successful operation.
|
||||||
|
* @retval kStatus_HAL_UartError An error occurred.
|
||||||
|
*/
|
||||||
|
hal_uart_status_t HAL_UartEnterLowpower(hal_uart_handle_t handle);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Restores from low power consumption.
|
||||||
|
*
|
||||||
|
* This function is used to restore from low power consumption.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
* @retval kStatus_HAL_UartSuccess Successful operation.
|
||||||
|
* @retval kStatus_HAL_UartError An error occurred.
|
||||||
|
*/
|
||||||
|
hal_uart_status_t HAL_UartExitLowpower(hal_uart_handle_t handle);
|
||||||
|
|
||||||
|
#if (defined(UART_ADAPTER_NON_BLOCKING_MODE) && (UART_ADAPTER_NON_BLOCKING_MODE > 0U))
|
||||||
|
/*!
|
||||||
|
* @brief UART IRQ handle function.
|
||||||
|
*
|
||||||
|
* This function handles the UART transmit and receive IRQ request.
|
||||||
|
*
|
||||||
|
* @param handle UART handle pointer.
|
||||||
|
*/
|
||||||
|
void HAL_UartIsrFunction(hal_uart_handle_t handle);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/*! @}*/
|
||||||
|
#endif /* __HAL_UART_ADAPTER_H__ */
|
||||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,415 @@
|
||||||
|
/*
|
||||||
|
** ###################################################################
|
||||||
|
** Version: rev. 1.1, 2019-05-16
|
||||||
|
** Build: b210318
|
||||||
|
**
|
||||||
|
** Abstract:
|
||||||
|
** Chip specific module features.
|
||||||
|
**
|
||||||
|
** Copyright 2016 Freescale Semiconductor, Inc.
|
||||||
|
** Copyright 2016-2021 NXP
|
||||||
|
** All rights reserved.
|
||||||
|
**
|
||||||
|
** SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
**
|
||||||
|
** http: www.nxp.com
|
||||||
|
** mail: support@nxp.com
|
||||||
|
**
|
||||||
|
** Revisions:
|
||||||
|
** - rev. 1.0 (2018-08-22)
|
||||||
|
** Initial version based on v0.2UM
|
||||||
|
** - rev. 1.1 (2019-05-16)
|
||||||
|
** Initial A1 version based on v1.3UM
|
||||||
|
**
|
||||||
|
** ###################################################################
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _LPC55S69_cm33_core0_FEATURES_H_
|
||||||
|
#define _LPC55S69_cm33_core0_FEATURES_H_
|
||||||
|
|
||||||
|
/* SOC module features */
|
||||||
|
|
||||||
|
/* @brief CASPER availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_CASPER_COUNT (1)
|
||||||
|
/* @brief CRC availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_CRC_COUNT (1)
|
||||||
|
/* @brief CTIMER availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_CTIMER_COUNT (5)
|
||||||
|
/* @brief DMA availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_DMA_COUNT (2)
|
||||||
|
/* @brief FLASH availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_FLASH_COUNT (1)
|
||||||
|
/* @brief FLEXCOMM availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_FLEXCOMM_COUNT (9)
|
||||||
|
/* @brief GINT availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_GINT_COUNT (2)
|
||||||
|
/* @brief GPIO availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_GPIO_COUNT (1)
|
||||||
|
/* @brief SECGPIO availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_SECGPIO_COUNT (1)
|
||||||
|
/* @brief HASHCRYPT availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_HASHCRYPT_COUNT (1)
|
||||||
|
/* @brief I2C availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_I2C_COUNT (8)
|
||||||
|
/* @brief I2S availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_I2S_COUNT (8)
|
||||||
|
/* @brief INPUTMUX availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_INPUTMUX_COUNT (1)
|
||||||
|
/* @brief IOCON availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_IOCON_COUNT (1)
|
||||||
|
/* @brief LPADC availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_LPADC_COUNT (1)
|
||||||
|
/* @brief MAILBOX availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_MAILBOX_COUNT (1)
|
||||||
|
/* @brief MRT availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_MRT_COUNT (1)
|
||||||
|
/* @brief OSTIMER availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_OSTIMER_COUNT (1)
|
||||||
|
/* @brief PINT availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_PINT_COUNT (1)
|
||||||
|
/* @brief SECPINT availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_SECPINT_COUNT (1)
|
||||||
|
/* @brief PMC availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_PMC_COUNT (1)
|
||||||
|
/* @brief POWERQUAD availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_POWERQUAD_COUNT (1)
|
||||||
|
/* @brief PUF availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_PUF_COUNT (1)
|
||||||
|
/* @brief LPC_RNG1 availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_LPC_RNG1_COUNT (1)
|
||||||
|
/* @brief RTC availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_RTC_COUNT (1)
|
||||||
|
/* @brief SCT availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_SCT_COUNT (1)
|
||||||
|
/* @brief SDIF availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_SDIF_COUNT (1)
|
||||||
|
/* @brief SPI availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_SPI_COUNT (9)
|
||||||
|
/* @brief SYSCON availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_SYSCON_COUNT (1)
|
||||||
|
/* @brief SYSCTL1 availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_SYSCTL1_COUNT (1)
|
||||||
|
/* @brief USART availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_USART_COUNT (8)
|
||||||
|
/* @brief USB availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_USB_COUNT (1)
|
||||||
|
/* @brief USBFSH availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_USBFSH_COUNT (1)
|
||||||
|
/* @brief USBHSD availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_USBHSD_COUNT (1)
|
||||||
|
/* @brief USBHSH availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_USBHSH_COUNT (1)
|
||||||
|
/* @brief USBPHY availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_USBPHY_COUNT (1)
|
||||||
|
/* @brief UTICK availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_UTICK_COUNT (1)
|
||||||
|
/* @brief WWDT availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_WWDT_COUNT (1)
|
||||||
|
|
||||||
|
/* LPADC module features */
|
||||||
|
|
||||||
|
/* @brief FIFO availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_LPADC_FIFO_COUNT (2)
|
||||||
|
/* @brief Has subsequent trigger priority (bitfield CFG[TPRICTRL]). */
|
||||||
|
#define FSL_FEATURE_LPADC_HAS_CFG_SUBSEQUENT_PRIORITY (1)
|
||||||
|
/* @brief Has differential mode (bitfield CMDLn[DIFF]). */
|
||||||
|
#define FSL_FEATURE_LPADC_HAS_CMDL_DIFF (0)
|
||||||
|
/* @brief Has channel scale (bitfield CMDLn[CSCALE]). */
|
||||||
|
#define FSL_FEATURE_LPADC_HAS_CMDL_CSCALE (0)
|
||||||
|
/* @brief Has conversion type select (bitfield CMDLn[CTYPE]). */
|
||||||
|
#define FSL_FEATURE_LPADC_HAS_CMDL_CTYPE (1)
|
||||||
|
/* @brief Has conversion resolution select (bitfield CMDLn[MODE]). */
|
||||||
|
#define FSL_FEATURE_LPADC_HAS_CMDL_MODE (1)
|
||||||
|
/* @brief Has compare function enable (bitfield CMDHn[CMPEN]). */
|
||||||
|
#define FSL_FEATURE_LPADC_HAS_CMDH_CMPEN (1)
|
||||||
|
/* @brief Has Wait for trigger assertion before execution (bitfield CMDHn[WAIT_TRIG]). */
|
||||||
|
#define FSL_FEATURE_LPADC_HAS_CMDH_WAIT_TRIG (1)
|
||||||
|
/* @brief Has offset calibration (bitfield CTRL[CALOFS]). */
|
||||||
|
#define FSL_FEATURE_LPADC_HAS_CTRL_CALOFS (1)
|
||||||
|
/* @brief Has gain calibration (bitfield CTRL[CAL_REQ]). */
|
||||||
|
#define FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ (1)
|
||||||
|
/* @brief Has calibration average (bitfield CTRL[CAL_AVGS]). */
|
||||||
|
#define FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS (1)
|
||||||
|
/* @brief Has internal clock (bitfield CFG[ADCKEN]). */
|
||||||
|
#define FSL_FEATURE_LPADC_HAS_CFG_ADCKEN (0)
|
||||||
|
/* @brief Enable support for low voltage reference on option 1 reference (bitfield CFG[VREF1RNG]). */
|
||||||
|
#define FSL_FEATURE_LPADC_HAS_CFG_VREF1RNG (0)
|
||||||
|
/* @brief Has calibration (bitfield CFG[CALOFS]). */
|
||||||
|
#define FSL_FEATURE_LPADC_HAS_CFG_CALOFS (0)
|
||||||
|
/* @brief Has offset trim (register OFSTRIM). */
|
||||||
|
#define FSL_FEATURE_LPADC_HAS_OFSTRIM (1)
|
||||||
|
/* @brief Has internal temperature sensor. */
|
||||||
|
#define FSL_FEATURE_LPADC_HAS_INTERNAL_TEMP_SENSOR (1)
|
||||||
|
/* @brief Temperature sensor parameter A (slope). */
|
||||||
|
#define FSL_FEATURE_LPADC_TEMP_PARAMETER_A (744.6f)
|
||||||
|
/* @brief Temperature sensor parameter B (offset). */
|
||||||
|
#define FSL_FEATURE_LPADC_TEMP_PARAMETER_B (313.7f)
|
||||||
|
/* @brief Temperature sensor parameter Alpha. */
|
||||||
|
#define FSL_FEATURE_LPADC_TEMP_PARAMETER_ALPHA (11.5f)
|
||||||
|
/* @brief the buffer size of temperature sensor. */
|
||||||
|
#define FSL_FEATURE_LPADC_TEMP_SENS_BUFFER_SIZE (4U)
|
||||||
|
|
||||||
|
/* CASPER module features */
|
||||||
|
|
||||||
|
/* @brief Base address of the CASPER dedicated RAM */
|
||||||
|
#define FSL_FEATURE_CASPER_RAM_BASE_ADDRESS (0x04000000)
|
||||||
|
/* @brief SW interleaving of the CASPER dedicated RAM */
|
||||||
|
#define FSL_FEATURE_CASPER_RAM_IS_INTERLEAVED (1)
|
||||||
|
/* @brief CASPER dedicated RAM offset */
|
||||||
|
#define FSL_FEATURE_CASPER_RAM_OFFSET (0xE)
|
||||||
|
|
||||||
|
/* CTIMER module features */
|
||||||
|
|
||||||
|
/* No feature definitions */
|
||||||
|
|
||||||
|
/* DMA module features */
|
||||||
|
|
||||||
|
/* @brief Number of channels */
|
||||||
|
#define FSL_FEATURE_DMA_NUMBER_OF_CHANNELS (23)
|
||||||
|
/* @brief Align size of DMA descriptor */
|
||||||
|
#define FSL_FEATURE_DMA_DESCRIPTOR_ALIGN_SIZE (512)
|
||||||
|
/* @brief DMA head link descriptor table align size */
|
||||||
|
#define FSL_FEATURE_DMA_LINK_DESCRIPTOR_ALIGN_SIZE (16U)
|
||||||
|
|
||||||
|
/* FLEXCOMM module features */
|
||||||
|
|
||||||
|
/* @brief FLEXCOMM0 USART INDEX 0 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM0_USART_INDEX (0)
|
||||||
|
/* @brief FLEXCOMM0 SPI INDEX 0 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM0_SPI_INDEX (0)
|
||||||
|
/* @brief FLEXCOMM0 I2C INDEX 0 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM0_I2C_INDEX (0)
|
||||||
|
/* @brief FLEXCOMM0 I2S INDEX 0 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM0_I2S_INDEX (0)
|
||||||
|
/* @brief FLEXCOMM1 USART INDEX 1 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM1_USART_INDEX (1)
|
||||||
|
/* @brief FLEXCOMM1 SPI INDEX 1 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM1_SPI_INDEX (1)
|
||||||
|
/* @brief FLEXCOMM1 I2C INDEX 1 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM1_I2C_INDEX (1)
|
||||||
|
/* @brief FLEXCOMM1 I2S INDEX 1 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM1_I2S_INDEX (1)
|
||||||
|
/* @brief FLEXCOMM2 USART INDEX 2 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM2_USART_INDEX (2)
|
||||||
|
/* @brief FLEXCOMM2 SPI INDEX 2 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM2_SPI_INDEX (2)
|
||||||
|
/* @brief FLEXCOMM2 I2C INDEX 2 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM2_I2C_INDEX (2)
|
||||||
|
/* @brief FLEXCOMM2 I2S INDEX 2 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM2_I2S_INDEX (2)
|
||||||
|
/* @brief FLEXCOMM3 USART INDEX 3 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM3_USART_INDEX (3)
|
||||||
|
/* @brief FLEXCOMM3 SPI INDEX 3 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM3_SPI_INDEX (3)
|
||||||
|
/* @brief FLEXCOMM3 I2C INDEX 3 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM3_I2C_INDEX (3)
|
||||||
|
/* @brief FLEXCOMM3 I2S INDEX 3 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM3_I2S_INDEX (3)
|
||||||
|
/* @brief FLEXCOMM4 USART INDEX 4 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM4_USART_INDEX (4)
|
||||||
|
/* @brief FLEXCOMM4 SPI INDEX 4 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM4_SPI_INDEX (4)
|
||||||
|
/* @brief FLEXCOMM4 I2C INDEX 4 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM4_I2C_INDEX (4)
|
||||||
|
/* @brief FLEXCOMM4 I2S INDEX 4 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM4_I2S_INDEX (4)
|
||||||
|
/* @brief FLEXCOMM5 USART INDEX 5 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM5_USART_INDEX (5)
|
||||||
|
/* @brief FLEXCOMM5 SPI INDEX 5 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM5_SPI_INDEX (5)
|
||||||
|
/* @brief FLEXCOMM5 I2C INDEX 5 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM5_I2C_INDEX (5)
|
||||||
|
/* @brief FLEXCOMM5 I2S INDEX 5 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM5_I2S_INDEX (5)
|
||||||
|
/* @brief FLEXCOMM6 USART INDEX 6 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM6_USART_INDEX (6)
|
||||||
|
/* @brief FLEXCOMM6 SPI INDEX 6 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM6_SPI_INDEX (6)
|
||||||
|
/* @brief FLEXCOMM6 I2C INDEX 6 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM6_I2C_INDEX (6)
|
||||||
|
/* @brief FLEXCOMM6 I2S INDEX 6 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM6_I2S_INDEX (6)
|
||||||
|
/* @brief FLEXCOMM7 USART INDEX 7 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM7_USART_INDEX (7)
|
||||||
|
/* @brief FLEXCOMM7 SPI INDEX 7 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM7_SPI_INDEX (7)
|
||||||
|
/* @brief FLEXCOMM7 I2C INDEX 7 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM7_I2C_INDEX (7)
|
||||||
|
/* @brief FLEXCOMM7 I2S INDEX 7 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM7_I2S_INDEX (7)
|
||||||
|
/* @brief FLEXCOMM8 SPI(HS_SPI) INDEX 8 */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM8_SPI_INDEX (8)
|
||||||
|
/* @brief I2S has DMIC interconnection */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM_INSTANCE_I2S_HAS_DMIC_INTERCONNECTIONn(x) (0)
|
||||||
|
|
||||||
|
/* HASHCRYPT module features */
|
||||||
|
|
||||||
|
/* @brief the address of alias offset */
|
||||||
|
#define FSL_FEATURE_HASHCRYPT_ALIAS_OFFSET (0x00000000)
|
||||||
|
|
||||||
|
/* I2S module features */
|
||||||
|
|
||||||
|
/* @brief I2S support dual channel transfer. */
|
||||||
|
#define FSL_FEATURE_I2S_SUPPORT_SECONDARY_CHANNEL (0)
|
||||||
|
/* @brief I2S has DMIC interconnection */
|
||||||
|
#define FSL_FEATURE_FLEXCOMM_I2S_HAS_DMIC_INTERCONNECTION (0)
|
||||||
|
|
||||||
|
/* IOCON module features */
|
||||||
|
|
||||||
|
/* @brief Func bit field width */
|
||||||
|
#define FSL_FEATURE_IOCON_FUNC_FIELD_WIDTH (4)
|
||||||
|
|
||||||
|
/* MAILBOX module features */
|
||||||
|
|
||||||
|
/* @brief Mailbox side for current core */
|
||||||
|
#define FSL_FEATURE_MAILBOX_SIDE_A (1)
|
||||||
|
|
||||||
|
/* MRT module features */
|
||||||
|
|
||||||
|
/* @brief number of channels. */
|
||||||
|
#define FSL_FEATURE_MRT_NUMBER_OF_CHANNELS (4)
|
||||||
|
|
||||||
|
/* PINT module features */
|
||||||
|
|
||||||
|
/* @brief Number of connected outputs */
|
||||||
|
#define FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS (8)
|
||||||
|
|
||||||
|
/* PLU module features */
|
||||||
|
|
||||||
|
/* @brief Has WAKEINT_CTRL register. */
|
||||||
|
#define FSL_FEATURE_PLU_HAS_WAKEINT_CTRL_REG (1)
|
||||||
|
|
||||||
|
/* PMC module features */
|
||||||
|
|
||||||
|
/* @brief UTICK does not support PD configure. */
|
||||||
|
#define FSL_FEATURE_UTICK_HAS_NO_PDCFG (1)
|
||||||
|
/* @brief WDT OSC does not support PD configure. */
|
||||||
|
#define FSL_FEATURE_WWDT_HAS_NO_PDCFG (1)
|
||||||
|
|
||||||
|
/* POWERLIB module features */
|
||||||
|
|
||||||
|
/* @brief Powerlib API is different with other LPC series devices. */
|
||||||
|
#define FSL_FEATURE_POWERLIB_EXTEND (1)
|
||||||
|
|
||||||
|
/* POWERQUAD module features */
|
||||||
|
|
||||||
|
/* @brief Sine and Cossine fix errata */
|
||||||
|
#define FSL_FEATURE_POWERQUAD_SIN_COS_FIX_ERRATA (1)
|
||||||
|
|
||||||
|
/* PUF module features */
|
||||||
|
|
||||||
|
/* @brief Number of PUF key slots available on device. */
|
||||||
|
#define FSL_FEATURE_PUF_HAS_KEYSLOTS (4)
|
||||||
|
/* @brief the shift status value */
|
||||||
|
#define FSL_FEATURE_PUF_HAS_SHIFT_STATUS (1)
|
||||||
|
|
||||||
|
/* RTC module features */
|
||||||
|
|
||||||
|
/* No feature definitions */
|
||||||
|
|
||||||
|
/* SCT module features */
|
||||||
|
|
||||||
|
/* @brief Number of events */
|
||||||
|
#define FSL_FEATURE_SCT_NUMBER_OF_EVENTS (16)
|
||||||
|
/* @brief Number of states */
|
||||||
|
#define FSL_FEATURE_SCT_NUMBER_OF_STATES (32)
|
||||||
|
/* @brief Number of match capture */
|
||||||
|
#define FSL_FEATURE_SCT_NUMBER_OF_MATCH_CAPTURE (16)
|
||||||
|
/* @brief Number of outputs */
|
||||||
|
#define FSL_FEATURE_SCT_NUMBER_OF_OUTPUTS (10)
|
||||||
|
|
||||||
|
/* SDIF module features */
|
||||||
|
|
||||||
|
/* @brief FIFO depth, every location is a WORD */
|
||||||
|
#define FSL_FEATURE_SDIF_FIFO_DEPTH_64_32BITS (64)
|
||||||
|
/* @brief Max DMA buffer size */
|
||||||
|
#define FSL_FEATURE_SDIF_INTERNAL_DMA_MAX_BUFFER_SIZE (4096)
|
||||||
|
/* @brief Max source clock in HZ */
|
||||||
|
#define FSL_FEATURE_SDIF_MAX_SOURCE_CLOCK (52000000)
|
||||||
|
/* @brief support 2 cards */
|
||||||
|
#define FSL_FEATURE_SDIF_ONE_INSTANCE_SUPPORT_TWO_CARD (1)
|
||||||
|
|
||||||
|
/* SECPINT module features */
|
||||||
|
|
||||||
|
/* @brief Number of connected outputs */
|
||||||
|
#define FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS (2)
|
||||||
|
|
||||||
|
/* SYSCON module features */
|
||||||
|
|
||||||
|
/* @brief Flash page size in bytes */
|
||||||
|
#define FSL_FEATURE_SYSCON_FLASH_PAGE_SIZE_BYTES (512)
|
||||||
|
/* @brief Flash sector size in bytes */
|
||||||
|
#define FSL_FEATURE_SYSCON_FLASH_SECTOR_SIZE_BYTES (32768)
|
||||||
|
/* @brief Flash size in bytes */
|
||||||
|
#define FSL_FEATURE_SYSCON_FLASH_SIZE_BYTES (622592)
|
||||||
|
/* @brief Has Power Down mode */
|
||||||
|
#define FSL_FEATURE_SYSCON_HAS_POWERDOWN_MODE (1)
|
||||||
|
/* @brief CCM_ANALOG availability on the SoC. */
|
||||||
|
#define FSL_FEATURE_SOC_CCM_ANALOG_COUNT (1)
|
||||||
|
/* @brief Starter register discontinuous. */
|
||||||
|
#define FSL_FEATURE_SYSCON_STARTER_DISCONTINUOUS (1)
|
||||||
|
|
||||||
|
/* SYSCTL1 module features */
|
||||||
|
|
||||||
|
/* No feature definitions */
|
||||||
|
|
||||||
|
/* USB module features */
|
||||||
|
|
||||||
|
/* @brief Size of the USB dedicated RAM */
|
||||||
|
#define FSL_FEATURE_USB_USB_RAM (0x00004000)
|
||||||
|
/* @brief Base address of the USB dedicated RAM */
|
||||||
|
#define FSL_FEATURE_USB_USB_RAM_BASE_ADDRESS (0x40100000)
|
||||||
|
/* @brief USB version */
|
||||||
|
#define FSL_FEATURE_USB_VERSION (200)
|
||||||
|
/* @brief Number of the endpoint in USB FS */
|
||||||
|
#define FSL_FEATURE_USB_EP_NUM (5)
|
||||||
|
|
||||||
|
/* USBFSH module features */
|
||||||
|
|
||||||
|
/* @brief Size of the USB dedicated RAM */
|
||||||
|
#define FSL_FEATURE_USBFSH_USB_RAM (0x00004000)
|
||||||
|
/* @brief Base address of the USB dedicated RAM */
|
||||||
|
#define FSL_FEATURE_USBFSH_USB_RAM_BASE_ADDRESS (0x40100000)
|
||||||
|
/* @brief USBFSH version */
|
||||||
|
#define FSL_FEATURE_USBFSH_VERSION (200)
|
||||||
|
|
||||||
|
/* USBHSD module features */
|
||||||
|
|
||||||
|
/* @brief Size of the USB dedicated RAM */
|
||||||
|
#define FSL_FEATURE_USBHSD_USB_RAM (0x00004000)
|
||||||
|
/* @brief Base address of the USB dedicated RAM */
|
||||||
|
#define FSL_FEATURE_USBHSD_USB_RAM_BASE_ADDRESS (0x40100000)
|
||||||
|
/* @brief USBHSD version */
|
||||||
|
#define FSL_FEATURE_USBHSD_VERSION (300)
|
||||||
|
/* @brief Number of the endpoint in USB HS */
|
||||||
|
#define FSL_FEATURE_USBHSD_EP_NUM (6)
|
||||||
|
|
||||||
|
/* USBHSH module features */
|
||||||
|
|
||||||
|
/* @brief Size of the USB dedicated RAM */
|
||||||
|
#define FSL_FEATURE_USBHSH_USB_RAM (0x00004000)
|
||||||
|
/* @brief Base address of the USB dedicated RAM */
|
||||||
|
#define FSL_FEATURE_USBHSH_USB_RAM_BASE_ADDRESS (0x40100000)
|
||||||
|
/* @brief USBHSH version */
|
||||||
|
#define FSL_FEATURE_USBHSH_VERSION (300)
|
||||||
|
|
||||||
|
/* USBPHY module features */
|
||||||
|
|
||||||
|
/* @brief Size of the USB dedicated RAM */
|
||||||
|
#define FSL_FEATURE_USBPHY_USB_RAM (0x00004000)
|
||||||
|
/* @brief Base address of the USB dedicated RAM */
|
||||||
|
#define FSL_FEATURE_USBPHY_USB_RAM_BASE_ADDRESS (0x40100000)
|
||||||
|
/* @brief USBHSD version */
|
||||||
|
#define FSL_FEATURE_USBPHY_VERSION (300)
|
||||||
|
/* @brief Number of the endpoint in USB HS */
|
||||||
|
#define FSL_FEATURE_USBPHY_EP_NUM (6)
|
||||||
|
|
||||||
|
/* WWDT module features */
|
||||||
|
|
||||||
|
/* @brief Has no RESET register. */
|
||||||
|
#define FSL_FEATURE_WWDT_HAS_NO_RESET (1)
|
||||||
|
/* @brief WWDT does not support oscillator lock. */
|
||||||
|
#define FSL_FEATURE_WWDT_HAS_NO_OSCILLATOR_LOCK (1)
|
||||||
|
|
||||||
|
#endif /* _LPC55S69_cm33_core0_FEATURES_H_ */
|
||||||
|
|
||||||
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2014-2016 Freescale Semiconductor, Inc.
|
||||||
|
* Copyright 2016-2019 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __FSL_DEVICE_REGISTERS_H__
|
||||||
|
#define __FSL_DEVICE_REGISTERS_H__
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Include the cpu specific register header files.
|
||||||
|
*
|
||||||
|
* The CPU macro should be declared in the project or makefile.
|
||||||
|
*/
|
||||||
|
#if (defined(CPU_LPC55S69JBD100_cm33_core0) || defined(CPU_LPC55S69JBD64_cm33_core0) || \
|
||||||
|
defined(CPU_LPC55S69JEV98_cm33_core0))
|
||||||
|
|
||||||
|
#define LPC55S69_cm33_core0_SERIES
|
||||||
|
|
||||||
|
/* CMSIS-style register definitions */
|
||||||
|
#include "LPC55S69_cm33_core0.h"
|
||||||
|
/* CPU specific feature definitions */
|
||||||
|
#include "LPC55S69_cm33_core0_features.h"
|
||||||
|
|
||||||
|
#elif (defined(CPU_LPC55S69JBD100_cm33_core1) || defined(CPU_LPC55S69JBD64_cm33_core1) || \
|
||||||
|
defined(CPU_LPC55S69JEV98_cm33_core1))
|
||||||
|
|
||||||
|
#define LPC55S69_cm33_core1_SERIES
|
||||||
|
|
||||||
|
/* CMSIS-style register definitions */
|
||||||
|
#include "LPC55S69_cm33_core1.h"
|
||||||
|
/* CPU specific feature definitions */
|
||||||
|
#include "LPC55S69_cm33_core1_features.h"
|
||||||
|
|
||||||
|
#else
|
||||||
|
#error "No valid CPU defined!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __FSL_DEVICE_REGISTERS_H__ */
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* EOF
|
||||||
|
******************************************************************************/
|
||||||
|
|
@ -0,0 +1,379 @@
|
||||||
|
/*
|
||||||
|
** ###################################################################
|
||||||
|
** Processors: LPC55S69JBD100_cm33_core0
|
||||||
|
** LPC55S69JBD64_cm33_core0
|
||||||
|
** LPC55S69JEV98_cm33_core0
|
||||||
|
**
|
||||||
|
** Compilers: GNU C Compiler
|
||||||
|
** IAR ANSI C/C++ Compiler for ARM
|
||||||
|
** Keil ARM C/C++ Compiler
|
||||||
|
** MCUXpresso Compiler
|
||||||
|
**
|
||||||
|
** Reference manual: LPC55S6x/LPC55S2x/LPC552x User manual(UM11126) Rev.1.3 16 May 2019
|
||||||
|
** Version: rev. 1.1, 2019-05-16
|
||||||
|
** Build: b200418
|
||||||
|
**
|
||||||
|
** Abstract:
|
||||||
|
** Provides a system configuration function and a global variable that
|
||||||
|
** contains the system frequency. It configures the device and initializes
|
||||||
|
** the oscillator (PLL) that is part of the microcontroller device.
|
||||||
|
**
|
||||||
|
** Copyright 2016 Freescale Semiconductor, Inc.
|
||||||
|
** Copyright 2016-2020 NXP
|
||||||
|
** All rights reserved.
|
||||||
|
**
|
||||||
|
** SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
**
|
||||||
|
** http: www.nxp.com
|
||||||
|
** mail: support@nxp.com
|
||||||
|
**
|
||||||
|
** Revisions:
|
||||||
|
** - rev. 1.0 (2018-08-22)
|
||||||
|
** Initial version based on v0.2UM
|
||||||
|
** - rev. 1.1 (2019-05-16)
|
||||||
|
** Initial A1 version based on v1.3UM
|
||||||
|
**
|
||||||
|
** ###################################################################
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @file LPC55S69_cm33_core0
|
||||||
|
* @version 1.1
|
||||||
|
* @date 2019-05-16
|
||||||
|
* @brief Device specific configuration file for LPC55S69_cm33_core0
|
||||||
|
* (implementation file)
|
||||||
|
*
|
||||||
|
* Provides a system configuration function and a global variable that contains
|
||||||
|
* the system frequency. It configures the device and initializes the oscillator
|
||||||
|
* (PLL) that is part of the microcontroller device.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "fsl_device_registers.h"
|
||||||
|
|
||||||
|
/* PLL0 SSCG control1 */
|
||||||
|
#define PLL_SSCG_MD_FRACT_P 0U
|
||||||
|
#define PLL_SSCG_MD_INT_P 25U
|
||||||
|
#define PLL_SSCG_MD_FRACT_M (0x1FFFFFFUL << PLL_SSCG_MD_FRACT_P)
|
||||||
|
#define PLL_SSCG_MD_INT_M ((uint64_t)0xFFUL << PLL_SSCG_MD_INT_P)
|
||||||
|
|
||||||
|
/* Get predivider (N) from PLL0 NDEC setting */
|
||||||
|
static uint32_t findPll0PreDiv(void)
|
||||||
|
{
|
||||||
|
uint32_t preDiv = 1UL;
|
||||||
|
|
||||||
|
/* Direct input is not used? */
|
||||||
|
if ((SYSCON->PLL0CTRL & SYSCON_PLL0CTRL_BYPASSPREDIV_MASK) == 0UL)
|
||||||
|
{
|
||||||
|
preDiv = SYSCON->PLL0NDEC & SYSCON_PLL0NDEC_NDIV_MASK;
|
||||||
|
if (preDiv == 0UL)
|
||||||
|
{
|
||||||
|
preDiv = 1UL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return preDiv;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get postdivider (P) from PLL0 PDEC setting */
|
||||||
|
static uint32_t findPll0PostDiv(void)
|
||||||
|
{
|
||||||
|
uint32_t postDiv = 1;
|
||||||
|
|
||||||
|
if ((SYSCON->PLL0CTRL & SYSCON_PLL0CTRL_BYPASSPOSTDIV_MASK) == 0UL)
|
||||||
|
{
|
||||||
|
if ((SYSCON->PLL0CTRL & SYSCON_PLL0CTRL_BYPASSPOSTDIV2_MASK) != 0UL)
|
||||||
|
{
|
||||||
|
postDiv = SYSCON->PLL0PDEC & SYSCON_PLL0PDEC_PDIV_MASK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
postDiv = 2UL * (SYSCON->PLL0PDEC & SYSCON_PLL0PDEC_PDIV_MASK);
|
||||||
|
}
|
||||||
|
if (postDiv == 0UL)
|
||||||
|
{
|
||||||
|
postDiv = 2UL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return postDiv;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get multiplier (M) from PLL0 SSCG and SEL_EXT settings */
|
||||||
|
static float findPll0MMult(void)
|
||||||
|
{
|
||||||
|
float mMult = 1.0F;
|
||||||
|
float mMult_fract;
|
||||||
|
uint32_t mMult_int;
|
||||||
|
|
||||||
|
if ((SYSCON->PLL0SSCG1 & SYSCON_PLL0SSCG1_SEL_EXT_MASK) != 0UL)
|
||||||
|
{
|
||||||
|
mMult = (float)(uint32_t)((SYSCON->PLL0SSCG1 & SYSCON_PLL0SSCG1_MDIV_EXT_MASK) >> SYSCON_PLL0SSCG1_MDIV_EXT_SHIFT);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mMult_int = ((SYSCON->PLL0SSCG1 & SYSCON_PLL0SSCG1_MD_MBS_MASK) << 7U);
|
||||||
|
mMult_int = mMult_int | ((SYSCON->PLL0SSCG0) >> PLL_SSCG_MD_INT_P);
|
||||||
|
mMult_fract = ((float)(uint32_t)((SYSCON->PLL0SSCG0) & PLL_SSCG_MD_FRACT_M) /
|
||||||
|
(float)(uint32_t)(1UL << PLL_SSCG_MD_INT_P));
|
||||||
|
mMult = (float)mMult_int + mMult_fract;
|
||||||
|
}
|
||||||
|
if (mMult == 0.0F)
|
||||||
|
{
|
||||||
|
mMult = 1.0F;
|
||||||
|
}
|
||||||
|
return mMult;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get predivider (N) from PLL1 NDEC setting */
|
||||||
|
static uint32_t findPll1PreDiv(void)
|
||||||
|
{
|
||||||
|
uint32_t preDiv = 1UL;
|
||||||
|
|
||||||
|
/* Direct input is not used? */
|
||||||
|
if ((SYSCON->PLL1CTRL & SYSCON_PLL1CTRL_BYPASSPREDIV_MASK) == 0UL)
|
||||||
|
{
|
||||||
|
preDiv = SYSCON->PLL1NDEC & SYSCON_PLL1NDEC_NDIV_MASK;
|
||||||
|
if (preDiv == 0UL)
|
||||||
|
{
|
||||||
|
preDiv = 1UL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return preDiv;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get postdivider (P) from PLL1 PDEC setting */
|
||||||
|
static uint32_t findPll1PostDiv(void)
|
||||||
|
{
|
||||||
|
uint32_t postDiv = 1UL;
|
||||||
|
|
||||||
|
if ((SYSCON->PLL1CTRL & SYSCON_PLL1CTRL_BYPASSPOSTDIV_MASK) == 0UL)
|
||||||
|
{
|
||||||
|
if ((SYSCON->PLL1CTRL & SYSCON_PLL1CTRL_BYPASSPOSTDIV2_MASK) != 0UL)
|
||||||
|
{
|
||||||
|
postDiv = SYSCON->PLL1PDEC & SYSCON_PLL1PDEC_PDIV_MASK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
postDiv = 2UL * (SYSCON->PLL1PDEC & SYSCON_PLL1PDEC_PDIV_MASK);
|
||||||
|
}
|
||||||
|
if (postDiv == 0UL)
|
||||||
|
{
|
||||||
|
postDiv = 2UL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return postDiv;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get multiplier (M) from PLL1 MDEC settings */
|
||||||
|
static uint32_t findPll1MMult(void)
|
||||||
|
{
|
||||||
|
uint32_t mMult = 1UL;
|
||||||
|
|
||||||
|
mMult = SYSCON->PLL1MDEC & SYSCON_PLL1MDEC_MDIV_MASK;
|
||||||
|
|
||||||
|
if (mMult == 0UL)
|
||||||
|
{
|
||||||
|
mMult = 1UL;
|
||||||
|
}
|
||||||
|
return mMult;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get FRO 12M Clk */
|
||||||
|
/*! brief Return Frequency of FRO 12MHz
|
||||||
|
* return Frequency of FRO 12MHz
|
||||||
|
*/
|
||||||
|
static uint32_t GetFro12MFreq(void)
|
||||||
|
{
|
||||||
|
return ((ANACTRL->FRO192M_CTRL & ANACTRL_FRO192M_CTRL_ENA_12MHZCLK_MASK) != 0UL) ? 12000000U : 0U;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get FRO 1M Clk */
|
||||||
|
/*! brief Return Frequency of FRO 1MHz
|
||||||
|
* return Frequency of FRO 1MHz
|
||||||
|
*/
|
||||||
|
static uint32_t GetFro1MFreq(void)
|
||||||
|
{
|
||||||
|
return ((SYSCON->CLOCK_CTRL & SYSCON_CLOCK_CTRL_FRO1MHZ_CLK_ENA_MASK) != 0UL) ? 1000000U : 0U;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get EXT OSC Clk */
|
||||||
|
/*! brief Return Frequency of External Clock
|
||||||
|
* return Frequency of External Clock. If no external clock is used returns 0.
|
||||||
|
*/
|
||||||
|
static uint32_t GetExtClkFreq(void)
|
||||||
|
{
|
||||||
|
return ((ANACTRL->XO32M_CTRL & ANACTRL_XO32M_CTRL_ENABLE_SYSTEM_CLK_OUT_MASK) != 0UL) ? CLK_CLK_IN : 0U;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get HF FRO Clk */
|
||||||
|
/*! brief Return Frequency of High-Freq output of FRO
|
||||||
|
* return Frequency of High-Freq output of FRO
|
||||||
|
*/
|
||||||
|
static uint32_t GetFroHfFreq(void)
|
||||||
|
{
|
||||||
|
return ((ANACTRL->FRO192M_CTRL & ANACTRL_FRO192M_CTRL_ENA_96MHZCLK_MASK) != 0UL) ? 96000000U : 0U;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get RTC OSC Clk */
|
||||||
|
/*! brief Return Frequency of 32kHz osc
|
||||||
|
* return Frequency of 32kHz osc
|
||||||
|
*/
|
||||||
|
static uint32_t GetOsc32KFreq(void)
|
||||||
|
{
|
||||||
|
return ((0UL == (PMC->PDRUNCFG0 & PMC_PDRUNCFG0_PDEN_FRO32K_MASK)) && (0UL == (PMC->RTCOSC32K & PMC_RTCOSC32K_SEL_MASK))) ?
|
||||||
|
CLK_RTC_32K_CLK :
|
||||||
|
((0UL == (PMC->PDRUNCFG0 & PMC_PDRUNCFG0_PDEN_XTAL32K_MASK)) && ((PMC->RTCOSC32K & PMC_RTCOSC32K_SEL_MASK) != 0UL)) ?
|
||||||
|
CLK_RTC_32K_CLK :
|
||||||
|
0U;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
-- Core clock
|
||||||
|
---------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
uint32_t SystemCoreClock = DEFAULT_SYSTEM_CLOCK;
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
-- SystemInit()
|
||||||
|
---------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
__attribute__((weak)) void SystemInit (void) {
|
||||||
|
#if ((__FPU_PRESENT == 1) && (__FPU_USED == 1))
|
||||||
|
SCB->CPACR |= ((3UL << 10*2) | (3UL << 11*2)); /* set CP10, CP11 Full Access in Secure mode */
|
||||||
|
#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
|
||||||
|
SCB_NS->CPACR |= ((3UL << 10*2) | (3UL << 11*2)); /* set CP10, CP11 Full Access in Non-secure mode */
|
||||||
|
#endif /* (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */
|
||||||
|
#endif /* ((__FPU_PRESENT == 1) && (__FPU_USED == 1)) */
|
||||||
|
|
||||||
|
SCB->CPACR |= ((3UL << 0*2) | (3UL << 1*2)); /* set CP0, CP1 Full Access in Secure mode (enable PowerQuad) */
|
||||||
|
#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
|
||||||
|
SCB_NS->CPACR |= ((3UL << 0*2) | (3UL << 1*2)); /* set CP0, CP1 Full Access in Normal mode (enable PowerQuad) */
|
||||||
|
#endif /* (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */
|
||||||
|
|
||||||
|
SCB->NSACR |= ((3UL << 0) | (3UL << 10)); /* enable CP0, CP1, CP10, CP11 Non-secure Access */
|
||||||
|
|
||||||
|
#if defined(__MCUXPRESSO)
|
||||||
|
extern void(*const g_pfnVectors[]) (void);
|
||||||
|
SCB->VTOR = (uint32_t) &g_pfnVectors;
|
||||||
|
#else
|
||||||
|
extern void *__Vectors;
|
||||||
|
SCB->VTOR = (uint32_t) &__Vectors;
|
||||||
|
#endif
|
||||||
|
SYSCON->TRACECLKDIV = 0;
|
||||||
|
/* Optionally enable RAM banks that may be off by default at reset */
|
||||||
|
#if !defined(DONT_ENABLE_DISABLED_RAMBANKS)
|
||||||
|
SYSCON->AHBCLKCTRLSET[0] = SYSCON_AHBCLKCTRL0_SRAM_CTRL1_MASK | SYSCON_AHBCLKCTRL0_SRAM_CTRL2_MASK
|
||||||
|
| SYSCON_AHBCLKCTRL0_SRAM_CTRL3_MASK | SYSCON_AHBCLKCTRL0_SRAM_CTRL4_MASK;
|
||||||
|
#endif
|
||||||
|
SystemInitHook();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
-- SystemCoreClockUpdate()
|
||||||
|
---------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void SystemCoreClockUpdate (void) {
|
||||||
|
uint32_t clkRate = 0;
|
||||||
|
uint32_t prediv, postdiv;
|
||||||
|
uint64_t workRate;
|
||||||
|
uint64_t workRate1;
|
||||||
|
|
||||||
|
switch (SYSCON->MAINCLKSELB & SYSCON_MAINCLKSELB_SEL_MASK)
|
||||||
|
{
|
||||||
|
case 0x00: /* MAINCLKSELA clock (main_clk_a)*/
|
||||||
|
switch (SYSCON->MAINCLKSELA & SYSCON_MAINCLKSELA_SEL_MASK)
|
||||||
|
{
|
||||||
|
case 0x00: /* FRO 12 MHz (fro_12m) */
|
||||||
|
clkRate = GetFro12MFreq();
|
||||||
|
break;
|
||||||
|
case 0x01: /* CLKIN (clk_in) */
|
||||||
|
clkRate = GetExtClkFreq();
|
||||||
|
break;
|
||||||
|
case 0x02: /* Fro 1MHz (fro_1m) */
|
||||||
|
clkRate = GetFro1MFreq();
|
||||||
|
break;
|
||||||
|
default: /* = 0x03 = FRO 96 MHz (fro_hf) */
|
||||||
|
clkRate = GetFroHfFreq();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0x01: /* PLL0 clock (pll0_clk)*/
|
||||||
|
switch (SYSCON->PLL0CLKSEL & SYSCON_PLL0CLKSEL_SEL_MASK)
|
||||||
|
{
|
||||||
|
case 0x00: /* FRO 12 MHz (fro_12m) */
|
||||||
|
clkRate = GetFro12MFreq();
|
||||||
|
break;
|
||||||
|
case 0x01: /* CLKIN (clk_in) */
|
||||||
|
clkRate = GetExtClkFreq();
|
||||||
|
break;
|
||||||
|
case 0x02: /* Fro 1MHz (fro_1m) */
|
||||||
|
clkRate = GetFro1MFreq();
|
||||||
|
break;
|
||||||
|
case 0x03: /* RTC oscillator 32 kHz output (32k_clk) */
|
||||||
|
clkRate = GetOsc32KFreq();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
clkRate = 0UL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (((SYSCON->PLL0CTRL & SYSCON_PLL0CTRL_BYPASSPLL_MASK) == 0UL) && ((SYSCON->PLL0CTRL & SYSCON_PLL0CTRL_CLKEN_MASK) != 0UL) && ((PMC->PDRUNCFG0 & PMC_PDRUNCFG0_PDEN_PLL0_MASK) == 0UL) && ((PMC->PDRUNCFG0 & PMC_PDRUNCFG0_PDEN_PLL0_SSCG_MASK) == 0UL))
|
||||||
|
{
|
||||||
|
prediv = findPll0PreDiv();
|
||||||
|
postdiv = findPll0PostDiv();
|
||||||
|
/* Adjust input clock */
|
||||||
|
clkRate = clkRate / prediv;
|
||||||
|
/* MDEC used for rate */
|
||||||
|
workRate = (uint64_t)clkRate * (uint64_t)findPll0MMult();
|
||||||
|
clkRate = (uint32_t)(workRate / ((uint64_t)postdiv));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0x02: /* PLL1 clock (pll1_clk)*/
|
||||||
|
switch (SYSCON->PLL1CLKSEL & SYSCON_PLL1CLKSEL_SEL_MASK)
|
||||||
|
{
|
||||||
|
case 0x00: /* FRO 12 MHz (fro_12m) */
|
||||||
|
clkRate = GetFro12MFreq();
|
||||||
|
break;
|
||||||
|
case 0x01: /* CLKIN (clk_in) */
|
||||||
|
clkRate = GetExtClkFreq();
|
||||||
|
break;
|
||||||
|
case 0x02: /* Fro 1MHz (fro_1m) */
|
||||||
|
clkRate = GetFro1MFreq();
|
||||||
|
break;
|
||||||
|
case 0x03: /* RTC oscillator 32 kHz output (32k_clk) */
|
||||||
|
clkRate = GetOsc32KFreq();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
clkRate = 0UL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (((SYSCON->PLL1CTRL & SYSCON_PLL1CTRL_BYPASSPLL_MASK) == 0UL) && ((SYSCON->PLL1CTRL & SYSCON_PLL1CTRL_CLKEN_MASK) != 0UL) && ((PMC->PDRUNCFG0 & PMC_PDRUNCFG0_PDEN_PLL1_MASK) == 0UL))
|
||||||
|
{
|
||||||
|
/* PLL is not in bypass mode, get pre-divider, post-divider, and M divider */
|
||||||
|
prediv = findPll1PreDiv();
|
||||||
|
postdiv = findPll1PostDiv();
|
||||||
|
/* Adjust input clock */
|
||||||
|
clkRate = clkRate / prediv;
|
||||||
|
|
||||||
|
/* MDEC used for rate */
|
||||||
|
workRate1 = (uint64_t)clkRate * (uint64_t)findPll1MMult();
|
||||||
|
clkRate = (uint32_t)(workRate1 / ((uint64_t)postdiv));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0x03: /* RTC oscillator 32 kHz output (32k_clk) */
|
||||||
|
clkRate = GetOsc32KFreq();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
clkRate = 0UL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
SystemCoreClock = clkRate / ((SYSCON->AHBCLKDIV & 0xFFUL) + 1UL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
-- SystemInitHook()
|
||||||
|
---------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
__attribute__ ((weak)) void SystemInitHook (void) {
|
||||||
|
/* Void implementation of the weak function. */
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,113 @@
|
||||||
|
/*
|
||||||
|
** ###################################################################
|
||||||
|
** Processors: LPC55S69JBD100_cm33_core0
|
||||||
|
** LPC55S69JBD64_cm33_core0
|
||||||
|
** LPC55S69JEV98_cm33_core0
|
||||||
|
**
|
||||||
|
** Compilers: GNU C Compiler
|
||||||
|
** IAR ANSI C/C++ Compiler for ARM
|
||||||
|
** Keil ARM C/C++ Compiler
|
||||||
|
** MCUXpresso Compiler
|
||||||
|
**
|
||||||
|
** Reference manual: LPC55S6x/LPC55S2x/LPC552x User manual(UM11126) Rev.1.3 16 May 2019
|
||||||
|
** Version: rev. 1.1, 2019-05-16
|
||||||
|
** Build: b200418
|
||||||
|
**
|
||||||
|
** Abstract:
|
||||||
|
** Provides a system configuration function and a global variable that
|
||||||
|
** contains the system frequency. It configures the device and initializes
|
||||||
|
** the oscillator (PLL) that is part of the microcontroller device.
|
||||||
|
**
|
||||||
|
** Copyright 2016 Freescale Semiconductor, Inc.
|
||||||
|
** Copyright 2016-2020 NXP
|
||||||
|
** All rights reserved.
|
||||||
|
**
|
||||||
|
** SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
**
|
||||||
|
** http: www.nxp.com
|
||||||
|
** mail: support@nxp.com
|
||||||
|
**
|
||||||
|
** Revisions:
|
||||||
|
** - rev. 1.0 (2018-08-22)
|
||||||
|
** Initial version based on v0.2UM
|
||||||
|
** - rev. 1.1 (2019-05-16)
|
||||||
|
** Initial A1 version based on v1.3UM
|
||||||
|
**
|
||||||
|
** ###################################################################
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @file LPC55S69_cm33_core0
|
||||||
|
* @version 1.1
|
||||||
|
* @date 2019-05-16
|
||||||
|
* @brief Device specific configuration file for LPC55S69_cm33_core0 (header
|
||||||
|
* file)
|
||||||
|
*
|
||||||
|
* Provides a system configuration function and a global variable that contains
|
||||||
|
* the system frequency. It configures the device and initializes the oscillator
|
||||||
|
* (PLL) that is part of the microcontroller device.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _SYSTEM_LPC55S69_cm33_core0_H_
|
||||||
|
#define _SYSTEM_LPC55S69_cm33_core0_H_ /**< Symbol preventing repeated inclusion */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define DEFAULT_SYSTEM_CLOCK 12000000u /* Default System clock value */
|
||||||
|
#define CLK_RTC_32K_CLK 32768u /* RTC oscillator 32 kHz output (32k_clk */
|
||||||
|
#define CLK_FRO_12MHZ 12000000u /* FRO 12 MHz (fro_12m) */
|
||||||
|
#define CLK_FRO_48MHZ 48000000u /* FRO 48 MHz (fro_48m) */
|
||||||
|
#define CLK_FRO_96MHZ 96000000u /* FRO 96 MHz (fro_96m) */
|
||||||
|
#define CLK_CLK_IN 16000000u /* Default CLK_IN pin clock */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief System clock frequency (core clock)
|
||||||
|
*
|
||||||
|
* The system clock frequency supplied to the SysTick timer and the processor
|
||||||
|
* core clock. This variable can be used by the user application to setup the
|
||||||
|
* SysTick timer or configure other parameters. It may also be used by debugger to
|
||||||
|
* query the frequency of the debug timer or configure the trace clock speed
|
||||||
|
* SystemCoreClock is initialized with a correct predefined value.
|
||||||
|
*/
|
||||||
|
extern uint32_t SystemCoreClock;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Setup the microcontroller system.
|
||||||
|
*
|
||||||
|
* Typically this function configures the oscillator (PLL) that is part of the
|
||||||
|
* microcontroller device. For systems with variable clock speed it also updates
|
||||||
|
* the variable SystemCoreClock. SystemInit is called from startup_device file.
|
||||||
|
*/
|
||||||
|
void SystemInit (void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Updates the SystemCoreClock variable.
|
||||||
|
*
|
||||||
|
* It must be called whenever the core clock is changed during program
|
||||||
|
* execution. SystemCoreClockUpdate() evaluates the clock register settings and calculates
|
||||||
|
* the current core clock.
|
||||||
|
*/
|
||||||
|
void SystemCoreClockUpdate (void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SystemInit function hook.
|
||||||
|
*
|
||||||
|
* This weak function allows to call specific initialization code during the
|
||||||
|
* SystemInit() execution.This can be used when an application specific code needs
|
||||||
|
* to be called as close to the reset entry as possible (for example the Multicore
|
||||||
|
* Manager MCMGR_EarlyInit() function call).
|
||||||
|
* NOTE: No global r/w variables can be used in this hook function because the
|
||||||
|
* initialization of these variables happens after this function.
|
||||||
|
*/
|
||||||
|
void SystemInitHook (void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _SYSTEM_LPC55S69_cm33_core0_H_ */
|
||||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,83 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2015-2016, Freescale Semiconductor, Inc.
|
||||||
|
* Copyright 2016-2021 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
|
||||||
|
#define SDK_MEM_MAGIC_NUMBER 12345U
|
||||||
|
|
||||||
|
typedef struct _mem_align_control_block
|
||||||
|
{
|
||||||
|
uint16_t identifier; /*!< Identifier for the memory control block. */
|
||||||
|
uint16_t offset; /*!< offset from aligned address to real address */
|
||||||
|
} mem_align_cb_t;
|
||||||
|
|
||||||
|
/* Component ID definition, used by tools. */
|
||||||
|
#ifndef FSL_COMPONENT_ID
|
||||||
|
#define FSL_COMPONENT_ID "platform.drivers.common"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void *SDK_Malloc(size_t size, size_t alignbytes)
|
||||||
|
{
|
||||||
|
mem_align_cb_t *p_cb = NULL;
|
||||||
|
uint32_t alignedsize;
|
||||||
|
|
||||||
|
/* Check overflow. */
|
||||||
|
alignedsize = SDK_SIZEALIGN(size, alignbytes);
|
||||||
|
if (alignedsize < size)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (alignedsize > SIZE_MAX - alignbytes - sizeof(mem_align_cb_t))
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
alignedsize += alignbytes + sizeof(mem_align_cb_t);
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
void *pointer_value;
|
||||||
|
uint32_t unsigned_value;
|
||||||
|
} p_align_addr, p_addr;
|
||||||
|
|
||||||
|
p_addr.pointer_value = malloc(alignedsize);
|
||||||
|
|
||||||
|
if (p_addr.pointer_value == NULL)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
p_align_addr.unsigned_value = SDK_SIZEALIGN(p_addr.unsigned_value + sizeof(mem_align_cb_t), alignbytes);
|
||||||
|
|
||||||
|
p_cb = (mem_align_cb_t *)(p_align_addr.unsigned_value - 4U);
|
||||||
|
p_cb->identifier = SDK_MEM_MAGIC_NUMBER;
|
||||||
|
p_cb->offset = (uint16_t)(p_align_addr.unsigned_value - p_addr.unsigned_value);
|
||||||
|
|
||||||
|
return p_align_addr.pointer_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDK_Free(void *ptr)
|
||||||
|
{
|
||||||
|
union
|
||||||
|
{
|
||||||
|
void *pointer_value;
|
||||||
|
uint32_t unsigned_value;
|
||||||
|
} p_free;
|
||||||
|
p_free.pointer_value = ptr;
|
||||||
|
mem_align_cb_t *p_cb = (mem_align_cb_t *)(p_free.unsigned_value - 4U);
|
||||||
|
|
||||||
|
if (p_cb->identifier != SDK_MEM_MAGIC_NUMBER)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
p_free.unsigned_value = p_free.unsigned_value - p_cb->offset;
|
||||||
|
|
||||||
|
free(p_free.pointer_value);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,292 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2015-2016, Freescale Semiconductor, Inc.
|
||||||
|
* Copyright 2016-2021 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _FSL_COMMON_H_
|
||||||
|
#define _FSL_COMMON_H_
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#if defined(__ICCARM__) || (defined(__CC_ARM) || defined(__ARMCC_VERSION)) || defined(__GNUC__)
|
||||||
|
#include <stddef.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "fsl_device_registers.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @addtogroup ksdk_common
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Configurations
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/*! @brief Macro to use the default weak IRQ handler in drivers. */
|
||||||
|
#ifndef FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ
|
||||||
|
#define FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/*! @brief Construct a status code value from a group and code number. */
|
||||||
|
#define MAKE_STATUS(group, code) ((((group)*100) + (code)))
|
||||||
|
|
||||||
|
/*! @brief Construct the version number for drivers. */
|
||||||
|
#define MAKE_VERSION(major, minor, bugfix) (((major) << 16) | ((minor) << 8) | (bugfix))
|
||||||
|
|
||||||
|
/*! @name Driver version */
|
||||||
|
/*@{*/
|
||||||
|
/*! @brief common driver version. */
|
||||||
|
#define FSL_COMMON_DRIVER_VERSION (MAKE_VERSION(2, 3, 0))
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
/* Debug console type definition. */
|
||||||
|
#define DEBUG_CONSOLE_DEVICE_TYPE_NONE 0U /*!< No debug console. */
|
||||||
|
#define DEBUG_CONSOLE_DEVICE_TYPE_UART 1U /*!< Debug console based on UART. */
|
||||||
|
#define DEBUG_CONSOLE_DEVICE_TYPE_LPUART 2U /*!< Debug console based on LPUART. */
|
||||||
|
#define DEBUG_CONSOLE_DEVICE_TYPE_LPSCI 3U /*!< Debug console based on LPSCI. */
|
||||||
|
#define DEBUG_CONSOLE_DEVICE_TYPE_USBCDC 4U /*!< Debug console based on USBCDC. */
|
||||||
|
#define DEBUG_CONSOLE_DEVICE_TYPE_FLEXCOMM 5U /*!< Debug console based on FLEXCOMM. */
|
||||||
|
#define DEBUG_CONSOLE_DEVICE_TYPE_IUART 6U /*!< Debug console based on i.MX UART. */
|
||||||
|
#define DEBUG_CONSOLE_DEVICE_TYPE_VUSART 7U /*!< Debug console based on LPC_VUSART. */
|
||||||
|
#define DEBUG_CONSOLE_DEVICE_TYPE_MINI_USART 8U /*!< Debug console based on LPC_USART. */
|
||||||
|
#define DEBUG_CONSOLE_DEVICE_TYPE_SWO 9U /*!< Debug console based on SWO. */
|
||||||
|
#define DEBUG_CONSOLE_DEVICE_TYPE_QSCI 10U /*!< Debug console based on QSCI. */
|
||||||
|
|
||||||
|
/*! @brief Status group numbers. */
|
||||||
|
enum _status_groups
|
||||||
|
{
|
||||||
|
kStatusGroup_Generic = 0, /*!< Group number for generic status codes. */
|
||||||
|
kStatusGroup_FLASH = 1, /*!< Group number for FLASH status codes. */
|
||||||
|
kStatusGroup_LPSPI = 4, /*!< Group number for LPSPI status codes. */
|
||||||
|
kStatusGroup_FLEXIO_SPI = 5, /*!< Group number for FLEXIO SPI status codes. */
|
||||||
|
kStatusGroup_DSPI = 6, /*!< Group number for DSPI status codes. */
|
||||||
|
kStatusGroup_FLEXIO_UART = 7, /*!< Group number for FLEXIO UART status codes. */
|
||||||
|
kStatusGroup_FLEXIO_I2C = 8, /*!< Group number for FLEXIO I2C status codes. */
|
||||||
|
kStatusGroup_LPI2C = 9, /*!< Group number for LPI2C status codes. */
|
||||||
|
kStatusGroup_UART = 10, /*!< Group number for UART status codes. */
|
||||||
|
kStatusGroup_I2C = 11, /*!< Group number for UART status codes. */
|
||||||
|
kStatusGroup_LPSCI = 12, /*!< Group number for LPSCI status codes. */
|
||||||
|
kStatusGroup_LPUART = 13, /*!< Group number for LPUART status codes. */
|
||||||
|
kStatusGroup_SPI = 14, /*!< Group number for SPI status code.*/
|
||||||
|
kStatusGroup_XRDC = 15, /*!< Group number for XRDC status code.*/
|
||||||
|
kStatusGroup_SEMA42 = 16, /*!< Group number for SEMA42 status code.*/
|
||||||
|
kStatusGroup_SDHC = 17, /*!< Group number for SDHC status code */
|
||||||
|
kStatusGroup_SDMMC = 18, /*!< Group number for SDMMC status code */
|
||||||
|
kStatusGroup_SAI = 19, /*!< Group number for SAI status code */
|
||||||
|
kStatusGroup_MCG = 20, /*!< Group number for MCG status codes. */
|
||||||
|
kStatusGroup_SCG = 21, /*!< Group number for SCG status codes. */
|
||||||
|
kStatusGroup_SDSPI = 22, /*!< Group number for SDSPI status codes. */
|
||||||
|
kStatusGroup_FLEXIO_I2S = 23, /*!< Group number for FLEXIO I2S status codes */
|
||||||
|
kStatusGroup_FLEXIO_MCULCD = 24, /*!< Group number for FLEXIO LCD status codes */
|
||||||
|
kStatusGroup_FLASHIAP = 25, /*!< Group number for FLASHIAP status codes */
|
||||||
|
kStatusGroup_FLEXCOMM_I2C = 26, /*!< Group number for FLEXCOMM I2C status codes */
|
||||||
|
kStatusGroup_I2S = 27, /*!< Group number for I2S status codes */
|
||||||
|
kStatusGroup_IUART = 28, /*!< Group number for IUART status codes */
|
||||||
|
kStatusGroup_CSI = 29, /*!< Group number for CSI status codes */
|
||||||
|
kStatusGroup_MIPI_DSI = 30, /*!< Group number for MIPI DSI status codes */
|
||||||
|
kStatusGroup_SDRAMC = 35, /*!< Group number for SDRAMC status codes. */
|
||||||
|
kStatusGroup_POWER = 39, /*!< Group number for POWER status codes. */
|
||||||
|
kStatusGroup_ENET = 40, /*!< Group number for ENET status codes. */
|
||||||
|
kStatusGroup_PHY = 41, /*!< Group number for PHY status codes. */
|
||||||
|
kStatusGroup_TRGMUX = 42, /*!< Group number for TRGMUX status codes. */
|
||||||
|
kStatusGroup_SMARTCARD = 43, /*!< Group number for SMARTCARD status codes. */
|
||||||
|
kStatusGroup_LMEM = 44, /*!< Group number for LMEM status codes. */
|
||||||
|
kStatusGroup_QSPI = 45, /*!< Group number for QSPI status codes. */
|
||||||
|
kStatusGroup_DMA = 50, /*!< Group number for DMA status codes. */
|
||||||
|
kStatusGroup_EDMA = 51, /*!< Group number for EDMA status codes. */
|
||||||
|
kStatusGroup_DMAMGR = 52, /*!< Group number for DMAMGR status codes. */
|
||||||
|
kStatusGroup_FLEXCAN = 53, /*!< Group number for FlexCAN status codes. */
|
||||||
|
kStatusGroup_LTC = 54, /*!< Group number for LTC status codes. */
|
||||||
|
kStatusGroup_FLEXIO_CAMERA = 55, /*!< Group number for FLEXIO CAMERA status codes. */
|
||||||
|
kStatusGroup_LPC_SPI = 56, /*!< Group number for LPC_SPI status codes. */
|
||||||
|
kStatusGroup_LPC_USART = 57, /*!< Group number for LPC_USART status codes. */
|
||||||
|
kStatusGroup_DMIC = 58, /*!< Group number for DMIC status codes. */
|
||||||
|
kStatusGroup_SDIF = 59, /*!< Group number for SDIF status codes.*/
|
||||||
|
kStatusGroup_SPIFI = 60, /*!< Group number for SPIFI status codes. */
|
||||||
|
kStatusGroup_OTP = 61, /*!< Group number for OTP status codes. */
|
||||||
|
kStatusGroup_MCAN = 62, /*!< Group number for MCAN status codes. */
|
||||||
|
kStatusGroup_CAAM = 63, /*!< Group number for CAAM status codes. */
|
||||||
|
kStatusGroup_ECSPI = 64, /*!< Group number for ECSPI status codes. */
|
||||||
|
kStatusGroup_USDHC = 65, /*!< Group number for USDHC status codes.*/
|
||||||
|
kStatusGroup_LPC_I2C = 66, /*!< Group number for LPC_I2C status codes.*/
|
||||||
|
kStatusGroup_DCP = 67, /*!< Group number for DCP status codes.*/
|
||||||
|
kStatusGroup_MSCAN = 68, /*!< Group number for MSCAN status codes.*/
|
||||||
|
kStatusGroup_ESAI = 69, /*!< Group number for ESAI status codes. */
|
||||||
|
kStatusGroup_FLEXSPI = 70, /*!< Group number for FLEXSPI status codes. */
|
||||||
|
kStatusGroup_MMDC = 71, /*!< Group number for MMDC status codes. */
|
||||||
|
kStatusGroup_PDM = 72, /*!< Group number for MIC status codes. */
|
||||||
|
kStatusGroup_SDMA = 73, /*!< Group number for SDMA status codes. */
|
||||||
|
kStatusGroup_ICS = 74, /*!< Group number for ICS status codes. */
|
||||||
|
kStatusGroup_SPDIF = 75, /*!< Group number for SPDIF status codes. */
|
||||||
|
kStatusGroup_LPC_MINISPI = 76, /*!< Group number for LPC_MINISPI status codes. */
|
||||||
|
kStatusGroup_HASHCRYPT = 77, /*!< Group number for Hashcrypt status codes */
|
||||||
|
kStatusGroup_LPC_SPI_SSP = 78, /*!< Group number for LPC_SPI_SSP status codes. */
|
||||||
|
kStatusGroup_I3C = 79, /*!< Group number for I3C status codes */
|
||||||
|
kStatusGroup_LPC_I2C_1 = 97, /*!< Group number for LPC_I2C_1 status codes. */
|
||||||
|
kStatusGroup_NOTIFIER = 98, /*!< Group number for NOTIFIER status codes. */
|
||||||
|
kStatusGroup_DebugConsole = 99, /*!< Group number for debug console status codes. */
|
||||||
|
kStatusGroup_SEMC = 100, /*!< Group number for SEMC status codes. */
|
||||||
|
kStatusGroup_ApplicationRangeStart = 101, /*!< Starting number for application groups. */
|
||||||
|
kStatusGroup_IAP = 102, /*!< Group number for IAP status codes */
|
||||||
|
kStatusGroup_SFA = 103, /*!< Group number for SFA status codes*/
|
||||||
|
kStatusGroup_SPC = 104, /*!< Group number for SPC status codes. */
|
||||||
|
kStatusGroup_PUF = 105, /*!< Group number for PUF status codes. */
|
||||||
|
kStatusGroup_TOUCH_PANEL = 106, /*!< Group number for touch panel status codes */
|
||||||
|
|
||||||
|
kStatusGroup_HAL_GPIO = 121, /*!< Group number for HAL GPIO status codes. */
|
||||||
|
kStatusGroup_HAL_UART = 122, /*!< Group number for HAL UART status codes. */
|
||||||
|
kStatusGroup_HAL_TIMER = 123, /*!< Group number for HAL TIMER status codes. */
|
||||||
|
kStatusGroup_HAL_SPI = 124, /*!< Group number for HAL SPI status codes. */
|
||||||
|
kStatusGroup_HAL_I2C = 125, /*!< Group number for HAL I2C status codes. */
|
||||||
|
kStatusGroup_HAL_FLASH = 126, /*!< Group number for HAL FLASH status codes. */
|
||||||
|
kStatusGroup_HAL_PWM = 127, /*!< Group number for HAL PWM status codes. */
|
||||||
|
kStatusGroup_HAL_RNG = 128, /*!< Group number for HAL RNG status codes. */
|
||||||
|
kStatusGroup_TIMERMANAGER = 135, /*!< Group number for TiMER MANAGER status codes. */
|
||||||
|
kStatusGroup_SERIALMANAGER = 136, /*!< Group number for SERIAL MANAGER status codes. */
|
||||||
|
kStatusGroup_LED = 137, /*!< Group number for LED status codes. */
|
||||||
|
kStatusGroup_BUTTON = 138, /*!< Group number for BUTTON status codes. */
|
||||||
|
kStatusGroup_EXTERN_EEPROM = 139, /*!< Group number for EXTERN EEPROM status codes. */
|
||||||
|
kStatusGroup_SHELL = 140, /*!< Group number for SHELL status codes. */
|
||||||
|
kStatusGroup_MEM_MANAGER = 141, /*!< Group number for MEM MANAGER status codes. */
|
||||||
|
kStatusGroup_LIST = 142, /*!< Group number for List status codes. */
|
||||||
|
kStatusGroup_OSA = 143, /*!< Group number for OSA status codes. */
|
||||||
|
kStatusGroup_COMMON_TASK = 144, /*!< Group number for Common task status codes. */
|
||||||
|
kStatusGroup_MSG = 145, /*!< Group number for messaging status codes. */
|
||||||
|
kStatusGroup_SDK_OCOTP = 146, /*!< Group number for OCOTP status codes. */
|
||||||
|
kStatusGroup_SDK_FLEXSPINOR = 147, /*!< Group number for FLEXSPINOR status codes.*/
|
||||||
|
kStatusGroup_CODEC = 148, /*!< Group number for codec status codes. */
|
||||||
|
kStatusGroup_ASRC = 149, /*!< Group number for codec status ASRC. */
|
||||||
|
kStatusGroup_OTFAD = 150, /*!< Group number for codec status codes. */
|
||||||
|
kStatusGroup_SDIOSLV = 151, /*!< Group number for SDIOSLV status codes. */
|
||||||
|
kStatusGroup_MECC = 152, /*!< Group number for MECC status codes. */
|
||||||
|
kStatusGroup_ENET_QOS = 153, /*!< Group number for ENET_QOS status codes. */
|
||||||
|
kStatusGroup_LOG = 154, /*!< Group number for LOG status codes. */
|
||||||
|
kStatusGroup_I3CBUS = 155, /*!< Group number for I3CBUS status codes. */
|
||||||
|
kStatusGroup_QSCI = 156, /*!< Group number for QSCI status codes. */
|
||||||
|
kStatusGroup_SNT = 157, /*!< Group number for SNT status codes. */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*! \public
|
||||||
|
* @brief Generic status return codes.
|
||||||
|
*/
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kStatus_Success = MAKE_STATUS(kStatusGroup_Generic, 0), /*!< Generic status for Success. */
|
||||||
|
kStatus_Fail = MAKE_STATUS(kStatusGroup_Generic, 1), /*!< Generic status for Fail. */
|
||||||
|
kStatus_ReadOnly = MAKE_STATUS(kStatusGroup_Generic, 2), /*!< Generic status for read only failure. */
|
||||||
|
kStatus_OutOfRange = MAKE_STATUS(kStatusGroup_Generic, 3), /*!< Generic status for out of range access. */
|
||||||
|
kStatus_InvalidArgument = MAKE_STATUS(kStatusGroup_Generic, 4), /*!< Generic status for invalid argument check. */
|
||||||
|
kStatus_Timeout = MAKE_STATUS(kStatusGroup_Generic, 5), /*!< Generic status for timeout. */
|
||||||
|
kStatus_NoTransferInProgress = MAKE_STATUS(kStatusGroup_Generic, 6), /*!< Generic status for no transfer in progress. */
|
||||||
|
kStatus_Busy = MAKE_STATUS(kStatusGroup_Generic, 7), /*!< Generic status for module is busy. */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*! @brief Type used for all status and error return values. */
|
||||||
|
typedef int32_t status_t;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Min/max macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#if !defined(MIN)
|
||||||
|
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(MAX)
|
||||||
|
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
|
||||||
|
#endif
|
||||||
|
/* @} */
|
||||||
|
|
||||||
|
/*! @brief Computes the number of elements in an array. */
|
||||||
|
#if !defined(ARRAY_SIZE)
|
||||||
|
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @name UINT16_MAX/UINT32_MAX value */
|
||||||
|
/* @{ */
|
||||||
|
#if !defined(UINT16_MAX)
|
||||||
|
#define UINT16_MAX ((uint16_t)-1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(UINT32_MAX)
|
||||||
|
#define UINT32_MAX ((uint32_t)-1)
|
||||||
|
#endif
|
||||||
|
/* @} */
|
||||||
|
|
||||||
|
/*! @name Suppress fallthrough warning macro */
|
||||||
|
/* For switch case code block, if case section ends without "break;" statement, there wil be
|
||||||
|
fallthrough warning with compiler flag -Wextra or -Wimplicit-fallthrough=n when using armgcc.
|
||||||
|
To suppress this warning, "SUPPRESS_FALL_THROUGH_WARNING();" need to be added at the end of each
|
||||||
|
case section which misses "break;"statement.
|
||||||
|
*/
|
||||||
|
/* @{ */
|
||||||
|
#if defined(__GNUC__) && !defined(__ARMCC_VERSION)
|
||||||
|
#define SUPPRESS_FALL_THROUGH_WARNING() __attribute__ ((fallthrough))
|
||||||
|
#else
|
||||||
|
#define SUPPRESS_FALL_THROUGH_WARNING()
|
||||||
|
#endif
|
||||||
|
/* @} */
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Allocate memory with given alignment and aligned size.
|
||||||
|
*
|
||||||
|
* This is provided to support the dynamically allocated memory
|
||||||
|
* used in cache-able region.
|
||||||
|
* @param size The length required to malloc.
|
||||||
|
* @param alignbytes The alignment size.
|
||||||
|
* @retval The allocated memory.
|
||||||
|
*/
|
||||||
|
void *SDK_Malloc(size_t size, size_t alignbytes);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Free memory.
|
||||||
|
*
|
||||||
|
* @param ptr The memory to be release.
|
||||||
|
*/
|
||||||
|
void SDK_Free(void *ptr);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Delay at least for some time.
|
||||||
|
* Please note that, this API uses while loop for delay, different run-time environments make the time not precise,
|
||||||
|
* if precise delay count was needed, please implement a new delay function with hardware timer.
|
||||||
|
*
|
||||||
|
* @param delayTime_us Delay time in unit of microsecond.
|
||||||
|
* @param coreClock_Hz Core clock frequency with Hz.
|
||||||
|
*/
|
||||||
|
void SDK_DelayAtLeastUs(uint32_t delayTime_us, uint32_t coreClock_Hz);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @} */
|
||||||
|
|
||||||
|
#if (defined(__DSC__) && defined(__CW__))
|
||||||
|
#include "fsl_common_dsc.h"
|
||||||
|
#elif defined(__XCC__)
|
||||||
|
#include "fsl_common_dsp.h"
|
||||||
|
#else
|
||||||
|
#include "fsl_common_arm.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _FSL_COMMON_H_ */
|
||||||
|
|
@ -0,0 +1,233 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2015-2016, Freescale Semiconductor, Inc.
|
||||||
|
* Copyright 2016-2021 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
|
||||||
|
/* Component ID definition, used by tools. */
|
||||||
|
#ifndef FSL_COMPONENT_ID
|
||||||
|
#define FSL_COMPONENT_ID "platform.drivers.common_arm"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __GIC_PRIO_BITS
|
||||||
|
#if defined(ENABLE_RAM_VECTOR_TABLE)
|
||||||
|
uint32_t InstallIRQHandler(IRQn_Type irq, uint32_t irqHandler)
|
||||||
|
{
|
||||||
|
#ifdef __VECTOR_TABLE
|
||||||
|
#undef __VECTOR_TABLE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Addresses for VECTOR_TABLE and VECTOR_RAM come from the linker file */
|
||||||
|
#if defined(__CC_ARM) || defined(__ARMCC_VERSION)
|
||||||
|
extern uint32_t Image$$VECTOR_ROM$$Base[];
|
||||||
|
extern uint32_t Image$$VECTOR_RAM$$Base[];
|
||||||
|
extern uint32_t Image$$RW_m_data$$Base[];
|
||||||
|
|
||||||
|
#define __VECTOR_TABLE Image$$VECTOR_ROM$$Base
|
||||||
|
#define __VECTOR_RAM Image$$VECTOR_RAM$$Base
|
||||||
|
#define __RAM_VECTOR_TABLE_SIZE (((uint32_t)Image$$RW_m_data$$Base - (uint32_t)Image$$VECTOR_RAM$$Base))
|
||||||
|
#elif defined(__ICCARM__)
|
||||||
|
extern uint32_t __RAM_VECTOR_TABLE_SIZE[];
|
||||||
|
extern uint32_t __VECTOR_TABLE[];
|
||||||
|
extern uint32_t __VECTOR_RAM[];
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
extern uint32_t __VECTOR_TABLE[];
|
||||||
|
extern uint32_t __VECTOR_RAM[];
|
||||||
|
extern uint32_t __RAM_VECTOR_TABLE_SIZE_BYTES[];
|
||||||
|
uint32_t __RAM_VECTOR_TABLE_SIZE = (uint32_t)(__RAM_VECTOR_TABLE_SIZE_BYTES);
|
||||||
|
#endif /* defined(__CC_ARM) || defined(__ARMCC_VERSION) */
|
||||||
|
uint32_t n;
|
||||||
|
uint32_t ret;
|
||||||
|
uint32_t irqMaskValue;
|
||||||
|
|
||||||
|
irqMaskValue = DisableGlobalIRQ();
|
||||||
|
if (SCB->VTOR != (uint32_t)__VECTOR_RAM)
|
||||||
|
{
|
||||||
|
/* Copy the vector table from ROM to RAM */
|
||||||
|
for (n = 0; n < ((uint32_t)__RAM_VECTOR_TABLE_SIZE) / sizeof(uint32_t); n++)
|
||||||
|
{
|
||||||
|
__VECTOR_RAM[n] = __VECTOR_TABLE[n];
|
||||||
|
}
|
||||||
|
/* Point the VTOR to the position of vector table */
|
||||||
|
SCB->VTOR = (uint32_t)__VECTOR_RAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = __VECTOR_RAM[(int32_t)irq + 16];
|
||||||
|
/* make sure the __VECTOR_RAM is noncachable */
|
||||||
|
__VECTOR_RAM[(int32_t)irq + 16] = irqHandler;
|
||||||
|
|
||||||
|
EnableGlobalIRQ(irqMaskValue);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif /* ENABLE_RAM_VECTOR_TABLE. */
|
||||||
|
#endif /* __GIC_PRIO_BITS. */
|
||||||
|
|
||||||
|
#if (defined(FSL_FEATURE_SOC_SYSCON_COUNT) && (FSL_FEATURE_SOC_SYSCON_COUNT > 0))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When FSL_FEATURE_POWERLIB_EXTEND is defined to non-zero value,
|
||||||
|
* powerlib should be used instead of these functions.
|
||||||
|
*/
|
||||||
|
#if !(defined(FSL_FEATURE_POWERLIB_EXTEND) && (FSL_FEATURE_POWERLIB_EXTEND != 0))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When the SYSCON STARTER registers are discontinuous, these functions are
|
||||||
|
* implemented in fsl_power.c.
|
||||||
|
*/
|
||||||
|
#if !(defined(FSL_FEATURE_SYSCON_STARTER_DISCONTINUOUS) && FSL_FEATURE_SYSCON_STARTER_DISCONTINUOUS)
|
||||||
|
|
||||||
|
void EnableDeepSleepIRQ(IRQn_Type interrupt)
|
||||||
|
{
|
||||||
|
uint32_t intNumber = (uint32_t)interrupt;
|
||||||
|
|
||||||
|
uint32_t index = 0;
|
||||||
|
|
||||||
|
while (intNumber >= 32u)
|
||||||
|
{
|
||||||
|
index++;
|
||||||
|
intNumber -= 32u;
|
||||||
|
}
|
||||||
|
|
||||||
|
SYSCON->STARTERSET[index] = 1UL << intNumber;
|
||||||
|
(void)EnableIRQ(interrupt); /* also enable interrupt at NVIC */
|
||||||
|
}
|
||||||
|
|
||||||
|
void DisableDeepSleepIRQ(IRQn_Type interrupt)
|
||||||
|
{
|
||||||
|
uint32_t intNumber = (uint32_t)interrupt;
|
||||||
|
|
||||||
|
(void)DisableIRQ(interrupt); /* also disable interrupt at NVIC */
|
||||||
|
uint32_t index = 0;
|
||||||
|
|
||||||
|
while (intNumber >= 32u)
|
||||||
|
{
|
||||||
|
index++;
|
||||||
|
intNumber -= 32u;
|
||||||
|
}
|
||||||
|
|
||||||
|
SYSCON->STARTERCLR[index] = 1UL << intNumber;
|
||||||
|
}
|
||||||
|
#endif /* FSL_FEATURE_SYSCON_STARTER_DISCONTINUOUS */
|
||||||
|
#endif /* FSL_FEATURE_POWERLIB_EXTEND */
|
||||||
|
#endif /* FSL_FEATURE_SOC_SYSCON_COUNT */
|
||||||
|
|
||||||
|
#if defined(SDK_DELAY_USE_DWT) && defined(DWT)
|
||||||
|
/* Use WDT. */
|
||||||
|
static void enableCpuCycleCounter(void)
|
||||||
|
{
|
||||||
|
/* Make sure the DWT trace fucntion is enabled. */
|
||||||
|
if (CoreDebug_DEMCR_TRCENA_Msk != (CoreDebug_DEMCR_TRCENA_Msk & CoreDebug->DEMCR))
|
||||||
|
{
|
||||||
|
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* CYCCNT not supported on this device. */
|
||||||
|
assert(DWT_CTRL_NOCYCCNT_Msk != (DWT->CTRL & DWT_CTRL_NOCYCCNT_Msk));
|
||||||
|
|
||||||
|
/* Read CYCCNT directly if CYCCENT has already been enabled, otherwise enable CYCCENT first. */
|
||||||
|
if (DWT_CTRL_CYCCNTENA_Msk != (DWT_CTRL_CYCCNTENA_Msk & DWT->CTRL))
|
||||||
|
{
|
||||||
|
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint32_t getCpuCycleCount(void)
|
||||||
|
{
|
||||||
|
return DWT->CYCCNT;
|
||||||
|
}
|
||||||
|
#else /* defined(SDK_DELAY_USE_DWT) && defined(DWT) */
|
||||||
|
/* Use software loop. */
|
||||||
|
#if defined(__CC_ARM) /* This macro is arm v5 specific */
|
||||||
|
/* clang-format off */
|
||||||
|
__ASM static void DelayLoop(uint32_t count)
|
||||||
|
{
|
||||||
|
loop
|
||||||
|
SUBS R0, R0, #1
|
||||||
|
CMP R0, #0
|
||||||
|
BNE loop
|
||||||
|
BX LR
|
||||||
|
}
|
||||||
|
/* clang-format on */
|
||||||
|
#elif defined(__ARMCC_VERSION) || defined(__ICCARM__) || defined(__GNUC__)
|
||||||
|
/* Cortex-M0 has a smaller instruction set, SUBS isn't supported in thumb-16 mode reported from __GNUC__ compiler,
|
||||||
|
* use SUB and CMP here for compatibility */
|
||||||
|
static void DelayLoop(uint32_t count)
|
||||||
|
{
|
||||||
|
__ASM volatile(" MOV R0, %0" : : "r"(count));
|
||||||
|
__ASM volatile(
|
||||||
|
"loop: \n"
|
||||||
|
#if defined(__GNUC__) && !defined(__ARMCC_VERSION)
|
||||||
|
" SUB R0, R0, #1 \n"
|
||||||
|
#else
|
||||||
|
" SUBS R0, R0, #1 \n"
|
||||||
|
#endif
|
||||||
|
" CMP R0, #0 \n"
|
||||||
|
|
||||||
|
" BNE loop \n"
|
||||||
|
:
|
||||||
|
:
|
||||||
|
: "r0");
|
||||||
|
}
|
||||||
|
#endif /* defined(__CC_ARM) */
|
||||||
|
#endif /* defined(SDK_DELAY_USE_DWT) && defined(DWT) */
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Delay at least for some time.
|
||||||
|
* Please note that, if not uses DWT, this API will use while loop for delay, different run-time environments have
|
||||||
|
* effect on the delay time. If precise delay is needed, please enable DWT delay. The two parmeters delayTime_us and
|
||||||
|
* coreClock_Hz have limitation. For example, in the platform with 1GHz coreClock_Hz, the delayTime_us only supports
|
||||||
|
* up to 4294967 in current code. If long time delay is needed, please implement a new delay function.
|
||||||
|
*
|
||||||
|
* @param delayTime_us Delay time in unit of microsecond.
|
||||||
|
* @param coreClock_Hz Core clock frequency with Hz.
|
||||||
|
*/
|
||||||
|
void SDK_DelayAtLeastUs(uint32_t delayTime_us, uint32_t coreClock_Hz)
|
||||||
|
{
|
||||||
|
uint64_t count;
|
||||||
|
|
||||||
|
if (delayTime_us > 0U)
|
||||||
|
{
|
||||||
|
count = USEC_TO_COUNT(delayTime_us, coreClock_Hz);
|
||||||
|
|
||||||
|
assert(count <= UINT32_MAX);
|
||||||
|
|
||||||
|
#if defined(SDK_DELAY_USE_DWT) && defined(DWT) /* Use DWT for better accuracy */
|
||||||
|
|
||||||
|
enableCpuCycleCounter();
|
||||||
|
/* Calculate the count ticks. */
|
||||||
|
count += getCpuCycleCount();
|
||||||
|
|
||||||
|
if (count > UINT32_MAX)
|
||||||
|
{
|
||||||
|
count -= UINT32_MAX;
|
||||||
|
/* Wait for cyccnt overflow. */
|
||||||
|
while (count < getCpuCycleCount())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Wait for cyccnt reach count value. */
|
||||||
|
while (count > getCpuCycleCount())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
/* Divide value may be different in various environment to ensure delay is precise.
|
||||||
|
* Every loop count includes three instructions, due to Cortex-M7 sometimes executes
|
||||||
|
* two instructions in one period, through test here set divide 1.5. Other M cores use
|
||||||
|
* divide 4. By the way, divide 1.5 or 4 could let the count lose precision, but it does
|
||||||
|
* not matter because other instructions outside while loop is enough to fill the time.
|
||||||
|
*/
|
||||||
|
#if (__CORTEX_M == 7)
|
||||||
|
count = count / 3U * 2U;
|
||||||
|
#else
|
||||||
|
count = count / 4U;
|
||||||
|
#endif
|
||||||
|
DelayLoop((uint32_t)count);
|
||||||
|
#endif /* defined(SDK_DELAY_USE_DWT) && defined(DWT) */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,660 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2015-2016, Freescale Semiconductor, Inc.
|
||||||
|
* Copyright 2016-2021 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _FSL_COMMON_ARM_H_
|
||||||
|
#define _FSL_COMMON_ARM_H_
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For CMSIS pack RTE.
|
||||||
|
* CMSIS pack RTE generates "RTC_Components.h" which contains the statements
|
||||||
|
* of the related <RTE_Components_h> element for all selected software components.
|
||||||
|
*/
|
||||||
|
#ifdef _RTE_
|
||||||
|
#include "RTE_Components.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @addtogroup ksdk_common
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*! @name Atomic modification
|
||||||
|
*
|
||||||
|
* These macros are used for atomic access, such as read-modify-write
|
||||||
|
* to the peripheral registers.
|
||||||
|
*
|
||||||
|
* - SDK_ATOMIC_LOCAL_ADD
|
||||||
|
* - SDK_ATOMIC_LOCAL_SET
|
||||||
|
* - SDK_ATOMIC_LOCAL_CLEAR
|
||||||
|
* - SDK_ATOMIC_LOCAL_TOGGLE
|
||||||
|
* - SDK_ATOMIC_LOCAL_CLEAR_AND_SET
|
||||||
|
*
|
||||||
|
* Take SDK_ATOMIC_LOCAL_CLEAR_AND_SET as an example: the parameter @c addr
|
||||||
|
* means the address of the peripheral register or variable you want to modify
|
||||||
|
* atomically, the parameter @c clearBits is the bits to clear, the parameter
|
||||||
|
* @c setBits it the bits to set.
|
||||||
|
* For example, to set a 32-bit register bit1:bit0 to 0b10, use like this:
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
volatile uint32_t * reg = (volatile uint32_t *)REG_ADDR;
|
||||||
|
|
||||||
|
SDK_ATOMIC_LOCAL_CLEAR_AND_SET(reg, 0x03, 0x02);
|
||||||
|
@endcode
|
||||||
|
*
|
||||||
|
* In this example, the register bit1:bit0 are cleared and bit1 is set, as a result,
|
||||||
|
* register bit1:bit0 = 0b10.
|
||||||
|
*
|
||||||
|
* @note For the platforms don't support exclusive load and store, these macros
|
||||||
|
* disable the global interrupt to pretect the modification.
|
||||||
|
*
|
||||||
|
* @note These macros only guarantee the local processor atomic operations. For
|
||||||
|
* the multi-processor devices, use hardware semaphore such as SEMA42 to
|
||||||
|
* guarantee exclusive access if necessary.
|
||||||
|
*
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* clang-format off */
|
||||||
|
#if ((defined(__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
|
||||||
|
(defined(__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
|
||||||
|
(defined(__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
|
||||||
|
(defined(__ARM_ARCH_8M_BASE__) && (__ARM_ARCH_8M_BASE__ == 1)))
|
||||||
|
/* clang-format on */
|
||||||
|
|
||||||
|
/* If the LDREX and STREX are supported, use them. */
|
||||||
|
#define _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, val, ops) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
(val) = __LDREXB(addr); \
|
||||||
|
(ops); \
|
||||||
|
} while (0UL != __STREXB((val), (addr)))
|
||||||
|
|
||||||
|
#define _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, val, ops) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
(val) = __LDREXH(addr); \
|
||||||
|
(ops); \
|
||||||
|
} while (0UL != __STREXH((val), (addr)))
|
||||||
|
|
||||||
|
#define _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, val, ops) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
(val) = __LDREXW(addr); \
|
||||||
|
(ops); \
|
||||||
|
} while (0UL != __STREXW((val), (addr)))
|
||||||
|
|
||||||
|
static inline void _SDK_AtomicLocalAdd1Byte(volatile uint8_t *addr, uint8_t val)
|
||||||
|
{
|
||||||
|
uint8_t s_val;
|
||||||
|
|
||||||
|
_SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val += val);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void _SDK_AtomicLocalAdd2Byte(volatile uint16_t *addr, uint16_t val)
|
||||||
|
{
|
||||||
|
uint16_t s_val;
|
||||||
|
|
||||||
|
_SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val += val);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void _SDK_AtomicLocalAdd4Byte(volatile uint32_t *addr, uint32_t val)
|
||||||
|
{
|
||||||
|
uint32_t s_val;
|
||||||
|
|
||||||
|
_SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val += val);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void _SDK_AtomicLocalSub1Byte(volatile uint8_t *addr, uint8_t val)
|
||||||
|
{
|
||||||
|
uint8_t s_val;
|
||||||
|
|
||||||
|
_SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val -= val);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void _SDK_AtomicLocalSub2Byte(volatile uint16_t *addr, uint16_t val)
|
||||||
|
{
|
||||||
|
uint16_t s_val;
|
||||||
|
|
||||||
|
_SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val -= val);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void _SDK_AtomicLocalSub4Byte(volatile uint32_t *addr, uint32_t val)
|
||||||
|
{
|
||||||
|
uint32_t s_val;
|
||||||
|
|
||||||
|
_SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val -= val);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void _SDK_AtomicLocalSet1Byte(volatile uint8_t *addr, uint8_t bits)
|
||||||
|
{
|
||||||
|
uint8_t s_val;
|
||||||
|
|
||||||
|
_SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val |= bits);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void _SDK_AtomicLocalSet2Byte(volatile uint16_t *addr, uint16_t bits)
|
||||||
|
{
|
||||||
|
uint16_t s_val;
|
||||||
|
|
||||||
|
_SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val |= bits);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void _SDK_AtomicLocalSet4Byte(volatile uint32_t *addr, uint32_t bits)
|
||||||
|
{
|
||||||
|
uint32_t s_val;
|
||||||
|
|
||||||
|
_SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val |= bits);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void _SDK_AtomicLocalClear1Byte(volatile uint8_t *addr, uint8_t bits)
|
||||||
|
{
|
||||||
|
uint8_t s_val;
|
||||||
|
|
||||||
|
_SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val &= ~bits);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void _SDK_AtomicLocalClear2Byte(volatile uint16_t *addr, uint16_t bits)
|
||||||
|
{
|
||||||
|
uint16_t s_val;
|
||||||
|
|
||||||
|
_SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val &= ~bits);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void _SDK_AtomicLocalClear4Byte(volatile uint32_t *addr, uint32_t bits)
|
||||||
|
{
|
||||||
|
uint32_t s_val;
|
||||||
|
|
||||||
|
_SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val &= ~bits);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void _SDK_AtomicLocalToggle1Byte(volatile uint8_t *addr, uint8_t bits)
|
||||||
|
{
|
||||||
|
uint8_t s_val;
|
||||||
|
|
||||||
|
_SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val ^= bits);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void _SDK_AtomicLocalToggle2Byte(volatile uint16_t *addr, uint16_t bits)
|
||||||
|
{
|
||||||
|
uint16_t s_val;
|
||||||
|
|
||||||
|
_SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val ^= bits);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void _SDK_AtomicLocalToggle4Byte(volatile uint32_t *addr, uint32_t bits)
|
||||||
|
{
|
||||||
|
uint32_t s_val;
|
||||||
|
|
||||||
|
_SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val ^= bits);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void _SDK_AtomicLocalClearAndSet1Byte(volatile uint8_t *addr, uint8_t clearBits, uint8_t setBits)
|
||||||
|
{
|
||||||
|
uint8_t s_val;
|
||||||
|
|
||||||
|
_SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val = (s_val & ~clearBits) | setBits);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void _SDK_AtomicLocalClearAndSet2Byte(volatile uint16_t *addr, uint16_t clearBits, uint16_t setBits)
|
||||||
|
{
|
||||||
|
uint16_t s_val;
|
||||||
|
|
||||||
|
_SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val = (s_val & ~clearBits) | setBits);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void _SDK_AtomicLocalClearAndSet4Byte(volatile uint32_t *addr, uint32_t clearBits, uint32_t setBits)
|
||||||
|
{
|
||||||
|
uint32_t s_val;
|
||||||
|
|
||||||
|
_SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val = (s_val & ~clearBits) | setBits);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define SDK_ATOMIC_LOCAL_ADD(addr, val) \
|
||||||
|
((1UL == sizeof(*(addr))) ? _SDK_AtomicLocalAdd1Byte((volatile uint8_t*)(volatile void*)(addr), (val)) : \
|
||||||
|
((2UL == sizeof(*(addr))) ? _SDK_AtomicLocalAdd2Byte((volatile uint16_t*)(volatile void*)(addr), (val)) : \
|
||||||
|
_SDK_AtomicLocalAdd4Byte((volatile uint32_t *)(volatile void*)(addr), (val))))
|
||||||
|
|
||||||
|
#define SDK_ATOMIC_LOCAL_SET(addr, bits) \
|
||||||
|
((1UL == sizeof(*(addr))) ? _SDK_AtomicLocalSet1Byte((volatile uint8_t*)(volatile void*)(addr), (bits)) : \
|
||||||
|
((2UL == sizeof(*(addr))) ? _SDK_AtomicLocalSet2Byte((volatile uint16_t*)(volatile void*)(addr), (bits)) : \
|
||||||
|
_SDK_AtomicLocalSet4Byte((volatile uint32_t *)(volatile void*)(addr), (bits))))
|
||||||
|
|
||||||
|
#define SDK_ATOMIC_LOCAL_CLEAR(addr, bits) \
|
||||||
|
((1UL == sizeof(*(addr))) ? _SDK_AtomicLocalClear1Byte((volatile uint8_t*)(volatile void*)(addr), (bits)) : \
|
||||||
|
((2UL == sizeof(*(addr))) ? _SDK_AtomicLocalClear2Byte((volatile uint16_t*)(volatile void*)(addr), (bits)) : \
|
||||||
|
_SDK_AtomicLocalClear4Byte((volatile uint32_t *)(volatile void*)(addr), (bits))))
|
||||||
|
|
||||||
|
#define SDK_ATOMIC_LOCAL_TOGGLE(addr, bits) \
|
||||||
|
((1UL == sizeof(*(addr))) ? _SDK_AtomicLocalToggle1Byte((volatile uint8_t*)(volatile void*)(addr), (bits)) : \
|
||||||
|
((2UL == sizeof(*(addr))) ? _SDK_AtomicLocalToggle2Byte((volatile uint16_t*)(volatile void*)(addr), (bits)) : \
|
||||||
|
_SDK_AtomicLocalToggle4Byte((volatile uint32_t *)(volatile void*)(addr), (bits))))
|
||||||
|
|
||||||
|
#define SDK_ATOMIC_LOCAL_CLEAR_AND_SET(addr, clearBits, setBits) \
|
||||||
|
((1UL == sizeof(*(addr))) ? _SDK_AtomicLocalClearAndSet1Byte((volatile uint8_t*)(volatile void*)(addr), (clearBits), (setBits)) : \
|
||||||
|
((2UL == sizeof(*(addr))) ? _SDK_AtomicLocalClearAndSet2Byte((volatile uint16_t*)(volatile void*)(addr), (clearBits), (setBits)) : \
|
||||||
|
_SDK_AtomicLocalClearAndSet4Byte((volatile uint32_t *)(volatile void*)(addr), (clearBits), (setBits))))
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define SDK_ATOMIC_LOCAL_ADD(addr, val) \
|
||||||
|
do { \
|
||||||
|
uint32_t s_atomicOldInt; \
|
||||||
|
s_atomicOldInt = DisableGlobalIRQ(); \
|
||||||
|
*(addr) += (val); \
|
||||||
|
EnableGlobalIRQ(s_atomicOldInt); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define SDK_ATOMIC_LOCAL_SET(addr, bits) \
|
||||||
|
do { \
|
||||||
|
uint32_t s_atomicOldInt; \
|
||||||
|
s_atomicOldInt = DisableGlobalIRQ(); \
|
||||||
|
*(addr) |= (bits); \
|
||||||
|
EnableGlobalIRQ(s_atomicOldInt); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define SDK_ATOMIC_LOCAL_CLEAR(addr, bits) \
|
||||||
|
do { \
|
||||||
|
uint32_t s_atomicOldInt; \
|
||||||
|
s_atomicOldInt = DisableGlobalIRQ(); \
|
||||||
|
*(addr) &= ~(bits); \
|
||||||
|
EnableGlobalIRQ(s_atomicOldInt); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define SDK_ATOMIC_LOCAL_TOGGLE(addr, bits) \
|
||||||
|
do { \
|
||||||
|
uint32_t s_atomicOldInt; \
|
||||||
|
s_atomicOldInt = DisableGlobalIRQ(); \
|
||||||
|
*(addr) ^= (bits); \
|
||||||
|
EnableGlobalIRQ(s_atomicOldInt); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define SDK_ATOMIC_LOCAL_CLEAR_AND_SET(addr, clearBits, setBits) \
|
||||||
|
do { \
|
||||||
|
uint32_t s_atomicOldInt; \
|
||||||
|
s_atomicOldInt = DisableGlobalIRQ(); \
|
||||||
|
*(addr) = (*(addr) & ~(clearBits)) | (setBits); \
|
||||||
|
EnableGlobalIRQ(s_atomicOldInt); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
/* @} */
|
||||||
|
|
||||||
|
/*! @name Timer utilities */
|
||||||
|
/* @{ */
|
||||||
|
/*! Macro to convert a microsecond period to raw count value */
|
||||||
|
#define USEC_TO_COUNT(us, clockFreqInHz) (uint64_t)(((uint64_t)(us) * (clockFreqInHz)) / 1000000U)
|
||||||
|
/*! Macro to convert a raw count value to microsecond */
|
||||||
|
#define COUNT_TO_USEC(count, clockFreqInHz) (uint64_t)((uint64_t)(count) * 1000000U / (clockFreqInHz))
|
||||||
|
|
||||||
|
/*! Macro to convert a millisecond period to raw count value */
|
||||||
|
#define MSEC_TO_COUNT(ms, clockFreqInHz) (uint64_t)((uint64_t)(ms) * (clockFreqInHz) / 1000U)
|
||||||
|
/*! Macro to convert a raw count value to millisecond */
|
||||||
|
#define COUNT_TO_MSEC(count, clockFreqInHz) (uint64_t)((uint64_t)(count) * 1000U / (clockFreqInHz))
|
||||||
|
/* @} */
|
||||||
|
|
||||||
|
/*! @name ISR exit barrier
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
* ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
|
||||||
|
* exception return operation might vector to incorrect interrupt.
|
||||||
|
* For Cortex-M7, if core speed much faster than peripheral register write speed,
|
||||||
|
* the peripheral interrupt flags may be still set after exiting ISR, this results to
|
||||||
|
* the same error similar with errata 83869.
|
||||||
|
*/
|
||||||
|
#if (defined __CORTEX_M) && ((__CORTEX_M == 4U) || (__CORTEX_M == 7U))
|
||||||
|
#define SDK_ISR_EXIT_BARRIER __DSB()
|
||||||
|
#else
|
||||||
|
#define SDK_ISR_EXIT_BARRIER
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* @} */
|
||||||
|
|
||||||
|
/*! @name Alignment variable definition macros */
|
||||||
|
/* @{ */
|
||||||
|
#if (defined(__ICCARM__))
|
||||||
|
/*
|
||||||
|
* Workaround to disable MISRA C message suppress warnings for IAR compiler.
|
||||||
|
* http:/ /supp.iar.com/Support/?note=24725
|
||||||
|
*/
|
||||||
|
_Pragma("diag_suppress=Pm120")
|
||||||
|
#define SDK_PRAGMA(x) _Pragma(#x)
|
||||||
|
_Pragma("diag_error=Pm120")
|
||||||
|
/*! Macro to define a variable with alignbytes alignment */
|
||||||
|
#define SDK_ALIGN(var, alignbytes) SDK_PRAGMA(data_alignment = alignbytes) var
|
||||||
|
#elif defined(__CC_ARM) || defined(__ARMCC_VERSION)
|
||||||
|
/*! Macro to define a variable with alignbytes alignment */
|
||||||
|
#define SDK_ALIGN(var, alignbytes) __attribute__((aligned(alignbytes))) var
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
/*! Macro to define a variable with alignbytes alignment */
|
||||||
|
#define SDK_ALIGN(var, alignbytes) var __attribute__((aligned(alignbytes)))
|
||||||
|
#else
|
||||||
|
#error Toolchain not supported
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! Macro to define a variable with L1 d-cache line size alignment */
|
||||||
|
#if defined(FSL_FEATURE_L1DCACHE_LINESIZE_BYTE)
|
||||||
|
#define SDK_L1DCACHE_ALIGN(var) SDK_ALIGN(var, FSL_FEATURE_L1DCACHE_LINESIZE_BYTE)
|
||||||
|
#endif
|
||||||
|
/*! Macro to define a variable with L2 cache line size alignment */
|
||||||
|
#if defined(FSL_FEATURE_L2CACHE_LINESIZE_BYTE)
|
||||||
|
#define SDK_L2CACHE_ALIGN(var) SDK_ALIGN(var, FSL_FEATURE_L2CACHE_LINESIZE_BYTE)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! Macro to change a value to a given size aligned value */
|
||||||
|
#define SDK_SIZEALIGN(var, alignbytes) \
|
||||||
|
((unsigned int)((var) + ((alignbytes)-1U)) & (unsigned int)(~(unsigned int)((alignbytes)-1U)))
|
||||||
|
/* @} */
|
||||||
|
|
||||||
|
/*! @name Non-cacheable region definition macros */
|
||||||
|
/* For initialized non-zero non-cacheable variables, please using "AT_NONCACHEABLE_SECTION_INIT(var) ={xx};" or
|
||||||
|
* "AT_NONCACHEABLE_SECTION_ALIGN_INIT(var) ={xx};" in your projects to define them, for zero-inited non-cacheable variables,
|
||||||
|
* please using "AT_NONCACHEABLE_SECTION(var);" or "AT_NONCACHEABLE_SECTION_ALIGN(var);" to define them, these zero-inited variables
|
||||||
|
* will be initialized to zero in system startup.
|
||||||
|
*/
|
||||||
|
/* @{ */
|
||||||
|
|
||||||
|
#if ((!(defined(FSL_FEATURE_HAS_NO_NONCACHEABLE_SECTION) && FSL_FEATURE_HAS_NO_NONCACHEABLE_SECTION)) && defined(FSL_FEATURE_L1ICACHE_LINESIZE_BYTE))
|
||||||
|
|
||||||
|
#if (defined(__ICCARM__))
|
||||||
|
#define AT_NONCACHEABLE_SECTION(var) var @"NonCacheable"
|
||||||
|
#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) SDK_PRAGMA(data_alignment = alignbytes) var @"NonCacheable"
|
||||||
|
#define AT_NONCACHEABLE_SECTION_INIT(var) var @"NonCacheable.init"
|
||||||
|
#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) SDK_PRAGMA(data_alignment = alignbytes) var @"NonCacheable.init"
|
||||||
|
|
||||||
|
#elif(defined(__CC_ARM) || defined(__ARMCC_VERSION))
|
||||||
|
#define AT_NONCACHEABLE_SECTION_INIT(var) __attribute__((section("NonCacheable.init"))) var
|
||||||
|
#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) \
|
||||||
|
__attribute__((section("NonCacheable.init"))) __attribute__((aligned(alignbytes))) var
|
||||||
|
#if(defined(__CC_ARM))
|
||||||
|
#define AT_NONCACHEABLE_SECTION(var) __attribute__((section("NonCacheable"), zero_init)) var
|
||||||
|
#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) \
|
||||||
|
__attribute__((section("NonCacheable"), zero_init)) __attribute__((aligned(alignbytes))) var
|
||||||
|
#else
|
||||||
|
#define AT_NONCACHEABLE_SECTION(var) __attribute__((section(".bss.NonCacheable"))) var
|
||||||
|
#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) \
|
||||||
|
__attribute__((section(".bss.NonCacheable"))) __attribute__((aligned(alignbytes))) var
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif(defined(__GNUC__))
|
||||||
|
/* For GCC, when the non-cacheable section is required, please define "__STARTUP_INITIALIZE_NONCACHEDATA"
|
||||||
|
* in your projects to make sure the non-cacheable section variables will be initialized in system startup.
|
||||||
|
*/
|
||||||
|
#define AT_NONCACHEABLE_SECTION_INIT(var) __attribute__((section("NonCacheable.init"))) var
|
||||||
|
#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) \
|
||||||
|
__attribute__((section("NonCacheable.init"))) var __attribute__((aligned(alignbytes)))
|
||||||
|
#define AT_NONCACHEABLE_SECTION(var) __attribute__((section("NonCacheable,\"aw\",%nobits @"))) var
|
||||||
|
#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) \
|
||||||
|
__attribute__((section("NonCacheable,\"aw\",%nobits @"))) var __attribute__((aligned(alignbytes)))
|
||||||
|
#else
|
||||||
|
#error Toolchain not supported.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define AT_NONCACHEABLE_SECTION(var) var
|
||||||
|
#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) SDK_ALIGN(var, alignbytes)
|
||||||
|
#define AT_NONCACHEABLE_SECTION_INIT(var) var
|
||||||
|
#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) SDK_ALIGN(var, alignbytes)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* @} */
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Time sensitive region
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#if (defined(FSL_SDK_DRIVER_QUICK_ACCESS_ENABLE) && FSL_SDK_DRIVER_QUICK_ACCESS_ENABLE)
|
||||||
|
|
||||||
|
#if (defined(__ICCARM__))
|
||||||
|
#define AT_QUICKACCESS_SECTION_CODE(func) func @"CodeQuickAccess"
|
||||||
|
#define AT_QUICKACCESS_SECTION_DATA(func) func @"DataQuickAccess"
|
||||||
|
#elif(defined(__CC_ARM) || defined(__ARMCC_VERSION))
|
||||||
|
#define AT_QUICKACCESS_SECTION_CODE(func) __attribute__((section("CodeQuickAccess"), __noinline__)) func
|
||||||
|
#define AT_QUICKACCESS_SECTION_DATA(func) __attribute__((section("DataQuickAccess"))) func
|
||||||
|
#elif(defined(__GNUC__))
|
||||||
|
#define AT_QUICKACCESS_SECTION_CODE(func) __attribute__((section("CodeQuickAccess"), __noinline__)) func
|
||||||
|
#define AT_QUICKACCESS_SECTION_DATA(func) __attribute__((section("DataQuickAccess"))) func
|
||||||
|
#else
|
||||||
|
#error Toolchain not supported.
|
||||||
|
#endif /* defined(__ICCARM__) */
|
||||||
|
|
||||||
|
#else /* __FSL_SDK_DRIVER_QUICK_ACCESS_ENABLE */
|
||||||
|
|
||||||
|
#define AT_QUICKACCESS_SECTION_CODE(func) func
|
||||||
|
#define AT_QUICKACCESS_SECTION_DATA(func) func
|
||||||
|
|
||||||
|
#endif /* __FSL_SDK_DRIVER_QUICK_ACCESS_ENABLE */
|
||||||
|
/* @} */
|
||||||
|
|
||||||
|
/*! @name Ram Function */
|
||||||
|
#if (defined(__ICCARM__))
|
||||||
|
#define RAMFUNCTION_SECTION_CODE(func) func @"RamFunction"
|
||||||
|
#elif(defined(__CC_ARM) || defined(__ARMCC_VERSION))
|
||||||
|
#define RAMFUNCTION_SECTION_CODE(func) __attribute__((section("RamFunction"))) func
|
||||||
|
#elif(defined(__GNUC__))
|
||||||
|
#define RAMFUNCTION_SECTION_CODE(func) __attribute__((section("RamFunction"))) func
|
||||||
|
#else
|
||||||
|
#error Toolchain not supported.
|
||||||
|
#endif /* defined(__ICCARM__) */
|
||||||
|
/* @} */
|
||||||
|
|
||||||
|
#if defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 )
|
||||||
|
void DefaultISR(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The fsl_clock.h is included here because it needs MAKE_VERSION/MAKE_STATUS/status_t
|
||||||
|
* defined in previous of this file.
|
||||||
|
*/
|
||||||
|
#include "fsl_clock.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Chip level peripheral reset API, for MCUs that implement peripheral reset control external to a peripheral
|
||||||
|
*/
|
||||||
|
#if ((defined(FSL_FEATURE_SOC_SYSCON_COUNT) && (FSL_FEATURE_SOC_SYSCON_COUNT > 0)) || \
|
||||||
|
(defined(FSL_FEATURE_SOC_ASYNC_SYSCON_COUNT) && (FSL_FEATURE_SOC_ASYNC_SYSCON_COUNT > 0)))
|
||||||
|
#include "fsl_reset.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enable specific interrupt.
|
||||||
|
*
|
||||||
|
* Enable LEVEL1 interrupt. For some devices, there might be multiple interrupt
|
||||||
|
* levels. For example, there are NVIC and intmux. Here the interrupts connected
|
||||||
|
* to NVIC are the LEVEL1 interrupts, because they are routed to the core directly.
|
||||||
|
* The interrupts connected to intmux are the LEVEL2 interrupts, they are routed
|
||||||
|
* to NVIC first then routed to core.
|
||||||
|
*
|
||||||
|
* This function only enables the LEVEL1 interrupts. The number of LEVEL1 interrupts
|
||||||
|
* is indicated by the feature macro FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS.
|
||||||
|
*
|
||||||
|
* @param interrupt The IRQ number.
|
||||||
|
* @retval kStatus_Success Interrupt enabled successfully
|
||||||
|
* @retval kStatus_Fail Failed to enable the interrupt
|
||||||
|
*/
|
||||||
|
static inline status_t EnableIRQ(IRQn_Type interrupt)
|
||||||
|
{
|
||||||
|
status_t status = kStatus_Success;
|
||||||
|
|
||||||
|
if (NotAvail_IRQn == interrupt)
|
||||||
|
{
|
||||||
|
status = kStatus_Fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) && (FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS > 0)
|
||||||
|
else if ((int32_t)interrupt >= (int32_t)FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS)
|
||||||
|
{
|
||||||
|
status = kStatus_Fail;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if defined(__GIC_PRIO_BITS)
|
||||||
|
GIC_EnableIRQ(interrupt);
|
||||||
|
#else
|
||||||
|
NVIC_EnableIRQ(interrupt);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Disable specific interrupt.
|
||||||
|
*
|
||||||
|
* Disable LEVEL1 interrupt. For some devices, there might be multiple interrupt
|
||||||
|
* levels. For example, there are NVIC and intmux. Here the interrupts connected
|
||||||
|
* to NVIC are the LEVEL1 interrupts, because they are routed to the core directly.
|
||||||
|
* The interrupts connected to intmux are the LEVEL2 interrupts, they are routed
|
||||||
|
* to NVIC first then routed to core.
|
||||||
|
*
|
||||||
|
* This function only disables the LEVEL1 interrupts. The number of LEVEL1 interrupts
|
||||||
|
* is indicated by the feature macro FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS.
|
||||||
|
*
|
||||||
|
* @param interrupt The IRQ number.
|
||||||
|
* @retval kStatus_Success Interrupt disabled successfully
|
||||||
|
* @retval kStatus_Fail Failed to disable the interrupt
|
||||||
|
*/
|
||||||
|
static inline status_t DisableIRQ(IRQn_Type interrupt)
|
||||||
|
{
|
||||||
|
status_t status = kStatus_Success;
|
||||||
|
|
||||||
|
if (NotAvail_IRQn == interrupt)
|
||||||
|
{
|
||||||
|
status = kStatus_Fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) && (FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS > 0)
|
||||||
|
else if ((int32_t)interrupt >= (int32_t)FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS)
|
||||||
|
{
|
||||||
|
status = kStatus_Fail;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if defined(__GIC_PRIO_BITS)
|
||||||
|
GIC_DisableIRQ(interrupt);
|
||||||
|
#else
|
||||||
|
NVIC_DisableIRQ(interrupt);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Disable the global IRQ
|
||||||
|
*
|
||||||
|
* Disable the global interrupt and return the current primask register. User is required to provided the primask
|
||||||
|
* register for the EnableGlobalIRQ().
|
||||||
|
*
|
||||||
|
* @return Current primask value.
|
||||||
|
*/
|
||||||
|
static inline uint32_t DisableGlobalIRQ(void)
|
||||||
|
{
|
||||||
|
#if defined(CPSR_I_Msk)
|
||||||
|
uint32_t cpsr = __get_CPSR() & CPSR_I_Msk;
|
||||||
|
|
||||||
|
__disable_irq();
|
||||||
|
|
||||||
|
return cpsr;
|
||||||
|
#else
|
||||||
|
uint32_t regPrimask = __get_PRIMASK();
|
||||||
|
|
||||||
|
__disable_irq();
|
||||||
|
|
||||||
|
return regPrimask;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enable the global IRQ
|
||||||
|
*
|
||||||
|
* Set the primask register with the provided primask value but not just enable the primask. The idea is for the
|
||||||
|
* convenience of integration of RTOS. some RTOS get its own management mechanism of primask. User is required to
|
||||||
|
* use the EnableGlobalIRQ() and DisableGlobalIRQ() in pair.
|
||||||
|
*
|
||||||
|
* @param primask value of primask register to be restored. The primask value is supposed to be provided by the
|
||||||
|
* DisableGlobalIRQ().
|
||||||
|
*/
|
||||||
|
static inline void EnableGlobalIRQ(uint32_t primask)
|
||||||
|
{
|
||||||
|
#if defined(CPSR_I_Msk)
|
||||||
|
__set_CPSR((__get_CPSR() & ~CPSR_I_Msk) | primask);
|
||||||
|
#else
|
||||||
|
__set_PRIMASK(primask);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(ENABLE_RAM_VECTOR_TABLE)
|
||||||
|
/*!
|
||||||
|
* @brief install IRQ handler
|
||||||
|
*
|
||||||
|
* @param irq IRQ number
|
||||||
|
* @param irqHandler IRQ handler address
|
||||||
|
* @return The old IRQ handler address
|
||||||
|
*/
|
||||||
|
uint32_t InstallIRQHandler(IRQn_Type irq, uint32_t irqHandler);
|
||||||
|
#endif /* ENABLE_RAM_VECTOR_TABLE. */
|
||||||
|
|
||||||
|
#if (defined(FSL_FEATURE_SOC_SYSCON_COUNT) && (FSL_FEATURE_SOC_SYSCON_COUNT > 0))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When FSL_FEATURE_POWERLIB_EXTEND is defined to non-zero value,
|
||||||
|
* powerlib should be used instead of these functions.
|
||||||
|
*/
|
||||||
|
#if !(defined(FSL_FEATURE_POWERLIB_EXTEND) && (FSL_FEATURE_POWERLIB_EXTEND != 0))
|
||||||
|
/*!
|
||||||
|
* @brief Enable specific interrupt for wake-up from deep-sleep mode.
|
||||||
|
*
|
||||||
|
* Enable the interrupt for wake-up from deep sleep mode.
|
||||||
|
* Some interrupts are typically used in sleep mode only and will not occur during
|
||||||
|
* deep-sleep mode because relevant clocks are stopped. However, it is possible to enable
|
||||||
|
* those clocks (significantly increasing power consumption in the reduced power mode),
|
||||||
|
* making these wake-ups possible.
|
||||||
|
*
|
||||||
|
* @note This function also enables the interrupt in the NVIC (EnableIRQ() is called internaly).
|
||||||
|
*
|
||||||
|
* @param interrupt The IRQ number.
|
||||||
|
*/
|
||||||
|
void EnableDeepSleepIRQ(IRQn_Type interrupt);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Disable specific interrupt for wake-up from deep-sleep mode.
|
||||||
|
*
|
||||||
|
* Disable the interrupt for wake-up from deep sleep mode.
|
||||||
|
* Some interrupts are typically used in sleep mode only and will not occur during
|
||||||
|
* deep-sleep mode because relevant clocks are stopped. However, it is possible to enable
|
||||||
|
* those clocks (significantly increasing power consumption in the reduced power mode),
|
||||||
|
* making these wake-ups possible.
|
||||||
|
*
|
||||||
|
* @note This function also disables the interrupt in the NVIC (DisableIRQ() is called internaly).
|
||||||
|
*
|
||||||
|
* @param interrupt The IRQ number.
|
||||||
|
*/
|
||||||
|
void DisableDeepSleepIRQ(IRQn_Type interrupt);
|
||||||
|
#endif /* FSL_FEATURE_POWERLIB_EXTEND */
|
||||||
|
#endif /* FSL_FEATURE_SOC_SYSCON_COUNT */
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*! @} */
|
||||||
|
|
||||||
|
#endif /* _FSL_COMMON_ARM_H_ */
|
||||||
|
|
@ -0,0 +1,412 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016, Freescale Semiconductor, Inc.
|
||||||
|
* Copyright 2016-2019 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
#include "fsl_flexcomm.h"
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/* Component ID definition, used by tools. */
|
||||||
|
#ifndef FSL_COMPONENT_ID
|
||||||
|
#define FSL_COMPONENT_ID "platform.drivers.flexcomm"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Used for conversion between `void*` and `uint32_t`.
|
||||||
|
*/
|
||||||
|
typedef union pvoid_to_u32
|
||||||
|
{
|
||||||
|
void *pvoid;
|
||||||
|
uint32_t u32;
|
||||||
|
} pvoid_to_u32_t;
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Prototypes
|
||||||
|
******************************************************************************/
|
||||||
|
/*! @brief Set the FLEXCOMM mode . */
|
||||||
|
static status_t FLEXCOMM_SetPeriph(FLEXCOMM_Type *base, FLEXCOMM_PERIPH_T periph, int lock);
|
||||||
|
|
||||||
|
/*! @brief check whether flexcomm supports peripheral type */
|
||||||
|
static bool FLEXCOMM_PeripheralIsPresent(FLEXCOMM_Type *base, FLEXCOMM_PERIPH_T periph);
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Variables
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/*! @brief Array to map FLEXCOMM instance number to base address. */
|
||||||
|
static const uint32_t s_flexcommBaseAddrs[] = FLEXCOMM_BASE_ADDRS;
|
||||||
|
|
||||||
|
/*! @brief Pointers to real IRQ handlers installed by drivers for each instance. */
|
||||||
|
static flexcomm_irq_handler_t s_flexcommIrqHandler[ARRAY_SIZE(s_flexcommBaseAddrs)];
|
||||||
|
|
||||||
|
/*! @brief Pointers to handles for each instance to provide context to interrupt routines */
|
||||||
|
static void *s_flexcommHandle[ARRAY_SIZE(s_flexcommBaseAddrs)];
|
||||||
|
|
||||||
|
/*! @brief Array to map FLEXCOMM instance number to IRQ number. */
|
||||||
|
IRQn_Type const kFlexcommIrqs[] = FLEXCOMM_IRQS;
|
||||||
|
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
|
||||||
|
/*! @brief IDs of clock for each FLEXCOMM module */
|
||||||
|
static const clock_ip_name_t s_flexcommClocks[] = FLEXCOMM_CLOCKS;
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
|
||||||
|
|
||||||
|
#if !(defined(FSL_FEATURE_FLEXCOMM_HAS_NO_RESET) && FSL_FEATURE_FLEXCOMM_HAS_NO_RESET)
|
||||||
|
/*! @brief Pointers to FLEXCOMM resets for each instance. */
|
||||||
|
static const reset_ip_name_t s_flexcommResets[] = FLEXCOMM_RSTS;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/* check whether flexcomm supports peripheral type */
|
||||||
|
static bool FLEXCOMM_PeripheralIsPresent(FLEXCOMM_Type *base, FLEXCOMM_PERIPH_T periph)
|
||||||
|
{
|
||||||
|
if (periph == FLEXCOMM_PERIPH_NONE)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (periph <= FLEXCOMM_PERIPH_I2S_TX)
|
||||||
|
{
|
||||||
|
return (base->PSELID & (1UL << ((uint32_t)periph + 3U))) > 0UL ? true : false;
|
||||||
|
}
|
||||||
|
else if (periph == FLEXCOMM_PERIPH_I2S_RX)
|
||||||
|
{
|
||||||
|
return (base->PSELID & (1U << 7U)) > (uint32_t)0U ? true : false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the index corresponding to the FLEXCOMM */
|
||||||
|
/*! brief Returns instance number for FLEXCOMM module with given base address. */
|
||||||
|
uint32_t FLEXCOMM_GetInstance(void *base)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
pvoid_to_u32_t BaseAddr;
|
||||||
|
BaseAddr.pvoid = base;
|
||||||
|
|
||||||
|
for (i = 0U; i < (uint32_t)FSL_FEATURE_SOC_FLEXCOMM_COUNT; i++)
|
||||||
|
{
|
||||||
|
if (BaseAddr.u32 == s_flexcommBaseAddrs[i])
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(i < (uint32_t)FSL_FEATURE_SOC_FLEXCOMM_COUNT);
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Changes FLEXCOMM mode */
|
||||||
|
static status_t FLEXCOMM_SetPeriph(FLEXCOMM_Type *base, FLEXCOMM_PERIPH_T periph, int lock)
|
||||||
|
{
|
||||||
|
/* Check whether peripheral type is present */
|
||||||
|
if (!FLEXCOMM_PeripheralIsPresent(base, periph))
|
||||||
|
{
|
||||||
|
return kStatus_OutOfRange;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Flexcomm is locked to different peripheral type than expected */
|
||||||
|
if (((base->PSELID & FLEXCOMM_PSELID_LOCK_MASK) != 0U) &&
|
||||||
|
((base->PSELID & FLEXCOMM_PSELID_PERSEL_MASK) != (uint32_t)periph))
|
||||||
|
{
|
||||||
|
return kStatus_Fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if we are asked to lock */
|
||||||
|
if (lock != 0)
|
||||||
|
{
|
||||||
|
base->PSELID = (uint32_t)periph | FLEXCOMM_PSELID_LOCK_MASK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
base->PSELID = (uint32_t)periph;
|
||||||
|
}
|
||||||
|
|
||||||
|
return kStatus_Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! brief Initializes FLEXCOMM and selects peripheral mode according to the second parameter. */
|
||||||
|
status_t FLEXCOMM_Init(void *base, FLEXCOMM_PERIPH_T periph)
|
||||||
|
{
|
||||||
|
uint32_t idx = FLEXCOMM_GetInstance(base);
|
||||||
|
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
|
||||||
|
/* Enable the peripheral clock */
|
||||||
|
CLOCK_EnableClock(s_flexcommClocks[idx]);
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
|
||||||
|
|
||||||
|
#if !(defined(FSL_FEATURE_FLEXCOMM_HAS_NO_RESET) && FSL_FEATURE_FLEXCOMM_HAS_NO_RESET)
|
||||||
|
/* Reset the FLEXCOMM module */
|
||||||
|
RESET_PeripheralReset(s_flexcommResets[idx]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Set the FLEXCOMM to given peripheral */
|
||||||
|
return FLEXCOMM_SetPeriph((FLEXCOMM_Type *)base, periph, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! brief Sets IRQ handler for given FLEXCOMM module. It is used by drivers register IRQ handler according to FLEXCOMM
|
||||||
|
* mode */
|
||||||
|
void FLEXCOMM_SetIRQHandler(void *base, flexcomm_irq_handler_t handler, void *flexcommHandle)
|
||||||
|
{
|
||||||
|
uint32_t instance;
|
||||||
|
|
||||||
|
/* Look up instance number */
|
||||||
|
instance = FLEXCOMM_GetInstance(base);
|
||||||
|
|
||||||
|
/* Clear handler first to avoid execution of the handler with wrong handle */
|
||||||
|
s_flexcommIrqHandler[instance] = NULL;
|
||||||
|
s_flexcommHandle[instance] = flexcommHandle;
|
||||||
|
s_flexcommIrqHandler[instance] = handler;
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* IRQ handler functions overloading weak symbols in the startup */
|
||||||
|
#if defined(FLEXCOMM0)
|
||||||
|
void FLEXCOMM0_DriverIRQHandler(void);
|
||||||
|
void FLEXCOMM0_DriverIRQHandler(void)
|
||||||
|
{
|
||||||
|
uint32_t instance;
|
||||||
|
|
||||||
|
/* Look up instance number */
|
||||||
|
instance = FLEXCOMM_GetInstance(FLEXCOMM0);
|
||||||
|
assert(s_flexcommIrqHandler[instance] != NULL);
|
||||||
|
s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(FLEXCOMM1)
|
||||||
|
void FLEXCOMM1_DriverIRQHandler(void);
|
||||||
|
void FLEXCOMM1_DriverIRQHandler(void)
|
||||||
|
{
|
||||||
|
uint32_t instance;
|
||||||
|
|
||||||
|
/* Look up instance number */
|
||||||
|
instance = FLEXCOMM_GetInstance(FLEXCOMM1);
|
||||||
|
assert(s_flexcommIrqHandler[instance] != NULL);
|
||||||
|
s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(FLEXCOMM2)
|
||||||
|
void FLEXCOMM2_DriverIRQHandler(void);
|
||||||
|
void FLEXCOMM2_DriverIRQHandler(void)
|
||||||
|
{
|
||||||
|
uint32_t instance;
|
||||||
|
|
||||||
|
/* Look up instance number */
|
||||||
|
instance = FLEXCOMM_GetInstance(FLEXCOMM2);
|
||||||
|
assert(s_flexcommIrqHandler[instance] != NULL);
|
||||||
|
s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(FLEXCOMM3)
|
||||||
|
void FLEXCOMM3_DriverIRQHandler(void);
|
||||||
|
void FLEXCOMM3_DriverIRQHandler(void)
|
||||||
|
{
|
||||||
|
uint32_t instance;
|
||||||
|
|
||||||
|
/* Look up instance number */
|
||||||
|
instance = FLEXCOMM_GetInstance(FLEXCOMM3);
|
||||||
|
assert(s_flexcommIrqHandler[instance] != NULL);
|
||||||
|
s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(FLEXCOMM4)
|
||||||
|
void FLEXCOMM4_DriverIRQHandler(void);
|
||||||
|
void FLEXCOMM4_DriverIRQHandler(void)
|
||||||
|
{
|
||||||
|
uint32_t instance;
|
||||||
|
|
||||||
|
/* Look up instance number */
|
||||||
|
instance = FLEXCOMM_GetInstance(FLEXCOMM4);
|
||||||
|
assert(s_flexcommIrqHandler[instance] != NULL);
|
||||||
|
s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(FLEXCOMM5)
|
||||||
|
void FLEXCOMM5_DriverIRQHandler(void);
|
||||||
|
void FLEXCOMM5_DriverIRQHandler(void)
|
||||||
|
{
|
||||||
|
uint32_t instance;
|
||||||
|
|
||||||
|
/* Look up instance number */
|
||||||
|
instance = FLEXCOMM_GetInstance(FLEXCOMM5);
|
||||||
|
assert(s_flexcommIrqHandler[instance] != NULL);
|
||||||
|
s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(FLEXCOMM6)
|
||||||
|
void FLEXCOMM6_DriverIRQHandler(void);
|
||||||
|
void FLEXCOMM6_DriverIRQHandler(void)
|
||||||
|
{
|
||||||
|
uint32_t instance;
|
||||||
|
|
||||||
|
/* Look up instance number */
|
||||||
|
instance = FLEXCOMM_GetInstance(FLEXCOMM6);
|
||||||
|
assert(s_flexcommIrqHandler[instance] != NULL);
|
||||||
|
s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(FLEXCOMM7)
|
||||||
|
void FLEXCOMM7_DriverIRQHandler(void);
|
||||||
|
void FLEXCOMM7_DriverIRQHandler(void)
|
||||||
|
{
|
||||||
|
uint32_t instance;
|
||||||
|
|
||||||
|
/* Look up instance number */
|
||||||
|
instance = FLEXCOMM_GetInstance(FLEXCOMM7);
|
||||||
|
assert(s_flexcommIrqHandler[instance] != NULL);
|
||||||
|
s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(FLEXCOMM8)
|
||||||
|
void FLEXCOMM8_DriverIRQHandler(void);
|
||||||
|
void FLEXCOMM8_DriverIRQHandler(void)
|
||||||
|
{
|
||||||
|
uint32_t instance;
|
||||||
|
|
||||||
|
/* Look up instance number */
|
||||||
|
instance = FLEXCOMM_GetInstance(FLEXCOMM8);
|
||||||
|
assert(s_flexcommIrqHandler[instance] != NULL);
|
||||||
|
s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(FLEXCOMM9)
|
||||||
|
void FLEXCOMM9_DriverIRQHandler(void);
|
||||||
|
void FLEXCOMM9_DriverIRQHandler(void)
|
||||||
|
{
|
||||||
|
uint32_t instance;
|
||||||
|
|
||||||
|
/* Look up instance number */
|
||||||
|
instance = FLEXCOMM_GetInstance(FLEXCOMM9);
|
||||||
|
assert(s_flexcommIrqHandler[instance] != NULL);
|
||||||
|
s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(FLEXCOMM10)
|
||||||
|
void FLEXCOMM10_DriverIRQHandler(void);
|
||||||
|
void FLEXCOMM10_DriverIRQHandler(void)
|
||||||
|
{
|
||||||
|
uint32_t instance;
|
||||||
|
|
||||||
|
/* Look up instance number */
|
||||||
|
instance = FLEXCOMM_GetInstance(FLEXCOMM10);
|
||||||
|
assert(s_flexcommIrqHandler[instance] != NULL);
|
||||||
|
s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(FLEXCOMM11)
|
||||||
|
void FLEXCOMM11_DriverIRQHandler(void);
|
||||||
|
void FLEXCOMM11_DriverIRQHandler(void)
|
||||||
|
{
|
||||||
|
uint32_t instance;
|
||||||
|
|
||||||
|
/* Look up instance number */
|
||||||
|
instance = FLEXCOMM_GetInstance(FLEXCOMM11);
|
||||||
|
assert(s_flexcommIrqHandler[instance] != NULL);
|
||||||
|
s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(FLEXCOMM12)
|
||||||
|
void FLEXCOMM12_DriverIRQHandler(void);
|
||||||
|
void FLEXCOMM12_DriverIRQHandler(void)
|
||||||
|
{
|
||||||
|
uint32_t instance;
|
||||||
|
|
||||||
|
/* Look up instance number */
|
||||||
|
instance = FLEXCOMM_GetInstance(FLEXCOMM12);
|
||||||
|
assert(s_flexcommIrqHandler[instance] != NULL);
|
||||||
|
s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(FLEXCOMM13)
|
||||||
|
void FLEXCOMM13_DriverIRQHandler(void);
|
||||||
|
void FLEXCOMM13_DriverIRQHandler(void)
|
||||||
|
{
|
||||||
|
uint32_t instance;
|
||||||
|
|
||||||
|
/* Look up instance number */
|
||||||
|
instance = FLEXCOMM_GetInstance(FLEXCOMM13);
|
||||||
|
assert(s_flexcommIrqHandler[instance] != NULL);
|
||||||
|
s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(FLEXCOMM14)
|
||||||
|
void FLEXCOMM14_DriverIRQHandler(void);
|
||||||
|
void FLEXCOMM14_DriverIRQHandler(void)
|
||||||
|
{
|
||||||
|
uint32_t instance;
|
||||||
|
|
||||||
|
/* Look up instance number */
|
||||||
|
instance = FLEXCOMM_GetInstance(FLEXCOMM14);
|
||||||
|
assert(s_flexcommIrqHandler[instance] != NULL);
|
||||||
|
s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(FLEXCOMM15)
|
||||||
|
void FLEXCOMM15_DriverIRQHandler(void);
|
||||||
|
void FLEXCOMM15_DriverIRQHandler(void)
|
||||||
|
{
|
||||||
|
uint32_t instance;
|
||||||
|
|
||||||
|
/* Look up instance number */
|
||||||
|
instance = FLEXCOMM_GetInstance(FLEXCOMM15);
|
||||||
|
assert(s_flexcommIrqHandler[instance] != NULL);
|
||||||
|
s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(FLEXCOMM16)
|
||||||
|
void FLEXCOMM16_DriverIRQHandler(void);
|
||||||
|
void FLEXCOMM16_DriverIRQHandler(void)
|
||||||
|
{
|
||||||
|
uint32_t instance;
|
||||||
|
|
||||||
|
/* Look up instance number */
|
||||||
|
instance = FLEXCOMM_GetInstance(FLEXCOMM16);
|
||||||
|
assert(s_flexcommIrqHandler[instance] != NULL);
|
||||||
|
s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,64 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016, Freescale Semiconductor, Inc.
|
||||||
|
* Copyright 2016-2019 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
#ifndef _FSL_FLEXCOMM_H_
|
||||||
|
#define _FSL_FLEXCOMM_H_
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @addtogroup flexcomm_driver
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*! @name Driver version */
|
||||||
|
/*@{*/
|
||||||
|
/*! @brief FlexCOMM driver version 2.0.2. */
|
||||||
|
#define FSL_FLEXCOMM_DRIVER_VERSION (MAKE_VERSION(2, 0, 2))
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
/*! @brief FLEXCOMM peripheral modes. */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
FLEXCOMM_PERIPH_NONE, /*!< No peripheral */
|
||||||
|
FLEXCOMM_PERIPH_USART, /*!< USART peripheral */
|
||||||
|
FLEXCOMM_PERIPH_SPI, /*!< SPI Peripheral */
|
||||||
|
FLEXCOMM_PERIPH_I2C, /*!< I2C Peripheral */
|
||||||
|
FLEXCOMM_PERIPH_I2S_TX, /*!< I2S TX Peripheral */
|
||||||
|
FLEXCOMM_PERIPH_I2S_RX, /*!< I2S RX Peripheral */
|
||||||
|
} FLEXCOMM_PERIPH_T;
|
||||||
|
|
||||||
|
/*! @brief Typedef for interrupt handler. */
|
||||||
|
typedef void (*flexcomm_irq_handler_t)(void *base, void *handle);
|
||||||
|
|
||||||
|
/*! @brief Array with IRQ number for each FLEXCOMM module. */
|
||||||
|
extern IRQn_Type const kFlexcommIrqs[];
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @brief Returns instance number for FLEXCOMM module with given base address. */
|
||||||
|
uint32_t FLEXCOMM_GetInstance(void *base);
|
||||||
|
|
||||||
|
/*! @brief Initializes FLEXCOMM and selects peripheral mode according to the second parameter. */
|
||||||
|
status_t FLEXCOMM_Init(void *base, FLEXCOMM_PERIPH_T periph);
|
||||||
|
|
||||||
|
/*! @brief Sets IRQ handler for given FLEXCOMM module. It is used by drivers register IRQ handler according to FLEXCOMM
|
||||||
|
* mode */
|
||||||
|
void FLEXCOMM_SetIRQHandler(void *base, flexcomm_irq_handler_t handler, void *flexcommHandle);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
#endif /* _FSL_FLEXCOMM_H_*/
|
||||||
|
|
@ -0,0 +1,317 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016, Freescale Semiconductor, Inc.
|
||||||
|
* Copyright 2016-2020 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "fsl_gpio.h"
|
||||||
|
|
||||||
|
/* Component ID definition, used by tools. */
|
||||||
|
#ifndef FSL_COMPONENT_ID
|
||||||
|
#define FSL_COMPONENT_ID "platform.drivers.lpc_gpio"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Variables
|
||||||
|
******************************************************************************/
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
|
||||||
|
/*! @brief Array to map FGPIO instance number to clock name. */
|
||||||
|
static const clock_ip_name_t s_gpioClockName[] = GPIO_CLOCKS;
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
|
||||||
|
|
||||||
|
#if !(defined(FSL_FEATURE_GPIO_HAS_NO_RESET) && FSL_FEATURE_GPIO_HAS_NO_RESET)
|
||||||
|
/*! @brief Pointers to GPIO resets for each instance. */
|
||||||
|
static const reset_ip_name_t s_gpioResets[] = GPIO_RSTS_N;
|
||||||
|
#endif
|
||||||
|
/*******************************************************************************
|
||||||
|
* Prototypes
|
||||||
|
************ ******************************************************************/
|
||||||
|
/*!
|
||||||
|
* @brief Enable GPIO port clock.
|
||||||
|
*
|
||||||
|
* @param base GPIO peripheral base pointer.
|
||||||
|
* @param port GPIO port number.
|
||||||
|
*/
|
||||||
|
static void GPIO_EnablePortClock(GPIO_Type *base, uint32_t port);
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code
|
||||||
|
******************************************************************************/
|
||||||
|
static void GPIO_EnablePortClock(GPIO_Type *base, uint32_t port)
|
||||||
|
{
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
|
||||||
|
assert(port < ARRAY_SIZE(s_gpioClockName));
|
||||||
|
|
||||||
|
/* Upgate the GPIO clock */
|
||||||
|
CLOCK_EnableClock(s_gpioClockName[port]);
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* brief Initializes the GPIO peripheral.
|
||||||
|
*
|
||||||
|
* This function ungates the GPIO clock.
|
||||||
|
*
|
||||||
|
* param base GPIO peripheral base pointer.
|
||||||
|
* param port GPIO port number.
|
||||||
|
*/
|
||||||
|
void GPIO_PortInit(GPIO_Type *base, uint32_t port)
|
||||||
|
{
|
||||||
|
GPIO_EnablePortClock(base, port);
|
||||||
|
|
||||||
|
#if !(defined(FSL_FEATURE_GPIO_HAS_NO_RESET) && FSL_FEATURE_GPIO_HAS_NO_RESET)
|
||||||
|
/* Reset the GPIO module */
|
||||||
|
RESET_PeripheralReset(s_gpioResets[port]);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* brief Initializes a GPIO pin used by the board.
|
||||||
|
*
|
||||||
|
* To initialize the GPIO, define a pin configuration, either input or output, in the user file.
|
||||||
|
* Then, call the GPIO_PinInit() function.
|
||||||
|
*
|
||||||
|
* This is an example to define an input pin or output pin configuration:
|
||||||
|
* code
|
||||||
|
* Define a digital input pin configuration,
|
||||||
|
* gpio_pin_config_t config =
|
||||||
|
* {
|
||||||
|
* kGPIO_DigitalInput,
|
||||||
|
* 0,
|
||||||
|
* }
|
||||||
|
* Define a digital output pin configuration,
|
||||||
|
* gpio_pin_config_t config =
|
||||||
|
* {
|
||||||
|
* kGPIO_DigitalOutput,
|
||||||
|
* 0,
|
||||||
|
* }
|
||||||
|
* endcode
|
||||||
|
*
|
||||||
|
* param base GPIO peripheral base pointer(Typically GPIO)
|
||||||
|
* param port GPIO port number
|
||||||
|
* param pin GPIO pin number
|
||||||
|
* param config GPIO pin configuration pointer
|
||||||
|
*/
|
||||||
|
void GPIO_PinInit(GPIO_Type *base, uint32_t port, uint32_t pin, const gpio_pin_config_t *config)
|
||||||
|
{
|
||||||
|
GPIO_EnablePortClock(base, port);
|
||||||
|
|
||||||
|
if (config->pinDirection == kGPIO_DigitalInput)
|
||||||
|
{
|
||||||
|
#if defined(FSL_FEATURE_GPIO_DIRSET_AND_DIRCLR) && (FSL_FEATURE_GPIO_DIRSET_AND_DIRCLR)
|
||||||
|
base->DIRCLR[port] = 1UL << pin;
|
||||||
|
#else
|
||||||
|
base->DIR[port] &= ~(1UL << pin);
|
||||||
|
#endif /*FSL_FEATURE_GPIO_DIRSET_AND_DIRCLR*/
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Set default output value */
|
||||||
|
if (config->outputLogic == 0U)
|
||||||
|
{
|
||||||
|
base->CLR[port] = (1UL << pin);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
base->SET[port] = (1UL << pin);
|
||||||
|
}
|
||||||
|
/* Set pin direction */
|
||||||
|
#if defined(FSL_FEATURE_GPIO_DIRSET_AND_DIRCLR) && (FSL_FEATURE_GPIO_DIRSET_AND_DIRCLR)
|
||||||
|
base->DIRSET[port] = 1UL << pin;
|
||||||
|
#else
|
||||||
|
base->DIR[port] |= 1UL << pin;
|
||||||
|
#endif /*FSL_FEATURE_GPIO_DIRSET_AND_DIRCLR*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_GPIO_HAS_INTERRUPT) && FSL_FEATURE_GPIO_HAS_INTERRUPT
|
||||||
|
/*!
|
||||||
|
* @brief Set the configuration of pin interrupt.
|
||||||
|
*
|
||||||
|
* @param base GPIO base pointer.
|
||||||
|
* @param port GPIO port number
|
||||||
|
* @param pin GPIO pin number.
|
||||||
|
* @param config GPIO pin interrupt configuration..
|
||||||
|
*/
|
||||||
|
void GPIO_SetPinInterruptConfig(GPIO_Type *base, uint32_t port, uint32_t pin, gpio_interrupt_config_t *config)
|
||||||
|
{
|
||||||
|
base->INTEDG[port] = (base->INTEDG[port] & ~(1UL << pin)) | ((uint32_t)config->mode << pin);
|
||||||
|
|
||||||
|
base->INTPOL[port] = (base->INTPOL[port] & ~(1UL << pin)) | ((uint32_t)config->polarity << pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enables multiple pins interrupt.
|
||||||
|
*
|
||||||
|
* @param base GPIO base pointer.
|
||||||
|
* @param port GPIO port number.
|
||||||
|
* @param index GPIO interrupt number.
|
||||||
|
* @param mask GPIO pin number macro.
|
||||||
|
*/
|
||||||
|
void GPIO_PortEnableInterrupts(GPIO_Type *base, uint32_t port, uint32_t index, uint32_t mask)
|
||||||
|
{
|
||||||
|
if ((uint32_t)kGPIO_InterruptA == index)
|
||||||
|
{
|
||||||
|
base->INTENA[port] = base->INTENA[port] | mask;
|
||||||
|
}
|
||||||
|
else if ((uint32_t)kGPIO_InterruptB == index)
|
||||||
|
{
|
||||||
|
base->INTENB[port] = base->INTENB[port] | mask;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*Should not enter here*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Disables multiple pins interrupt.
|
||||||
|
*
|
||||||
|
* @param base GPIO base pointer.
|
||||||
|
* @param port GPIO port number.
|
||||||
|
* @param index GPIO interrupt number.
|
||||||
|
* @param mask GPIO pin number macro.
|
||||||
|
*/
|
||||||
|
void GPIO_PortDisableInterrupts(GPIO_Type *base, uint32_t port, uint32_t index, uint32_t mask)
|
||||||
|
{
|
||||||
|
if ((uint32_t)kGPIO_InterruptA == index)
|
||||||
|
{
|
||||||
|
base->INTENA[port] = base->INTENA[port] & ~mask;
|
||||||
|
}
|
||||||
|
else if ((uint32_t)kGPIO_InterruptB == index)
|
||||||
|
{
|
||||||
|
base->INTENB[port] = base->INTENB[port] & ~mask;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*Should not enter here*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Clears multiple pins interrupt flag. Status flags are cleared by
|
||||||
|
* writing a 1 to the corresponding bit position.
|
||||||
|
*
|
||||||
|
* @param base GPIO base pointer.
|
||||||
|
* @param port GPIO port number.
|
||||||
|
* @param index GPIO interrupt number.
|
||||||
|
* @param mask GPIO pin number macro.
|
||||||
|
*/
|
||||||
|
void GPIO_PortClearInterruptFlags(GPIO_Type *base, uint32_t port, uint32_t index, uint32_t mask)
|
||||||
|
{
|
||||||
|
if ((uint32_t)kGPIO_InterruptA == index)
|
||||||
|
{
|
||||||
|
base->INTSTATA[port] = mask;
|
||||||
|
}
|
||||||
|
else if ((uint32_t)kGPIO_InterruptB == index)
|
||||||
|
{
|
||||||
|
base->INTSTATB[port] = mask;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*Should not enter here*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @ Read port interrupt status.
|
||||||
|
*
|
||||||
|
* @param base GPIO base pointer.
|
||||||
|
* @param port GPIO port number
|
||||||
|
* @param index GPIO interrupt number.
|
||||||
|
* @retval masked GPIO status value
|
||||||
|
*/
|
||||||
|
uint32_t GPIO_PortGetInterruptStatus(GPIO_Type *base, uint32_t port, uint32_t index)
|
||||||
|
{
|
||||||
|
uint32_t status = 0U;
|
||||||
|
|
||||||
|
if ((uint32_t)kGPIO_InterruptA == index)
|
||||||
|
{
|
||||||
|
status = base->INTSTATA[port];
|
||||||
|
}
|
||||||
|
else if ((uint32_t)kGPIO_InterruptB == index)
|
||||||
|
{
|
||||||
|
status = base->INTSTATB[port];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*Should not enter here*/
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enables the specific pin interrupt.
|
||||||
|
*
|
||||||
|
* @param base GPIO base pointer.
|
||||||
|
* @param port GPIO port number.
|
||||||
|
* @param pin GPIO pin number.
|
||||||
|
* @param index GPIO interrupt number.
|
||||||
|
*/
|
||||||
|
void GPIO_PinEnableInterrupt(GPIO_Type *base, uint32_t port, uint32_t pin, uint32_t index)
|
||||||
|
{
|
||||||
|
if ((uint32_t)kGPIO_InterruptA == index)
|
||||||
|
{
|
||||||
|
base->INTENA[port] = base->INTENA[port] | (1UL << pin);
|
||||||
|
}
|
||||||
|
else if ((uint32_t)kGPIO_InterruptB == index)
|
||||||
|
{
|
||||||
|
base->INTENB[port] = base->INTENB[port] | (1UL << pin);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*Should not enter here*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Disables the specific pin interrupt.
|
||||||
|
*
|
||||||
|
* @param base GPIO base pointer.
|
||||||
|
* @param port GPIO port number.
|
||||||
|
* @param pin GPIO pin number.
|
||||||
|
* @param index GPIO interrupt number.
|
||||||
|
*/
|
||||||
|
void GPIO_PinDisableInterrupt(GPIO_Type *base, uint32_t port, uint32_t pin, uint32_t index)
|
||||||
|
{
|
||||||
|
if ((uint32_t)kGPIO_InterruptA == index)
|
||||||
|
{
|
||||||
|
base->INTENA[port] = base->INTENA[port] & ~(1UL << pin);
|
||||||
|
}
|
||||||
|
else if ((uint32_t)kGPIO_InterruptB == index)
|
||||||
|
{
|
||||||
|
base->INTENB[port] = base->INTENB[port] & ~(1UL << pin);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*Should not enter here*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Clears the specific pin interrupt flag. Status flags are cleared by
|
||||||
|
* writing a 1 to the corresponding bit position.
|
||||||
|
*
|
||||||
|
* @param base GPIO base pointer.
|
||||||
|
* @param port GPIO port number.
|
||||||
|
* @param index GPIO interrupt number.
|
||||||
|
* @param mask GPIO pin number macro.
|
||||||
|
*/
|
||||||
|
void GPIO_PinClearInterruptFlag(GPIO_Type *base, uint32_t port, uint32_t pin, uint32_t index)
|
||||||
|
{
|
||||||
|
if ((uint32_t)kGPIO_InterruptA == index)
|
||||||
|
{
|
||||||
|
base->INTSTATA[port] = 1UL << pin;
|
||||||
|
}
|
||||||
|
else if ((uint32_t)kGPIO_InterruptB == index)
|
||||||
|
{
|
||||||
|
base->INTSTATB[port] = 1UL << pin;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*Should not enter here*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* FSL_FEATURE_GPIO_HAS_INTERRUPT */
|
||||||
|
|
@ -0,0 +1,364 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016, Freescale Semiconductor, Inc.
|
||||||
|
* Copyright 2016-2020 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _LPC_GPIO_H_
|
||||||
|
#define _LPC_GPIO_H_
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @addtogroup lpc_gpio
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*! @file */
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/*! @name Driver version */
|
||||||
|
/*@{*/
|
||||||
|
/*! @brief LPC GPIO driver version. */
|
||||||
|
#define FSL_GPIO_DRIVER_VERSION (MAKE_VERSION(2, 1, 7))
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
/*! @brief LPC GPIO direction definition */
|
||||||
|
typedef enum _gpio_pin_direction
|
||||||
|
{
|
||||||
|
kGPIO_DigitalInput = 0U, /*!< Set current pin as digital input*/
|
||||||
|
kGPIO_DigitalOutput = 1U, /*!< Set current pin as digital output*/
|
||||||
|
} gpio_pin_direction_t;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief The GPIO pin configuration structure.
|
||||||
|
*
|
||||||
|
* Every pin can only be configured as either output pin or input pin at a time.
|
||||||
|
* If configured as a input pin, then leave the outputConfig unused.
|
||||||
|
*/
|
||||||
|
typedef struct _gpio_pin_config
|
||||||
|
{
|
||||||
|
gpio_pin_direction_t pinDirection; /*!< GPIO direction, input or output */
|
||||||
|
/* Output configurations, please ignore if configured as a input one */
|
||||||
|
uint8_t outputLogic; /*!< Set default output logic, no use in input */
|
||||||
|
} gpio_pin_config_t;
|
||||||
|
|
||||||
|
#if (defined(FSL_FEATURE_GPIO_HAS_INTERRUPT) && FSL_FEATURE_GPIO_HAS_INTERRUPT)
|
||||||
|
#define GPIO_PIN_INT_LEVEL 0x00U
|
||||||
|
#define GPIO_PIN_INT_EDGE 0x01U
|
||||||
|
|
||||||
|
#define PINT_PIN_INT_HIGH_OR_RISE_TRIGGER 0x00U
|
||||||
|
#define PINT_PIN_INT_LOW_OR_FALL_TRIGGER 0x01U
|
||||||
|
|
||||||
|
/*! @brief GPIO Pin Interrupt enable mode */
|
||||||
|
typedef enum _gpio_pin_enable_mode
|
||||||
|
{
|
||||||
|
kGPIO_PinIntEnableLevel = GPIO_PIN_INT_LEVEL, /*!< Generate Pin Interrupt on level mode */
|
||||||
|
kGPIO_PinIntEnableEdge = GPIO_PIN_INT_EDGE /*!< Generate Pin Interrupt on edge mode */
|
||||||
|
} gpio_pin_enable_mode_t;
|
||||||
|
|
||||||
|
/*! @brief GPIO Pin Interrupt enable polarity */
|
||||||
|
typedef enum _gpio_pin_enable_polarity
|
||||||
|
{
|
||||||
|
kGPIO_PinIntEnableHighOrRise =
|
||||||
|
PINT_PIN_INT_HIGH_OR_RISE_TRIGGER, /*!< Generate Pin Interrupt on high level or rising edge */
|
||||||
|
kGPIO_PinIntEnableLowOrFall =
|
||||||
|
PINT_PIN_INT_LOW_OR_FALL_TRIGGER /*!< Generate Pin Interrupt on low level or falling edge */
|
||||||
|
} gpio_pin_enable_polarity_t;
|
||||||
|
|
||||||
|
/*! @brief LPC GPIO interrupt index definition */
|
||||||
|
typedef enum _gpio_interrupt_index
|
||||||
|
{
|
||||||
|
kGPIO_InterruptA = 0U, /*!< Set current pin as interrupt A*/
|
||||||
|
kGPIO_InterruptB = 1U, /*!< Set current pin as interrupt B*/
|
||||||
|
} gpio_interrupt_index_t;
|
||||||
|
|
||||||
|
/*! @brief Configures the interrupt generation condition. */
|
||||||
|
typedef struct _gpio_interrupt_config
|
||||||
|
{
|
||||||
|
uint8_t mode; /* The trigger mode of GPIO interrupts */
|
||||||
|
uint8_t polarity; /* The polarity of GPIO interrupts */
|
||||||
|
} gpio_interrupt_config_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @name GPIO Configuration */
|
||||||
|
/*@{*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Initializes the GPIO peripheral.
|
||||||
|
*
|
||||||
|
* This function ungates the GPIO clock.
|
||||||
|
*
|
||||||
|
* @param base GPIO peripheral base pointer.
|
||||||
|
* @param port GPIO port number.
|
||||||
|
*/
|
||||||
|
void GPIO_PortInit(GPIO_Type *base, uint32_t port);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Initializes a GPIO pin used by the board.
|
||||||
|
*
|
||||||
|
* To initialize the GPIO, define a pin configuration, either input or output, in the user file.
|
||||||
|
* Then, call the GPIO_PinInit() function.
|
||||||
|
*
|
||||||
|
* This is an example to define an input pin or output pin configuration:
|
||||||
|
* @code
|
||||||
|
* Define a digital input pin configuration,
|
||||||
|
* gpio_pin_config_t config =
|
||||||
|
* {
|
||||||
|
* kGPIO_DigitalInput,
|
||||||
|
* 0,
|
||||||
|
* }
|
||||||
|
* Define a digital output pin configuration,
|
||||||
|
* gpio_pin_config_t config =
|
||||||
|
* {
|
||||||
|
* kGPIO_DigitalOutput,
|
||||||
|
* 0,
|
||||||
|
* }
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @param base GPIO peripheral base pointer(Typically GPIO)
|
||||||
|
* @param port GPIO port number
|
||||||
|
* @param pin GPIO pin number
|
||||||
|
* @param config GPIO pin configuration pointer
|
||||||
|
*/
|
||||||
|
void GPIO_PinInit(GPIO_Type *base, uint32_t port, uint32_t pin, const gpio_pin_config_t *config);
|
||||||
|
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
/*! @name GPIO Output Operations */
|
||||||
|
/*@{*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Sets the output level of the one GPIO pin to the logic 1 or 0.
|
||||||
|
*
|
||||||
|
* @param base GPIO peripheral base pointer(Typically GPIO)
|
||||||
|
* @param port GPIO port number
|
||||||
|
* @param pin GPIO pin number
|
||||||
|
* @param output GPIO pin output logic level.
|
||||||
|
* - 0: corresponding pin output low-logic level.
|
||||||
|
* - 1: corresponding pin output high-logic level.
|
||||||
|
*/
|
||||||
|
static inline void GPIO_PinWrite(GPIO_Type *base, uint32_t port, uint32_t pin, uint8_t output)
|
||||||
|
{
|
||||||
|
base->B[port][pin] = output;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*@}*/
|
||||||
|
/*! @name GPIO Input Operations */
|
||||||
|
/*@{*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reads the current input value of the GPIO PIN.
|
||||||
|
*
|
||||||
|
* @param base GPIO peripheral base pointer(Typically GPIO)
|
||||||
|
* @param port GPIO port number
|
||||||
|
* @param pin GPIO pin number
|
||||||
|
* @retval GPIO port input value
|
||||||
|
* - 0: corresponding pin input low-logic level.
|
||||||
|
* - 1: corresponding pin input high-logic level.
|
||||||
|
*/
|
||||||
|
static inline uint32_t GPIO_PinRead(GPIO_Type *base, uint32_t port, uint32_t pin)
|
||||||
|
{
|
||||||
|
return (uint32_t)base->B[port][pin];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Sets the output level of the multiple GPIO pins to the logic 1.
|
||||||
|
*
|
||||||
|
* @param base GPIO peripheral base pointer(Typically GPIO)
|
||||||
|
* @param port GPIO port number
|
||||||
|
* @param mask GPIO pin number macro
|
||||||
|
*/
|
||||||
|
static inline void GPIO_PortSet(GPIO_Type *base, uint32_t port, uint32_t mask)
|
||||||
|
{
|
||||||
|
base->SET[port] = mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Sets the output level of the multiple GPIO pins to the logic 0.
|
||||||
|
*
|
||||||
|
* @param base GPIO peripheral base pointer(Typically GPIO)
|
||||||
|
* @param port GPIO port number
|
||||||
|
* @param mask GPIO pin number macro
|
||||||
|
*/
|
||||||
|
static inline void GPIO_PortClear(GPIO_Type *base, uint32_t port, uint32_t mask)
|
||||||
|
{
|
||||||
|
base->CLR[port] = mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reverses current output logic of the multiple GPIO pins.
|
||||||
|
*
|
||||||
|
* @param base GPIO peripheral base pointer(Typically GPIO)
|
||||||
|
* @param port GPIO port number
|
||||||
|
* @param mask GPIO pin number macro
|
||||||
|
*/
|
||||||
|
static inline void GPIO_PortToggle(GPIO_Type *base, uint32_t port, uint32_t mask)
|
||||||
|
{
|
||||||
|
base->NOT[port] = mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reads the current input value of the whole GPIO port.
|
||||||
|
*
|
||||||
|
* @param base GPIO peripheral base pointer(Typically GPIO)
|
||||||
|
* @param port GPIO port number
|
||||||
|
*/
|
||||||
|
static inline uint32_t GPIO_PortRead(GPIO_Type *base, uint32_t port)
|
||||||
|
{
|
||||||
|
return (uint32_t)base->PIN[port];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*@}*/
|
||||||
|
/*! @name GPIO Mask Operations */
|
||||||
|
/*@{*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Sets port mask, 0 - enable pin, 1 - disable pin.
|
||||||
|
*
|
||||||
|
* @param base GPIO peripheral base pointer(Typically GPIO)
|
||||||
|
* @param port GPIO port number
|
||||||
|
* @param mask GPIO pin number macro
|
||||||
|
*/
|
||||||
|
static inline void GPIO_PortMaskedSet(GPIO_Type *base, uint32_t port, uint32_t mask)
|
||||||
|
{
|
||||||
|
base->MASK[port] = mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Sets the output level of the masked GPIO port. Only pins enabled by GPIO_SetPortMask() will be affected.
|
||||||
|
*
|
||||||
|
* @param base GPIO peripheral base pointer(Typically GPIO)
|
||||||
|
* @param port GPIO port number
|
||||||
|
* @param output GPIO port output value.
|
||||||
|
*/
|
||||||
|
static inline void GPIO_PortMaskedWrite(GPIO_Type *base, uint32_t port, uint32_t output)
|
||||||
|
{
|
||||||
|
base->MPIN[port] = output;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reads the current input value of the masked GPIO port. Only pins enabled by GPIO_SetPortMask() will be
|
||||||
|
* affected.
|
||||||
|
*
|
||||||
|
* @param base GPIO peripheral base pointer(Typically GPIO)
|
||||||
|
* @param port GPIO port number
|
||||||
|
* @retval masked GPIO port value
|
||||||
|
*/
|
||||||
|
static inline uint32_t GPIO_PortMaskedRead(GPIO_Type *base, uint32_t port)
|
||||||
|
{
|
||||||
|
return (uint32_t)base->MPIN[port];
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_GPIO_HAS_INTERRUPT) && FSL_FEATURE_GPIO_HAS_INTERRUPT
|
||||||
|
/*!
|
||||||
|
* @brief Set the configuration of pin interrupt.
|
||||||
|
*
|
||||||
|
* @param base GPIO base pointer.
|
||||||
|
* @param port GPIO port number
|
||||||
|
* @param pin GPIO pin number.
|
||||||
|
* @param config GPIO pin interrupt configuration..
|
||||||
|
*/
|
||||||
|
void GPIO_SetPinInterruptConfig(GPIO_Type *base, uint32_t port, uint32_t pin, gpio_interrupt_config_t *config);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enables multiple pins interrupt.
|
||||||
|
*
|
||||||
|
* @param base GPIO base pointer.
|
||||||
|
* @param port GPIO port number.
|
||||||
|
* @param index GPIO interrupt number.
|
||||||
|
* @param mask GPIO pin number macro.
|
||||||
|
*/
|
||||||
|
void GPIO_PortEnableInterrupts(GPIO_Type *base, uint32_t port, uint32_t index, uint32_t mask);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Disables multiple pins interrupt.
|
||||||
|
*
|
||||||
|
* @param base GPIO base pointer.
|
||||||
|
* @param port GPIO port number.
|
||||||
|
* @param index GPIO interrupt number.
|
||||||
|
* @param mask GPIO pin number macro.
|
||||||
|
*/
|
||||||
|
void GPIO_PortDisableInterrupts(GPIO_Type *base, uint32_t port, uint32_t index, uint32_t mask);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Clears pin interrupt flag. Status flags are cleared by
|
||||||
|
* writing a 1 to the corresponding bit position.
|
||||||
|
*
|
||||||
|
* @param base GPIO base pointer.
|
||||||
|
* @param port GPIO port number.
|
||||||
|
* @param index GPIO interrupt number.
|
||||||
|
* @param mask GPIO pin number macro.
|
||||||
|
*/
|
||||||
|
void GPIO_PortClearInterruptFlags(GPIO_Type *base, uint32_t port, uint32_t index, uint32_t mask);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @ Read port interrupt status.
|
||||||
|
*
|
||||||
|
* @param base GPIO base pointer.
|
||||||
|
* @param port GPIO port number
|
||||||
|
* @param index GPIO interrupt number.
|
||||||
|
* @retval masked GPIO status value
|
||||||
|
*/
|
||||||
|
uint32_t GPIO_PortGetInterruptStatus(GPIO_Type *base, uint32_t port, uint32_t index);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enables the specific pin interrupt.
|
||||||
|
*
|
||||||
|
* @param base GPIO base pointer.
|
||||||
|
* @param port GPIO port number.
|
||||||
|
* @param pin GPIO pin number.
|
||||||
|
* @param index GPIO interrupt number.
|
||||||
|
*/
|
||||||
|
void GPIO_PinEnableInterrupt(GPIO_Type *base, uint32_t port, uint32_t pin, uint32_t index);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Disables the specific pin interrupt.
|
||||||
|
*
|
||||||
|
* @param base GPIO base pointer.
|
||||||
|
* @param port GPIO port number.
|
||||||
|
* @param pin GPIO pin number.
|
||||||
|
* @param index GPIO interrupt number.
|
||||||
|
*/
|
||||||
|
void GPIO_PinDisableInterrupt(GPIO_Type *base, uint32_t port, uint32_t pin, uint32_t index);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Clears the specific pin interrupt flag. Status flags are cleared by
|
||||||
|
* writing a 1 to the corresponding bit position.
|
||||||
|
*
|
||||||
|
* @param base GPIO base pointer.
|
||||||
|
* @param port GPIO port number.
|
||||||
|
* @param pin GPIO pin number.
|
||||||
|
* @param index GPIO interrupt number.
|
||||||
|
*/
|
||||||
|
void GPIO_PinClearInterruptFlag(GPIO_Type *base, uint32_t port, uint32_t pin, uint32_t index);
|
||||||
|
|
||||||
|
#endif /* FSL_FEATURE_GPIO_HAS_INTERRUPT */
|
||||||
|
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* _LPC_GPIO_H_*/
|
||||||
|
|
@ -0,0 +1,135 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016, Freescale Semiconductor, Inc.
|
||||||
|
* Copyright 2016-2021 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "fsl_inputmux.h"
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/* Component ID definition, used by tools. */
|
||||||
|
#ifndef FSL_COMPONENT_ID
|
||||||
|
#define FSL_COMPONENT_ID "platform.drivers.inputmux"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* brief Initialize INPUTMUX peripheral.
|
||||||
|
|
||||||
|
* This function enables the INPUTMUX clock.
|
||||||
|
*
|
||||||
|
* param base Base address of the INPUTMUX peripheral.
|
||||||
|
*
|
||||||
|
* retval None.
|
||||||
|
*/
|
||||||
|
void INPUTMUX_Init(INPUTMUX_Type *base)
|
||||||
|
{
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
|
||||||
|
#if defined(FSL_FEATURE_INPUTMUX_HAS_NO_INPUTMUX_CLOCK_SOURCE) && FSL_FEATURE_INPUTMUX_HAS_NO_INPUTMUX_CLOCK_SOURCE
|
||||||
|
CLOCK_EnableClock(kCLOCK_Sct);
|
||||||
|
CLOCK_EnableClock(kCLOCK_Dma);
|
||||||
|
#else
|
||||||
|
CLOCK_EnableClock(kCLOCK_InputMux);
|
||||||
|
#endif /* FSL_FEATURE_INPUTMUX_HAS_NO_INPUTMUX_CLOCK_SOURCE */
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* brief Attaches a signal
|
||||||
|
*
|
||||||
|
* This function gates the INPUTPMUX clock.
|
||||||
|
*
|
||||||
|
* param base Base address of the INPUTMUX peripheral.
|
||||||
|
* param index Destination peripheral to attach the signal to.
|
||||||
|
* param connection Selects connection.
|
||||||
|
*
|
||||||
|
* retval None.
|
||||||
|
*/
|
||||||
|
void INPUTMUX_AttachSignal(INPUTMUX_Type *base, uint32_t index, inputmux_connection_t connection)
|
||||||
|
{
|
||||||
|
uint32_t pmux_id;
|
||||||
|
uint32_t output_id;
|
||||||
|
|
||||||
|
/* extract pmux to be used */
|
||||||
|
pmux_id = ((uint32_t)(connection)) >> PMUX_SHIFT;
|
||||||
|
/* extract function number */
|
||||||
|
output_id = ((uint32_t)(connection)) & ((1UL << PMUX_SHIFT) - 1U);
|
||||||
|
/* programm signal */
|
||||||
|
*(volatile uint32_t *)(((uint32_t)base) + pmux_id + (index * 4U)) = output_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_INPUTMUX_HAS_SIGNAL_ENA)
|
||||||
|
/*!
|
||||||
|
* brief Enable/disable a signal
|
||||||
|
*
|
||||||
|
* This function gates the INPUTPMUX clock.
|
||||||
|
*
|
||||||
|
* param base Base address of the INPUTMUX peripheral.
|
||||||
|
* param signal Enable signal register id and bit offset.
|
||||||
|
* param enable Selects enable or disable.
|
||||||
|
*
|
||||||
|
* retval None.
|
||||||
|
*/
|
||||||
|
void INPUTMUX_EnableSignal(INPUTMUX_Type *base, inputmux_signal_t signal, bool enable)
|
||||||
|
{
|
||||||
|
uint32_t ena_id;
|
||||||
|
uint32_t ena_id_mask = (1UL << (32U - ENA_SHIFT)) - 1U;
|
||||||
|
uint32_t bit_offset;
|
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_INPUTMUX_HAS_CHANNEL_MUX) && FSL_FEATURE_INPUTMUX_HAS_CHANNEL_MUX
|
||||||
|
uint32_t chmux_offset;
|
||||||
|
uint32_t chmux_value;
|
||||||
|
|
||||||
|
/* Only enable need to update channel mux */
|
||||||
|
if (enable && ((((uint32_t)signal) & (1UL << CHMUX_AVL_SHIFT)) != 0U))
|
||||||
|
{
|
||||||
|
chmux_offset = (((uint32_t)signal) >> CHMUX_OFF_SHIFT) & ((1UL << (CHMUX_AVL_SHIFT - CHMUX_OFF_SHIFT)) - 1UL);
|
||||||
|
chmux_value = (((uint32_t)signal) >> CHMUX_VAL_SHIFT) & ((1UL << (CHMUX_OFF_SHIFT - CHMUX_VAL_SHIFT)) - 1UL);
|
||||||
|
*(volatile uint32_t *)(((uint32_t)base) + chmux_offset) = chmux_value;
|
||||||
|
}
|
||||||
|
ena_id_mask = (1UL << (CHMUX_VAL_SHIFT - ENA_SHIFT)) - 1U;
|
||||||
|
#endif
|
||||||
|
/* extract enable register to be used */
|
||||||
|
ena_id = (((uint32_t)signal) >> ENA_SHIFT) & ena_id_mask;
|
||||||
|
/* extract enable bit offset */
|
||||||
|
bit_offset = ((uint32_t)signal) & ((1UL << ENA_SHIFT) - 1U);
|
||||||
|
/* set signal */
|
||||||
|
if (enable)
|
||||||
|
{
|
||||||
|
*(volatile uint32_t *)(((uint32_t)base) + ena_id) |= (1UL << bit_offset);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*(volatile uint32_t *)(((uint32_t)base) + ena_id) &= ~(1UL << bit_offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* brief Deinitialize INPUTMUX peripheral.
|
||||||
|
|
||||||
|
* This function disables the INPUTMUX clock.
|
||||||
|
*
|
||||||
|
* param base Base address of the INPUTMUX peripheral.
|
||||||
|
*
|
||||||
|
* retval None.
|
||||||
|
*/
|
||||||
|
void INPUTMUX_Deinit(INPUTMUX_Type *base)
|
||||||
|
{
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
|
||||||
|
#if defined(FSL_FEATURE_INPUTMUX_HAS_NO_INPUTMUX_CLOCK_SOURCE) && FSL_FEATURE_INPUTMUX_HAS_NO_INPUTMUX_CLOCK_SOURCE
|
||||||
|
CLOCK_DisableClock(kCLOCK_Sct);
|
||||||
|
CLOCK_DisableClock(kCLOCK_Dma);
|
||||||
|
#else
|
||||||
|
CLOCK_DisableClock(kCLOCK_InputMux);
|
||||||
|
#endif /* FSL_FEATURE_INPUTMUX_HAS_NO_INPUTMUX_CLOCK_SOURCE */
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,97 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016, Freescale Semiconductor, Inc.
|
||||||
|
* Copyright 2016-2021 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _FSL_INPUTMUX_H_
|
||||||
|
#define _FSL_INPUTMUX_H_
|
||||||
|
|
||||||
|
#include "fsl_inputmux_connections.h"
|
||||||
|
#include "fsl_common.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @addtogroup inputmux_driver
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*! @file */
|
||||||
|
/*! @file fsl_inputmux_connections.h */
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/*! @name Driver version */
|
||||||
|
/*@{*/
|
||||||
|
/*! @brief Group interrupt driver version for SDK */
|
||||||
|
#define FSL_INPUTMUX_DRIVER_VERSION (MAKE_VERSION(2, 0, 4))
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Initialize INPUTMUX peripheral.
|
||||||
|
|
||||||
|
* This function enables the INPUTMUX clock.
|
||||||
|
*
|
||||||
|
* @param base Base address of the INPUTMUX peripheral.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
void INPUTMUX_Init(INPUTMUX_Type *base);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Attaches a signal
|
||||||
|
*
|
||||||
|
* This function gates the INPUTPMUX clock.
|
||||||
|
*
|
||||||
|
* @param base Base address of the INPUTMUX peripheral.
|
||||||
|
* @param index Destination peripheral to attach the signal to.
|
||||||
|
* @param connection Selects connection.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
void INPUTMUX_AttachSignal(INPUTMUX_Type *base, uint32_t index, inputmux_connection_t connection);
|
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_INPUTMUX_HAS_SIGNAL_ENA)
|
||||||
|
/*!
|
||||||
|
* @brief Enable/disable a signal
|
||||||
|
*
|
||||||
|
* This function gates the INPUTPMUX clock.
|
||||||
|
*
|
||||||
|
* @param base Base address of the INPUTMUX peripheral.
|
||||||
|
* @param signal Enable signal register id and bit offset.
|
||||||
|
* @param enable Selects enable or disable.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
void INPUTMUX_EnableSignal(INPUTMUX_Type *base, inputmux_signal_t signal, bool enable);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Deinitialize INPUTMUX peripheral.
|
||||||
|
|
||||||
|
* This function disables the INPUTMUX clock.
|
||||||
|
*
|
||||||
|
* @param base Base address of the INPUTMUX peripheral.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
void INPUTMUX_Deinit(INPUTMUX_Type *base);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
#endif /* _FSL_INPUTMUX_H_ */
|
||||||
|
|
@ -0,0 +1,496 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016, Freescale Semiconductor, Inc.
|
||||||
|
* Copyright 2016, NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _FSL_INPUTMUX_CONNECTIONS_
|
||||||
|
#define _FSL_INPUTMUX_CONNECTIONS_
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
/* Component ID definition, used by tools. */
|
||||||
|
#ifndef FSL_COMPONENT_ID
|
||||||
|
#define FSL_COMPONENT_ID "platform.drivers.inputmux_connections"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @addtogroup inputmux_driver
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Input multiplexing connections
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*! @brief Periphinmux IDs */
|
||||||
|
#define SCT0_INMUX0 0x00U
|
||||||
|
#define TIMER0CAPTSEL0 0x20U
|
||||||
|
#define TIMER1CAPTSEL0 0x40U
|
||||||
|
#define TIMER2CAPTSEL0 0x60U
|
||||||
|
#define PINTSEL_PMUX_ID 0xC0U
|
||||||
|
#define PINTSEL0 0xC0U
|
||||||
|
#define DMA0_ITRIG_INMUX0 0xE0U
|
||||||
|
#define DMA0_OTRIG_INMUX0 0x160U
|
||||||
|
#define FREQMEAS_REF_REG 0x180U
|
||||||
|
#define FREQMEAS_TARGET_REG 0x184U
|
||||||
|
#define TIMER3CAPTSEL0 0x1A0U
|
||||||
|
#define TIMER4CAPTSEL0 0x1C0U
|
||||||
|
#define PINTSECSEL0 0x1E0U
|
||||||
|
#define DMA1_ITRIG_INMUX0 0x200U
|
||||||
|
#define DMA1_OTRIG_INMUX0 0x240U
|
||||||
|
#define DMA0_REQ_ENA_ID 0x740U
|
||||||
|
#define DMA1_REQ_ENA_ID 0x760U
|
||||||
|
#define DMA0_ITRIG_ENA_ID 0x780U
|
||||||
|
#define DMA1_ITRIG_ENA_ID 0x7A0U
|
||||||
|
#define ENA_SHIFT 8U
|
||||||
|
#define PMUX_SHIFT 20U
|
||||||
|
|
||||||
|
/*! @brief INPUTMUX connections type */
|
||||||
|
typedef enum _inputmux_connection_t
|
||||||
|
{
|
||||||
|
/*!< SCT0 INMUX. */
|
||||||
|
kINPUTMUX_SctGpi0ToSct0 = 0U + (SCT0_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_SctGpi1ToSct0 = 1U + (SCT0_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_SctGpi2ToSct0 = 2U + (SCT0_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_SctGpi3ToSct0 = 3U + (SCT0_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_SctGpi4ToSct0 = 4U + (SCT0_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_SctGpi5ToSct0 = 5U + (SCT0_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_SctGpi6ToSct0 = 6U + (SCT0_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_SctGpi7ToSct0 = 7U + (SCT0_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Ctimer0M0ToSct0 = 8U + (SCT0_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Ctimer1M0ToSct0 = 9U + (SCT0_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Ctimer2M0ToSct0 = 10U + (SCT0_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Ctimer3M0ToSct0 = 11U + (SCT0_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Ctimer4M0ToSct0 = 12U + (SCT0_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_AdcIrqToSct0 = 13U + (SCT0_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpiointBmatchToSct0 = 14U + (SCT0_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Usb0FrameToggleToSct0 = 15U + (SCT0_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Usb1FrameToggleToSct0 = 16U + (SCT0_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CompOutToSct0 = 17U + (SCT0_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_I2sSharedSck0ToSct0 = 18U + (SCT0_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_I2sSharedSck1ToSct0 = 19U + (SCT0_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_I2sSharedWs0ToSct0 = 20U + (SCT0_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_I2sSharedWs1ToSct0 = 21U + (SCT0_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_ArmTxevToSct0 = 22U + (SCT0_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_DebugHaltedToSct0 = 23U + (SCT0_INMUX0 << PMUX_SHIFT),
|
||||||
|
|
||||||
|
/*!< TIMER0 CAPTSEL. */
|
||||||
|
kINPUTMUX_CtimerInp0ToTimer0Captsel = 0U + (TIMER0CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp1ToTimer0Captsel = 1U + (TIMER0CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp2ToTimer0Captsel = 2U + (TIMER0CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp3ToTimer0Captsel = 3U + (TIMER0CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp4ToTimer0Captsel = 4U + (TIMER0CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp5ToTimer0Captsel = 5U + (TIMER0CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp6ToTimer0Captsel = 6U + (TIMER0CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp7ToTimer0Captsel = 7U + (TIMER0CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp8ToTimer0Captsel = 8U + (TIMER0CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp9ToTimer0Captsel = 9U + (TIMER0CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp10ToTimer0Captsel = 10U + (TIMER0CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp11ToTimer0Captsel = 11U + (TIMER0CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp12ToTimer0Captsel = 12U + (TIMER0CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp13ToTimer0Captsel = 13U + (TIMER0CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp14ToTimer0Captsel = 14U + (TIMER0CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp15ToTimer0Captsel = 15U + (TIMER0CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp16ToTimer0Captsel = 16U + (TIMER0CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp17ToTimer0Captsel = 17U + (TIMER0CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp18ToTimer0Captsel = 18U + (TIMER0CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp19ToTimer0Captsel = 19U + (TIMER0CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Usb0FrameToggleToTimer0Captsel = 20U + (TIMER0CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Usb1FrameToggleToTimer0Captsel = 21U + (TIMER0CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CompOutToTimer0Captsel = 22U + (TIMER0CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_I2sSharedWs0ToTimer0Captsel = 23U + (TIMER0CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_I2sSharedWs1ToTimer0Captsel = 24U + (TIMER0CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
|
||||||
|
/*!< TIMER1 CAPTSEL. */
|
||||||
|
kINPUTMUX_CtimerInp0ToTimer1Captsel = 0U + (TIMER1CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp1ToTimer1Captsel = 1U + (TIMER1CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp2ToTimer1Captsel = 2U + (TIMER1CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp3ToTimer1Captsel = 3U + (TIMER1CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp4ToTimer1Captsel = 4U + (TIMER1CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp5ToTimer1Captsel = 5U + (TIMER1CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp6ToTimer1Captsel = 6U + (TIMER1CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp7ToTimer1Captsel = 7U + (TIMER1CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp8ToTimer1Captsel = 8U + (TIMER1CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp9ToTimer1Captsel = 9U + (TIMER1CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp10ToTimer1Captsel = 10U + (TIMER1CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp11ToTimer1Captsel = 11U + (TIMER1CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp12ToTimer1Captsel = 12U + (TIMER1CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp13ToTimer1Captsel = 13U + (TIMER1CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp14ToTimer1Captsel = 14U + (TIMER1CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp15ToTimer1Captsel = 15U + (TIMER1CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp16ToTimer1Captsel = 16U + (TIMER1CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp17ToTimer1Captsel = 17U + (TIMER1CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp18ToTimer1Captsel = 18U + (TIMER1CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp19ToTimer1Captsel = 19U + (TIMER1CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Usb0FrameToggleToTimer1Captsel = 20U + (TIMER1CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Usb1FrameToggleToTimer1Captsel = 21U + (TIMER1CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CompOutToTimer1Captsel = 22U + (TIMER1CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_I2sSharedWs0ToTimer1Captsel = 23U + (TIMER1CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_I2sSharedWs1ToTimer1Captsel = 24U + (TIMER1CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
|
||||||
|
/*!< TIMER2 CAPTSEL. */
|
||||||
|
kINPUTMUX_CtimerInp0ToTimer2Captsel = 0U + (TIMER2CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp1ToTimer2Captsel = 1U + (TIMER2CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp2ToTimer2Captsel = 2U + (TIMER2CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp3ToTimer2Captsel = 3U + (TIMER2CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp4ToTimer2Captsel = 4U + (TIMER2CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp5ToTimer2Captsel = 5U + (TIMER2CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp6ToTimer2Captsel = 6U + (TIMER2CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp7ToTimer2Captsel = 7U + (TIMER2CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp8ToTimer2Captsel = 8U + (TIMER2CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp9ToTimer2Captsel = 9U + (TIMER2CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp10ToTimer2Captsel = 10U + (TIMER2CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp11ToTimer2Captsel = 11U + (TIMER2CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp12ToTimer2Captsel = 12U + (TIMER2CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp13ToTimer2Captsel = 13U + (TIMER2CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp14ToTimer2Captsel = 14U + (TIMER2CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp15ToTimer2Captsel = 15U + (TIMER2CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp16ToTimer2Captsel = 16U + (TIMER2CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp17ToTimer2Captsel = 17U + (TIMER2CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp18ToTimer2Captsel = 18U + (TIMER2CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp19ToTimer2Captsel = 19U + (TIMER2CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Usb0FrameToggleToTimer2Captsel = 20U + (TIMER2CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Usb1FrameToggleToTimer2Captsel = 21U + (TIMER2CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CompOutToTimer2Captsel = 22U + (TIMER2CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_I2sSharedWs0ToTimer2Captsel = 23U + (TIMER2CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_I2sSharedWs1ToTimer2Captsel = 24U + (TIMER2CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
|
||||||
|
/*!< Pin interrupt select. */
|
||||||
|
kINPUTMUX_GpioPort0Pin0ToPintsel = 0U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin1ToPintsel = 1U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin2ToPintsel = 2U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin3ToPintsel = 3U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin4ToPintsel = 4U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin5ToPintsel = 5U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin6ToPintsel = 6U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin7ToPintsel = 7U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin8ToPintsel = 8U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin9ToPintsel = 9U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin10ToPintsel = 10U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin11ToPintsel = 11U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin12ToPintsel = 12U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin13ToPintsel = 13U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin14ToPintsel = 14U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin15ToPintsel = 15U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin16ToPintsel = 16U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin17ToPintsel = 17U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin18ToPintsel = 18U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin19ToPintsel = 19U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin20ToPintsel = 20U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin21ToPintsel = 21U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin22ToPintsel = 22U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin23ToPintsel = 23U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin24ToPintsel = 24U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin25ToPintsel = 25U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin26ToPintsel = 26U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin27ToPintsel = 27U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin28ToPintsel = 28U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin29ToPintsel = 29U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin30ToPintsel = 30U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin31ToPintsel = 31U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin0ToPintsel = 32U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin1ToPintsel = 33U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin2ToPintsel = 34U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin3ToPintsel = 35U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin4ToPintsel = 36U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin5ToPintsel = 37U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin6ToPintsel = 38U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin7ToPintsel = 39U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin8ToPintsel = 40U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin9ToPintsel = 41U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin10ToPintsel = 42U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin11ToPintsel = 43U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin12ToPintsel = 44U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin13ToPintsel = 45U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin14ToPintsel = 46U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin15ToPintsel = 47U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin16ToPintsel = 48U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin17ToPintsel = 49U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin18ToPintsel = 50U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin19ToPintsel = 51U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin20ToPintsel = 52U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin21ToPintsel = 53U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin22ToPintsel = 54U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin23ToPintsel = 55U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin24ToPintsel = 56U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin25ToPintsel = 57U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin26ToPintsel = 58U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin27ToPintsel = 59U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin28ToPintsel = 60U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin29ToPintsel = 61U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin30ToPintsel = 62U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort1Pin31ToPintsel = 63U + (PINTSEL0 << PMUX_SHIFT),
|
||||||
|
|
||||||
|
/*!< DMA0 Input trigger. */
|
||||||
|
kINPUTMUX_PinInt0ToDma0 = 0U + (DMA0_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_PinInt1ToDma0 = 1U + (DMA0_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_PinInt2ToDma0 = 2U + (DMA0_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_PinInt3ToDma0 = 3U + (DMA0_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Ctimer0M0ToDma0 = 4U + (DMA0_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Ctimer0M1ToDma0 = 5U + (DMA0_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Ctimer1M0ToDma0 = 6U + (DMA0_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Ctimer1M1ToDma0 = 7U + (DMA0_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Ctimer2M0ToDma0 = 8U + (DMA0_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Ctimer2M1ToDma0 = 9U + (DMA0_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Ctimer3M0ToDma0 = 10U + (DMA0_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Ctimer3M1ToDma0 = 11U + (DMA0_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Ctimer4M0ToDma0 = 12U + (DMA0_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Ctimer4M1ToDma0 = 13U + (DMA0_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CompOutToDma0 = 14U + (DMA0_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Otrig0ToDma0 = 15U + (DMA0_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Otrig1ToDma0 = 16U + (DMA0_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Otrig2ToDma0 = 17U + (DMA0_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Otrig3ToDma0 = 18U + (DMA0_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Sct0DmaReq0ToDma0 = 19U + (DMA0_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Sct0DmaReq1ToDma0 = 20U + (DMA0_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_HashDmaRxToDma0 = 21U + (DMA0_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
|
||||||
|
/*!< DMA0 output trigger. */
|
||||||
|
kINPUTMUX_Dma0Hash0TxTrigoutToTriginChannels = 0U + (DMA0_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma0HsLspiRxTrigoutToTriginChannels = 2U + (DMA0_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma0HsLspiTxTrigoutToTriginChannels = 3U + (DMA0_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma0Flexcomm0RxTrigoutToTriginChannels = 4U + (DMA0_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma0Flexcomm0TxTrigoutToTriginChannels = 5U + (DMA0_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma0Flexcomm1RxTrigoutToTriginChannels = 6U + (DMA0_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma0Flexcomm1TxTrigoutToTriginChannels = 7U + (DMA0_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma0Flexcomm3RxTrigoutToTriginChannels = 8U + (DMA0_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma0Flexcomm3TxTrigoutToTriginChannels = 9U + (DMA0_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma0Flexcomm2RxTrigoutToTriginChannels = 10U + (DMA0_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma0Flexcomm2TxTrigoutToTriginChannels = 11U + (DMA0_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma0Flexcomm4RxTrigoutToTriginChannels = 12U + (DMA0_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma0Flexcomm4TxTrigoutToTriginChannels = 13U + (DMA0_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma0Flexcomm5RxTrigoutToTriginChannels = 14U + (DMA0_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma0Flexcomm5TxTrigoutToTriginChannels = 15U + (DMA0_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma0Flexcomm6RxTrigoutToTriginChannels = 16U + (DMA0_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma0Flexcomm6TxTrigoutToTriginChannels = 17U + (DMA0_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma0Flexcomm7RxTrigoutToTriginChannels = 18U + (DMA0_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma0Flexcomm7TxTrigoutToTriginChannels = 19U + (DMA0_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma0Adc0Ch0TrigoutToTriginChannels = 21U + (DMA0_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma0Adc0Ch1TrigoutToTriginChannels = 22U + (DMA0_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
|
||||||
|
/*!< Selection for frequency measurement reference clock. */
|
||||||
|
kINPUTMUX_ExternOscToFreqmeasRef = 0U + (FREQMEAS_REF_REG << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Fro12MhzToFreqmeasRef = 1u + (FREQMEAS_REF_REG << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Fro96MhzToFreqmeasRef = 2u + (FREQMEAS_REF_REG << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_WdtOscToFreqmeasRef = 3u + (FREQMEAS_REF_REG << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_32KhzOscToFreqmeasRef = 4u + (FREQMEAS_REF_REG << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_MainClkToFreqmeasRef = 5u + (FREQMEAS_REF_REG << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_FreqmeGpioClk_aRef = 6u + (FREQMEAS_REF_REG << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_FreqmeGpioClk_bRef = 7u + (FREQMEAS_REF_REG << PMUX_SHIFT),
|
||||||
|
|
||||||
|
/*!< Selection for frequency measurement target clock. */
|
||||||
|
kINPUTMUX_ExternOscToFreqmeasTarget = 0U + (FREQMEAS_TARGET_REG << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Fro12MhzToFreqmeasTarget = 1u + (FREQMEAS_TARGET_REG << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Fro96MhzToFreqmeasTarget = 2u + (FREQMEAS_TARGET_REG << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_WdtOscToFreqmeasTarget = 3u + (FREQMEAS_TARGET_REG << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_32KhzOscToFreqmeasTarget = 4u + (FREQMEAS_TARGET_REG << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_MainClkToFreqmeasTarget = 5u + (FREQMEAS_TARGET_REG << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_FreqmeGpioClk_aTarget = 6u + (FREQMEAS_TARGET_REG << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_FreqmeGpioClk_bTarget = 7u + (FREQMEAS_TARGET_REG << PMUX_SHIFT),
|
||||||
|
|
||||||
|
/*!< TIMER3 CAPTSEL. */
|
||||||
|
kINPUTMUX_CtimerInp0ToTimer3Captsel = 0U + (TIMER3CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp1ToTimer3Captsel = 1U + (TIMER3CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp2ToTimer3Captsel = 2U + (TIMER3CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp3ToTimer3Captsel = 3U + (TIMER3CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp4ToTimer3Captsel = 4U + (TIMER3CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp5ToTimer3Captsel = 5U + (TIMER3CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp6ToTimer3Captsel = 6U + (TIMER3CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp7ToTimer3Captsel = 7U + (TIMER3CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp8ToTimer3Captsel = 8U + (TIMER3CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp9ToTimer3Captsel = 9U + (TIMER3CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp10ToTimer3Captsel = 10U + (TIMER3CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp11ToTimer3Captsel = 11U + (TIMER3CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp12ToTimer3Captsel = 12U + (TIMER3CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp13ToTimer3Captsel = 13U + (TIMER3CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp14ToTimer3Captsel = 14U + (TIMER3CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp15ToTimer3Captsel = 15U + (TIMER3CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp16ToTimer3Captsel = 16U + (TIMER3CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp17ToTimer3Captsel = 17U + (TIMER3CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp18ToTimer3Captsel = 18U + (TIMER3CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp19ToTimer3Captsel = 19U + (TIMER3CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Usb0FrameToggleToTimer3Captsel = 20U + (TIMER3CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Usb1FrameToggleToTimer3Captsel = 21U + (TIMER3CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CompOutToTimer3Captsel = 22U + (TIMER3CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_I2sSharedWs0ToTimer3Captsel = 23U + (TIMER3CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_I2sSharedWs1ToTimer3Captsel = 24U + (TIMER3CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
|
||||||
|
/*!< Timer4 CAPTSEL. */
|
||||||
|
kINPUTMUX_CtimerInp0ToTimer4Captsel = 0U + (TIMER4CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp1ToTimer4Captsel = 1U + (TIMER4CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp2ToTimer4Captsel = 2U + (TIMER4CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp3ToTimer4Captsel = 3U + (TIMER4CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp4ToTimer4Captsel = 4U + (TIMER4CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp5ToTimer4Captsel = 5U + (TIMER4CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp6ToTimer4Captsel = 6U + (TIMER4CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp7ToTimer4Captsel = 7U + (TIMER4CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp8ToTimer4Captsel = 8U + (TIMER4CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp9ToTimer4Captsel = 9U + (TIMER4CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp10ToTimer4Captsel = 10U + (TIMER4CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp11ToTimer4Captsel = 11U + (TIMER4CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp12ToTimer4Captsel = 12U + (TIMER4CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp13ToTimer4Captsel = 13U + (TIMER4CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp14ToTimer4Captsel = 14U + (TIMER4CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp15ToTimer4Captsel = 15U + (TIMER4CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp16ToTimer4Captsel = 16U + (TIMER4CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp17ToTimer4Captsel = 17U + (TIMER4CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp18ToTimer4Captsel = 18U + (TIMER4CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CtimerInp19ToTimer4Captsel = 19U + (TIMER4CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Usb0FrameToggleToTimer4Captsel = 20U + (TIMER4CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Usb1FrameToggleToTimer4Captsel = 21U + (TIMER4CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_CompOutToTimer4Captsel = 22U + (TIMER4CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_I2sSharedWs0ToTimer4Captsel = 23U + (TIMER4CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_I2sSharedWs1ToTimer4Captsel = 24U + (TIMER4CAPTSEL0 << PMUX_SHIFT),
|
||||||
|
|
||||||
|
/*Pin interrupt secure select */
|
||||||
|
kINPUTMUX_GpioPort0Pin0ToPintSecsel = 0U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin1ToPintSecsel = 1U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin2ToPintSecsel = 2U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin3ToPintSecsel = 3U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin4ToPintSecsel = 4U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin5ToPintSecsel = 5U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin6ToPintSecsel = 6U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin7ToPintSecsel = 7U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin8ToPintSecsel = 8U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin9ToPintSecsel = 9U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin10ToPintSecsel = 10U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin11ToPintSecsel = 11U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin12ToPintSecsel = 12U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin13ToPintSecsel = 13U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin14ToPintSecsel = 14U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin15ToPintSecsel = 15U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin16ToPintSecsel = 16U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin17ToPintSecsel = 17U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin18ToPintSecsel = 18U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin19ToPintSecsel = 19U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin20ToPintSecsel = 20U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin21ToPintSecsel = 21U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin22ToPintSecsel = 22U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin23ToPintSecsel = 23U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin24ToPintSecsel = 24U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin25ToPintSecsel = 25U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin26ToPintSecsel = 26U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin27ToPintSecsel = 27U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin28ToPintSecsel = 28U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin29ToPintSecsel = 29U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin30ToPintSecsel = 30U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_GpioPort0Pin31ToPintSecsel = 31U + (PINTSECSEL0 << PMUX_SHIFT),
|
||||||
|
|
||||||
|
/*!< DMA1 Input trigger. */
|
||||||
|
kINPUTMUX_PinInt0ToDma1 = 0U + (DMA1_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_PinInt1ToDma1 = 1U + (DMA1_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_PinInt2ToDma1 = 2U + (DMA1_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_PinInt3ToDma1 = 3U + (DMA1_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Ctimer0M0ToDma1 = 4U + (DMA1_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Ctimer0M1ToDma1 = 5U + (DMA1_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Ctimer2M0ToDma1 = 6U + (DMA1_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Ctimer4M0ToDma1 = 7U + (DMA1_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Otrig0ToDma1 = 8U + (DMA1_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Otrig1ToDma1 = 9U + (DMA1_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Otrig2ToDma1 = 10U + (DMA1_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Otrig3ToDma1 = 11U + (DMA1_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Sct0DmaReq0ToDma1 = 12U + (DMA1_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Sct0DmaReq1ToDma1 = 13U + (DMA1_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_HashDmaRxToDma1 = 14U + (DMA1_ITRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
|
||||||
|
/*!< DMA1 output trigger. */
|
||||||
|
kINPUTMUX_Dma1Hash0TxTrigoutToTriginChannels = 0U + (DMA1_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma1HsLspiRxTrigoutToTriginChannels = 2U + (DMA1_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma1HsLspiTxTrigoutToTriginChannels = 3U + (DMA1_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma1Flexcomm0RxTrigoutToTriginChannels = 4U + (DMA1_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma1Flexcomm0TxTrigoutToTriginChannels = 5U + (DMA1_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma1Flexcomm1RxTrigoutToTriginChannels = 6U + (DMA1_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma1Flexcomm1TxTrigoutToTriginChannels = 7U + (DMA1_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma1Flexcomm3RxTrigoutToTriginChannels = 8U + (DMA1_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
kINPUTMUX_Dma1Flexcomm3TxTrigoutToTriginChannels = 9U + (DMA1_OTRIG_INMUX0 << PMUX_SHIFT),
|
||||||
|
} inputmux_connection_t;
|
||||||
|
|
||||||
|
/*! @brief INPUTMUX signal enable/disable type */
|
||||||
|
typedef enum _inputmux_signal_t
|
||||||
|
{
|
||||||
|
/*!< DMA0 REQ signal. */
|
||||||
|
kINPUTMUX_HashCryptToDmac0Ch0RequestEna = 0U + (DMA0_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm8RxToDmac0Ch2RequestEna = 2U + (DMA0_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm8TxToDmac0Ch3RequestEna = 3U + (DMA0_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm0RxToDmac0Ch4RequestEna = 4U + (DMA0_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm0TxToDmac0Ch5RequestEna = 5U + (DMA0_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm1RxToDmac0Ch6RequestEna = 6U + (DMA0_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm1TxToDmac0Ch7RequestEna = 7U + (DMA0_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm3RxToDmac0Ch8RequestEna = 8U + (DMA0_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm3TxToDmac0Ch9RequestEna = 9U + (DMA0_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm2RxToDmac0Ch10RequestEna = 10U + (DMA0_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm2TxToDmac0Ch11RequestEna = 11U + (DMA0_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm4RxToDmac0Ch12RequestEna = 12U + (DMA0_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm4TxToDmac0Ch13RequestEna = 13U + (DMA0_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm5RxToDmac0Ch14RequestEna = 14U + (DMA0_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm5TxToDmac0Ch15RequestEna = 15U + (DMA0_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm6RxToDmac0Ch16RequestEna = 16U + (DMA0_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm6TxToDmac0Ch17RequestEna = 17U + (DMA0_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm7RxToDmac0Ch18RequestEna = 18U + (DMA0_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm7TxToDmac0Ch19RequestEna = 19U + (DMA0_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Adc0FIFO0ToDmac0Ch21RequestEna = 21U + (DMA0_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Adc0FIFO1ToDmac0Ch22RequestEna = 22U + (DMA0_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
|
||||||
|
/*!< DMA1 REQ signal. */
|
||||||
|
kINPUTMUX_HashCryptToDmac1Ch0RequestEna = 0U + (DMA1_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm8RxToDmac1Ch2RequestEna = 2U + (DMA1_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm8TxToDmac1Ch3RequestEna = 3U + (DMA1_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm0RxToDmac1Ch4RequestEna = 4U + (DMA1_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm0TxToDmac1Ch5RequestEna = 5U + (DMA1_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm1RxToDmac1Ch6RequestEna = 6U + (DMA1_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm1TxToDmac1Ch7RequestEna = 7U + (DMA1_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm3RxToDmac1Ch8RequestEna = 8U + (DMA1_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Flexcomm3TxToDmac1Ch9RequestEna = 9U + (DMA1_REQ_ENA_ID << ENA_SHIFT),
|
||||||
|
|
||||||
|
/*!< DMA0 input trigger source enable. */
|
||||||
|
kINPUTMUX_Dmac0InputTriggerPint0Ena = 0U + (DMA0_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac0InputTriggerPint1Ena = 1U + (DMA0_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac0InputTriggerPint2Ena = 2U + (DMA0_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac0InputTriggerPint3Ena = 3U + (DMA0_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac0InputTriggerCtimer0M0Ena = 4U + (DMA0_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac0InputTriggerCtimer0M1Ena = 5U + (DMA0_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac0InputTriggerCtimer1M0Ena = 6U + (DMA0_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac0InputTriggerCtimer1M1Ena = 7U + (DMA0_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac0InputTriggerCtimer2M0Ena = 8U + (DMA0_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac0InputTriggerCtimer2M1Ena = 9U + (DMA0_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac0InputTriggerCtimer3M0Ena = 10U + (DMA0_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac0InputTriggerCtimer3M1Ena = 11U + (DMA0_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac0InputTriggerCtimer4M0Ena = 12U + (DMA0_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac0InputTriggerCtimer4M1Ena = 13U + (DMA0_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac0InputTriggerCompOutEna = 14U + (DMA0_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac0InputTriggerDma0Out0Ena = 15U + (DMA0_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac0InputTriggerDma0Out1Ena = 16U + (DMA0_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac0InputTriggerDma0Out2Ena = 17U + (DMA0_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac0InputTriggerDma0Out3Ena = 18U + (DMA0_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac0InputTriggerSctDmac0Ena = 19U + (DMA0_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac0InputTriggerSctDmac1Ena = 20U + (DMA0_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac0InputTriggerHashOutEna = 21U + (DMA0_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
|
||||||
|
/*!< DMA1 input trigger source enable. */
|
||||||
|
kINPUTMUX_Dmac1InputTriggerPint0Ena = 0U + (DMA1_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac1InputTriggerPint1Ena = 1U + (DMA1_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac1InputTriggerPint2Ena = 2U + (DMA1_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac1InputTriggerPint3Ena = 3U + (DMA1_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac1InputTriggerCtimer0M0Ena = 4U + (DMA1_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac1InputTriggerCtimer0M1Ena = 5U + (DMA1_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac1InputTriggerCtimer2M0Ena = 6U + (DMA1_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac1InputTriggerCtimer4M0Ena = 7U + (DMA1_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac1InputTriggerDma1Out0Ena = 8U + (DMA1_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac1InputTriggerDma1Out1Ena = 9U + (DMA1_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac1InputTriggerDma1Out2Ena = 10U + (DMA1_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac1InputTriggerDma1Out3Ena = 11U + (DMA1_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac1InputTriggerSctDmac0Ena = 12U + (DMA1_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac1InputTriggerSctDmac1Ena = 13U + (DMA1_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
kINPUTMUX_Dmac1InputTriggerHashOutEna = 14U + (DMA1_ITRIG_ENA_ID << ENA_SHIFT),
|
||||||
|
} inputmux_signal_t;
|
||||||
|
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
#endif /* _FSL_INPUTMUX_CONNECTIONS_ */
|
||||||
|
|
@ -0,0 +1,215 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016, Freescale Semiconductor, Inc.
|
||||||
|
* Copyright 2016-2021 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _FSL_IOCON_H_
|
||||||
|
#define _FSL_IOCON_H_
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @addtogroup lpc_iocon
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*! @file */
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/* Component ID definition, used by tools. */
|
||||||
|
#ifndef FSL_COMPONENT_ID
|
||||||
|
#define FSL_COMPONENT_ID "platform.drivers.lpc_iocon"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @name Driver version */
|
||||||
|
/*@{*/
|
||||||
|
/*! @brief IOCON driver version. */
|
||||||
|
#define FSL_IOCON_DRIVER_VERSION (MAKE_VERSION(2, 2, 0))
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Array of IOCON pin definitions passed to IOCON_SetPinMuxing() must be in this format
|
||||||
|
*/
|
||||||
|
typedef struct _iocon_group
|
||||||
|
{
|
||||||
|
uint8_t port; /* Pin port */
|
||||||
|
uint8_t pin; /* Pin number */
|
||||||
|
uint8_t ionumber; /* IO number */
|
||||||
|
uint16_t modefunc; /* Function and mode */
|
||||||
|
} iocon_group_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief IOCON function and mode selection definitions
|
||||||
|
* @note See the User Manual for specific modes and functions supported by the various pins.
|
||||||
|
*/
|
||||||
|
#define IOCON_FUNC0 0x0 /*!< Selects pin function 0 */
|
||||||
|
#define IOCON_FUNC1 0x1 /*!< Selects pin function 1 */
|
||||||
|
#define IOCON_FUNC2 0x2 /*!< Selects pin function 2 */
|
||||||
|
#define IOCON_FUNC3 0x3 /*!< Selects pin function 3 */
|
||||||
|
#define IOCON_FUNC4 0x4 /*!< Selects pin function 4 */
|
||||||
|
#define IOCON_FUNC5 0x5 /*!< Selects pin function 5 */
|
||||||
|
#define IOCON_FUNC6 0x6 /*!< Selects pin function 6 */
|
||||||
|
#define IOCON_FUNC7 0x7 /*!< Selects pin function 7 */
|
||||||
|
#if defined(FSL_FEATURE_IOCON_FUNC_FIELD_WIDTH) && (FSL_FEATURE_IOCON_FUNC_FIELD_WIDTH == 4)
|
||||||
|
#define IOCON_FUNC8 0x8 /*!< Selects pin function 8 */
|
||||||
|
#define IOCON_FUNC9 0x9 /*!< Selects pin function 9 */
|
||||||
|
#define IOCON_FUNC10 0xA /*!< Selects pin function 10 */
|
||||||
|
#define IOCON_FUNC11 0xB /*!< Selects pin function 11 */
|
||||||
|
#define IOCON_FUNC12 0xC /*!< Selects pin function 12 */
|
||||||
|
#define IOCON_FUNC13 0xD /*!< Selects pin function 13 */
|
||||||
|
#define IOCON_FUNC14 0xE /*!< Selects pin function 14 */
|
||||||
|
#define IOCON_FUNC15 0xF /*!< Selects pin function 15 */
|
||||||
|
#endif /* FSL_FEATURE_IOCON_FUNC_FIELD_WIDTH */
|
||||||
|
|
||||||
|
#if defined(IOCON_PIO_MODE_SHIFT)
|
||||||
|
#define IOCON_MODE_INACT (0x0 << IOCON_PIO_MODE_SHIFT) /*!< No addition pin function */
|
||||||
|
#define IOCON_MODE_PULLDOWN (0x1 << IOCON_PIO_MODE_SHIFT) /*!< Selects pull-down function */
|
||||||
|
#define IOCON_MODE_PULLUP (0x2 << IOCON_PIO_MODE_SHIFT) /*!< Selects pull-up function */
|
||||||
|
#define IOCON_MODE_REPEATER (0x3 << IOCON_PIO_MODE_SHIFT) /*!< Selects pin repeater function */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(IOCON_PIO_I2CSLEW_SHIFT)
|
||||||
|
#define IOCON_GPIO_MODE (0x1 << IOCON_PIO_I2CSLEW_SHIFT) /*!< GPIO Mode */
|
||||||
|
#define IOCON_I2C_MODE (0x0 << IOCON_PIO_I2CSLEW_SHIFT) /*!< I2C Slew Rate Control */
|
||||||
|
#define IOCON_I2C_SLEW IOCON_I2C_MODE /*!< Deprecated name for #IOCON_I2C_MODE */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(IOCON_PIO_EGP_SHIFT)
|
||||||
|
#define IOCON_GPIO_MODE (0x1 << IOCON_PIO_EGP_SHIFT) /*!< GPIO Mode */
|
||||||
|
#define IOCON_I2C_MODE (0x0 << IOCON_PIO_EGP_SHIFT) /*!< I2C Slew Rate Control */
|
||||||
|
#define IOCON_I2C_SLEW IOCON_I2C_MODE /*!< Deprecated name for #IOCON_I2C_MODE */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(IOCON_PIO_SLEW_SHIFT)
|
||||||
|
#define IOCON_SLEW_STANDARD (0x0 << IOCON_PIO_SLEW_SHIFT) /*!< Driver Slew Rate Control */
|
||||||
|
#define IOCON_SLEW_FAST (0x1 << IOCON_PIO_SLEW_SHIFT) /*!< Driver Slew Rate Control */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(IOCON_PIO_INVERT_SHIFT)
|
||||||
|
#define IOCON_INV_EN (0x1 << IOCON_PIO_INVERT_SHIFT) /*!< Enables invert function on input */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(IOCON_PIO_DIGIMODE_SHIFT)
|
||||||
|
#define IOCON_ANALOG_EN (0x0 << IOCON_PIO_DIGIMODE_SHIFT) /*!< Enables analog function by setting 0 to bit 7 */
|
||||||
|
#define IOCON_DIGITAL_EN \
|
||||||
|
(0x1 << IOCON_PIO_DIGIMODE_SHIFT) /*!< Enables digital function by setting 1 to bit 7(default) */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(IOCON_PIO_FILTEROFF_SHIFT)
|
||||||
|
#define IOCON_INPFILT_OFF (0x1 << IOCON_PIO_FILTEROFF_SHIFT) /*!< Input filter Off for GPIO pins */
|
||||||
|
#define IOCON_INPFILT_ON (0x0 << IOCON_PIO_FILTEROFF_SHIFT) /*!< Input filter On for GPIO pins */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(IOCON_PIO_I2CDRIVE_SHIFT)
|
||||||
|
#define IOCON_I2C_LOWDRIVER (0x0 << IOCON_PIO_I2CDRIVE_SHIFT) /*!< Low drive, Output drive sink is 4 mA */
|
||||||
|
#define IOCON_I2C_HIGHDRIVER (0x1 << IOCON_PIO_I2CDRIVE_SHIFT) /*!< High drive, Output drive sink is 20 mA */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(IOCON_PIO_OD_SHIFT)
|
||||||
|
#define IOCON_OPENDRAIN_EN (0x1 << IOCON_PIO_OD_SHIFT) /*!< Enables open-drain function */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(IOCON_PIO_I2CFILTER_SHIFT)
|
||||||
|
#define IOCON_I2CFILTER_OFF (0x1 << IOCON_PIO_I2CFILTER_SHIFT) /*!< I2C 50 ns glitch filter enabled */
|
||||||
|
#define IOCON_I2CFILTER_ON (0x0 << IOCON_PIO_I2CFILTER_SHIFT) /*!< I2C 50 ns glitch filter not enabled, */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(IOCON_PIO_ASW_SHIFT)
|
||||||
|
#define IOCON_AWS_EN (0x1 << IOCON_PIO_ASW_SHIFT) /*!< Enables analog switch function */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(IOCON_PIO_SSEL_SHIFT)
|
||||||
|
#define IOCON_SSEL_3V3 (0x0 << IOCON_PIO_SSEL_SHIFT) /*!< 3V3 signaling in I2C mode */
|
||||||
|
#define IOCON_SSEL_1V8 (0x1 << IOCON_PIO_SSEL_SHIFT) /*!< 1V8 signaling in I2C mode */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(IOCON_PIO_ECS_SHIFT)
|
||||||
|
#define IOCON_ECS_OFF (0x0 << IOCON_PIO_ECS_SHIFT) /*!< IO is an open drain cell */
|
||||||
|
#define IOCON_ECS_ON (0x1 << IOCON_PIO_ECS_SHIFT) /*!< Pull-up resistor is connected */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(IOCON_PIO_S_MODE_SHIFT)
|
||||||
|
#define IOCON_S_MODE_0CLK (0x0 << IOCON_PIO_S_MODE_SHIFT) /*!< Bypass input filter */
|
||||||
|
#define IOCON_S_MODE_1CLK \
|
||||||
|
(0x1 << IOCON_PIO_S_MODE_SHIFT) /*!< Input pulses shorter than 1 filter clock are rejected \ \ \ \ \
|
||||||
|
*/
|
||||||
|
#define IOCON_S_MODE_2CLK \
|
||||||
|
(0x2 << IOCON_PIO_S_MODE_SHIFT) /*!< Input pulses shorter than 2 filter clock2 are rejected \ \ \ \ \
|
||||||
|
*/
|
||||||
|
#define IOCON_S_MODE_3CLK \
|
||||||
|
(0x3 << IOCON_PIO_S_MODE_SHIFT) /*!< Input pulses shorter than 3 filter clock2 are rejected \ \ \ \ \
|
||||||
|
*/
|
||||||
|
#define IOCON_S_MODE(clks) ((clks) << IOCON_PIO_S_MODE_SHIFT) /*!< Select clocks for digital input filter mode */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(IOCON_PIO_CLK_DIV_SHIFT)
|
||||||
|
#define IOCON_CLKDIV(div) \
|
||||||
|
((div) \
|
||||||
|
<< IOCON_PIO_CLK_DIV_SHIFT) /*!< Select peripheral clock divider for input filter sampling clock, 2^n, n=0-6 */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(FSL_FEATURE_IOCON_ONE_DIMENSION) && (FSL_FEATURE_IOCON_ONE_DIMENSION == 1))
|
||||||
|
/**
|
||||||
|
* @brief Sets I/O Control pin mux
|
||||||
|
* @param base : The base of IOCON peripheral on the chip
|
||||||
|
* @param ionumber : GPIO number to mux
|
||||||
|
* @param modefunc : OR'ed values of type IOCON_*
|
||||||
|
* @return Nothing
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void IOCON_PinMuxSet(IOCON_Type *base, uint8_t ionumber, uint32_t modefunc)
|
||||||
|
{
|
||||||
|
base->PIO[ionumber] = modefunc;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
/**
|
||||||
|
* @brief Sets I/O Control pin mux
|
||||||
|
* @param base : The base of IOCON peripheral on the chip
|
||||||
|
* @param port : GPIO port to mux
|
||||||
|
* @param pin : GPIO pin to mux
|
||||||
|
* @param modefunc : OR'ed values of type IOCON_*
|
||||||
|
* @return Nothing
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void IOCON_PinMuxSet(IOCON_Type *base, uint8_t port, uint8_t pin, uint32_t modefunc)
|
||||||
|
{
|
||||||
|
base->PIO[port][pin] = modefunc;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set all I/O Control pin muxing
|
||||||
|
* @param base : The base of IOCON peripheral on the chip
|
||||||
|
* @param pinArray : Pointer to array of pin mux selections
|
||||||
|
* @param arrayLength : Number of entries in pinArray
|
||||||
|
* @return Nothing
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void IOCON_SetPinMuxing(IOCON_Type *base, const iocon_group_t *pinArray, uint32_t arrayLength)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < arrayLength; i++)
|
||||||
|
{
|
||||||
|
#if (defined(FSL_FEATURE_IOCON_ONE_DIMENSION) && (FSL_FEATURE_IOCON_ONE_DIMENSION == 1))
|
||||||
|
IOCON_PinMuxSet(base, pinArray[i].ionumber, pinArray[i].modefunc);
|
||||||
|
#else
|
||||||
|
IOCON_PinMuxSet(base, pinArray[i].port, pinArray[i].pin, pinArray[i].modefunc);
|
||||||
|
#endif /* FSL_FEATURE_IOCON_ONE_DIMENSION */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* @} */
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _FSL_IOCON_H_ */
|
||||||
|
|
@ -0,0 +1,968 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016, Freescale Semiconductor, Inc.
|
||||||
|
* Copyright 2016-2020 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "fsl_pint.h"
|
||||||
|
|
||||||
|
/* Component ID definition, used by tools. */
|
||||||
|
#ifndef FSL_COMPONENT_ID
|
||||||
|
#define FSL_COMPONENT_ID "platform.drivers.pint"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Variables
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#if (defined(FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS) && FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS)
|
||||||
|
/*! @brief Irq number array */
|
||||||
|
static const IRQn_Type s_pintIRQ[FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS +
|
||||||
|
FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS] = PINT_IRQS;
|
||||||
|
|
||||||
|
/*! @brief Callback function array for SECPINT(s). */
|
||||||
|
static pint_cb_t s_secpintCallback[FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS];
|
||||||
|
#else
|
||||||
|
/*! @brief Irq number array */
|
||||||
|
static const IRQn_Type s_pintIRQ[FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS] = PINT_IRQS;
|
||||||
|
#endif /* FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS */
|
||||||
|
|
||||||
|
/*! @brief Callback function array for PINT(s). */
|
||||||
|
static pint_cb_t s_pintCallback[FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS];
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* brief Initialize PINT peripheral.
|
||||||
|
|
||||||
|
* This function initializes the PINT peripheral and enables the clock.
|
||||||
|
*
|
||||||
|
* param base Base address of the PINT peripheral.
|
||||||
|
*
|
||||||
|
* retval None.
|
||||||
|
*/
|
||||||
|
void PINT_Init(PINT_Type *base)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
uint32_t pmcfg = 0;
|
||||||
|
uint8_t pintcount = 0;
|
||||||
|
assert(base != NULL);
|
||||||
|
|
||||||
|
if (base == PINT)
|
||||||
|
{
|
||||||
|
pintcount = FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS;
|
||||||
|
/* clear PINT callback array*/
|
||||||
|
for (i = 0; i < (uint32_t)FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS; i++)
|
||||||
|
{
|
||||||
|
s_pintCallback[i] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if (defined(FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS) && FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS)
|
||||||
|
pintcount = FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS;
|
||||||
|
/* clear SECPINT callback array*/
|
||||||
|
for (i = 0; i < (uint32_t)FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS; i++)
|
||||||
|
{
|
||||||
|
s_secpintCallback[i] = NULL;
|
||||||
|
}
|
||||||
|
#endif /* FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Disable all bit slices for pint*/
|
||||||
|
for (i = 0; i < pintcount; i++)
|
||||||
|
{
|
||||||
|
pmcfg = pmcfg | ((uint32_t)kPINT_PatternMatchNever << (PININT_BITSLICE_CFG_START + (i * 3U)));
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_CLOCK_HAS_GPIOINT_CLOCK_SOURCE) && (FSL_FEATURE_CLOCK_HAS_GPIOINT_CLOCK_SOURCE == 1)
|
||||||
|
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
|
||||||
|
/* Enable the clock. */
|
||||||
|
CLOCK_EnableClock(kCLOCK_GpioInt);
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_RESET_CONTROL) && FSL_SDK_DISABLE_DRIVER_RESET_CONTROL)
|
||||||
|
/* Reset the module. */
|
||||||
|
RESET_PeripheralReset(kGPIOINT_RST_N_SHIFT_RSTn);
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_RESET_CONTROL */
|
||||||
|
|
||||||
|
#elif defined(FSL_FEATURE_CLOCK_HAS_GPIOINT_CLOCK_SOURCE) && (FSL_FEATURE_CLOCK_HAS_GPIOINT_CLOCK_SOURCE == 0)
|
||||||
|
|
||||||
|
if (base == PINT)
|
||||||
|
{
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
|
||||||
|
/* Enable the clock. */
|
||||||
|
CLOCK_EnableClock(kCLOCK_Gpio0);
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_RESET_CONTROL) && FSL_SDK_DISABLE_DRIVER_RESET_CONTROL)
|
||||||
|
/* Reset the module. */
|
||||||
|
RESET_PeripheralReset(kGPIO0_RST_N_SHIFT_RSTn);
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_RESET_CONTROL */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if (defined(FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS) && FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS)
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
|
||||||
|
/* Enable the clock. */
|
||||||
|
CLOCK_EnableClock(kCLOCK_Gpio_Sec);
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_RESET_CONTROL) && FSL_SDK_DISABLE_DRIVER_RESET_CONTROL)
|
||||||
|
/* Reset the module. */
|
||||||
|
RESET_PeripheralReset(kGPIOSEC_RST_SHIFT_RSTn);
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_RESET_CONTROL */
|
||||||
|
#endif /* FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS */
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
if (base == PINT)
|
||||||
|
{
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
|
||||||
|
/* Enable the clock. */
|
||||||
|
CLOCK_EnableClock(kCLOCK_Pint);
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_RESET_CONTROL) && FSL_SDK_DISABLE_DRIVER_RESET_CONTROL)
|
||||||
|
/* Reset the module. */
|
||||||
|
RESET_PeripheralReset(kPINT_RST_SHIFT_RSTn);
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_RESET_CONTROL */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* if need config SECURE PINT device,then enable secure pint interrupt clock */
|
||||||
|
#if (defined(FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS) && FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS)
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
|
||||||
|
/* Enable the clock. */
|
||||||
|
CLOCK_EnableClock(kCLOCK_Gpio_Sec_Int);
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_RESET_CONTROL) && FSL_SDK_DISABLE_DRIVER_RESET_CONTROL)
|
||||||
|
/* Reset the module. */
|
||||||
|
RESET_PeripheralReset(kGPIOSECINT_RST_SHIFT_RSTn);
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_RESET_CONTROL */
|
||||||
|
#endif /* FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS */
|
||||||
|
}
|
||||||
|
#endif /* FSL_FEATURE_CLOCK_HAS_GPIOINT_CLOCK_SOURCE */
|
||||||
|
|
||||||
|
/* Disable all pattern match bit slices */
|
||||||
|
base->PMCFG = pmcfg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* brief Configure PINT peripheral pin interrupt.
|
||||||
|
|
||||||
|
* This function configures a given pin interrupt.
|
||||||
|
*
|
||||||
|
* param base Base address of the PINT peripheral.
|
||||||
|
* param intr Pin interrupt.
|
||||||
|
* param enable Selects detection logic.
|
||||||
|
* param callback Callback.
|
||||||
|
*
|
||||||
|
* retval None.
|
||||||
|
*/
|
||||||
|
void PINT_PinInterruptConfig(PINT_Type *base, pint_pin_int_t intr, pint_pin_enable_t enable, pint_cb_t callback)
|
||||||
|
{
|
||||||
|
assert(base != NULL);
|
||||||
|
|
||||||
|
/* Clear Rise and Fall flags first */
|
||||||
|
PINT_PinInterruptClrRiseFlag(base, intr);
|
||||||
|
PINT_PinInterruptClrFallFlag(base, intr);
|
||||||
|
|
||||||
|
/* Security PINT uses additional callback array */
|
||||||
|
if (base == PINT)
|
||||||
|
{
|
||||||
|
s_pintCallback[intr] = callback;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if (defined(FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS) && FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS)
|
||||||
|
s_secpintCallback[intr] = callback;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* select level or edge sensitive */
|
||||||
|
base->ISEL = (base->ISEL & ~(1UL << (uint32_t)intr)) |
|
||||||
|
((((uint32_t)enable & PINT_PIN_INT_LEVEL) != 0U) ? (1UL << (uint32_t)intr) : 0U);
|
||||||
|
|
||||||
|
/* enable rising or level interrupt */
|
||||||
|
if (((unsigned)enable & (PINT_PIN_INT_LEVEL | PINT_PIN_INT_RISE)) != 0U)
|
||||||
|
{
|
||||||
|
base->SIENR = 1UL << (uint32_t)intr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
base->CIENR = 1UL << (uint32_t)intr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Enable falling or select high level */
|
||||||
|
if (((unsigned)enable & PINT_PIN_INT_FALL_OR_HIGH_LEVEL) != 0U)
|
||||||
|
{
|
||||||
|
base->SIENF = 1UL << (uint32_t)intr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
base->CIENF = 1UL << (uint32_t)intr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* brief Get PINT peripheral pin interrupt configuration.
|
||||||
|
|
||||||
|
* This function returns the configuration of a given pin interrupt.
|
||||||
|
*
|
||||||
|
* param base Base address of the PINT peripheral.
|
||||||
|
* param pintr Pin interrupt.
|
||||||
|
* param enable Pointer to store the detection logic.
|
||||||
|
* param callback Callback.
|
||||||
|
*
|
||||||
|
* retval None.
|
||||||
|
*/
|
||||||
|
void PINT_PinInterruptGetConfig(PINT_Type *base, pint_pin_int_t pintr, pint_pin_enable_t *enable, pint_cb_t *callback)
|
||||||
|
{
|
||||||
|
uint32_t mask;
|
||||||
|
bool level;
|
||||||
|
|
||||||
|
assert(base != NULL);
|
||||||
|
|
||||||
|
*enable = kPINT_PinIntEnableNone;
|
||||||
|
level = false;
|
||||||
|
|
||||||
|
mask = 1UL << (uint32_t)pintr;
|
||||||
|
if ((base->ISEL & mask) != 0U)
|
||||||
|
{
|
||||||
|
/* Pin interrupt is level sensitive */
|
||||||
|
level = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((base->IENR & mask) != 0U)
|
||||||
|
{
|
||||||
|
if (level)
|
||||||
|
{
|
||||||
|
/* Level interrupt is enabled */
|
||||||
|
*enable = kPINT_PinIntEnableLowLevel;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Rising edge interrupt */
|
||||||
|
*enable = kPINT_PinIntEnableRiseEdge;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((base->IENF & mask) != 0U)
|
||||||
|
{
|
||||||
|
if (level)
|
||||||
|
{
|
||||||
|
/* Level interrupt is active high */
|
||||||
|
*enable = kPINT_PinIntEnableHighLevel;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Either falling or both edge */
|
||||||
|
if (*enable == kPINT_PinIntEnableRiseEdge)
|
||||||
|
{
|
||||||
|
/* Rising and faling edge */
|
||||||
|
*enable = kPINT_PinIntEnableBothEdges;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Falling edge */
|
||||||
|
*enable = kPINT_PinIntEnableFallEdge;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Security PINT uses additional callback array */
|
||||||
|
if (base == PINT)
|
||||||
|
{
|
||||||
|
*callback = s_pintCallback[pintr];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if (defined(FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS) && FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS)
|
||||||
|
*callback = s_secpintCallback[pintr];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* brief Configure PINT pattern match.
|
||||||
|
|
||||||
|
* This function configures a given pattern match bit slice.
|
||||||
|
*
|
||||||
|
* param base Base address of the PINT peripheral.
|
||||||
|
* param bslice Pattern match bit slice number.
|
||||||
|
* param cfg Pointer to bit slice configuration.
|
||||||
|
*
|
||||||
|
* retval None.
|
||||||
|
*/
|
||||||
|
void PINT_PatternMatchConfig(PINT_Type *base, pint_pmatch_bslice_t bslice, pint_pmatch_cfg_t *cfg)
|
||||||
|
{
|
||||||
|
uint32_t src_shift;
|
||||||
|
uint32_t cfg_shift;
|
||||||
|
uint32_t pmcfg;
|
||||||
|
uint32_t tmp_src_shift = PININT_BITSLICE_SRC_MASK;
|
||||||
|
uint32_t tmp_cfg_shift = PININT_BITSLICE_CFG_MASK;
|
||||||
|
|
||||||
|
assert(base != NULL);
|
||||||
|
|
||||||
|
src_shift = PININT_BITSLICE_SRC_START + ((uint32_t)bslice * 3UL);
|
||||||
|
cfg_shift = PININT_BITSLICE_CFG_START + ((uint32_t)bslice * 3UL);
|
||||||
|
|
||||||
|
/* Input source selection for selected bit slice */
|
||||||
|
base->PMSRC = (base->PMSRC & ~(tmp_src_shift << src_shift)) | ((uint32_t)(cfg->bs_src) << src_shift);
|
||||||
|
|
||||||
|
/* Bit slice configuration */
|
||||||
|
pmcfg = base->PMCFG;
|
||||||
|
pmcfg = (pmcfg & ~(tmp_cfg_shift << cfg_shift)) | ((uint32_t)(cfg->bs_cfg) << cfg_shift);
|
||||||
|
|
||||||
|
/* If end point is true, enable the bits */
|
||||||
|
if ((uint32_t)bslice != 7UL)
|
||||||
|
{
|
||||||
|
if (cfg->end_point)
|
||||||
|
{
|
||||||
|
pmcfg |= (1UL << (uint32_t)bslice);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pmcfg &= ~(1UL << (uint32_t)bslice);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
base->PMCFG = pmcfg;
|
||||||
|
|
||||||
|
/* Save callback pointer */
|
||||||
|
if (base == PINT)
|
||||||
|
{
|
||||||
|
if ((uint32_t)bslice < (uint32_t)FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS)
|
||||||
|
{
|
||||||
|
s_pintCallback[bslice] = cfg->callback;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if (defined(FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS) && FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS)
|
||||||
|
if ((uint32_t)bslice < (uint32_t)FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS)
|
||||||
|
{
|
||||||
|
s_secpintCallback[bslice] = cfg->callback;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* brief Get PINT pattern match configuration.
|
||||||
|
|
||||||
|
* This function returns the configuration of a given pattern match bit slice.
|
||||||
|
*
|
||||||
|
* param base Base address of the PINT peripheral.
|
||||||
|
* param bslice Pattern match bit slice number.
|
||||||
|
* param cfg Pointer to bit slice configuration.
|
||||||
|
*
|
||||||
|
* retval None.
|
||||||
|
*/
|
||||||
|
void PINT_PatternMatchGetConfig(PINT_Type *base, pint_pmatch_bslice_t bslice, pint_pmatch_cfg_t *cfg)
|
||||||
|
{
|
||||||
|
uint32_t src_shift;
|
||||||
|
uint32_t cfg_shift;
|
||||||
|
uint32_t tmp_src_shift = PININT_BITSLICE_SRC_MASK;
|
||||||
|
uint32_t tmp_cfg_shift = PININT_BITSLICE_CFG_MASK;
|
||||||
|
|
||||||
|
assert(base != NULL);
|
||||||
|
|
||||||
|
src_shift = PININT_BITSLICE_SRC_START + ((uint32_t)bslice * 3UL);
|
||||||
|
cfg_shift = PININT_BITSLICE_CFG_START + ((uint32_t)bslice * 3UL);
|
||||||
|
|
||||||
|
cfg->bs_src = (pint_pmatch_input_src_t)(uint32_t)((base->PMSRC & (tmp_src_shift << src_shift)) >> src_shift);
|
||||||
|
cfg->bs_cfg = (pint_pmatch_bslice_cfg_t)(uint32_t)((base->PMCFG & (tmp_cfg_shift << cfg_shift)) >> cfg_shift);
|
||||||
|
|
||||||
|
if ((uint32_t)bslice == 7U)
|
||||||
|
{
|
||||||
|
cfg->end_point = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cfg->end_point = (((base->PMCFG & (1UL << (uint32_t)bslice)) >> (uint32_t)bslice) != 0U) ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (base == PINT)
|
||||||
|
{
|
||||||
|
if ((uint32_t)bslice < (uint32_t)FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS)
|
||||||
|
{
|
||||||
|
cfg->callback = s_pintCallback[bslice];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if (defined(FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS) && FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS)
|
||||||
|
if ((uint32_t)bslice < (uint32_t)FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS)
|
||||||
|
{
|
||||||
|
cfg->callback = s_secpintCallback[bslice];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* brief Reset pattern match detection logic.
|
||||||
|
|
||||||
|
* This function resets the pattern match detection logic if any of the product term is matching.
|
||||||
|
*
|
||||||
|
* param base Base address of the PINT peripheral.
|
||||||
|
*
|
||||||
|
* retval pmstatus Each bit position indicates the match status of corresponding bit slice.
|
||||||
|
* = 0 Match was detected. = 1 Match was not detected.
|
||||||
|
*/
|
||||||
|
uint32_t PINT_PatternMatchResetDetectLogic(PINT_Type *base)
|
||||||
|
{
|
||||||
|
uint32_t pmctrl;
|
||||||
|
uint32_t pmstatus;
|
||||||
|
uint32_t pmsrc;
|
||||||
|
|
||||||
|
pmctrl = base->PMCTRL;
|
||||||
|
pmstatus = pmctrl >> PINT_PMCTRL_PMAT_SHIFT;
|
||||||
|
if (pmstatus != 0UL)
|
||||||
|
{
|
||||||
|
/* Reset Pattern match engine detection logic */
|
||||||
|
pmsrc = base->PMSRC;
|
||||||
|
base->PMSRC = pmsrc;
|
||||||
|
}
|
||||||
|
return (pmstatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Clear Selected pin interrupt status only when the pin was triggered by edge-sensitive.
|
||||||
|
|
||||||
|
* This function clears the selected pin interrupt status.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
* @param pintr Pin interrupt.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
void PINT_PinInterruptClrStatus(PINT_Type *base, pint_pin_int_t pintr)
|
||||||
|
{
|
||||||
|
uint32_t pinIntMode = base->ISEL & (1UL << (uint32_t)pintr);
|
||||||
|
uint32_t pinIntStatus = base->IST & (1UL << (uint32_t)pintr);
|
||||||
|
|
||||||
|
/* Edge sensitive and pin interrupt that is currently requesting an interrupt. */
|
||||||
|
if ((pinIntMode == 0x0UL) && (pinIntStatus != 0x0UL))
|
||||||
|
{
|
||||||
|
base->IST = (1UL << (uint32_t)pintr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Clear all pin interrupts status only when pins were triggered by edge-sensitive.
|
||||||
|
|
||||||
|
* This function clears the status of all pin interrupts.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
void PINT_PinInterruptClrStatusAll(PINT_Type *base)
|
||||||
|
{
|
||||||
|
uint32_t pinIntMode = 0;
|
||||||
|
uint32_t pinIntStatus = 0;
|
||||||
|
uint32_t pinIntCount = 0;
|
||||||
|
uint32_t mask = 0;
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
if (base == PINT)
|
||||||
|
{
|
||||||
|
pinIntCount = (uint32_t)FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if (defined(FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS) && FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS)
|
||||||
|
pinIntCount = (uint32_t)FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS;
|
||||||
|
#endif /* FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS */
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < pinIntCount; i++)
|
||||||
|
{
|
||||||
|
pinIntMode = base->ISEL & (1UL << i);
|
||||||
|
pinIntStatus = base->IST & (1UL << i);
|
||||||
|
|
||||||
|
/* Edge sensitive and pin interrupt that is currently requesting an interrupt. */
|
||||||
|
if ((pinIntMode == 0x0UL) && (pinIntStatus != 0x0UL))
|
||||||
|
{
|
||||||
|
mask |= 1UL << i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
base->IST = mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* brief Enable callback.
|
||||||
|
|
||||||
|
* This function enables the interrupt for the selected PINT peripheral. Although the pin(s) are monitored
|
||||||
|
* as soon as they are enabled, the callback function is not enabled until this function is called.
|
||||||
|
*
|
||||||
|
* param base Base address of the PINT peripheral.
|
||||||
|
*
|
||||||
|
* retval None.
|
||||||
|
*/
|
||||||
|
void PINT_EnableCallback(PINT_Type *base)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
assert(base != NULL);
|
||||||
|
|
||||||
|
if (base == PINT)
|
||||||
|
{
|
||||||
|
for (i = 0; i < (uint32_t)FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS; i++)
|
||||||
|
{
|
||||||
|
PINT_PinInterruptClrStatus(base, (pint_pin_int_t)i);
|
||||||
|
NVIC_ClearPendingIRQ(s_pintIRQ[i]);
|
||||||
|
(void)EnableIRQ(s_pintIRQ[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if (defined(FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS) && FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS)
|
||||||
|
for (i = 0; i < (uint32_t)FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS; i++)
|
||||||
|
{
|
||||||
|
PINT_PinInterruptClrStatus(base, (pint_pin_int_t)i);
|
||||||
|
NVIC_ClearPendingIRQ(s_pintIRQ[i + (uint32_t)FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS]);
|
||||||
|
(void)EnableIRQ(s_pintIRQ[i + (uint32_t)FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS]);
|
||||||
|
}
|
||||||
|
#endif /* FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* brief enable callback by pin index.
|
||||||
|
|
||||||
|
* This function enables callback by pin index instead of enabling all pins.
|
||||||
|
*
|
||||||
|
* param base Base address of the peripheral.
|
||||||
|
* param pinIdx pin index.
|
||||||
|
*
|
||||||
|
* retval None.
|
||||||
|
*/
|
||||||
|
void PINT_EnableCallbackByIndex(PINT_Type *base, pint_pin_int_t pintIdx)
|
||||||
|
{
|
||||||
|
assert(base != NULL);
|
||||||
|
|
||||||
|
PINT_PinInterruptClrStatus(base, (pint_pin_int_t)pintIdx);
|
||||||
|
|
||||||
|
#if (defined(FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS) && FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS)
|
||||||
|
/* Get the right security pint irq index in array */
|
||||||
|
if (base == SECPINT)
|
||||||
|
{
|
||||||
|
pintIdx =
|
||||||
|
(pint_pin_int_t)(uint32_t)((uint32_t)pintIdx + (uint32_t)FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS);
|
||||||
|
}
|
||||||
|
#endif /* FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS */
|
||||||
|
|
||||||
|
NVIC_ClearPendingIRQ(s_pintIRQ[pintIdx]);
|
||||||
|
(void)EnableIRQ(s_pintIRQ[pintIdx]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* brief Disable callback.
|
||||||
|
|
||||||
|
* This function disables the interrupt for the selected PINT peripheral. Although the pins are still
|
||||||
|
* being monitored but the callback function is not called.
|
||||||
|
*
|
||||||
|
* param base Base address of the peripheral.
|
||||||
|
*
|
||||||
|
* retval None.
|
||||||
|
*/
|
||||||
|
void PINT_DisableCallback(PINT_Type *base)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
assert(base != NULL);
|
||||||
|
|
||||||
|
if (base == PINT)
|
||||||
|
{
|
||||||
|
for (i = 0; i < (uint32_t)FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS; i++)
|
||||||
|
{
|
||||||
|
(void)DisableIRQ(s_pintIRQ[i]);
|
||||||
|
PINT_PinInterruptClrStatus(base, (pint_pin_int_t)i);
|
||||||
|
NVIC_ClearPendingIRQ(s_pintIRQ[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if (defined(FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS) && FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS)
|
||||||
|
for (i = 0; i < (uint32_t)FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS; i++)
|
||||||
|
{
|
||||||
|
(void)DisableIRQ(s_pintIRQ[i + (uint32_t)FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS]);
|
||||||
|
PINT_PinInterruptClrStatus(base, (pint_pin_int_t)i);
|
||||||
|
NVIC_ClearPendingIRQ(s_pintIRQ[i + (uint32_t)FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS]);
|
||||||
|
}
|
||||||
|
#endif /* FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* brief disable callback by pin index.
|
||||||
|
|
||||||
|
* This function disables callback by pin index instead of disabling all pins.
|
||||||
|
*
|
||||||
|
* param base Base address of the peripheral.
|
||||||
|
* param pinIdx pin index.
|
||||||
|
*
|
||||||
|
* retval None.
|
||||||
|
*/
|
||||||
|
void PINT_DisableCallbackByIndex(PINT_Type *base, pint_pin_int_t pintIdx)
|
||||||
|
{
|
||||||
|
assert(base != NULL);
|
||||||
|
|
||||||
|
if (base == PINT)
|
||||||
|
{
|
||||||
|
(void)DisableIRQ(s_pintIRQ[pintIdx]);
|
||||||
|
PINT_PinInterruptClrStatus(base, (pint_pin_int_t)pintIdx);
|
||||||
|
NVIC_ClearPendingIRQ(s_pintIRQ[pintIdx]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if (defined(FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS) && FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS)
|
||||||
|
(void)DisableIRQ(s_pintIRQ[(uint32_t)pintIdx + (uint32_t)FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS]);
|
||||||
|
PINT_PinInterruptClrStatus(base, (pint_pin_int_t)pintIdx);
|
||||||
|
NVIC_ClearPendingIRQ(s_pintIRQ[(uint32_t)pintIdx + (uint32_t)FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS]);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* brief Deinitialize PINT peripheral.
|
||||||
|
|
||||||
|
* This function disables the PINT clock.
|
||||||
|
*
|
||||||
|
* param base Base address of the PINT peripheral.
|
||||||
|
*
|
||||||
|
* retval None.
|
||||||
|
*/
|
||||||
|
void PINT_Deinit(PINT_Type *base)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
assert(base != NULL);
|
||||||
|
|
||||||
|
/* Cleanup */
|
||||||
|
PINT_DisableCallback(base);
|
||||||
|
if (base == PINT)
|
||||||
|
{
|
||||||
|
/* clear PINT callback array*/
|
||||||
|
for (i = 0; i < (uint32_t)FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS; i++)
|
||||||
|
{
|
||||||
|
s_pintCallback[i] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if (defined(FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS) && FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS)
|
||||||
|
/* clear SECPINT callback array */
|
||||||
|
for (i = 0; i < (uint32_t)FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS; i++)
|
||||||
|
{
|
||||||
|
s_secpintCallback[i] = NULL;
|
||||||
|
}
|
||||||
|
#endif /* FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS */
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_CLOCK_HAS_GPIOINT_CLOCK_SOURCE) && (FSL_FEATURE_CLOCK_HAS_GPIOINT_CLOCK_SOURCE == 1)
|
||||||
|
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
|
||||||
|
/* Enable the clock. */
|
||||||
|
CLOCK_DisableClock(kCLOCK_GpioInt);
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_RESET_CONTROL) && FSL_SDK_DISABLE_DRIVER_RESET_CONTROL)
|
||||||
|
/* Reset the module. */
|
||||||
|
RESET_PeripheralReset(kGPIOINT_RST_N_SHIFT_RSTn);
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_RESET_CONTROL */
|
||||||
|
|
||||||
|
#elif defined(FSL_FEATURE_CLOCK_HAS_GPIOINT_CLOCK_SOURCE) && (FSL_FEATURE_CLOCK_HAS_GPIOINT_CLOCK_SOURCE == 0)
|
||||||
|
|
||||||
|
if (base == PINT)
|
||||||
|
{
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
|
||||||
|
/* Enable the clock. */
|
||||||
|
CLOCK_DisableClock(kCLOCK_Gpio0);
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_RESET_CONTROL) && FSL_SDK_DISABLE_DRIVER_RESET_CONTROL)
|
||||||
|
/* Reset the module. */
|
||||||
|
RESET_PeripheralReset(kGPIO0_RST_N_SHIFT_RSTn);
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_RESET_CONTROL */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if (defined(FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS) && FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS)
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
|
||||||
|
/* Enable the clock. */
|
||||||
|
CLOCK_DisableClock(kCLOCK_Gpio_Sec);
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_RESET_CONTROL) && FSL_SDK_DISABLE_DRIVER_RESET_CONTROL)
|
||||||
|
/* Reset the module. */
|
||||||
|
RESET_PeripheralReset(kGPIOSEC_RST_SHIFT_RSTn);
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_RESET_CONTROL */
|
||||||
|
#endif /* FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS */
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
if (base == PINT)
|
||||||
|
{
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
|
||||||
|
/* Enable the clock. */
|
||||||
|
CLOCK_DisableClock(kCLOCK_Pint);
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_RESET_CONTROL) && FSL_SDK_DISABLE_DRIVER_RESET_CONTROL)
|
||||||
|
/* Reset the module. */
|
||||||
|
RESET_PeripheralReset(kPINT_RST_SHIFT_RSTn);
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_RESET_CONTROL */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* if need config SECURE PINT device,then enable secure pint interrupt clock */
|
||||||
|
#if (defined(FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS) && FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS)
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
|
||||||
|
/* Enable the clock. */
|
||||||
|
CLOCK_DisableClock(kCLOCK_Gpio_Sec_Int);
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
|
||||||
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_RESET_CONTROL) && FSL_SDK_DISABLE_DRIVER_RESET_CONTROL)
|
||||||
|
/* Reset the module. */
|
||||||
|
RESET_PeripheralReset(kGPIOSECINT_RST_SHIFT_RSTn);
|
||||||
|
#endif /* FSL_SDK_DISABLE_DRIVER_RESET_CONTROL */
|
||||||
|
#endif /* FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS */
|
||||||
|
}
|
||||||
|
#endif /* FSL_FEATURE_CLOCK_HAS_GPIOINT_CLOCK_SOURCE */
|
||||||
|
}
|
||||||
|
#if (defined(FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS) && FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS)
|
||||||
|
/* IRQ handler functions overloading weak symbols in the startup */
|
||||||
|
void SEC_GPIO_INT0_IRQ0_DriverIRQHandler(void);
|
||||||
|
void SEC_GPIO_INT0_IRQ0_DriverIRQHandler(void)
|
||||||
|
{
|
||||||
|
uint32_t pmstatus = 0;
|
||||||
|
|
||||||
|
/* Reset pattern match detection */
|
||||||
|
pmstatus = PINT_PatternMatchResetDetectLogic(SECPINT);
|
||||||
|
/* Call user function */
|
||||||
|
if (s_secpintCallback[kPINT_SecPinInt0] != NULL)
|
||||||
|
{
|
||||||
|
s_secpintCallback[kPINT_SecPinInt0](kPINT_SecPinInt0, pmstatus);
|
||||||
|
}
|
||||||
|
if ((SECPINT->ISEL & 0x1U) == 0x0U)
|
||||||
|
{
|
||||||
|
/* Edge sensitive: clear Pin interrupt after callback */
|
||||||
|
PINT_PinInterruptClrStatus(SECPINT, kPINT_PinInt0);
|
||||||
|
}
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if (FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS > 1U)
|
||||||
|
/* IRQ handler functions overloading weak symbols in the startup */
|
||||||
|
void SEC_GPIO_INT0_IRQ1_DriverIRQHandler(void);
|
||||||
|
void SEC_GPIO_INT0_IRQ1_DriverIRQHandler(void)
|
||||||
|
{
|
||||||
|
uint32_t pmstatus;
|
||||||
|
|
||||||
|
/* Reset pattern match detection */
|
||||||
|
pmstatus = PINT_PatternMatchResetDetectLogic(SECPINT);
|
||||||
|
/* Call user function */
|
||||||
|
if (s_secpintCallback[kPINT_SecPinInt1] != NULL)
|
||||||
|
{
|
||||||
|
s_secpintCallback[kPINT_SecPinInt1](kPINT_SecPinInt1, pmstatus);
|
||||||
|
}
|
||||||
|
if ((SECPINT->ISEL & 0x1U) == 0x0U)
|
||||||
|
{
|
||||||
|
/* Edge sensitive: clear Pin interrupt after callback */
|
||||||
|
PINT_PinInterruptClrStatus(SECPINT, kPINT_PinInt1);
|
||||||
|
}
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
#endif /* FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS */
|
||||||
|
#endif /* FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS */
|
||||||
|
|
||||||
|
/* IRQ handler functions overloading weak symbols in the startup */
|
||||||
|
void PIN_INT0_DriverIRQHandler(void);
|
||||||
|
void PIN_INT0_DriverIRQHandler(void)
|
||||||
|
{
|
||||||
|
uint32_t pmstatus;
|
||||||
|
|
||||||
|
/* Reset pattern match detection */
|
||||||
|
pmstatus = PINT_PatternMatchResetDetectLogic(PINT);
|
||||||
|
/* Call user function */
|
||||||
|
if (s_pintCallback[kPINT_PinInt0] != NULL)
|
||||||
|
{
|
||||||
|
s_pintCallback[kPINT_PinInt0](kPINT_PinInt0, pmstatus);
|
||||||
|
}
|
||||||
|
if ((PINT->ISEL & 0x1U) == 0x0U)
|
||||||
|
{
|
||||||
|
/* Edge sensitive: clear Pin interrupt after callback */
|
||||||
|
PINT_PinInterruptClrStatus(PINT, kPINT_PinInt0);
|
||||||
|
}
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if (FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS > 1U)
|
||||||
|
void PIN_INT1_DriverIRQHandler(void);
|
||||||
|
void PIN_INT1_DriverIRQHandler(void)
|
||||||
|
{
|
||||||
|
uint32_t pmstatus;
|
||||||
|
|
||||||
|
/* Reset pattern match detection */
|
||||||
|
pmstatus = PINT_PatternMatchResetDetectLogic(PINT);
|
||||||
|
/* Call user function */
|
||||||
|
if (s_pintCallback[kPINT_PinInt1] != NULL)
|
||||||
|
{
|
||||||
|
s_pintCallback[kPINT_PinInt1](kPINT_PinInt1, pmstatus);
|
||||||
|
}
|
||||||
|
if ((PINT->ISEL & 0x2U) == 0x0U)
|
||||||
|
{
|
||||||
|
/* Edge sensitive: clear Pin interrupt after callback */
|
||||||
|
PINT_PinInterruptClrStatus(PINT, kPINT_PinInt1);
|
||||||
|
}
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS > 2U)
|
||||||
|
void PIN_INT2_DriverIRQHandler(void);
|
||||||
|
void PIN_INT2_DriverIRQHandler(void)
|
||||||
|
{
|
||||||
|
uint32_t pmstatus;
|
||||||
|
|
||||||
|
/* Reset pattern match detection */
|
||||||
|
pmstatus = PINT_PatternMatchResetDetectLogic(PINT);
|
||||||
|
/* Call user function */
|
||||||
|
if (s_pintCallback[kPINT_PinInt2] != NULL)
|
||||||
|
{
|
||||||
|
s_pintCallback[kPINT_PinInt2](kPINT_PinInt2, pmstatus);
|
||||||
|
}
|
||||||
|
if ((PINT->ISEL & 0x4U) == 0x0U)
|
||||||
|
{
|
||||||
|
/* Edge sensitive: clear Pin interrupt after callback */
|
||||||
|
PINT_PinInterruptClrStatus(PINT, kPINT_PinInt2);
|
||||||
|
}
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS > 3U)
|
||||||
|
void PIN_INT3_DriverIRQHandler(void);
|
||||||
|
void PIN_INT3_DriverIRQHandler(void)
|
||||||
|
{
|
||||||
|
uint32_t pmstatus;
|
||||||
|
|
||||||
|
/* Reset pattern match detection */
|
||||||
|
pmstatus = PINT_PatternMatchResetDetectLogic(PINT);
|
||||||
|
/* Call user function */
|
||||||
|
if (s_pintCallback[kPINT_PinInt3] != NULL)
|
||||||
|
{
|
||||||
|
s_pintCallback[kPINT_PinInt3](kPINT_PinInt3, pmstatus);
|
||||||
|
}
|
||||||
|
if ((PINT->ISEL & 0x8U) == 0x0U)
|
||||||
|
{
|
||||||
|
/* Edge sensitive: clear Pin interrupt after callback */
|
||||||
|
PINT_PinInterruptClrStatus(PINT, kPINT_PinInt3);
|
||||||
|
}
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS > 4U)
|
||||||
|
void PIN_INT4_DriverIRQHandler(void);
|
||||||
|
void PIN_INT4_DriverIRQHandler(void)
|
||||||
|
{
|
||||||
|
uint32_t pmstatus;
|
||||||
|
|
||||||
|
/* Reset pattern match detection */
|
||||||
|
pmstatus = PINT_PatternMatchResetDetectLogic(PINT);
|
||||||
|
/* Call user function */
|
||||||
|
if (s_pintCallback[kPINT_PinInt4] != NULL)
|
||||||
|
{
|
||||||
|
s_pintCallback[kPINT_PinInt4](kPINT_PinInt4, pmstatus);
|
||||||
|
}
|
||||||
|
if ((PINT->ISEL & 0x10U) == 0x0U)
|
||||||
|
{
|
||||||
|
/* Edge sensitive: clear Pin interrupt after callback */
|
||||||
|
PINT_PinInterruptClrStatus(PINT, kPINT_PinInt4);
|
||||||
|
}
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS > 5U)
|
||||||
|
#if defined(FSL_FEATURE_NVIC_HAS_SHARED_INTERTTUPT_NUMBER) && FSL_FEATURE_NVIC_HAS_SHARED_INTERTTUPT_NUMBER
|
||||||
|
void PIN_INT5_DAC1_IRQHandler(void)
|
||||||
|
#else
|
||||||
|
void PIN_INT5_DriverIRQHandler(void);
|
||||||
|
void PIN_INT5_DriverIRQHandler(void)
|
||||||
|
#endif /* FSL_FEATURE_NVIC_HAS_SHARED_INTERTTUPT_NUMBER */
|
||||||
|
{
|
||||||
|
uint32_t pmstatus;
|
||||||
|
|
||||||
|
/* Reset pattern match detection */
|
||||||
|
pmstatus = PINT_PatternMatchResetDetectLogic(PINT);
|
||||||
|
/* Call user function */
|
||||||
|
if (s_pintCallback[kPINT_PinInt5] != NULL)
|
||||||
|
{
|
||||||
|
s_pintCallback[kPINT_PinInt5](kPINT_PinInt5, pmstatus);
|
||||||
|
}
|
||||||
|
if ((PINT->ISEL & 0x20U) == 0x0U)
|
||||||
|
{
|
||||||
|
/* Edge sensitive: clear Pin interrupt after callback */
|
||||||
|
PINT_PinInterruptClrStatus(PINT, kPINT_PinInt5);
|
||||||
|
}
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS > 6U)
|
||||||
|
#if defined(FSL_FEATURE_NVIC_HAS_SHARED_INTERTTUPT_NUMBER) && FSL_FEATURE_NVIC_HAS_SHARED_INTERTTUPT_NUMBER
|
||||||
|
void PIN_INT6_USART3_IRQHandler(void)
|
||||||
|
#else
|
||||||
|
void PIN_INT6_DriverIRQHandler(void);
|
||||||
|
void PIN_INT6_DriverIRQHandler(void)
|
||||||
|
#endif /* FSL_FEATURE_NVIC_HAS_SHARED_INTERTTUPT_NUMBER */
|
||||||
|
{
|
||||||
|
uint32_t pmstatus;
|
||||||
|
|
||||||
|
/* Reset pattern match detection */
|
||||||
|
pmstatus = PINT_PatternMatchResetDetectLogic(PINT);
|
||||||
|
/* Call user function */
|
||||||
|
if (s_pintCallback[kPINT_PinInt6] != NULL)
|
||||||
|
{
|
||||||
|
s_pintCallback[kPINT_PinInt6](kPINT_PinInt6, pmstatus);
|
||||||
|
}
|
||||||
|
if ((PINT->ISEL & 0x40U) == 0x0U)
|
||||||
|
{
|
||||||
|
/* Edge sensitive: clear Pin interrupt after callback */
|
||||||
|
PINT_PinInterruptClrStatus(PINT, kPINT_PinInt6);
|
||||||
|
}
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS > 7U)
|
||||||
|
#if defined(FSL_FEATURE_NVIC_HAS_SHARED_INTERTTUPT_NUMBER) && FSL_FEATURE_NVIC_HAS_SHARED_INTERTTUPT_NUMBER
|
||||||
|
void PIN_INT7_USART4_IRQHandler(void)
|
||||||
|
#else
|
||||||
|
void PIN_INT7_DriverIRQHandler(void);
|
||||||
|
void PIN_INT7_DriverIRQHandler(void)
|
||||||
|
#endif /* FSL_FEATURE_NVIC_HAS_SHARED_INTERTTUPT_NUMBER */
|
||||||
|
{
|
||||||
|
uint32_t pmstatus;
|
||||||
|
|
||||||
|
/* Reset pattern match detection */
|
||||||
|
pmstatus = PINT_PatternMatchResetDetectLogic(PINT);
|
||||||
|
/* Call user function */
|
||||||
|
if (s_pintCallback[kPINT_PinInt7] != NULL)
|
||||||
|
{
|
||||||
|
s_pintCallback[kPINT_PinInt7](kPINT_PinInt7, pmstatus);
|
||||||
|
}
|
||||||
|
if ((PINT->ISEL & 0x80U) == 0x0U)
|
||||||
|
{
|
||||||
|
/* Edge sensitive: clear Pin interrupt after callback */
|
||||||
|
PINT_PinInterruptClrStatus(PINT, kPINT_PinInt7);
|
||||||
|
}
|
||||||
|
SDK_ISR_EXIT_BARRIER;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,581 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016, Freescale Semiconductor, Inc.
|
||||||
|
* Copyright 2016-2020 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _FSL_PINT_H_
|
||||||
|
#define _FSL_PINT_H_
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @addtogroup pint_driver
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*! @file */
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/*! @name Driver version */
|
||||||
|
/*@{*/
|
||||||
|
#define FSL_PINT_DRIVER_VERSION (MAKE_VERSION(2, 1, 8)) /*!< Version 2.1.8 */
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
/* Number of interrupt line supported by PINT */
|
||||||
|
#define PINT_PIN_INT_COUNT 8U
|
||||||
|
|
||||||
|
/* Number of interrupt line supported by SECURE PINT */
|
||||||
|
#define SEC_PINT_PIN_INT_COUNT 2U
|
||||||
|
|
||||||
|
/* Number of input sources supported by PINT */
|
||||||
|
#define PINT_INPUT_COUNT 8U
|
||||||
|
|
||||||
|
/* PININT Bit slice source register bits */
|
||||||
|
#define PININT_BITSLICE_SRC_START 8U
|
||||||
|
#define PININT_BITSLICE_SRC_MASK 7U
|
||||||
|
|
||||||
|
/* PININT Bit slice configuration register bits */
|
||||||
|
#define PININT_BITSLICE_CFG_START 8U
|
||||||
|
#define PININT_BITSLICE_CFG_MASK 7U
|
||||||
|
#define PININT_BITSLICE_ENDP_MASK 7U
|
||||||
|
|
||||||
|
#define PINT_PIN_INT_LEVEL 0x10U
|
||||||
|
#define PINT_PIN_INT_EDGE 0x00U
|
||||||
|
#define PINT_PIN_INT_FALL_OR_HIGH_LEVEL 0x02U
|
||||||
|
#define PINT_PIN_INT_RISE 0x01U
|
||||||
|
#define PINT_PIN_RISE_EDGE (PINT_PIN_INT_EDGE | PINT_PIN_INT_RISE)
|
||||||
|
#define PINT_PIN_FALL_EDGE (PINT_PIN_INT_EDGE | PINT_PIN_INT_FALL_OR_HIGH_LEVEL)
|
||||||
|
#define PINT_PIN_BOTH_EDGE (PINT_PIN_INT_EDGE | PINT_PIN_INT_RISE | PINT_PIN_INT_FALL_OR_HIGH_LEVEL)
|
||||||
|
#define PINT_PIN_LOW_LEVEL (PINT_PIN_INT_LEVEL)
|
||||||
|
#define PINT_PIN_HIGH_LEVEL (PINT_PIN_INT_LEVEL | PINT_PIN_INT_FALL_OR_HIGH_LEVEL)
|
||||||
|
|
||||||
|
/*! @brief PINT Pin Interrupt enable type */
|
||||||
|
typedef enum _pint_pin_enable
|
||||||
|
{
|
||||||
|
kPINT_PinIntEnableNone = 0U, /*!< Do not generate Pin Interrupt */
|
||||||
|
kPINT_PinIntEnableRiseEdge = PINT_PIN_RISE_EDGE, /*!< Generate Pin Interrupt on rising edge */
|
||||||
|
kPINT_PinIntEnableFallEdge = PINT_PIN_FALL_EDGE, /*!< Generate Pin Interrupt on falling edge */
|
||||||
|
kPINT_PinIntEnableBothEdges = PINT_PIN_BOTH_EDGE, /*!< Generate Pin Interrupt on both edges */
|
||||||
|
kPINT_PinIntEnableLowLevel = PINT_PIN_LOW_LEVEL, /*!< Generate Pin Interrupt on low level */
|
||||||
|
kPINT_PinIntEnableHighLevel = PINT_PIN_HIGH_LEVEL /*!< Generate Pin Interrupt on high level */
|
||||||
|
} pint_pin_enable_t;
|
||||||
|
|
||||||
|
/*! @brief PINT Pin Interrupt type */
|
||||||
|
typedef enum _pint_int
|
||||||
|
{
|
||||||
|
kPINT_PinInt0 = 0U, /*!< Pin Interrupt 0 */
|
||||||
|
#if defined(FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS) && (FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS > 1U)
|
||||||
|
kPINT_PinInt1 = 1U, /*!< Pin Interrupt 1 */
|
||||||
|
#endif
|
||||||
|
#if defined(FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS) && (FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS > 2U)
|
||||||
|
kPINT_PinInt2 = 2U, /*!< Pin Interrupt 2 */
|
||||||
|
#endif
|
||||||
|
#if defined(FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS) && (FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS > 3U)
|
||||||
|
kPINT_PinInt3 = 3U, /*!< Pin Interrupt 3 */
|
||||||
|
#endif
|
||||||
|
#if defined(FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS) && (FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS > 4U)
|
||||||
|
kPINT_PinInt4 = 4U, /*!< Pin Interrupt 4 */
|
||||||
|
#endif
|
||||||
|
#if defined(FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS) && (FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS > 5U)
|
||||||
|
kPINT_PinInt5 = 5U, /*!< Pin Interrupt 5 */
|
||||||
|
#endif
|
||||||
|
#if defined(FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS) && (FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS > 6U)
|
||||||
|
kPINT_PinInt6 = 6U, /*!< Pin Interrupt 6 */
|
||||||
|
#endif
|
||||||
|
#if defined(FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS) && (FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS > 7U)
|
||||||
|
kPINT_PinInt7 = 7U, /*!< Pin Interrupt 7 */
|
||||||
|
#endif
|
||||||
|
#if defined(FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS) && (FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS > 0U)
|
||||||
|
kPINT_SecPinInt0 = 0U, /*!< Secure Pin Interrupt 0 */
|
||||||
|
#endif
|
||||||
|
#if defined(FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS) && (FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS > 1U)
|
||||||
|
kPINT_SecPinInt1 = 1U, /*!< Secure Pin Interrupt 1 */
|
||||||
|
#endif
|
||||||
|
} pint_pin_int_t;
|
||||||
|
|
||||||
|
/*! @brief PINT Pattern Match bit slice input source type */
|
||||||
|
typedef enum _pint_pmatch_input_src
|
||||||
|
{
|
||||||
|
kPINT_PatternMatchInp0Src = 0U, /*!< Input source 0 */
|
||||||
|
kPINT_PatternMatchInp1Src = 1U, /*!< Input source 1 */
|
||||||
|
kPINT_PatternMatchInp2Src = 2U, /*!< Input source 2 */
|
||||||
|
kPINT_PatternMatchInp3Src = 3U, /*!< Input source 3 */
|
||||||
|
kPINT_PatternMatchInp4Src = 4U, /*!< Input source 4 */
|
||||||
|
kPINT_PatternMatchInp5Src = 5U, /*!< Input source 5 */
|
||||||
|
kPINT_PatternMatchInp6Src = 6U, /*!< Input source 6 */
|
||||||
|
kPINT_PatternMatchInp7Src = 7U, /*!< Input source 7 */
|
||||||
|
kPINT_SecPatternMatchInp0Src = 0U, /*!< Input source 0 */
|
||||||
|
kPINT_SecPatternMatchInp1Src = 1U, /*!< Input source 1 */
|
||||||
|
} pint_pmatch_input_src_t;
|
||||||
|
|
||||||
|
/*! @brief PINT Pattern Match bit slice type */
|
||||||
|
typedef enum _pint_pmatch_bslice
|
||||||
|
{
|
||||||
|
kPINT_PatternMatchBSlice0 = 0U, /*!< Bit slice 0 */
|
||||||
|
#if defined(FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS) && (FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS > 1U)
|
||||||
|
kPINT_PatternMatchBSlice1 = 1U, /*!< Bit slice 1 */
|
||||||
|
#endif
|
||||||
|
#if defined(FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS) && (FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS > 2U)
|
||||||
|
kPINT_PatternMatchBSlice2 = 2U, /*!< Bit slice 2 */
|
||||||
|
#endif
|
||||||
|
#if defined(FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS) && (FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS > 3U)
|
||||||
|
kPINT_PatternMatchBSlice3 = 3U, /*!< Bit slice 3 */
|
||||||
|
#endif
|
||||||
|
#if defined(FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS) && (FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS > 4U)
|
||||||
|
kPINT_PatternMatchBSlice4 = 4U, /*!< Bit slice 4 */
|
||||||
|
#endif
|
||||||
|
#if defined(FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS) && (FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS > 5U)
|
||||||
|
kPINT_PatternMatchBSlice5 = 5U, /*!< Bit slice 5 */
|
||||||
|
#endif
|
||||||
|
#if defined(FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS) && (FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS > 6U)
|
||||||
|
kPINT_PatternMatchBSlice6 = 6U, /*!< Bit slice 6 */
|
||||||
|
#endif
|
||||||
|
#if defined(FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS) && (FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS > 7U)
|
||||||
|
kPINT_PatternMatchBSlice7 = 7U, /*!< Bit slice 7 */
|
||||||
|
#endif
|
||||||
|
#if defined(FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS) && (FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS > 0U)
|
||||||
|
kPINT_SecPatternMatchBSlice0 = 0U, /*!< Bit slice 0 */
|
||||||
|
#endif
|
||||||
|
#if defined(FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS) && (FSL_FEATURE_SECPINT_NUMBER_OF_CONNECTED_OUTPUTS > 1U)
|
||||||
|
kPINT_SecPatternMatchBSlice1 = 1U, /*!< Bit slice 1 */
|
||||||
|
#endif
|
||||||
|
} pint_pmatch_bslice_t;
|
||||||
|
|
||||||
|
/*! @brief PINT Pattern Match configuration type */
|
||||||
|
typedef enum _pint_pmatch_bslice_cfg
|
||||||
|
{
|
||||||
|
kPINT_PatternMatchAlways = 0U, /*!< Always Contributes to product term match */
|
||||||
|
kPINT_PatternMatchStickyRise = 1U, /*!< Sticky Rising edge */
|
||||||
|
kPINT_PatternMatchStickyFall = 2U, /*!< Sticky Falling edge */
|
||||||
|
kPINT_PatternMatchStickyBothEdges = 3U, /*!< Sticky Rising or Falling edge */
|
||||||
|
kPINT_PatternMatchHigh = 4U, /*!< High level */
|
||||||
|
kPINT_PatternMatchLow = 5U, /*!< Low level */
|
||||||
|
kPINT_PatternMatchNever = 6U, /*!< Never contributes to product term match */
|
||||||
|
kPINT_PatternMatchBothEdges = 7U, /*!< Either rising or falling edge */
|
||||||
|
} pint_pmatch_bslice_cfg_t;
|
||||||
|
|
||||||
|
/*! @brief PINT Callback function. */
|
||||||
|
typedef void (*pint_cb_t)(pint_pin_int_t pintr, uint32_t pmatch_status);
|
||||||
|
|
||||||
|
typedef struct _pint_pmatch_cfg
|
||||||
|
{
|
||||||
|
pint_pmatch_input_src_t bs_src;
|
||||||
|
pint_pmatch_bslice_cfg_t bs_cfg;
|
||||||
|
bool end_point;
|
||||||
|
pint_cb_t callback;
|
||||||
|
} pint_pmatch_cfg_t;
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Initialize PINT peripheral.
|
||||||
|
|
||||||
|
* This function initializes the PINT peripheral and enables the clock.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
void PINT_Init(PINT_Type *base);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Configure PINT peripheral pin interrupt.
|
||||||
|
|
||||||
|
* This function configures a given pin interrupt.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
* @param intr Pin interrupt.
|
||||||
|
* @param enable Selects detection logic.
|
||||||
|
* @param callback Callback.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
void PINT_PinInterruptConfig(PINT_Type *base, pint_pin_int_t intr, pint_pin_enable_t enable, pint_cb_t callback);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Get PINT peripheral pin interrupt configuration.
|
||||||
|
|
||||||
|
* This function returns the configuration of a given pin interrupt.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
* @param pintr Pin interrupt.
|
||||||
|
* @param enable Pointer to store the detection logic.
|
||||||
|
* @param callback Callback.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
void PINT_PinInterruptGetConfig(PINT_Type *base, pint_pin_int_t pintr, pint_pin_enable_t *enable, pint_cb_t *callback);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Clear Selected pin interrupt status only when the pin was triggered by edge-sensitive.
|
||||||
|
|
||||||
|
* This function clears the selected pin interrupt status.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
* @param pintr Pin interrupt.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
void PINT_PinInterruptClrStatus(PINT_Type *base, pint_pin_int_t pintr);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Get Selected pin interrupt status.
|
||||||
|
|
||||||
|
* This function returns the selected pin interrupt status.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
* @param pintr Pin interrupt.
|
||||||
|
*
|
||||||
|
* @retval status = 0 No pin interrupt request. = 1 Selected Pin interrupt request active.
|
||||||
|
*/
|
||||||
|
static inline uint32_t PINT_PinInterruptGetStatus(PINT_Type *base, pint_pin_int_t pintr)
|
||||||
|
{
|
||||||
|
return ((base->IST & (1UL << (uint32_t)pintr)) != 0U ? 1U : 0U);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Clear all pin interrupts status only when pins were triggered by edge-sensitive.
|
||||||
|
|
||||||
|
* This function clears the status of all pin interrupts.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
void PINT_PinInterruptClrStatusAll(PINT_Type *base);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Get all pin interrupts status.
|
||||||
|
|
||||||
|
* This function returns the status of all pin interrupts.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
*
|
||||||
|
* @retval status Each bit position indicates the status of corresponding pin interrupt.
|
||||||
|
* = 0 No pin interrupt request. = 1 Pin interrupt request active.
|
||||||
|
*/
|
||||||
|
static inline uint32_t PINT_PinInterruptGetStatusAll(PINT_Type *base)
|
||||||
|
{
|
||||||
|
return (base->IST);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Clear Selected pin interrupt fall flag.
|
||||||
|
|
||||||
|
* This function clears the selected pin interrupt fall flag.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
* @param pintr Pin interrupt.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
static inline void PINT_PinInterruptClrFallFlag(PINT_Type *base, pint_pin_int_t pintr)
|
||||||
|
{
|
||||||
|
base->FALL = (1UL << (uint32_t)pintr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Get selected pin interrupt fall flag.
|
||||||
|
|
||||||
|
* This function returns the selected pin interrupt fall flag.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
* @param pintr Pin interrupt.
|
||||||
|
*
|
||||||
|
* @retval flag = 0 Falling edge has not been detected. = 1 Falling edge has been detected.
|
||||||
|
*/
|
||||||
|
static inline uint32_t PINT_PinInterruptGetFallFlag(PINT_Type *base, pint_pin_int_t pintr)
|
||||||
|
{
|
||||||
|
return ((base->FALL & (1UL << (uint32_t)pintr)) != 0U ? 1U : 0U);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Clear all pin interrupt fall flags.
|
||||||
|
|
||||||
|
* This function clears the fall flag for all pin interrupts.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
static inline void PINT_PinInterruptClrFallFlagAll(PINT_Type *base)
|
||||||
|
{
|
||||||
|
base->FALL = PINT_FALL_FDET_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Get all pin interrupt fall flags.
|
||||||
|
|
||||||
|
* This function returns the fall flag of all pin interrupts.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
*
|
||||||
|
* @retval flags Each bit position indicates the falling edge detection of the corresponding pin interrupt.
|
||||||
|
* 0 Falling edge has not been detected. = 1 Falling edge has been detected.
|
||||||
|
*/
|
||||||
|
static inline uint32_t PINT_PinInterruptGetFallFlagAll(PINT_Type *base)
|
||||||
|
{
|
||||||
|
return (base->FALL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Clear Selected pin interrupt rise flag.
|
||||||
|
|
||||||
|
* This function clears the selected pin interrupt rise flag.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
* @param pintr Pin interrupt.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
static inline void PINT_PinInterruptClrRiseFlag(PINT_Type *base, pint_pin_int_t pintr)
|
||||||
|
{
|
||||||
|
base->RISE = (1UL << (uint32_t)pintr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Get selected pin interrupt rise flag.
|
||||||
|
|
||||||
|
* This function returns the selected pin interrupt rise flag.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
* @param pintr Pin interrupt.
|
||||||
|
*
|
||||||
|
* @retval flag = 0 Rising edge has not been detected. = 1 Rising edge has been detected.
|
||||||
|
*/
|
||||||
|
static inline uint32_t PINT_PinInterruptGetRiseFlag(PINT_Type *base, pint_pin_int_t pintr)
|
||||||
|
{
|
||||||
|
return ((base->RISE & (1UL << (uint32_t)pintr)) != 0U ? 1U : 0U);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Clear all pin interrupt rise flags.
|
||||||
|
|
||||||
|
* This function clears the rise flag for all pin interrupts.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
static inline void PINT_PinInterruptClrRiseFlagAll(PINT_Type *base)
|
||||||
|
{
|
||||||
|
base->RISE = PINT_RISE_RDET_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Get all pin interrupt rise flags.
|
||||||
|
|
||||||
|
* This function returns the rise flag of all pin interrupts.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
*
|
||||||
|
* @retval flags Each bit position indicates the rising edge detection of the corresponding pin interrupt.
|
||||||
|
* 0 Rising edge has not been detected. = 1 Rising edge has been detected.
|
||||||
|
*/
|
||||||
|
static inline uint32_t PINT_PinInterruptGetRiseFlagAll(PINT_Type *base)
|
||||||
|
{
|
||||||
|
return (base->RISE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Configure PINT pattern match.
|
||||||
|
|
||||||
|
* This function configures a given pattern match bit slice.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
* @param bslice Pattern match bit slice number.
|
||||||
|
* @param cfg Pointer to bit slice configuration.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
void PINT_PatternMatchConfig(PINT_Type *base, pint_pmatch_bslice_t bslice, pint_pmatch_cfg_t *cfg);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Get PINT pattern match configuration.
|
||||||
|
|
||||||
|
* This function returns the configuration of a given pattern match bit slice.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
* @param bslice Pattern match bit slice number.
|
||||||
|
* @param cfg Pointer to bit slice configuration.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
void PINT_PatternMatchGetConfig(PINT_Type *base, pint_pmatch_bslice_t bslice, pint_pmatch_cfg_t *cfg);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Get pattern match bit slice status.
|
||||||
|
|
||||||
|
* This function returns the status of selected bit slice.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
* @param bslice Pattern match bit slice number.
|
||||||
|
*
|
||||||
|
* @retval status = 0 Match has not been detected. = 1 Match has been detected.
|
||||||
|
*/
|
||||||
|
static inline uint32_t PINT_PatternMatchGetStatus(PINT_Type *base, pint_pmatch_bslice_t bslice)
|
||||||
|
{
|
||||||
|
return ((base->PMCTRL >> PINT_PMCTRL_PMAT_SHIFT) & (1UL << (uint32_t)bslice)) >> (uint32_t)bslice;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Get status of all pattern match bit slices.
|
||||||
|
|
||||||
|
* This function returns the status of all bit slices.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
*
|
||||||
|
* @retval status Each bit position indicates the match status of corresponding bit slice.
|
||||||
|
* = 0 Match has not been detected. = 1 Match has been detected.
|
||||||
|
*/
|
||||||
|
static inline uint32_t PINT_PatternMatchGetStatusAll(PINT_Type *base)
|
||||||
|
{
|
||||||
|
return base->PMCTRL >> PINT_PMCTRL_PMAT_SHIFT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reset pattern match detection logic.
|
||||||
|
|
||||||
|
* This function resets the pattern match detection logic if any of the product term is matching.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
*
|
||||||
|
* @retval pmstatus Each bit position indicates the match status of corresponding bit slice.
|
||||||
|
* = 0 Match was detected. = 1 Match was not detected.
|
||||||
|
*/
|
||||||
|
uint32_t PINT_PatternMatchResetDetectLogic(PINT_Type *base);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enable pattern match function.
|
||||||
|
|
||||||
|
* This function enables the pattern match function.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
static inline void PINT_PatternMatchEnable(PINT_Type *base)
|
||||||
|
{
|
||||||
|
base->PMCTRL = (base->PMCTRL & PINT_PMCTRL_ENA_RXEV_MASK) | PINT_PMCTRL_SEL_PMATCH_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Disable pattern match function.
|
||||||
|
|
||||||
|
* This function disables the pattern match function.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
static inline void PINT_PatternMatchDisable(PINT_Type *base)
|
||||||
|
{
|
||||||
|
base->PMCTRL = (base->PMCTRL & PINT_PMCTRL_ENA_RXEV_MASK) & ~PINT_PMCTRL_SEL_PMATCH_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enable RXEV output.
|
||||||
|
|
||||||
|
* This function enables the pattern match RXEV output.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
static inline void PINT_PatternMatchEnableRXEV(PINT_Type *base)
|
||||||
|
{
|
||||||
|
base->PMCTRL = (base->PMCTRL & PINT_PMCTRL_SEL_PMATCH_MASK) | PINT_PMCTRL_ENA_RXEV_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Disable RXEV output.
|
||||||
|
|
||||||
|
* This function disables the pattern match RXEV output.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
static inline void PINT_PatternMatchDisableRXEV(PINT_Type *base)
|
||||||
|
{
|
||||||
|
base->PMCTRL = (base->PMCTRL & PINT_PMCTRL_SEL_PMATCH_MASK) & ~PINT_PMCTRL_ENA_RXEV_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enable callback.
|
||||||
|
|
||||||
|
* This function enables the interrupt for the selected PINT peripheral. Although the pin(s) are monitored
|
||||||
|
* as soon as they are enabled, the callback function is not enabled until this function is called.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
void PINT_EnableCallback(PINT_Type *base);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Disable callback.
|
||||||
|
|
||||||
|
* This function disables the interrupt for the selected PINT peripheral. Although the pins are still
|
||||||
|
* being monitored but the callback function is not called.
|
||||||
|
*
|
||||||
|
* @param base Base address of the peripheral.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
void PINT_DisableCallback(PINT_Type *base);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Deinitialize PINT peripheral.
|
||||||
|
|
||||||
|
* This function disables the PINT clock.
|
||||||
|
*
|
||||||
|
* @param base Base address of the PINT peripheral.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
void PINT_Deinit(PINT_Type *base);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief enable callback by pin index.
|
||||||
|
|
||||||
|
* This function enables callback by pin index instead of enabling all pins.
|
||||||
|
*
|
||||||
|
* @param base Base address of the peripheral.
|
||||||
|
* @param pintIdx pin index.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
void PINT_EnableCallbackByIndex(PINT_Type *base, pint_pin_int_t pintIdx);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief disable callback by pin index.
|
||||||
|
|
||||||
|
* This function disables callback by pin index instead of disabling all pins.
|
||||||
|
*
|
||||||
|
* @param base Base address of the peripheral.
|
||||||
|
* @param pintIdx pin index.
|
||||||
|
*
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
void PINT_DisableCallbackByIndex(PINT_Type *base, pint_pin_int_t pintIdx);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
#endif /* _FSL_PINT_H_ */
|
||||||
|
|
@ -0,0 +1,99 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016, Freescale Semiconductor, Inc.
|
||||||
|
* Copyright 2016, NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
#include "fsl_reset.h"
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
/* Component ID definition, used by tools. */
|
||||||
|
#ifndef FSL_COMPONENT_ID
|
||||||
|
#define FSL_COMPONENT_ID "platform.drivers.reset"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Variables
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Prototypes
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#if (defined(FSL_FEATURE_SOC_SYSCON_COUNT) && (FSL_FEATURE_SOC_SYSCON_COUNT > 0))
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* brief Assert reset to peripheral.
|
||||||
|
*
|
||||||
|
* Asserts reset signal to specified peripheral module.
|
||||||
|
*
|
||||||
|
* param peripheral Assert reset to this peripheral. The enum argument contains encoding of reset register
|
||||||
|
* and reset bit position in the reset register.
|
||||||
|
*/
|
||||||
|
void RESET_SetPeripheralReset(reset_ip_name_t peripheral)
|
||||||
|
{
|
||||||
|
const uint32_t regIndex = ((uint32_t)peripheral & 0xFFFF0000u) >> 16;
|
||||||
|
const uint32_t bitPos = ((uint32_t)peripheral & 0x0000FFFFu);
|
||||||
|
const uint32_t bitMask = 1UL << bitPos;
|
||||||
|
|
||||||
|
assert(bitPos < 32u);
|
||||||
|
|
||||||
|
/* reset register is in SYSCON */
|
||||||
|
/* set bit */
|
||||||
|
SYSCON->PRESETCTRLSET[regIndex] = bitMask;
|
||||||
|
/* wait until it reads 0b1 */
|
||||||
|
while (0u == (SYSCON->PRESETCTRLX[regIndex] & bitMask))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* brief Clear reset to peripheral.
|
||||||
|
*
|
||||||
|
* Clears reset signal to specified peripheral module, allows it to operate.
|
||||||
|
*
|
||||||
|
* param peripheral Clear reset to this peripheral. The enum argument contains encoding of reset register
|
||||||
|
* and reset bit position in the reset register.
|
||||||
|
*/
|
||||||
|
void RESET_ClearPeripheralReset(reset_ip_name_t peripheral)
|
||||||
|
{
|
||||||
|
const uint32_t regIndex = ((uint32_t)peripheral & 0xFFFF0000u) >> 16;
|
||||||
|
const uint32_t bitPos = ((uint32_t)peripheral & 0x0000FFFFu);
|
||||||
|
const uint32_t bitMask = 1UL << bitPos;
|
||||||
|
|
||||||
|
assert(bitPos < 32u);
|
||||||
|
|
||||||
|
/* reset register is in SYSCON */
|
||||||
|
|
||||||
|
/* clear bit */
|
||||||
|
SYSCON->PRESETCTRLCLR[regIndex] = bitMask;
|
||||||
|
/* wait until it reads 0b0 */
|
||||||
|
while (bitMask == (SYSCON->PRESETCTRLX[regIndex] & bitMask))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* brief Reset peripheral module.
|
||||||
|
*
|
||||||
|
* Reset peripheral module.
|
||||||
|
*
|
||||||
|
* param peripheral Peripheral to reset. The enum argument contains encoding of reset register
|
||||||
|
* and reset bit position in the reset register.
|
||||||
|
*/
|
||||||
|
void RESET_PeripheralReset(reset_ip_name_t peripheral)
|
||||||
|
{
|
||||||
|
RESET_SetPeripheralReset(peripheral);
|
||||||
|
RESET_ClearPeripheralReset(peripheral);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* FSL_FEATURE_SOC_SYSCON_COUNT || FSL_FEATURE_SOC_ASYNC_SYSCON_COUNT */
|
||||||
|
|
@ -0,0 +1,281 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016, Freescale Semiconductor, Inc.
|
||||||
|
* Copyright 2016, NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _FSL_RESET_H_
|
||||||
|
#define _FSL_RESET_H_
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "fsl_device_registers.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @addtogroup reset
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/*! @name Driver version */
|
||||||
|
/*@{*/
|
||||||
|
/*! @brief reset driver version 2.0.2. */
|
||||||
|
#define FSL_RESET_DRIVER_VERSION (MAKE_VERSION(2, 0, 2))
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enumeration for peripheral reset control bits
|
||||||
|
*
|
||||||
|
* Defines the enumeration for peripheral reset control bits in PRESETCTRL/ASYNCPRESETCTRL registers
|
||||||
|
*/
|
||||||
|
typedef enum _SYSCON_RSTn
|
||||||
|
{
|
||||||
|
kROM_RST_SHIFT_RSTn = 0 | 1U, /**< ROM reset control */
|
||||||
|
kSRAM1_RST_SHIFT_RSTn = 0 | 3U, /**< SRAM1 reset control */
|
||||||
|
kSRAM2_RST_SHIFT_RSTn = 0 | 4U, /**< SRAM2 reset control */
|
||||||
|
kSRAM3_RST_SHIFT_RSTn = 0 | 5U, /**< SRAM3 reset control */
|
||||||
|
kSRAM4_RST_SHIFT_RSTn = 0 | 6U, /**< SRAM4 reset control */
|
||||||
|
kFLASH_RST_SHIFT_RSTn = 0 | 7U, /**< Flash controller reset control */
|
||||||
|
kFMC_RST_SHIFT_RSTn = 0 | 8U, /**< Flash accelerator reset control */
|
||||||
|
kSPIFI_RST_SHIFT_RSTn = 0 | 10U, /**< SPIFI reset control */
|
||||||
|
kMUX0_RST_SHIFT_RSTn = 0 | 11U, /**< Input mux0 reset control */
|
||||||
|
kIOCON_RST_SHIFT_RSTn = 0 | 13U, /**< IOCON reset control */
|
||||||
|
kGPIO0_RST_SHIFT_RSTn = 0 | 14U, /**< GPIO0 reset control */
|
||||||
|
kGPIO1_RST_SHIFT_RSTn = 0 | 15U, /**< GPIO1 reset control */
|
||||||
|
kGPIO2_RST_SHIFT_RSTn = 0 | 16U, /**< GPIO2 reset control */
|
||||||
|
kGPIO3_RST_SHIFT_RSTn = 0 | 17U, /**< GPIO3 reset control */
|
||||||
|
kPINT_RST_SHIFT_RSTn = 0 | 18U, /**< Pin interrupt (PINT) reset control */
|
||||||
|
kGINT_RST_SHIFT_RSTn = 0 | 19U, /**< Grouped interrupt (PINT) reset control. */
|
||||||
|
kDMA0_RST_SHIFT_RSTn = 0 | 20U, /**< DMA reset control */
|
||||||
|
kCRC_RST_SHIFT_RSTn = 0 | 21U, /**< CRC reset control */
|
||||||
|
kWWDT_RST_SHIFT_RSTn = 0 | 22U, /**< Watchdog timer reset control */
|
||||||
|
kRTC_RST_SHIFT_RSTn = 0 | 23U, /**< RTC reset control */
|
||||||
|
kMAILBOX_RST_SHIFT_RSTn = 0 | 26U, /**< Mailbox reset control */
|
||||||
|
kADC0_RST_SHIFT_RSTn = 0 | 27U, /**< ADC0 reset control */
|
||||||
|
|
||||||
|
kMRT_RST_SHIFT_RSTn = 65536 | 0U, /**< Multi-rate timer (MRT) reset control */
|
||||||
|
kOSTIMER0_RST_SHIFT_RSTn = 65536 | 1U, /**< OSTimer0 reset control */
|
||||||
|
kSCT0_RST_SHIFT_RSTn = 65536 | 2U, /**< SCTimer/PWM 0 (SCT0) reset control */
|
||||||
|
kSCTIPU_RST_SHIFT_RSTn = 65536 | 6U, /**< SCTIPU reset control */
|
||||||
|
kUTICK_RST_SHIFT_RSTn = 65536 | 10U, /**< Micro-tick timer reset control */
|
||||||
|
kFC0_RST_SHIFT_RSTn = 65536 | 11U, /**< Flexcomm Interface 0 reset control */
|
||||||
|
kFC1_RST_SHIFT_RSTn = 65536 | 12U, /**< Flexcomm Interface 1 reset control */
|
||||||
|
kFC2_RST_SHIFT_RSTn = 65536 | 13U, /**< Flexcomm Interface 2 reset control */
|
||||||
|
kFC3_RST_SHIFT_RSTn = 65536 | 14U, /**< Flexcomm Interface 3 reset control */
|
||||||
|
kFC4_RST_SHIFT_RSTn = 65536 | 15U, /**< Flexcomm Interface 4 reset control */
|
||||||
|
kFC5_RST_SHIFT_RSTn = 65536 | 16U, /**< Flexcomm Interface 5 reset control */
|
||||||
|
kFC6_RST_SHIFT_RSTn = 65536 | 17U, /**< Flexcomm Interface 6 reset control */
|
||||||
|
kFC7_RST_SHIFT_RSTn = 65536 | 18U, /**< Flexcomm Interface 7 reset control */
|
||||||
|
kCTIMER2_RST_SHIFT_RSTn = 65536 | 22U, /**< CTimer 2 reset control */
|
||||||
|
kUSB0D_RST_SHIFT_RSTn = 65536 | 25U, /**< USB0 Device reset control */
|
||||||
|
kCTIMER0_RST_SHIFT_RSTn = 65536 | 26U, /**< CTimer 0 reset control */
|
||||||
|
kCTIMER1_RST_SHIFT_RSTn = 65536 | 27U, /**< CTimer 1 reset control */
|
||||||
|
kPVT_RST_SHIFT_RSTn = 65536 | 28U, /**< PVT reset control */
|
||||||
|
kEZHA_RST_SHIFT_RSTn = 65536 | 30U, /**< EZHA reset control */
|
||||||
|
kEZHB_RST_SHIFT_RSTn = 65536 | 31U, /**< EZHB reset control */
|
||||||
|
|
||||||
|
kDMA1_RST_SHIFT_RSTn = 131072 | 1U, /**< DMA1 reset control */
|
||||||
|
kCMP_RST_SHIFT_RSTn = 131072 | 2U, /**< CMP reset control */
|
||||||
|
kSDIO_RST_SHIFT_RSTn = 131072 | 3U, /**< SDIO reset control */
|
||||||
|
kUSB1H_RST_SHIFT_RSTn = 131072 | 4U, /**< USBHS Host reset control */
|
||||||
|
kUSB1D_RST_SHIFT_RSTn = 131072 | 5U, /**< USBHS Device reset control */
|
||||||
|
kUSB1RAM_RST_SHIFT_RSTn = 131072 | 6U, /**< USB RAM reset control */
|
||||||
|
kUSB1_RST_SHIFT_RSTn = 131072 | 7U, /**< USBHS reset control */
|
||||||
|
kFREQME_RST_SHIFT_RSTn = 131072 | 8U, /**< FREQME reset control */
|
||||||
|
kGPIO4_RST_SHIFT_RSTn = 131072 | 9U, /**< GPIO4 reset control */
|
||||||
|
kGPIO5_RST_SHIFT_RSTn = 131072 | 10U, /**< GPIO5 reset control */
|
||||||
|
kAES_RST_SHIFT_RSTn = 131072 | 11U, /**< AES reset control */
|
||||||
|
kOTP_RST_SHIFT_RSTn = 131072 | 12U, /**< OTP reset control */
|
||||||
|
kRNG_RST_SHIFT_RSTn = 131072 | 13U, /**< RNG reset control */
|
||||||
|
kMUX1_RST_SHIFT_RSTn = 131072 | 14U, /**< Input mux1 reset control */
|
||||||
|
kUSB0HMR_RST_SHIFT_RSTn = 131072 | 16U, /**< USB0HMR reset control */
|
||||||
|
kUSB0HSL_RST_SHIFT_RSTn = 131072 | 17U, /**< USB0HSL reset control */
|
||||||
|
kHASHCRYPT_RST_SHIFT_RSTn = 131072 | 18U, /**< HASHCRYPT reset control */
|
||||||
|
kPOWERQUAD_RST_SHIFT_RSTn = 131072 | 19U, /**< PowerQuad reset control */
|
||||||
|
kPLULUT_RST_SHIFT_RSTn = 131072 | 20U, /**< PLU LUT reset control */
|
||||||
|
kCTIMER3_RST_SHIFT_RSTn = 131072 | 21U, /**< CTimer 3 reset control */
|
||||||
|
kCTIMER4_RST_SHIFT_RSTn = 131072 | 22U, /**< CTimer 4 reset control */
|
||||||
|
kPUF_RST_SHIFT_RSTn = 131072 | 23U, /**< PUF reset control */
|
||||||
|
kCASPER_RST_SHIFT_RSTn = 131072 | 24U, /**< CASPER reset control */
|
||||||
|
kCAP0_RST_SHIFT_RSTn = 131072 | 25U, /**< CASPER reset control */
|
||||||
|
kOSTIMER1_RST_SHIFT_RSTn = 131072 | 26U, /**< OSTIMER1 reset control */
|
||||||
|
kANALOGCTL_RST_SHIFT_RSTn = 131072 | 27U, /**< ANALOG_CTL reset control */
|
||||||
|
kHSLSPI_RST_SHIFT_RSTn = 131072 | 28U, /**< HS LSPI reset control */
|
||||||
|
kGPIOSEC_RST_SHIFT_RSTn = 131072 | 29U, /**< GPIO Secure reset control */
|
||||||
|
kGPIOSECINT_RST_SHIFT_RSTn = 131072 | 30U, /**< GPIO Secure int reset control */
|
||||||
|
} SYSCON_RSTn_t;
|
||||||
|
|
||||||
|
/** Array initializers with peripheral reset bits **/
|
||||||
|
#define ADC_RSTS \
|
||||||
|
{ \
|
||||||
|
kADC0_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for ADC peripheral */
|
||||||
|
#define AES_RSTS \
|
||||||
|
{ \
|
||||||
|
kAES_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for AES peripheral */
|
||||||
|
#define CRC_RSTS \
|
||||||
|
{ \
|
||||||
|
kCRC_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for CRC peripheral */
|
||||||
|
#define CTIMER_RSTS \
|
||||||
|
{ \
|
||||||
|
kCTIMER0_RST_SHIFT_RSTn, kCTIMER1_RST_SHIFT_RSTn, kCTIMER2_RST_SHIFT_RSTn, kCTIMER3_RST_SHIFT_RSTn, \
|
||||||
|
kCTIMER4_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for CTIMER peripheral */
|
||||||
|
#define DMA_RSTS_N \
|
||||||
|
{ \
|
||||||
|
kDMA0_RST_SHIFT_RSTn, kDMA1_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for DMA peripheral */
|
||||||
|
|
||||||
|
#define FLEXCOMM_RSTS \
|
||||||
|
{ \
|
||||||
|
kFC0_RST_SHIFT_RSTn, kFC1_RST_SHIFT_RSTn, kFC2_RST_SHIFT_RSTn, kFC3_RST_SHIFT_RSTn, kFC4_RST_SHIFT_RSTn, \
|
||||||
|
kFC5_RST_SHIFT_RSTn, kFC6_RST_SHIFT_RSTn, kFC7_RST_SHIFT_RSTn, kHSLSPI_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for FLEXCOMM peripheral */
|
||||||
|
#define GINT_RSTS \
|
||||||
|
{ \
|
||||||
|
kGINT_RST_SHIFT_RSTn, kGINT_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for GINT peripheral. GINT0 & GINT1 share same slot */
|
||||||
|
#define GPIO_RSTS_N \
|
||||||
|
{ \
|
||||||
|
kGPIO0_RST_SHIFT_RSTn, kGPIO1_RST_SHIFT_RSTn, kGPIO2_RST_SHIFT_RSTn, kGPIO3_RST_SHIFT_RSTn, \
|
||||||
|
kGPIO4_RST_SHIFT_RSTn, kGPIO5_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for GPIO peripheral */
|
||||||
|
#define INPUTMUX_RSTS \
|
||||||
|
{ \
|
||||||
|
kMUX0_RST_SHIFT_RSTn, kMUX1_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for INPUTMUX peripheral */
|
||||||
|
#define IOCON_RSTS \
|
||||||
|
{ \
|
||||||
|
kIOCON_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for IOCON peripheral */
|
||||||
|
#define FLASH_RSTS \
|
||||||
|
{ \
|
||||||
|
kFLASH_RST_SHIFT_RSTn, kFMC_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for Flash peripheral */
|
||||||
|
#define MRT_RSTS \
|
||||||
|
{ \
|
||||||
|
kMRT_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for MRT peripheral */
|
||||||
|
#define OTP_RSTS \
|
||||||
|
{ \
|
||||||
|
kOTP_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for OTP peripheral */
|
||||||
|
#define PINT_RSTS \
|
||||||
|
{ \
|
||||||
|
kPINT_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for PINT peripheral */
|
||||||
|
#define RNG_RSTS \
|
||||||
|
{ \
|
||||||
|
kRNG_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for RNG peripheral */
|
||||||
|
#define SDIO_RST \
|
||||||
|
{ \
|
||||||
|
kSDIO_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for SDIO peripheral */
|
||||||
|
#define SCT_RSTS \
|
||||||
|
{ \
|
||||||
|
kSCT0_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for SCT peripheral */
|
||||||
|
#define SPIFI_RSTS \
|
||||||
|
{ \
|
||||||
|
kSPIFI_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for SPIFI peripheral */
|
||||||
|
#define USB0D_RST \
|
||||||
|
{ \
|
||||||
|
kUSB0D_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for USB0D peripheral */
|
||||||
|
#define USB0HMR_RST \
|
||||||
|
{ \
|
||||||
|
kUSB0HMR_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for USB0HMR peripheral */
|
||||||
|
#define USB0HSL_RST \
|
||||||
|
{ \
|
||||||
|
kUSB0HSL_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for USB0HSL peripheral */
|
||||||
|
#define USB1H_RST \
|
||||||
|
{ \
|
||||||
|
kUSB1H_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for USB1H peripheral */
|
||||||
|
#define USB1D_RST \
|
||||||
|
{ \
|
||||||
|
kUSB1D_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for USB1D peripheral */
|
||||||
|
#define USB1RAM_RST \
|
||||||
|
{ \
|
||||||
|
kUSB1RAM_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for USB1RAM peripheral */
|
||||||
|
#define UTICK_RSTS \
|
||||||
|
{ \
|
||||||
|
kUTICK_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for UTICK peripheral */
|
||||||
|
#define WWDT_RSTS \
|
||||||
|
{ \
|
||||||
|
kWWDT_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for WWDT peripheral */
|
||||||
|
#define CAPT_RSTS_N \
|
||||||
|
{ \
|
||||||
|
kCAP0_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for CAPT peripheral */
|
||||||
|
#define PLU_RSTS_N \
|
||||||
|
{ \
|
||||||
|
kPLULUT_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for PLU peripheral */
|
||||||
|
#define OSTIMER_RSTS \
|
||||||
|
{ \
|
||||||
|
kOSTIMER0_RST_SHIFT_RSTn \
|
||||||
|
} /* Reset bits for OSTIMER peripheral */
|
||||||
|
typedef SYSCON_RSTn_t reset_ip_name_t;
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Assert reset to peripheral.
|
||||||
|
*
|
||||||
|
* Asserts reset signal to specified peripheral module.
|
||||||
|
*
|
||||||
|
* @param peripheral Assert reset to this peripheral. The enum argument contains encoding of reset register
|
||||||
|
* and reset bit position in the reset register.
|
||||||
|
*/
|
||||||
|
void RESET_SetPeripheralReset(reset_ip_name_t peripheral);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Clear reset to peripheral.
|
||||||
|
*
|
||||||
|
* Clears reset signal to specified peripheral module, allows it to operate.
|
||||||
|
*
|
||||||
|
* @param peripheral Clear reset to this peripheral. The enum argument contains encoding of reset register
|
||||||
|
* and reset bit position in the reset register.
|
||||||
|
*/
|
||||||
|
void RESET_ClearPeripheralReset(reset_ip_name_t peripheral);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reset peripheral module.
|
||||||
|
*
|
||||||
|
* Reset peripheral module.
|
||||||
|
*
|
||||||
|
* @param peripheral Peripheral to reset. The enum argument contains encoding of reset register
|
||||||
|
* and reset bit position in the reset register.
|
||||||
|
*/
|
||||||
|
void RESET_PeripheralReset(reset_ip_name_t peripheral);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @} */
|
||||||
|
|
||||||
|
#endif /* _FSL_RESET_H_ */
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,866 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016, Freescale Semiconductor, Inc.
|
||||||
|
* Copyright 2016-2021 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
#ifndef _FSL_USART_H_
|
||||||
|
#define _FSL_USART_H_
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @addtogroup usart_driver
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/*! @name Driver version */
|
||||||
|
/*@{*/
|
||||||
|
/*! @brief USART driver version. */
|
||||||
|
#define FSL_USART_DRIVER_VERSION (MAKE_VERSION(2, 5, 1))
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
#define USART_FIFOTRIG_TXLVL_GET(base) (((base)->FIFOTRIG & USART_FIFOTRIG_TXLVL_MASK) >> USART_FIFOTRIG_TXLVL_SHIFT)
|
||||||
|
#define USART_FIFOTRIG_RXLVL_GET(base) (((base)->FIFOTRIG & USART_FIFOTRIG_RXLVL_MASK) >> USART_FIFOTRIG_RXLVL_SHIFT)
|
||||||
|
|
||||||
|
/*! @brief Retry times for waiting flag. */
|
||||||
|
#ifndef UART_RETRY_TIMES
|
||||||
|
#define UART_RETRY_TIMES 0U /* Defining to zero means to keep waiting for the flag until it is assert/deassert. */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @brief Error codes for the USART driver. */
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kStatus_USART_TxBusy = MAKE_STATUS(kStatusGroup_LPC_USART, 0), /*!< Transmitter is busy. */
|
||||||
|
kStatus_USART_RxBusy = MAKE_STATUS(kStatusGroup_LPC_USART, 1), /*!< Receiver is busy. */
|
||||||
|
kStatus_USART_TxIdle = MAKE_STATUS(kStatusGroup_LPC_USART, 2), /*!< USART transmitter is idle. */
|
||||||
|
kStatus_USART_RxIdle = MAKE_STATUS(kStatusGroup_LPC_USART, 3), /*!< USART receiver is idle. */
|
||||||
|
kStatus_USART_TxError = MAKE_STATUS(kStatusGroup_LPC_USART, 7), /*!< Error happens on txFIFO. */
|
||||||
|
kStatus_USART_RxError = MAKE_STATUS(kStatusGroup_LPC_USART, 9), /*!< Error happens on rxFIFO. */
|
||||||
|
kStatus_USART_RxRingBufferOverrun = MAKE_STATUS(kStatusGroup_LPC_USART, 8), /*!< Error happens on rx ring buffer */
|
||||||
|
kStatus_USART_NoiseError = MAKE_STATUS(kStatusGroup_LPC_USART, 10), /*!< USART noise error. */
|
||||||
|
kStatus_USART_FramingError = MAKE_STATUS(kStatusGroup_LPC_USART, 11), /*!< USART framing error. */
|
||||||
|
kStatus_USART_ParityError = MAKE_STATUS(kStatusGroup_LPC_USART, 12), /*!< USART parity error. */
|
||||||
|
kStatus_USART_BaudrateNotSupport =
|
||||||
|
MAKE_STATUS(kStatusGroup_LPC_USART, 13), /*!< Baudrate is not support in current clock source */
|
||||||
|
kStatus_USART_Timeout = MAKE_STATUS(kStatusGroup_LPC_USART, 14), /*!< USART time out. */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*! @brief USART synchronous mode. */
|
||||||
|
typedef enum _usart_sync_mode
|
||||||
|
{
|
||||||
|
kUSART_SyncModeDisabled = 0x0U, /*!< Asynchronous mode. */
|
||||||
|
kUSART_SyncModeSlave = 0x2U, /*!< Synchronous slave mode. */
|
||||||
|
kUSART_SyncModeMaster = 0x3U, /*!< Synchronous master mode. */
|
||||||
|
} usart_sync_mode_t;
|
||||||
|
|
||||||
|
/*! @brief USART parity mode. */
|
||||||
|
typedef enum _usart_parity_mode
|
||||||
|
{
|
||||||
|
kUSART_ParityDisabled = 0x0U, /*!< Parity disabled */
|
||||||
|
kUSART_ParityEven = 0x2U, /*!< Parity enabled, type even, bit setting: PE|PT = 10 */
|
||||||
|
kUSART_ParityOdd = 0x3U, /*!< Parity enabled, type odd, bit setting: PE|PT = 11 */
|
||||||
|
} usart_parity_mode_t;
|
||||||
|
|
||||||
|
/*! @brief USART stop bit count. */
|
||||||
|
typedef enum _usart_stop_bit_count
|
||||||
|
{
|
||||||
|
kUSART_OneStopBit = 0U, /*!< One stop bit */
|
||||||
|
kUSART_TwoStopBit = 1U, /*!< Two stop bits */
|
||||||
|
} usart_stop_bit_count_t;
|
||||||
|
|
||||||
|
/*! @brief USART data size. */
|
||||||
|
typedef enum _usart_data_len
|
||||||
|
{
|
||||||
|
kUSART_7BitsPerChar = 0U, /*!< Seven bit mode */
|
||||||
|
kUSART_8BitsPerChar = 1U, /*!< Eight bit mode */
|
||||||
|
} usart_data_len_t;
|
||||||
|
|
||||||
|
/*! @brief USART clock polarity configuration, used in sync mode.*/
|
||||||
|
typedef enum _usart_clock_polarity
|
||||||
|
{
|
||||||
|
kUSART_RxSampleOnFallingEdge = 0x0U, /*!< Un_RXD is sampled on the falling edge of SCLK. */
|
||||||
|
kUSART_RxSampleOnRisingEdge = 0x1U, /*!< Un_RXD is sampled on the rising edge of SCLK. */
|
||||||
|
} usart_clock_polarity_t;
|
||||||
|
|
||||||
|
/*! @brief txFIFO watermark values */
|
||||||
|
typedef enum _usart_txfifo_watermark
|
||||||
|
{
|
||||||
|
kUSART_TxFifo0 = 0, /*!< USART tx watermark is empty */
|
||||||
|
kUSART_TxFifo1 = 1, /*!< USART tx watermark at 1 item */
|
||||||
|
kUSART_TxFifo2 = 2, /*!< USART tx watermark at 2 items */
|
||||||
|
kUSART_TxFifo3 = 3, /*!< USART tx watermark at 3 items */
|
||||||
|
kUSART_TxFifo4 = 4, /*!< USART tx watermark at 4 items */
|
||||||
|
kUSART_TxFifo5 = 5, /*!< USART tx watermark at 5 items */
|
||||||
|
kUSART_TxFifo6 = 6, /*!< USART tx watermark at 6 items */
|
||||||
|
kUSART_TxFifo7 = 7, /*!< USART tx watermark at 7 items */
|
||||||
|
} usart_txfifo_watermark_t;
|
||||||
|
|
||||||
|
/*! @brief rxFIFO watermark values */
|
||||||
|
typedef enum _usart_rxfifo_watermark
|
||||||
|
{
|
||||||
|
kUSART_RxFifo1 = 0, /*!< USART rx watermark at 1 item */
|
||||||
|
kUSART_RxFifo2 = 1, /*!< USART rx watermark at 2 items */
|
||||||
|
kUSART_RxFifo3 = 2, /*!< USART rx watermark at 3 items */
|
||||||
|
kUSART_RxFifo4 = 3, /*!< USART rx watermark at 4 items */
|
||||||
|
kUSART_RxFifo5 = 4, /*!< USART rx watermark at 5 items */
|
||||||
|
kUSART_RxFifo6 = 5, /*!< USART rx watermark at 6 items */
|
||||||
|
kUSART_RxFifo7 = 6, /*!< USART rx watermark at 7 items */
|
||||||
|
kUSART_RxFifo8 = 7, /*!< USART rx watermark at 8 items */
|
||||||
|
} usart_rxfifo_watermark_t;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief USART interrupt configuration structure, default settings all disabled.
|
||||||
|
*/
|
||||||
|
enum _usart_interrupt_enable
|
||||||
|
{
|
||||||
|
kUSART_TxErrorInterruptEnable = (USART_FIFOINTENSET_TXERR_MASK),
|
||||||
|
kUSART_RxErrorInterruptEnable = (USART_FIFOINTENSET_RXERR_MASK),
|
||||||
|
kUSART_TxLevelInterruptEnable = (USART_FIFOINTENSET_TXLVL_MASK),
|
||||||
|
kUSART_RxLevelInterruptEnable = (USART_FIFOINTENSET_RXLVL_MASK),
|
||||||
|
};
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief USART status flags.
|
||||||
|
*
|
||||||
|
* This provides constants for the USART status flags for use in the USART functions.
|
||||||
|
*/
|
||||||
|
enum _usart_flags
|
||||||
|
{
|
||||||
|
kUSART_TxError = (USART_FIFOSTAT_TXERR_MASK), /*!< TEERR bit, sets if TX buffer is error */
|
||||||
|
kUSART_RxError = (USART_FIFOSTAT_RXERR_MASK), /*!< RXERR bit, sets if RX buffer is error */
|
||||||
|
kUSART_TxFifoEmptyFlag = (USART_FIFOSTAT_TXEMPTY_MASK), /*!< TXEMPTY bit, sets if TX buffer is empty */
|
||||||
|
kUSART_TxFifoNotFullFlag = (USART_FIFOSTAT_TXNOTFULL_MASK), /*!< TXNOTFULL bit, sets if TX buffer is not full */
|
||||||
|
kUSART_RxFifoNotEmptyFlag = (USART_FIFOSTAT_RXNOTEMPTY_MASK), /*!< RXNOEMPTY bit, sets if RX buffer is not empty */
|
||||||
|
kUSART_RxFifoFullFlag = (USART_FIFOSTAT_RXFULL_MASK), /*!< RXFULL bit, sets if RX buffer is full */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*! @brief USART configuration structure. */
|
||||||
|
typedef struct _usart_config
|
||||||
|
{
|
||||||
|
uint32_t baudRate_Bps; /*!< USART baud rate */
|
||||||
|
usart_parity_mode_t parityMode; /*!< Parity mode, disabled (default), even, odd */
|
||||||
|
usart_stop_bit_count_t stopBitCount; /*!< Number of stop bits, 1 stop bit (default) or 2 stop bits */
|
||||||
|
usart_data_len_t bitCountPerChar; /*!< Data length - 7 bit, 8 bit */
|
||||||
|
bool loopback; /*!< Enable peripheral loopback */
|
||||||
|
bool enableRx; /*!< Enable RX */
|
||||||
|
bool enableTx; /*!< Enable TX */
|
||||||
|
bool enableContinuousSCLK; /*!< USART continuous Clock generation enable in synchronous master mode. */
|
||||||
|
bool enableMode32k; /*!< USART uses 32 kHz clock from the RTC oscillator as the clock source. */
|
||||||
|
bool enableHardwareFlowControl; /*!< Enable hardware control RTS/CTS */
|
||||||
|
usart_txfifo_watermark_t txWatermark; /*!< txFIFO watermark */
|
||||||
|
usart_rxfifo_watermark_t rxWatermark; /*!< rxFIFO watermark */
|
||||||
|
usart_sync_mode_t syncMode; /*!< Transfer mode select - asynchronous, synchronous master, synchronous slave. */
|
||||||
|
usart_clock_polarity_t clockPolarity; /*!< Selects the clock polarity and sampling edge in synchronous mode. */
|
||||||
|
} usart_config_t;
|
||||||
|
|
||||||
|
/*! @brief USART transfer structure. */
|
||||||
|
typedef struct _usart_transfer
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Use separate TX and RX data pointer, because TX data is const data.
|
||||||
|
* The member data is kept for backward compatibility.
|
||||||
|
*/
|
||||||
|
union
|
||||||
|
{
|
||||||
|
uint8_t *data; /*!< The buffer of data to be transfer.*/
|
||||||
|
uint8_t *rxData; /*!< The buffer to receive data. */
|
||||||
|
const uint8_t *txData; /*!< The buffer of data to be sent. */
|
||||||
|
};
|
||||||
|
size_t dataSize; /*!< The byte count to be transfer. */
|
||||||
|
} usart_transfer_t;
|
||||||
|
|
||||||
|
/* Forward declaration of the handle typedef. */
|
||||||
|
typedef struct _usart_handle usart_handle_t;
|
||||||
|
|
||||||
|
/*! @brief USART transfer callback function. */
|
||||||
|
typedef void (*usart_transfer_callback_t)(USART_Type *base, usart_handle_t *handle, status_t status, void *userData);
|
||||||
|
|
||||||
|
/*! @brief USART handle structure. */
|
||||||
|
struct _usart_handle
|
||||||
|
{
|
||||||
|
const uint8_t *volatile txData; /*!< Address of remaining data to send. */
|
||||||
|
volatile size_t txDataSize; /*!< Size of the remaining data to send. */
|
||||||
|
size_t txDataSizeAll; /*!< Size of the data to send out. */
|
||||||
|
uint8_t *volatile rxData; /*!< Address of remaining data to receive. */
|
||||||
|
volatile size_t rxDataSize; /*!< Size of the remaining data to receive. */
|
||||||
|
size_t rxDataSizeAll; /*!< Size of the data to receive. */
|
||||||
|
|
||||||
|
uint8_t *rxRingBuffer; /*!< Start address of the receiver ring buffer. */
|
||||||
|
size_t rxRingBufferSize; /*!< Size of the ring buffer. */
|
||||||
|
volatile uint16_t rxRingBufferHead; /*!< Index for the driver to store received data into ring buffer. */
|
||||||
|
volatile uint16_t rxRingBufferTail; /*!< Index for the user to get data from the ring buffer. */
|
||||||
|
|
||||||
|
usart_transfer_callback_t callback; /*!< Callback function. */
|
||||||
|
void *userData; /*!< USART callback function parameter.*/
|
||||||
|
|
||||||
|
volatile uint8_t txState; /*!< TX transfer state. */
|
||||||
|
volatile uint8_t rxState; /*!< RX transfer state */
|
||||||
|
|
||||||
|
uint8_t txWatermark; /*!< txFIFO watermark */
|
||||||
|
uint8_t rxWatermark; /*!< rxFIFO watermark */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*! @brief Typedef for usart interrupt handler. */
|
||||||
|
typedef void (*flexcomm_usart_irq_handler_t)(USART_Type *base, usart_handle_t *handle);
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* _cplusplus */
|
||||||
|
|
||||||
|
/*! @brief Returns instance number for USART peripheral base address. */
|
||||||
|
uint32_t USART_GetInstance(USART_Type *base);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Initialization and deinitialization
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Initializes a USART instance with user configuration structure and peripheral clock.
|
||||||
|
*
|
||||||
|
* This function configures the USART module with the user-defined settings. The user can configure the configuration
|
||||||
|
* structure and also get the default configuration by using the USART_GetDefaultConfig() function.
|
||||||
|
* Example below shows how to use this API to configure USART.
|
||||||
|
* @code
|
||||||
|
* usart_config_t usartConfig;
|
||||||
|
* usartConfig.baudRate_Bps = 115200U;
|
||||||
|
* usartConfig.parityMode = kUSART_ParityDisabled;
|
||||||
|
* usartConfig.stopBitCount = kUSART_OneStopBit;
|
||||||
|
* USART_Init(USART1, &usartConfig, 20000000U);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param config Pointer to user-defined configuration structure.
|
||||||
|
* @param srcClock_Hz USART clock source frequency in HZ.
|
||||||
|
* @retval kStatus_USART_BaudrateNotSupport Baudrate is not support in current clock source.
|
||||||
|
* @retval kStatus_InvalidArgument USART base address is not valid
|
||||||
|
* @retval kStatus_Success Status USART initialize succeed
|
||||||
|
*/
|
||||||
|
status_t USART_Init(USART_Type *base, const usart_config_t *config, uint32_t srcClock_Hz);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Deinitializes a USART instance.
|
||||||
|
*
|
||||||
|
* This function waits for TX complete, disables TX and RX, and disables the USART clock.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
*/
|
||||||
|
void USART_Deinit(USART_Type *base);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Gets the default configuration structure.
|
||||||
|
*
|
||||||
|
* This function initializes the USART configuration structure to a default value. The default
|
||||||
|
* values are:
|
||||||
|
* usartConfig->baudRate_Bps = 115200U;
|
||||||
|
* usartConfig->parityMode = kUSART_ParityDisabled;
|
||||||
|
* usartConfig->stopBitCount = kUSART_OneStopBit;
|
||||||
|
* usartConfig->bitCountPerChar = kUSART_8BitsPerChar;
|
||||||
|
* usartConfig->loopback = false;
|
||||||
|
* usartConfig->enableTx = false;
|
||||||
|
* usartConfig->enableRx = false;
|
||||||
|
*
|
||||||
|
* @param config Pointer to configuration structure.
|
||||||
|
*/
|
||||||
|
void USART_GetDefaultConfig(usart_config_t *config);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Sets the USART instance baud rate.
|
||||||
|
*
|
||||||
|
* This function configures the USART module baud rate. This function is used to update
|
||||||
|
* the USART module baud rate after the USART module is initialized by the USART_Init.
|
||||||
|
* @code
|
||||||
|
* USART_SetBaudRate(USART1, 115200U, 20000000U);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param baudrate_Bps USART baudrate to be set.
|
||||||
|
* @param srcClock_Hz USART clock source frequency in HZ.
|
||||||
|
* @retval kStatus_USART_BaudrateNotSupport Baudrate is not support in current clock source.
|
||||||
|
* @retval kStatus_Success Set baudrate succeed.
|
||||||
|
* @retval kStatus_InvalidArgument One or more arguments are invalid.
|
||||||
|
*/
|
||||||
|
status_t USART_SetBaudRate(USART_Type *base, uint32_t baudrate_Bps, uint32_t srcClock_Hz);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enable 32 kHz mode which USART uses clock from the RTC oscillator as the clock source
|
||||||
|
*
|
||||||
|
* Please note that in order to use a 32 kHz clock to operate USART properly, the RTC oscillator
|
||||||
|
* and its 32 kHz output must be manully enabled by user, by calling RTC_Init and setting
|
||||||
|
* SYSCON_RTCOSCCTRL_EN bit to 1.
|
||||||
|
* And in 32kHz clocking mode the USART can only work at 9600 baudrate or at the baudrate that
|
||||||
|
* 9600 can evenly divide, eg: 4800, 3200.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param baudRate_Bps USART baudrate to be set..
|
||||||
|
* @param enableMode32k true is 32k mode, false is normal mode.
|
||||||
|
* @param srcClock_Hz USART clock source frequency in HZ.
|
||||||
|
* @retval kStatus_USART_BaudrateNotSupport Baudrate is not support in current clock source.
|
||||||
|
* @retval kStatus_Success Set baudrate succeed.
|
||||||
|
* @retval kStatus_InvalidArgument One or more arguments are invalid.
|
||||||
|
*/
|
||||||
|
status_t USART_Enable32kMode(USART_Type *base, uint32_t baudRate_Bps, bool enableMode32k, uint32_t srcClock_Hz);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enable 9-bit data mode for USART.
|
||||||
|
*
|
||||||
|
* This function set the 9-bit mode for USART module. The 9th bit is not used for parity thus can be modified by user.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param enable true to enable, false to disable.
|
||||||
|
*/
|
||||||
|
void USART_Enable9bitMode(USART_Type *base, bool enable);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Set the USART slave address.
|
||||||
|
*
|
||||||
|
* This function configures the address for USART module that works as slave in 9-bit data mode. When the address
|
||||||
|
* detection is enabled, the frame it receices with MSB being 1 is considered as an address frame, otherwise it is
|
||||||
|
* considered as data frame. Once the address frame matches slave's own addresses, this slave is addressed. This
|
||||||
|
* address frame and its following data frames are stored in the receive buffer, otherwise the frames will be discarded.
|
||||||
|
* To un-address a slave, just send an address frame with unmatched address.
|
||||||
|
*
|
||||||
|
* @note Any USART instance joined in the multi-slave system can work as slave. The position of the address mark is the
|
||||||
|
* same as the parity bit when parity is enabled for 8 bit and 9 bit data formats.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param address USART slave address.
|
||||||
|
*/
|
||||||
|
static inline void USART_SetMatchAddress(USART_Type *base, uint8_t address)
|
||||||
|
{
|
||||||
|
/* Configure match address. */
|
||||||
|
base->ADDR = (uint32_t)address;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enable the USART match address feature.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param match true to enable match address, false to disable.
|
||||||
|
*/
|
||||||
|
static inline void USART_EnableMatchAddress(USART_Type *base, bool match)
|
||||||
|
{
|
||||||
|
/* Configure match address enable bit. */
|
||||||
|
if (match)
|
||||||
|
{
|
||||||
|
base->CFG |= (uint32_t)USART_CFG_AUTOADDR_MASK;
|
||||||
|
base->CTL |= (uint32_t)USART_CTL_ADDRDET_MASK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
base->CFG &= ~(uint32_t)USART_CFG_AUTOADDR_MASK;
|
||||||
|
base->CTL &= ~(uint32_t)USART_CTL_ADDRDET_MASK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* @} */
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Status
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Get USART status flags.
|
||||||
|
*
|
||||||
|
* This function get all USART status flags, the flags are returned as the logical
|
||||||
|
* OR value of the enumerators @ref _usart_flags. To check a specific status,
|
||||||
|
* compare the return value with enumerators in @ref _usart_flags.
|
||||||
|
* For example, to check whether the TX is empty:
|
||||||
|
* @code
|
||||||
|
* if (kUSART_TxFifoNotFullFlag & USART_GetStatusFlags(USART1))
|
||||||
|
* {
|
||||||
|
* ...
|
||||||
|
* }
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @return USART status flags which are ORed by the enumerators in the _usart_flags.
|
||||||
|
*/
|
||||||
|
static inline uint32_t USART_GetStatusFlags(USART_Type *base)
|
||||||
|
{
|
||||||
|
return base->FIFOSTAT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Clear USART status flags.
|
||||||
|
*
|
||||||
|
* This function clear supported USART status flags
|
||||||
|
* Flags that can be cleared or set are:
|
||||||
|
* kUSART_TxError
|
||||||
|
* kUSART_RxError
|
||||||
|
* For example:
|
||||||
|
* @code
|
||||||
|
* USART_ClearStatusFlags(USART1, kUSART_TxError | kUSART_RxError)
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param mask status flags to be cleared.
|
||||||
|
*/
|
||||||
|
static inline void USART_ClearStatusFlags(USART_Type *base, uint32_t mask)
|
||||||
|
{
|
||||||
|
/* Only TXERR, RXERR fields support write. Remaining fields should be set to zero */
|
||||||
|
base->FIFOSTAT = mask & (USART_FIFOSTAT_TXERR_MASK | USART_FIFOSTAT_RXERR_MASK);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* @} */
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Interrupts
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enables USART interrupts according to the provided mask.
|
||||||
|
*
|
||||||
|
* This function enables the USART interrupts according to the provided mask. The mask
|
||||||
|
* is a logical OR of enumeration members. See @ref _usart_interrupt_enable.
|
||||||
|
* For example, to enable TX empty interrupt and RX full interrupt:
|
||||||
|
* @code
|
||||||
|
* USART_EnableInterrupts(USART1, kUSART_TxLevelInterruptEnable | kUSART_RxLevelInterruptEnable);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param mask The interrupts to enable. Logical OR of @ref _usart_interrupt_enable.
|
||||||
|
*/
|
||||||
|
static inline void USART_EnableInterrupts(USART_Type *base, uint32_t mask)
|
||||||
|
{
|
||||||
|
base->FIFOINTENSET = mask & 0xFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Disables USART interrupts according to a provided mask.
|
||||||
|
*
|
||||||
|
* This function disables the USART interrupts according to a provided mask. The mask
|
||||||
|
* is a logical OR of enumeration members. See @ref _usart_interrupt_enable.
|
||||||
|
* This example shows how to disable the TX empty interrupt and RX full interrupt:
|
||||||
|
* @code
|
||||||
|
* USART_DisableInterrupts(USART1, kUSART_TxLevelInterruptEnable | kUSART_RxLevelInterruptEnable);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param mask The interrupts to disable. Logical OR of @ref _usart_interrupt_enable.
|
||||||
|
*/
|
||||||
|
static inline void USART_DisableInterrupts(USART_Type *base, uint32_t mask)
|
||||||
|
{
|
||||||
|
base->FIFOINTENCLR = mask & 0xFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Returns enabled USART interrupts.
|
||||||
|
*
|
||||||
|
* This function returns the enabled USART interrupts.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
*/
|
||||||
|
static inline uint32_t USART_GetEnabledInterrupts(USART_Type *base)
|
||||||
|
{
|
||||||
|
return base->FIFOINTENSET;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enable DMA for Tx
|
||||||
|
*/
|
||||||
|
static inline void USART_EnableTxDMA(USART_Type *base, bool enable)
|
||||||
|
{
|
||||||
|
if (enable)
|
||||||
|
{
|
||||||
|
base->FIFOCFG |= USART_FIFOCFG_DMATX_MASK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
base->FIFOCFG &= ~(USART_FIFOCFG_DMATX_MASK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enable DMA for Rx
|
||||||
|
*/
|
||||||
|
static inline void USART_EnableRxDMA(USART_Type *base, bool enable)
|
||||||
|
{
|
||||||
|
if (enable)
|
||||||
|
{
|
||||||
|
base->FIFOCFG |= USART_FIFOCFG_DMARX_MASK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
base->FIFOCFG &= ~(USART_FIFOCFG_DMARX_MASK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enable CTS.
|
||||||
|
* This function will determine whether CTS is used for flow control.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param enable Enable CTS or not, true for enable and false for disable.
|
||||||
|
*/
|
||||||
|
static inline void USART_EnableCTS(USART_Type *base, bool enable)
|
||||||
|
{
|
||||||
|
if (enable)
|
||||||
|
{
|
||||||
|
base->CFG |= USART_CFG_CTSEN_MASK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
base->CFG &= ~USART_CFG_CTSEN_MASK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Continuous Clock generation.
|
||||||
|
* By default, SCLK is only output while data is being transmitted in synchronous mode.
|
||||||
|
* Enable this funciton, SCLK will run continuously in synchronous mode, allowing
|
||||||
|
* characters to be received on Un_RxD independently from transmission on Un_TXD).
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param enable Enable Continuous Clock generation mode or not, true for enable and false for disable.
|
||||||
|
*/
|
||||||
|
static inline void USART_EnableContinuousSCLK(USART_Type *base, bool enable)
|
||||||
|
{
|
||||||
|
if (enable)
|
||||||
|
{
|
||||||
|
base->CTL |= USART_CTL_CC_MASK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
base->CTL &= ~USART_CTL_CC_MASK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enable Continuous Clock generation bit auto clear.
|
||||||
|
* While enable this cuntion, the Continuous Clock bit is automatically cleared when a complete
|
||||||
|
* character has been received. This bit is cleared at the same time.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param enable Enable auto clear or not, true for enable and false for disable.
|
||||||
|
*/
|
||||||
|
static inline void USART_EnableAutoClearSCLK(USART_Type *base, bool enable)
|
||||||
|
{
|
||||||
|
if (enable)
|
||||||
|
{
|
||||||
|
base->CTL |= USART_CTL_CLRCCONRX_MASK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
base->CTL &= ~USART_CTL_CLRCCONRX_MASK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Sets the rx FIFO watermark.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param water Rx FIFO watermark.
|
||||||
|
*/
|
||||||
|
static inline void USART_SetRxFifoWatermark(USART_Type *base, uint8_t water)
|
||||||
|
{
|
||||||
|
assert(water <= (USART_FIFOTRIG_RXLVL_MASK >> USART_FIFOTRIG_RXLVL_SHIFT));
|
||||||
|
base->FIFOTRIG = (base->FIFOTRIG & ~USART_FIFOTRIG_RXLVL_MASK) | USART_FIFOTRIG_RXLVL(water);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Sets the tx FIFO watermark.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param water Tx FIFO watermark.
|
||||||
|
*/
|
||||||
|
static inline void USART_SetTxFifoWatermark(USART_Type *base, uint8_t water)
|
||||||
|
{
|
||||||
|
assert(water <= (USART_FIFOTRIG_TXLVL_MASK >> USART_FIFOTRIG_TXLVL_SHIFT));
|
||||||
|
base->FIFOTRIG = (base->FIFOTRIG & ~USART_FIFOTRIG_TXLVL_MASK) | USART_FIFOTRIG_TXLVL(water);
|
||||||
|
}
|
||||||
|
/* @} */
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Bus Operations
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Writes to the FIFOWR register.
|
||||||
|
*
|
||||||
|
* This function writes data to the txFIFO directly. The upper layer must ensure
|
||||||
|
* that txFIFO has space for data to write before calling this function.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param data The byte to write.
|
||||||
|
*/
|
||||||
|
static inline void USART_WriteByte(USART_Type *base, uint8_t data)
|
||||||
|
{
|
||||||
|
base->FIFOWR = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reads the FIFORD register directly.
|
||||||
|
*
|
||||||
|
* This function reads data from the rxFIFO directly. The upper layer must
|
||||||
|
* ensure that the rxFIFO is not empty before calling this function.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @return The byte read from USART data register.
|
||||||
|
*/
|
||||||
|
static inline uint8_t USART_ReadByte(USART_Type *base)
|
||||||
|
{
|
||||||
|
return (uint8_t)base->FIFORD;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Gets the rx FIFO data count.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @return rx FIFO data count.
|
||||||
|
*/
|
||||||
|
static inline uint8_t USART_GetRxFifoCount(USART_Type *base)
|
||||||
|
{
|
||||||
|
return (uint8_t)((base->FIFOSTAT & USART_FIFOSTAT_RXLVL_MASK) >> USART_FIFOSTAT_RXLVL_SHIFT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Gets the tx FIFO data count.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @return tx FIFO data count.
|
||||||
|
*/
|
||||||
|
static inline uint8_t USART_GetTxFifoCount(USART_Type *base)
|
||||||
|
{
|
||||||
|
return (uint8_t)((base->FIFOSTAT & USART_FIFOSTAT_TXLVL_MASK) >> USART_FIFOSTAT_TXLVL_SHIFT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Transmit an address frame in 9-bit data mode.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param address USART slave address.
|
||||||
|
*/
|
||||||
|
void USART_SendAddress(USART_Type *base, uint8_t address);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Writes to the TX register using a blocking method.
|
||||||
|
*
|
||||||
|
* This function polls the TX register, waits for the TX register to be empty or for the TX FIFO
|
||||||
|
* to have room and writes data to the TX buffer.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param data Start address of the data to write.
|
||||||
|
* @param length Size of the data to write.
|
||||||
|
* @retval kStatus_USART_Timeout Transmission timed out and was aborted.
|
||||||
|
* @retval kStatus_InvalidArgument Invalid argument.
|
||||||
|
* @retval kStatus_Success Successfully wrote all data.
|
||||||
|
*/
|
||||||
|
status_t USART_WriteBlocking(USART_Type *base, const uint8_t *data, size_t length);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Read RX data register using a blocking method.
|
||||||
|
*
|
||||||
|
* This function polls the RX register, waits for the RX register to be full or for RX FIFO to
|
||||||
|
* have data and read data from the TX register.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param data Start address of the buffer to store the received data.
|
||||||
|
* @param length Size of the buffer.
|
||||||
|
* @retval kStatus_USART_FramingError Receiver overrun happened while receiving data.
|
||||||
|
* @retval kStatus_USART_ParityError Noise error happened while receiving data.
|
||||||
|
* @retval kStatus_USART_NoiseError Framing error happened while receiving data.
|
||||||
|
* @retval kStatus_USART_RxError Overflow or underflow rxFIFO happened.
|
||||||
|
* @retval kStatus_USART_Timeout Transmission timed out and was aborted.
|
||||||
|
* @retval kStatus_Success Successfully received all data.
|
||||||
|
*/
|
||||||
|
status_t USART_ReadBlocking(USART_Type *base, uint8_t *data, size_t length);
|
||||||
|
|
||||||
|
/* @} */
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Transactional
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Initializes the USART handle.
|
||||||
|
*
|
||||||
|
* This function initializes the USART handle which can be used for other USART
|
||||||
|
* transactional APIs. Usually, for a specified USART instance,
|
||||||
|
* call this API once to get the initialized handle.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param handle USART handle pointer.
|
||||||
|
* @param callback The callback function.
|
||||||
|
* @param userData The parameter of the callback function.
|
||||||
|
*/
|
||||||
|
status_t USART_TransferCreateHandle(USART_Type *base,
|
||||||
|
usart_handle_t *handle,
|
||||||
|
usart_transfer_callback_t callback,
|
||||||
|
void *userData);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Transmits a buffer of data using the interrupt method.
|
||||||
|
*
|
||||||
|
* This function sends data using an interrupt method. This is a non-blocking function, which
|
||||||
|
* returns directly without waiting for all data to be written to the TX register. When
|
||||||
|
* all data is written to the TX register in the IRQ handler, the USART driver calls the callback
|
||||||
|
* function and passes the @ref kStatus_USART_TxIdle as status parameter.
|
||||||
|
*
|
||||||
|
* @note The kStatus_USART_TxIdle is passed to the upper layer when all data is written
|
||||||
|
* to the TX register. However it does not ensure that all data are sent out. Before disabling the TX,
|
||||||
|
* check the kUSART_TransmissionCompleteFlag to ensure that the TX is finished.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param handle USART handle pointer.
|
||||||
|
* @param xfer USART transfer structure. See #usart_transfer_t.
|
||||||
|
* @retval kStatus_Success Successfully start the data transmission.
|
||||||
|
* @retval kStatus_USART_TxBusy Previous transmission still not finished, data not all written to TX register yet.
|
||||||
|
* @retval kStatus_InvalidArgument Invalid argument.
|
||||||
|
*/
|
||||||
|
status_t USART_TransferSendNonBlocking(USART_Type *base, usart_handle_t *handle, usart_transfer_t *xfer);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Sets up the RX ring buffer.
|
||||||
|
*
|
||||||
|
* This function sets up the RX ring buffer to a specific USART handle.
|
||||||
|
*
|
||||||
|
* When the RX ring buffer is used, data received are stored into the ring buffer even when the
|
||||||
|
* user doesn't call the USART_TransferReceiveNonBlocking() API. If there is already data received
|
||||||
|
* in the ring buffer, the user can get the received data from the ring buffer directly.
|
||||||
|
*
|
||||||
|
* @note When using the RX ring buffer, one byte is reserved for internal use. In other
|
||||||
|
* words, if @p ringBufferSize is 32, then only 31 bytes are used for saving data.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param handle USART handle pointer.
|
||||||
|
* @param ringBuffer Start address of the ring buffer for background receiving. Pass NULL to disable the ring buffer.
|
||||||
|
* @param ringBufferSize size of the ring buffer.
|
||||||
|
*/
|
||||||
|
void USART_TransferStartRingBuffer(USART_Type *base,
|
||||||
|
usart_handle_t *handle,
|
||||||
|
uint8_t *ringBuffer,
|
||||||
|
size_t ringBufferSize);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Aborts the background transfer and uninstalls the ring buffer.
|
||||||
|
*
|
||||||
|
* This function aborts the background transfer and uninstalls the ring buffer.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param handle USART handle pointer.
|
||||||
|
*/
|
||||||
|
void USART_TransferStopRingBuffer(USART_Type *base, usart_handle_t *handle);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Get the length of received data in RX ring buffer.
|
||||||
|
*
|
||||||
|
* @param handle USART handle pointer.
|
||||||
|
* @return Length of received data in RX ring buffer.
|
||||||
|
*/
|
||||||
|
size_t USART_TransferGetRxRingBufferLength(usart_handle_t *handle);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Aborts the interrupt-driven data transmit.
|
||||||
|
*
|
||||||
|
* This function aborts the interrupt driven data sending. The user can get the remainBtyes to find out
|
||||||
|
* how many bytes are still not sent out.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param handle USART handle pointer.
|
||||||
|
*/
|
||||||
|
void USART_TransferAbortSend(USART_Type *base, usart_handle_t *handle);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Get the number of bytes that have been sent out to bus.
|
||||||
|
*
|
||||||
|
* This function gets the number of bytes that have been sent out to bus by interrupt method.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param handle USART handle pointer.
|
||||||
|
* @param count Send bytes count.
|
||||||
|
* @retval kStatus_NoTransferInProgress No send in progress.
|
||||||
|
* @retval kStatus_InvalidArgument Parameter is invalid.
|
||||||
|
* @retval kStatus_Success Get successfully through the parameter \p count;
|
||||||
|
*/
|
||||||
|
status_t USART_TransferGetSendCount(USART_Type *base, usart_handle_t *handle, uint32_t *count);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Receives a buffer of data using an interrupt method.
|
||||||
|
*
|
||||||
|
* This function receives data using an interrupt method. This is a non-blocking function, which
|
||||||
|
* returns without waiting for all data to be received.
|
||||||
|
* If the RX ring buffer is used and not empty, the data in the ring buffer is copied and
|
||||||
|
* the parameter @p receivedBytes shows how many bytes are copied from the ring buffer.
|
||||||
|
* After copying, if the data in the ring buffer is not enough to read, the receive
|
||||||
|
* request is saved by the USART driver. When the new data arrives, the receive request
|
||||||
|
* is serviced first. When all data is received, the USART driver notifies the upper layer
|
||||||
|
* through a callback function and passes the status parameter @ref kStatus_USART_RxIdle.
|
||||||
|
* For example, the upper layer needs 10 bytes but there are only 5 bytes in the ring buffer.
|
||||||
|
* The 5 bytes are copied to the xfer->data and this function returns with the
|
||||||
|
* parameter @p receivedBytes set to 5. For the left 5 bytes, newly arrived data is
|
||||||
|
* saved from the xfer->data[5]. When 5 bytes are received, the USART driver notifies the upper layer.
|
||||||
|
* If the RX ring buffer is not enabled, this function enables the RX and RX interrupt
|
||||||
|
* to receive data to the xfer->data. When all data is received, the upper layer is notified.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param handle USART handle pointer.
|
||||||
|
* @param xfer USART transfer structure, see #usart_transfer_t.
|
||||||
|
* @param receivedBytes Bytes received from the ring buffer directly.
|
||||||
|
* @retval kStatus_Success Successfully queue the transfer into transmit queue.
|
||||||
|
* @retval kStatus_USART_RxBusy Previous receive request is not finished.
|
||||||
|
* @retval kStatus_InvalidArgument Invalid argument.
|
||||||
|
*/
|
||||||
|
status_t USART_TransferReceiveNonBlocking(USART_Type *base,
|
||||||
|
usart_handle_t *handle,
|
||||||
|
usart_transfer_t *xfer,
|
||||||
|
size_t *receivedBytes);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Aborts the interrupt-driven data receiving.
|
||||||
|
*
|
||||||
|
* This function aborts the interrupt-driven data receiving. The user can get the remainBytes to find out
|
||||||
|
* how many bytes not received yet.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param handle USART handle pointer.
|
||||||
|
*/
|
||||||
|
void USART_TransferAbortReceive(USART_Type *base, usart_handle_t *handle);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Get the number of bytes that have been received.
|
||||||
|
*
|
||||||
|
* This function gets the number of bytes that have been received.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param handle USART handle pointer.
|
||||||
|
* @param count Receive bytes count.
|
||||||
|
* @retval kStatus_NoTransferInProgress No receive in progress.
|
||||||
|
* @retval kStatus_InvalidArgument Parameter is invalid.
|
||||||
|
* @retval kStatus_Success Get successfully through the parameter \p count;
|
||||||
|
*/
|
||||||
|
status_t USART_TransferGetReceiveCount(USART_Type *base, usart_handle_t *handle, uint32_t *count);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief USART IRQ handle function.
|
||||||
|
*
|
||||||
|
* This function handles the USART transmit and receive IRQ request.
|
||||||
|
*
|
||||||
|
* @param base USART peripheral base address.
|
||||||
|
* @param handle USART handle pointer.
|
||||||
|
*/
|
||||||
|
void USART_TransferHandleIRQ(USART_Type *base, usart_handle_t *handle);
|
||||||
|
|
||||||
|
/* @} */
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @}*/
|
||||||
|
|
||||||
|
#endif /* _FSL_USART_H_ */
|
||||||
|
|
@ -0,0 +1,122 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017-2019 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* freertos_tasks_c_additions.h Rev. 1.3 */
|
||||||
|
#ifndef FREERTOS_TASKS_C_ADDITIONS_H
|
||||||
|
#define FREERTOS_TASKS_C_ADDITIONS_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#if (configUSE_TRACE_FACILITY == 0)
|
||||||
|
#error "configUSE_TRACE_FACILITY must be enabled"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define FREERTOS_DEBUG_CONFIG_MAJOR_VERSION 1
|
||||||
|
#define FREERTOS_DEBUG_CONFIG_MINOR_VERSION 3
|
||||||
|
|
||||||
|
/* NOTE!!
|
||||||
|
* Default to a FreeRTOS version which didn't include these macros. FreeRTOS
|
||||||
|
* v7.5.3 is used here.
|
||||||
|
*/
|
||||||
|
#ifndef tskKERNEL_VERSION_BUILD
|
||||||
|
#define tskKERNEL_VERSION_BUILD 3
|
||||||
|
#endif
|
||||||
|
#ifndef tskKERNEL_VERSION_MINOR
|
||||||
|
#define tskKERNEL_VERSION_MINOR 5
|
||||||
|
#endif
|
||||||
|
#ifndef tskKERNEL_VERSION_MAJOR
|
||||||
|
#define tskKERNEL_VERSION_MAJOR 7
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* NOTE!!
|
||||||
|
* The configFRTOS_MEMORY_SCHEME macro describes the heap scheme using a value
|
||||||
|
* 1 - 5 which corresponds to the following schemes:
|
||||||
|
*
|
||||||
|
* heap_1 - the very simplest, does not permit memory to be freed
|
||||||
|
* heap_2 - permits memory to be freed, but not does coalescence adjacent free
|
||||||
|
* blocks.
|
||||||
|
* heap_3 - simply wraps the standard malloc() and free() for thread safety
|
||||||
|
* heap_4 - coalesces adjacent free blocks to avoid fragmentation. Includes
|
||||||
|
* absolute address placement option
|
||||||
|
* heap_5 - as per heap_4, with the ability to span the heap across
|
||||||
|
* multiple nonOadjacent memory areas
|
||||||
|
*/
|
||||||
|
#ifndef configFRTOS_MEMORY_SCHEME
|
||||||
|
#define configFRTOS_MEMORY_SCHEME 3 /* thread safe malloc */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ((configFRTOS_MEMORY_SCHEME > 5) || (configFRTOS_MEMORY_SCHEME < 1))
|
||||||
|
#error "Invalid configFRTOS_MEMORY_SCHEME setting!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern const uint8_t FreeRTOSDebugConfig[];
|
||||||
|
|
||||||
|
/* NOTES!!
|
||||||
|
* IAR documentation is confusing. It suggests the data must be statically
|
||||||
|
* linked, and the #pragma placed immediately before the symbol definition.
|
||||||
|
* The IAR supplied examples violate both "rules", so this is a best guess.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if (tskKERNEL_VERSION_MAJOR >= 10) && (tskKERNEL_VERSION_MINOR >= 2)
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
char *const portArch_Name __attribute__((section(".rodata"))) = portARCH_NAME;
|
||||||
|
#elif defined(__CC_ARM) || defined(__ARMCC_VERSION)
|
||||||
|
char *const portArch_Name __attribute__((used)) = portARCH_NAME;
|
||||||
|
#elif defined(__IAR_SYSTEMS_ICC__)
|
||||||
|
char *const portArch_Name = portARCH_NAME;
|
||||||
|
#pragma required=portArch_Name
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
char *const portArch_Name = NULL;
|
||||||
|
#endif // tskKERNEL_VERSION_MAJOR
|
||||||
|
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
const uint8_t FreeRTOSDebugConfig[] __attribute__((section(".rodata"))) =
|
||||||
|
#elif defined(__CC_ARM) || defined(__ARMCC_VERSION)
|
||||||
|
const uint8_t FreeRTOSDebugConfig[] __attribute__((used)) =
|
||||||
|
#elif defined(__IAR_SYSTEMS_ICC__)
|
||||||
|
#pragma required=FreeRTOSDebugConfig
|
||||||
|
const uint8_t FreeRTOSDebugConfig[] =
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
FREERTOS_DEBUG_CONFIG_MAJOR_VERSION,
|
||||||
|
FREERTOS_DEBUG_CONFIG_MINOR_VERSION,
|
||||||
|
tskKERNEL_VERSION_MAJOR,
|
||||||
|
tskKERNEL_VERSION_MINOR,
|
||||||
|
tskKERNEL_VERSION_BUILD,
|
||||||
|
configFRTOS_MEMORY_SCHEME,
|
||||||
|
offsetof(struct tskTaskControlBlock, pxTopOfStack),
|
||||||
|
#if (tskKERNEL_VERSION_MAJOR > 8)
|
||||||
|
offsetof(struct tskTaskControlBlock, xStateListItem),
|
||||||
|
#else
|
||||||
|
offsetof(struct tskTaskControlBlock, xGenericListItem),
|
||||||
|
#endif
|
||||||
|
offsetof(struct tskTaskControlBlock, xEventListItem),
|
||||||
|
offsetof(struct tskTaskControlBlock, pxStack),
|
||||||
|
offsetof(struct tskTaskControlBlock, pcTaskName),
|
||||||
|
offsetof(struct tskTaskControlBlock, uxTCBNumber),
|
||||||
|
offsetof(struct tskTaskControlBlock, uxTaskNumber),
|
||||||
|
configMAX_TASK_NAME_LEN,
|
||||||
|
configMAX_PRIORITIES,
|
||||||
|
configENABLE_MPU,
|
||||||
|
configENABLE_FPU,
|
||||||
|
configENABLE_TRUSTZONE,
|
||||||
|
configRUN_FREERTOS_SECURE_ONLY,
|
||||||
|
0, // 32-bit align
|
||||||
|
0, 0, 0, 0 // padding
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // FREERTOS_TASKS_C_ADDITIONS_H
|
||||||
|
|
@ -0,0 +1,98 @@
|
||||||
|
// ****************************************************************************
|
||||||
|
// semihost_hardfault.c
|
||||||
|
// - Provides hard fault handler to allow semihosting code not
|
||||||
|
// to hang application when debugger not connected.
|
||||||
|
//
|
||||||
|
// ****************************************************************************
|
||||||
|
// Copyright 2017-2021 NXP
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// NXP Confidential. This software is owned or controlled by NXP and may only be
|
||||||
|
// used strictly in accordance with the applicable license terms.
|
||||||
|
//
|
||||||
|
// By expressly accepting such terms or by downloading, installing, activating
|
||||||
|
// and/or otherwise using the software, you are agreeing that you have read, and
|
||||||
|
// that you agree to comply with and are bound by, such license terms.
|
||||||
|
//
|
||||||
|
// If you do not agree to be bound by the applicable license terms, then you may not
|
||||||
|
// retain, install, activate or otherwise use the software.
|
||||||
|
// ****************************************************************************
|
||||||
|
//
|
||||||
|
// ===== DESCRIPTION =====
|
||||||
|
//
|
||||||
|
// One of the issues with applications that make use of semihosting operations
|
||||||
|
// (such as printf calls) is that the code will not execute correctly when the
|
||||||
|
// debugger is not connected. Generally this will show up with the application
|
||||||
|
// appearing to just hang. This may include the application running from reset
|
||||||
|
// or powering up the board (with the application already in FLASH), and also
|
||||||
|
// as the application failing to continue to execute after a debug session is
|
||||||
|
// terminated.
|
||||||
|
//
|
||||||
|
// The problem here is that the "bottom layer" of the semihosted variants of
|
||||||
|
// the C library, semihosting is implemented by a "BKPT 0xAB" instruction.
|
||||||
|
// When the debug tools are not connected, this instruction triggers a hard
|
||||||
|
// fault - and the default hard fault handler within an application will
|
||||||
|
// typically just contains an infinite loop - causing the application to
|
||||||
|
// appear to have hang when no debugger is connected.
|
||||||
|
//
|
||||||
|
// The below code provides an example hard fault handler which instead looks
|
||||||
|
// to see what the instruction that caused the hard fault was - and if it
|
||||||
|
// was a "BKPT 0xAB", then it instead returns back to the user application.
|
||||||
|
//
|
||||||
|
// In most cases this will allow applications containing semihosting
|
||||||
|
// operations to execute (to some degree) when the debugger is not connected.
|
||||||
|
//
|
||||||
|
// == NOTE ==
|
||||||
|
//
|
||||||
|
// Correct execution of the application containing semihosted operations
|
||||||
|
// which are vectored onto this hard fault handler cannot be guaranteed. This
|
||||||
|
// is because the handler may not return data or return codes that the higher
|
||||||
|
// level C library code or application code expects. This hard fault handler
|
||||||
|
// is meant as a development aid, and it is not recommended to leave
|
||||||
|
// semihosted code in a production build of your application!
|
||||||
|
//
|
||||||
|
// ****************************************************************************
|
||||||
|
|
||||||
|
// Allow handler to be removed by setting a define (via command line)
|
||||||
|
#if !defined (__SEMIHOST_HARDFAULT_DISABLE)
|
||||||
|
|
||||||
|
__attribute__((naked))
|
||||||
|
void HardFault_Handler(void){
|
||||||
|
__asm( ".syntax unified\n"
|
||||||
|
// Check which stack is in use
|
||||||
|
"MOVS R0, #4 \n"
|
||||||
|
"MOV R1, LR \n"
|
||||||
|
"TST R0, R1 \n"
|
||||||
|
"BEQ _MSP \n"
|
||||||
|
"MRS R0, PSP \n"
|
||||||
|
"B _process \n"
|
||||||
|
"_MSP: \n"
|
||||||
|
"MRS R0, MSP \n"
|
||||||
|
// Load the instruction that triggered hard fault
|
||||||
|
"_process: \n"
|
||||||
|
"LDR R1,[R0,#24] \n"
|
||||||
|
"LDRH R2,[r1] \n"
|
||||||
|
// Semihosting instruction is "BKPT 0xAB" (0xBEAB)
|
||||||
|
"LDR R3,=0xBEAB \n"
|
||||||
|
"CMP R2,R3 \n"
|
||||||
|
"BEQ _semihost_return \n"
|
||||||
|
// Wasn't semihosting instruction so enter infinite loop
|
||||||
|
"B . \n"
|
||||||
|
// Was semihosting instruction, so adjust location to
|
||||||
|
// return to by 1 instruction (2 bytes), then exit function
|
||||||
|
"_semihost_return: \n"
|
||||||
|
"ADDS R1,#2 \n"
|
||||||
|
"STR R1,[R0,#24] \n"
|
||||||
|
// Set a return value from semihosting operation.
|
||||||
|
// 32 is slightly arbitrary, but appears to allow most
|
||||||
|
// C Library IO functions sitting on top of semihosting to
|
||||||
|
// continue to operate to some degree
|
||||||
|
"MOVS R1,#32 \n"
|
||||||
|
"STR R1,[ R0,#0 ] \n" // R0 is at location 0 on stack
|
||||||
|
// Return from hard fault handler to application
|
||||||
|
"BX LR \n"
|
||||||
|
".syntax divided\n") ;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
@ -0,0 +1,56 @@
|
||||||
|
//*****************************************************************************
|
||||||
|
// boot_multicore_slave.c
|
||||||
|
//
|
||||||
|
// Provides simple functions to boot slave core in LPC55xx multicore system
|
||||||
|
//
|
||||||
|
// Version : 181106
|
||||||
|
//
|
||||||
|
//*****************************************************************************
|
||||||
|
//
|
||||||
|
// Copyright 2016-2019 NXP
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
//*****************************************************************************
|
||||||
|
|
||||||
|
#if defined(__MULTICORE_MASTER)
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
//#define SYSCON_BASE ((uint32_t) 0x40000000)
|
||||||
|
#define SYSCON_BASE ((uint32_t)0x50000000)
|
||||||
|
|
||||||
|
#define CPBOOT (((volatile uint32_t *)(SYSCON_BASE + 0x804)))
|
||||||
|
#define CPUCTRL (((volatile uint32_t *)(SYSCON_BASE + 0x800)))
|
||||||
|
#define CPUCFG (((volatile uint32_t *)(SYSCON_BASE + 0xFD4)))
|
||||||
|
|
||||||
|
#define CPUCTRL_KEY ((uint32_t)(0x0000C0C4 << 16))
|
||||||
|
#define CORE1_CLK_ENA (1 << 3)
|
||||||
|
#define CORE1_RESET_ENA (1 << 5)
|
||||||
|
#define CORE1_ENABLE (1 << 2)
|
||||||
|
|
||||||
|
extern uint8_t __core_m33slave_START__;
|
||||||
|
|
||||||
|
void boot_multicore_slave(void)
|
||||||
|
{
|
||||||
|
volatile uint32_t *u32REG, u32Val;
|
||||||
|
|
||||||
|
unsigned int *slavevectortable_ptr = (unsigned int *)&__core_m33slave_START__;
|
||||||
|
|
||||||
|
// Enable CPU1 in SYSCON->CPUCFG
|
||||||
|
*CPUCFG |= CORE1_ENABLE;
|
||||||
|
|
||||||
|
// Set CPU1 boot address in SYSCON->CPBoot
|
||||||
|
*CPBOOT = (uint32_t)slavevectortable_ptr;
|
||||||
|
|
||||||
|
// Read SYSCON->CPUCTRL and set key value in bits 31:16
|
||||||
|
u32REG = (uint32_t *)CPUCTRL;
|
||||||
|
u32Val = *u32REG | CPUCTRL_KEY;
|
||||||
|
|
||||||
|
// Enable slave clock and reset in SYSCON->CPUCTRL
|
||||||
|
*u32REG = u32Val | CORE1_CLK_ENA | CORE1_RESET_ENA;
|
||||||
|
|
||||||
|
// Clear slave reset in SYSCON->CPUCTRL
|
||||||
|
*u32REG = (u32Val | CORE1_CLK_ENA) & (~CORE1_RESET_ENA);
|
||||||
|
}
|
||||||
|
#endif // defined (__MULTICORE_MASTER)
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
//*****************************************************************************
|
||||||
|
// boot_multicore_slave.h
|
||||||
|
//
|
||||||
|
// Header for functions used for booting of slave core in multicore system
|
||||||
|
//*****************************************************************************
|
||||||
|
//
|
||||||
|
// Copyright 2016-2019 NXP
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
//*****************************************************************************
|
||||||
|
|
||||||
|
#ifndef BOOT_MULTICORE_SLAVE_H_
|
||||||
|
#define BOOT_MULTICORE_SLAVE_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void boot_multicore_slave(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* BOOT_MULTICORE_SLAVE_H_ */
|
||||||
|
|
@ -0,0 +1,762 @@
|
||||||
|
//*****************************************************************************
|
||||||
|
// LPC55S69_cm33_core0 startup code for use with MCUXpresso IDE
|
||||||
|
//
|
||||||
|
// Version : 010621
|
||||||
|
//*****************************************************************************
|
||||||
|
//
|
||||||
|
// Copyright 2016-2021 NXP
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
//*****************************************************************************
|
||||||
|
|
||||||
|
#if defined (DEBUG)
|
||||||
|
#pragma GCC push_options
|
||||||
|
#pragma GCC optimize ("Og")
|
||||||
|
#endif // (DEBUG)
|
||||||
|
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
#ifdef __REDLIB__
|
||||||
|
#error Redlib does not support C++
|
||||||
|
#else
|
||||||
|
//*****************************************************************************
|
||||||
|
//
|
||||||
|
// The entry point for the C++ library startup
|
||||||
|
//
|
||||||
|
//*****************************************************************************
|
||||||
|
extern "C" {
|
||||||
|
extern void __libc_init_array(void);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define WEAK __attribute__ ((weak))
|
||||||
|
#define WEAK_AV __attribute__ ((weak, section(".after_vectors")))
|
||||||
|
#define ALIAS(f) __attribute__ ((weak, alias (#f)))
|
||||||
|
|
||||||
|
//*****************************************************************************
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//*****************************************************************************
|
||||||
|
// Variable to store CRP value in. Will be placed automatically
|
||||||
|
// by the linker when "Enable Code Read Protect" selected.
|
||||||
|
// See crp.h header for more information
|
||||||
|
//*****************************************************************************
|
||||||
|
|
||||||
|
//*****************************************************************************
|
||||||
|
// Declaration of external SystemInit function
|
||||||
|
//*****************************************************************************
|
||||||
|
#if defined (__USE_CMSIS)
|
||||||
|
extern void SystemInit(void);
|
||||||
|
#endif // (__USE_CMSIS)
|
||||||
|
|
||||||
|
//*****************************************************************************
|
||||||
|
// Forward declaration of the core exception handlers.
|
||||||
|
// When the application defines a handler (with the same name), this will
|
||||||
|
// automatically take precedence over these weak definitions.
|
||||||
|
// If your application is a C++ one, then any interrupt handlers defined
|
||||||
|
// in C++ files within in your main application will need to have C linkage
|
||||||
|
// rather than C++ linkage. To do this, make sure that you are using extern "C"
|
||||||
|
// { .... } around the interrupt handler within your main application code.
|
||||||
|
//*****************************************************************************
|
||||||
|
void ResetISR(void);
|
||||||
|
WEAK void NMI_Handler(void);
|
||||||
|
WEAK void HardFault_Handler(void);
|
||||||
|
WEAK void MemManage_Handler(void);
|
||||||
|
WEAK void BusFault_Handler(void);
|
||||||
|
WEAK void UsageFault_Handler(void);
|
||||||
|
WEAK void SecureFault_Handler(void);
|
||||||
|
WEAK void SVC_Handler(void);
|
||||||
|
WEAK void DebugMon_Handler(void);
|
||||||
|
WEAK void PendSV_Handler(void);
|
||||||
|
WEAK void SysTick_Handler(void);
|
||||||
|
WEAK void IntDefaultHandler(void);
|
||||||
|
|
||||||
|
//*****************************************************************************
|
||||||
|
// Forward declaration of the application IRQ handlers. When the application
|
||||||
|
// defines a handler (with the same name), this will automatically take
|
||||||
|
// precedence over weak definitions below
|
||||||
|
//*****************************************************************************
|
||||||
|
WEAK void WDT_BOD_IRQHandler(void);
|
||||||
|
WEAK void DMA0_IRQHandler(void);
|
||||||
|
WEAK void GINT0_IRQHandler(void);
|
||||||
|
WEAK void GINT1_IRQHandler(void);
|
||||||
|
WEAK void PIN_INT0_IRQHandler(void);
|
||||||
|
WEAK void PIN_INT1_IRQHandler(void);
|
||||||
|
WEAK void PIN_INT2_IRQHandler(void);
|
||||||
|
WEAK void PIN_INT3_IRQHandler(void);
|
||||||
|
WEAK void UTICK0_IRQHandler(void);
|
||||||
|
WEAK void MRT0_IRQHandler(void);
|
||||||
|
WEAK void CTIMER0_IRQHandler(void);
|
||||||
|
WEAK void CTIMER1_IRQHandler(void);
|
||||||
|
WEAK void SCT0_IRQHandler(void);
|
||||||
|
WEAK void CTIMER3_IRQHandler(void);
|
||||||
|
WEAK void FLEXCOMM0_IRQHandler(void);
|
||||||
|
WEAK void FLEXCOMM1_IRQHandler(void);
|
||||||
|
WEAK void FLEXCOMM2_IRQHandler(void);
|
||||||
|
WEAK void FLEXCOMM3_IRQHandler(void);
|
||||||
|
WEAK void FLEXCOMM4_IRQHandler(void);
|
||||||
|
WEAK void FLEXCOMM5_IRQHandler(void);
|
||||||
|
WEAK void FLEXCOMM6_IRQHandler(void);
|
||||||
|
WEAK void FLEXCOMM7_IRQHandler(void);
|
||||||
|
WEAK void ADC0_IRQHandler(void);
|
||||||
|
WEAK void Reserved39_IRQHandler(void);
|
||||||
|
WEAK void ACMP_IRQHandler(void);
|
||||||
|
WEAK void Reserved41_IRQHandler(void);
|
||||||
|
WEAK void Reserved42_IRQHandler(void);
|
||||||
|
WEAK void USB0_NEEDCLK_IRQHandler(void);
|
||||||
|
WEAK void USB0_IRQHandler(void);
|
||||||
|
WEAK void RTC_IRQHandler(void);
|
||||||
|
WEAK void Reserved46_IRQHandler(void);
|
||||||
|
WEAK void MAILBOX_IRQHandler(void);
|
||||||
|
WEAK void PIN_INT4_IRQHandler(void);
|
||||||
|
WEAK void PIN_INT5_IRQHandler(void);
|
||||||
|
WEAK void PIN_INT6_IRQHandler(void);
|
||||||
|
WEAK void PIN_INT7_IRQHandler(void);
|
||||||
|
WEAK void CTIMER2_IRQHandler(void);
|
||||||
|
WEAK void CTIMER4_IRQHandler(void);
|
||||||
|
WEAK void OS_EVENT_IRQHandler(void);
|
||||||
|
WEAK void Reserved55_IRQHandler(void);
|
||||||
|
WEAK void Reserved56_IRQHandler(void);
|
||||||
|
WEAK void Reserved57_IRQHandler(void);
|
||||||
|
WEAK void SDIO_IRQHandler(void);
|
||||||
|
WEAK void Reserved59_IRQHandler(void);
|
||||||
|
WEAK void Reserved60_IRQHandler(void);
|
||||||
|
WEAK void Reserved61_IRQHandler(void);
|
||||||
|
WEAK void USB1_PHY_IRQHandler(void);
|
||||||
|
WEAK void USB1_IRQHandler(void);
|
||||||
|
WEAK void USB1_NEEDCLK_IRQHandler(void);
|
||||||
|
WEAK void SEC_HYPERVISOR_CALL_IRQHandler(void);
|
||||||
|
WEAK void SEC_GPIO_INT0_IRQ0_IRQHandler(void);
|
||||||
|
WEAK void SEC_GPIO_INT0_IRQ1_IRQHandler(void);
|
||||||
|
WEAK void PLU_IRQHandler(void);
|
||||||
|
WEAK void SEC_VIO_IRQHandler(void);
|
||||||
|
WEAK void HASHCRYPT_IRQHandler(void);
|
||||||
|
WEAK void CASER_IRQHandler(void);
|
||||||
|
WEAK void PUF_IRQHandler(void);
|
||||||
|
WEAK void PQ_IRQHandler(void);
|
||||||
|
WEAK void DMA1_IRQHandler(void);
|
||||||
|
WEAK void FLEXCOMM8_IRQHandler(void);
|
||||||
|
|
||||||
|
//*****************************************************************************
|
||||||
|
// Forward declaration of the driver IRQ handlers. These are aliased
|
||||||
|
// to the IntDefaultHandler, which is a 'forever' loop. When the driver
|
||||||
|
// defines a handler (with the same name), this will automatically take
|
||||||
|
// precedence over these weak definitions
|
||||||
|
//*****************************************************************************
|
||||||
|
void WDT_BOD_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void DMA0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void GINT0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void GINT1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void PIN_INT0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void PIN_INT1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void PIN_INT2_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void PIN_INT3_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void UTICK0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void MRT0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void CTIMER0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void CTIMER1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void SCT0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void CTIMER3_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void FLEXCOMM0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void FLEXCOMM1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void FLEXCOMM2_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void FLEXCOMM3_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void FLEXCOMM4_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void FLEXCOMM5_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void FLEXCOMM6_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void FLEXCOMM7_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void ADC0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void Reserved39_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void ACMP_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void Reserved41_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void Reserved42_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void USB0_NEEDCLK_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void USB0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void RTC_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void Reserved46_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void MAILBOX_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void PIN_INT4_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void PIN_INT5_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void PIN_INT6_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void PIN_INT7_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void CTIMER2_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void CTIMER4_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void OS_EVENT_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void Reserved55_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void Reserved56_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void Reserved57_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void SDIO_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void Reserved59_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void Reserved60_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void Reserved61_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void USB1_PHY_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void USB1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void USB1_NEEDCLK_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void SEC_HYPERVISOR_CALL_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void SEC_GPIO_INT0_IRQ0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void SEC_GPIO_INT0_IRQ1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void PLU_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void SEC_VIO_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void HASHCRYPT_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void CASER_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void PUF_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void PQ_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void DMA1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
void FLEXCOMM8_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
|
||||||
|
|
||||||
|
//*****************************************************************************
|
||||||
|
// The entry point for the application.
|
||||||
|
// __main() is the entry point for Redlib based applications
|
||||||
|
// main() is the entry point for Newlib based applications
|
||||||
|
//*****************************************************************************
|
||||||
|
#if defined (__REDLIB__)
|
||||||
|
extern void __main(void);
|
||||||
|
#endif
|
||||||
|
extern int main(void);
|
||||||
|
|
||||||
|
//*****************************************************************************
|
||||||
|
// External declaration for the pointer to the stack top from the Linker Script
|
||||||
|
//*****************************************************************************
|
||||||
|
extern void _vStackTop(void);
|
||||||
|
//*****************************************************************************
|
||||||
|
// External declaration for LPC MCU vector table checksum from Linker Script
|
||||||
|
//*****************************************************************************
|
||||||
|
WEAK extern void __valid_user_code_checksum();
|
||||||
|
extern void _vStackBase(void);
|
||||||
|
|
||||||
|
//*****************************************************************************
|
||||||
|
//*****************************************************************************
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
} // extern "C"
|
||||||
|
#endif
|
||||||
|
//*****************************************************************************
|
||||||
|
// The vector table.
|
||||||
|
// This relies on the linker script to place at correct location in memory.
|
||||||
|
//*****************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern void (* const g_pfnVectors[])(void);
|
||||||
|
extern void * __Vectors __attribute__ ((alias ("g_pfnVectors")));
|
||||||
|
|
||||||
|
__attribute__ ((used, section(".isr_vector")))
|
||||||
|
void (* const g_pfnVectors[])(void) = {
|
||||||
|
// Core Level - CM33
|
||||||
|
&_vStackTop, // The initial stack pointer
|
||||||
|
ResetISR, // The reset handler
|
||||||
|
NMI_Handler, // The NMI handler
|
||||||
|
HardFault_Handler, // The hard fault handler
|
||||||
|
MemManage_Handler, // The MPU fault handler
|
||||||
|
BusFault_Handler, // The bus fault handler
|
||||||
|
UsageFault_Handler, // The usage fault handler
|
||||||
|
SecureFault_Handler, // The secure fault handler
|
||||||
|
0, // ECRP
|
||||||
|
0, // Reserved
|
||||||
|
0, // Reserved
|
||||||
|
SVC_Handler, // SVCall handler
|
||||||
|
DebugMon_Handler, // Debug monitor handler
|
||||||
|
0, // Reserved
|
||||||
|
PendSV_Handler, // The PendSV handler
|
||||||
|
SysTick_Handler, // The SysTick handler
|
||||||
|
|
||||||
|
// Chip Level - LPC55S69_cm33_core0
|
||||||
|
WDT_BOD_IRQHandler, // 16: Windowed watchdog timer, Brownout detect, Flash interrupt
|
||||||
|
DMA0_IRQHandler, // 17: DMA0 controller
|
||||||
|
GINT0_IRQHandler, // 18: GPIO group 0
|
||||||
|
GINT1_IRQHandler, // 19: GPIO group 1
|
||||||
|
PIN_INT0_IRQHandler, // 20: Pin interrupt 0 or pattern match engine slice 0
|
||||||
|
PIN_INT1_IRQHandler, // 21: Pin interrupt 1or pattern match engine slice 1
|
||||||
|
PIN_INT2_IRQHandler, // 22: Pin interrupt 2 or pattern match engine slice 2
|
||||||
|
PIN_INT3_IRQHandler, // 23: Pin interrupt 3 or pattern match engine slice 3
|
||||||
|
UTICK0_IRQHandler, // 24: Micro-tick Timer
|
||||||
|
MRT0_IRQHandler, // 25: Multi-rate timer
|
||||||
|
CTIMER0_IRQHandler, // 26: Standard counter/timer CTIMER0
|
||||||
|
CTIMER1_IRQHandler, // 27: Standard counter/timer CTIMER1
|
||||||
|
SCT0_IRQHandler, // 28: SCTimer/PWM
|
||||||
|
CTIMER3_IRQHandler, // 29: Standard counter/timer CTIMER3
|
||||||
|
FLEXCOMM0_IRQHandler, // 30: Flexcomm Interface 0 (USART, SPI, I2C, I2S, FLEXCOMM)
|
||||||
|
FLEXCOMM1_IRQHandler, // 31: Flexcomm Interface 1 (USART, SPI, I2C, I2S, FLEXCOMM)
|
||||||
|
FLEXCOMM2_IRQHandler, // 32: Flexcomm Interface 2 (USART, SPI, I2C, I2S, FLEXCOMM)
|
||||||
|
FLEXCOMM3_IRQHandler, // 33: Flexcomm Interface 3 (USART, SPI, I2C, I2S, FLEXCOMM)
|
||||||
|
FLEXCOMM4_IRQHandler, // 34: Flexcomm Interface 4 (USART, SPI, I2C, I2S, FLEXCOMM)
|
||||||
|
FLEXCOMM5_IRQHandler, // 35: Flexcomm Interface 5 (USART, SPI, I2C, I2S, FLEXCOMM)
|
||||||
|
FLEXCOMM6_IRQHandler, // 36: Flexcomm Interface 6 (USART, SPI, I2C, I2S, FLEXCOMM)
|
||||||
|
FLEXCOMM7_IRQHandler, // 37: Flexcomm Interface 7 (USART, SPI, I2C, I2S, FLEXCOMM)
|
||||||
|
ADC0_IRQHandler, // 38: ADC0
|
||||||
|
Reserved39_IRQHandler, // 39: Reserved interrupt
|
||||||
|
ACMP_IRQHandler, // 40: ACMP interrupts
|
||||||
|
Reserved41_IRQHandler, // 41: Reserved interrupt
|
||||||
|
Reserved42_IRQHandler, // 42: Reserved interrupt
|
||||||
|
USB0_NEEDCLK_IRQHandler, // 43: USB Activity Wake-up Interrupt
|
||||||
|
USB0_IRQHandler, // 44: USB device
|
||||||
|
RTC_IRQHandler, // 45: RTC alarm and wake-up interrupts
|
||||||
|
Reserved46_IRQHandler, // 46: Reserved interrupt
|
||||||
|
MAILBOX_IRQHandler, // 47: WAKEUP,Mailbox interrupt (present on selected devices)
|
||||||
|
PIN_INT4_IRQHandler, // 48: Pin interrupt 4 or pattern match engine slice 4 int
|
||||||
|
PIN_INT5_IRQHandler, // 49: Pin interrupt 5 or pattern match engine slice 5 int
|
||||||
|
PIN_INT6_IRQHandler, // 50: Pin interrupt 6 or pattern match engine slice 6 int
|
||||||
|
PIN_INT7_IRQHandler, // 51: Pin interrupt 7 or pattern match engine slice 7 int
|
||||||
|
CTIMER2_IRQHandler, // 52: Standard counter/timer CTIMER2
|
||||||
|
CTIMER4_IRQHandler, // 53: Standard counter/timer CTIMER4
|
||||||
|
OS_EVENT_IRQHandler, // 54: OSEVTIMER0 and OSEVTIMER0_WAKEUP interrupts
|
||||||
|
Reserved55_IRQHandler, // 55: Reserved interrupt
|
||||||
|
Reserved56_IRQHandler, // 56: Reserved interrupt
|
||||||
|
Reserved57_IRQHandler, // 57: Reserved interrupt
|
||||||
|
SDIO_IRQHandler, // 58: SD/MMC
|
||||||
|
Reserved59_IRQHandler, // 59: Reserved interrupt
|
||||||
|
Reserved60_IRQHandler, // 60: Reserved interrupt
|
||||||
|
Reserved61_IRQHandler, // 61: Reserved interrupt
|
||||||
|
USB1_PHY_IRQHandler, // 62: USB1_PHY
|
||||||
|
USB1_IRQHandler, // 63: USB1 interrupt
|
||||||
|
USB1_NEEDCLK_IRQHandler, // 64: USB1 activity
|
||||||
|
SEC_HYPERVISOR_CALL_IRQHandler, // 65: SEC_HYPERVISOR_CALL interrupt
|
||||||
|
SEC_GPIO_INT0_IRQ0_IRQHandler, // 66: SEC_GPIO_INT0_IRQ0 interrupt
|
||||||
|
SEC_GPIO_INT0_IRQ1_IRQHandler, // 67: SEC_GPIO_INT0_IRQ1 interrupt
|
||||||
|
PLU_IRQHandler, // 68: PLU interrupt
|
||||||
|
SEC_VIO_IRQHandler, // 69: SEC_VIO interrupt
|
||||||
|
HASHCRYPT_IRQHandler, // 70: HASHCRYPT interrupt
|
||||||
|
CASER_IRQHandler, // 71: CASPER interrupt
|
||||||
|
PUF_IRQHandler, // 72: PUF interrupt
|
||||||
|
PQ_IRQHandler, // 73: PQ interrupt
|
||||||
|
DMA1_IRQHandler, // 74: DMA1 interrupt
|
||||||
|
FLEXCOMM8_IRQHandler, // 75: Flexcomm Interface 8 (SPI, , FLEXCOMM)
|
||||||
|
|
||||||
|
|
||||||
|
}; /* End of g_pfnVectors */
|
||||||
|
|
||||||
|
//*****************************************************************************
|
||||||
|
// Functions to carry out the initialization of RW and BSS data sections. These
|
||||||
|
// are written as separate functions rather than being inlined within the
|
||||||
|
// ResetISR() function in order to cope with MCUs with multiple banks of
|
||||||
|
// memory.
|
||||||
|
//*****************************************************************************
|
||||||
|
__attribute__ ((section(".after_vectors.init_data")))
|
||||||
|
void data_init(unsigned int romstart, unsigned int start, unsigned int len) {
|
||||||
|
unsigned int *pulDest = (unsigned int*) start;
|
||||||
|
unsigned int *pulSrc = (unsigned int*) romstart;
|
||||||
|
unsigned int loop;
|
||||||
|
for (loop = 0; loop < len; loop = loop + 4)
|
||||||
|
*pulDest++ = *pulSrc++;
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__ ((section(".after_vectors.init_bss")))
|
||||||
|
void bss_init(unsigned int start, unsigned int len) {
|
||||||
|
unsigned int *pulDest = (unsigned int*) start;
|
||||||
|
unsigned int loop;
|
||||||
|
for (loop = 0; loop < len; loop = loop + 4)
|
||||||
|
*pulDest++ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//*****************************************************************************
|
||||||
|
// The following symbols are constructs generated by the linker, indicating
|
||||||
|
// the location of various points in the "Global Section Table". This table is
|
||||||
|
// created by the linker via the Code Red managed linker script mechanism. It
|
||||||
|
// contains the load address, execution address and length of each RW data
|
||||||
|
// section and the execution and length of each BSS (zero initialized) section.
|
||||||
|
//*****************************************************************************
|
||||||
|
extern unsigned int __data_section_table;
|
||||||
|
extern unsigned int __data_section_table_end;
|
||||||
|
extern unsigned int __bss_section_table;
|
||||||
|
extern unsigned int __bss_section_table_end;
|
||||||
|
|
||||||
|
//*****************************************************************************
|
||||||
|
// Reset entry point for your code.
|
||||||
|
// Sets up a simple runtime environment and initializes the C/C++
|
||||||
|
// library.
|
||||||
|
//*****************************************************************************
|
||||||
|
__attribute__ ((naked, section(".after_vectors.reset")))
|
||||||
|
void ResetISR(void) {
|
||||||
|
|
||||||
|
|
||||||
|
// Disable interrupts
|
||||||
|
__asm volatile ("cpsid i");
|
||||||
|
|
||||||
|
// Config VTOR & MSPLIM register
|
||||||
|
__asm volatile ("LDR R0, =0xE000ED08 \n"
|
||||||
|
"STR %0, [R0] \n"
|
||||||
|
"LDR R1, [%0] \n"
|
||||||
|
"MSR MSP, R1 \n"
|
||||||
|
"MSR MSPLIM, %1 \n"
|
||||||
|
:
|
||||||
|
: "r"(g_pfnVectors), "r"(_vStackBase)
|
||||||
|
: "r0", "r1");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if defined (__USE_CMSIS)
|
||||||
|
// If __USE_CMSIS defined, then call CMSIS SystemInit code
|
||||||
|
SystemInit();
|
||||||
|
|
||||||
|
#endif // (__USE_CMSIS)
|
||||||
|
|
||||||
|
//
|
||||||
|
// Copy the data sections from flash to SRAM.
|
||||||
|
//
|
||||||
|
unsigned int LoadAddr, ExeAddr, SectionLen;
|
||||||
|
unsigned int *SectionTableAddr;
|
||||||
|
|
||||||
|
// Load base address of Global Section Table
|
||||||
|
SectionTableAddr = &__data_section_table;
|
||||||
|
|
||||||
|
// Copy the data sections from flash to SRAM.
|
||||||
|
while (SectionTableAddr < &__data_section_table_end) {
|
||||||
|
LoadAddr = *SectionTableAddr++;
|
||||||
|
ExeAddr = *SectionTableAddr++;
|
||||||
|
SectionLen = *SectionTableAddr++;
|
||||||
|
data_init(LoadAddr, ExeAddr, SectionLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
// At this point, SectionTableAddr = &__bss_section_table;
|
||||||
|
// Zero fill the bss segment
|
||||||
|
while (SectionTableAddr < &__bss_section_table_end) {
|
||||||
|
ExeAddr = *SectionTableAddr++;
|
||||||
|
SectionLen = *SectionTableAddr++;
|
||||||
|
bss_init(ExeAddr, SectionLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined (__USE_CMSIS)
|
||||||
|
// Assume that if __USE_CMSIS defined, then CMSIS SystemInit code
|
||||||
|
// will setup the VTOR register
|
||||||
|
|
||||||
|
// Check to see if we are running the code from a non-zero
|
||||||
|
// address (eg RAM, external flash), in which case we need
|
||||||
|
// to modify the VTOR register to tell the CPU that the
|
||||||
|
// vector table is located at a non-0x0 address.
|
||||||
|
unsigned int * pSCB_VTOR = (unsigned int *) 0xE000ED08;
|
||||||
|
if ((unsigned int *)g_pfnVectors!=(unsigned int *) 0x00000000) {
|
||||||
|
*pSCB_VTOR = (unsigned int)g_pfnVectors;
|
||||||
|
}
|
||||||
|
#endif // (__USE_CMSIS)
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
//
|
||||||
|
// Call C++ library initialisation
|
||||||
|
//
|
||||||
|
__libc_init_array();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Reenable interrupts
|
||||||
|
__asm volatile ("cpsie i");
|
||||||
|
|
||||||
|
#if defined (__REDLIB__)
|
||||||
|
// Call the Redlib library, which in turn calls main()
|
||||||
|
__main();
|
||||||
|
#else
|
||||||
|
main();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//
|
||||||
|
// main() shouldn't return, but if it does, we'll just enter an infinite loop
|
||||||
|
//
|
||||||
|
while (1) {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//*****************************************************************************
|
||||||
|
// Default core exception handlers. Override the ones here by defining your own
|
||||||
|
// handler routines in your application code.
|
||||||
|
//*****************************************************************************
|
||||||
|
WEAK_AV void NMI_Handler(void)
|
||||||
|
{ while(1) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK_AV void HardFault_Handler(void)
|
||||||
|
{ while(1) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK_AV void MemManage_Handler(void)
|
||||||
|
{ while(1) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK_AV void BusFault_Handler(void)
|
||||||
|
{ while(1) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK_AV void UsageFault_Handler(void)
|
||||||
|
{ while(1) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK_AV void SecureFault_Handler(void)
|
||||||
|
{ while(1) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK_AV void SVC_Handler(void)
|
||||||
|
{ while(1) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK_AV void DebugMon_Handler(void)
|
||||||
|
{ while(1) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK_AV void PendSV_Handler(void)
|
||||||
|
{ while(1) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK_AV void SysTick_Handler(void)
|
||||||
|
{ while(1) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
//*****************************************************************************
|
||||||
|
// Processor ends up here if an unexpected interrupt occurs or a specific
|
||||||
|
// handler is not present in the application code.
|
||||||
|
//*****************************************************************************
|
||||||
|
WEAK_AV void IntDefaultHandler(void)
|
||||||
|
{ while(1) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
//*****************************************************************************
|
||||||
|
// Default application exception handlers. Override the ones here by defining
|
||||||
|
// your own handler routines in your application code. These routines call
|
||||||
|
// driver exception handlers or IntDefaultHandler() if no driver exception
|
||||||
|
// handler is included.
|
||||||
|
//*****************************************************************************
|
||||||
|
WEAK void WDT_BOD_IRQHandler(void)
|
||||||
|
{ WDT_BOD_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void DMA0_IRQHandler(void)
|
||||||
|
{ DMA0_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void GINT0_IRQHandler(void)
|
||||||
|
{ GINT0_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void GINT1_IRQHandler(void)
|
||||||
|
{ GINT1_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void PIN_INT0_IRQHandler(void)
|
||||||
|
{ PIN_INT0_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void PIN_INT1_IRQHandler(void)
|
||||||
|
{ PIN_INT1_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void PIN_INT2_IRQHandler(void)
|
||||||
|
{ PIN_INT2_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void PIN_INT3_IRQHandler(void)
|
||||||
|
{ PIN_INT3_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void UTICK0_IRQHandler(void)
|
||||||
|
{ UTICK0_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void MRT0_IRQHandler(void)
|
||||||
|
{ MRT0_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void CTIMER0_IRQHandler(void)
|
||||||
|
{ CTIMER0_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void CTIMER1_IRQHandler(void)
|
||||||
|
{ CTIMER1_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void SCT0_IRQHandler(void)
|
||||||
|
{ SCT0_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void CTIMER3_IRQHandler(void)
|
||||||
|
{ CTIMER3_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void FLEXCOMM0_IRQHandler(void)
|
||||||
|
{ FLEXCOMM0_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void FLEXCOMM1_IRQHandler(void)
|
||||||
|
{ FLEXCOMM1_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void FLEXCOMM2_IRQHandler(void)
|
||||||
|
{ FLEXCOMM2_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void FLEXCOMM3_IRQHandler(void)
|
||||||
|
{ FLEXCOMM3_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void FLEXCOMM4_IRQHandler(void)
|
||||||
|
{ FLEXCOMM4_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void FLEXCOMM5_IRQHandler(void)
|
||||||
|
{ FLEXCOMM5_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void FLEXCOMM6_IRQHandler(void)
|
||||||
|
{ FLEXCOMM6_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void FLEXCOMM7_IRQHandler(void)
|
||||||
|
{ FLEXCOMM7_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void ADC0_IRQHandler(void)
|
||||||
|
{ ADC0_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void Reserved39_IRQHandler(void)
|
||||||
|
{ Reserved39_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void ACMP_IRQHandler(void)
|
||||||
|
{ ACMP_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void Reserved41_IRQHandler(void)
|
||||||
|
{ Reserved41_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void Reserved42_IRQHandler(void)
|
||||||
|
{ Reserved42_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void USB0_NEEDCLK_IRQHandler(void)
|
||||||
|
{ USB0_NEEDCLK_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void USB0_IRQHandler(void)
|
||||||
|
{ USB0_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void RTC_IRQHandler(void)
|
||||||
|
{ RTC_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void Reserved46_IRQHandler(void)
|
||||||
|
{ Reserved46_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void MAILBOX_IRQHandler(void)
|
||||||
|
{ MAILBOX_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void PIN_INT4_IRQHandler(void)
|
||||||
|
{ PIN_INT4_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void PIN_INT5_IRQHandler(void)
|
||||||
|
{ PIN_INT5_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void PIN_INT6_IRQHandler(void)
|
||||||
|
{ PIN_INT6_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void PIN_INT7_IRQHandler(void)
|
||||||
|
{ PIN_INT7_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void CTIMER2_IRQHandler(void)
|
||||||
|
{ CTIMER2_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void CTIMER4_IRQHandler(void)
|
||||||
|
{ CTIMER4_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void OS_EVENT_IRQHandler(void)
|
||||||
|
{ OS_EVENT_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void Reserved55_IRQHandler(void)
|
||||||
|
{ Reserved55_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void Reserved56_IRQHandler(void)
|
||||||
|
{ Reserved56_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void Reserved57_IRQHandler(void)
|
||||||
|
{ Reserved57_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void SDIO_IRQHandler(void)
|
||||||
|
{ SDIO_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void Reserved59_IRQHandler(void)
|
||||||
|
{ Reserved59_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void Reserved60_IRQHandler(void)
|
||||||
|
{ Reserved60_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void Reserved61_IRQHandler(void)
|
||||||
|
{ Reserved61_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void USB1_PHY_IRQHandler(void)
|
||||||
|
{ USB1_PHY_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void USB1_IRQHandler(void)
|
||||||
|
{ USB1_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void USB1_NEEDCLK_IRQHandler(void)
|
||||||
|
{ USB1_NEEDCLK_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void SEC_HYPERVISOR_CALL_IRQHandler(void)
|
||||||
|
{ SEC_HYPERVISOR_CALL_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void SEC_GPIO_INT0_IRQ0_IRQHandler(void)
|
||||||
|
{ SEC_GPIO_INT0_IRQ0_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void SEC_GPIO_INT0_IRQ1_IRQHandler(void)
|
||||||
|
{ SEC_GPIO_INT0_IRQ1_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void PLU_IRQHandler(void)
|
||||||
|
{ PLU_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void SEC_VIO_IRQHandler(void)
|
||||||
|
{ SEC_VIO_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void HASHCRYPT_IRQHandler(void)
|
||||||
|
{ HASHCRYPT_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void CASER_IRQHandler(void)
|
||||||
|
{ CASER_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void PUF_IRQHandler(void)
|
||||||
|
{ PUF_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void PQ_IRQHandler(void)
|
||||||
|
{ PQ_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void DMA1_IRQHandler(void)
|
||||||
|
{ DMA1_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
WEAK void FLEXCOMM8_IRQHandler(void)
|
||||||
|
{ FLEXCOMM8_DriverIRQHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
//*****************************************************************************
|
||||||
|
|
||||||
|
#if defined (DEBUG)
|
||||||
|
#pragma GCC pop_options
|
||||||
|
#endif // (DEBUG)
|
||||||
|
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2015-2016, Freescale Semiconductor, Inc.
|
||||||
|
* Copyright 2016-2017 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
#include "fsl_debug_console.h"
|
||||||
|
|
||||||
|
#ifndef NDEBUG
|
||||||
|
#if (defined(__CC_ARM)) || (defined(__ARMCC_VERSION)) || (defined(__ICCARM__))
|
||||||
|
void __aeabi_assert(const char *failedExpr, const char *file, int line)
|
||||||
|
{
|
||||||
|
#if SDK_DEBUGCONSOLE == DEBUGCONSOLE_DISABLE
|
||||||
|
PRINTF("ASSERT ERROR \" %s \": file \"%s\" Line \"%d\" \n", failedExpr, file, line);
|
||||||
|
#else
|
||||||
|
(void)PRINTF("ASSERT ERROR \" %s \": file \"%s\" Line \"%d\" \n", failedExpr, file, line);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
__BKPT(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#elif (defined(__GNUC__))
|
||||||
|
#if defined(__REDLIB__)
|
||||||
|
void __assertion_failed(char *failedExpr)
|
||||||
|
{
|
||||||
|
(void)PRINTF("ASSERT ERROR \" %s \n", failedExpr);
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
__BKPT(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
void __assert_func(const char *file, int line, const char *func, const char *failedExpr)
|
||||||
|
{
|
||||||
|
(void)PRINTF("ASSERT ERROR \" %s \": file \"%s\" Line \"%d\" function name \"%s\" \n", failedExpr, file, line,
|
||||||
|
func);
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
__BKPT(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* defined(__REDLIB__) */
|
||||||
|
#endif /* (defined(__CC_ARM) || (defined(__ICCARM__)) || (defined(__ARMCC_VERSION)) */
|
||||||
|
#endif /* NDEBUG */
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,290 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013 - 2015, Freescale Semiconductor, Inc.
|
||||||
|
* Copyright 2016-2018, 2020 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*
|
||||||
|
* Debug console shall provide input and output functions to scan and print formatted data.
|
||||||
|
* o Support a format specifier for PRINTF follows this prototype "%[flags][width][.precision][length]specifier"
|
||||||
|
* - [flags] :'-', '+', '#', ' ', '0'
|
||||||
|
* - [width]: number (0,1...)
|
||||||
|
* - [.precision]: number (0,1...)
|
||||||
|
* - [length]: do not support
|
||||||
|
* - [specifier]: 'd', 'i', 'f', 'F', 'x', 'X', 'o', 'p', 'u', 'c', 's', 'n'
|
||||||
|
* o Support a format specifier for SCANF follows this prototype " %[*][width][length]specifier"
|
||||||
|
* - [*]: is supported.
|
||||||
|
* - [width]: number (0,1...)
|
||||||
|
* - [length]: 'h', 'hh', 'l','ll','L'. ignore ('j','z','t')
|
||||||
|
* - [specifier]: 'd', 'i', 'u', 'f', 'F', 'e', 'E', 'g', 'G', 'a', 'A', 'o', 'c', 's'
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _FSL_DEBUGCONSOLE_H_
|
||||||
|
#define _FSL_DEBUGCONSOLE_H_
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
#include "fsl_component_serial_manager.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @addtogroup debugconsole
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
extern serial_handle_t g_serialHandle; /*!< serial manager handle */
|
||||||
|
|
||||||
|
/*! @brief Definition select redirect toolchain printf, scanf to uart or not. */
|
||||||
|
#define DEBUGCONSOLE_REDIRECT_TO_TOOLCHAIN 0U /*!< Select toolchain printf and scanf. */
|
||||||
|
#define DEBUGCONSOLE_REDIRECT_TO_SDK 1U /*!< Select SDK version printf, scanf. */
|
||||||
|
#define DEBUGCONSOLE_DISABLE 2U /*!< Disable debugconsole function. */
|
||||||
|
|
||||||
|
/*! @brief Definition to select sdk or toolchain printf, scanf. The macro only support
|
||||||
|
* to be redefined in project setting.
|
||||||
|
*/
|
||||||
|
#ifndef SDK_DEBUGCONSOLE
|
||||||
|
#define SDK_DEBUGCONSOLE DEBUGCONSOLE_REDIRECT_TO_SDK
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(SDK_DEBUGCONSOLE) && !(SDK_DEBUGCONSOLE)
|
||||||
|
#include <stdio.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! @brief Definition to select redirect toolchain printf, scanf to uart or not.
|
||||||
|
*
|
||||||
|
* if SDK_DEBUGCONSOLE defined to 0,it represents select toolchain printf, scanf.
|
||||||
|
* if SDK_DEBUGCONSOLE defined to 1,it represents select SDK version printf, scanf.
|
||||||
|
* if SDK_DEBUGCONSOLE defined to 2,it represents disable debugconsole function.
|
||||||
|
*/
|
||||||
|
#if SDK_DEBUGCONSOLE == DEBUGCONSOLE_DISABLE /* Disable debug console */
|
||||||
|
static inline int DbgConsole_Disabled(void)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#define PRINTF(...) DbgConsole_Disabled()
|
||||||
|
#define SCANF(...) DbgConsole_Disabled()
|
||||||
|
#define PUTCHAR(...) DbgConsole_Disabled()
|
||||||
|
#define GETCHAR() DbgConsole_Disabled()
|
||||||
|
#elif SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK /* Select printf, scanf, putchar, getchar of SDK version. */
|
||||||
|
#define PRINTF DbgConsole_Printf
|
||||||
|
#define SCANF DbgConsole_Scanf
|
||||||
|
#define PUTCHAR DbgConsole_Putchar
|
||||||
|
#define GETCHAR DbgConsole_Getchar
|
||||||
|
#elif SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_TOOLCHAIN /* Select printf, scanf, putchar, getchar of toolchain. \ \
|
||||||
|
*/
|
||||||
|
#define PRINTF printf
|
||||||
|
#define SCANF scanf
|
||||||
|
#define PUTCHAR putchar
|
||||||
|
#define GETCHAR getchar
|
||||||
|
#endif /* SDK_DEBUGCONSOLE */
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Prototypes
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
/*! @name Initialization*/
|
||||||
|
/* @{ */
|
||||||
|
|
||||||
|
#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART))
|
||||||
|
/*!
|
||||||
|
* @brief Initializes the peripheral used for debug messages.
|
||||||
|
*
|
||||||
|
* Call this function to enable debug log messages to be output via the specified peripheral
|
||||||
|
* initialized by the serial manager module.
|
||||||
|
* After this function has returned, stdout and stdin are connected to the selected peripheral.
|
||||||
|
*
|
||||||
|
* @param instance The instance of the module.If the device is kSerialPort_Uart,
|
||||||
|
* the instance is UART peripheral instance. The UART hardware peripheral
|
||||||
|
* type is determined by UART adapter. For example, if the instance is 1,
|
||||||
|
* if the lpuart_adapter.c is added to the current project, the UART periheral
|
||||||
|
* is LPUART1.
|
||||||
|
* If the uart_adapter.c is added to the current project, the UART periheral
|
||||||
|
* is UART1.
|
||||||
|
* @param baudRate The desired baud rate in bits per second.
|
||||||
|
* @param device Low level device type for the debug console, can be one of the following.
|
||||||
|
* @arg kSerialPort_Uart,
|
||||||
|
* @arg kSerialPort_UsbCdc
|
||||||
|
* @param clkSrcFreq Frequency of peripheral source clock.
|
||||||
|
*
|
||||||
|
* @return Indicates whether initialization was successful or not.
|
||||||
|
* @retval kStatus_Success Execution successfully
|
||||||
|
*/
|
||||||
|
status_t DbgConsole_Init(uint8_t instance, uint32_t baudRate, serial_port_type_t device, uint32_t clkSrcFreq);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief De-initializes the peripheral used for debug messages.
|
||||||
|
*
|
||||||
|
* Call this function to disable debug log messages to be output via the specified peripheral
|
||||||
|
* initialized by the serial manager module.
|
||||||
|
*
|
||||||
|
* @return Indicates whether de-initialization was successful or not.
|
||||||
|
*/
|
||||||
|
status_t DbgConsole_Deinit(void);
|
||||||
|
/*!
|
||||||
|
* @brief Prepares to enter low power consumption.
|
||||||
|
*
|
||||||
|
* This function is used to prepare to enter low power consumption.
|
||||||
|
*
|
||||||
|
* @return Indicates whether de-initialization was successful or not.
|
||||||
|
*/
|
||||||
|
status_t DbgConsole_EnterLowpower(void);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Restores from low power consumption.
|
||||||
|
*
|
||||||
|
* This function is used to restore from low power consumption.
|
||||||
|
*
|
||||||
|
* @return Indicates whether de-initialization was successful or not.
|
||||||
|
*/
|
||||||
|
status_t DbgConsole_ExitLowpower(void);
|
||||||
|
|
||||||
|
#else
|
||||||
|
/*!
|
||||||
|
* Use an error to replace the DbgConsole_Init when SDK_DEBUGCONSOLE is not DEBUGCONSOLE_REDIRECT_TO_SDK and
|
||||||
|
* SDK_DEBUGCONSOLE_UART is not defined.
|
||||||
|
*/
|
||||||
|
static inline status_t DbgConsole_Init(uint8_t instance,
|
||||||
|
uint32_t baudRate,
|
||||||
|
serial_port_type_t device,
|
||||||
|
uint32_t clkSrcFreq)
|
||||||
|
{
|
||||||
|
(void)instance;
|
||||||
|
(void)baudRate;
|
||||||
|
(void)device;
|
||||||
|
(void)clkSrcFreq;
|
||||||
|
return (status_t)kStatus_Fail;
|
||||||
|
}
|
||||||
|
/*!
|
||||||
|
* Use an error to replace the DbgConsole_Deinit when SDK_DEBUGCONSOLE is not DEBUGCONSOLE_REDIRECT_TO_SDK and
|
||||||
|
* SDK_DEBUGCONSOLE_UART is not defined.
|
||||||
|
*/
|
||||||
|
static inline status_t DbgConsole_Deinit(void)
|
||||||
|
{
|
||||||
|
return (status_t)kStatus_Fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Use an error to replace the DbgConsole_EnterLowpower when SDK_DEBUGCONSOLE is not DEBUGCONSOLE_REDIRECT_TO_SDK and
|
||||||
|
* SDK_DEBUGCONSOLE_UART is not defined.
|
||||||
|
*/
|
||||||
|
static inline status_t DbgConsole_EnterLowpower(void)
|
||||||
|
{
|
||||||
|
return (status_t)kStatus_Fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Use an error to replace the DbgConsole_ExitLowpower when SDK_DEBUGCONSOLE is not DEBUGCONSOLE_REDIRECT_TO_SDK and
|
||||||
|
* SDK_DEBUGCONSOLE_UART is not defined.
|
||||||
|
*/
|
||||||
|
static inline status_t DbgConsole_ExitLowpower(void)
|
||||||
|
{
|
||||||
|
return (status_t)kStatus_Fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) */
|
||||||
|
|
||||||
|
#if SDK_DEBUGCONSOLE
|
||||||
|
/*!
|
||||||
|
* @brief Writes formatted output to the standard output stream.
|
||||||
|
*
|
||||||
|
* Call this function to write a formatted output to the standard output stream.
|
||||||
|
*
|
||||||
|
* @param fmt_s Format control string.
|
||||||
|
* @return Returns the number of characters printed or a negative value if an error occurs.
|
||||||
|
*/
|
||||||
|
int DbgConsole_Printf(const char *fmt_s, ...);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Writes a character to stdout.
|
||||||
|
*
|
||||||
|
* Call this function to write a character to stdout.
|
||||||
|
*
|
||||||
|
* @param ch Character to be written.
|
||||||
|
* @return Returns the character written.
|
||||||
|
*/
|
||||||
|
int DbgConsole_Putchar(int ch);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reads formatted data from the standard input stream.
|
||||||
|
*
|
||||||
|
* Call this function to read formatted data from the standard input stream.
|
||||||
|
*
|
||||||
|
* @note Due the limitation in the BM OSA environment (CPU is blocked in the function,
|
||||||
|
* other tasks will not be scheduled), the function cannot be used when the
|
||||||
|
* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING is set in the BM OSA environment.
|
||||||
|
* And an error is returned when the function called in this case. The suggestion
|
||||||
|
* is that polling the non-blocking function DbgConsole_TryGetchar to get the input char.
|
||||||
|
*
|
||||||
|
* @param formatString Format control string.
|
||||||
|
* @return Returns the number of fields successfully converted and assigned.
|
||||||
|
*/
|
||||||
|
int DbgConsole_Scanf(char *formatString, ...);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reads a character from standard input.
|
||||||
|
*
|
||||||
|
* Call this function to read a character from standard input.
|
||||||
|
*
|
||||||
|
* @note Due the limitation in the BM OSA environment (CPU is blocked in the function,
|
||||||
|
* other tasks will not be scheduled), the function cannot be used when the
|
||||||
|
* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING is set in the BM OSA environment.
|
||||||
|
* And an error is returned when the function called in this case. The suggestion
|
||||||
|
* is that polling the non-blocking function DbgConsole_TryGetchar to get the input char.
|
||||||
|
*
|
||||||
|
* @return Returns the character read.
|
||||||
|
*/
|
||||||
|
int DbgConsole_Getchar(void);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Writes formatted output to the standard output stream with the blocking mode.
|
||||||
|
*
|
||||||
|
* Call this function to write a formatted output to the standard output stream with the blocking mode.
|
||||||
|
* The function will send data with blocking mode no matter the DEBUG_CONSOLE_TRANSFER_NON_BLOCKING set
|
||||||
|
* or not.
|
||||||
|
* The function could be used in system ISR mode with DEBUG_CONSOLE_TRANSFER_NON_BLOCKING set.
|
||||||
|
*
|
||||||
|
* @param formatString Format control string.
|
||||||
|
* @return Returns the number of characters printed or a negative value if an error occurs.
|
||||||
|
*/
|
||||||
|
int DbgConsole_BlockingPrintf(const char *formatString, ...);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Debug console flush.
|
||||||
|
*
|
||||||
|
* Call this function to wait the tx buffer empty.
|
||||||
|
* If interrupt transfer is using, make sure the global IRQ is enable before call this function
|
||||||
|
* This function should be called when
|
||||||
|
* 1, before enter power down mode
|
||||||
|
* 2, log is required to print to terminal immediately
|
||||||
|
* @return Indicates whether wait idle was successful or not.
|
||||||
|
*/
|
||||||
|
status_t DbgConsole_Flush(void);
|
||||||
|
|
||||||
|
#ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
|
||||||
|
/*!
|
||||||
|
* @brief Debug console try to get char
|
||||||
|
* This function provides a API which will not block current task, if character is
|
||||||
|
* available return it, otherwise return fail.
|
||||||
|
* @param ch the address of char to receive
|
||||||
|
* @return Indicates get char was successful or not.
|
||||||
|
*/
|
||||||
|
status_t DbgConsole_TryGetchar(char *ch);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* SDK_DEBUGCONSOLE */
|
||||||
|
|
||||||
|
/*! @} */
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
/*! @} */
|
||||||
|
|
||||||
|
#endif /* _FSL_DEBUGCONSOLE_H_ */
|
||||||
|
|
@ -0,0 +1,160 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 - 2020 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
#ifndef _FSL_DEBUG_CONSOLE_CONF_H_
|
||||||
|
#define _FSL_DEBUG_CONSOLE_CONF_H_
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
|
||||||
|
/****************Debug console configuration********************/
|
||||||
|
|
||||||
|
/*! @brief If Non-blocking mode is needed, please define it at project setting,
|
||||||
|
* otherwise blocking mode is the default transfer mode.
|
||||||
|
* Warning: If you want to use non-blocking transfer,please make sure the corresponding
|
||||||
|
* IO interrupt is enable, otherwise there is no output.
|
||||||
|
* And non-blocking is combine with buffer, no matter bare-metal or rtos.
|
||||||
|
* Below shows how to configure in your project if you want to use non-blocking mode.
|
||||||
|
* For IAR, right click project and select "Options", define it in "C/C++ Compiler->Preprocessor->Defined symbols".
|
||||||
|
* For KEIL, click "Options for Target…", define it in "C/C++->Preprocessor Symbols->Define".
|
||||||
|
* For ARMGCC, open CmakeLists.txt and add the following lines,
|
||||||
|
* "SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DDEBUG_CONSOLE_TRANSFER_NON_BLOCKING")" for debug target.
|
||||||
|
* "SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DDEBUG_CONSOLE_TRANSFER_NON_BLOCKING")" for release target.
|
||||||
|
* For MCUxpresso, right click project and select "Properties", define it in "C/C++ Build->Settings->MCU C
|
||||||
|
* Complier->Preprocessor".
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
|
||||||
|
/*! @brief define the transmit buffer length which is used to store the multi task log, buffer is enabled automatically
|
||||||
|
* when
|
||||||
|
* non-blocking transfer is using,
|
||||||
|
* This value will affect the RAM's ultilization, should be set per paltform's capability and software requirement.
|
||||||
|
* If it is configured too small, log maybe missed , because the log will not be
|
||||||
|
* buffered if the buffer is full, and the print will return immediately with -1.
|
||||||
|
* And this value should be multiple of 4 to meet memory alignment.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef DEBUG_CONSOLE_TRANSMIT_BUFFER_LEN
|
||||||
|
#define DEBUG_CONSOLE_TRANSMIT_BUFFER_LEN (512U)
|
||||||
|
#endif /* DEBUG_CONSOLE_TRANSMIT_BUFFER_LEN */
|
||||||
|
|
||||||
|
/*! @brief define the receive buffer length which is used to store the user input, buffer is enabled automatically when
|
||||||
|
* non-blocking transfer is using,
|
||||||
|
* This value will affect the RAM's ultilization, should be set per paltform's capability and software requirement.
|
||||||
|
* If it is configured too small, log maybe missed, because buffer will be overwrited if buffer is too small.
|
||||||
|
* And this value should be multiple of 4 to meet memory alignment.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef DEBUG_CONSOLE_RECEIVE_BUFFER_LEN
|
||||||
|
#define DEBUG_CONSOLE_RECEIVE_BUFFER_LEN (1024U)
|
||||||
|
#endif /* DEBUG_CONSOLE_RECEIVE_BUFFER_LEN */
|
||||||
|
|
||||||
|
/*!@ brief Whether enable the reliable TX function
|
||||||
|
* If the macro is zero, the reliable TX function of the debug console is disabled.
|
||||||
|
* When the macro is zero, the string of PRINTF will be thrown away after the transmit buffer is full.
|
||||||
|
*/
|
||||||
|
#ifndef DEBUG_CONSOLE_TX_RELIABLE_ENABLE
|
||||||
|
#define DEBUG_CONSOLE_TX_RELIABLE_ENABLE (1U)
|
||||||
|
#endif /* DEBUG_CONSOLE_TX_RELIABLE_ENABLE */
|
||||||
|
|
||||||
|
#else
|
||||||
|
#define DEBUG_CONSOLE_TRANSFER_BLOCKING
|
||||||
|
#endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */
|
||||||
|
|
||||||
|
/*!@ brief Whether enable the RX function
|
||||||
|
* If the macro is zero, the receive function of the debug console is disabled.
|
||||||
|
*/
|
||||||
|
#ifndef DEBUG_CONSOLE_RX_ENABLE
|
||||||
|
#define DEBUG_CONSOLE_RX_ENABLE (1U)
|
||||||
|
#endif /* DEBUG_CONSOLE_RX_ENABLE */
|
||||||
|
|
||||||
|
/*!@ brief define the MAX log length debug console support , that is when you call printf("log", x);, the log
|
||||||
|
* length can not bigger than this value.
|
||||||
|
* This macro decide the local log buffer length, the buffer locate at stack, the stack maybe overflow if
|
||||||
|
* the buffer is too big and current task stack size not big enough.
|
||||||
|
*/
|
||||||
|
#ifndef DEBUG_CONSOLE_PRINTF_MAX_LOG_LEN
|
||||||
|
#define DEBUG_CONSOLE_PRINTF_MAX_LOG_LEN (128U)
|
||||||
|
#endif /* DEBUG_CONSOLE_PRINTF_MAX_LOG_LEN */
|
||||||
|
|
||||||
|
/*!@ brief define the buffer support buffer scanf log length, that is when you call scanf("log", &x);, the log
|
||||||
|
* length can not bigger than this value.
|
||||||
|
* As same as the DEBUG_CONSOLE_BUFFER_PRINTF_MAX_LOG_LEN.
|
||||||
|
*/
|
||||||
|
#ifndef DEBUG_CONSOLE_SCANF_MAX_LOG_LEN
|
||||||
|
#define DEBUG_CONSOLE_SCANF_MAX_LOG_LEN (20U)
|
||||||
|
#endif /* DEBUG_CONSOLE_SCANF_MAX_LOG_LEN */
|
||||||
|
|
||||||
|
/*! @brief Debug console synchronization
|
||||||
|
* User should not change these macro for synchronization mode, but add the
|
||||||
|
* corresponding synchronization mechanism per different software environment.
|
||||||
|
* Such as, if another RTOS is used,
|
||||||
|
* add:
|
||||||
|
* \#define DEBUG_CONSOLE_SYNCHRONIZATION_XXXX 3
|
||||||
|
* in this configuration file and implement the synchronization in fsl.log.c.
|
||||||
|
*/
|
||||||
|
/*! @brief synchronization for baremetal software */
|
||||||
|
#define DEBUG_CONSOLE_SYNCHRONIZATION_BM 0
|
||||||
|
/*! @brief synchronization for freertos software */
|
||||||
|
#define DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS 1
|
||||||
|
|
||||||
|
/*! @brief RTOS synchronization mechanism disable
|
||||||
|
* If not defined, default is enable, to avoid multitask log print mess.
|
||||||
|
* If other RTOS is used, you can implement the RTOS's specific synchronization mechanism in fsl.log.c
|
||||||
|
* If synchronization is disabled, log maybe messed on terminal.
|
||||||
|
*/
|
||||||
|
#ifndef DEBUG_CONSOLE_DISABLE_RTOS_SYNCHRONIZATION
|
||||||
|
#ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
|
||||||
|
#ifdef SDK_OS_FREE_RTOS
|
||||||
|
#define DEBUG_CONSOLE_SYNCHRONIZATION_MODE DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS
|
||||||
|
#else
|
||||||
|
#define DEBUG_CONSOLE_SYNCHRONIZATION_MODE DEBUG_CONSOLE_SYNCHRONIZATION_BM
|
||||||
|
#endif /* SDK_OS_FREE_RTOS */
|
||||||
|
#else
|
||||||
|
#define DEBUG_CONSOLE_SYNCHRONIZATION_MODE DEBUG_CONSOLE_SYNCHRONIZATION_BM
|
||||||
|
#endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */
|
||||||
|
#endif /* DEBUG_CONSOLE_DISABLE_RTOS_SYNCHRONIZATION */
|
||||||
|
|
||||||
|
/*! @brief echo function support
|
||||||
|
* If you want to use the echo function,please define DEBUG_CONSOLE_ENABLE_ECHO
|
||||||
|
* at your project setting.
|
||||||
|
*/
|
||||||
|
#ifndef DEBUG_CONSOLE_ENABLE_ECHO
|
||||||
|
#define DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION 0
|
||||||
|
#else
|
||||||
|
#define DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION 1
|
||||||
|
#endif /* DEBUG_CONSOLE_ENABLE_ECHO */
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
/***************Debug console other configuration*********************/
|
||||||
|
/*! @brief Definition to printf the float number. */
|
||||||
|
#ifndef PRINTF_FLOAT_ENABLE
|
||||||
|
#define PRINTF_FLOAT_ENABLE 0U
|
||||||
|
#endif /* PRINTF_FLOAT_ENABLE */
|
||||||
|
|
||||||
|
/*! @brief Definition to scanf the float number. */
|
||||||
|
#ifndef SCANF_FLOAT_ENABLE
|
||||||
|
#define SCANF_FLOAT_ENABLE 0U
|
||||||
|
#endif /* SCANF_FLOAT_ENABLE */
|
||||||
|
|
||||||
|
/*! @brief Definition to support advanced format specifier for printf. */
|
||||||
|
#ifndef PRINTF_ADVANCED_ENABLE
|
||||||
|
#define PRINTF_ADVANCED_ENABLE 0U
|
||||||
|
#endif /* PRINTF_ADVANCED_ENABLE */
|
||||||
|
|
||||||
|
/*! @brief Definition to support advanced format specifier for scanf. */
|
||||||
|
#ifndef SCANF_ADVANCED_ENABLE
|
||||||
|
#define SCANF_ADVANCED_ENABLE 0U
|
||||||
|
#endif /* SCANF_ADVANCED_ENABLE */
|
||||||
|
|
||||||
|
/*! @brief Definition to select virtual com(USB CDC) as the debug console. */
|
||||||
|
#ifndef BOARD_USE_VIRTUALCOM
|
||||||
|
#define BOARD_USE_VIRTUALCOM 0U
|
||||||
|
#endif
|
||||||
|
/*******************************************************************/
|
||||||
|
|
||||||
|
#endif /* _FSL_DEBUG_CONSOLE_CONF_H_ */
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,66 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _FSL_STR_H
|
||||||
|
#define _FSL_STR_H
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @addtogroup debugconsole
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Prototypes
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief A function pointer which is used when format printf log.
|
||||||
|
*/
|
||||||
|
typedef void (*printfCb)(char *buf, int32_t *indicator, char val, int len);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This function outputs its parameters according to a formatted string.
|
||||||
|
*
|
||||||
|
* @note I/O is performed by calling given function pointer using following
|
||||||
|
* (*func_ptr)(c);
|
||||||
|
*
|
||||||
|
* @param[in] fmt Format string for printf.
|
||||||
|
* @param[in] ap Arguments to printf.
|
||||||
|
* @param[in] buf pointer to the buffer
|
||||||
|
* @param cb print callbck function pointer
|
||||||
|
*
|
||||||
|
* @return Number of characters to be print
|
||||||
|
*/
|
||||||
|
int StrFormatPrintf(const char *fmt, va_list ap, char *buf, printfCb cb);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Converts an input line of ASCII characters based upon a provided
|
||||||
|
* string format.
|
||||||
|
*
|
||||||
|
* @param[in] line_ptr The input line of ASCII data.
|
||||||
|
* @param[in] format Format first points to the format string.
|
||||||
|
* @param[in] args_ptr The list of parameters.
|
||||||
|
*
|
||||||
|
* @return Number of input items converted and assigned.
|
||||||
|
* @retval IO_EOF When line_ptr is empty string "".
|
||||||
|
*/
|
||||||
|
int StrFormatScanf(const char *line_ptr, char *format, va_list args_ptr);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
/*! @} */
|
||||||
|
|
||||||
|
#endif /* _FSL_STR_H */
|
||||||
|
|
@ -0,0 +1,403 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
||||||
|
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
||||||
|
<cconfiguration id="com.crt.advproject.config.exe.debug.1862145727">
|
||||||
|
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.crt.advproject.config.exe.debug.1862145727" moduleId="org.eclipse.cdt.core.settings" name="Debug">
|
||||||
|
<externalSettings/>
|
||||||
|
<extensions>
|
||||||
|
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
|
</extensions>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
|
<configuration artifactExtension="axf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="Debug build" errorParsers="org.eclipse.cdt.core.CWDLocator;org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser" id="com.crt.advproject.config.exe.debug.1862145727" name="Debug" parent="com.crt.advproject.config.exe.debug" postannouncebuildStep="Performing post-build steps" postbuildStep="arm-none-eabi-size "${BuildArtifactFileName}"; # arm-none-eabi-objcopy -v -O binary "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.bin" ; # checksum -p ${TargetChip} -d "${BuildArtifactFileBaseName}.bin"; ">
|
||||||
|
<folderInfo id="com.crt.advproject.config.exe.debug.1862145727." name="/" resourcePath="">
|
||||||
|
<toolChain id="com.crt.advproject.toolchain.exe.debug.2101882168" name="NXP MCU Tools" superClass="com.crt.advproject.toolchain.exe.debug">
|
||||||
|
<targetPlatform binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="com.crt.advproject.platform.exe.debug.793906891" name="ARM-based MCU (Debug)" superClass="com.crt.advproject.platform.exe.debug"/>
|
||||||
|
<builder buildPath="${workspace_loc:}/Debug" id="com.crt.advproject.builder.exe.debug.60853714" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="com.crt.advproject.builder.exe.debug"/>
|
||||||
|
<tool id="com.crt.advproject.cpp.exe.debug.357741791" name="MCU C++ Compiler" superClass="com.crt.advproject.cpp.exe.debug">
|
||||||
|
<option id="com.crt.advproject.cpp.arch.162175469" name="Architecture" superClass="com.crt.advproject.cpp.arch" useByScannerDiscovery="true" value="com.crt.advproject.cpp.target.cm33" valueType="enumerated"/>
|
||||||
|
<option id="com.crt.advproject.cpp.misc.dialect.1389045263" name="Language standard" superClass="com.crt.advproject.cpp.misc.dialect" useByScannerDiscovery="true"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.dialect.flags.1822248623" name="Other dialect flags" superClass="gnu.cpp.compiler.option.dialect.flags" useByScannerDiscovery="true"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.preprocessor.nostdinc.1480086120" name="Do not search system directories (-nostdinc)" superClass="gnu.cpp.compiler.option.preprocessor.nostdinc" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.preprocessor.preprocess.1158162729" name="Preprocess only (-E)" superClass="gnu.cpp.compiler.option.preprocessor.preprocess" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.preprocessor.def.372959106" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.preprocessor.undef.803498943" name="Undefined symbols (-U)" superClass="gnu.cpp.compiler.option.preprocessor.undef" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.include.paths.123577254" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.include.files.1554870048" name="Include files (-include)" superClass="gnu.cpp.compiler.option.include.files" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.cpp.exe.debug.option.optimization.level.731739309" name="Optimization Level" superClass="com.crt.advproject.cpp.exe.debug.option.optimization.level" useByScannerDiscovery="true"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.optimization.flags.1712887809" name="Other optimization flags" superClass="gnu.cpp.compiler.option.optimization.flags" useByScannerDiscovery="false" value="-fno-common" valueType="string"/>
|
||||||
|
<option id="com.crt.advproject.cpp.exe.debug.option.debugging.level.723451878" name="Debug Level" superClass="com.crt.advproject.cpp.exe.debug.option.debugging.level" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.debugging.other.617027403" name="Other debugging flags" superClass="gnu.cpp.compiler.option.debugging.other" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.debugging.prof.1489071293" name="Generate prof information (-p)" superClass="gnu.cpp.compiler.option.debugging.prof" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.debugging.gprof.987879737" name="Generate gprof information (-pg)" superClass="gnu.cpp.compiler.option.debugging.gprof" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.debugging.codecov.528951101" name="Generate gcov information (-ftest-coverage -fprofile-arcs)" superClass="gnu.cpp.compiler.option.debugging.codecov" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.debugging.sanitaddress.1123688523" name="Sanitize address (-fsanitize=address)" superClass="gnu.cpp.compiler.option.debugging.sanitaddress" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.debugging.sanitpointers.659419310" name="Sanitize pointer operations (-fsanitize=pointer-compare -fsanitize=pointer-subtract)" superClass="gnu.cpp.compiler.option.debugging.sanitpointers" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.debugging.sanitthread.1271330029" name="Sanitize data race in multi-thread (-fsanitize=thread)" superClass="gnu.cpp.compiler.option.debugging.sanitthread" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.debugging.sanitleak.281744036" name="Sanitize memory leak (-fsanitize=leak)" superClass="gnu.cpp.compiler.option.debugging.sanitleak" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.debugging.sanitundef.465045065" name="Sanitize undefined behavior (-fsanitize=undefined)" superClass="gnu.cpp.compiler.option.debugging.sanitundef" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.syntax.1450300721" name="Check syntax only (-fsyntax-only)" superClass="gnu.cpp.compiler.option.warnings.syntax" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.pedantic.807570014" name="Pedantic (-pedantic)" superClass="gnu.cpp.compiler.option.warnings.pedantic" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.pedantic.error.1609016745" name="Pedantic warnings as errors (-pedantic-errors)" superClass="gnu.cpp.compiler.option.warnings.pedantic.error" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.nowarn.1144857805" name="Inhibit all warnings (-w)" superClass="gnu.cpp.compiler.option.warnings.nowarn" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.allwarn.1223447196" name="All warnings (-Wall)" superClass="gnu.cpp.compiler.option.warnings.allwarn" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.extrawarn.2013336686" name="Extra warnings (-Wextra)" superClass="gnu.cpp.compiler.option.warnings.extrawarn" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.toerrors.1216374296" name="Warnings as errors (-Werror)" superClass="gnu.cpp.compiler.option.warnings.toerrors" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.wconversion.223448863" name="Implicit conversion warnings (-Wconversion)" superClass="gnu.cpp.compiler.option.warnings.wconversion" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.wcastalign.1571800775" name="Pointer cast with different alignment (-Wcast-align)" superClass="gnu.cpp.compiler.option.warnings.wcastalign" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.wcastqual.2053053167" name="Removing type qualifier from cast target type (-Wcast-qual)" superClass="gnu.cpp.compiler.option.warnings.wcastqual" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.wctordtorprivacy.1784358068" name="All ctor and dtor private (-Wctor-dtor-privacy)" superClass="gnu.cpp.compiler.option.warnings.wctordtorprivacy" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.wdisabledopt.1937095459" name="Requested optimization pass is disabled (-Wdisabled-optimization)" superClass="gnu.cpp.compiler.option.warnings.wdisabledopt" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.wlogicalop.1668271602" name="Suspicious uses of logical operators (-Wlogical-op)" superClass="gnu.cpp.compiler.option.warnings.wlogicalop" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.wmissingdecl.1419699793" name="Global function without previous declaration (-Wmissing-declarations)" superClass="gnu.cpp.compiler.option.warnings.wmissingdecl" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.wmissingincdir.2066607635" name="User-supplied include directory does not exist (-Wmissing-include-dirs)" superClass="gnu.cpp.compiler.option.warnings.wmissingincdir" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.wnoexccept.1850050644" name="Noexcept false but never throw exception (-Wnoexcept)" superClass="gnu.cpp.compiler.option.warnings.wnoexccept" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.woldstylecast.1144561849" name="C-style cast used (-Wold-style-cast)" superClass="gnu.cpp.compiler.option.warnings.woldstylecast" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.woverloadedvirtual.4556660" name="Function hides virtual functions from base class (-Woverloaded-virtual)" superClass="gnu.cpp.compiler.option.warnings.woverloadedvirtual" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.wredundantdecl.888200545" name="More than one declaration in the same scope (-Wredundant-decls)" superClass="gnu.cpp.compiler.option.warnings.wredundantdecl" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.wshadow.144595035" name="Local symbol shadows upper scope symbol (-Wshadow)" superClass="gnu.cpp.compiler.option.warnings.wshadow" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.wsignconv.1782156118" name="Implicit conversions that may change the sign (-Wsign-conversion)" superClass="gnu.cpp.compiler.option.warnings.wsignconv" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.wsignpromo.1718263456" name="Overload resolution promotes unsigned to signed type (-Wsign-promo)" superClass="gnu.cpp.compiler.option.warnings.wsignpromo" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.wstrictnullsent.1955447679" name="Use of an uncasted NULL as sentinel (-Wstrict-null-sentinel)" superClass="gnu.cpp.compiler.option.warnings.wstrictnullsent" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.wswitchdef.797786274" name="A switch statement does not have a default case (-Wswitch-default)" superClass="gnu.cpp.compiler.option.warnings.wswitchdef" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.wundef.26858008" name="An undefined identifier is evaluated in an #if directive (-Wundef)" superClass="gnu.cpp.compiler.option.warnings.wundef" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.weffcpp.674776302" name="Effective C++ guidelines (-Weffc++)" superClass="gnu.cpp.compiler.option.warnings.weffcpp" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.warnings.wfloatequal.276769393" name="Direct float equal check (-Wfloat-equal)" superClass="gnu.cpp.compiler.option.warnings.wfloatequal" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.other.other.1606603323" name="Other flags" superClass="gnu.cpp.compiler.option.other.other" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.other.verbose.110818094" name="Verbose (-v)" superClass="gnu.cpp.compiler.option.other.verbose" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.other.pic.818759965" name="Position Independent Code (-fPIC)" superClass="gnu.cpp.compiler.option.other.pic" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.misc.hardening.818299544" name="Hardening options (-fstack-protector-all -Wformat=2 -Wformat-security -Wstrict-overflow)" superClass="gnu.cpp.compiler.option.misc.hardening" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.cpp.compiler.option.misc.randomization.305776275" name="Address randomization (-fPIE)" superClass="gnu.cpp.compiler.option.misc.randomization" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.cpp.lto.413892678" name="Enable Link-time optimization (-flto)" superClass="com.crt.advproject.cpp.lto" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.cpp.lto.fat.508556629" name="Fat lto objects (-ffat-lto-objects)" superClass="com.crt.advproject.cpp.lto.fat" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.cpp.merge.constants.212992523" name="Merge Identical Constants (-fmerge-constants)" superClass="com.crt.advproject.cpp.merge.constants" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.cpp.prefixmap.1804687253" name="Remove path from __FILE__ (-fmacro-prefix-map)" superClass="com.crt.advproject.cpp.prefixmap" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.cpp.fpu.950484347" name="Floating point" superClass="com.crt.advproject.cpp.fpu" useByScannerDiscovery="true" value="com.crt.advproject.cpp.fpu.fpv5sp.hard" valueType="enumerated"/>
|
||||||
|
<option id="com.crt.advproject.cpp.thumb.1015326237" name="Thumb mode" superClass="com.crt.advproject.cpp.thumb" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.cpp.thumbinterwork.93425639" name="Enable Thumb interworking" superClass="com.crt.advproject.cpp.thumbinterwork" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.cpp.securestate.1502603090" name="TrustZone Project Type" superClass="com.crt.advproject.cpp.securestate" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.cpp.hdrlib.297173636" name="Library headers" superClass="com.crt.advproject.cpp.hdrlib" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.cpp.stackusage.987048934" name="Generate Stack Usage Info (-fstack-usage)" superClass="com.crt.advproject.cpp.stackusage" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.cpp.specs.638827427" name="Specs" superClass="com.crt.advproject.cpp.specs" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.cpp.config.1974709567" name="Obsolete (Config)" superClass="com.crt.advproject.cpp.config" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.cpp.store.1316384163" name="Obsolete (Store)" superClass="com.crt.advproject.cpp.store" useByScannerDiscovery="false"/>
|
||||||
|
</tool>
|
||||||
|
<tool id="com.crt.advproject.gcc.exe.debug.171071308" name="MCU C Compiler" superClass="com.crt.advproject.gcc.exe.debug">
|
||||||
|
<option id="com.crt.advproject.gcc.thumb.1308938271" name="Thumb mode" superClass="com.crt.advproject.gcc.thumb" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||||
|
<option id="com.crt.advproject.gcc.arch.1041907764" name="Architecture" superClass="com.crt.advproject.gcc.arch" useByScannerDiscovery="true" value="com.crt.advproject.gcc.target.cm33" valueType="enumerated"/>
|
||||||
|
<option id="com.crt.advproject.c.misc.dialect.207088263" name="Language standard" superClass="com.crt.advproject.c.misc.dialect" useByScannerDiscovery="true" value="com.crt.advproject.misc.dialect.gnu99" valueType="enumerated"/>
|
||||||
|
<option id="gnu.c.compiler.option.dialect.flags.133101059" name="Other dialect flags" superClass="gnu.c.compiler.option.dialect.flags" useByScannerDiscovery="true"/>
|
||||||
|
<option id="gnu.c.compiler.option.preprocessor.nostdinc.121335995" name="Do not search system directories (-nostdinc)" superClass="gnu.c.compiler.option.preprocessor.nostdinc" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.preprocessor.preprocess.369078125" name="Preprocess only (-E)" superClass="gnu.c.compiler.option.preprocessor.preprocess" useByScannerDiscovery="false"/>
|
||||||
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.preprocessor.def.symbols.2005305628" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
|
||||||
|
<listOptionValue builtIn="false" value="CPU_LPC55S69JBD100"/>
|
||||||
|
<listOptionValue builtIn="false" value="CPU_LPC55S69JBD100_cm33"/>
|
||||||
|
<listOptionValue builtIn="false" value="CPU_LPC55S69JBD100_cm33_core0"/>
|
||||||
|
<listOptionValue builtIn="false" value="SERIAL_PORT_TYPE_UART=1"/>
|
||||||
|
<listOptionValue builtIn="false" value="SDK_OS_FREE_RTOS"/>
|
||||||
|
<listOptionValue builtIn="false" value="MCUXPRESSO_SDK"/>
|
||||||
|
<listOptionValue builtIn="false" value="SDK_DEBUGCONSOLE=1"/>
|
||||||
|
<listOptionValue builtIn="false" value="CR_INTEGER_PRINTF"/>
|
||||||
|
<listOptionValue builtIn="false" value="PRINTF_FLOAT_ENABLE=0"/>
|
||||||
|
<listOptionValue builtIn="false" value="__MCUXPRESSO"/>
|
||||||
|
<listOptionValue builtIn="false" value="__USE_CMSIS"/>
|
||||||
|
<listOptionValue builtIn="false" value="DEBUG"/>
|
||||||
|
<listOptionValue builtIn="false" value="__REDLIB__"/>
|
||||||
|
</option>
|
||||||
|
<option id="gnu.c.compiler.option.preprocessor.undef.symbol.1941265549" name="Undefined symbols (-U)" superClass="gnu.c.compiler.option.preprocessor.undef.symbol" useByScannerDiscovery="false"/>
|
||||||
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.include.paths.669781429" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
|
||||||
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/Config}""/>
|
||||||
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/NXP_Code/freertos}""/>
|
||||||
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/NXP_Code/board}""/>
|
||||||
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/NXP_Code/drivers}""/>
|
||||||
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/NXP_Code/LPC55S69/drivers}""/>
|
||||||
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/NXP_Code/device}""/>
|
||||||
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/NXP_Code/startup}""/>
|
||||||
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/NXP_Code/utilities}""/>
|
||||||
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/NXP_Code/component/uart}""/>
|
||||||
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/NXP_Code/component/serial_manager}""/>
|
||||||
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/NXP_Code/component/lists}""/>
|
||||||
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/NXP_Code/CMSIS}""/>
|
||||||
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/FreeRTOS/include}""/>
|
||||||
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/FreeRTOS/portable/GCC/ARM_CM33_NTZ/non_secure}""/>
|
||||||
|
</option>
|
||||||
|
<option id="gnu.c.compiler.option.include.files.60791210" name="Include files (-include)" superClass="gnu.c.compiler.option.include.files" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.gcc.exe.debug.option.optimization.level.320612430" name="Optimization Level" superClass="com.crt.advproject.gcc.exe.debug.option.optimization.level" useByScannerDiscovery="true"/>
|
||||||
|
<option id="gnu.c.compiler.option.optimization.flags.726118172" name="Other optimization flags" superClass="gnu.c.compiler.option.optimization.flags" useByScannerDiscovery="false" value="-fno-common" valueType="string"/>
|
||||||
|
<option id="com.crt.advproject.gcc.exe.debug.option.debugging.level.389675775" name="Debug Level" superClass="com.crt.advproject.gcc.exe.debug.option.debugging.level" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.debugging.other.1652347420" name="Other debugging flags" superClass="gnu.c.compiler.option.debugging.other" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.debugging.prof.91377446" name="Generate prof information (-p)" superClass="gnu.c.compiler.option.debugging.prof" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.debugging.gprof.708825185" name="Generate gprof information (-pg)" superClass="gnu.c.compiler.option.debugging.gprof" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.debugging.codecov.1560415533" name="Generate gcov information (-ftest-coverage -fprofile-arcs)" superClass="gnu.c.compiler.option.debugging.codecov" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.debugging.sanitaddress.1739591184" name="Sanitize address (-fsanitize=address)" superClass="gnu.c.compiler.option.debugging.sanitaddress" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.debugging.sanitpointers.956825031" name="Sanitize pointer operations (-fsanitize=pointer-compare -fsanitize=pointer-subtract)" superClass="gnu.c.compiler.option.debugging.sanitpointers" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.debugging.sanitthread.379262631" name="Sanitize data race in multi-thread (-fsanitize=thread)" superClass="gnu.c.compiler.option.debugging.sanitthread" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.debugging.sanitleak.1986027933" name="Sanitize memory leak (-fsanitize=leak)" superClass="gnu.c.compiler.option.debugging.sanitleak" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.debugging.sanitundef.1292090722" name="Sanitize undefined behavior (-fsanitize=undefined)" superClass="gnu.c.compiler.option.debugging.sanitundef" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.warnings.syntax.1963579338" name="Check syntax only (-fsyntax-only)" superClass="gnu.c.compiler.option.warnings.syntax" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.warnings.pedantic.664582204" name="Pedantic (-pedantic)" superClass="gnu.c.compiler.option.warnings.pedantic" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.warnings.pedantic.error.101818776" name="Pedantic warnings as errors (-pedantic-errors)" superClass="gnu.c.compiler.option.warnings.pedantic.error" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.warnings.nowarn.1988018896" name="Inhibit all warnings (-w)" superClass="gnu.c.compiler.option.warnings.nowarn" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.warnings.allwarn.496359676" name="All warnings (-Wall)" superClass="gnu.c.compiler.option.warnings.allwarn" useByScannerDiscovery="false" value="false" valueType="boolean"/>
|
||||||
|
<option id="gnu.c.compiler.option.warnings.extrawarn.1009191198" name="Extra warnings (-Wextra)" superClass="gnu.c.compiler.option.warnings.extrawarn" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.warnings.toerrors.474071540" name="Warnings as errors (-Werror)" superClass="gnu.c.compiler.option.warnings.toerrors" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.warnings.wconversion.1177193793" name="Implicit conversion warnings (-Wconversion)" superClass="gnu.c.compiler.option.warnings.wconversion" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.warnings.wcastalign.1124968500" name="Pointer cast with different alignment (-Wcast-align)" superClass="gnu.c.compiler.option.warnings.wcastalign" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.warnings.wcastqual.1357348793" name="Removing type qualifier from cast target type (-Wcast-qual)" superClass="gnu.c.compiler.option.warnings.wcastqual" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.warnings.wdisabledopt.470461717" name="Requested optimization pass is disabled (-Wdisabled-optimization)" superClass="gnu.c.compiler.option.warnings.wdisabledopt" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.warnings.wlogicalop.1668069895" name="Suspicious uses of logical operators (-Wlogical-op)" superClass="gnu.c.compiler.option.warnings.wlogicalop" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.warnings.wmissingdecl.2106101046" name="Global function without previous declaration (-Wmissing-declarations)" superClass="gnu.c.compiler.option.warnings.wmissingdecl" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.warnings.wmissingincdir.736268527" name="User-supplied include directory does not exist (-Wmissing-include-dirs)" superClass="gnu.c.compiler.option.warnings.wmissingincdir" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.warnings.wredundantdecl.1565655950" name="More than one declaration in the same scope (-Wredundant-decls)" superClass="gnu.c.compiler.option.warnings.wredundantdecl" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.warnings.wshadow.1585399692" name="Local symbol shadows upper scope symbol (-Wshadow)" superClass="gnu.c.compiler.option.warnings.wshadow" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.warnings.wsignconv.1999410636" name="Implicit conversions that may change the sign (-Wsign-conversion)" superClass="gnu.c.compiler.option.warnings.wsignconv" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.warnings.wswitchdef.1809435120" name="A switch statement does not have a default case (-Wswitch-default)" superClass="gnu.c.compiler.option.warnings.wswitchdef" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.warnings.wundef.1353315101" name="An undefined identifier is evaluated in an #if directive (-Wundef)" superClass="gnu.c.compiler.option.warnings.wundef" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.warnings.wwritestrings.434771946" name="Treat strings always as const (-Wwrite-strings)" superClass="gnu.c.compiler.option.warnings.wwritestrings" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.warnings.wfloatequal.1839083403" name="Direct float equal check (-Wfloat-equal)" superClass="gnu.c.compiler.option.warnings.wfloatequal" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.misc.other.1943028215" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-mcpu=cortex-m33 -c -ffunction-sections -fdata-sections -ffreestanding -fno-builtin" valueType="string"/>
|
||||||
|
<option id="gnu.c.compiler.option.misc.verbose.1008466657" name="Verbose (-v)" superClass="gnu.c.compiler.option.misc.verbose" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.misc.ansi.337931786" name="Support ANSI programs (-ansi)" superClass="gnu.c.compiler.option.misc.ansi" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.misc.pic.1358373452" name="Position Independent Code (-fPIC)" superClass="gnu.c.compiler.option.misc.pic" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.misc.hardening.1254614422" name="Hardening options (-fstack-protector-all -Wformat=2 -Wformat-security -Wstrict-overflow)" superClass="gnu.c.compiler.option.misc.hardening" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.compiler.option.misc.randomization.754040520" name="Address randomization (-fPIE)" superClass="gnu.c.compiler.option.misc.randomization" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.gcc.lto.820849741" name="Enable Link-time optimization (-flto)" superClass="com.crt.advproject.gcc.lto" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.gcc.lto.fat.921674262" name="Fat lto objects (-ffat-lto-objects)" superClass="com.crt.advproject.gcc.lto.fat" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.gcc.merge.constants.1959736187" name="Merge Identical Constants (-fmerge-constants)" superClass="com.crt.advproject.gcc.merge.constants" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.gcc.prefixmap.2057934351" name="Remove path from __FILE__ (-fmacro-prefix-map)" superClass="com.crt.advproject.gcc.prefixmap" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.gcc.fpu.1913130805" name="Floating point" superClass="com.crt.advproject.gcc.fpu" useByScannerDiscovery="true" value="com.crt.advproject.gcc.fpu.fpv5sp.hard" valueType="enumerated"/>
|
||||||
|
<option id="com.crt.advproject.gcc.thumbinterwork.2109945808" name="Enable Thumb interworking" superClass="com.crt.advproject.gcc.thumbinterwork" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.gcc.securestate.1983489222" name="TrustZone Project Type" superClass="com.crt.advproject.gcc.securestate" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.gcc.hdrlib.1119619111" name="Library headers" superClass="com.crt.advproject.gcc.hdrlib" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.gcc.stackusage.1560510401" name="Generate Stack Usage Info (-fstack-usage)" superClass="com.crt.advproject.gcc.stackusage" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.gcc.specs.229644162" name="Specs" superClass="com.crt.advproject.gcc.specs" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.gcc.config.397451" name="Obsolete (Config)" superClass="com.crt.advproject.gcc.config" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.gcc.store.1777775510" name="Obsolete (Store)" superClass="com.crt.advproject.gcc.store" useByScannerDiscovery="false"/>
|
||||||
|
<inputType id="com.crt.advproject.compiler.input.1175133567" superClass="com.crt.advproject.compiler.input"/>
|
||||||
|
</tool>
|
||||||
|
<tool id="com.crt.advproject.gas.exe.debug.1463820567" name="MCU Assembler" superClass="com.crt.advproject.gas.exe.debug">
|
||||||
|
<option id="com.crt.advproject.gas.thumb.766534177" name="Thumb mode" superClass="com.crt.advproject.gas.thumb" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||||
|
<option id="com.crt.advproject.gas.arch.1714712505" name="Architecture" superClass="com.crt.advproject.gas.arch" useByScannerDiscovery="false" value="com.crt.advproject.gas.target.cm33" valueType="enumerated"/>
|
||||||
|
<option id="gnu.both.asm.option.flags.crt.1729470832" name="Assembler flags" superClass="gnu.both.asm.option.flags.crt" useByScannerDiscovery="false"/>
|
||||||
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.both.asm.option.include.paths.966173176" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
|
||||||
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/NXP_Code/board}""/>
|
||||||
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/NXP_Code/source}""/>
|
||||||
|
</option>
|
||||||
|
<option id="gnu.both.asm.option.warnings.nowarn.2008296370" name="Suppress warnings (-W)" superClass="gnu.both.asm.option.warnings.nowarn" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.both.asm.option.version.1350827282" name="Announce version (-v)" superClass="gnu.both.asm.option.version" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.gas.exe.debug.option.debugging.level.1557865142" name="Debug level" superClass="com.crt.advproject.gas.exe.debug.option.debugging.level" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.gas.fpu.176418334" name="Floating point" superClass="com.crt.advproject.gas.fpu" useByScannerDiscovery="false" value="com.crt.advproject.gas.fpu.fpv5sp.hard" valueType="enumerated"/>
|
||||||
|
<option id="com.crt.advproject.gas.thumbinterwork.678649350" name="Enable Thumb interworking" superClass="com.crt.advproject.gas.thumbinterwork" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.gas.hdrlib.495775023" name="Library headers" superClass="com.crt.advproject.gas.hdrlib" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.gas.specs.1750466735" name="Specs" superClass="com.crt.advproject.gas.specs" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.gas.config.664185177" name="Obsolete (Config)" superClass="com.crt.advproject.gas.config" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.gas.store.198244873" name="Obsolete (Store)" superClass="com.crt.advproject.gas.store" useByScannerDiscovery="false"/>
|
||||||
|
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1490455622" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
|
||||||
|
<inputType id="com.crt.advproject.assembler.input.957207631" name="Additional Assembly Source Files" superClass="com.crt.advproject.assembler.input"/>
|
||||||
|
</tool>
|
||||||
|
<tool id="com.crt.advproject.link.cpp.exe.debug.1501589225" name="MCU C++ Linker" superClass="com.crt.advproject.link.cpp.exe.debug">
|
||||||
|
<option id="com.crt.advproject.link.cpp.arch.43786202" name="Architecture" superClass="com.crt.advproject.link.cpp.arch" value="com.crt.advproject.link.cpp.target.cm33" valueType="enumerated"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.multicore.slave.522057245" name="Multicore configuration" superClass="com.crt.advproject.link.cpp.multicore.slave"/>
|
||||||
|
<option id="gnu.cpp.link.option.nostart.1117431289" name="Do not use standard start files (-nostartfiles)" superClass="gnu.cpp.link.option.nostart"/>
|
||||||
|
<option id="gnu.cpp.link.option.nodeflibs.216038687" name="Do not use default libraries (-nodefaultlibs)" superClass="gnu.cpp.link.option.nodeflibs"/>
|
||||||
|
<option id="gnu.cpp.link.option.nostdlibs.1078741504" name="No startup or default libs (-nostdlib)" superClass="gnu.cpp.link.option.nostdlibs" value="true" valueType="boolean"/>
|
||||||
|
<option id="gnu.cpp.link.option.strip.1590809996" name="Omit all symbol information (-s)" superClass="gnu.cpp.link.option.strip"/>
|
||||||
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.link.option.libs.2079287005" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" valueType="libs">
|
||||||
|
<listOptionValue builtIn="false" value="power_hardabi"/>
|
||||||
|
</option>
|
||||||
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.link.option.paths.183404342" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" valueType="libPaths">
|
||||||
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/LPC55S69/mcuxpresso}""/>
|
||||||
|
</option>
|
||||||
|
<option id="gnu.cpp.link.option.flags.1636800464" name="Linker flags" superClass="gnu.cpp.link.option.flags"/>
|
||||||
|
<option id="gnu.cpp.link.option.other.247096326" name="Other options (-Xlinker [option])" superClass="gnu.cpp.link.option.other"/>
|
||||||
|
<option id="gnu.cpp.link.option.userobjs.1799145977" name="Other objects" superClass="gnu.cpp.link.option.userobjs"/>
|
||||||
|
<option id="gnu.cpp.link.option.shared.1295158953" name="Shared (-shared)" superClass="gnu.cpp.link.option.shared"/>
|
||||||
|
<option id="gnu.cpp.link.option.soname.72595247" name="Shared object name (-Wl,-soname=)" superClass="gnu.cpp.link.option.soname"/>
|
||||||
|
<option id="gnu.cpp.link.option.implname.100034898" name="Import Library name (-Wl,--out-implib=)" superClass="gnu.cpp.link.option.implname"/>
|
||||||
|
<option id="gnu.cpp.link.option.defname.129036552" name="DEF file name (-Wl,--output-def=)" superClass="gnu.cpp.link.option.defname"/>
|
||||||
|
<option id="gnu.cpp.link.option.debugging.prof.1590512937" name="Generate prof information (-p)" superClass="gnu.cpp.link.option.debugging.prof"/>
|
||||||
|
<option id="gnu.cpp.link.option.debugging.gprof.397536807" name="Generate gprof information (-pg)" superClass="gnu.cpp.link.option.debugging.gprof"/>
|
||||||
|
<option id="gnu.cpp.link.option.debugging.codecov.1273829782" name="Generate gcov information (-ftest-coverage -fprofile-arcs)" superClass="gnu.cpp.link.option.debugging.codecov"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.lto.1497546146" name="Enable Link-time optimization (-flto)" superClass="com.crt.advproject.link.cpp.lto"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.lto.optmization.level.110249418" name="Link-time optimization level" superClass="com.crt.advproject.link.cpp.lto.optmization.level"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.fpu.1099350020" name="Floating point" superClass="com.crt.advproject.link.cpp.fpu" value="com.crt.advproject.link.cpp.fpu.fpv5sp.hard" valueType="enumerated"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.thumb.2026602953" name="Thumb mode" superClass="com.crt.advproject.link.cpp.thumb"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.manage.354717604" name="Manage linker script" superClass="com.crt.advproject.link.cpp.manage"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.script.357582367" name="Linker script" superClass="com.crt.advproject.link.cpp.script"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.scriptdir.167961933" name="Script path" superClass="com.crt.advproject.link.cpp.scriptdir"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.crpenable.1656462814" name="Enable automatic placement of Code Read Protection field in image" superClass="com.crt.advproject.link.cpp.crpenable"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.flashconfigenable.370001560" name="Enable automatic placement of Flash Configuration field in image" superClass="com.crt.advproject.link.cpp.flashconfigenable" value="true" valueType="boolean"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.ecrp.1343382259" name="Enhanced CRP" superClass="com.crt.advproject.link.cpp.ecrp"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.hdrlib.19329740" name="Library" superClass="com.crt.advproject.link.cpp.hdrlib"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.nanofloat.2139699995" name="Enable printf float " superClass="com.crt.advproject.link.cpp.nanofloat"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.nanofloat.scanf.1519287498" name="Enable scanf float " superClass="com.crt.advproject.link.cpp.nanofloat.scanf"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.toram.622140918" name="Link application to RAM" superClass="com.crt.advproject.link.cpp.toram"/>
|
||||||
|
<option id="com.crt.advproject.link.memory.load.image.cpp.1947734063" name="Plain load image" superClass="com.crt.advproject.link.memory.load.image.cpp"/>
|
||||||
|
<option id="com.crt.advproject.link.memory.heapAndStack.style.cpp.900402799" name="Heap and Stack placement" superClass="com.crt.advproject.link.memory.heapAndStack.style.cpp"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.stackOffset.2142458585" name="Stack offset" superClass="com.crt.advproject.link.cpp.stackOffset"/>
|
||||||
|
<option id="com.crt.advproject.link.memory.heapAndStack.cpp.205444829" name="Heap and Stack options" superClass="com.crt.advproject.link.memory.heapAndStack.cpp"/>
|
||||||
|
<option id="com.crt.advproject.link.memory.data.cpp.808180550" name="Global data placement" superClass="com.crt.advproject.link.memory.data.cpp"/>
|
||||||
|
<option id="com.crt.advproject.link.memory.sections.cpp.1300665788" name="Extra linker script input sections" superClass="com.crt.advproject.link.memory.sections.cpp"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.multicore.master.261985875" name="Multicore master" superClass="com.crt.advproject.link.cpp.multicore.master"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.multicore.empty.76289264" name="No Multicore options for this project" superClass="com.crt.advproject.link.cpp.multicore.empty"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.multicore.master.userobjs.817552430" name="Slave Objects (not visible)" superClass="com.crt.advproject.link.cpp.multicore.master.userobjs"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.config.1361270243" name="Obsolete (Config)" superClass="com.crt.advproject.link.cpp.config"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.store.679220035" name="Obsolete (Store)" superClass="com.crt.advproject.link.cpp.store"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.securestate.315517187" name="TrustZone Project Type" superClass="com.crt.advproject.link.cpp.securestate"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.sgstubs.placement.1031595732" name="Secure Gateway Placement" superClass="com.crt.advproject.link.cpp.sgstubs.placement"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.sgstubenable.1759649523" name="Enable generation of Secure Gateway Import Library" superClass="com.crt.advproject.link.cpp.sgstubenable"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.nonsecureobject.1388788195" name="Secure Gateway Import Library" superClass="com.crt.advproject.link.cpp.nonsecureobject"/>
|
||||||
|
<option id="com.crt.advproject.link.cpp.inimplib.1653424749" name="Input Secure Gateway Import Library" superClass="com.crt.advproject.link.cpp.inimplib"/>
|
||||||
|
</tool>
|
||||||
|
<tool id="com.crt.advproject.link.exe.debug.1903655667" name="MCU Linker" superClass="com.crt.advproject.link.exe.debug">
|
||||||
|
<option id="com.crt.advproject.link.thumb.1244709143" name="Thumb mode" superClass="com.crt.advproject.link.thumb" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||||
|
<option id="com.crt.advproject.link.memory.load.image.1191336210" name="Plain load image" superClass="com.crt.advproject.link.memory.load.image" useByScannerDiscovery="false" value="false;" valueType="string"/>
|
||||||
|
<option defaultValue="com.crt.advproject.heapAndStack.mcuXpressoStyle" id="com.crt.advproject.link.memory.heapAndStack.style.1362557675" name="Heap and Stack placement" superClass="com.crt.advproject.link.memory.heapAndStack.style" useByScannerDiscovery="false" valueType="enumerated"/>
|
||||||
|
<option id="com.crt.advproject.link.memory.heapAndStack.650532780" name="Heap and Stack options" superClass="com.crt.advproject.link.memory.heapAndStack" useByScannerDiscovery="false" value="&Heap:Default;Post Data;Default&Stack:Default;End;Default" valueType="string"/>
|
||||||
|
<option id="com.crt.advproject.link.memory.data.1609040024" name="Global data placement" superClass="com.crt.advproject.link.memory.data" useByScannerDiscovery="false" value="Default" valueType="string"/>
|
||||||
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="com.crt.advproject.link.memory.sections.1195288836" name="Extra linker script input sections" superClass="com.crt.advproject.link.memory.sections" useByScannerDiscovery="false" valueType="stringList"/>
|
||||||
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="com.crt.advproject.link.gcc.multicore.master.userobjs.853956132" name="Slave Objects (not visible)" superClass="com.crt.advproject.link.gcc.multicore.master.userobjs" useByScannerDiscovery="false" valueType="userObjs"/>
|
||||||
|
<option id="com.crt.advproject.link.gcc.multicore.slave.98956362" name="Multicore configuration" superClass="com.crt.advproject.link.gcc.multicore.slave" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.link.arch.736238393" name="Architecture" superClass="com.crt.advproject.link.arch" useByScannerDiscovery="false" value="com.crt.advproject.link.target.cm33" valueType="enumerated"/>
|
||||||
|
<option id="gnu.c.link.option.nostart.2005959827" name="Do not use standard start files (-nostartfiles)" superClass="gnu.c.link.option.nostart" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.link.option.nodeflibs.784632726" name="Do not use default libraries (-nodefaultlibs)" superClass="gnu.c.link.option.nodeflibs" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.link.option.nostdlibs.1686388728" name="No startup or default libs (-nostdlib)" superClass="gnu.c.link.option.nostdlibs" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||||
|
<option id="gnu.c.link.option.strip.1383979301" name="Omit all symbol information (-s)" superClass="gnu.c.link.option.strip" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.link.option.noshared.1374799816" name="No shared libraries (-static)" superClass="gnu.c.link.option.noshared" useByScannerDiscovery="false"/>
|
||||||
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.link.option.libs.760576006" name="Libraries (-l)" superClass="gnu.c.link.option.libs" useByScannerDiscovery="false" valueType="libs">
|
||||||
|
<listOptionValue builtIn="false" value="power_hardabi"/>
|
||||||
|
</option>
|
||||||
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.link.option.paths.281816225" name="Library search path (-L)" superClass="gnu.c.link.option.paths" useByScannerDiscovery="false" valueType="libPaths">
|
||||||
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/NXP_Code/LPC55S69/mcuxpresso}""/>
|
||||||
|
</option>
|
||||||
|
<option id="gnu.c.link.option.ldflags.1521973988" name="Linker flags" superClass="gnu.c.link.option.ldflags" useByScannerDiscovery="false"/>
|
||||||
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.link.option.other.717396762" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" useByScannerDiscovery="false" valueType="stringList">
|
||||||
|
<listOptionValue builtIn="false" value="-Map="${BuildArtifactFileBaseName}.map""/>
|
||||||
|
<listOptionValue builtIn="false" value="--gc-sections"/>
|
||||||
|
<listOptionValue builtIn="false" value="-print-memory-usage"/>
|
||||||
|
<listOptionValue builtIn="false" value="--sort-section=alignment"/>
|
||||||
|
<listOptionValue builtIn="false" value="--cref"/>
|
||||||
|
</option>
|
||||||
|
<option id="gnu.c.link.option.userobjs.284424039" name="Other objects" superClass="gnu.c.link.option.userobjs" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.link.option.shared.1580045025" name="Shared (-shared)" superClass="gnu.c.link.option.shared" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.link.option.soname.926658386" name="Shared object name (-Wl,-soname=)" superClass="gnu.c.link.option.soname" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.link.option.implname.68778950" name="Import Library name (-Wl,--out-implib=)" superClass="gnu.c.link.option.implname" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.link.option.defname.2088633072" name="DEF file name (-Wl,--output-def=)" superClass="gnu.c.link.option.defname" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.link.option.debugging.prof.1264580148" name="Generate prof information (-p)" superClass="gnu.c.link.option.debugging.prof" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.link.option.debugging.gprof.1017150387" name="Generate gprof information (-pg)" superClass="gnu.c.link.option.debugging.gprof" useByScannerDiscovery="false"/>
|
||||||
|
<option id="gnu.c.link.option.debugging.codecov.1764932973" name="Generate gcov information (-ftest-coverage -fprofile-arcs)" superClass="gnu.c.link.option.debugging.codecov" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.link.gcc.lto.507891084" name="Enable Link-time optimization (-flto)" superClass="com.crt.advproject.link.gcc.lto" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.link.gcc.lto.optmization.level.969830486" name="Link-time optimization level" superClass="com.crt.advproject.link.gcc.lto.optmization.level" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.link.fpu.2121868508" name="Floating point" superClass="com.crt.advproject.link.fpu" useByScannerDiscovery="false" value="com.crt.advproject.link.fpu.fpv5sp.hard" valueType="enumerated"/>
|
||||||
|
<option id="com.crt.advproject.link.manage.1894091750" name="Manage linker script" superClass="com.crt.advproject.link.manage" useByScannerDiscovery="false" value="false" valueType="boolean"/>
|
||||||
|
<option id="com.crt.advproject.link.script.849158014" name="Linker script" superClass="com.crt.advproject.link.script" useByScannerDiscovery="false" value="../FreeRTOSDemo.ld" valueType="string"/>
|
||||||
|
<option id="com.crt.advproject.link.scriptdir.1856736428" name="Script path" superClass="com.crt.advproject.link.scriptdir" useByScannerDiscovery="false" value="" valueType="string"/>
|
||||||
|
<option id="com.crt.advproject.link.crpenable.1464490347" name="Enable automatic placement of Code Read Protection field in image" superClass="com.crt.advproject.link.crpenable" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.link.flashconfigenable.2071375483" name="Enable automatic placement of Flash Configuration field in image" superClass="com.crt.advproject.link.flashconfigenable" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||||
|
<option id="com.crt.advproject.link.ecrp.1053516759" name="Enhanced CRP" superClass="com.crt.advproject.link.ecrp" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.link.gcc.hdrlib.770109109" name="Library" superClass="com.crt.advproject.link.gcc.hdrlib" useByScannerDiscovery="false" value="com.crt.advproject.gcc.link.hdrlib.codered.nohost_nf" valueType="enumerated"/>
|
||||||
|
<option id="com.crt.advproject.link.gcc.nanofloat.1624630781" name="Enable printf float " superClass="com.crt.advproject.link.gcc.nanofloat" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.link.gcc.nanofloat.scanf.1555855253" name="Enable scanf float " superClass="com.crt.advproject.link.gcc.nanofloat.scanf" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.link.toram.628212465" name="Link application to RAM" superClass="com.crt.advproject.link.toram" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.link.stackOffset.1349645169" name="Stack offset" superClass="com.crt.advproject.link.stackOffset" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.link.gcc.multicore.master.416485424" name="Multicore master" superClass="com.crt.advproject.link.gcc.multicore.master" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.link.gcc.multicore.empty.937963224" name="No Multicore options for this project" superClass="com.crt.advproject.link.gcc.multicore.empty" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.link.config.340181780" name="Obsolete (Config)" superClass="com.crt.advproject.link.config" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.link.store.1795408503" name="Obsolete (Store)" superClass="com.crt.advproject.link.store" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.link.securestate.526518518" name="TrustZone Project Type" superClass="com.crt.advproject.link.securestate" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.link.sgstubs.placement.384191437" name="Secure Gateway Placement" superClass="com.crt.advproject.link.sgstubs.placement" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.link.sgstubenable.1689807195" name="Enable generation of Secure Gateway Import Library" superClass="com.crt.advproject.link.sgstubenable" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.link.nonsecureobject.1643471381" name="Secure Gateway Import Library" superClass="com.crt.advproject.link.nonsecureobject" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.link.inimplib.309086707" name="Input Secure Gateway Import Library" superClass="com.crt.advproject.link.inimplib" useByScannerDiscovery="false"/>
|
||||||
|
<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.1540443803" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
|
||||||
|
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
|
||||||
|
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
|
||||||
|
</inputType>
|
||||||
|
</tool>
|
||||||
|
<tool id="com.crt.advproject.tool.debug.debug.1751639009" name="MCU Debugger" superClass="com.crt.advproject.tool.debug.debug">
|
||||||
|
<option id="com.crt.advproject.linkserver.debug.prevent.debug.1771099430" name="Prevent Debugging" superClass="com.crt.advproject.linkserver.debug.prevent.debug" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.miscellaneous.end_of_heap.179994224" name="Last used address of the heap" superClass="com.crt.advproject.miscellaneous.end_of_heap" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.miscellaneous.pvHeapStart.661728726" name="First address of the heap" superClass="com.crt.advproject.miscellaneous.pvHeapStart" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.miscellaneous.pvHeapLimit.1652353213" name="Maximum extent of heap" superClass="com.crt.advproject.miscellaneous.pvHeapLimit" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.debugger.security.nonsecureimageenable.1215804757" name="Enable pre-programming of Non-Secure Image" superClass="com.crt.advproject.debugger.security.nonsecureimageenable" useByScannerDiscovery="false"/>
|
||||||
|
<option id="com.crt.advproject.debugger.security.nonsecureimage.745987985" name="Non-Secure Project" superClass="com.crt.advproject.debugger.security.nonsecureimage" useByScannerDiscovery="false"/>
|
||||||
|
</tool>
|
||||||
|
</toolChain>
|
||||||
|
</folderInfo>
|
||||||
|
<folderInfo id="com.crt.advproject.config.exe.debug.1862145727.568100634" name="/" resourcePath="FreeRTOS/portable">
|
||||||
|
<toolChain id="com.crt.advproject.toolchain.exe.debug.1726750646" name="NXP MCU Tools" superClass="com.crt.advproject.toolchain.exe.debug" unusedChildren="">
|
||||||
|
<tool id="com.crt.advproject.cpp.exe.debug.1573370223" name="MCU C++ Compiler" superClass="com.crt.advproject.cpp.exe.debug.357741791"/>
|
||||||
|
<tool id="com.crt.advproject.gcc.exe.debug.148663237" name="MCU C Compiler" superClass="com.crt.advproject.gcc.exe.debug.171071308"/>
|
||||||
|
<tool id="com.crt.advproject.gas.exe.debug.327868635" name="MCU Assembler" superClass="com.crt.advproject.gas.exe.debug.1463820567"/>
|
||||||
|
<tool id="com.crt.advproject.link.cpp.exe.debug.1824196186" name="MCU C++ Linker" superClass="com.crt.advproject.link.cpp.exe.debug.1501589225"/>
|
||||||
|
<tool id="com.crt.advproject.link.exe.debug.318428891" name="MCU Linker" superClass="com.crt.advproject.link.exe.debug.1903655667"/>
|
||||||
|
<tool id="com.crt.advproject.tool.debug.debug.1827658843" name="MCU Debugger" superClass="com.crt.advproject.tool.debug.debug.1751639009"/>
|
||||||
|
</toolChain>
|
||||||
|
</folderInfo>
|
||||||
|
</configuration>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||||
|
</cconfiguration>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
|
<project id="FreeRTOSDemo.null.404753365" name="FreeRTOSDemo" projectType="com.crt.advproject.projecttype.exe"/>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="scannerConfiguration">
|
||||||
|
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||||
|
<scannerConfigBuildInfo instanceId="com.crt.advproject.config.exe.debug.1862145727;com.crt.advproject.config.exe.debug.1862145727.;com.crt.advproject.gas.exe.debug.1463820567;com.crt.advproject.assembler.input.957207631">
|
||||||
|
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||||
|
</scannerConfigBuildInfo>
|
||||||
|
<scannerConfigBuildInfo instanceId="com.crt.advproject.config.exe.debug.1862145727;com.crt.advproject.config.exe.debug.1862145727.;com.crt.advproject.gcc.exe.debug.171071308;com.crt.advproject.compiler.input.1175133567">
|
||||||
|
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||||
|
</scannerConfigBuildInfo>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
|
||||||
|
<storageModule moduleId="com.nxp.mcuxpresso.core.datamodels">
|
||||||
|
<sdkName>SDK_2.x_LPCXpresso55S69</sdkName>
|
||||||
|
<sdkExample>FreeRTOSDemo</sdkExample>
|
||||||
|
<sdkVersion>2.10.0</sdkVersion>
|
||||||
|
<sdkComponents>middleware.freertos-kernel.cm33_nonsecure_port.LPC55S69;middleware.freertos-kernel.heap_4.LPC55S69;platform.drivers.common.LPC55S69;platform.drivers.power.LPC55S69;platform.drivers.clock.LPC55S69;platform.devices.LPC55S69_CMSIS.LPC55S69;platform.devices.LPC55S69_startup.LPC55S69;platform.drivers.flexcomm_usart.LPC55S69;platform.drivers.flexcomm.LPC55S69;platform.drivers.lpc_iocon.LPC55S69;platform.drivers.lpc_gpio.LPC55S69;platform.utilities.assert.LPC55S69;utility.debug_console.LPC55S69;component.usart_adapter.LPC55S69;component.serial_manager.LPC55S69;component.lists.LPC55S69;component.serial_manager_uart.LPC55S69;middleware.freertos-kernel.LPC55S69;middleware.freertos-kernel.extension.LPC55S69;CMSIS_Include_core_cm.LPC55S69;platform.drivers.reset.LPC55S69;platform.utilities.misc_utilities.LPC55S69;platform.devices.LPC55S69_system.LPC55S69;FreeRTOSDemo;</sdkComponents>
|
||||||
|
<boardId>lpcxpresso55s69</boardId>
|
||||||
|
<package>LPC55S69JBD100</package>
|
||||||
|
<core>cm33</core>
|
||||||
|
<coreId>cm33_core0_LPC55S69</coreId>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="com.crt.config">
|
||||||
|
<projectStorage><?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<TargetConfig>
|
||||||
|
<Properties property_3="NXP" property_4="LPC55S69" property_count="5" version="100300"/>
|
||||||
|
<infoList vendor="NXP">
|
||||||
|
<info chip="LPC55S69" name="LPC55S69">
|
||||||
|
<chip>
|
||||||
|
<name>LPC55S69</name>
|
||||||
|
<family>LPC55S6x</family>
|
||||||
|
<vendor>NXP</vendor>
|
||||||
|
<memory can_program="true" id="Flash" is_ro="true" size="608" type="Flash"/>
|
||||||
|
<memory id="RAM" size="304" type="RAM"/>
|
||||||
|
<memoryInstance derived_from="Flash" driver="LPC55xx.cfx" edited="true" id="PROGRAM_FLASH" location="0x0" size="0x98000"/>
|
||||||
|
<memoryInstance derived_from="RAM" edited="true" id="SRAM" location="0x20000000" size="0x40000"/>
|
||||||
|
<memoryInstance derived_from="RAM" edited="true" id="SRAMX" location="0x4000000" size="0x8000"/>
|
||||||
|
<memoryInstance derived_from="RAM" edited="true" id="USB_RAM" location="0x40100000" size="0x4000"/>
|
||||||
|
<memoryInstance derived_from="RAM" edited="true" id="SRAM4" location="0x20040000" size="0x4000"/>
|
||||||
|
</chip>
|
||||||
|
<processor>
|
||||||
|
<name gcc_name="cortex-m33">Cortex-M33</name>
|
||||||
|
<family>Cortex-M</family>
|
||||||
|
</processor>
|
||||||
|
<processor>
|
||||||
|
<name gcc_name="cortex-m33-nodsp">Cortex-M33 (No DSP)</name>
|
||||||
|
<family>Cortex-M</family>
|
||||||
|
</processor>
|
||||||
|
</info>
|
||||||
|
</infoList>
|
||||||
|
</TargetConfig></projectStorage>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
|
||||||
|
<storageModule moduleId="refreshScope"/>
|
||||||
|
</cproject>
|
||||||
|
|
@ -0,0 +1,121 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>FreeRTOSDemo</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
|
||||||
|
<triggers>clean,full,incremental,</triggers>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
|
||||||
|
<triggers>full,incremental,</triggers>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.cdt.core.cnature</nature>
|
||||||
|
<nature>com.nxp.mcuxpresso.core.datamodels.sdkNature</nature>
|
||||||
|
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
|
||||||
|
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
||||||
|
<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
|
||||||
|
</natures>
|
||||||
|
<linkedResources>
|
||||||
|
<link>
|
||||||
|
<name>Application</name>
|
||||||
|
<type>2</type>
|
||||||
|
<locationURI>DEMO_ROOT/Application</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>Config</name>
|
||||||
|
<type>2</type>
|
||||||
|
<locationURI>DEMO_ROOT/Config</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>FreeRTOS</name>
|
||||||
|
<type>2</type>
|
||||||
|
<locationURI>FREERTOS_ROOT/Source</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>NXP_Code</name>
|
||||||
|
<type>2</type>
|
||||||
|
<locationURI>DEMO_ROOT/NXP_Code</locationURI>
|
||||||
|
</link>
|
||||||
|
</linkedResources>
|
||||||
|
<filteredResources>
|
||||||
|
<filter>
|
||||||
|
<id>1631686154794</id>
|
||||||
|
<name>FreeRTOS</name>
|
||||||
|
<type>5</type>
|
||||||
|
<matcher>
|
||||||
|
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||||
|
<arguments>1.0-name-matches-false-false-*.c</arguments>
|
||||||
|
</matcher>
|
||||||
|
</filter>
|
||||||
|
<filter>
|
||||||
|
<id>1631688399693</id>
|
||||||
|
<name>FreeRTOS/portable</name>
|
||||||
|
<type>9</type>
|
||||||
|
<matcher>
|
||||||
|
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||||
|
<arguments>1.0-name-matches-false-false-GCC</arguments>
|
||||||
|
</matcher>
|
||||||
|
</filter>
|
||||||
|
<filter>
|
||||||
|
<id>1631688399727</id>
|
||||||
|
<name>FreeRTOS/portable</name>
|
||||||
|
<type>9</type>
|
||||||
|
<matcher>
|
||||||
|
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||||
|
<arguments>1.0-name-matches-false-false-MemMang</arguments>
|
||||||
|
</matcher>
|
||||||
|
</filter>
|
||||||
|
<filter>
|
||||||
|
<id>1631688399738</id>
|
||||||
|
<name>FreeRTOS/portable</name>
|
||||||
|
<type>9</type>
|
||||||
|
<matcher>
|
||||||
|
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||||
|
<arguments>1.0-name-matches-false-false-Common</arguments>
|
||||||
|
</matcher>
|
||||||
|
</filter>
|
||||||
|
<filter>
|
||||||
|
<id>1631686224516</id>
|
||||||
|
<name>FreeRTOS/portable/GCC</name>
|
||||||
|
<type>9</type>
|
||||||
|
<matcher>
|
||||||
|
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||||
|
<arguments>1.0-name-matches-false-false-ARM_CM33_NTZ</arguments>
|
||||||
|
</matcher>
|
||||||
|
</filter>
|
||||||
|
<filter>
|
||||||
|
<id>1631686202754</id>
|
||||||
|
<name>FreeRTOS/portable/MemMang</name>
|
||||||
|
<type>5</type>
|
||||||
|
<matcher>
|
||||||
|
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||||
|
<arguments>1.0-name-matches-false-false-heap_4.c</arguments>
|
||||||
|
</matcher>
|
||||||
|
</filter>
|
||||||
|
</filteredResources>
|
||||||
|
<variableList>
|
||||||
|
<variable>
|
||||||
|
<name>DEMO_ROOT</name>
|
||||||
|
<value>$%7BPARENT-2-PROJECT_LOC%7D</value>
|
||||||
|
</variable>
|
||||||
|
<variable>
|
||||||
|
<name>FREERTOS_ROOT</name>
|
||||||
|
<value>$%7BPARENT-4-PROJECT_LOC%7D</value>
|
||||||
|
</variable>
|
||||||
|
</variableList>
|
||||||
|
</projectDescription>
|
||||||
|
|
@ -0,0 +1,407 @@
|
||||||
|
GROUP (
|
||||||
|
"libcr_nohost_nf.a"
|
||||||
|
"libcr_c.a"
|
||||||
|
"libcr_eabihelpers.a"
|
||||||
|
"libgcc.a"
|
||||||
|
)
|
||||||
|
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
/* Define each memory region. */
|
||||||
|
PROGRAM_FLASH (rx) : ORIGIN = 0x0, LENGTH = 0x98000 /* 608K bytes. */
|
||||||
|
SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x40000 /* 256K bytes. */
|
||||||
|
SRAMX (rwx) : ORIGIN = 0x4000000, LENGTH = 0x8000 /* 32K bytes. */
|
||||||
|
USB_RAM (rwx) : ORIGIN = 0x40100000, LENGTH = 0x4000 /* 16K bytes. */
|
||||||
|
SRAM4 (rwx) : ORIGIN = 0x20040000, LENGTH = 0x4000 /* 16K bytes. */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Define a symbol for the top of each memory region. */
|
||||||
|
__base_PROGRAM_FLASH = 0x0 ; /* PROGRAM_FLASH. */
|
||||||
|
__base_Flash = 0x0 ; /* Flash. */
|
||||||
|
__top_PROGRAM_FLASH = 0x0 + 0x98000 ; /* 608K bytes. */
|
||||||
|
__top_Flash = 0x0 + 0x98000 ; /* 608K bytes. */
|
||||||
|
|
||||||
|
__base_SRAM = 0x20000000 ; /* SRAM. */
|
||||||
|
__base_RAM = 0x20000000 ; /* RAM. */
|
||||||
|
__top_SRAM = 0x20000000 + 0x40000 ; /* 256K bytes. */
|
||||||
|
__top_RAM = 0x20000000 + 0x40000 ; /* 256K bytes. */
|
||||||
|
|
||||||
|
__base_SRAMX = 0x4000000 ; /* SRAMX. */
|
||||||
|
__base_RAM2 = 0x4000000 ; /* RAM2. */
|
||||||
|
__top_SRAMX = 0x4000000 + 0x8000 ; /* 32K bytes. */
|
||||||
|
__top_RAM2 = 0x4000000 + 0x8000 ; /* 32K bytes. */
|
||||||
|
|
||||||
|
__base_USB_RAM = 0x40100000 ; /* USB_RAM. */
|
||||||
|
__base_RAM3 = 0x40100000 ; /* RAM3. */
|
||||||
|
__top_USB_RAM = 0x40100000 + 0x4000 ; /* 16K bytes. */
|
||||||
|
__top_RAM3 = 0x40100000 + 0x4000 ; /* 16K bytes. */
|
||||||
|
|
||||||
|
__base_SRAM4 = 0x20040000 ; /* SRAM4. */
|
||||||
|
__base_RAM4 = 0x20040000 ; /* RAM4. */
|
||||||
|
__top_SRAM4 = 0x20040000 + 0x4000 ; /* 16K bytes. */
|
||||||
|
__top_RAM4 = 0x20040000 + 0x4000 ; /* 16K bytes. */
|
||||||
|
|
||||||
|
/* Entry point. */
|
||||||
|
ENTRY(ResetISR)
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
/* Vector Table Section. */
|
||||||
|
.text : ALIGN(4)
|
||||||
|
{
|
||||||
|
FILL(0xff)
|
||||||
|
__vectors_start__ = ABSOLUTE(.) ;
|
||||||
|
KEEP(*(.isr_vector))
|
||||||
|
|
||||||
|
/* Global Section Table. */
|
||||||
|
. = ALIGN(4) ;
|
||||||
|
__section_table_start = .;
|
||||||
|
|
||||||
|
__data_section_table = .;
|
||||||
|
LONG(LOADADDR(.data));
|
||||||
|
LONG( ADDR(.data));
|
||||||
|
LONG( SIZEOF(.data));
|
||||||
|
LONG(LOADADDR(.data_RAM2));
|
||||||
|
|
||||||
|
LONG( ADDR(.data_RAM2));
|
||||||
|
LONG( SIZEOF(.data_RAM2));
|
||||||
|
LONG(LOADADDR(.data_RAM3));
|
||||||
|
LONG( ADDR(.data_RAM3));
|
||||||
|
|
||||||
|
LONG( SIZEOF(.data_RAM3));
|
||||||
|
LONG(LOADADDR(.data_RAM4));
|
||||||
|
LONG( ADDR(.data_RAM4));
|
||||||
|
LONG( SIZEOF(.data_RAM4));
|
||||||
|
__data_section_table_end = .;
|
||||||
|
|
||||||
|
__bss_section_table = .;
|
||||||
|
LONG( ADDR(.bss));
|
||||||
|
LONG( SIZEOF(.bss));
|
||||||
|
|
||||||
|
LONG( ADDR(.bss_RAM2));
|
||||||
|
LONG( SIZEOF(.bss_RAM2));
|
||||||
|
|
||||||
|
LONG( ADDR(.bss_RAM3));
|
||||||
|
LONG( SIZEOF(.bss_RAM3));
|
||||||
|
|
||||||
|
LONG( ADDR(.bss_RAM4));
|
||||||
|
LONG( SIZEOF(.bss_RAM4));
|
||||||
|
__bss_section_table_end = .;
|
||||||
|
|
||||||
|
__section_table_end = . ;
|
||||||
|
/* End of Global Section Table. */
|
||||||
|
|
||||||
|
*(.after_vectors*)
|
||||||
|
} > PROGRAM_FLASH
|
||||||
|
|
||||||
|
/* Privileged functions - Section needs to be 32 byte aligned to satisfy MPU requirements. */
|
||||||
|
.privileged_functions : ALIGN(32)
|
||||||
|
{
|
||||||
|
. = ALIGN(32);
|
||||||
|
__privileged_functions_start__ = .;
|
||||||
|
*(privileged_functions)
|
||||||
|
. = ALIGN(32);
|
||||||
|
/* End address must be the last address in the region, therefore, -1. */
|
||||||
|
__privileged_functions_end__ = . - 1;
|
||||||
|
} > PROGRAM_FLASH
|
||||||
|
|
||||||
|
/* FreeRTOS System calls - Section needs to be 32 byte aligned to satisfy MPU requirements. */
|
||||||
|
.freertos_system_calls : ALIGN(32)
|
||||||
|
{
|
||||||
|
. = ALIGN(32);
|
||||||
|
__syscalls_flash_start__ = .;
|
||||||
|
*(freertos_system_calls)
|
||||||
|
. = ALIGN(32);
|
||||||
|
/* End address must be the last address in the region, therefore, -1. */
|
||||||
|
__syscalls_flash_end__ = . - 1;
|
||||||
|
} > PROGRAM_FLASH
|
||||||
|
|
||||||
|
/* Main Text Section - Section needs to be 32 byte aligned to satisfy MPU requirements. */
|
||||||
|
.text : ALIGN(32)
|
||||||
|
{
|
||||||
|
. = ALIGN(32);
|
||||||
|
__unprivileged_flash_start__ = .;
|
||||||
|
*(.text*)
|
||||||
|
KEEP(*freertos*/tasks.o(.rodata*)) /* FreeRTOS Debug Config */
|
||||||
|
*(.rodata .rodata.* .constdata .constdata.*)
|
||||||
|
. = ALIGN(32);
|
||||||
|
/* End address must be the last address in the region, therefore, -1. */
|
||||||
|
__unprivileged_flash_end__ = . - 1;
|
||||||
|
} > PROGRAM_FLASH
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For exception handling/unwind - some Newlib functions (in common
|
||||||
|
* with C++ and STDC++) use this.
|
||||||
|
*/
|
||||||
|
.ARM.extab : ALIGN(4)
|
||||||
|
{
|
||||||
|
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
||||||
|
} > PROGRAM_FLASH
|
||||||
|
|
||||||
|
.ARM.exidx : ALIGN(4)
|
||||||
|
{
|
||||||
|
__exidx_start = .;
|
||||||
|
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
||||||
|
__exidx_end = .;
|
||||||
|
} > PROGRAM_FLASH
|
||||||
|
|
||||||
|
_etext = .;
|
||||||
|
|
||||||
|
/* USB_RAM. */
|
||||||
|
.m_usb_data (NOLOAD) :
|
||||||
|
{
|
||||||
|
*(m_usb_global)
|
||||||
|
} > USB_RAM AT> USB_RAM
|
||||||
|
|
||||||
|
/* DATA section for SRAMX. */
|
||||||
|
.data_RAM2 : ALIGN(4)
|
||||||
|
{
|
||||||
|
FILL(0xff)
|
||||||
|
PROVIDE(__start_data_RAM2 = .) ;
|
||||||
|
PROVIDE(__start_data_SRAMX = .) ;
|
||||||
|
*(.ramfunc.$RAM2)
|
||||||
|
*(.ramfunc.$SRAMX)
|
||||||
|
*(.data.$RAM2)
|
||||||
|
*(.data.$SRAMX)
|
||||||
|
*(.data.$RAM2.*)
|
||||||
|
*(.data.$SRAMX.*)
|
||||||
|
. = ALIGN(4) ;
|
||||||
|
PROVIDE(__end_data_RAM2 = .) ;
|
||||||
|
PROVIDE(__end_data_SRAMX = .) ;
|
||||||
|
} > SRAMX AT>PROGRAM_FLASH
|
||||||
|
|
||||||
|
/* DATA section for USB_RAM. */
|
||||||
|
.data_RAM3 : ALIGN(4)
|
||||||
|
{
|
||||||
|
FILL(0xff)
|
||||||
|
PROVIDE(__start_data_RAM3 = .) ;
|
||||||
|
PROVIDE(__start_data_USB_RAM = .) ;
|
||||||
|
*(.ramfunc.$RAM3)
|
||||||
|
*(.ramfunc.$USB_RAM)
|
||||||
|
*(.data.$RAM3)
|
||||||
|
*(.data.$USB_RAM)
|
||||||
|
*(.data.$RAM3.*)
|
||||||
|
*(.data.$USB_RAM.*)
|
||||||
|
. = ALIGN(4) ;
|
||||||
|
PROVIDE(__end_data_RAM3 = .) ;
|
||||||
|
PROVIDE(__end_data_USB_RAM = .) ;
|
||||||
|
} > USB_RAM AT>PROGRAM_FLASH
|
||||||
|
|
||||||
|
/* DATA section for SRAM4. */
|
||||||
|
.data_RAM4 : ALIGN(4)
|
||||||
|
{
|
||||||
|
FILL(0xff)
|
||||||
|
PROVIDE(__start_data_RAM4 = .) ;
|
||||||
|
PROVIDE(__start_data_SRAM4 = .) ;
|
||||||
|
*(.ramfunc.$RAM4)
|
||||||
|
*(.ramfunc.$SRAM4)
|
||||||
|
*(.data.$RAM4)
|
||||||
|
*(.data.$SRAM4)
|
||||||
|
*(.data.$RAM4.*)
|
||||||
|
*(.data.$SRAM4.*)
|
||||||
|
. = ALIGN(4) ;
|
||||||
|
PROVIDE(__end_data_RAM4 = .) ;
|
||||||
|
PROVIDE(__end_data_SRAM4 = .) ;
|
||||||
|
} > SRAM4 AT>PROGRAM_FLASH
|
||||||
|
|
||||||
|
/* Uninit Reserved Section. */
|
||||||
|
.uninit_RESERVED (NOLOAD) : ALIGN(4)
|
||||||
|
{
|
||||||
|
_start_uninit_RESERVED = .;
|
||||||
|
KEEP(*(.bss.$RESERVED*))
|
||||||
|
. = ALIGN(4) ;
|
||||||
|
_end_uninit_RESERVED = .;
|
||||||
|
} > SRAM AT> SRAM
|
||||||
|
|
||||||
|
/* Main Data section (SRAM). */
|
||||||
|
.data : ALIGN(4)
|
||||||
|
{
|
||||||
|
FILL(0xff)
|
||||||
|
_data = . ;
|
||||||
|
PROVIDE(__start_data_RAM = .) ;
|
||||||
|
PROVIDE(__start_data_SRAM = .) ;
|
||||||
|
|
||||||
|
/* Privileged data - It needs to be 32 byte aligned to satisfy MPU requirements. */
|
||||||
|
. = ALIGN(32);
|
||||||
|
__privileged_sram_start__ = .;
|
||||||
|
*(privileged_data)
|
||||||
|
. = ALIGN(32);
|
||||||
|
/* End address must be the last address in the region, therefore, -1. */
|
||||||
|
__privileged_sram_end__ = . - 1;
|
||||||
|
|
||||||
|
/* Shared data between UserIrqHandler and application tasks. */
|
||||||
|
/* It needs to be 32 byte aligned to satisfy MPU requirements. */
|
||||||
|
__user_irq_shared_memory_start__ = .;
|
||||||
|
*(user_irq_shared_memory)
|
||||||
|
. = ALIGN(32);
|
||||||
|
/* End address must be the last address in the region, therefore, -1. */
|
||||||
|
__user_irq_shared_memory_end__ = . - 1;
|
||||||
|
|
||||||
|
*(vtable)
|
||||||
|
*(.ramfunc*)
|
||||||
|
KEEP(*(CodeQuickAccess))
|
||||||
|
KEEP(*(DataQuickAccess))
|
||||||
|
*(RamFunction)
|
||||||
|
*(.data*)
|
||||||
|
. = ALIGN(4) ;
|
||||||
|
_edata = . ;
|
||||||
|
PROVIDE(__end_data_RAM = .) ;
|
||||||
|
PROVIDE(__end_data_SRAM = .) ;
|
||||||
|
} > SRAM AT>PROGRAM_FLASH
|
||||||
|
|
||||||
|
/* BSS section for SRAMX. */
|
||||||
|
.bss_RAM2 : ALIGN(4)
|
||||||
|
{
|
||||||
|
PROVIDE(__start_bss_RAM2 = .) ;
|
||||||
|
PROVIDE(__start_bss_SRAMX = .) ;
|
||||||
|
*(.bss.$RAM2)
|
||||||
|
*(.bss.$SRAMX)
|
||||||
|
*(.bss.$RAM2.*)
|
||||||
|
*(.bss.$SRAMX.*)
|
||||||
|
. = ALIGN (. != 0 ? 4 : 1) ; /* Avoid empty segment. */
|
||||||
|
PROVIDE(__end_bss_RAM2 = .) ;
|
||||||
|
PROVIDE(__end_bss_SRAMX = .) ;
|
||||||
|
} > SRAMX AT> SRAMX
|
||||||
|
|
||||||
|
/* BSS section for USB_RAM. */
|
||||||
|
.bss_RAM3 : ALIGN(4)
|
||||||
|
{
|
||||||
|
PROVIDE(__start_bss_RAM3 = .) ;
|
||||||
|
PROVIDE(__start_bss_USB_RAM = .) ;
|
||||||
|
*(.bss.$RAM3)
|
||||||
|
*(.bss.$USB_RAM)
|
||||||
|
*(.bss.$RAM3.*)
|
||||||
|
*(.bss.$USB_RAM.*)
|
||||||
|
. = ALIGN (. != 0 ? 4 : 1) ; /* Avoid empty segment. */
|
||||||
|
PROVIDE(__end_bss_RAM3 = .) ;
|
||||||
|
PROVIDE(__end_bss_USB_RAM = .) ;
|
||||||
|
} > USB_RAM AT> USB_RAM
|
||||||
|
|
||||||
|
/* BSS section for SRAM4. */
|
||||||
|
.bss_RAM4 : ALIGN(4)
|
||||||
|
{
|
||||||
|
PROVIDE(__start_bss_RAM4 = .) ;
|
||||||
|
PROVIDE(__start_bss_SRAM4 = .) ;
|
||||||
|
*(.bss.$RAM4)
|
||||||
|
*(.bss.$SRAM4)
|
||||||
|
*(.bss.$RAM4.*)
|
||||||
|
*(.bss.$SRAM4.*)
|
||||||
|
. = ALIGN (. != 0 ? 4 : 1) ; /* Avoid empty segment. */
|
||||||
|
PROVIDE(__end_bss_RAM4 = .) ;
|
||||||
|
PROVIDE(__end_bss_SRAM4 = .) ;
|
||||||
|
} > SRAM4 AT> SRAM4
|
||||||
|
|
||||||
|
/* Main BSS Section. */
|
||||||
|
.bss : ALIGN(4)
|
||||||
|
{
|
||||||
|
_bss = .;
|
||||||
|
PROVIDE(__start_bss_RAM = .) ;
|
||||||
|
PROVIDE(__start_bss_SRAM = .) ;
|
||||||
|
*(.bss*)
|
||||||
|
*(COMMON)
|
||||||
|
. = ALIGN(4) ;
|
||||||
|
_ebss = .;
|
||||||
|
PROVIDE(__end_bss_RAM = .) ;
|
||||||
|
PROVIDE(__end_bss_SRAM = .) ;
|
||||||
|
PROVIDE(end = .);
|
||||||
|
} > SRAM AT> SRAM
|
||||||
|
|
||||||
|
/* NOINIT section for SRAMX. */
|
||||||
|
.noinit_RAM2 (NOLOAD) : ALIGN(4)
|
||||||
|
{
|
||||||
|
PROVIDE(__start_noinit_RAM2 = .) ;
|
||||||
|
PROVIDE(__start_noinit_SRAMX = .) ;
|
||||||
|
*(.noinit.$RAM2)
|
||||||
|
*(.noinit.$SRAMX)
|
||||||
|
*(.noinit.$RAM2.*)
|
||||||
|
*(.noinit.$SRAMX.*)
|
||||||
|
. = ALIGN(4) ;
|
||||||
|
PROVIDE(__end_noinit_RAM2 = .) ;
|
||||||
|
PROVIDE(__end_noinit_SRAMX = .) ;
|
||||||
|
} > SRAMX AT> SRAMX
|
||||||
|
|
||||||
|
/* NOINIT section for USB_RAM. */
|
||||||
|
.noinit_RAM3 (NOLOAD) : ALIGN(4)
|
||||||
|
{
|
||||||
|
PROVIDE(__start_noinit_RAM3 = .) ;
|
||||||
|
PROVIDE(__start_noinit_USB_RAM = .) ;
|
||||||
|
*(.noinit.$RAM3)
|
||||||
|
*(.noinit.$USB_RAM)
|
||||||
|
*(.noinit.$RAM3.*)
|
||||||
|
*(.noinit.$USB_RAM.*)
|
||||||
|
. = ALIGN(4) ;
|
||||||
|
PROVIDE(__end_noinit_RAM3 = .) ;
|
||||||
|
PROVIDE(__end_noinit_USB_RAM = .) ;
|
||||||
|
} > USB_RAM AT> USB_RAM
|
||||||
|
|
||||||
|
/* NOINIT section for SRAM4. */
|
||||||
|
.noinit_RAM4 (NOLOAD) : ALIGN(4)
|
||||||
|
{
|
||||||
|
PROVIDE(__start_noinit_RAM4 = .) ;
|
||||||
|
PROVIDE(__start_noinit_SRAM4 = .) ;
|
||||||
|
*(.noinit.$RAM4)
|
||||||
|
*(.noinit.$SRAM4)
|
||||||
|
*(.noinit.$RAM4.*)
|
||||||
|
*(.noinit.$SRAM4.*)
|
||||||
|
. = ALIGN(4) ;
|
||||||
|
PROVIDE(__end_noinit_RAM4 = .) ;
|
||||||
|
PROVIDE(__end_noinit_SRAM4 = .) ;
|
||||||
|
} > SRAM4 AT> SRAM4
|
||||||
|
|
||||||
|
/* Default NOINIT section. */
|
||||||
|
.noinit (NOLOAD): ALIGN(4)
|
||||||
|
{
|
||||||
|
_noinit = .;
|
||||||
|
PROVIDE(__start_noinit_RAM = .) ;
|
||||||
|
PROVIDE(__start_noinit_SRAM = .) ;
|
||||||
|
*(.noinit*)
|
||||||
|
. = ALIGN(4) ;
|
||||||
|
_end_noinit = .;
|
||||||
|
PROVIDE(__end_noinit_RAM = .) ;
|
||||||
|
PROVIDE(__end_noinit_SRAM = .) ;
|
||||||
|
} > SRAM AT> SRAM
|
||||||
|
|
||||||
|
/* Reserve and place Heap within memory map. */
|
||||||
|
_HeapSize = 0x1000;
|
||||||
|
.heap : ALIGN(4)
|
||||||
|
{
|
||||||
|
_pvHeapStart = .;
|
||||||
|
. += _HeapSize;
|
||||||
|
. = ALIGN(4);
|
||||||
|
_pvHeapLimit = .;
|
||||||
|
} > SRAM
|
||||||
|
|
||||||
|
/* Reserve space in memory for Stack. */
|
||||||
|
_StackSize = 0x1000;
|
||||||
|
.heap2stackfill :
|
||||||
|
{
|
||||||
|
. += _StackSize;
|
||||||
|
} > SRAM
|
||||||
|
|
||||||
|
/* Locate actual Stack in memory map. */
|
||||||
|
.stack ORIGIN(SRAM) + LENGTH(SRAM) - _StackSize - 0: ALIGN(4)
|
||||||
|
{
|
||||||
|
_vStackBase = .;
|
||||||
|
. = ALIGN(4);
|
||||||
|
_vStackTop = . + _StackSize;
|
||||||
|
} > SRAM
|
||||||
|
|
||||||
|
/* Create checksum value (used in startup). */
|
||||||
|
PROVIDE(__valid_user_code_checksum = 0 -
|
||||||
|
(_vStackTop
|
||||||
|
+ (ResetISR + 1)
|
||||||
|
+ (NMI_Handler + 1)
|
||||||
|
+ (HardFault_Handler + 1)
|
||||||
|
+ (( DEFINED(MemManage_Handler) ? MemManage_Handler : 0 ) + 1) /* MemManage_Handler may not be defined. */
|
||||||
|
+ (( DEFINED(BusFault_Handler) ? BusFault_Handler : 0 ) + 1) /* BusFault_Handler may not be defined. */
|
||||||
|
+ (( DEFINED(UsageFault_Handler) ? UsageFault_Handler : 0 ) + 1) /* UsageFault_Handler may not be defined. */
|
||||||
|
) );
|
||||||
|
|
||||||
|
/* Provide basic symbols giving location and size of main text
|
||||||
|
* block, including initial values of RW data sections. Note that
|
||||||
|
* these will need extending to give a complete picture with
|
||||||
|
* complex images (e.g multiple Flash banks). */
|
||||||
|
_image_start = LOADADDR(.text);
|
||||||
|
_image_end = LOADADDR(.data) + SIZEOF(.data);
|
||||||
|
_image_size = _image_end - _image_start;
|
||||||
|
}
|
||||||
|
|
@ -136,6 +136,7 @@ bnumconfigs
|
||||||
bnumdescriptors
|
bnumdescriptors
|
||||||
bnumendpoints
|
bnumendpoints
|
||||||
bo
|
bo
|
||||||
|
bod
|
||||||
bootloader
|
bootloader
|
||||||
bootstrapcdn
|
bootstrapcdn
|
||||||
bp
|
bp
|
||||||
|
|
@ -655,6 +656,7 @@ eusci
|
||||||
eval
|
eval
|
||||||
evb
|
evb
|
||||||
eventcallback
|
eventcallback
|
||||||
|
evk
|
||||||
evnt
|
evnt
|
||||||
evt
|
evt
|
||||||
ewavr
|
ewavr
|
||||||
|
|
@ -906,6 +908,7 @@ initialises
|
||||||
initializerequestheaders
|
initializerequestheaders
|
||||||
initirqlevels
|
initirqlevels
|
||||||
initstructure
|
initstructure
|
||||||
|
inputmux
|
||||||
int
|
int
|
||||||
intc
|
intc
|
||||||
intctl
|
intctl
|
||||||
|
|
@ -1336,6 +1339,7 @@ numberofitems
|
||||||
numofservers
|
numofservers
|
||||||
nvic
|
nvic
|
||||||
nvs
|
nvs
|
||||||
|
nxp
|
||||||
ocd
|
ocd
|
||||||
oe
|
oe
|
||||||
oer
|
oer
|
||||||
|
|
@ -2089,6 +2093,7 @@ retargets
|
||||||
retored
|
retored
|
||||||
retr
|
retr
|
||||||
rfc
|
rfc
|
||||||
|
rgb
|
||||||
rhr
|
rhr
|
||||||
ri
|
ri
|
||||||
richard
|
richard
|
||||||
|
|
@ -2776,6 +2781,7 @@ vapplicationstackoverflowhook
|
||||||
vapplicationtickhook
|
vapplicationtickhook
|
||||||
var
|
var
|
||||||
vbasicwebserver
|
vbasicwebserver
|
||||||
|
vbat
|
||||||
vblink
|
vblink
|
||||||
vbus
|
vbus
|
||||||
vbuttonhandlertask
|
vbuttonhandlertask
|
||||||
|
|
@ -3069,6 +3075,7 @@ xindex
|
||||||
xinterface
|
xinterface
|
||||||
xinterruptcontroller
|
xinterruptcontroller
|
||||||
xiptracevalues
|
xiptracevalues
|
||||||
|
xirqrequest
|
||||||
xisrautoreloadtimer
|
xisrautoreloadtimer
|
||||||
xisroneshottimer
|
xisroneshottimer
|
||||||
xisrstatus
|
xisrstatus
|
||||||
|
|
@ -3082,6 +3089,7 @@ xlastwaketime
|
||||||
xlatcherror
|
xlatcherror
|
||||||
xlcdqueue
|
xlcdqueue
|
||||||
xledparaemtes
|
xledparaemtes
|
||||||
|
xledstate
|
||||||
xledtimer
|
xledtimer
|
||||||
xlen
|
xlen
|
||||||
xlength
|
xlength
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue