mirror of
https://github.com/FreeRTOS/FreeRTOS.git
synced 2025-06-17 21:49:29 +08:00
Qemu mps2 networking (#439)
* Demo: Add Support for netwroking in Qemu for MPS2 AN385 * Add tcp echo client * Add steps to Readme
This commit is contained in:
5
.github/scripts/check-header.py
vendored
5
.github/scripts/check-header.py
vendored
@ -350,12 +350,17 @@ FREERTOS_IGNORED_EXTENSIONS = [
|
|||||||
'.xmsgs',
|
'.xmsgs',
|
||||||
'.xsl',
|
'.xsl',
|
||||||
'.yml',
|
'.yml',
|
||||||
|
'.md',
|
||||||
'.zip'
|
'.zip'
|
||||||
]
|
]
|
||||||
|
|
||||||
FREERTOS_IGNORED_PATTERNS = [
|
FREERTOS_IGNORED_PATTERNS = [
|
||||||
r'.*\.git.*',
|
r'.*\.git.*',
|
||||||
r'.*mbedtls_config\.h.*',
|
r'.*mbedtls_config\.h.*',
|
||||||
|
r'.*mbedtls_config\.h.*',
|
||||||
|
r'.*CMSIS.*',
|
||||||
|
r'.*/makefile',
|
||||||
|
r'.*/Makefile',
|
||||||
]
|
]
|
||||||
|
|
||||||
FREERTOS_HEADER = [
|
FREERTOS_HEADER = [
|
||||||
|
Submodule FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP updated: 645673bff9...5aebf6af71
Submodule FreeRTOS-Plus/Source/corePKCS11 updated: 3a65d76a06...40bef76639
723
FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC/CMSIS/CMSDK_CM3.h
Normal file
723
FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC/CMSIS/CMSDK_CM3.h
Normal file
@ -0,0 +1,723 @@
|
|||||||
|
/* MPS2 CMSIS Library
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006-2016 ARM Limited
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software without
|
||||||
|
* specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*******************************************************************************
|
||||||
|
* @file CMSDK_CM3.h
|
||||||
|
* @brief CMSIS Core Peripheral Access Layer Header File for
|
||||||
|
* CMSDK_CM3 Device
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef CMSDK_CM3_H
|
||||||
|
#define CMSDK_CM3_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ------------------------- Interrupt Number Definition ------------------------ */
|
||||||
|
|
||||||
|
typedef enum IRQn
|
||||||
|
{
|
||||||
|
/* ------------------- Cortex-M3 Processor Exceptions Numbers ------------------- */
|
||||||
|
NonMaskableInt_IRQn = -14, /* 2 Non Maskable Interrupt */
|
||||||
|
HardFault_IRQn = -13, /* 3 HardFault Interrupt */
|
||||||
|
MemoryManagement_IRQn = -12, /* 4 Memory Management Interrupt */
|
||||||
|
BusFault_IRQn = -11, /* 5 Bus Fault Interrupt */
|
||||||
|
UsageFault_IRQn = -10, /* 6 Usage Fault Interrupt */
|
||||||
|
SVCall_IRQn = -5, /* 11 SV Call Interrupt */
|
||||||
|
DebugMonitor_IRQn = -4, /* 12 Debug Monitor Interrupt */
|
||||||
|
PendSV_IRQn = -2, /* 14 Pend SV Interrupt */
|
||||||
|
SysTick_IRQn = -1, /* 15 System Tick Interrupt */
|
||||||
|
|
||||||
|
/****** CMSDK Specific Interrupt Numbers *********************************************************/
|
||||||
|
UARTRX0_IRQn = 0, /*!< UART 0 RX Interrupt */
|
||||||
|
UARTTX0_IRQn = 1, /*!< UART 0 TX Interrupt */
|
||||||
|
UARTRX1_IRQn = 2, /*!< UART 1 RX Interrupt */
|
||||||
|
UARTTX1_IRQn = 3, /*!< UART 1 TX Interrupt */
|
||||||
|
UARTRX2_IRQn = 4, /*!< UART 2 RX Interrupt */
|
||||||
|
UARTTX2_IRQn = 5, /*!< UART 2 TX Interrupt */
|
||||||
|
PORT0_ALL_IRQn = 6, /*!< Port 0 combined Interrupt */
|
||||||
|
PORT1_ALL_IRQn = 7, /*!< Port 1 combined Interrupt */
|
||||||
|
TIMER0_IRQn = 8, /*!< TIMER 0 Interrupt */
|
||||||
|
TIMER1_IRQn = 9, /*!< TIMER 1 Interrupt */
|
||||||
|
DUALTIMER_IRQn = 10, /*!< Dual Timer Interrupt */
|
||||||
|
SPI_IRQn = 11, /*!< SPI Interrupt */
|
||||||
|
UARTOVF_IRQn = 12, /*!< UART 0,1,2 Overflow Interrupt */
|
||||||
|
ETHERNET_IRQn = 13, /*!< Ethernet Interrupt */
|
||||||
|
I2S_IRQn = 14, /*!< I2S Interrupt */
|
||||||
|
TSC_IRQn = 15, /*!< Touch Screen Interrupt */
|
||||||
|
PORT2_ALL_IRQn = 16, /*!< Port 2 combined Interrupt */
|
||||||
|
PORT3_ALL_IRQn = 17, /*!< Port 3 combined Interrupt */
|
||||||
|
UARTRX3_IRQn = 18, /*!< UART 3 RX Interrupt */
|
||||||
|
UARTTX3_IRQn = 19, /*!< UART 3 TX Interrupt */
|
||||||
|
UARTRX4_IRQn = 20, /*!< UART 4 RX Interrupt */
|
||||||
|
UARTTX4_IRQn = 21, /*!< UART 4 TX Interrupt */
|
||||||
|
ADCSPI_IRQn = 22, /*!< SHIELD ADC SPI Interrupt */
|
||||||
|
SHIELDSPI_IRQn = 23, /*!< SHIELD SPI Combined Interrupt */
|
||||||
|
PORT0_0_IRQn = 24, /*!< GPIO Port 0 pin 0 Interrupt */
|
||||||
|
PORT0_1_IRQn = 25, /*!< GPIO Port 0 pin 1 Interrupt */
|
||||||
|
PORT0_2_IRQn = 26, /*!< GPIO Port 0 pin 2 Interrupt */
|
||||||
|
PORT0_3_IRQn = 27, /*!< GPIO Port 0 pin 3 Interrupt */
|
||||||
|
PORT0_4_IRQn = 28, /*!< GPIO Port 0 pin 4 Interrupt */
|
||||||
|
PORT0_5_IRQn = 29, /*!< GPIO Port 0 pin 5 Interrupt */
|
||||||
|
PORT0_6_IRQn = 30, /*!< GPIO Port 0 pin 6 Interrupt */
|
||||||
|
PORT0_7_IRQn = 31, /*!< GPIO Port 0 pin 7 Interrupt */
|
||||||
|
} IRQn_Type;
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================================ */
|
||||||
|
/* ================ Processor and Core Peripheral Section ================ */
|
||||||
|
/* ================================================================================ */
|
||||||
|
|
||||||
|
/* -------- Configuration of the Cortex-M3 Processor and Core Peripherals ------- */
|
||||||
|
#define __CM3_REV 0x0201 /* Core revision r2p1 */
|
||||||
|
#define __MPU_PRESENT 1 /* MPU present or not */
|
||||||
|
#define __NVIC_PRIO_BITS 3 /* Number of Bits used for Priority Levels */
|
||||||
|
#define __Vendor_SysTickConfig 0 /* Set to 1 if different SysTick Config is used */
|
||||||
|
|
||||||
|
#include <core_cm3.h> /* Processor and core peripherals */
|
||||||
|
|
||||||
|
/* ================================================================================ */
|
||||||
|
/* ================ Device Specific Peripheral Section ================ */
|
||||||
|
/* ================================================================================ */
|
||||||
|
|
||||||
|
/* ------------------- Start of section using anonymous unions ------------------ */
|
||||||
|
#if defined ( __CC_ARM )
|
||||||
|
#pragma push
|
||||||
|
#pragma anon_unions
|
||||||
|
#elif defined(__ICCARM__)
|
||||||
|
#pragma language=extended
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
/* anonymous unions are enabled by default */
|
||||||
|
#elif defined(__TMS470__)
|
||||||
|
/* anonymous unions are enabled by default */
|
||||||
|
#elif defined(__TASKING__)
|
||||||
|
#pragma warning 586
|
||||||
|
#else
|
||||||
|
#warning Not supported compiler type
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*------------- Universal Asynchronous Receiver Transmitter (UART) -----------*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__IO uint32_t DATA; /* Offset: 0x000 (R/W) Data Register */
|
||||||
|
__IO uint32_t STATE; /* Offset: 0x004 (R/W) Status Register */
|
||||||
|
__IO uint32_t CTRL; /* Offset: 0x008 (R/W) Control Register */
|
||||||
|
union {
|
||||||
|
__I uint32_t INTSTATUS; /* Offset: 0x00C (R/ ) Interrupt Status Register */
|
||||||
|
__O uint32_t INTCLEAR; /* Offset: 0x00C ( /W) Interrupt Clear Register */
|
||||||
|
};
|
||||||
|
__IO uint32_t BAUDDIV; /* Offset: 0x010 (R/W) Baudrate Divider Register */
|
||||||
|
|
||||||
|
} CMSDK_UART_TypeDef;
|
||||||
|
|
||||||
|
/* CMSDK_UART DATA Register Definitions */
|
||||||
|
|
||||||
|
#define CMSDK_UART_DATA_Pos 0 /* CMSDK_UART_DATA_Pos: DATA Position */
|
||||||
|
#define CMSDK_UART_DATA_Msk (0xFFul << CMSDK_UART_DATA_Pos) /* CMSDK_UART DATA: DATA Mask */
|
||||||
|
|
||||||
|
#define CMSDK_UART_STATE_RXOR_Pos 3 /* CMSDK_UART STATE: RXOR Position */
|
||||||
|
#define CMSDK_UART_STATE_RXOR_Msk (0x1ul << CMSDK_UART_STATE_RXOR_Pos) /* CMSDK_UART STATE: RXOR Mask */
|
||||||
|
|
||||||
|
#define CMSDK_UART_STATE_TXOR_Pos 2 /* CMSDK_UART STATE: TXOR Position */
|
||||||
|
#define CMSDK_UART_STATE_TXOR_Msk (0x1ul << CMSDK_UART_STATE_TXOR_Pos) /* CMSDK_UART STATE: TXOR Mask */
|
||||||
|
|
||||||
|
#define CMSDK_UART_STATE_RXBF_Pos 1 /* CMSDK_UART STATE: RXBF Position */
|
||||||
|
#define CMSDK_UART_STATE_RXBF_Msk (0x1ul << CMSDK_UART_STATE_RXBF_Pos) /* CMSDK_UART STATE: RXBF Mask */
|
||||||
|
|
||||||
|
#define CMSDK_UART_STATE_TXBF_Pos 0 /* CMSDK_UART STATE: TXBF Position */
|
||||||
|
#define CMSDK_UART_STATE_TXBF_Msk (0x1ul << CMSDK_UART_STATE_TXBF_Pos ) /* CMSDK_UART STATE: TXBF Mask */
|
||||||
|
|
||||||
|
#define CMSDK_UART_CTRL_HSTM_Pos 6 /* CMSDK_UART CTRL: HSTM Position */
|
||||||
|
#define CMSDK_UART_CTRL_HSTM_Msk (0x01ul << CMSDK_UART_CTRL_HSTM_Pos) /* CMSDK_UART CTRL: HSTM Mask */
|
||||||
|
|
||||||
|
#define CMSDK_UART_CTRL_RXORIRQEN_Pos 5 /* CMSDK_UART CTRL: RXORIRQEN Position */
|
||||||
|
#define CMSDK_UART_CTRL_RXORIRQEN_Msk (0x01ul << CMSDK_UART_CTRL_RXORIRQEN_Pos) /* CMSDK_UART CTRL: RXORIRQEN Mask */
|
||||||
|
|
||||||
|
#define CMSDK_UART_CTRL_TXORIRQEN_Pos 4 /* CMSDK_UART CTRL: TXORIRQEN Position */
|
||||||
|
#define CMSDK_UART_CTRL_TXORIRQEN_Msk (0x01ul << CMSDK_UART_CTRL_TXORIRQEN_Pos) /* CMSDK_UART CTRL: TXORIRQEN Mask */
|
||||||
|
|
||||||
|
#define CMSDK_UART_CTRL_RXIRQEN_Pos 3 /* CMSDK_UART CTRL: RXIRQEN Position */
|
||||||
|
#define CMSDK_UART_CTRL_RXIRQEN_Msk (0x01ul << CMSDK_UART_CTRL_RXIRQEN_Pos) /* CMSDK_UART CTRL: RXIRQEN Mask */
|
||||||
|
|
||||||
|
#define CMSDK_UART_CTRL_TXIRQEN_Pos 2 /* CMSDK_UART CTRL: TXIRQEN Position */
|
||||||
|
#define CMSDK_UART_CTRL_TXIRQEN_Msk (0x01ul << CMSDK_UART_CTRL_TXIRQEN_Pos) /* CMSDK_UART CTRL: TXIRQEN Mask */
|
||||||
|
|
||||||
|
#define CMSDK_UART_CTRL_RXEN_Pos 1 /* CMSDK_UART CTRL: RXEN Position */
|
||||||
|
#define CMSDK_UART_CTRL_RXEN_Msk (0x01ul << CMSDK_UART_CTRL_RXEN_Pos) /* CMSDK_UART CTRL: RXEN Mask */
|
||||||
|
|
||||||
|
#define CMSDK_UART_CTRL_TXEN_Pos 0 /* CMSDK_UART CTRL: TXEN Position */
|
||||||
|
#define CMSDK_UART_CTRL_TXEN_Msk (0x01ul << CMSDK_UART_CTRL_TXEN_Pos) /* CMSDK_UART CTRL: TXEN Mask */
|
||||||
|
|
||||||
|
#define CMSDK_UART_INTSTATUS_RXORIRQ_Pos 3 /* CMSDK_UART CTRL: RXORIRQ Position */
|
||||||
|
#define CMSDK_UART_CTRL_RXORIRQ_Msk (0x01ul << CMSDK_UART_INTSTATUS_RXORIRQ_Pos) /* CMSDK_UART CTRL: RXORIRQ Mask */
|
||||||
|
|
||||||
|
#define CMSDK_UART_CTRL_TXORIRQ_Pos 2 /* CMSDK_UART CTRL: TXORIRQ Position */
|
||||||
|
#define CMSDK_UART_CTRL_TXORIRQ_Msk (0x01ul << CMSDK_UART_CTRL_TXORIRQ_Pos) /* CMSDK_UART CTRL: TXORIRQ Mask */
|
||||||
|
|
||||||
|
#define CMSDK_UART_CTRL_RXIRQ_Pos 1 /* CMSDK_UART CTRL: RXIRQ Position */
|
||||||
|
#define CMSDK_UART_CTRL_RXIRQ_Msk (0x01ul << CMSDK_UART_CTRL_RXIRQ_Pos) /* CMSDK_UART CTRL: RXIRQ Mask */
|
||||||
|
|
||||||
|
#define CMSDK_UART_CTRL_TXIRQ_Pos 0 /* CMSDK_UART CTRL: TXIRQ Position */
|
||||||
|
#define CMSDK_UART_CTRL_TXIRQ_Msk (0x01ul << CMSDK_UART_CTRL_TXIRQ_Pos) /* CMSDK_UART CTRL: TXIRQ Mask */
|
||||||
|
|
||||||
|
#define CMSDK_UART_BAUDDIV_Pos 0 /* CMSDK_UART BAUDDIV: BAUDDIV Position */
|
||||||
|
#define CMSDK_UART_BAUDDIV_Msk (0xFFFFFul << CMSDK_UART_BAUDDIV_Pos) /* CMSDK_UART BAUDDIV: BAUDDIV Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/*----------------------------- Timer (TIMER) -------------------------------*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__IO uint32_t CTRL; /* Offset: 0x000 (R/W) Control Register */
|
||||||
|
__IO uint32_t VALUE; /* Offset: 0x004 (R/W) Current Value Register */
|
||||||
|
__IO uint32_t RELOAD; /* Offset: 0x008 (R/W) Reload Value Register */
|
||||||
|
union {
|
||||||
|
__I uint32_t INTSTATUS; /* Offset: 0x00C (R/ ) Interrupt Status Register */
|
||||||
|
__O uint32_t INTCLEAR; /* Offset: 0x00C ( /W) Interrupt Clear Register */
|
||||||
|
};
|
||||||
|
|
||||||
|
} CMSDK_TIMER_TypeDef;
|
||||||
|
|
||||||
|
/* CMSDK_TIMER CTRL Register Definitions */
|
||||||
|
|
||||||
|
#define CMSDK_TIMER_CTRL_IRQEN_Pos 3 /* CMSDK_TIMER CTRL: IRQEN Position */
|
||||||
|
#define CMSDK_TIMER_CTRL_IRQEN_Msk (0x01ul << CMSDK_TIMER_CTRL_IRQEN_Pos) /* CMSDK_TIMER CTRL: IRQEN Mask */
|
||||||
|
|
||||||
|
#define CMSDK_TIMER_CTRL_SELEXTCLK_Pos 2 /* CMSDK_TIMER CTRL: SELEXTCLK Position */
|
||||||
|
#define CMSDK_TIMER_CTRL_SELEXTCLK_Msk (0x01ul << CMSDK_TIMER_CTRL_SELEXTCLK_Pos) /* CMSDK_TIMER CTRL: SELEXTCLK Mask */
|
||||||
|
|
||||||
|
#define CMSDK_TIMER_CTRL_SELEXTEN_Pos 1 /* CMSDK_TIMER CTRL: SELEXTEN Position */
|
||||||
|
#define CMSDK_TIMER_CTRL_SELEXTEN_Msk (0x01ul << CMSDK_TIMER_CTRL_SELEXTEN_Pos) /* CMSDK_TIMER CTRL: SELEXTEN Mask */
|
||||||
|
|
||||||
|
#define CMSDK_TIMER_CTRL_EN_Pos 0 /* CMSDK_TIMER CTRL: EN Position */
|
||||||
|
#define CMSDK_TIMER_CTRL_EN_Msk (0x01ul << CMSDK_TIMER_CTRL_EN_Pos) /* CMSDK_TIMER CTRL: EN Mask */
|
||||||
|
|
||||||
|
#define CMSDK_TIMER_VAL_CURRENT_Pos 0 /* CMSDK_TIMER VALUE: CURRENT Position */
|
||||||
|
#define CMSDK_TIMER_VAL_CURRENT_Msk (0xFFFFFFFFul << CMSDK_TIMER_VAL_CURRENT_Pos) /* CMSDK_TIMER VALUE: CURRENT Mask */
|
||||||
|
|
||||||
|
#define CMSDK_TIMER_RELOAD_VAL_Pos 0 /* CMSDK_TIMER RELOAD: RELOAD Position */
|
||||||
|
#define CMSDK_TIMER_RELOAD_VAL_Msk (0xFFFFFFFFul << CMSDK_TIMER_RELOAD_VAL_Pos) /* CMSDK_TIMER RELOAD: RELOAD Mask */
|
||||||
|
|
||||||
|
#define CMSDK_TIMER_INTSTATUS_Pos 0 /* CMSDK_TIMER INTSTATUS: INTSTATUSPosition */
|
||||||
|
#define CMSDK_TIMER_INTSTATUS_Msk (0x01ul << CMSDK_TIMER_INTSTATUS_Pos) /* CMSDK_TIMER INTSTATUS: INTSTATUSMask */
|
||||||
|
|
||||||
|
#define CMSDK_TIMER_INTCLEAR_Pos 0 /* CMSDK_TIMER INTCLEAR: INTCLEAR Position */
|
||||||
|
#define CMSDK_TIMER_INTCLEAR_Msk (0x01ul << CMSDK_TIMER_INTCLEAR_Pos) /* CMSDK_TIMER INTCLEAR: INTCLEAR Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------- Timer (TIM) --------------------------------------------------*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__IO uint32_t Timer1Load; /* Offset: 0x000 (R/W) Timer 1 Load */
|
||||||
|
__I uint32_t Timer1Value; /* Offset: 0x004 (R/ ) Timer 1 Counter Current Value */
|
||||||
|
__IO uint32_t Timer1Control; /* Offset: 0x008 (R/W) Timer 1 Control */
|
||||||
|
__O uint32_t Timer1IntClr; /* Offset: 0x00C ( /W) Timer 1 Interrupt Clear */
|
||||||
|
__I uint32_t Timer1RIS; /* Offset: 0x010 (R/ ) Timer 1 Raw Interrupt Status */
|
||||||
|
__I uint32_t Timer1MIS; /* Offset: 0x014 (R/ ) Timer 1 Masked Interrupt Status */
|
||||||
|
__IO uint32_t Timer1BGLoad; /* Offset: 0x018 (R/W) Background Load Register */
|
||||||
|
uint32_t RESERVED0;
|
||||||
|
__IO uint32_t Timer2Load; /* Offset: 0x020 (R/W) Timer 2 Load */
|
||||||
|
__I uint32_t Timer2Value; /* Offset: 0x024 (R/ ) Timer 2 Counter Current Value */
|
||||||
|
__IO uint32_t Timer2Control; /* Offset: 0x028 (R/W) Timer 2 Control */
|
||||||
|
__O uint32_t Timer2IntClr; /* Offset: 0x02C ( /W) Timer 2 Interrupt Clear */
|
||||||
|
__I uint32_t Timer2RIS; /* Offset: 0x030 (R/ ) Timer 2 Raw Interrupt Status */
|
||||||
|
__I uint32_t Timer2MIS; /* Offset: 0x034 (R/ ) Timer 2 Masked Interrupt Status */
|
||||||
|
__IO uint32_t Timer2BGLoad; /* Offset: 0x038 (R/W) Background Load Register */
|
||||||
|
uint32_t RESERVED1[945];
|
||||||
|
__IO uint32_t ITCR; /* Offset: 0xF00 (R/W) Integration Test Control Register */
|
||||||
|
__O uint32_t ITOP; /* Offset: 0xF04 ( /W) Integration Test Output Set Register */
|
||||||
|
} CMSDK_DUALTIMER_BOTH_TypeDef;
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER1_LOAD_Pos 0 /* CMSDK_DUALTIMER1 LOAD: LOAD Position */
|
||||||
|
#define CMSDK_DUALTIMER1_LOAD_Msk (0xFFFFFFFFul << CMSDK_DUALTIMER1_LOAD_Pos) /* CMSDK_DUALTIMER1 LOAD: LOAD Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER1_VALUE_Pos 0 /* CMSDK_DUALTIMER1 VALUE: VALUE Position */
|
||||||
|
#define CMSDK_DUALTIMER1_VALUE_Msk (0xFFFFFFFFul << CMSDK_DUALTIMER1_VALUE_Pos) /* CMSDK_DUALTIMER1 VALUE: VALUE Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER1_CTRL_EN_Pos 7 /* CMSDK_DUALTIMER1 CTRL_EN: CTRL Enable Position */
|
||||||
|
#define CMSDK_DUALTIMER1_CTRL_EN_Msk (0x1ul << CMSDK_DUALTIMER1_CTRL_EN_Pos) /* CMSDK_DUALTIMER1 CTRL_EN: CTRL Enable Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER1_CTRL_MODE_Pos 6 /* CMSDK_DUALTIMER1 CTRL_MODE: CTRL MODE Position */
|
||||||
|
#define CMSDK_DUALTIMER1_CTRL_MODE_Msk (0x1ul << CMSDK_DUALTIMER1_CTRL_MODE_Pos) /* CMSDK_DUALTIMER1 CTRL_MODE: CTRL MODE Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER1_CTRL_INTEN_Pos 5 /* CMSDK_DUALTIMER1 CTRL_INTEN: CTRL Int Enable Position */
|
||||||
|
#define CMSDK_DUALTIMER1_CTRL_INTEN_Msk (0x1ul << CMSDK_DUALTIMER1_CTRL_INTEN_Pos) /* CMSDK_DUALTIMER1 CTRL_INTEN: CTRL Int Enable Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER1_CTRL_PRESCALE_Pos 2 /* CMSDK_DUALTIMER1 CTRL_PRESCALE: CTRL PRESCALE Position */
|
||||||
|
#define CMSDK_DUALTIMER1_CTRL_PRESCALE_Msk (0x3ul << CMSDK_DUALTIMER1_CTRL_PRESCALE_Pos) /* CMSDK_DUALTIMER1 CTRL_PRESCALE: CTRL PRESCALE Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER1_CTRL_SIZE_Pos 1 /* CMSDK_DUALTIMER1 CTRL_SIZE: CTRL SIZE Position */
|
||||||
|
#define CMSDK_DUALTIMER1_CTRL_SIZE_Msk (0x1ul << CMSDK_DUALTIMER1_CTRL_SIZE_Pos) /* CMSDK_DUALTIMER1 CTRL_SIZE: CTRL SIZE Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER1_CTRL_ONESHOOT_Pos 0 /* CMSDK_DUALTIMER1 CTRL_ONESHOOT: CTRL ONESHOOT Position */
|
||||||
|
#define CMSDK_DUALTIMER1_CTRL_ONESHOOT_Msk (0x1ul << CMSDK_DUALTIMER1_CTRL_ONESHOOT_Pos) /* CMSDK_DUALTIMER1 CTRL_ONESHOOT: CTRL ONESHOOT Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER1_INTCLR_Pos 0 /* CMSDK_DUALTIMER1 INTCLR: INT Clear Position */
|
||||||
|
#define CMSDK_DUALTIMER1_INTCLR_Msk (0x1ul << CMSDK_DUALTIMER1_INTCLR_Pos) /* CMSDK_DUALTIMER1 INTCLR: INT Clear Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER1_RAWINTSTAT_Pos 0 /* CMSDK_DUALTIMER1 RAWINTSTAT: Raw Int Status Position */
|
||||||
|
#define CMSDK_DUALTIMER1_RAWINTSTAT_Msk (0x1ul << CMSDK_DUALTIMER1_RAWINTSTAT_Pos) /* CMSDK_DUALTIMER1 RAWINTSTAT: Raw Int Status Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER1_MASKINTSTAT_Pos 0 /* CMSDK_DUALTIMER1 MASKINTSTAT: Mask Int Status Position */
|
||||||
|
#define CMSDK_DUALTIMER1_MASKINTSTAT_Msk (0x1ul << CMSDK_DUALTIMER1_MASKINTSTAT_Pos) /* CMSDK_DUALTIMER1 MASKINTSTAT: Mask Int Status Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER1_BGLOAD_Pos 0 /* CMSDK_DUALTIMER1 BGLOAD: Background Load Position */
|
||||||
|
#define CMSDK_DUALTIMER1_BGLOAD_Msk (0xFFFFFFFFul << CMSDK_DUALTIMER1_BGLOAD_Pos) /* CMSDK_DUALTIMER1 BGLOAD: Background Load Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER2_LOAD_Pos 0 /* CMSDK_DUALTIMER2 LOAD: LOAD Position */
|
||||||
|
#define CMSDK_DUALTIMER2_LOAD_Msk (0xFFFFFFFFul << CMSDK_DUALTIMER2_LOAD_Pos) /* CMSDK_DUALTIMER2 LOAD: LOAD Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER2_VALUE_Pos 0 /* CMSDK_DUALTIMER2 VALUE: VALUE Position */
|
||||||
|
#define CMSDK_DUALTIMER2_VALUE_Msk (0xFFFFFFFFul << CMSDK_DUALTIMER2_VALUE_Pos) /* CMSDK_DUALTIMER2 VALUE: VALUE Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER2_CTRL_EN_Pos 7 /* CMSDK_DUALTIMER2 CTRL_EN: CTRL Enable Position */
|
||||||
|
#define CMSDK_DUALTIMER2_CTRL_EN_Msk (0x1ul << CMSDK_DUALTIMER2_CTRL_EN_Pos) /* CMSDK_DUALTIMER2 CTRL_EN: CTRL Enable Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER2_CTRL_MODE_Pos 6 /* CMSDK_DUALTIMER2 CTRL_MODE: CTRL MODE Position */
|
||||||
|
#define CMSDK_DUALTIMER2_CTRL_MODE_Msk (0x1ul << CMSDK_DUALTIMER2_CTRL_MODE_Pos) /* CMSDK_DUALTIMER2 CTRL_MODE: CTRL MODE Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER2_CTRL_INTEN_Pos 5 /* CMSDK_DUALTIMER2 CTRL_INTEN: CTRL Int Enable Position */
|
||||||
|
#define CMSDK_DUALTIMER2_CTRL_INTEN_Msk (0x1ul << CMSDK_DUALTIMER2_CTRL_INTEN_Pos) /* CMSDK_DUALTIMER2 CTRL_INTEN: CTRL Int Enable Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER2_CTRL_PRESCALE_Pos 2 /* CMSDK_DUALTIMER2 CTRL_PRESCALE: CTRL PRESCALE Position */
|
||||||
|
#define CMSDK_DUALTIMER2_CTRL_PRESCALE_Msk (0x3ul << CMSDK_DUALTIMER2_CTRL_PRESCALE_Pos) /* CMSDK_DUALTIMER2 CTRL_PRESCALE: CTRL PRESCALE Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER2_CTRL_SIZE_Pos 1 /* CMSDK_DUALTIMER2 CTRL_SIZE: CTRL SIZE Position */
|
||||||
|
#define CMSDK_DUALTIMER2_CTRL_SIZE_Msk (0x1ul << CMSDK_DUALTIMER2_CTRL_SIZE_Pos) /* CMSDK_DUALTIMER2 CTRL_SIZE: CTRL SIZE Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER2_CTRL_ONESHOOT_Pos 0 /* CMSDK_DUALTIMER2 CTRL_ONESHOOT: CTRL ONESHOOT Position */
|
||||||
|
#define CMSDK_DUALTIMER2_CTRL_ONESHOOT_Msk (0x1ul << CMSDK_DUALTIMER2_CTRL_ONESHOOT_Pos) /* CMSDK_DUALTIMER2 CTRL_ONESHOOT: CTRL ONESHOOT Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER2_INTCLR_Pos 0 /* CMSDK_DUALTIMER2 INTCLR: INT Clear Position */
|
||||||
|
#define CMSDK_DUALTIMER2_INTCLR_Msk (0x1ul << CMSDK_DUALTIMER2_INTCLR_Pos) /* CMSDK_DUALTIMER2 INTCLR: INT Clear Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER2_RAWINTSTAT_Pos 0 /* CMSDK_DUALTIMER2 RAWINTSTAT: Raw Int Status Position */
|
||||||
|
#define CMSDK_DUALTIMER2_RAWINTSTAT_Msk (0x1ul << CMSDK_DUALTIMER2_RAWINTSTAT_Pos) /* CMSDK_DUALTIMER2 RAWINTSTAT: Raw Int Status Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER2_MASKINTSTAT_Pos 0 /* CMSDK_DUALTIMER2 MASKINTSTAT: Mask Int Status Position */
|
||||||
|
#define CMSDK_DUALTIMER2_MASKINTSTAT_Msk (0x1ul << CMSDK_DUALTIMER2_MASKINTSTAT_Pos) /* CMSDK_DUALTIMER2 MASKINTSTAT: Mask Int Status Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER2_BGLOAD_Pos 0 /* CMSDK_DUALTIMER2 BGLOAD: Background Load Position */
|
||||||
|
#define CMSDK_DUALTIMER2_BGLOAD_Msk (0xFFFFFFFFul << CMSDK_DUALTIMER2_BGLOAD_Pos) /* CMSDK_DUALTIMER2 BGLOAD: Background Load Mask */
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__IO uint32_t TimerLoad; /* Offset: 0x000 (R/W) Timer Load */
|
||||||
|
__I uint32_t TimerValue; /* Offset: 0x000 (R/W) Timer Counter Current Value */
|
||||||
|
__IO uint32_t TimerControl; /* Offset: 0x000 (R/W) Timer Control */
|
||||||
|
__O uint32_t TimerIntClr; /* Offset: 0x000 (R/W) Timer Interrupt Clear */
|
||||||
|
__I uint32_t TimerRIS; /* Offset: 0x000 (R/W) Timer Raw Interrupt Status */
|
||||||
|
__I uint32_t TimerMIS; /* Offset: 0x000 (R/W) Timer Masked Interrupt Status */
|
||||||
|
__IO uint32_t TimerBGLoad; /* Offset: 0x000 (R/W) Background Load Register */
|
||||||
|
} CMSDK_DUALTIMER_SINGLE_TypeDef;
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER_LOAD_Pos 0 /* CMSDK_DUALTIMER LOAD: LOAD Position */
|
||||||
|
#define CMSDK_DUALTIMER_LOAD_Msk (0xFFFFFFFFul << CMSDK_DUALTIMER_LOAD_Pos) /* CMSDK_DUALTIMER LOAD: LOAD Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER_VALUE_Pos 0 /* CMSDK_DUALTIMER VALUE: VALUE Position */
|
||||||
|
#define CMSDK_DUALTIMER_VALUE_Msk (0xFFFFFFFFul << CMSDK_DUALTIMER_VALUE_Pos) /* CMSDK_DUALTIMER VALUE: VALUE Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER_CTRL_EN_Pos 7 /* CMSDK_DUALTIMER CTRL_EN: CTRL Enable Position */
|
||||||
|
#define CMSDK_DUALTIMER_CTRL_EN_Msk (0x1ul << CMSDK_DUALTIMER_CTRL_EN_Pos) /* CMSDK_DUALTIMER CTRL_EN: CTRL Enable Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER_CTRL_MODE_Pos 6 /* CMSDK_DUALTIMER CTRL_MODE: CTRL MODE Position */
|
||||||
|
#define CMSDK_DUALTIMER_CTRL_MODE_Msk (0x1ul << CMSDK_DUALTIMER_CTRL_MODE_Pos) /* CMSDK_DUALTIMER CTRL_MODE: CTRL MODE Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER_CTRL_INTEN_Pos 5 /* CMSDK_DUALTIMER CTRL_INTEN: CTRL Int Enable Position */
|
||||||
|
#define CMSDK_DUALTIMER_CTRL_INTEN_Msk (0x1ul << CMSDK_DUALTIMER_CTRL_INTEN_Pos) /* CMSDK_DUALTIMER CTRL_INTEN: CTRL Int Enable Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER_CTRL_PRESCALE_Pos 2 /* CMSDK_DUALTIMER CTRL_PRESCALE: CTRL PRESCALE Position */
|
||||||
|
#define CMSDK_DUALTIMER_CTRL_PRESCALE_Msk (0x3ul << CMSDK_DUALTIMER_CTRL_PRESCALE_Pos) /* CMSDK_DUALTIMER CTRL_PRESCALE: CTRL PRESCALE Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER_CTRL_SIZE_Pos 1 /* CMSDK_DUALTIMER CTRL_SIZE: CTRL SIZE Position */
|
||||||
|
#define CMSDK_DUALTIMER_CTRL_SIZE_Msk (0x1ul << CMSDK_DUALTIMER_CTRL_SIZE_Pos) /* CMSDK_DUALTIMER CTRL_SIZE: CTRL SIZE Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER_CTRL_ONESHOOT_Pos 0 /* CMSDK_DUALTIMER CTRL_ONESHOOT: CTRL ONESHOOT Position */
|
||||||
|
#define CMSDK_DUALTIMER_CTRL_ONESHOOT_Msk (0x1ul << CMSDK_DUALTIMER_CTRL_ONESHOOT_Pos) /* CMSDK_DUALTIMER CTRL_ONESHOOT: CTRL ONESHOOT Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER_INTCLR_Pos 0 /* CMSDK_DUALTIMER INTCLR: INT Clear Position */
|
||||||
|
#define CMSDK_DUALTIMER_INTCLR_Msk (0x1ul << CMSDK_DUALTIMER_INTCLR_Pos) /* CMSDK_DUALTIMER INTCLR: INT Clear Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER_RAWINTSTAT_Pos 0 /* CMSDK_DUALTIMER RAWINTSTAT: Raw Int Status Position */
|
||||||
|
#define CMSDK_DUALTIMER_RAWINTSTAT_Msk (0x1ul << CMSDK_DUALTIMER_RAWINTSTAT_Pos) /* CMSDK_DUALTIMER RAWINTSTAT: Raw Int Status Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER_MASKINTSTAT_Pos 0 /* CMSDK_DUALTIMER MASKINTSTAT: Mask Int Status Position */
|
||||||
|
#define CMSDK_DUALTIMER_MASKINTSTAT_Msk (0x1ul << CMSDK_DUALTIMER_MASKINTSTAT_Pos) /* CMSDK_DUALTIMER MASKINTSTAT: Mask Int Status Mask */
|
||||||
|
|
||||||
|
#define CMSDK_DUALTIMER_BGLOAD_Pos 0 /* CMSDK_DUALTIMER BGLOAD: Background Load Position */
|
||||||
|
#define CMSDK_DUALTIMER_BGLOAD_Msk (0xFFFFFFFFul << CMSDK_DUALTIMER_BGLOAD_Pos) /* CMSDK_DUALTIMER BGLOAD: Background Load Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/*-------------------- General Purpose Input Output (GPIO) -------------------*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__IO uint32_t DATA; /* Offset: 0x000 (R/W) DATA Register */
|
||||||
|
__IO uint32_t DATAOUT; /* Offset: 0x004 (R/W) Data Output Latch Register */
|
||||||
|
uint32_t RESERVED0[2];
|
||||||
|
__IO uint32_t OUTENABLESET; /* Offset: 0x010 (R/W) Output Enable Set Register */
|
||||||
|
__IO uint32_t OUTENABLECLR; /* Offset: 0x014 (R/W) Output Enable Clear Register */
|
||||||
|
__IO uint32_t ALTFUNCSET; /* Offset: 0x018 (R/W) Alternate Function Set Register */
|
||||||
|
__IO uint32_t ALTFUNCCLR; /* Offset: 0x01C (R/W) Alternate Function Clear Register */
|
||||||
|
__IO uint32_t INTENSET; /* Offset: 0x020 (R/W) Interrupt Enable Set Register */
|
||||||
|
__IO uint32_t INTENCLR; /* Offset: 0x024 (R/W) Interrupt Enable Clear Register */
|
||||||
|
__IO uint32_t INTTYPESET; /* Offset: 0x028 (R/W) Interrupt Type Set Register */
|
||||||
|
__IO uint32_t INTTYPECLR; /* Offset: 0x02C (R/W) Interrupt Type Clear Register */
|
||||||
|
__IO uint32_t INTPOLSET; /* Offset: 0x030 (R/W) Interrupt Polarity Set Register */
|
||||||
|
__IO uint32_t INTPOLCLR; /* Offset: 0x034 (R/W) Interrupt Polarity Clear Register */
|
||||||
|
union {
|
||||||
|
__I uint32_t INTSTATUS; /* Offset: 0x038 (R/ ) Interrupt Status Register */
|
||||||
|
__O uint32_t INTCLEAR; /* Offset: 0x038 ( /W) Interrupt Clear Register */
|
||||||
|
};
|
||||||
|
uint32_t RESERVED1[241];
|
||||||
|
__IO uint32_t LB_MASKED[256]; /* Offset: 0x400 - 0x7FC Lower byte Masked Access Register (R/W) */
|
||||||
|
__IO uint32_t UB_MASKED[256]; /* Offset: 0x800 - 0xBFC Upper byte Masked Access Register (R/W) */
|
||||||
|
} CMSDK_GPIO_TypeDef;
|
||||||
|
|
||||||
|
#define CMSDK_GPIO_DATA_Pos 0 /* CMSDK_GPIO DATA: DATA Position */
|
||||||
|
#define CMSDK_GPIO_DATA_Msk (0xFFFFul << CMSDK_GPIO_DATA_Pos) /* CMSDK_GPIO DATA: DATA Mask */
|
||||||
|
|
||||||
|
#define CMSDK_GPIO_DATAOUT_Pos 0 /* CMSDK_GPIO DATAOUT: DATAOUT Position */
|
||||||
|
#define CMSDK_GPIO_DATAOUT_Msk (0xFFFFul << CMSDK_GPIO_DATAOUT_Pos) /* CMSDK_GPIO DATAOUT: DATAOUT Mask */
|
||||||
|
|
||||||
|
#define CMSDK_GPIO_OUTENSET_Pos 0 /* CMSDK_GPIO OUTEN: OUTEN Position */
|
||||||
|
#define CMSDK_GPIO_OUTENSET_Msk (0xFFFFul << CMSDK_GPIO_OUTEN_Pos) /* CMSDK_GPIO OUTEN: OUTEN Mask */
|
||||||
|
|
||||||
|
#define CMSDK_GPIO_OUTENCLR_Pos 0 /* CMSDK_GPIO OUTEN: OUTEN Position */
|
||||||
|
#define CMSDK_GPIO_OUTENCLR_Msk (0xFFFFul << CMSDK_GPIO_OUTEN_Pos) /* CMSDK_GPIO OUTEN: OUTEN Mask */
|
||||||
|
|
||||||
|
#define CMSDK_GPIO_ALTFUNCSET_Pos 0 /* CMSDK_GPIO ALTFUNC: ALTFUNC Position */
|
||||||
|
#define CMSDK_GPIO_ALTFUNCSET_Msk (0xFFFFul << CMSDK_GPIO_ALTFUNC_Pos) /* CMSDK_GPIO ALTFUNC: ALTFUNC Mask */
|
||||||
|
|
||||||
|
#define CMSDK_GPIO_ALTFUNCCLR_Pos 0 /* CMSDK_GPIO ALTFUNC: ALTFUNC Position */
|
||||||
|
#define CMSDK_GPIO_ALTFUNCCLR_Msk (0xFFFFul << CMSDK_GPIO_ALTFUNC_Pos) /* CMSDK_GPIO ALTFUNC: ALTFUNC Mask */
|
||||||
|
|
||||||
|
#define CMSDK_GPIO_INTENSET_Pos 0 /* CMSDK_GPIO INTEN: INTEN Position */
|
||||||
|
#define CMSDK_GPIO_INTENSET_Msk (0xFFFFul << CMSDK_GPIO_INTEN_Pos) /* CMSDK_GPIO INTEN: INTEN Mask */
|
||||||
|
|
||||||
|
#define CMSDK_GPIO_INTENCLR_Pos 0 /* CMSDK_GPIO INTEN: INTEN Position */
|
||||||
|
#define CMSDK_GPIO_INTENCLR_Msk (0xFFFFul << CMSDK_GPIO_INTEN_Pos) /* CMSDK_GPIO INTEN: INTEN Mask */
|
||||||
|
|
||||||
|
#define CMSDK_GPIO_INTTYPESET_Pos 0 /* CMSDK_GPIO INTTYPE: INTTYPE Position */
|
||||||
|
#define CMSDK_GPIO_INTTYPESET_Msk (0xFFFFul << CMSDK_GPIO_INTTYPE_Pos) /* CMSDK_GPIO INTTYPE: INTTYPE Mask */
|
||||||
|
|
||||||
|
#define CMSDK_GPIO_INTTYPECLR_Pos 0 /* CMSDK_GPIO INTTYPE: INTTYPE Position */
|
||||||
|
#define CMSDK_GPIO_INTTYPECLR_Msk (0xFFFFul << CMSDK_GPIO_INTTYPE_Pos) /* CMSDK_GPIO INTTYPE: INTTYPE Mask */
|
||||||
|
|
||||||
|
#define CMSDK_GPIO_INTPOLSET_Pos 0 /* CMSDK_GPIO INTPOL: INTPOL Position */
|
||||||
|
#define CMSDK_GPIO_INTPOLSET_Msk (0xFFFFul << CMSDK_GPIO_INTPOL_Pos) /* CMSDK_GPIO INTPOL: INTPOL Mask */
|
||||||
|
|
||||||
|
#define CMSDK_GPIO_INTPOLCLR_Pos 0 /* CMSDK_GPIO INTPOL: INTPOL Position */
|
||||||
|
#define CMSDK_GPIO_INTPOLCLR_Msk (0xFFFFul << CMSDK_GPIO_INTPOL_Pos) /* CMSDK_GPIO INTPOL: INTPOL Mask */
|
||||||
|
|
||||||
|
#define CMSDK_GPIO_INTSTATUS_Pos 0 /* CMSDK_GPIO INTSTATUS: INTSTATUS Position */
|
||||||
|
#define CMSDK_GPIO_INTSTATUS_Msk (0xFFul << CMSDK_GPIO_INTSTATUS_Pos) /* CMSDK_GPIO INTSTATUS: INTSTATUS Mask */
|
||||||
|
|
||||||
|
#define CMSDK_GPIO_INTCLEAR_Pos 0 /* CMSDK_GPIO INTCLEAR: INTCLEAR Position */
|
||||||
|
#define CMSDK_GPIO_INTCLEAR_Msk (0xFFul << CMSDK_GPIO_INTCLEAR_Pos) /* CMSDK_GPIO INTCLEAR: INTCLEAR Mask */
|
||||||
|
|
||||||
|
#define CMSDK_GPIO_MASKLOWBYTE_Pos 0 /* CMSDK_GPIO MASKLOWBYTE: MASKLOWBYTE Position */
|
||||||
|
#define CMSDK_GPIO_MASKLOWBYTE_Msk (0x00FFul << CMSDK_GPIO_MASKLOWBYTE_Pos) /* CMSDK_GPIO MASKLOWBYTE: MASKLOWBYTE Mask */
|
||||||
|
|
||||||
|
#define CMSDK_GPIO_MASKHIGHBYTE_Pos 0 /* CMSDK_GPIO MASKHIGHBYTE: MASKHIGHBYTE Position */
|
||||||
|
#define CMSDK_GPIO_MASKHIGHBYTE_Msk (0xFF00ul << CMSDK_GPIO_MASKHIGHBYTE_Pos) /* CMSDK_GPIO MASKHIGHBYTE: MASKHIGHBYTE Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------- System Control (SYSCON) --------------------------------------*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__IO uint32_t REMAP; /* Offset: 0x000 (R/W) Remap Control Register */
|
||||||
|
__IO uint32_t PMUCTRL; /* Offset: 0x004 (R/W) PMU Control Register */
|
||||||
|
__IO uint32_t RESETOP; /* Offset: 0x008 (R/W) Reset Option Register */
|
||||||
|
__IO uint32_t EMICTRL; /* Offset: 0x00C (R/W) EMI Control Register */
|
||||||
|
__IO uint32_t RSTINFO; /* Offset: 0x010 (R/W) Reset Information Register */
|
||||||
|
} CMSDK_SYSCON_TypeDef;
|
||||||
|
|
||||||
|
#define CMSDK_SYSCON_REMAP_Pos 0
|
||||||
|
#define CMSDK_SYSCON_REMAP_Msk (0x01ul << CMSDK_SYSCON_REMAP_Pos) /* CMSDK_SYSCON MEME_CTRL: REMAP Mask */
|
||||||
|
|
||||||
|
#define CMSDK_SYSCON_PMUCTRL_EN_Pos 0
|
||||||
|
#define CMSDK_SYSCON_PMUCTRL_EN_Msk (0x01ul << CMSDK_SYSCON_PMUCTRL_EN_Pos) /* CMSDK_SYSCON PMUCTRL: PMUCTRL ENABLE Mask */
|
||||||
|
|
||||||
|
#define CMSDK_SYSCON_LOCKUPRST_RESETOP_Pos 0
|
||||||
|
#define CMSDK_SYSCON_LOCKUPRST_RESETOP_Msk (0x01ul << CMSDK_SYSCON_LOCKUPRST_RESETOP_Pos) /* CMSDK_SYSCON SYS_CTRL: LOCKUP RESET ENABLE Mask */
|
||||||
|
|
||||||
|
#define CMSDK_SYSCON_EMICTRL_SIZE_Pos 24
|
||||||
|
#define CMSDK_SYSCON_EMICTRL_SIZE_Msk (0x00001ul << CMSDK_SYSCON_EMICTRL_SIZE_Pos) /* CMSDK_SYSCON EMICTRL: SIZE Mask */
|
||||||
|
|
||||||
|
#define CMSDK_SYSCON_EMICTRL_TACYC_Pos 16
|
||||||
|
#define CMSDK_SYSCON_EMICTRL_TACYC_Msk (0x00007ul << CMSDK_SYSCON_EMICTRL_TACYC_Pos) /* CMSDK_SYSCON EMICTRL: TURNAROUNDCYCLE Mask */
|
||||||
|
|
||||||
|
#define CMSDK_SYSCON_EMICTRL_WCYC_Pos 8
|
||||||
|
#define CMSDK_SYSCON_EMICTRL_WCYC_Msk (0x00003ul << CMSDK_SYSCON_EMICTRL_WCYC_Pos) /* CMSDK_SYSCON EMICTRL: WRITECYCLE Mask */
|
||||||
|
|
||||||
|
#define CMSDK_SYSCON_EMICTRL_RCYC_Pos 0
|
||||||
|
#define CMSDK_SYSCON_EMICTRL_RCYC_Msk (0x00007ul << CMSDK_SYSCON_EMICTRL_RCYC_Pos) /* CMSDK_SYSCON EMICTRL: READCYCLE Mask */
|
||||||
|
|
||||||
|
#define CMSDK_SYSCON_RSTINFO_SYSRESETREQ_Pos 0
|
||||||
|
#define CMSDK_SYSCON_RSTINFO_SYSRESETREQ_Msk (0x00001ul << CMSDK_SYSCON_RSTINFO_SYSRESETREQ_Pos) /* CMSDK_SYSCON RSTINFO: SYSRESETREQ Mask */
|
||||||
|
|
||||||
|
#define CMSDK_SYSCON_RSTINFO_WDOGRESETREQ_Pos 1
|
||||||
|
#define CMSDK_SYSCON_RSTINFO_WDOGRESETREQ_Msk (0x00001ul << CMSDK_SYSCON_RSTINFO_WDOGRESETREQ_Pos) /* CMSDK_SYSCON RSTINFO: WDOGRESETREQ Mask */
|
||||||
|
|
||||||
|
#define CMSDK_SYSCON_RSTINFO_LOCKUPRESET_Pos 2
|
||||||
|
#define CMSDK_SYSCON_RSTINFO_LOCKUPRESET_Msk (0x00001ul << CMSDK_SYSCON_RSTINFO_LOCKUPRESET_Pos) /* CMSDK_SYSCON RSTINFO: LOCKUPRESET Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------- PL230 uDMA (PL230) --------------------------------------*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__I uint32_t DMA_STATUS; /* Offset: 0x000 (R/W) DMA status Register */
|
||||||
|
__O uint32_t DMA_CFG; /* Offset: 0x004 ( /W) DMA configuration Register */
|
||||||
|
__IO uint32_t CTRL_BASE_PTR; /* Offset: 0x008 (R/W) Channel Control Data Base Pointer Register */
|
||||||
|
__I uint32_t ALT_CTRL_BASE_PTR; /* Offset: 0x00C (R/ ) Channel Alternate Control Data Base Pointer Register */
|
||||||
|
__I uint32_t DMA_WAITONREQ_STATUS; /* Offset: 0x010 (R/ ) Channel Wait On Request Status Register */
|
||||||
|
__O uint32_t CHNL_SW_REQUEST; /* Offset: 0x014 ( /W) Channel Software Request Register */
|
||||||
|
__IO uint32_t CHNL_USEBURST_SET; /* Offset: 0x018 (R/W) Channel UseBurst Set Register */
|
||||||
|
__O uint32_t CHNL_USEBURST_CLR; /* Offset: 0x01C ( /W) Channel UseBurst Clear Register */
|
||||||
|
__IO uint32_t CHNL_REQ_MASK_SET; /* Offset: 0x020 (R/W) Channel Request Mask Set Register */
|
||||||
|
__O uint32_t CHNL_REQ_MASK_CLR; /* Offset: 0x024 ( /W) Channel Request Mask Clear Register */
|
||||||
|
__IO uint32_t CHNL_ENABLE_SET; /* Offset: 0x028 (R/W) Channel Enable Set Register */
|
||||||
|
__O uint32_t CHNL_ENABLE_CLR; /* Offset: 0x02C ( /W) Channel Enable Clear Register */
|
||||||
|
__IO uint32_t CHNL_PRI_ALT_SET; /* Offset: 0x030 (R/W) Channel Primary-Alterante Set Register */
|
||||||
|
__O uint32_t CHNL_PRI_ALT_CLR; /* Offset: 0x034 ( /W) Channel Primary-Alterante Clear Register */
|
||||||
|
__IO uint32_t CHNL_PRIORITY_SET; /* Offset: 0x038 (R/W) Channel Priority Set Register */
|
||||||
|
__O uint32_t CHNL_PRIORITY_CLR; /* Offset: 0x03C ( /W) Channel Priority Clear Register */
|
||||||
|
uint32_t RESERVED0[3];
|
||||||
|
__IO uint32_t ERR_CLR; /* Offset: 0x04C Bus Error Clear Register (R/W) */
|
||||||
|
|
||||||
|
} CMSDK_PL230_TypeDef;
|
||||||
|
|
||||||
|
#define PL230_DMA_CHNL_BITS 0
|
||||||
|
|
||||||
|
#define CMSDK_PL230_DMA_STATUS_MSTREN_Pos 0 /* CMSDK_PL230 DMA STATUS: MSTREN Position */
|
||||||
|
#define CMSDK_PL230_DMA_STATUS_MSTREN_Msk (0x00000001ul << CMSDK_PL230_DMA_STATUS_MSTREN_Pos) /* CMSDK_PL230 DMA STATUS: MSTREN Mask */
|
||||||
|
|
||||||
|
#define CMSDK_PL230_DMA_STATUS_STATE_Pos 0 /* CMSDK_PL230 DMA STATUS: STATE Position */
|
||||||
|
#define CMSDK_PL230_DMA_STATUS_STATE_Msk (0x0000000Ful << CMSDK_PL230_DMA_STATUS_STATE_Pos) /* CMSDK_PL230 DMA STATUS: STATE Mask */
|
||||||
|
|
||||||
|
#define CMSDK_PL230_DMA_STATUS_CHNLS_MINUS1_Pos 0 /* CMSDK_PL230 DMA STATUS: CHNLS_MINUS1 Position */
|
||||||
|
#define CMSDK_PL230_DMA_STATUS_CHNLS_MINUS1_Msk (0x0000001Ful << CMSDK_PL230_DMA_STATUS_CHNLS_MINUS1_Pos) /* CMSDK_PL230 DMA STATUS: CHNLS_MINUS1 Mask */
|
||||||
|
|
||||||
|
#define CMSDK_PL230_DMA_STATUS_TEST_STATUS_Pos 0 /* CMSDK_PL230 DMA STATUS: TEST_STATUS Position */
|
||||||
|
#define CMSDK_PL230_DMA_STATUS_TEST_STATUS_Msk (0x00000001ul << CMSDK_PL230_DMA_STATUS_TEST_STATUS_Pos) /* CMSDK_PL230 DMA STATUS: TEST_STATUS Mask */
|
||||||
|
|
||||||
|
#define CMSDK_PL230_DMA_CFG_MSTREN_Pos 0 /* CMSDK_PL230 DMA CFG: MSTREN Position */
|
||||||
|
#define CMSDK_PL230_DMA_CFG_MSTREN_Msk (0x00000001ul << CMSDK_PL230_DMA_CFG_MSTREN_Pos) /* CMSDK_PL230 DMA CFG: MSTREN Mask */
|
||||||
|
|
||||||
|
#define CMSDK_PL230_DMA_CFG_CPCCACHE_Pos 2 /* CMSDK_PL230 DMA CFG: CPCCACHE Position */
|
||||||
|
#define CMSDK_PL230_DMA_CFG_CPCCACHE_Msk (0x00000001ul << CMSDK_PL230_DMA_CFG_CPCCACHE_Pos) /* CMSDK_PL230 DMA CFG: CPCCACHE Mask */
|
||||||
|
|
||||||
|
#define CMSDK_PL230_DMA_CFG_CPCBUF_Pos 1 /* CMSDK_PL230 DMA CFG: CPCBUF Position */
|
||||||
|
#define CMSDK_PL230_DMA_CFG_CPCBUF_Msk (0x00000001ul << CMSDK_PL230_DMA_CFG_CPCBUF_Pos) /* CMSDK_PL230 DMA CFG: CPCBUF Mask */
|
||||||
|
|
||||||
|
#define CMSDK_PL230_DMA_CFG_CPCPRIV_Pos 0 /* CMSDK_PL230 DMA CFG: CPCPRIV Position */
|
||||||
|
#define CMSDK_PL230_DMA_CFG_CPCPRIV_Msk (0x00000001ul << CMSDK_PL230_DMA_CFG_CPCPRIV_Pos) /* CMSDK_PL230 DMA CFG: CPCPRIV Mask */
|
||||||
|
|
||||||
|
#define CMSDK_PL230_CTRL_BASE_PTR_Pos PL230_DMA_CHNL_BITS + 5 /* CMSDK_PL230 STATUS: BASE_PTR Position */
|
||||||
|
#define CMSDK_PL230_CTRL_BASE_PTR_Msk (0x0FFFFFFFul << CMSDK_PL230_CTRL_BASE_PTR_Pos) /* CMSDK_PL230 STATUS: BASE_PTR Mask */
|
||||||
|
|
||||||
|
#define CMSDK_PL230_ALT_CTRL_BASE_PTR_Pos 0 /* CMSDK_PL230 STATUS: MSTREN Position */
|
||||||
|
#define CMSDK_PL230_ALT_CTRL_BASE_PTR_Msk (0xFFFFFFFFul << CMSDK_PL230_ALT_CTRL_BASE_PTR_Pos) /* CMSDK_PL230 STATUS: MSTREN Mask */
|
||||||
|
|
||||||
|
#define CMSDK_PL230_DMA_WAITONREQ_STATUS_Pos 0 /* CMSDK_PL230 DMA_WAITONREQ_STATUS: DMA_WAITONREQ_STATUS Position */
|
||||||
|
#define CMSDK_PL230_DMA_WAITONREQ_STATUS_Msk (0xFFFFFFFFul << CMSDK_PL230_DMA_WAITONREQ_STATUS_Pos) /* CMSDK_PL230 DMA_WAITONREQ_STATUS: DMA_WAITONREQ_STATUS Mask */
|
||||||
|
|
||||||
|
#define CMSDK_PL230_CHNL_SW_REQUEST_Pos 0 /* CMSDK_PL230 CHNL_SW_REQUEST: CHNL_SW_REQUEST Position */
|
||||||
|
#define CMSDK_PL230_CHNL_SW_REQUEST_Msk (0xFFFFFFFFul << CMSDK_PL230_CHNL_SW_REQUEST_Pos) /* CMSDK_PL230 CHNL_SW_REQUEST: CHNL_SW_REQUEST Mask */
|
||||||
|
|
||||||
|
#define CMSDK_PL230_CHNL_USEBURST_SET_Pos 0 /* CMSDK_PL230 CHNL_USEBURST: SET Position */
|
||||||
|
#define CMSDK_PL230_CHNL_USEBURST_SET_Msk (0xFFFFFFFFul << CMSDK_PL230_CHNL_USEBURST_SET_Pos) /* CMSDK_PL230 CHNL_USEBURST: SET Mask */
|
||||||
|
|
||||||
|
#define CMSDK_PL230_CHNL_USEBURST_CLR_Pos 0 /* CMSDK_PL230 CHNL_USEBURST: CLR Position */
|
||||||
|
#define CMSDK_PL230_CHNL_USEBURST_CLR_Msk (0xFFFFFFFFul << CMSDK_PL230_CHNL_USEBURST_CLR_Pos) /* CMSDK_PL230 CHNL_USEBURST: CLR Mask */
|
||||||
|
|
||||||
|
#define CMSDK_PL230_CHNL_REQ_MASK_SET_Pos 0 /* CMSDK_PL230 CHNL_REQ_MASK: SET Position */
|
||||||
|
#define CMSDK_PL230_CHNL_REQ_MASK_SET_Msk (0xFFFFFFFFul << CMSDK_PL230_CHNL_REQ_MASK_SET_Pos) /* CMSDK_PL230 CHNL_REQ_MASK: SET Mask */
|
||||||
|
|
||||||
|
#define CMSDK_PL230_CHNL_REQ_MASK_CLR_Pos 0 /* CMSDK_PL230 CHNL_REQ_MASK: CLR Position */
|
||||||
|
#define CMSDK_PL230_CHNL_REQ_MASK_CLR_Msk (0xFFFFFFFFul << CMSDK_PL230_CHNL_REQ_MASK_CLR_Pos) /* CMSDK_PL230 CHNL_REQ_MASK: CLR Mask */
|
||||||
|
|
||||||
|
#define CMSDK_PL230_CHNL_ENABLE_SET_Pos 0 /* CMSDK_PL230 CHNL_ENABLE: SET Position */
|
||||||
|
#define CMSDK_PL230_CHNL_ENABLE_SET_Msk (0xFFFFFFFFul << CMSDK_PL230_CHNL_ENABLE_SET_Pos) /* CMSDK_PL230 CHNL_ENABLE: SET Mask */
|
||||||
|
|
||||||
|
#define CMSDK_PL230_CHNL_ENABLE_CLR_Pos 0 /* CMSDK_PL230 CHNL_ENABLE: CLR Position */
|
||||||
|
#define CMSDK_PL230_CHNL_ENABLE_CLR_Msk (0xFFFFFFFFul << CMSDK_PL230_CHNL_ENABLE_CLR_Pos) /* CMSDK_PL230 CHNL_ENABLE: CLR Mask */
|
||||||
|
|
||||||
|
#define CMSDK_PL230_CHNL_PRI_ALT_SET_Pos 0 /* CMSDK_PL230 CHNL_PRI_ALT: SET Position */
|
||||||
|
#define CMSDK_PL230_CHNL_PRI_ALT_SET_Msk (0xFFFFFFFFul << CMSDK_PL230_CHNL_PRI_ALT_SET_Pos) /* CMSDK_PL230 CHNL_PRI_ALT: SET Mask */
|
||||||
|
|
||||||
|
#define CMSDK_PL230_CHNL_PRI_ALT_CLR_Pos 0 /* CMSDK_PL230 CHNL_PRI_ALT: CLR Position */
|
||||||
|
#define CMSDK_PL230_CHNL_PRI_ALT_CLR_Msk (0xFFFFFFFFul << CMSDK_PL230_CHNL_PRI_ALT_CLR_Pos) /* CMSDK_PL230 CHNL_PRI_ALT: CLR Mask */
|
||||||
|
|
||||||
|
#define CMSDK_PL230_CHNL_PRIORITY_SET_Pos 0 /* CMSDK_PL230 CHNL_PRIORITY: SET Position */
|
||||||
|
#define CMSDK_PL230_CHNL_PRIORITY_SET_Msk (0xFFFFFFFFul << CMSDK_PL230_CHNL_PRIORITY_SET_Pos) /* CMSDK_PL230 CHNL_PRIORITY: SET Mask */
|
||||||
|
|
||||||
|
#define CMSDK_PL230_CHNL_PRIORITY_CLR_Pos 0 /* CMSDK_PL230 CHNL_PRIORITY: CLR Position */
|
||||||
|
#define CMSDK_PL230_CHNL_PRIORITY_CLR_Msk (0xFFFFFFFFul << CMSDK_PL230_CHNL_PRIORITY_CLR_Pos) /* CMSDK_PL230 CHNL_PRIORITY: CLR Mask */
|
||||||
|
|
||||||
|
#define CMSDK_PL230_ERR_CLR_Pos 0 /* CMSDK_PL230 ERR: CLR Position */
|
||||||
|
#define CMSDK_PL230_ERR_CLR_Msk (0x00000001ul << CMSDK_PL230_ERR_CLR_Pos) /* CMSDK_PL230 ERR: CLR Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------- Watchdog ----------------------------------------------*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
|
||||||
|
__IO uint32_t LOAD; /* Offset: 0x000 (R/W) Watchdog Load Register */
|
||||||
|
__I uint32_t VALUE; /* Offset: 0x004 (R/ ) Watchdog Value Register */
|
||||||
|
__IO uint32_t CTRL; /* Offset: 0x008 (R/W) Watchdog Control Register */
|
||||||
|
__O uint32_t INTCLR; /* Offset: 0x00C ( /W) Watchdog Clear Interrupt Register */
|
||||||
|
__I uint32_t RAWINTSTAT; /* Offset: 0x010 (R/ ) Watchdog Raw Interrupt Status Register */
|
||||||
|
__I uint32_t MASKINTSTAT; /* Offset: 0x014 (R/ ) Watchdog Interrupt Status Register */
|
||||||
|
uint32_t RESERVED0[762];
|
||||||
|
__IO uint32_t LOCK; /* Offset: 0xC00 (R/W) Watchdog Lock Register */
|
||||||
|
uint32_t RESERVED1[191];
|
||||||
|
__IO uint32_t ITCR; /* Offset: 0xF00 (R/W) Watchdog Integration Test Control Register */
|
||||||
|
__O uint32_t ITOP; /* Offset: 0xF04 ( /W) Watchdog Integration Test Output Set Register */
|
||||||
|
}CMSDK_WATCHDOG_TypeDef;
|
||||||
|
|
||||||
|
#define CMSDK_Watchdog_LOAD_Pos 0 /* CMSDK_Watchdog LOAD: LOAD Position */
|
||||||
|
#define CMSDK_Watchdog_LOAD_Msk (0xFFFFFFFFul << CMSDK_Watchdog_LOAD_Pos) /* CMSDK_Watchdog LOAD: LOAD Mask */
|
||||||
|
|
||||||
|
#define CMSDK_Watchdog_VALUE_Pos 0 /* CMSDK_Watchdog VALUE: VALUE Position */
|
||||||
|
#define CMSDK_Watchdog_VALUE_Msk (0xFFFFFFFFul << CMSDK_Watchdog_VALUE_Pos) /* CMSDK_Watchdog VALUE: VALUE Mask */
|
||||||
|
|
||||||
|
#define CMSDK_Watchdog_CTRL_RESEN_Pos 1 /* CMSDK_Watchdog CTRL_RESEN: Enable Reset Output Position */
|
||||||
|
#define CMSDK_Watchdog_CTRL_RESEN_Msk (0x1ul << CMSDK_Watchdog_CTRL_RESEN_Pos) /* CMSDK_Watchdog CTRL_RESEN: Enable Reset Output Mask */
|
||||||
|
|
||||||
|
#define CMSDK_Watchdog_CTRL_INTEN_Pos 0 /* CMSDK_Watchdog CTRL_INTEN: Int Enable Position */
|
||||||
|
#define CMSDK_Watchdog_CTRL_INTEN_Msk (0x1ul << CMSDK_Watchdog_CTRL_INTEN_Pos) /* CMSDK_Watchdog CTRL_INTEN: Int Enable Mask */
|
||||||
|
|
||||||
|
#define CMSDK_Watchdog_INTCLR_Pos 0 /* CMSDK_Watchdog INTCLR: Int Clear Position */
|
||||||
|
#define CMSDK_Watchdog_INTCLR_Msk (0x1ul << CMSDK_Watchdog_INTCLR_Pos) /* CMSDK_Watchdog INTCLR: Int Clear Mask */
|
||||||
|
|
||||||
|
#define CMSDK_Watchdog_RAWINTSTAT_Pos 0 /* CMSDK_Watchdog RAWINTSTAT: Raw Int Status Position */
|
||||||
|
#define CMSDK_Watchdog_RAWINTSTAT_Msk (0x1ul << CMSDK_Watchdog_RAWINTSTAT_Pos) /* CMSDK_Watchdog RAWINTSTAT: Raw Int Status Mask */
|
||||||
|
|
||||||
|
#define CMSDK_Watchdog_MASKINTSTAT_Pos 0 /* CMSDK_Watchdog MASKINTSTAT: Mask Int Status Position */
|
||||||
|
#define CMSDK_Watchdog_MASKINTSTAT_Msk (0x1ul << CMSDK_Watchdog_MASKINTSTAT_Pos) /* CMSDK_Watchdog MASKINTSTAT: Mask Int Status Mask */
|
||||||
|
|
||||||
|
#define CMSDK_Watchdog_LOCK_Pos 0 /* CMSDK_Watchdog LOCK: LOCK Position */
|
||||||
|
#define CMSDK_Watchdog_LOCK_Msk (0x1ul << CMSDK_Watchdog_LOCK_Pos) /* CMSDK_Watchdog LOCK: LOCK Mask */
|
||||||
|
|
||||||
|
#define CMSDK_Watchdog_INTEGTESTEN_Pos 0 /* CMSDK_Watchdog INTEGTESTEN: Integration Test Enable Position */
|
||||||
|
#define CMSDK_Watchdog_INTEGTESTEN_Msk (0x1ul << CMSDK_Watchdog_INTEGTESTEN_Pos) /* CMSDK_Watchdog INTEGTESTEN: Integration Test Enable Mask */
|
||||||
|
|
||||||
|
#define CMSDK_Watchdog_INTEGTESTOUTSET_Pos 1 /* CMSDK_Watchdog INTEGTESTOUTSET: Integration Test Output Set Position */
|
||||||
|
#define CMSDK_Watchdog_INTEGTESTOUTSET_Msk (0x1ul << CMSDK_Watchdog_INTEGTESTOUTSET_Pos) /* CMSDK_Watchdog INTEGTESTOUTSET: Integration Test Output Set Mask */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* -------------------- End of section using anonymous unions ------------------- */
|
||||||
|
#if defined ( __CC_ARM )
|
||||||
|
#pragma pop
|
||||||
|
#elif defined(__ICCARM__)
|
||||||
|
/* leave anonymous unions enabled */
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
/* anonymous unions are enabled by default */
|
||||||
|
#elif defined(__TMS470__)
|
||||||
|
/* anonymous unions are enabled by default */
|
||||||
|
#elif defined(__TASKING__)
|
||||||
|
#pragma warning restore
|
||||||
|
#else
|
||||||
|
#warning Not supported compiler type
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================================ */
|
||||||
|
/* ================ Peripheral memory map ================ */
|
||||||
|
/* ================================================================================ */
|
||||||
|
|
||||||
|
/* Peripheral and SRAM base address */
|
||||||
|
#define CMSDK_FLASH_BASE (0x00000000UL)
|
||||||
|
#define CMSDK_SRAM_BASE (0x20000000UL)
|
||||||
|
#define CMSDK_PERIPH_BASE (0x40000000UL)
|
||||||
|
|
||||||
|
#define CMSDK_RAM_BASE (0x20000000UL)
|
||||||
|
#define CMSDK_APB_BASE (0x40000000UL)
|
||||||
|
#define CMSDK_AHB_BASE (0x40010000UL)
|
||||||
|
|
||||||
|
/* APB peripherals */
|
||||||
|
#define CMSDK_TIMER0_BASE (CMSDK_APB_BASE + 0x0000UL)
|
||||||
|
#define CMSDK_TIMER1_BASE (CMSDK_APB_BASE + 0x1000UL)
|
||||||
|
#define CMSDK_DUALTIMER_BASE (CMSDK_APB_BASE + 0x2000UL)
|
||||||
|
#define CMSDK_DUALTIMER_1_BASE (CMSDK_DUALTIMER_BASE)
|
||||||
|
#define CMSDK_DUALTIMER_2_BASE (CMSDK_DUALTIMER_BASE + 0x20UL)
|
||||||
|
#define CMSDK_UART0_BASE (CMSDK_APB_BASE + 0x4000UL)
|
||||||
|
#define CMSDK_UART1_BASE (CMSDK_APB_BASE + 0x5000UL)
|
||||||
|
#define CMSDK_UART2_BASE (CMSDK_APB_BASE + 0x6000UL)
|
||||||
|
#define CMSDK_UART3_BASE (CMSDK_APB_BASE + 0x7000UL)
|
||||||
|
#define CMSDK_WATCHDOG_BASE (CMSDK_APB_BASE + 0x8000UL)
|
||||||
|
#define CMSDK_UART4_BASE (CMSDK_APB_BASE + 0x9000UL)
|
||||||
|
#define CMSDK_PL230_BASE (CMSDK_APB_BASE + 0xF000UL)
|
||||||
|
|
||||||
|
/* AHB peripherals */
|
||||||
|
#define CMSDK_GPIO0_BASE (CMSDK_AHB_BASE + 0x0000UL)
|
||||||
|
#define CMSDK_GPIO1_BASE (CMSDK_AHB_BASE + 0x1000UL)
|
||||||
|
#define CMSDK_GPIO2_BASE (CMSDK_AHB_BASE + 0x2000UL)
|
||||||
|
#define CMSDK_GPIO3_BASE (CMSDK_AHB_BASE + 0x3000UL)
|
||||||
|
#define CMSDK_SYSCTRL_BASE (CMSDK_AHB_BASE + 0xF000UL)
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================================ */
|
||||||
|
/* ================ Peripheral declaration ================ */
|
||||||
|
/* ================================================================================ */
|
||||||
|
|
||||||
|
#define CMSDK_UART0 ((CMSDK_UART_TypeDef *) CMSDK_UART0_BASE )
|
||||||
|
#define CMSDK_UART1 ((CMSDK_UART_TypeDef *) CMSDK_UART1_BASE )
|
||||||
|
#define CMSDK_UART2 ((CMSDK_UART_TypeDef *) CMSDK_UART2_BASE )
|
||||||
|
#define CMSDK_UART3 ((CMSDK_UART_TypeDef *) CMSDK_UART3_BASE )
|
||||||
|
#define CMSDK_UART4 ((CMSDK_UART_TypeDef *) CMSDK_UART4_BASE )
|
||||||
|
#define CMSDK_TIMER0 ((CMSDK_TIMER_TypeDef *) CMSDK_TIMER0_BASE )
|
||||||
|
#define CMSDK_TIMER1 ((CMSDK_TIMER_TypeDef *) CMSDK_TIMER1_BASE )
|
||||||
|
#define CMSDK_DUALTIMER ((CMSDK_DUALTIMER_BOTH_TypeDef *) CMSDK_DUALTIMER_BASE )
|
||||||
|
#define CMSDK_DUALTIMER1 ((CMSDK_DUALTIMER_SINGLE_TypeDef *) CMSDK_DUALTIMER_1_BASE )
|
||||||
|
#define CMSDK_DUALTIMER2 ((CMSDK_DUALTIMER_SINGLE_TypeDef *) CMSDK_DUALTIMER_2_BASE )
|
||||||
|
#define CMSDK_WATCHDOG ((CMSDK_WATCHDOG_TypeDef *) CMSDK_WATCHDOG_BASE )
|
||||||
|
#define CMSDK_DMA ((CMSDK_PL230_TypeDef *) CMSDK_PL230_BASE )
|
||||||
|
#define CMSDK_GPIO0 ((CMSDK_GPIO_TypeDef *) CMSDK_GPIO0_BASE )
|
||||||
|
#define CMSDK_GPIO1 ((CMSDK_GPIO_TypeDef *) CMSDK_GPIO1_BASE )
|
||||||
|
#define CMSDK_GPIO2 ((CMSDK_GPIO_TypeDef *) CMSDK_GPIO2_BASE )
|
||||||
|
#define CMSDK_GPIO3 ((CMSDK_GPIO_TypeDef *) CMSDK_GPIO3_BASE )
|
||||||
|
#define CMSDK_SYSCON ((CMSDK_SYSCON_TypeDef *) CMSDK_SYSCTRL_BASE )
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* CMSDK_CM3_H */
|
614
FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC/CMSIS/SMM_MPS2.h
Normal file
614
FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC/CMSIS/SMM_MPS2.h
Normal file
@ -0,0 +1,614 @@
|
|||||||
|
/*
|
||||||
|
* copyright (c) 2006-2016 ARM Limited
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software without
|
||||||
|
* specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*******************************************************************************
|
||||||
|
* File: smm_mps2.h
|
||||||
|
* Release: Version 1.1
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __SMM_MPS2_H
|
||||||
|
#define __SMM_MPS2_H
|
||||||
|
|
||||||
|
#include "CMSDK_CM3.h" /* device specific header file */
|
||||||
|
|
||||||
|
#if defined ( __CC_ARM )
|
||||||
|
#pragma anon_unions
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
/* FPGA System Register declaration */
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__IO uint32_t LED; // Offset: 0x000 (R/W) LED connections
|
||||||
|
// [31:2] : Reserved
|
||||||
|
// [1:0] : LEDs
|
||||||
|
uint32_t RESERVED1[1];
|
||||||
|
__IO uint32_t BUTTON; // Offset: 0x008 (R/W) Buttons
|
||||||
|
// [31:2] : Reserved
|
||||||
|
// [1:0] : Buttons
|
||||||
|
uint32_t RESERVED2[1];
|
||||||
|
__IO uint32_t CLK1HZ; // Offset: 0x010 (R/W) 1Hz up counter
|
||||||
|
__IO uint32_t CLK100HZ; // Offset: 0x014 (R/W) 100Hz up counter
|
||||||
|
__IO uint32_t COUNTER; // Offset: 0x018 (R/W) Cycle Up Counter
|
||||||
|
// Increments when 32-bit prescale counter reach zero
|
||||||
|
uint32_t RESERVED3[1];
|
||||||
|
__IO uint32_t PRESCALE; // Offset: 0x020 (R/W) Prescaler
|
||||||
|
// Bit[31:0] : reload value for prescale counter
|
||||||
|
__IO uint32_t PSCNTR; // Offset: 0x024 (R/W) 32-bit Prescale counter
|
||||||
|
// current value of the pre-scaler counter
|
||||||
|
// The Cycle Up Counter increment when the prescale down counter reach 0
|
||||||
|
// The pre-scaler counter is reloaded with PRESCALE after reaching 0.
|
||||||
|
uint32_t RESERVED4[9];
|
||||||
|
__IO uint32_t MISC; // Offset: 0x04C (R/W) Misc control */
|
||||||
|
// [31:10] : Reserved
|
||||||
|
// [9] : SHIELD_1_SPI_nCS
|
||||||
|
// [8] : SHIELD_0_SPI_nCS
|
||||||
|
// [7] : ADC_SPI_nCS
|
||||||
|
// [6] : CLCD_BL_CTRL
|
||||||
|
// [5] : CLCD_RD
|
||||||
|
// [4] : CLCD_RS
|
||||||
|
// [3] : CLCD_RESET
|
||||||
|
// [2] : RESERVED
|
||||||
|
// [1] : SPI_nSS
|
||||||
|
// [0] : CLCD_CS
|
||||||
|
} MPS2_FPGAIO_TypeDef;
|
||||||
|
|
||||||
|
// MISC register bit definitions
|
||||||
|
|
||||||
|
#define CLCD_CS_Pos 0
|
||||||
|
#define CLCD_CS_Msk (1UL<<CLCD_CS_Pos)
|
||||||
|
#define SPI_nSS_Pos 1
|
||||||
|
#define SPI_nSS_Msk (1UL<<SPI_nSS_Pos)
|
||||||
|
#define CLCD_RESET_Pos 3
|
||||||
|
#define CLCD_RESET_Msk (1UL<<CLCD_RESET_Pos)
|
||||||
|
#define CLCD_RS_Pos 4
|
||||||
|
#define CLCD_RS_Msk (1UL<<CLCD_RS_Pos)
|
||||||
|
#define CLCD_RD_Pos 5
|
||||||
|
#define CLCD_RD_Msk (1UL<<CLCD_RD_Pos)
|
||||||
|
#define CLCD_BL_Pos 6
|
||||||
|
#define CLCD_BL_Msk (1UL<<CLCD_BL_Pos)
|
||||||
|
#define ADC_nCS_Pos 7
|
||||||
|
#define ADC_nCS_Msk (1UL<<ADC_nCS_Pos)
|
||||||
|
#define SHIELD_0_nCS_Pos 8
|
||||||
|
#define SHIELD_0_nCS_Msk (1UL<<SHIELD_0_nCS_Pos)
|
||||||
|
#define SHIELD_1_nCS_Pos 9
|
||||||
|
#define SHIELD_1_nCS_Msk (1UL<<SHIELD_1_nCS_Pos)
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
/* SCC Register declaration */
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
|
typedef struct //
|
||||||
|
{
|
||||||
|
__IO uint32_t CFG_REG0; // Offset: 0x000 (R/W) Remaps block RAM to ZBT
|
||||||
|
// [31:1] : Reserved
|
||||||
|
// [0] 1 : REMAP BlockRam to ZBT
|
||||||
|
__IO uint32_t LEDS; // Offset: 0x004 (R/W) Controls the MCC user LEDs
|
||||||
|
// [31:8] : Reserved
|
||||||
|
// [7:0] : MCC LEDs
|
||||||
|
uint32_t RESERVED0[1];
|
||||||
|
__I uint32_t SWITCHES; // Offset: 0x00C (R/ ) Denotes the state of the MCC user switches
|
||||||
|
// [31:8] : Reserved
|
||||||
|
// [7:0] : These bits indicate state of the MCC switches
|
||||||
|
__I uint32_t CFG_REG4; // Offset: 0x010 (R/ ) Denotes the board revision
|
||||||
|
// [31:4] : Reserved
|
||||||
|
// [3:0] : Used by the MCC to pass PCB revision. 0 = A 1 = B
|
||||||
|
uint32_t RESERVED1[35];
|
||||||
|
__IO uint32_t SYS_CFGDATA_RTN; // Offset: 0x0A0 (R/W) User data register
|
||||||
|
// [31:0] : Data
|
||||||
|
__IO uint32_t SYS_CFGDATA_OUT; // Offset: 0x0A4 (R/W) User data register
|
||||||
|
// [31:0] : Data
|
||||||
|
__IO uint32_t SYS_CFGCTRL; // Offset: 0x0A8 (R/W) Control register
|
||||||
|
// [31] : Start (generates interrupt on write to this bit)
|
||||||
|
// [30] : R/W access
|
||||||
|
// [29:26] : Reserved
|
||||||
|
// [25:20] : Function value
|
||||||
|
// [19:12] : Reserved
|
||||||
|
// [11:0] : Device (value of 0/1/2 for supported clocks)
|
||||||
|
__IO uint32_t SYS_CFGSTAT; // Offset: 0x0AC (R/W) Contains status information
|
||||||
|
// [31:2] : Reserved
|
||||||
|
// [1] : Error
|
||||||
|
// [0] : Complete
|
||||||
|
__IO uint32_t RESERVED2[20];
|
||||||
|
__IO uint32_t SCC_DLL; // Offset: 0x100 (R/W) DLL Lock Register
|
||||||
|
// [31:24] : DLL LOCK MASK[7:0] - Indicate if the DLL locked is masked
|
||||||
|
// [23:16] : DLL LOCK MASK[7:0] - Indicate if the DLLs are locked or unlocked
|
||||||
|
// [15:1] : Reserved
|
||||||
|
// [0] : This bit indicates if all enabled DLLs are locked
|
||||||
|
uint32_t RESERVED3[957];
|
||||||
|
__I uint32_t SCC_AID; // Offset: 0xFF8 (R/ ) SCC AID Register
|
||||||
|
// [31:24] : FPGA build number
|
||||||
|
// [23:20] : V2M-MPS2 target board revision (A = 0, B = 1)
|
||||||
|
// [19:11] : Reserved
|
||||||
|
// [10] : if “1” SCC_SW register has been implemented
|
||||||
|
// [9] : if “1” SCC_LED register has been implemented
|
||||||
|
// [8] : if “1” DLL lock register has been implemented
|
||||||
|
// [7:0] : number of SCC configuration register
|
||||||
|
__I uint32_t SCC_ID; // Offset: 0xFFC (R/ ) Contains information about the FPGA image
|
||||||
|
// [31:24] : Implementer ID: 0x41 = ARM
|
||||||
|
// [23:20] : Application note IP variant number
|
||||||
|
// [19:16] : IP Architecture: 0x4 =AHB
|
||||||
|
// [15:4] : Primary part number: 386 = AN386
|
||||||
|
// [3:0] : Application note IP revision number
|
||||||
|
} MPS2_SCC_TypeDef;
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
/* SSP Peripheral declaration */
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
|
typedef struct // Document DDI0194G_ssp_pl022_r1p3_trm.pdf
|
||||||
|
{
|
||||||
|
__IO uint32_t CR0; // Offset: 0x000 (R/W) Control register 0
|
||||||
|
// [31:16] : Reserved
|
||||||
|
// [15:8] : Serial clock rate
|
||||||
|
// [7] : SSPCLKOUT phase, applicable to Motorola SPI frame format only
|
||||||
|
// [6] : SSPCLKOUT polarity, applicable to Motorola SPI frame format only
|
||||||
|
// [5:4] : Frame format
|
||||||
|
// [3:0] : Data Size Select
|
||||||
|
__IO uint32_t CR1; // Offset: 0x004 (R/W) Control register 1
|
||||||
|
// [31:4] : Reserved
|
||||||
|
// [3] : Slave-mode output disable
|
||||||
|
// [2] : Master or slave mode select
|
||||||
|
// [1] : Synchronous serial port enable
|
||||||
|
// [0] : Loop back mode
|
||||||
|
__IO uint32_t DR; // Offset: 0x008 (R/W) Data register
|
||||||
|
// [31:16] : Reserved
|
||||||
|
// [15:0] : Transmit/Receive FIFO
|
||||||
|
__I uint32_t SR; // Offset: 0x00C (R/ ) Status register
|
||||||
|
// [31:5] : Reserved
|
||||||
|
// [4] : PrimeCell SSP busy flag
|
||||||
|
// [3] : Receive FIFO full
|
||||||
|
// [2] : Receive FIFO not empty
|
||||||
|
// [1] : Transmit FIFO not full
|
||||||
|
// [0] : Transmit FIFO empty
|
||||||
|
__IO uint32_t CPSR; // Offset: 0x010 (R/W) Clock prescale register
|
||||||
|
// [31:8] : Reserved
|
||||||
|
// [8:0] : Clock prescale divisor
|
||||||
|
__IO uint32_t IMSC; // Offset: 0x014 (R/W) Interrupt mask set or clear register
|
||||||
|
// [31:4] : Reserved
|
||||||
|
// [3] : Transmit FIFO interrupt mask
|
||||||
|
// [2] : Receive FIFO interrupt mask
|
||||||
|
// [1] : Receive timeout interrupt mask
|
||||||
|
// [0] : Receive overrun interrupt mask
|
||||||
|
__I uint32_t RIS; // Offset: 0x018 (R/ ) Raw interrupt status register
|
||||||
|
// [31:4] : Reserved
|
||||||
|
// [3] : raw interrupt state, prior to masking, of the SSPTXINTR interrupt
|
||||||
|
// [2] : raw interrupt state, prior to masking, of the SSPRXINTR interrupt
|
||||||
|
// [1] : raw interrupt state, prior to masking, of the SSPRTINTR interrupt
|
||||||
|
// [0] : raw interrupt state, prior to masking, of the SSPRORINTR interrupt
|
||||||
|
__I uint32_t MIS; // Offset: 0x01C (R/ ) Masked interrupt status register
|
||||||
|
// [31:4] : Reserved
|
||||||
|
// [3] : transmit FIFO masked interrupt state, after masking, of the SSPTXINTR interrupt
|
||||||
|
// [2] : receive FIFO masked interrupt state, after masking, of the SSPRXINTR interrupt
|
||||||
|
// [1] : receive timeout masked interrupt state, after masking, of the SSPRTINTR interrupt
|
||||||
|
// [0] : receive over run masked interrupt status, after masking, of the SSPRORINTR interrupt
|
||||||
|
__O uint32_t ICR; // Offset: 0x020 ( /W) Interrupt clear register
|
||||||
|
// [31:2] : Reserved
|
||||||
|
// [1] : Clears the SSPRTINTR interrupt
|
||||||
|
// [0] : Clears the SSPRORINTR interrupt
|
||||||
|
__IO uint32_t DMACR; // Offset: 0x024 (R/W) DMA control register
|
||||||
|
// [31:2] : Reserved
|
||||||
|
// [1] : Transmit DMA Enable
|
||||||
|
// [0] : Receive DMA Enable
|
||||||
|
} MPS2_SSP_TypeDef;
|
||||||
|
|
||||||
|
|
||||||
|
// SSP_CR0 Control register 0
|
||||||
|
#define SSP_CR0_DSS_Pos 0 // Data Size Select
|
||||||
|
#define SSP_CR0_DSS_Msk (0xF<<SSP_CR0_DSS_Pos)
|
||||||
|
#define SSP_CR0_FRF_Pos 4 // Frame Format Select
|
||||||
|
#define SSP_CR0_FRF_Msk (3UL<<SSP_CR0_FRM_Pos)
|
||||||
|
#define SSP_CR0_SPO_Pos 6 // SSPCLKOUT polarity
|
||||||
|
#define SSP_CR0_SPO_Msk (1UL<<SSP_CR0_SPO_Pos)
|
||||||
|
#define SSP_CR0_SPH_Pos 7 // SSPCLKOUT phase
|
||||||
|
#define SSP_CR0_SPH_Msk (1UL<<SSP_CR0_SPH_Pos)
|
||||||
|
#define SSP_CR0_SCR_Pos 8 // Serial Clock Rate (divide)
|
||||||
|
#define SSP_CR0_SCR_Msk (0xFF<<SSP_CR0_SCR_Pos)
|
||||||
|
|
||||||
|
#define SSP_CR0_SCR_DFLT 0x0300 // Serial Clock Rate (divide), default set at 3
|
||||||
|
#define SSP_CR0_FRF_MOT 0x0000 // Frame format, Motorola
|
||||||
|
#define SSP_CR0_DSS_8 0x0007 // Data packet size, 8bits
|
||||||
|
#define SSP_CR0_DSS_16 0x000F // Data packet size, 16bits
|
||||||
|
|
||||||
|
// SSP_CR1 Control register 1
|
||||||
|
#define SSP_CR1_LBM_Pos 0 // Loop Back Mode
|
||||||
|
#define SSP_CR1_LBM_Msk (1UL<<SSP_CR1_LBM_Pos)
|
||||||
|
#define SSP_CR1_SSE_Pos 1 // Serial port enable
|
||||||
|
#define SSP_CR1_SSE_Msk (1UL<<SSP_CR1_SSE_Pos)
|
||||||
|
#define SSP_CR1_MS_Pos 2 // Master or Slave mode
|
||||||
|
#define SSP_CR1_MS_Msk (1UL<<SSP_CR1_MS_Pos)
|
||||||
|
#define SSP_CR1_SOD_Pos 3 // Slave Output mode Disable
|
||||||
|
#define SSP_CR1_SOD_Msk (1UL<<SSP_CR1_SOD_Pos)
|
||||||
|
|
||||||
|
// SSP_SR Status register
|
||||||
|
#define SSP_SR_TFE_Pos 0 // Transmit FIFO empty
|
||||||
|
#define SSP_SR_TFE_Msk (1UL<<SSP_SR_TFE_Pos)
|
||||||
|
#define SSP_SR_TNF_Pos 1 // Transmit FIFO not full
|
||||||
|
#define SSP_SR_TNF_Msk (1UL<<SSP_SR_TNF_Pos)
|
||||||
|
#define SSP_SR_RNE_Pos 2 // Receive FIFO not empty
|
||||||
|
#define SSP_SR_RNE_Msk (1UL<<SSP_SR_RNE_Pos)
|
||||||
|
#define SSP_SR_RFF_Pos 3 // Receive FIFO full
|
||||||
|
#define SSP_SR_RFF_Msk (1UL<<SSP_SR_RFF_Pos)
|
||||||
|
#define SSP_SR_BSY_Pos 4 // Busy
|
||||||
|
#define SSP_SR_BSY_Msk (1UL<<SSP_SR_BSY_Pos)
|
||||||
|
|
||||||
|
// SSP_CPSR Clock prescale register
|
||||||
|
#define SSP_CPSR_CPD_Pos 0 // Clock prescale divisor
|
||||||
|
#define SSP_CPSR_CPD_Msk (0xFF<<SSP_CPSR_CDP_Pos)
|
||||||
|
|
||||||
|
#define SSP_CPSR_DFLT 0x0008 // Clock prescale (use with SCR), default set at 8
|
||||||
|
|
||||||
|
// SSPIMSC Interrupt mask set and clear register
|
||||||
|
#define SSP_IMSC_RORIM_Pos 0 // Receive overrun not Masked
|
||||||
|
#define SSP_IMSC_RORIM_Msk (1UL<<SSP_IMSC_RORIM_Pos)
|
||||||
|
#define SSP_IMSC_RTIM_Pos 1 // Receive timeout not Masked
|
||||||
|
#define SSP_IMSC_RTIM_Msk (1UL<<SSP_IMSC_RTIM_Pos)
|
||||||
|
#define SSP_IMSC_RXIM_Pos 2 // Receive FIFO not Masked
|
||||||
|
#define SSP_IMSC_RXIM_Msk (1UL<<SSP_IMSC_RXIM_Pos)
|
||||||
|
#define SSP_IMSC_TXIM_Pos 3 // Transmit FIFO not Masked
|
||||||
|
#define SSP_IMSC_TXIM_Msk (1UL<<SSP_IMSC_TXIM_Pos)
|
||||||
|
|
||||||
|
// SSPRIS Raw interrupt status register
|
||||||
|
#define SSP_RIS_RORRIS_Pos 0 // Raw Overrun interrupt flag
|
||||||
|
#define SSP_RIS_RORRIS_Msk (1UL<<SSP_RIS_RORRIS_Pos)
|
||||||
|
#define SSP_RIS_RTRIS_Pos 1 // Raw Timemout interrupt flag
|
||||||
|
#define SSP_RIS_RTRIS_Msk (1UL<<SSP_RIS_RTRIS_Pos)
|
||||||
|
#define SSP_RIS_RXRIS_Pos 2 // Raw Receive interrupt flag
|
||||||
|
#define SSP_RIS_RXRIS_Msk (1UL<<SSP_RIS_RXRIS_Pos)
|
||||||
|
#define SSP_RIS_TXRIS_Pos 3 // Raw Transmit interrupt flag
|
||||||
|
#define SSP_RIS_TXRIS_Msk (1UL<<SSP_RIS_TXRIS_Pos)
|
||||||
|
|
||||||
|
// SSPMIS Masked interrupt status register
|
||||||
|
#define SSP_MIS_RORMIS_Pos 0 // Masked Overrun interrupt flag
|
||||||
|
#define SSP_MIS_RORMIS_Msk (1UL<<SSP_MIS_RORMIS_Pos)
|
||||||
|
#define SSP_MIS_RTMIS_Pos 1 // Masked Timemout interrupt flag
|
||||||
|
#define SSP_MIS_RTMIS_Msk (1UL<<SSP_MIS_RTMIS_Pos)
|
||||||
|
#define SSP_MIS_RXMIS_Pos 2 // Masked Receive interrupt flag
|
||||||
|
#define SSP_MIS_RXMIS_Msk (1UL<<SSP_MIS_RXMIS_Pos)
|
||||||
|
#define SSP_MIS_TXMIS_Pos 3 // Masked Transmit interrupt flag
|
||||||
|
#define SSP_MIS_TXMIS_Msk (1UL<<SSP_MIS_TXMIS_Pos)
|
||||||
|
|
||||||
|
// SSPICR Interrupt clear register
|
||||||
|
#define SSP_ICR_RORIC_Pos 0 // Clears Overrun interrupt flag
|
||||||
|
#define SSP_ICR_RORIC_Msk (1UL<<SSP_ICR_RORIC_Pos)
|
||||||
|
#define SSP_ICR_RTIC_Pos 1 // Clears Timemout interrupt flag
|
||||||
|
#define SSP_ICR_RTIC_Msk (1UL<<SSP_ICR_RTIC_Pos)
|
||||||
|
|
||||||
|
// SSPDMACR DMA control register
|
||||||
|
#define SSP_DMACR_RXDMAE_Pos 0 // Enable Receive FIFO DMA
|
||||||
|
#define SSP_DMACR_RXDMAE_Msk (1UL<<SSP_DMACR_RXDMAE_Pos)
|
||||||
|
#define SSP_DMACR_TXDMAE_Pos 1 // Enable Transmit FIFO DMA
|
||||||
|
#define SSP_DMACR_TXDMAE_Msk (1UL<<SSP_DMACR_TXDMAE_Pos)
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
/* Audio and Touch Screen (I2C) Peripheral declaration */
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
union {
|
||||||
|
__O uint32_t CONTROLS; // Offset: 0x000 CONTROL Set Register ( /W)
|
||||||
|
__I uint32_t CONTROL; // Offset: 0x000 CONTROL Status Register (R/ )
|
||||||
|
};
|
||||||
|
__O uint32_t CONTROLC; // Offset: 0x004 CONTROL Clear Register ( /W)
|
||||||
|
} MPS2_I2C_TypeDef;
|
||||||
|
|
||||||
|
#define SDA 1 << 1
|
||||||
|
#define SCL 1 << 0
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
/* Audio I2S Peripheral declaration */
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/*!< Offset: 0x000 CONTROL Register (R/W) */
|
||||||
|
__IO uint32_t CONTROL; // <h> CONTROL </h>
|
||||||
|
// <o.0> TX Enable
|
||||||
|
// <0=> TX disabled
|
||||||
|
// <1=> TX enabled
|
||||||
|
// <o.1> TX IRQ Enable
|
||||||
|
// <0=> TX IRQ disabled
|
||||||
|
// <1=> TX IRQ enabled
|
||||||
|
// <o.2> RX Enable
|
||||||
|
// <0=> RX disabled
|
||||||
|
// <1=> RX enabled
|
||||||
|
// <o.3> RX IRQ Enable
|
||||||
|
// <0=> RX IRQ disabled
|
||||||
|
// <1=> RX IRQ enabled
|
||||||
|
// <o.10..8> TX Buffer Water Level
|
||||||
|
// <0=> / IRQ triggers when any space available
|
||||||
|
// <1=> / IRQ triggers when more than 1 space available
|
||||||
|
// <2=> / IRQ triggers when more than 2 space available
|
||||||
|
// <3=> / IRQ triggers when more than 3 space available
|
||||||
|
// <4=> Undefined!
|
||||||
|
// <5=> Undefined!
|
||||||
|
// <6=> Undefined!
|
||||||
|
// <7=> Undefined!
|
||||||
|
// <o.14..12> RX Buffer Water Level
|
||||||
|
// <0=> Undefined!
|
||||||
|
// <1=> / IRQ triggers when less than 1 space available
|
||||||
|
// <2=> / IRQ triggers when less than 2 space available
|
||||||
|
// <3=> / IRQ triggers when less than 3 space available
|
||||||
|
// <4=> / IRQ triggers when less than 4 space available
|
||||||
|
// <5=> Undefined!
|
||||||
|
// <6=> Undefined!
|
||||||
|
// <7=> Undefined!
|
||||||
|
// <o.16> FIFO reset
|
||||||
|
// <0=> Normal operation
|
||||||
|
// <1=> FIFO reset
|
||||||
|
// <o.17> Audio Codec reset
|
||||||
|
// <0=> Normal operation
|
||||||
|
// <1=> Assert audio Codec reset
|
||||||
|
/*!< Offset: 0x004 STATUS Register (R/ ) */
|
||||||
|
__I uint32_t STATUS; // <h> STATUS </h>
|
||||||
|
// <o.0> TX Buffer alert
|
||||||
|
// <0=> TX buffer don't need service yet
|
||||||
|
// <1=> TX buffer need service
|
||||||
|
// <o.1> RX Buffer alert
|
||||||
|
// <0=> RX buffer don't need service yet
|
||||||
|
// <1=> RX buffer need service
|
||||||
|
// <o.2> TX Buffer Empty
|
||||||
|
// <0=> TX buffer have data
|
||||||
|
// <1=> TX buffer empty
|
||||||
|
// <o.3> TX Buffer Full
|
||||||
|
// <0=> TX buffer not full
|
||||||
|
// <1=> TX buffer full
|
||||||
|
// <o.4> RX Buffer Empty
|
||||||
|
// <0=> RX buffer have data
|
||||||
|
// <1=> RX buffer empty
|
||||||
|
// <o.5> RX Buffer Full
|
||||||
|
// <0=> RX buffer not full
|
||||||
|
// <1=> RX buffer full
|
||||||
|
union {
|
||||||
|
/*!< Offset: 0x008 Error Status Register (R/ ) */
|
||||||
|
__I uint32_t ERROR; // <h> ERROR </h>
|
||||||
|
// <o.0> TX error
|
||||||
|
// <0=> Okay
|
||||||
|
// <1=> TX overrun/underrun
|
||||||
|
// <o.1> RX error
|
||||||
|
// <0=> Okay
|
||||||
|
// <1=> RX overrun/underrun
|
||||||
|
/*!< Offset: 0x008 Error Clear Register ( /W) */
|
||||||
|
__O uint32_t ERRORCLR; // <h> ERRORCLR </h>
|
||||||
|
// <o.0> TX error
|
||||||
|
// <0=> Okay
|
||||||
|
// <1=> Clear TX error
|
||||||
|
// <o.1> RX error
|
||||||
|
// <0=> Okay
|
||||||
|
// <1=> Clear RX error
|
||||||
|
};
|
||||||
|
/*!< Offset: 0x00C Divide ratio Register (R/W) */
|
||||||
|
__IO uint32_t DIVIDE; // <h> Divide ratio for Left/Right clock </h>
|
||||||
|
// <o.9..0> TX error (default 0x80)
|
||||||
|
/*!< Offset: 0x010 Transmit Buffer ( /W) */
|
||||||
|
__O uint32_t TXBUF; // <h> Transmit buffer </h>
|
||||||
|
// <o.15..0> Right channel
|
||||||
|
// <o.31..16> Left channel
|
||||||
|
/*!< Offset: 0x014 Receive Buffer (R/ ) */
|
||||||
|
__I uint32_t RXBUF; // <h> Receive buffer </h>
|
||||||
|
// <o.15..0> Right channel
|
||||||
|
// <o.31..16> Left channel
|
||||||
|
uint32_t RESERVED1[186];
|
||||||
|
__IO uint32_t ITCR; // <h> Integration Test Control Register </h>
|
||||||
|
// <o.0> ITEN
|
||||||
|
// <0=> Normal operation
|
||||||
|
// <1=> Integration Test mode enable
|
||||||
|
__O uint32_t ITIP1; // <h> Integration Test Input Register 1</h>
|
||||||
|
// <o.0> SDIN
|
||||||
|
__O uint32_t ITOP1; // <h> Integration Test Output Register 1</h>
|
||||||
|
// <o.0> SDOUT
|
||||||
|
// <o.1> SCLK
|
||||||
|
// <o.2> LRCK
|
||||||
|
// <o.3> IRQOUT
|
||||||
|
} MPS2_I2S_TypeDef;
|
||||||
|
|
||||||
|
#define I2S_CONTROL_TXEN_Pos 0
|
||||||
|
#define I2S_CONTROL_TXEN_Msk (1UL<<I2S_CONTROL_TXEN_Pos)
|
||||||
|
|
||||||
|
#define I2S_CONTROL_TXIRQEN_Pos 1
|
||||||
|
#define I2S_CONTROL_TXIRQEN_Msk (1UL<<I2S_CONTROL_TXIRQEN_Pos)
|
||||||
|
|
||||||
|
#define I2S_CONTROL_RXEN_Pos 2
|
||||||
|
#define I2S_CONTROL_RXEN_Msk (1UL<<I2S_CONTROL_RXEN_Pos)
|
||||||
|
|
||||||
|
#define I2S_CONTROL_RXIRQEN_Pos 3
|
||||||
|
#define I2S_CONTROL_RXIRQEN_Msk (1UL<<I2S_CONTROL_RXIRQEN_Pos)
|
||||||
|
|
||||||
|
#define I2S_CONTROL_TXWLVL_Pos 8
|
||||||
|
#define I2S_CONTROL_TXWLVL_Msk (7UL<<I2S_CONTROL_TXWLVL_Pos)
|
||||||
|
|
||||||
|
#define I2S_CONTROL_RXWLVL_Pos 12
|
||||||
|
#define I2S_CONTROL_RXWLVL_Msk (7UL<<I2S_CONTROL_RXWLVL_Pos)
|
||||||
|
/* FIFO reset*/
|
||||||
|
#define I2S_CONTROL_FIFORST_Pos 16
|
||||||
|
#define I2S_CONTROL_FIFORST_Msk (1UL<<I2S_CONTROL_FIFORST_Pos)
|
||||||
|
/* Codec reset*/
|
||||||
|
#define I2S_CONTROL_CODECRST_Pos 17
|
||||||
|
#define I2S_CONTROL_CODECRST_Msk (1UL<<I2S_CONTROL_CODECRST_Pos)
|
||||||
|
|
||||||
|
#define I2S_STATUS_TXIRQ_Pos 0
|
||||||
|
#define I2S_STATUS_TXIRQ_Msk (1UL<<I2S_STATUS_TXIRQ_Pos)
|
||||||
|
|
||||||
|
#define I2S_STATUS_RXIRQ_Pos 1
|
||||||
|
#define I2S_STATUS_RXIRQ_Msk (1UL<<I2S_STATUS_RXIRQ_Pos)
|
||||||
|
|
||||||
|
#define I2S_STATUS_TXEmpty_Pos 2
|
||||||
|
#define I2S_STATUS_TXEmpty_Msk (1UL<<I2S_STATUS_TXEmpty_Pos)
|
||||||
|
|
||||||
|
#define I2S_STATUS_TXFull_Pos 3
|
||||||
|
#define I2S_STATUS_TXFull_Msk (1UL<<I2S_STATUS_TXFull_Pos)
|
||||||
|
|
||||||
|
#define I2S_STATUS_RXEmpty_Pos 4
|
||||||
|
#define I2S_STATUS_RXEmpty_Msk (1UL<<I2S_STATUS_RXEmpty_Pos)
|
||||||
|
|
||||||
|
#define I2S_STATUS_RXFull_Pos 5
|
||||||
|
#define I2S_STATUS_RXFull_Msk (1UL<<I2S_STATUS_RXFull_Pos)
|
||||||
|
|
||||||
|
#define I2S_ERROR_TXERR_Pos 0
|
||||||
|
#define I2S_ERROR_TXERR_Msk (1UL<<I2S_ERROR_TXERR_Pos)
|
||||||
|
|
||||||
|
#define I2S_ERROR_RXERR_Pos 1
|
||||||
|
#define I2S_ERROR_RXERR_Msk (1UL<<I2S_ERROR_RXERR_Pos)
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
/* SMSC9220 Register Definitions */
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
|
typedef struct // SMSC LAN9220
|
||||||
|
{
|
||||||
|
__I uint32_t RX_DATA_PORT; // Receive FIFO Ports (offset 0x0)
|
||||||
|
uint32_t RESERVED1[0x7];
|
||||||
|
__O uint32_t TX_DATA_PORT; // Transmit FIFO Ports (offset 0x20)
|
||||||
|
uint32_t RESERVED2[0x7];
|
||||||
|
|
||||||
|
__I uint32_t RX_STAT_PORT; // Receive FIFO status port (offset 0x40)
|
||||||
|
__I uint32_t RX_STAT_PEEK; // Receive FIFO status peek (offset 0x44)
|
||||||
|
__I uint32_t TX_STAT_PORT; // Transmit FIFO status port (offset 0x48)
|
||||||
|
__I uint32_t TX_STAT_PEEK; // Transmit FIFO status peek (offset 0x4C)
|
||||||
|
|
||||||
|
__I uint32_t ID_REV; // Chip ID and Revision (offset 0x50)
|
||||||
|
__IO uint32_t IRQ_CFG; // Main Interrupt Configuration (offset 0x54)
|
||||||
|
__IO uint32_t INT_STS; // Interrupt Status (offset 0x58)
|
||||||
|
__IO uint32_t INT_EN; // Interrupt Enable Register (offset 0x5C)
|
||||||
|
uint32_t RESERVED3; // Reserved for future use (offset 0x60)
|
||||||
|
__I uint32_t BYTE_TEST; // Read-only byte order testing register 87654321h (offset 0x64)
|
||||||
|
__IO uint32_t FIFO_INT; // FIFO Level Interrupts (offset 0x68)
|
||||||
|
__IO uint32_t RX_CFG; // Receive Configuration (offset 0x6C)
|
||||||
|
__IO uint32_t TX_CFG; // Transmit Configuration (offset 0x70)
|
||||||
|
__IO uint32_t HW_CFG; // Hardware Configuration (offset 0x74)
|
||||||
|
__IO uint32_t RX_DP_CTL; // RX Datapath Control (offset 0x78)
|
||||||
|
__I uint32_t RX_FIFO_INF; // Receive FIFO Information (offset 0x7C)
|
||||||
|
__I uint32_t TX_FIFO_INF; // Transmit FIFO Information (offset 0x80)
|
||||||
|
__IO uint32_t PMT_CTRL; // Power Management Control (offset 0x84)
|
||||||
|
__IO uint32_t GPIO_CFG; // General Purpose IO Configuration (offset 0x88)
|
||||||
|
__IO uint32_t GPT_CFG; // General Purpose Timer Configuration (offset 0x8C)
|
||||||
|
__I uint32_t GPT_CNT; // General Purpose Timer Count (offset 0x90)
|
||||||
|
uint32_t RESERVED4; // Reserved for future use (offset 0x94)
|
||||||
|
__IO uint32_t ENDIAN; // WORD SWAP Register (offset 0x98)
|
||||||
|
__I uint32_t FREE_RUN; // Free Run Counter (offset 0x9C)
|
||||||
|
__I uint32_t RX_DROP; // RX Dropped Frames Counter (offset 0xA0)
|
||||||
|
__IO uint32_t MAC_CSR_CMD; // MAC CSR Synchronizer Command (offset 0xA4)
|
||||||
|
__IO uint32_t MAC_CSR_DATA; // MAC CSR Synchronizer Data (offset 0xA8)
|
||||||
|
__IO uint32_t AFC_CFG; // Automatic Flow Control Configuration (offset 0xAC)
|
||||||
|
__IO uint32_t E2P_CMD; // EEPROM Command (offset 0xB0)
|
||||||
|
__IO uint32_t E2P_DATA; // EEPROM Data (offset 0xB4)
|
||||||
|
|
||||||
|
} SMSC9220_TypeDef;
|
||||||
|
|
||||||
|
// SMSC9220 MAC Registers Indices
|
||||||
|
#define SMSC9220_MAC_CR 0x1
|
||||||
|
#define SMSC9220_MAC_ADDRH 0x2
|
||||||
|
#define SMSC9220_MAC_ADDRL 0x3
|
||||||
|
#define SMSC9220_MAC_HASHH 0x4
|
||||||
|
#define SMSC9220_MAC_HASHL 0x5
|
||||||
|
#define SMSC9220_MAC_MII_ACC 0x6
|
||||||
|
#define SMSC9220_MAC_MII_DATA 0x7
|
||||||
|
#define SMSC9220_MAC_FLOW 0x8
|
||||||
|
#define SMSC9220_MAC_VLAN1 0x9
|
||||||
|
#define SMSC9220_MAC_VLAN2 0xA
|
||||||
|
#define SMSC9220_MAC_WUFF 0xB
|
||||||
|
#define SMSC9220_MAC_WUCSR 0xC
|
||||||
|
|
||||||
|
// SMSC9220 PHY Registers Indices
|
||||||
|
#define SMSC9220_PHY_BCONTROL 0x0
|
||||||
|
#define SMSC9220_PHY_BSTATUS 0x1
|
||||||
|
#define SMSC9220_PHY_ID1 0x2
|
||||||
|
#define SMSC9220_PHY_ID2 0x3
|
||||||
|
#define SMSC9220_PHY_ANEG_ADV 0x4
|
||||||
|
#define SMSC9220_PHY_ANEG_LPA 0x5
|
||||||
|
#define SMSC9220_PHY_ANEG_EXP 0x6
|
||||||
|
#define SMSC9220_PHY_MCONTROL 0x17
|
||||||
|
#define SMSC9220_PHY_MSTATUS 0x18
|
||||||
|
#define SMSC9220_PHY_CSINDICATE 0x27
|
||||||
|
#define SMSC9220_PHY_INTSRC 0x29
|
||||||
|
#define SMSC9220_PHY_INTMASK 0x30
|
||||||
|
#define SMSC9220_PHY_CS 0x31
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
/* Peripheral memory map */
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
|
#define MPS2_SSP1_BASE (0x40020000ul) /* User SSP Base Address */
|
||||||
|
#define MPS2_SSP0_BASE (0x40021000ul) /* CLCD SSP Base Address */
|
||||||
|
#define MPS2_TSC_I2C_BASE (0x40022000ul) /* Touch Screen I2C Base Address */
|
||||||
|
#define MPS2_AAIC_I2C_BASE (0x40023000ul) /* Audio Interface I2C Base Address */
|
||||||
|
#define MPS2_AAIC_I2S_BASE (0x40024000ul) /* Audio Interface I2S Base Address */
|
||||||
|
#define MPS2_SSP2_BASE (0x40025000ul) /* adc SSP Base Address */
|
||||||
|
#define MPS2_SSP3_BASE (0x40026000ul) /* Shield 0 SSP Base Address */
|
||||||
|
#define MPS2_SSP4_BASE (0x40027000ul) /* Shield 1 SSP Base Address */
|
||||||
|
#define MPS2_FPGAIO_BASE (0x40028000ul) /* FPGAIO Base Address */
|
||||||
|
#define MPS2_SHIELD0_I2C_BASE (0x40029000ul) /* Shield 0 I2C Base Address */
|
||||||
|
#define MPS2_SHIELD1_I2C_BASE (0x4002A000ul) /* Shield 1 I2C Base Address */
|
||||||
|
#define MPS2_SCC_BASE (0x4002F000ul) /* SCC Base Address */
|
||||||
|
|
||||||
|
#ifdef CORTEX_M7
|
||||||
|
#define SMSC9220_BASE (0xA0000000ul) /* Ethernet SMSC9220 Base Address */
|
||||||
|
#else
|
||||||
|
#define SMSC9220_BASE (0x40200000ul) /* Ethernet SMSC9220 Base Address */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MPS2_VGA_TEXT_BUFFER (0x41000000ul) /* VGA Text Buffer Address */
|
||||||
|
#define MPS2_VGA_BUFFER (0x41100000ul) /* VGA Buffer Base Address */
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
/* Peripheral declaration */
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
|
#define SMSC9220 ((SMSC9220_TypeDef *) SMSC9220_BASE )
|
||||||
|
#define MPS2_TS_I2C ((MPS2_I2C_TypeDef *) MPS2_TSC_I2C_BASE )
|
||||||
|
#define MPS2_AAIC_I2C ((MPS2_I2C_TypeDef *) MPS2_AAIC_I2C_BASE )
|
||||||
|
#define MPS2_SHIELD0_I2C ((MPS2_I2C_TypeDef *) MPS2_SHIELD0_I2C_BASE )
|
||||||
|
#define MPS2_SHIELD1_I2C ((MPS2_I2C_TypeDef *) MPS2_SHIELD1_I2C_BASE )
|
||||||
|
#define MPS2_AAIC_I2S ((MPS2_I2S_TypeDef *) MPS2_AAIC_I2S_BASE )
|
||||||
|
#define MPS2_FPGAIO ((MPS2_FPGAIO_TypeDef *) MPS2_FPGAIO_BASE )
|
||||||
|
#define MPS2_SCC ((MPS2_SCC_TypeDef *) MPS2_SCC_BASE )
|
||||||
|
#define MPS2_SSP0 ((MPS2_SSP_TypeDef *) MPS2_SSP0_BASE )
|
||||||
|
#define MPS2_SSP1 ((MPS2_SSP_TypeDef *) MPS2_SSP1_BASE )
|
||||||
|
#define MPS2_SSP2 ((MPS2_SSP_TypeDef *) MPS2_SSP2_BASE )
|
||||||
|
#define MPS2_SSP3 ((MPS2_SSP_TypeDef *) MPS2_SSP3_BASE )
|
||||||
|
#define MPS2_SSP4 ((MPS2_SSP_TypeDef *) MPS2_SSP4_BASE )
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
/* General Function Definitions */
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
/* General MACRO Definitions */
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __SMM_MPS2_H */
|
41
FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC/CMSIS/cmsis.h
Normal file
41
FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC/CMSIS/cmsis.h
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/* MPS2 CMSIS Library
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006-2016 ARM Limited
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software without
|
||||||
|
* specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*******************************************************************************
|
||||||
|
* A generic CMSIS include header, pulling in MPS2 specifics
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
#ifndef MBED_CMSIS_H
|
||||||
|
#define MBED_CMSIS_H
|
||||||
|
|
||||||
|
#include "SMM_MPS2.h"
|
||||||
|
|
||||||
|
#endif
|
283
FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC/CMSIS/cmsis_compiler.h
Normal file
283
FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC/CMSIS/cmsis_compiler.h
Normal file
@ -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 */
|
||||||
|
|
2173
FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC/CMSIS/cmsis_gcc.h
Normal file
2173
FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC/CMSIS/cmsis_gcc.h
Normal file
File diff suppressed because it is too large
Load Diff
39
FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC/CMSIS/cmsis_version.h
Normal file
39
FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC/CMSIS/cmsis_version.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/**************************************************************************//**
|
||||||
|
* @file cmsis_version.h
|
||||||
|
* @brief CMSIS Core(M) Version definitions
|
||||||
|
* @version V5.0.4
|
||||||
|
* @date 23. July 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 ( 4U) /*!< [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
|
1943
FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC/CMSIS/core_cm3.h
Normal file
1943
FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC/CMSIS/core_cm3.h
Normal file
File diff suppressed because it is too large
Load Diff
275
FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC/CMSIS/mpu_armv7.h
Normal file
275
FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC/CMSIS/mpu_armv7.h
Normal file
@ -0,0 +1,275 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file mpu_armv7.h
|
||||||
|
* @brief CMSIS MPU API for Armv7-M MPU
|
||||||
|
* @version V5.1.1
|
||||||
|
* @date 10. February 2020
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017-2020 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_ARMV7_H
|
||||||
|
#define ARM_MPU_ARMV7_H
|
||||||
|
|
||||||
|
#define ARM_MPU_REGION_SIZE_32B ((uint8_t)0x04U) ///!< MPU Region Size 32 Bytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_64B ((uint8_t)0x05U) ///!< MPU Region Size 64 Bytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_128B ((uint8_t)0x06U) ///!< MPU Region Size 128 Bytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_256B ((uint8_t)0x07U) ///!< MPU Region Size 256 Bytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_512B ((uint8_t)0x08U) ///!< MPU Region Size 512 Bytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_1KB ((uint8_t)0x09U) ///!< MPU Region Size 1 KByte
|
||||||
|
#define ARM_MPU_REGION_SIZE_2KB ((uint8_t)0x0AU) ///!< MPU Region Size 2 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_4KB ((uint8_t)0x0BU) ///!< MPU Region Size 4 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_8KB ((uint8_t)0x0CU) ///!< MPU Region Size 8 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_16KB ((uint8_t)0x0DU) ///!< MPU Region Size 16 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_32KB ((uint8_t)0x0EU) ///!< MPU Region Size 32 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_64KB ((uint8_t)0x0FU) ///!< MPU Region Size 64 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_128KB ((uint8_t)0x10U) ///!< MPU Region Size 128 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_256KB ((uint8_t)0x11U) ///!< MPU Region Size 256 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_512KB ((uint8_t)0x12U) ///!< MPU Region Size 512 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_1MB ((uint8_t)0x13U) ///!< MPU Region Size 1 MByte
|
||||||
|
#define ARM_MPU_REGION_SIZE_2MB ((uint8_t)0x14U) ///!< MPU Region Size 2 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_4MB ((uint8_t)0x15U) ///!< MPU Region Size 4 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_8MB ((uint8_t)0x16U) ///!< MPU Region Size 8 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_16MB ((uint8_t)0x17U) ///!< MPU Region Size 16 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_32MB ((uint8_t)0x18U) ///!< MPU Region Size 32 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_64MB ((uint8_t)0x19U) ///!< MPU Region Size 64 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_128MB ((uint8_t)0x1AU) ///!< MPU Region Size 128 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_256MB ((uint8_t)0x1BU) ///!< MPU Region Size 256 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_512MB ((uint8_t)0x1CU) ///!< MPU Region Size 512 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_1GB ((uint8_t)0x1DU) ///!< MPU Region Size 1 GByte
|
||||||
|
#define ARM_MPU_REGION_SIZE_2GB ((uint8_t)0x1EU) ///!< MPU Region Size 2 GBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_4GB ((uint8_t)0x1FU) ///!< MPU Region Size 4 GBytes
|
||||||
|
|
||||||
|
#define ARM_MPU_AP_NONE 0U ///!< MPU Access Permission no access
|
||||||
|
#define ARM_MPU_AP_PRIV 1U ///!< MPU Access Permission privileged access only
|
||||||
|
#define ARM_MPU_AP_URO 2U ///!< MPU Access Permission unprivileged access read-only
|
||||||
|
#define ARM_MPU_AP_FULL 3U ///!< MPU Access Permission full access
|
||||||
|
#define ARM_MPU_AP_PRO 5U ///!< MPU Access Permission privileged access read-only
|
||||||
|
#define ARM_MPU_AP_RO 6U ///!< MPU Access Permission read-only access
|
||||||
|
|
||||||
|
/** MPU Region Base Address Register Value
|
||||||
|
*
|
||||||
|
* \param Region The region to be configured, number 0 to 15.
|
||||||
|
* \param BaseAddress The base address for the region.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_RBAR(Region, BaseAddress) \
|
||||||
|
(((BaseAddress) & MPU_RBAR_ADDR_Msk) | \
|
||||||
|
((Region) & MPU_RBAR_REGION_Msk) | \
|
||||||
|
(MPU_RBAR_VALID_Msk))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Memory Access Attributes
|
||||||
|
*
|
||||||
|
* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral.
|
||||||
|
* \param IsShareable Region is shareable between multiple bus masters.
|
||||||
|
* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache.
|
||||||
|
* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable) \
|
||||||
|
((((TypeExtField) << MPU_RASR_TEX_Pos) & MPU_RASR_TEX_Msk) | \
|
||||||
|
(((IsShareable) << MPU_RASR_S_Pos) & MPU_RASR_S_Msk) | \
|
||||||
|
(((IsCacheable) << MPU_RASR_C_Pos) & MPU_RASR_C_Msk) | \
|
||||||
|
(((IsBufferable) << MPU_RASR_B_Pos) & MPU_RASR_B_Msk))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Region Attribute and Size Register Value
|
||||||
|
*
|
||||||
|
* \param DisableExec Instruction access disable bit, 1= disable instruction fetches.
|
||||||
|
* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode.
|
||||||
|
* \param AccessAttributes Memory access attribution, see \ref ARM_MPU_ACCESS_.
|
||||||
|
* \param SubRegionDisable Sub-region disable field.
|
||||||
|
* \param Size Region size of the region to be configured, for example 4K, 8K.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_RASR_EX(DisableExec, AccessPermission, AccessAttributes, SubRegionDisable, Size) \
|
||||||
|
((((DisableExec) << MPU_RASR_XN_Pos) & MPU_RASR_XN_Msk) | \
|
||||||
|
(((AccessPermission) << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk) | \
|
||||||
|
(((AccessAttributes) & (MPU_RASR_TEX_Msk | MPU_RASR_S_Msk | MPU_RASR_C_Msk | MPU_RASR_B_Msk))) | \
|
||||||
|
(((SubRegionDisable) << MPU_RASR_SRD_Pos) & MPU_RASR_SRD_Msk) | \
|
||||||
|
(((Size) << MPU_RASR_SIZE_Pos) & MPU_RASR_SIZE_Msk) | \
|
||||||
|
(((MPU_RASR_ENABLE_Msk))))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Region Attribute and Size Register Value
|
||||||
|
*
|
||||||
|
* \param DisableExec Instruction access disable bit, 1= disable instruction fetches.
|
||||||
|
* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode.
|
||||||
|
* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral.
|
||||||
|
* \param IsShareable Region is shareable between multiple bus masters.
|
||||||
|
* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache.
|
||||||
|
* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy.
|
||||||
|
* \param SubRegionDisable Sub-region disable field.
|
||||||
|
* \param Size Region size of the region to be configured, for example 4K, 8K.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable, SubRegionDisable, Size) \
|
||||||
|
ARM_MPU_RASR_EX(DisableExec, AccessPermission, ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable), SubRegionDisable, Size)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Memory Access Attribute for strongly ordered memory.
|
||||||
|
* - TEX: 000b
|
||||||
|
* - Shareable
|
||||||
|
* - Non-cacheable
|
||||||
|
* - Non-bufferable
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_ACCESS_ORDERED ARM_MPU_ACCESS_(0U, 1U, 0U, 0U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Memory Access Attribute for device memory.
|
||||||
|
* - TEX: 000b (if shareable) or 010b (if non-shareable)
|
||||||
|
* - Shareable or non-shareable
|
||||||
|
* - Non-cacheable
|
||||||
|
* - Bufferable (if shareable) or non-bufferable (if non-shareable)
|
||||||
|
*
|
||||||
|
* \param IsShareable Configures the device memory as shareable or non-shareable.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_ACCESS_DEVICE(IsShareable) ((IsShareable) ? ARM_MPU_ACCESS_(0U, 1U, 0U, 1U) : ARM_MPU_ACCESS_(2U, 0U, 0U, 0U))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Memory Access Attribute for normal memory.
|
||||||
|
* - TEX: 1BBb (reflecting outer cacheability rules)
|
||||||
|
* - Shareable or non-shareable
|
||||||
|
* - Cacheable or non-cacheable (reflecting inner cacheability rules)
|
||||||
|
* - Bufferable or non-bufferable (reflecting inner cacheability rules)
|
||||||
|
*
|
||||||
|
* \param OuterCp Configures the outer cache policy.
|
||||||
|
* \param InnerCp Configures the inner cache policy.
|
||||||
|
* \param IsShareable Configures the memory as shareable or non-shareable.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_ACCESS_NORMAL(OuterCp, InnerCp, IsShareable) ARM_MPU_ACCESS_((4U | (OuterCp)), IsShareable, ((InnerCp) >> 1U), ((InnerCp) & 1U))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Memory Access Attribute non-cacheable policy.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_CACHEP_NOCACHE 0U
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Memory Access Attribute write-back, write and read allocate policy.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_CACHEP_WB_WRA 1U
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Memory Access Attribute write-through, no write allocate policy.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_CACHEP_WT_NWA 2U
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Memory Access Attribute write-back, no write allocate policy.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_CACHEP_WB_NWA 3U
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Struct for a single MPU Region
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
uint32_t RBAR; //!< The region base address register value (RBAR)
|
||||||
|
uint32_t RASR; //!< The region attribute and size register value (RASR) \ref MPU_RASR
|
||||||
|
} 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)
|
||||||
|
{
|
||||||
|
__DMB();
|
||||||
|
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;
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Clear and disable the given MPU region.
|
||||||
|
* \param rnr Region number to be cleared.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr)
|
||||||
|
{
|
||||||
|
MPU->RNR = rnr;
|
||||||
|
MPU->RASR = 0U;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Configure an MPU region.
|
||||||
|
* \param rbar Value for RBAR register.
|
||||||
|
* \param rsar Value for RSAR register.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rbar, uint32_t rasr)
|
||||||
|
{
|
||||||
|
MPU->RBAR = rbar;
|
||||||
|
MPU->RASR = rasr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Configure the given MPU region.
|
||||||
|
* \param rnr Region number to be configured.
|
||||||
|
* \param rbar Value for RBAR register.
|
||||||
|
* \param rsar Value for RSAR register.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_SetRegionEx(uint32_t rnr, uint32_t rbar, uint32_t rasr)
|
||||||
|
{
|
||||||
|
MPU->RNR = rnr;
|
||||||
|
MPU->RBAR = rbar;
|
||||||
|
MPU->RASR = rasr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 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.
|
||||||
|
* \param table Pointer to the MPU configuration table.
|
||||||
|
* \param cnt Amount of regions to be configured.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_Load(ARM_MPU_Region_t const* table, uint32_t cnt)
|
||||||
|
{
|
||||||
|
const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U;
|
||||||
|
while (cnt > MPU_TYPE_RALIASES) {
|
||||||
|
ARM_MPU_OrderedMemcpy(&(MPU->RBAR), &(table->RBAR), MPU_TYPE_RALIASES*rowWordSize);
|
||||||
|
table += MPU_TYPE_RALIASES;
|
||||||
|
cnt -= MPU_TYPE_RALIASES;
|
||||||
|
}
|
||||||
|
ARM_MPU_OrderedMemcpy(&(MPU->RBAR), &(table->RBAR), cnt*rowWordSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -1,83 +1,154 @@
|
|||||||
/*
|
/*
|
||||||
* FreeRTOS V202011.00
|
* FreeRTOS V202011.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
* the Software without restriction, including without limitation the rights to
|
* the Software without restriction, including without limitation the rights to
|
||||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
* 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,
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
* subject to the following conditions:
|
* subject to the following conditions:
|
||||||
*
|
*
|
||||||
* The above copyright notice and this permission notice shall be included in all
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
* copies or substantial portions of the Software.
|
* copies or substantial portions of the Software.
|
||||||
*
|
*
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
* 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
|
* 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
|
* 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.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
*/
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FREERTOS_CONFIG_H
|
#ifndef FREERTOS_CONFIG_H
|
||||||
#define 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 https://www.freertos.org/a00110.html
|
||||||
|
*----------------------------------------------------------*/
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
#define configASSERT_DEFINED 1
|
||||||
* Application specific definitions.
|
extern void vAssertCalled( void );
|
||||||
*
|
#define configASSERT( x ) if( ( x ) == 0 ) vAssertCalled( )
|
||||||
* These definitions should be adjusted for your particular hardware and
|
|
||||||
* application requirements.
|
#define configUSE_PREEMPTION 1
|
||||||
*
|
#define configUSE_TIME_SLICING 1
|
||||||
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
|
|
||||||
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
|
#define configUSE_IDLE_HOOK 0
|
||||||
*
|
#define configUSE_TICK_HOOK 0
|
||||||
* See http://www.freertos.org/a00110.html
|
#define configCPU_CLOCK_HZ ( ( unsigned long ) 20000000 )
|
||||||
*----------------------------------------------------------*/
|
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
|
||||||
|
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 2000 )
|
||||||
#define configUSE_PREEMPTION 1
|
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 279000 ) )
|
||||||
#define configUSE_IDLE_HOOK 0
|
#define configMAX_TASK_NAME_LEN ( 10 )
|
||||||
#define configUSE_TICK_HOOK 0
|
#define configUSE_TRACE_FACILITY 0
|
||||||
#define configCPU_CLOCK_HZ ( ( unsigned long ) 20000000 )
|
#define configUSE_16_BIT_TICKS 0
|
||||||
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
|
#define configIDLE_SHOULD_YIELD 0
|
||||||
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 70 )
|
#define configUSE_CO_ROUTINES 0
|
||||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 7000 ) )
|
|
||||||
#define configMAX_TASK_NAME_LEN ( 10 )
|
#define configMAX_PRIORITIES ( 10 )
|
||||||
#define configUSE_TRACE_FACILITY 0
|
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
|
||||||
//#define configCHECK_FOR_STACK_OVERFLOW 0
|
#define configTIMER_QUEUE_LENGTH 20
|
||||||
#define configUSE_16_BIT_TICKS 0
|
#define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES - 3 )
|
||||||
#define configIDLE_SHOULD_YIELD 0
|
#define configUSE_COUNTING_SEMAPHORES 1
|
||||||
#define configUSE_CO_ROUTINES 0
|
#define configSUPPORT_DYNAMIC_ALLOCATION 1
|
||||||
|
#define configNUM_TX_DESCRIPTORS 15
|
||||||
#define configMAX_PRIORITIES ( 5 )
|
|
||||||
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
|
|
||||||
|
|
||||||
/* Set the following definitions to 1 to include the API function, or zero
|
/* Set the following definitions to 1 to include the API function, or zero
|
||||||
to exclude the API function. */
|
to exclude the API function. */
|
||||||
|
|
||||||
#define configUSE_MALLOC_FAILED_HOOK 1
|
#define configUSE_MALLOC_FAILED_HOOK 1
|
||||||
#define configUSE_MUTEXES 1
|
#define configUSE_MUTEXES 1
|
||||||
#define configUSE_RECURSIVE_MUTEXES 1
|
#define configUSE_RECURSIVE_MUTEXES 1
|
||||||
#define INCLUDE_vTaskPrioritySet 0
|
#define INCLUDE_vTaskPrioritySet 0
|
||||||
#define INCLUDE_uxTaskPriorityGet 0
|
#define INCLUDE_uxTaskPriorityGet 0
|
||||||
#define INCLUDE_vTaskDelete 0
|
#define INCLUDE_vTaskDelete 0
|
||||||
#define INCLUDE_vTaskCleanUpResources 0
|
#define INCLUDE_vTaskCleanUpResources 0
|
||||||
#define INCLUDE_vTaskSuspend 0
|
#define INCLUDE_vTaskSuspend 0
|
||||||
#define INCLUDE_vTaskDelayUntil 1
|
#define INCLUDE_vTaskDelayUntil 1
|
||||||
#define INCLUDE_vTaskDelay 1
|
#define INCLUDE_vTaskDelay 1
|
||||||
//#define INCLUDE_uxTaskGetStackHighWaterMark 0
|
|
||||||
//#define INCLUDE_uxTaskGetStackHighWaterMark2 0
|
|
||||||
|
#define configKERNEL_INTERRUPT_PRIORITY 255
|
||||||
#define configKERNEL_INTERRUPT_PRIORITY 255
|
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
|
||||||
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
|
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
|
||||||
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
|
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 /* equivalent to 0xa0, or priority 5. */
|
||||||
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 /* equivalent to 0xa0, or priority 5. */
|
#define configMAC_INTERRUPT_PRIORITY 5
|
||||||
|
|
||||||
|
|
||||||
|
/* networking definitions */
|
||||||
|
#define configMAC_ISR_SIMULATOR_PRIORITY ( configMAX_PRIORITIES - 2 )
|
||||||
|
#define ipconfigUSE_NETWORK_EVENT_HOOK 1
|
||||||
|
//#define ipconfigSOCK_DEFAULT_RECEIVE_BLOCK_TIME pdMS_TO_TICKS(5000)
|
||||||
|
#define configNETWORK_INTERFACE_TO_USE 1L
|
||||||
|
|
||||||
|
/* The address of an echo server that will be used by the two demo echo client
|
||||||
|
tasks.
|
||||||
|
http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/TCP_Echo_Clients.html
|
||||||
|
http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/UDP_Echo_Clients.html */
|
||||||
|
|
||||||
|
#define configECHO_SERVER_ADDR0 192
|
||||||
|
#define configECHO_SERVER_ADDR1 168
|
||||||
|
#define configECHO_SERVER_ADDR2 1
|
||||||
|
#define configECHO_SERVER_ADDR3 201
|
||||||
|
|
||||||
|
/* Default MAC address configuration. The demo creates a virtual network
|
||||||
|
connection that uses this MAC address by accessing the raw Ethernet/WiFi data
|
||||||
|
to and from a real network connection on the host PC. See the
|
||||||
|
configNETWORK_INTERFACE_TO_USE definition above for information on how to
|
||||||
|
configure the real network connection to use. */
|
||||||
|
|
||||||
|
#define configMAC_ADDR0 0x52
|
||||||
|
#define configMAC_ADDR1 0x54
|
||||||
|
#define configMAC_ADDR2 0x00
|
||||||
|
#define configMAC_ADDR3 0x12
|
||||||
|
#define configMAC_ADDR4 0x34
|
||||||
|
#define configMAC_ADDR5 0xAD
|
||||||
|
|
||||||
|
/* Default IP address configuration. Used in ipconfigUSE_DNS is set to 0, or
|
||||||
|
ipconfigUSE_DNS is set to 1 but a DNS server cannot be contacted. */
|
||||||
|
|
||||||
|
#define configIP_ADDR0 10
|
||||||
|
#define configIP_ADDR1 211
|
||||||
|
#define configIP_ADDR2 55
|
||||||
|
#define configIP_ADDR3 250
|
||||||
|
|
||||||
|
/* Default gateway IP address configuration. Used in ipconfigUSE_DNS is set to
|
||||||
|
0, or ipconfigUSE_DNS is set to 1 but a DNS server cannot be contacted. */
|
||||||
|
|
||||||
|
#define configGATEWAY_ADDR0 10
|
||||||
|
#define configGATEWAY_ADDR1 211
|
||||||
|
#define configGATEWAY_ADDR2 55
|
||||||
|
#define configGATEWAY_ADDR3 1
|
||||||
|
|
||||||
|
/* Default DNS server configuration. OpenDNS addresses are 208.67.222.222 and
|
||||||
|
208.67.220.220. Used in ipconfigUSE_DNS is set to 0, or ipconfigUSE_DNS is set
|
||||||
|
to 1 but a DNS server cannot be contacted.*/
|
||||||
|
|
||||||
|
#define configDNS_SERVER_ADDR0 127
|
||||||
|
#define configDNS_SERVER_ADDR1 0
|
||||||
|
#define configDNS_SERVER_ADDR2 0
|
||||||
|
#define configDNS_SERVER_ADDR3 53
|
||||||
|
|
||||||
|
/* Default netmask configuration. Used in ipconfigUSE_DNS is set to 0, or
|
||||||
|
ipconfigUSE_DNS is set to 1 but a DNS server cannot be contacted. */
|
||||||
|
#define configNET_MASK0 255
|
||||||
|
#define configNET_MASK1 255
|
||||||
|
#define configNET_MASK2 255
|
||||||
|
#define configNET_MASK3 0
|
||||||
|
|
||||||
|
/* The UDP port to which print messages are sent. */
|
||||||
|
#define configPRINT_PORT ( 15000 )
|
||||||
#endif /* FREERTOS_CONFIG_H */
|
#endif /* FREERTOS_CONFIG_H */
|
||||||
|
325
FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC/FreeRTOSIPConfig.h
Normal file
325
FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC/FreeRTOSIPConfig.h
Normal file
@ -0,0 +1,325 @@
|
|||||||
|
/*
|
||||||
|
* FreeRTOS V202011.00
|
||||||
|
* Copyright (C) 2020 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.
|
||||||
|
*
|
||||||
|
* https://www.FreeRTOS.org
|
||||||
|
* https://github.com/FreeRTOS
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
*
|
||||||
|
* See the following URL for configuration information.
|
||||||
|
* http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/TCP_IP_Configuration.html
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef FREERTOS_IP_CONFIG_H
|
||||||
|
#define FREERTOS_IP_CONFIG_H
|
||||||
|
|
||||||
|
/* Prototype for the function used to print out. In this case it prints to the
|
||||||
|
console before the network is connected then a UDP port after the network has
|
||||||
|
connected. */
|
||||||
|
extern void vLoggingPrintf( const char *pcFormatString, ... );
|
||||||
|
|
||||||
|
|
||||||
|
/* Set to 1 to print out debug messages. If ipconfigHAS_DEBUG_PRINTF is set to
|
||||||
|
1 then FreeRTOS_debug_printf should be defined to the function used to print
|
||||||
|
out the debugging messages. */
|
||||||
|
#define ipconfigHAS_DEBUG_PRINTF 1
|
||||||
|
|
||||||
|
#ifdef HEAP3
|
||||||
|
#define xPortGetMinimumEverFreeHeapSize(x) 0
|
||||||
|
#define xPortGetFreeHeapSize() 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if( ipconfigHAS_DEBUG_PRINTF == 1 )
|
||||||
|
#include <stdio.h>
|
||||||
|
#define FreeRTOS_debug_printf(X) \
|
||||||
|
printf("%p->%s %d: ", \
|
||||||
|
xTaskGetCurrentTaskHandle(), \
|
||||||
|
__FUNCTION__, \
|
||||||
|
__LINE__); \
|
||||||
|
vLoggingPrintf X
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Set to 1 to print out non debugging messages, for example the output of the
|
||||||
|
FreeRTOS_netstat() command, and ping replies. If ipconfigHAS_PRINTF is set to 1
|
||||||
|
then FreeRTOS_printf should be set to the function used to print out the
|
||||||
|
messages. */
|
||||||
|
#define ipconfigHAS_PRINTF 1
|
||||||
|
#if( ipconfigHAS_PRINTF == 1 )
|
||||||
|
#include <stdio.h>
|
||||||
|
#define FreeRTOS_printf(X) \
|
||||||
|
printf("%p->%s %d: ", \
|
||||||
|
xTaskGetCurrentTaskHandle(), \
|
||||||
|
__FUNCTION__, \
|
||||||
|
__LINE__); \
|
||||||
|
vLoggingPrintf X
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define the byte order of the target MCU (the MCU FreeRTOS+TCP is executing
|
||||||
|
on). Valid options are pdFREERTOS_BIG_ENDIAN and pdFREERTOS_LITTLE_ENDIAN. */
|
||||||
|
#define ipconfigBYTE_ORDER pdFREERTOS_LITTLE_ENDIAN
|
||||||
|
|
||||||
|
/* If the network card/driver includes checksum offloading (IP/TCP/UDP checksums)
|
||||||
|
then set ipconfigDRIVER_INCLUDED_RX_IP_CHECKSUM to 1 to prevent the software
|
||||||
|
stack repeating the checksum calculations. */
|
||||||
|
#define ipconfigDRIVER_INCLUDED_RX_IP_CHECKSUM 1
|
||||||
|
|
||||||
|
/* Several API's will block until the result is known, or the action has been
|
||||||
|
performed, for example FreeRTOS_send() and FreeRTOS_recv(). The timeouts can be
|
||||||
|
set per socket, using setsockopt(). If not set, the times below will be
|
||||||
|
used as defaults. */
|
||||||
|
#define ipconfigSOCK_DEFAULT_RECEIVE_BLOCK_TIME ( 5000 )
|
||||||
|
#define ipconfigSOCK_DEFAULT_SEND_BLOCK_TIME ( 5000 )
|
||||||
|
|
||||||
|
/* Include support for LLMNR: Link-local Multicast Name Resolution
|
||||||
|
(non-Microsoft) */
|
||||||
|
#define ipconfigUSE_LLMNR ( 1 )
|
||||||
|
|
||||||
|
/* Include support for NBNS: NetBIOS Name Service (Microsoft) */
|
||||||
|
#define ipconfigUSE_NBNS ( 1 )
|
||||||
|
|
||||||
|
/* Include support for DNS caching. For TCP, having a small DNS cache is very
|
||||||
|
useful. When a cache is present, ipconfigDNS_REQUEST_ATTEMPTS can be kept low
|
||||||
|
and also DNS may use small timeouts. If a DNS reply comes in after the DNS
|
||||||
|
socket has been destroyed, the result will be stored into the cache. The next
|
||||||
|
call to FreeRTOS_gethostbyname() will return immediately, without even creating
|
||||||
|
a socket. */
|
||||||
|
#define ipconfigUSE_DNS_CACHE ( 1 )
|
||||||
|
#define ipconfigDNS_CACHE_NAME_LENGTH ( 16 )
|
||||||
|
#define ipconfigDNS_CACHE_ENTRIES ( 4 )
|
||||||
|
#define ipconfigDNS_REQUEST_ATTEMPTS ( 2 )
|
||||||
|
|
||||||
|
/* The IP stack executes it its own task (although any application task can make
|
||||||
|
use of its services through the published sockets API). ipconfigUDP_TASK_PRIORITY
|
||||||
|
sets the priority of the task that executes the IP stack. The priority is a
|
||||||
|
standard FreeRTOS task priority so can take any value from 0 (the lowest
|
||||||
|
priority) to (configMAX_PRIORITIES - 1) (the highest priority).
|
||||||
|
configMAX_PRIORITIES is a standard FreeRTOS configuration parameter defined in
|
||||||
|
FreeRTOSConfig.h, not FreeRTOSIPConfig.h. Consideration needs to be given as to
|
||||||
|
the priority assigned to the task executing the IP stack relative to the
|
||||||
|
priority assigned to tasks that use the IP stack. */
|
||||||
|
#define ipconfigIP_TASK_PRIORITY ( configMAX_PRIORITIES - 2 )
|
||||||
|
|
||||||
|
/* The size, in words (not bytes), of the stack allocated to the FreeRTOS+TCP
|
||||||
|
task. This setting is less important when the FreeRTOS Win32 simulator is used
|
||||||
|
as the Win32 simulator only stores a fixed amount of information on the task
|
||||||
|
stack. FreeRTOS includes optional stack overflow detection, see:
|
||||||
|
http://www.freertos.org/Stacks-and-stack-overflow-checking.html */
|
||||||
|
#define ipconfigIP_TASK_STACK_SIZE_WORDS ( configMINIMAL_STACK_SIZE * 5 )
|
||||||
|
|
||||||
|
/* ipconfigRAND32() is called by the IP stack to generate random numbers for
|
||||||
|
things such as a DHCP transaction number or initial sequence number. Random
|
||||||
|
number generation is performed via this macro to allow applications to use their
|
||||||
|
own random number generation method. For example, it might be possible to
|
||||||
|
generate a random number by sampling noise on an analogue input. */
|
||||||
|
extern UBaseType_t uxRand();
|
||||||
|
#define ipconfigRAND32() uxRand()
|
||||||
|
|
||||||
|
/* If ipconfigUSE_NETWORK_EVENT_HOOK is set to 1 then FreeRTOS+TCP will call the
|
||||||
|
network event hook at the appropriate times. If ipconfigUSE_NETWORK_EVENT_HOOK
|
||||||
|
is not set to 1 then the network event hook will never be called. See
|
||||||
|
http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/API/vApplicationIPNetworkEventHook.shtml
|
||||||
|
*/
|
||||||
|
#define ipconfigUSE_NETWORK_EVENT_HOOK 1
|
||||||
|
|
||||||
|
/* Sockets have a send block time attribute. If FreeRTOS_sendto() is called but
|
||||||
|
a network buffer cannot be obtained then the calling task is held in the Blocked
|
||||||
|
state (so other tasks can continue to executed) until either a network buffer
|
||||||
|
becomes available or the send block time expires. If the send block time expires
|
||||||
|
then the send operation is aborted. The maximum allowable send block time is
|
||||||
|
capped to the value set by ipconfigMAX_SEND_BLOCK_TIME_TICKS. Capping the
|
||||||
|
maximum allowable send block time prevents prevents a deadlock occurring when
|
||||||
|
all the network buffers are in use and the tasks that process (and subsequently
|
||||||
|
free) the network buffers are themselves blocked waiting for a network buffer.
|
||||||
|
ipconfigMAX_SEND_BLOCK_TIME_TICKS is specified in RTOS ticks. A time in
|
||||||
|
milliseconds can be converted to a time in ticks by dividing the time in
|
||||||
|
milliseconds by portTICK_PERIOD_MS. */
|
||||||
|
#define ipconfigUDP_MAX_SEND_BLOCK_TIME_TICKS ( 5000U / portTICK_PERIOD_MS )
|
||||||
|
|
||||||
|
/* If ipconfigUSE_DHCP is 1 then FreeRTOS+TCP will attempt to retrieve an IP
|
||||||
|
address, netmask, DNS server address and gateway address from a DHCP server. If
|
||||||
|
ipconfigUSE_DHCP is 0 then FreeRTOS+TCP will use a static IP address. The
|
||||||
|
stack will revert to using the static IP address even when ipconfigUSE_DHCP is
|
||||||
|
set to 1 if a valid configuration cannot be obtained from a DHCP server for any
|
||||||
|
reason. The static configuration used is that passed into the stack by the
|
||||||
|
FreeRTOS_IPInit() function call. */
|
||||||
|
#define ipconfigUSE_DHCP 0
|
||||||
|
|
||||||
|
/* When ipconfigUSE_DHCP is set to 1, DHCP requests will be sent out at
|
||||||
|
increasing time intervals until either a reply is received from a DHCP server
|
||||||
|
and accepted, or the interval between transmissions reaches
|
||||||
|
ipconfigMAXIMUM_DISCOVER_TX_PERIOD. The IP stack will revert to using the
|
||||||
|
static IP address passed as a parameter to FreeRTOS_IPInit() if the
|
||||||
|
re-transmission time interval reaches ipconfigMAXIMUM_DISCOVER_TX_PERIOD without
|
||||||
|
a DHCP reply being received. */
|
||||||
|
#define ipconfigMAXIMUM_DISCOVER_TX_PERIOD ( 120000U / portTICK_PERIOD_MS )
|
||||||
|
|
||||||
|
/* The ARP cache is a table that maps IP addresses to MAC addresses. The IP
|
||||||
|
stack can only send a UDP message to a remove IP address if it knowns the MAC
|
||||||
|
address associated with the IP address, or the MAC address of the router used to
|
||||||
|
contact the remote IP address. When a UDP message is received from a remote IP
|
||||||
|
address the MAC address and IP address are added to the ARP cache. When a UDP
|
||||||
|
message is sent to a remote IP address that does not already appear in the ARP
|
||||||
|
cache then the UDP message is replaced by a ARP message that solicits the
|
||||||
|
required MAC address information. ipconfigARP_CACHE_ENTRIES defines the maximum
|
||||||
|
number of entries that can exist in the ARP table at any one time. */
|
||||||
|
#define ipconfigARP_CACHE_ENTRIES 6
|
||||||
|
|
||||||
|
/* ARP requests that do not result in an ARP response will be re-transmitted a
|
||||||
|
maximum of ipconfigMAX_ARP_RETRANSMISSIONS times before the ARP request is
|
||||||
|
aborted. */
|
||||||
|
#define ipconfigMAX_ARP_RETRANSMISSIONS ( 5 )
|
||||||
|
|
||||||
|
/* ipconfigMAX_ARP_AGE defines the maximum time between an entry in the ARP
|
||||||
|
table being created or refreshed and the entry being removed because it is stale.
|
||||||
|
New ARP requests are sent for ARP cache entries that are nearing their maximum
|
||||||
|
age. ipconfigMAX_ARP_AGE is specified in tens of seconds, so a value of 150 is
|
||||||
|
equal to 1500 seconds (or 25 minutes). */
|
||||||
|
#define ipconfigMAX_ARP_AGE 150
|
||||||
|
|
||||||
|
/* Implementing FreeRTOS_inet_addr() necessitates the use of string handling
|
||||||
|
routines, which are relatively large. To save code space the full
|
||||||
|
FreeRTOS_inet_addr() implementation is made optional, and a smaller and faster
|
||||||
|
alternative called FreeRTOS_inet_addr_quick() is provided. FreeRTOS_inet_addr()
|
||||||
|
takes an IP in decimal dot format (for example, "192.168.0.1") as its parameter.
|
||||||
|
FreeRTOS_inet_addr_quick() takes an IP address as four separate numerical octets
|
||||||
|
(for example, 192, 168, 0, 1) as its parameters. If
|
||||||
|
ipconfigINCLUDE_FULL_INET_ADDR is set to 1 then both FreeRTOS_inet_addr() and
|
||||||
|
FreeRTOS_indet_addr_quick() are available. If ipconfigINCLUDE_FULL_INET_ADDR is
|
||||||
|
not set to 1 then only FreeRTOS_indet_addr_quick() is available. */
|
||||||
|
#define ipconfigINCLUDE_FULL_INET_ADDR 1
|
||||||
|
|
||||||
|
/* ipconfigNUM_NETWORK_BUFFER_DESCRIPTORS defines the total number of network buffer that
|
||||||
|
are available to the IP stack. The total number of network buffers is limited
|
||||||
|
to ensure the total amount of RAM that can be consumed by the IP stack is capped
|
||||||
|
to a pre-determinable value. */
|
||||||
|
#define ipconfigNUM_NETWORK_BUFFER_DESCRIPTORS 60
|
||||||
|
|
||||||
|
/* A FreeRTOS queue is used to send events from application tasks to the IP
|
||||||
|
stack. ipconfigEVENT_QUEUE_LENGTH sets the maximum number of events that can
|
||||||
|
be queued for processing at any one time. The event queue must be a minimum of
|
||||||
|
5 greater than the total number of network buffers. */
|
||||||
|
#define ipconfigEVENT_QUEUE_LENGTH ( ipconfigNUM_NETWORK_BUFFER_DESCRIPTORS + 5 )
|
||||||
|
|
||||||
|
/* The address of a socket is the combination of its IP address and its port
|
||||||
|
number. FreeRTOS_bind() is used to manually allocate a port number to a socket
|
||||||
|
(to 'bind' the socket to a port), but manual binding is not normally necessary
|
||||||
|
for client sockets (those sockets that initiate outgoing connections rather than
|
||||||
|
wait for incoming connections on a known port number). If
|
||||||
|
ipconfigALLOW_SOCKET_SEND_WITHOUT_BIND is set to 1 then calling
|
||||||
|
FreeRTOS_sendto() on a socket that has not yet been bound will result in the IP
|
||||||
|
stack automatically binding the socket to a port number from the range
|
||||||
|
socketAUTO_PORT_ALLOCATION_START_NUMBER to 0xffff. If
|
||||||
|
ipconfigALLOW_SOCKET_SEND_WITHOUT_BIND is set to 0 then calling FreeRTOS_sendto()
|
||||||
|
on a socket that has not yet been bound will result in the send operation being
|
||||||
|
aborted. */
|
||||||
|
#define ipconfigALLOW_SOCKET_SEND_WITHOUT_BIND 1
|
||||||
|
|
||||||
|
/* Defines the Time To Live (TTL) values used in outgoing UDP packets. */
|
||||||
|
#define ipconfigUDP_TIME_TO_LIVE 128
|
||||||
|
#define ipconfigTCP_TIME_TO_LIVE 128 /* also defined in FreeRTOSIPConfigDefaults.h */
|
||||||
|
|
||||||
|
/* USE_TCP: Use TCP and all its features */
|
||||||
|
#define ipconfigUSE_TCP ( 1 )
|
||||||
|
|
||||||
|
/* USE_WIN: Let TCP use windowing mechanism. */
|
||||||
|
#define ipconfigUSE_TCP_WIN ( 1 )
|
||||||
|
|
||||||
|
/* The MTU is the maximum number of bytes the payload of a network frame can
|
||||||
|
contain. For normal Ethernet V2 frames the maximum MTU is 1500. Setting a
|
||||||
|
lower value can save RAM, depending on the buffer management scheme used. If
|
||||||
|
ipconfigCAN_FRAGMENT_OUTGOING_PACKETS is 1 then (ipconfigNETWORK_MTU - 28) must
|
||||||
|
be divisible by 8. */
|
||||||
|
#define ipconfigNETWORK_MTU 1200U
|
||||||
|
|
||||||
|
/* Set ipconfigUSE_DNS to 1 to include a basic DNS client/resolver. DNS is used
|
||||||
|
through the FreeRTOS_gethostbyname() API function. */
|
||||||
|
#define ipconfigUSE_DNS 1
|
||||||
|
|
||||||
|
/* If ipconfigREPLY_TO_INCOMING_PINGS is set to 1 then the IP stack will
|
||||||
|
generate replies to incoming ICMP echo (ping) requests. */
|
||||||
|
#define ipconfigREPLY_TO_INCOMING_PINGS 1
|
||||||
|
|
||||||
|
/* If ipconfigSUPPORT_OUTGOING_PINGS is set to 1 then the
|
||||||
|
FreeRTOS_SendPingRequest() API function is available. */
|
||||||
|
#define ipconfigSUPPORT_OUTGOING_PINGS 0
|
||||||
|
|
||||||
|
/* If ipconfigSUPPORT_SELECT_FUNCTION is set to 1 then the FreeRTOS_select()
|
||||||
|
(and associated) API function is available. */
|
||||||
|
#define ipconfigSUPPORT_SELECT_FUNCTION 1
|
||||||
|
|
||||||
|
/* If ipconfigFILTER_OUT_NON_ETHERNET_II_FRAMES is set to 1 then Ethernet frames
|
||||||
|
that are not in Ethernet II format will be dropped. This option is included for
|
||||||
|
potential future IP stack developments. */
|
||||||
|
#define ipconfigFILTER_OUT_NON_ETHERNET_II_FRAMES 1
|
||||||
|
|
||||||
|
/* If ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES is set to 1 then it is the
|
||||||
|
responsibility of the Ethernet interface to filter out packets that are of no
|
||||||
|
interest. If the Ethernet interface does not implement this functionality, then
|
||||||
|
set ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES to 0 to have the IP stack
|
||||||
|
perform the filtering instead (it is much less efficient for the stack to do it
|
||||||
|
because the packet will already have been passed into the stack). If the
|
||||||
|
Ethernet driver does all the necessary filtering in hardware then software
|
||||||
|
filtering can be removed by using a value other than 1 or 0. */
|
||||||
|
#define ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES 1
|
||||||
|
|
||||||
|
/* The Linux simulator cannot really simulate MAC interrupts, and needs to
|
||||||
|
block occasionally to allow other tasks to run. */
|
||||||
|
#define configWINDOWS_MAC_INTERRUPT_SIMULATOR_DELAY ( 20 / portTICK_PERIOD_MS )
|
||||||
|
|
||||||
|
/* Advanced only: in order to access 32-bit fields in the IP packets with
|
||||||
|
32-bit memory instructions, all packets will be stored 32-bit-aligned, plus 16-bits.
|
||||||
|
This has to do with the contents of the IP-packets: all 32-bit fields are
|
||||||
|
32-bit-aligned, plus 16-bit(!) */
|
||||||
|
#define ipconfigPACKET_FILLER_SIZE 2U
|
||||||
|
|
||||||
|
/* Define the size of the pool of TCP window descriptors. On the average, each
|
||||||
|
TCP socket will use up to 2 x 6 descriptors, meaning that it can have 2 x 6
|
||||||
|
outstanding packets (for Rx and Tx). When using up to 10 TP sockets
|
||||||
|
simultaneously, one could define TCP_WIN_SEG_COUNT as 120. */
|
||||||
|
#define ipconfigTCP_WIN_SEG_COUNT 240
|
||||||
|
|
||||||
|
/* Each TCP socket has a circular buffers for Rx and Tx, which have a fixed
|
||||||
|
maximum size. Define the size of Rx buffer for TCP sockets. */
|
||||||
|
#define ipconfigTCP_RX_BUFFER_LENGTH ( 10000 )
|
||||||
|
|
||||||
|
/* Define the size of Tx buffer for TCP sockets. */
|
||||||
|
#define ipconfigTCP_TX_BUFFER_LENGTH ( 10000 )
|
||||||
|
|
||||||
|
/* When using call-back handlers, the driver may check if the handler points to
|
||||||
|
real program memory (RAM or flash) or just has a random non-zero value. */
|
||||||
|
#define ipconfigIS_VALID_PROG_ADDRESS(x) ( (x) != NULL )
|
||||||
|
|
||||||
|
/* Include support for TCP hang protection. All sockets in a connecting or
|
||||||
|
disconnecting stage will timeout after a period of non-activity. */
|
||||||
|
#define ipconfigTCP_HANG_PROTECTION ( 1 )
|
||||||
|
#define ipconfigTCP_HANG_PROTECTION_TIME ( 30 )
|
||||||
|
|
||||||
|
/* Include support for TCP keep-alive messages. */
|
||||||
|
#define ipconfigTCP_KEEP_ALIVE ( 1 )
|
||||||
|
#define ipconfigTCP_KEEP_ALIVE_INTERVAL ( 20 ) /* in seconds */
|
||||||
|
|
||||||
|
#define portINLINE __inline
|
||||||
|
|
||||||
|
#endif /* FREERTOS_IP_CONFIG_H */
|
@ -10,38 +10,75 @@ KERNEL_DIR := $(FREERTOS_DIR)/Source
|
|||||||
FREERTOS_PLUS_DIR_REL := ../../../FreeRTOS-Plus
|
FREERTOS_PLUS_DIR_REL := ../../../FreeRTOS-Plus
|
||||||
FREERTOS_PLUS_DIR := $(abspath $(FREERTOS_PLUS_DIR_REL))
|
FREERTOS_PLUS_DIR := $(abspath $(FREERTOS_PLUS_DIR_REL))
|
||||||
|
|
||||||
|
SOURCE_FILES += init/startup.c syscall.c main.c
|
||||||
SOURCE_FILES := main.c init/startup.c main_blinky.c syscall.c
|
|
||||||
SOURCE_FILES += $(KERNEL_DIR)/portable/GCC/ARM_CM3/port.c
|
SOURCE_FILES += $(KERNEL_DIR)/portable/GCC/ARM_CM3/port.c
|
||||||
SOURCE_FILES += $(KERNEL_DIR)/tasks.c
|
SOURCE_FILES += $(KERNEL_DIR)/tasks.c
|
||||||
SOURCE_FILES += $(KERNEL_DIR)/list.c
|
SOURCE_FILES += $(KERNEL_DIR)/list.c
|
||||||
SOURCE_FILES += $(KERNEL_DIR)/queue.c
|
SOURCE_FILES += $(KERNEL_DIR)/queue.c
|
||||||
SOURCE_FILES += ${KERNEL_DIR}/portable/MemMang/heap_1.c
|
SOURCE_FILES += $(KERNEL_DIR)/timers.c
|
||||||
|
SOURCE_FILES += $(KERNEL_DIR)/event_groups.c
|
||||||
|
SOURCE_FILES += ${KERNEL_DIR}/portable/MemMang/heap_3.c
|
||||||
|
|
||||||
OBJ_FILES := $(SOURCE_FILES:%.c=$(BUILD_DIR)/%.o)
|
INCLUDE_DIRS += -I$(FREERTOS_DIR)/Demo/CORTEX_M3_MPS2_QEMU_GCC
|
||||||
|
INCLUDE_DIRS += -I$(FREERTOS_DIR)/Demo/CORTEX_M3_MPS2_QEMU_GCC/CMSIS
|
||||||
|
INCLUDE_DIRS += -I$(KERNEL_DIR)/include
|
||||||
|
INCLUDE_DIRS += -I$(KERNEL_DIR)/portable/GCC/ARM_CM3
|
||||||
|
|
||||||
DEFINES := -DprojCOVERAGE_TEST -DQEMU_SOC_MPS2
|
ifeq ($(NETWORKING), 1)
|
||||||
|
FREERTOS_TCP = ${FREERTOS_PLUS_DIR}/Source/FreeRTOS-Plus-TCP
|
||||||
|
|
||||||
LDFLAGS = -T ./scripts/mps2_m3.ld
|
# FreeRTOS networking header directories
|
||||||
|
INCLUDE_DIRS += -I${FREERTOS_TCP}/include/
|
||||||
|
INCLUDE_DIRS += -I${FREERTOS_TCP}/portable/Compiler/GCC/
|
||||||
|
|
||||||
CFLAGS = -nostartfiles -mthumb -mcpu=cortex-m3
|
# FreeRTOS networking sources
|
||||||
|
SOURCE_FILES += main_networking.c
|
||||||
|
SOURCE_FILES += ${FREERTOS_TCP}/FreeRTOS_DNS.c
|
||||||
|
SOURCE_FILES += ${FREERTOS_TCP}/FreeRTOS_DHCP.c
|
||||||
|
SOURCE_FILES += ${FREERTOS_TCP}/FreeRTOS_ARP.c
|
||||||
|
SOURCE_FILES += ${FREERTOS_TCP}/FreeRTOS_TCP_WIN.c
|
||||||
|
SOURCE_FILES += ${FREERTOS_TCP}/FreeRTOS_Stream_Buffer.c
|
||||||
|
SOURCE_FILES += ${FREERTOS_TCP}/portable/BufferManagement/BufferAllocation_2.c
|
||||||
|
SOURCE_FILES += ${FREERTOS_TCP}/FreeRTOS_IP.c
|
||||||
|
SOURCE_FILES += ${FREERTOS_TCP}/FreeRTOS_TCP_IP.c
|
||||||
|
SOURCE_FILES += ${FREERTOS_TCP}/FreeRTOS_UDP_IP.c
|
||||||
|
SOURCE_FILES += ${FREERTOS_TCP}/FreeRTOS_Sockets.c
|
||||||
|
SOURCE_FILES += ${FREERTOS_TCP}/portable/NetworkInterface/MPS2_AN385/NetworkInterface.c
|
||||||
|
SOURCE_FILES += TCPEchoClient_SingleTasks.c
|
||||||
|
SOURCE_FILES += ${FREERTOS_TCP}/portable/NetworkInterface/MPS2_AN385/ether_lan9118/smsc9220_eth_drv.c
|
||||||
|
|
||||||
|
# networking specific cflags
|
||||||
|
CFLAGS := -DmainCREATE_NETWROKING_DEMO_ONLY=1
|
||||||
|
CFLAGS += -DmainCREATE_TCP_ECHO_TASKS_SINGLE=1
|
||||||
|
else
|
||||||
|
SOURCE_FILES += main_blinky.c
|
||||||
|
CFLAGS := -DmainCREATE_SIMPLE_BLINKY_DEMO_ONLY=1
|
||||||
|
endif
|
||||||
|
|
||||||
|
DEFINES := -DprojCOVERAGE_TEST -DQEMU_SOC_MPS2 -DHEAP3
|
||||||
|
|
||||||
|
LDFLAGS = -T ./scripts/mps2_m3.ld -specs=nano.specs --specs=rdimon.specs -lc -lrdimon
|
||||||
|
LDFLAGS += -Xlinker -Map=${BUILD_DIR}/output.map
|
||||||
|
|
||||||
|
CFLAGS += -nostartfiles -mthumb -mcpu=cortex-m3 -Wno-error=implicit-function-declaration
|
||||||
CFLAGS += -Wno-builtin-declaration-mismatch -Werror
|
CFLAGS += -Wno-builtin-declaration-mismatch -Werror
|
||||||
|
|
||||||
ifeq ($(DEBUG), 1)
|
ifeq ($(DEBUG), 1)
|
||||||
CFLAGS += -ggdb -Og
|
CFLAGS += -ggdb3 -Og
|
||||||
else
|
else
|
||||||
CFLAGS += -O3 -fstrict-aliasing -Wstrict-aliasing
|
CFLAGS += -O3
|
||||||
endif
|
endif
|
||||||
|
CFLAGS += -fstrict-aliasing -Wstrict-aliasing -Wno-error=address-of-packed-member
|
||||||
|
|
||||||
INCLUDE_DIRS := -I.
|
OBJ_FILES := $(SOURCE_FILES:%.c=$(BUILD_DIR)/%.o)
|
||||||
INCLUDE_DIRS += -I${FREERTOS_PLUS_DIR}/Source/FreeRTOS-Plus-TCP/portable/Compiler/GCC/
|
|
||||||
INCLUDE_DIRS += -I$(KERNEL_DIR)/include
|
|
||||||
INCLUDE_DIRS += -I$(KERNEL_DIR)/portable/GCC/ARM_CM3
|
|
||||||
|
|
||||||
CFLAGS += $(DEFINES)
|
CFLAGS += $(DEFINES)
|
||||||
CFLAGS += $(INCLUDE_DIRS)
|
CFLAGS += $(INCLUDE_DIRS)
|
||||||
|
|
||||||
.PHONY:all
|
.PHONY: clean
|
||||||
|
|
||||||
|
$(BUILD_DIR)/$(BIN) : $(OBJ_FILES)
|
||||||
|
$(CC) -ffunction-sections -fdata-sections $(CFLAGS) $(LDFLAGS) $+ -o $(@)
|
||||||
|
|
||||||
%.d: %.c
|
%.d: %.c
|
||||||
@set -e; rm -f $@; \
|
@set -e; rm -f $@; \
|
||||||
@ -49,12 +86,13 @@ CFLAGS += $(INCLUDE_DIRS)
|
|||||||
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
|
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
|
||||||
rm -f $@.$$$$
|
rm -f $@.$$$$
|
||||||
|
|
||||||
|
INCLUDES := $(SOURCE_FILES:%.c=$(BUILD_DIR)/%.d)
|
||||||
|
-include $(INCLUDES)
|
||||||
|
|
||||||
${BUILD_DIR}/%.o : %.c Makefile
|
${BUILD_DIR}/%.o : %.c Makefile
|
||||||
-mkdir -p $(@D)
|
-mkdir -p $(@D)
|
||||||
$(CC) $(CFLAGS) -MMD -c $< -o $@
|
$(CC) $(CFLAGS) -MMD -c $< -o $@
|
||||||
|
|
||||||
$(BUILD_DIR)/$(BIN) : $(OBJ_FILES)
|
|
||||||
$(CC) -ffunction-sections -fdata-sections $(CFLAGS) $(LDFLAGS) $+ -o $(@)
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
-rm -rf build
|
-rm -rf build
|
||||||
|
|
||||||
|
@ -6,7 +6,15 @@
|
|||||||
2. Make (tested on version 3.82)
|
2. Make (tested on version 3.82)
|
||||||
4. Linux OS (tested on Ubuntu 18.04)
|
4. Linux OS (tested on Ubuntu 18.04)
|
||||||
|
|
||||||
## How to build
|
## How to download
|
||||||
|
Navigate to a parent directory of your choice and run the following command
|
||||||
|
```
|
||||||
|
$ git clone https://github.com/FreeRTOS/FreeRTOS.git --recurse-submodules --depth 1
|
||||||
|
```
|
||||||
|
The previous command should create a directory named **FreeRTOS**
|
||||||
|
|
||||||
|
## Blinky Demo
|
||||||
|
### How to build blinky demo
|
||||||
Navigate with the command line to FreeRTOS/Demo/CORTEX\_M3\_MPS2\_QEMU\_GCC
|
Navigate with the command line to FreeRTOS/Demo/CORTEX\_M3\_MPS2\_QEMU\_GCC
|
||||||
For a release build run:
|
For a release build run:
|
||||||
|
|
||||||
@ -14,21 +22,152 @@ For a release build run:
|
|||||||
$ export PATH=/path/to/arm/toolchain:$PATH
|
$ export PATH=/path/to/arm/toolchain:$PATH
|
||||||
$ make
|
$ make
|
||||||
```
|
```
|
||||||
and for a versions with debugging symbols and no optimizations activated, run:
|
For a versions with debugging symbols and no optimizations **-O0**, run:
|
||||||
```
|
```
|
||||||
$ make DEBUG=1
|
$ make DEBUG=1
|
||||||
```
|
```
|
||||||
|
|
||||||
## How to run
|
### How to run for blinky demo
|
||||||
run:
|
run:
|
||||||
```
|
```
|
||||||
$ qemu-system-arm -machine mps2-an385 -monitor null -semihosting \
|
$ sudo qemu-system-arm -machine mps2-an385 -monitor null -semihosting \
|
||||||
--semihosting-config enable=on,target=native \
|
--semihosting-config enable=on,target=native \
|
||||||
-kernel ./build/RTOSDemo.axf \
|
-kernel ./build/RTOSDemo.axf \
|
||||||
-serial stdio -nographic
|
-serial stdio -nographic
|
||||||
```
|
```
|
||||||
|
### Blinky Demo Expectations
|
||||||
|
after running the blinky demo you shoud see on the screen the word blinking
|
||||||
|
printed continuously
|
||||||
|
|
||||||
## How to start debugging (gdb)
|
## Networking Support
|
||||||
|
To make networking support possible a few steps needs to be done on the machine
|
||||||
|
lets assume the following interfaces using ubuntu 18.04 or Fedora 30
|
||||||
|
(the interface names on your machine could be different)
|
||||||
|
```
|
||||||
|
l0: loopback in terface
|
||||||
|
enp0s3: ethernet interface
|
||||||
|
virbr0: virtual bridge (to be created)
|
||||||
|
virbr0-nic: veth virtual interface (to be created)
|
||||||
|
```
|
||||||
|
### A few assumptions (your numbers could varry)
|
||||||
|
```
|
||||||
|
Local Host IP address: 192.168.1.81
|
||||||
|
Local FreeRTOS IP address: 192.168.1.80
|
||||||
|
Local FreeRTOS Subnet mask: 255.255.255.0
|
||||||
|
Default Gateway IP address: 192.168.1.254
|
||||||
|
Default DNS IP address: 192.168.1.254
|
||||||
|
Echo Server IP address: 192.168.1.204
|
||||||
|
Echo Server Port: 7
|
||||||
|
Local FreeRTOS Mac address: 52:54:00:12:34:AD
|
||||||
|
```
|
||||||
|
|
||||||
|
### Building and Running
|
||||||
|
|
||||||
|
1. Fill the defines values in FreeRTOSConfig.h with what is equivalent to the
|
||||||
|
above values on your system
|
||||||
|
```c
|
||||||
|
#define configIP_ADDR0 192
|
||||||
|
#define configIP_ADDR1 168
|
||||||
|
#define configIP_ADDR2 1
|
||||||
|
#define configIP_ADDR3 80
|
||||||
|
|
||||||
|
#define configNET_MASK0 255
|
||||||
|
#define configNET_MASK1 255
|
||||||
|
#define configNET_MASK2 255
|
||||||
|
#define configNET_MASK3 0
|
||||||
|
|
||||||
|
#define configGATEWAY_ADDR0 192
|
||||||
|
#define configGATEWAY_ADDR1 168
|
||||||
|
#define configGATEWAY_ADDR2 1
|
||||||
|
#define configGATEWAY_ADDR3 254
|
||||||
|
|
||||||
|
#define configDNS_SERVER_ADDR0 192
|
||||||
|
#define configDNS_SERVER_ADDR1 168
|
||||||
|
#define configDNS_SERVER_ADDR2 1
|
||||||
|
#define configDNS_SERVER_ADDR3 254
|
||||||
|
|
||||||
|
#define configMAC_ADDR0 0x52
|
||||||
|
#define configMAC_ADDR1 0x54
|
||||||
|
#define configMAC_ADDR2 0x00
|
||||||
|
#define configMAC_ADDR3 0x12
|
||||||
|
#define configMAC_ADDR4 0x34
|
||||||
|
#define configMAC_ADDR5 0xAD
|
||||||
|
|
||||||
|
#define configECHO_SERVER_ADDR0 192
|
||||||
|
#define configECHO_SERVER_ADDR1 168
|
||||||
|
#define configECHO_SERVER_ADDR2 1
|
||||||
|
#define configECHO_SERVER_ADDR3 204
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Build your software
|
||||||
|
```
|
||||||
|
$ make NETWORKING=1
|
||||||
|
```
|
||||||
|
options: DEBUG=1 to build with **-O0** and debugging symbols
|
||||||
|
|
||||||
|
3. On the remote machine (ip 192.168.1.204)
|
||||||
|
```
|
||||||
|
$ sudo nc -l 7
|
||||||
|
```
|
||||||
|
4. Turn off the firewall if running
|
||||||
|
On RedHat/Fedora system (tested Fedora 30) run:
|
||||||
|
```
|
||||||
|
sudo systemctl status firewalld
|
||||||
|
sudo systemctl stop firewalld
|
||||||
|
```
|
||||||
|
On Ubuntu run:
|
||||||
|
```
|
||||||
|
$ sudo ufw disable
|
||||||
|
$ sudo ufw status
|
||||||
|
```
|
||||||
|
5. Setup the local machine
|
||||||
|
Run the fullowing commands replacing the values and interface names
|
||||||
|
that conform to your system
|
||||||
|
```
|
||||||
|
sudo ip link add virbr0 type bridge
|
||||||
|
sudo ip tuntap add dev virbr0-nic mode tap
|
||||||
|
|
||||||
|
sudo ip addr add 192.168.1.81/24 dev virbr0
|
||||||
|
|
||||||
|
sudo brctl addif virbr0 enp0s3
|
||||||
|
sudo brctl addif virbr0 virbr0-nic
|
||||||
|
|
||||||
|
sudo ip link set virbr0 up
|
||||||
|
sudo ip link set virbr0-nic up
|
||||||
|
|
||||||
|
sudo ip route add default via 192.168.1.254 dev virbr0
|
||||||
|
```
|
||||||
|
|
||||||
|
6. Run the demo
|
||||||
|
```
|
||||||
|
$ sudo qemu-system-arm -machine mps2-an385 -cpu cortex-m3
|
||||||
|
-kernel ./build/RTOSDemo.axf \
|
||||||
|
-netdev tap,id=mynet0,ifname=virbr0-nic,script=no \
|
||||||
|
-net nic,macaddr=52:54:00:12:34:AD,model=lan9118,netdev=mynet0 \
|
||||||
|
-object filter-dump,id=tap_dump,netdev=mynet0,file=/tmp/qemu_tap_dump\
|
||||||
|
-display gtk -m 16M -nographic -serial stdio \
|
||||||
|
-monitor null -semihosting -semihosting-config enable=on,target=native
|
||||||
|
```
|
||||||
|
Replace the value of macaddr=52:54:00:12:34:AD with your own value from
|
||||||
|
```
|
||||||
|
configMAC_ADDR0 through configMAC_ADDR5
|
||||||
|
```
|
||||||
|
|
||||||
|
7. Expectations
|
||||||
|
On the remote machine you should expect to see something similar to the
|
||||||
|
following:
|
||||||
|
```
|
||||||
|
$ sudo nc -l 7
|
||||||
|
Password:
|
||||||
|
TxRx message number
|
||||||
|
0FGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~0123456789:;<=> ?
|
||||||
|
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~0123456789:;<=>?
|
||||||
|
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~0123456789:;<=>?
|
||||||
|
@ABCDEFGHIJKLM
|
||||||
|
```
|
||||||
|
|
||||||
|
## How to start debugging
|
||||||
|
1. gdb
|
||||||
<P>
|
<P>
|
||||||
Append the -s and -S switches to the previous command (qemu-system-arm)<br>
|
Append the -s and -S switches to the previous command (qemu-system-arm)<br>
|
||||||
-s: allow gdb to be attached to the process remotely at port 1234 <br>
|
-s: allow gdb to be attached to the process remotely at port 1234 <br>
|
||||||
@ -42,6 +181,15 @@ $ arm-none-eabi-gdb -q ./build/RTOSDemo.axf
|
|||||||
(gdb) break main
|
(gdb) break main
|
||||||
(gdb) c
|
(gdb) c
|
||||||
```
|
```
|
||||||
|
|
||||||
|
2. tcpdump
|
||||||
|
To monitor packets received to quemu running the qemu command (qemu-system-arm)
|
||||||
|
shown above will create a network packet dump that you could inspect with
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo tcpdump -r /tmp/qemu_tap_dump | less
|
||||||
|
```
|
||||||
|
|
||||||
## Demo
|
## Demo
|
||||||
This Demo implements the blinky demo, the user should expect the word
|
This Demo implements the blinky demo, the user should expect the word
|
||||||
"blinking" to be repeatedly printed on the screen.
|
"blinking" to be repeatedly printed on the screen.
|
||||||
|
@ -0,0 +1,376 @@
|
|||||||
|
/*
|
||||||
|
* FreeRTOS V202011.00
|
||||||
|
* Copyright (C) 2020 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.
|
||||||
|
*
|
||||||
|
* https://www.FreeRTOS.org
|
||||||
|
* https://github.com/FreeRTOS
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A set of tasks are created that send TCP echo requests to the standard echo
|
||||||
|
* port (port 7) on the IP address set by the configECHO_SERVER_ADDR0 to
|
||||||
|
* configECHO_SERVER_ADDR3 constants, then wait for and verify the reply
|
||||||
|
* (another demo is avilable that demonstrates the reception being performed in
|
||||||
|
* a task other than that from with the request was made).
|
||||||
|
*
|
||||||
|
* See the following web page for essential demo usage and configuration
|
||||||
|
* details:
|
||||||
|
* http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Standard includes. */
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/* FreeRTOS includes. */
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "task.h"
|
||||||
|
#include "queue.h"
|
||||||
|
|
||||||
|
/* FreeRTOS+TCP includes. */
|
||||||
|
#include "FreeRTOS_IP.h"
|
||||||
|
#include "FreeRTOS_Sockets.h"
|
||||||
|
|
||||||
|
/* Exclude the whole file if FreeRTOSIPConfig.h is configured to use UDP only. */
|
||||||
|
#if ( ipconfigUSE_TCP == 1 )
|
||||||
|
|
||||||
|
/* The echo tasks create a socket, send out a number of echo requests, listen
|
||||||
|
for the echo reply, then close the socket again before starting over. This
|
||||||
|
delay is used between each iteration to ensure the network does not get too
|
||||||
|
congested. */
|
||||||
|
#define echoLOOP_DELAY ( ( TickType_t ) 150 / portTICK_PERIOD_MS )
|
||||||
|
|
||||||
|
/* The echo server is assumed to be on port 7, which is the standard echo
|
||||||
|
protocol port. */
|
||||||
|
#define echoECHO_PORT ( 7 )
|
||||||
|
|
||||||
|
/* The size of the buffers is a multiple of the MSS - the length of the data
|
||||||
|
sent is a pseudo random size between 20 and echoBUFFER_SIZES. */
|
||||||
|
#define echoBUFFER_SIZE_MULTIPLIER ( 1 )
|
||||||
|
#define echoBUFFER_SIZES ( ipconfigTCP_MSS * echoBUFFER_SIZE_MULTIPLIER )
|
||||||
|
|
||||||
|
/* The number of instances of the echo client task to create. */
|
||||||
|
#define echoNUM_ECHO_CLIENTS ( 1 )
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Uses a socket to send data to, then receive data from, the standard echo
|
||||||
|
* port number 7.
|
||||||
|
*/
|
||||||
|
static void prvEchoClientTask( void *pvParameters );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Creates a pseudo random sized buffer of data to send to the echo server.
|
||||||
|
*/
|
||||||
|
static BaseType_t prvCreateTxData( char *ucBuffer,
|
||||||
|
uint32_t ulBufferLength );
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Rx and Tx time outs are used to ensure the sockets do not wait too long for
|
||||||
|
missing data. */
|
||||||
|
static const TickType_t xReceiveTimeOut = pdMS_TO_TICKS( 4000 );
|
||||||
|
static const TickType_t xSendTimeOut = pdMS_TO_TICKS( 2000 );
|
||||||
|
|
||||||
|
/* Counters for each created task - for inspection only. */
|
||||||
|
static uint32_t ulTxRxCycles[ echoNUM_ECHO_CLIENTS ] = { 0 },
|
||||||
|
ulTxRxFailures[ echoNUM_ECHO_CLIENTS ] = { 0 },
|
||||||
|
ulConnections[ echoNUM_ECHO_CLIENTS ] = { 0 };
|
||||||
|
|
||||||
|
/* Rx and Tx buffers for each created task. */
|
||||||
|
static char cTxBuffers[ echoNUM_ECHO_CLIENTS ][ echoBUFFER_SIZES ],
|
||||||
|
cRxBuffers[ echoNUM_ECHO_CLIENTS ][ echoBUFFER_SIZES ];
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vStartTCPEchoClientTasks_SingleTasks( uint16_t usTaskStackSize,
|
||||||
|
UBaseType_t uxTaskPriority )
|
||||||
|
{
|
||||||
|
BaseType_t x;
|
||||||
|
|
||||||
|
/* Create the echo client tasks. */
|
||||||
|
for( x = 0; x < echoNUM_ECHO_CLIENTS; x++ )
|
||||||
|
{
|
||||||
|
xTaskCreate( prvEchoClientTask, /* The function that implements the task. */
|
||||||
|
"Echo0", /* Just a text name for the task to aid debugging. */
|
||||||
|
usTaskStackSize, /* The stack size is defined in FreeRTOSIPConfig.h. */
|
||||||
|
( void * ) x, /* The task parameter, not used in this case. */
|
||||||
|
uxTaskPriority, /* The priority assigned to the task is defined in FreeRTOSConfig.h. */
|
||||||
|
NULL ); /* The task handle is not used. */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void prvEchoClientTask( void *pvParameters )
|
||||||
|
{
|
||||||
|
Socket_t xSocket;
|
||||||
|
struct freertos_sockaddr xEchoServerAddress;
|
||||||
|
int32_t lLoopCount = 0UL;
|
||||||
|
const int32_t lMaxLoopCount = 1;
|
||||||
|
volatile uint32_t ulTxCount = 0UL;
|
||||||
|
BaseType_t xReceivedBytes, xReturned, xInstance;
|
||||||
|
BaseType_t lTransmitted, lStringLength;
|
||||||
|
char *pcTransmittedString, *pcReceivedString;
|
||||||
|
WinProperties_t xWinProps;
|
||||||
|
TickType_t xTimeOnEntering;
|
||||||
|
BaseType_t ret;
|
||||||
|
|
||||||
|
/* Fill in the buffer and window sizes that will be used by the socket. */
|
||||||
|
xWinProps.lTxBufSize = 6 * ipconfigTCP_MSS;
|
||||||
|
xWinProps.lTxWinSize = 3;
|
||||||
|
xWinProps.lRxBufSize = 6 * ipconfigTCP_MSS;
|
||||||
|
xWinProps.lRxWinSize = 3;
|
||||||
|
|
||||||
|
/* This task can be created a number of times. Each instance is numbered
|
||||||
|
to enable each instance to use a different Rx and Tx buffer. The number is
|
||||||
|
passed in as the task's parameter. */
|
||||||
|
xInstance = ( BaseType_t ) pvParameters;
|
||||||
|
|
||||||
|
/* Point to the buffers to be used by this instance of this task. */
|
||||||
|
pcTransmittedString = &( cTxBuffers[ xInstance ][ 0 ] );
|
||||||
|
pcReceivedString = &( cRxBuffers[ xInstance ][ 0 ] );
|
||||||
|
|
||||||
|
/* Echo requests are sent to the echo server. The address of the echo
|
||||||
|
server is configured by the constants configECHO_SERVER_ADDR0 to
|
||||||
|
configECHO_SERVER_ADDR3 in FreeRTOSConfig.h. */
|
||||||
|
xEchoServerAddress.sin_port = FreeRTOS_htons( echoECHO_PORT );
|
||||||
|
xEchoServerAddress.sin_addr = FreeRTOS_inet_addr_quick( configECHO_SERVER_ADDR0,
|
||||||
|
configECHO_SERVER_ADDR1,
|
||||||
|
configECHO_SERVER_ADDR2,
|
||||||
|
configECHO_SERVER_ADDR3 );
|
||||||
|
|
||||||
|
for( ; ; )
|
||||||
|
{
|
||||||
|
/* Create a TCP socket. */
|
||||||
|
xSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP );
|
||||||
|
configASSERT( xSocket != FREERTOS_INVALID_SOCKET );
|
||||||
|
|
||||||
|
/* Set a time out so a missing reply does not cause the task to block
|
||||||
|
indefinitely. */
|
||||||
|
FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_RCVTIMEO, &xReceiveTimeOut, sizeof( xReceiveTimeOut ) );
|
||||||
|
FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_SNDTIMEO, &xSendTimeOut, sizeof( xSendTimeOut ) );
|
||||||
|
|
||||||
|
/* Set the window and buffer sizes. */
|
||||||
|
FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_WIN_PROPERTIES, ( void * ) &xWinProps, sizeof( xWinProps ) );
|
||||||
|
|
||||||
|
/* Connect to the echo server. */
|
||||||
|
printf( "connecting to echo server....\n" );
|
||||||
|
|
||||||
|
ret = FreeRTOS_connect( xSocket, &xEchoServerAddress, sizeof( xEchoServerAddress ) );
|
||||||
|
|
||||||
|
if( ret == 0 )
|
||||||
|
{
|
||||||
|
printf( "Connected to server.. \n" );
|
||||||
|
ulConnections[ xInstance ]++;
|
||||||
|
|
||||||
|
/* Send a number of echo requests. */
|
||||||
|
for( lLoopCount = 0; lLoopCount < lMaxLoopCount; lLoopCount++ )
|
||||||
|
{
|
||||||
|
/* Create the string that is sent to the echo server. */
|
||||||
|
lStringLength = prvCreateTxData( pcTransmittedString, echoBUFFER_SIZES );
|
||||||
|
|
||||||
|
/* Add in some unique text at the front of the string. */
|
||||||
|
sprintf( pcTransmittedString, "TxRx message number %u", ulTxCount );
|
||||||
|
ulTxCount++;
|
||||||
|
|
||||||
|
printf( "sending data to the echo server size %d original %d\n",
|
||||||
|
lStringLength,
|
||||||
|
echoBUFFER_SIZES);
|
||||||
|
/* Send the string to the socket. */
|
||||||
|
lTransmitted = FreeRTOS_send( xSocket, /* The socket being sent to. */
|
||||||
|
( void * ) pcTransmittedString, /* The data being sent. */
|
||||||
|
lStringLength, /* The length of the data being sent. */
|
||||||
|
0 ); /* No flags. */
|
||||||
|
printf("FreeRTOS_send returned...transmitted %d\n",
|
||||||
|
lTransmitted);
|
||||||
|
|
||||||
|
if( lTransmitted < 0 )
|
||||||
|
{
|
||||||
|
/* Error? */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
printf("data send receiving data... \n");
|
||||||
|
|
||||||
|
/* Clear the buffer into which the echoed string will be
|
||||||
|
placed. */
|
||||||
|
memset( ( void * ) pcReceivedString, 0x00, echoBUFFER_SIZES );
|
||||||
|
xReceivedBytes = 0;
|
||||||
|
|
||||||
|
/* Receive data echoed back to the socket. */
|
||||||
|
while( xReceivedBytes < lTransmitted )
|
||||||
|
{
|
||||||
|
xReturned = FreeRTOS_recv( xSocket, /* The socket being received from. */
|
||||||
|
&( pcReceivedString[ xReceivedBytes ] ), /* The buffer into which the received data will be written. */
|
||||||
|
lStringLength - xReceivedBytes, /* The size of the buffer provided to receive the data. */
|
||||||
|
0 ); /* No flags. */
|
||||||
|
|
||||||
|
if( xReturned < 0 )
|
||||||
|
{
|
||||||
|
/* Error occurred. Latch it so it can be detected
|
||||||
|
below. */
|
||||||
|
xReceivedBytes = xReturned;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if( xReturned == 0 )
|
||||||
|
{
|
||||||
|
/* Timed out. */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Keep a count of the bytes received so far. */
|
||||||
|
xReceivedBytes += xReturned;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If an error occurred it will be latched in xReceivedBytes,
|
||||||
|
otherwise xReceived bytes will be just that - the number of
|
||||||
|
bytes received from the echo server. */
|
||||||
|
if( xReceivedBytes > 0 )
|
||||||
|
{
|
||||||
|
/* Compare the transmitted string to the received string. */
|
||||||
|
configASSERT( strncmp( pcReceivedString, pcTransmittedString, lTransmitted ) == 0 );
|
||||||
|
|
||||||
|
if( strncmp( pcReceivedString, pcTransmittedString, lTransmitted ) == 0 )
|
||||||
|
{
|
||||||
|
/* The echo reply was received without error. */
|
||||||
|
ulTxRxCycles[ xInstance ]++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* The received string did not match the transmitted
|
||||||
|
string. */
|
||||||
|
ulTxRxFailures[ xInstance ]++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( xReceivedBytes < 0 )
|
||||||
|
{
|
||||||
|
/* FreeRTOS_recv() returned an error. */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Timed out without receiving anything? */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finished using the connected socket, initiate a graceful close:
|
||||||
|
FIN, FIN+ACK, ACK. */
|
||||||
|
FreeRTOS_shutdown( xSocket, FREERTOS_SHUT_RDWR );
|
||||||
|
|
||||||
|
/* Expect FreeRTOS_recv() to return an error once the shutdown is
|
||||||
|
complete. */
|
||||||
|
xTimeOnEntering = xTaskGetTickCount();
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
xReturned = FreeRTOS_recv( xSocket, /* The socket being received from. */
|
||||||
|
&( pcReceivedString[ 0 ] ), /* The buffer into which the received data will be written. */
|
||||||
|
echoBUFFER_SIZES, /* The size of the buffer provided to receive the data. */
|
||||||
|
0 );
|
||||||
|
|
||||||
|
if( xReturned < 0 )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while( ( xTaskGetTickCount() - xTimeOnEntering ) < xReceiveTimeOut );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf( "Could not connect to server %ld\n", ret );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Close this socket before looping back to create another. */
|
||||||
|
FreeRTOS_closesocket( xSocket );
|
||||||
|
|
||||||
|
/* Pause for a short while to ensure the network is not too
|
||||||
|
congested. */
|
||||||
|
vTaskDelay( echoLOOP_DELAY );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
static BaseType_t prvCreateTxData( char *cBuffer,
|
||||||
|
uint32_t ulBufferLength )
|
||||||
|
{
|
||||||
|
BaseType_t lCharactersToAdd, lCharacter;
|
||||||
|
char cChar = '0';
|
||||||
|
const BaseType_t lMinimumLength = 60;
|
||||||
|
|
||||||
|
/* Randomise the number of characters that will be sent in the echo
|
||||||
|
request. */
|
||||||
|
do
|
||||||
|
{
|
||||||
|
lCharactersToAdd = ipconfigRAND32() % ( ulBufferLength - 20UL );
|
||||||
|
} while( ( lCharactersToAdd == 0 ) || ( lCharactersToAdd < lMinimumLength ) ); /* Must be at least enough to add the unique text to the start of the string later. */
|
||||||
|
|
||||||
|
/* Fill the buffer. */
|
||||||
|
for( lCharacter = 0; lCharacter < lCharactersToAdd; lCharacter++ )
|
||||||
|
{
|
||||||
|
cBuffer[ lCharacter ] = cChar;
|
||||||
|
cChar++;
|
||||||
|
|
||||||
|
if( cChar > '~' )
|
||||||
|
{
|
||||||
|
cChar = '0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return lCharactersToAdd;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
BaseType_t xAreSingleTaskTCPEchoClientsStillRunning( void )
|
||||||
|
{
|
||||||
|
static uint32_t ulLastEchoSocketCount[ echoNUM_ECHO_CLIENTS ] = { 0 }, ulLastConnections[ echoNUM_ECHO_CLIENTS ] = { 0 };
|
||||||
|
BaseType_t xReturn = pdPASS, x;
|
||||||
|
|
||||||
|
/* Return fail is the number of cycles does not increment between
|
||||||
|
consecutive calls. */
|
||||||
|
for( x = 0; x < echoNUM_ECHO_CLIENTS; x++ )
|
||||||
|
{
|
||||||
|
if( ulTxRxCycles[ x ] == ulLastEchoSocketCount[ x ] )
|
||||||
|
{
|
||||||
|
xReturn = pdFAIL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ulLastEchoSocketCount[ x ] = ulTxRxCycles[ x ];
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ulConnections[ x ] == ulLastConnections[ x ] )
|
||||||
|
{
|
||||||
|
xReturn = pdFAIL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ulConnections[ x ] = ulLastConnections[ x ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return xReturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ipconfigUSE_TCP */
|
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* FreeRTOS V202011.00
|
||||||
|
* Copyright (C) 2020 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.
|
||||||
|
*
|
||||||
|
* https://www.FreeRTOS.org
|
||||||
|
* https://github.com/FreeRTOS
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SINGLE_TASK_TCP_ECHO_CLIENTS_H
|
||||||
|
#define SINGLE_TASK_TCP_ECHO_CLIENTS_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create the TCP echo client tasks. This is the version where an echo request
|
||||||
|
* is made from the same task that listens for the echo reply.
|
||||||
|
*/
|
||||||
|
void vStartTCPEchoClientTasks_SingleTasks( uint16_t usTaskStackSize, UBaseType_t uxTaskPriority );
|
||||||
|
BaseType_t xAreSingleTaskTCPEchoClientsStillRunning( void );
|
||||||
|
|
||||||
|
#endif /* SINGLE_TASK_TCP_ECHO_CLIENTS_H */
|
||||||
|
|
||||||
|
|
@ -20,7 +20,7 @@
|
|||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* https://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* https://www.gihub.com/FreeRTOS
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -28,19 +28,33 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include "CMSIS/CMSDK_CM3.h"
|
||||||
|
#include "CMSIS/core_cm3.h"
|
||||||
|
|
||||||
|
extern void vPortSVCHandler( void );
|
||||||
|
extern void xPortPendSVHandler( void );
|
||||||
|
extern void xPortSysTickHandler( void );
|
||||||
|
extern void uart_init();
|
||||||
|
extern int main();
|
||||||
|
|
||||||
|
void __attribute__((weak)) EthernetISR (void);
|
||||||
|
|
||||||
extern uint32_t _estack, _sidata, _sdata, _edata, _sbss, _ebss;
|
extern uint32_t _estack, _sidata, _sdata, _edata, _sbss, _ebss;
|
||||||
|
|
||||||
__attribute__((naked)) void Reset_Handler(void) {
|
__attribute__((naked)) void Reset_Handler(void)
|
||||||
|
{
|
||||||
// set stack pointer
|
// set stack pointer
|
||||||
__asm volatile ("ldr r0, =_estack");
|
__asm volatile ("ldr r0, =_estack");
|
||||||
__asm volatile ("mov sp, r0");
|
__asm volatile ("mov sp, r0");
|
||||||
// copy .data section from flash to RAM
|
// copy .data section from flash to RAM
|
||||||
for (uint32_t *src = &_sidata, *dest = &_sdata; dest < &_edata;) {
|
for (uint32_t *src = &_sidata, *dest = &_sdata; dest < &_edata;)
|
||||||
|
{
|
||||||
*dest++ = *src++;
|
*dest++ = *src++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// zero out .bss section
|
// zero out .bss section
|
||||||
for (uint32_t *dest = &_sbss; dest < &_ebss;) {
|
for (uint32_t *dest = &_sbss; dest < &_ebss;)
|
||||||
|
{
|
||||||
*dest++ = 0;
|
*dest++ = 0;
|
||||||
}
|
}
|
||||||
// jump to board initialisation
|
// jump to board initialisation
|
||||||
@ -48,42 +62,132 @@ __attribute__((naked)) void Reset_Handler(void) {
|
|||||||
_start();
|
_start();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Default_Handler(void) {
|
void prvGetRegistersFromStack( uint32_t *pulFaultStackAddress )
|
||||||
for (;;) {
|
{
|
||||||
}
|
/* These are volatile to try and prevent the compiler/linker optimising them
|
||||||
}
|
away as the variables never actually get used. If the debugger won't show the
|
||||||
extern void vPortSVCHandler( void );
|
values of the variables, make them global my moving their declaration outside
|
||||||
extern void xPortPendSVHandler( void );
|
of this function. */
|
||||||
extern void xPortSysTickHandler( void );
|
volatile uint32_t r0;
|
||||||
|
volatile uint32_t r1;
|
||||||
|
volatile uint32_t r2;
|
||||||
|
volatile uint32_t r3;
|
||||||
|
volatile uint32_t r12;
|
||||||
|
volatile uint32_t lr; /* Link register. */
|
||||||
|
volatile uint32_t pc; /* Program counter. */
|
||||||
|
volatile uint32_t psr;/* Program status register. */
|
||||||
|
|
||||||
|
r0 = pulFaultStackAddress[ 0 ];
|
||||||
|
r1 = pulFaultStackAddress[ 1 ];
|
||||||
|
r2 = pulFaultStackAddress[ 2 ];
|
||||||
|
r3 = pulFaultStackAddress[ 3 ];
|
||||||
|
|
||||||
|
r12 = pulFaultStackAddress[ 4 ];
|
||||||
|
lr = pulFaultStackAddress[ 5 ];
|
||||||
|
pc = pulFaultStackAddress[ 6 ];
|
||||||
|
psr = pulFaultStackAddress[ 7 ];
|
||||||
|
|
||||||
|
/* When the following line is hit, the variables contain the register values. */
|
||||||
|
for( ;; );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Default_Handler( void ) __attribute__( ( naked ) );
|
||||||
|
void Default_Handler(void)
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
"Default_Handler: \n"
|
||||||
|
" ldr r3, NVIC_INT_CTRL_CONST \n"
|
||||||
|
" ldr r2, [r3, #0]\n"
|
||||||
|
" uxtb r2, r2\n"
|
||||||
|
"Infinite_Loop:\n"
|
||||||
|
" b Infinite_Loop\n"
|
||||||
|
".size Default_Handler, .-Default_Handler\n"
|
||||||
|
".align 4\n"
|
||||||
|
"NVIC_INT_CTRL_CONST: .word 0xe000ed04\n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
static void HardFault_Handler( void ) __attribute__( ( naked ) );
|
||||||
|
void Default_Handler2(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" tst lr, #4 \n"
|
||||||
|
" ite eq \n"
|
||||||
|
" mrseq r0, msp \n"
|
||||||
|
" mrsne r0, psp \n"
|
||||||
|
" ldr r1, [r0, #24] \n"
|
||||||
|
" ldr r2, handler2_address_const \n"
|
||||||
|
" bx r2 \n"
|
||||||
|
" handler2_address_const: .word prvGetRegistersFromStack \n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Default_Handler3(void)
|
||||||
|
{
|
||||||
|
for (;;) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
void Default_Handler4(void)
|
||||||
|
{
|
||||||
|
for (;;) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
void Default_Handler5(void)
|
||||||
|
{
|
||||||
|
for (;;) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
void Default_Handler6(void)
|
||||||
|
{
|
||||||
|
for (;;) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint32_t* isr_vector[] __attribute__((section(".isr_vector"))) =
|
||||||
|
{
|
||||||
|
(uint32_t*)&_estack,
|
||||||
|
(uint32_t*)&Reset_Handler, // Reset -15
|
||||||
|
(uint32_t*)&Default_Handler, // NMI_Handler -14
|
||||||
|
(uint32_t*)&Default_Handler2, // HardFault_Handler -13
|
||||||
|
(uint32_t*)&Default_Handler3, // MemManage_Handler -12
|
||||||
|
(uint32_t*)&Default_Handler4, // BusFault_Handler -11
|
||||||
|
(uint32_t*)&Default_Handler5, // UsageFault_Handler -10
|
||||||
|
0, // reserved
|
||||||
|
0, // reserved
|
||||||
|
0, // reserved
|
||||||
|
0, // reserved -6
|
||||||
|
(uint32_t*)&vPortSVCHandler, // SVC_Handler -5
|
||||||
|
(uint32_t*)&Default_Handler6, // DebugMon_Handler -4
|
||||||
|
0, // reserved
|
||||||
|
(uint32_t*)&xPortPendSVHandler, // PendSV handler -2
|
||||||
|
(uint32_t*)&xPortSysTickHandler, // SysTick_Handler -1
|
||||||
|
0, // uart0 receive 0
|
||||||
|
0, // uart0 transmit
|
||||||
|
0, // uart1 receive
|
||||||
|
0, // uart1 transmit
|
||||||
|
0, // uart 2 receive
|
||||||
|
0, // uart 2 transmit
|
||||||
|
0, // GPIO 0 combined interrupt
|
||||||
|
0, // GPIO 2 combined interrupt
|
||||||
|
0, // Timer 0
|
||||||
|
0, // Timer 1
|
||||||
|
0, // Dial Timer
|
||||||
|
0, // SPI0 SPI1
|
||||||
|
0, // uart overflow 1, 2,3
|
||||||
|
0, // Ethernet 13
|
||||||
|
|
||||||
const uint32_t isr_vector[] __attribute__((section(".isr_vector"))) = {
|
|
||||||
(uint32_t)&_estack,
|
|
||||||
(uint32_t)&Reset_Handler,
|
|
||||||
(uint32_t)&Default_Handler, // NMI_Handler
|
|
||||||
(uint32_t)&Default_Handler, // HardFault_Handler
|
|
||||||
(uint32_t)&Default_Handler, // MemManage_Handler
|
|
||||||
(uint32_t)&Default_Handler, // BusFault_Handler
|
|
||||||
(uint32_t)&Default_Handler, // UsageFault_Handler
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
(uint32_t)&vPortSVCHandler, // SVC_Handler
|
|
||||||
(uint32_t)&Default_Handler, // DebugMon_Handler
|
|
||||||
0,
|
|
||||||
(uint32_t)&xPortPendSVHandler, // PendSV handler
|
|
||||||
(uint32_t)&xPortSysTickHandler, // SysTick_Handler
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern int main();
|
void _start(void)
|
||||||
extern void uart_init();
|
{
|
||||||
void _start(void) {
|
|
||||||
uart_init();
|
uart_init();
|
||||||
main(0, 0);
|
main(0, 0);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((naked)) void exit(int status) {
|
__attribute__((naked)) void exit(int status)
|
||||||
|
{
|
||||||
// Force qemu to exit using ARM Semihosting
|
// Force qemu to exit using ARM Semihosting
|
||||||
__asm volatile (
|
__asm volatile (
|
||||||
"mov r1, r0\n"
|
"mov r1, r0\n"
|
||||||
|
@ -20,25 +20,44 @@
|
|||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* https://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* https://www.gihub.com/FreeRTOS
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <FreeRTOS.h>
|
#include <FreeRTOS.h>
|
||||||
#include <task.h>
|
#include <task.h>
|
||||||
#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 1
|
|
||||||
|
|
||||||
void vApplicationMallocFailedHook( void );
|
#include<FreeRTOSConfig.h>
|
||||||
void vApplicationIdleHook( void );
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName );
|
void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName );
|
||||||
|
void vApplicationMallocFailedHook( void );
|
||||||
|
void main_tcp_echo_client_tasks( void );
|
||||||
|
void vApplicationIdleHook( void );
|
||||||
void vApplicationTickHook( void );
|
void vApplicationTickHook( void );
|
||||||
void main_blinky( void );
|
void main_blinky( void );
|
||||||
|
|
||||||
|
extern void initialise_monitor_handles(void);
|
||||||
|
|
||||||
int main ()
|
int main ()
|
||||||
{
|
{
|
||||||
|
#if (mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1)
|
||||||
|
{
|
||||||
main_blinky();
|
main_blinky();
|
||||||
|
}
|
||||||
|
#elif ( mainCREATE_NETWROKING_DEMO_ONLY == 1 )
|
||||||
|
{
|
||||||
|
main_tcp_echo_client_tasks();
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
#error "Invalid Selection..." \
|
||||||
|
"\nPlease Select a Demo application from the main command"
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -46,26 +65,26 @@ int main ()
|
|||||||
|
|
||||||
void vApplicationMallocFailedHook( void )
|
void vApplicationMallocFailedHook( void )
|
||||||
{
|
{
|
||||||
/* Called if a call to pvPortMalloc() fails because there is insufficient
|
/* Called if a call to pvPortMalloc() fails because there is insufficient
|
||||||
free memory available in the FreeRTOS heap. pvPortMalloc() is called
|
free memory available in the FreeRTOS heap. pvPortMalloc() is called
|
||||||
internally by FreeRTOS API functions that create tasks, queues, software
|
internally by FreeRTOS API functions that create tasks, queues, software
|
||||||
timers, and semaphores. The size of the FreeRTOS heap is set by the
|
timers, and semaphores. The size of the FreeRTOS heap is set by the
|
||||||
configTOTAL_HEAP_SIZE configuration constant in FreeRTOSConfig.h. */
|
configTOTAL_HEAP_SIZE configuration constant in FreeRTOSConfig.h. */
|
||||||
taskDISABLE_INTERRUPTS();
|
taskDISABLE_INTERRUPTS();
|
||||||
for( ;; );
|
for( ;; ){};
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName )
|
void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName )
|
||||||
{
|
{
|
||||||
( void ) pcTaskName;
|
( void ) pcTaskName;
|
||||||
( void ) pxTask;
|
( void ) pxTask;
|
||||||
|
|
||||||
/* Run time stack overflow checking is performed if
|
/* Run time stack overflow checking is performed if
|
||||||
configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2. This hook
|
configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2. This hook
|
||||||
function is called if a stack overflow is detected. */
|
function is called if a stack overflow is detected. */
|
||||||
taskDISABLE_INTERRUPTS();
|
taskDISABLE_INTERRUPTS();
|
||||||
for( ;; );
|
for( ;; ){};
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
@ -73,52 +92,41 @@ void vApplicationIdleHook( void )
|
|||||||
{
|
{
|
||||||
volatile size_t xFreeHeapSpace;
|
volatile size_t xFreeHeapSpace;
|
||||||
|
|
||||||
/* This is just a trivial example of an idle hook. It is called on each
|
/* This is just a trivial example of an idle hook. It is called on each
|
||||||
cycle of the idle task. It must *NOT* attempt to block. In this case the
|
cycle of the idle task. It must *NOT* attempt to block. In this case the
|
||||||
idle task just queries the amount of FreeRTOS heap that remains. See the
|
idle task just queries the amount of FreeRTOS heap that remains. See the
|
||||||
memory management section on the http://www.FreeRTOS.org web site for memory
|
memory management section on the https://www.FreeRTOS.org web site for memory
|
||||||
management options. If there is a lot of heap memory free then the
|
management options. If there is a lot of heap memory free then the
|
||||||
configTOTAL_HEAP_SIZE value in FreeRTOSConfig.h can be reduced to free up
|
configTOTAL_HEAP_SIZE value in FreeRTOSConfig.h can be reduced to free up
|
||||||
RAM. */
|
RAM. */
|
||||||
xFreeHeapSpace = xPortGetFreeHeapSize();
|
|
||||||
|
|
||||||
/* Remove compiler warning about xFreeHeapSpace being set but never used. */
|
|
||||||
( void ) xFreeHeapSpace;
|
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
void vApplicationTickHook( void )
|
void vApplicationTickHook( void )
|
||||||
{
|
{
|
||||||
#if( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 0 )
|
|
||||||
{
|
|
||||||
/* The full demo includes a software timer demo/test that requires
|
|
||||||
prodding periodically from the tick interrupt. */
|
|
||||||
vTimerPeriodicISRTests();
|
|
||||||
|
|
||||||
/* Call the periodic queue overwrite from ISR demo. */
|
|
||||||
vQueueOverwritePeriodicISRDemo();
|
|
||||||
|
|
||||||
/* Call the periodic event group from ISR demo. */
|
|
||||||
vPeriodicEventGroupsProcessing();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
void vAssertCalled( void )
|
void vAssertCalled( void )
|
||||||
{
|
{
|
||||||
volatile unsigned long ul = 0;
|
volatile unsigned long looping = 0;
|
||||||
|
taskENTER_CRITICAL();
|
||||||
taskENTER_CRITICAL();
|
{
|
||||||
{
|
/* Use the debugger to set ul to a non-zero value in order to step out
|
||||||
/* Use the debugger to set ul to a non-zero value in order to step out
|
of this function to determine why it was called. */
|
||||||
of this function to determine why it was called. */
|
while( looping == 0LU )
|
||||||
while( ul == 0 )
|
{
|
||||||
{
|
portNOP();
|
||||||
portNOP();
|
}
|
||||||
}
|
}
|
||||||
}
|
taskEXIT_CRITICAL();
|
||||||
taskEXIT_CRITICAL();
|
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
void vLoggingPrintf( const char *pcFormat, ... )
|
||||||
|
{
|
||||||
|
va_list arg;
|
||||||
|
|
||||||
|
va_start( arg, pcFormat );
|
||||||
|
vprintf( pcFormat, arg );
|
||||||
|
va_end( arg );
|
||||||
|
}
|
||||||
|
@ -20,9 +20,8 @@
|
|||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* https://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* https://www.gihub.com/FreeRTOS
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <FreeRTOS.h>
|
#include <FreeRTOS.h>
|
||||||
@ -34,47 +33,47 @@ static void prvQueueReceiveTask( void *pvParameters );
|
|||||||
static void prvQueueSendTask( void *pvParameters );
|
static void prvQueueSendTask( void *pvParameters );
|
||||||
extern int _write(int file, char *ptr, int len);
|
extern int _write(int file, char *ptr, int len);
|
||||||
|
|
||||||
#define mainQUEUE_RECEIVE_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
#define mainQUEUE_RECEIVE_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
||||||
#define mainQUEUE_SEND_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
#define mainQUEUE_SEND_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
||||||
#define mainQUEUE_LENGTH ( 1 )
|
#define mainQUEUE_LENGT ( 1 )
|
||||||
#define mainQUEUE_SEND_FREQUENCY_MS ( 200 / portTICK_PERIOD_MS )
|
#define mainQUEUE_SEND_FREQUENCY_MS ( 200 / portTICK_PERIOD_MS )
|
||||||
/* The queue used by both tasks. */
|
/* The queue used by both tasks. */
|
||||||
static QueueHandle_t xQueue = NULL;
|
static QueueHandle_t xQueue = NULL;
|
||||||
|
|
||||||
void main_blinky( void )
|
void main_blinky( void )
|
||||||
{
|
{
|
||||||
/* Create the queue. */
|
/* Create the queue. */
|
||||||
xQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( uint32_t ) );
|
xQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( uint32_t ) );
|
||||||
|
|
||||||
if( xQueue != NULL )
|
if( xQueue != NULL )
|
||||||
{
|
{
|
||||||
/* Start the two tasks as described in the comments at the top of this
|
/* Start the two tasks as described in the comments at the top of this
|
||||||
file. */
|
file. */
|
||||||
xTaskCreate( prvQueueReceiveTask, /* The function that implements the task. */
|
xTaskCreate( prvQueueReceiveTask, /* The function that implements the task. */
|
||||||
"Rx", /* The text name assigned to the task - for debug only as it is not used by the kernel. */
|
"Rx", /* The text name assigned to the task - for debug only as it is not used by the kernel. */
|
||||||
configMINIMAL_STACK_SIZE, /* The size of the stack to allocate to the task. */
|
configMINIMAL_STACK_SIZE, /* The size of the stack to allocate to the task. */
|
||||||
NULL, /* The parameter passed to the task - not used in this case. */
|
NULL, /* The parameter passed to the task - not used in this case. */
|
||||||
mainQUEUE_RECEIVE_TASK_PRIORITY, /* The priority assigned to the task. */
|
mainQUEUE_RECEIVE_TASK_PRIORITY, /* The priority assigned to the task. */
|
||||||
NULL ); /* The task handle is not required, so NULL is passed. */
|
NULL ); /* The task handle is not required, so NULL is passed. */
|
||||||
|
|
||||||
xTaskCreate( prvQueueSendTask,
|
xTaskCreate( prvQueueSendTask,
|
||||||
"TX",
|
"TX",
|
||||||
configMINIMAL_STACK_SIZE,
|
configMINIMAL_STACK_SIZE,
|
||||||
NULL,
|
NULL,
|
||||||
mainQUEUE_SEND_TASK_PRIORITY,
|
mainQUEUE_SEND_TASK_PRIORITY,
|
||||||
NULL );
|
NULL );
|
||||||
|
|
||||||
/* Start the tasks and timer running. */
|
/* Start the tasks and timer running. */
|
||||||
vTaskStartScheduler();
|
vTaskStartScheduler();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If all is well, the scheduler will now be running, and the following
|
/* If all is well, the scheduler will now be running, and the following
|
||||||
line will never be reached. If the following line does execute, then
|
line will never be reached. If the following line does execute, then
|
||||||
there was insufficient FreeRTOS heap memory available for the Idle and/or
|
there was insufficient FreeRTOS heap memory available for the Idle and/or
|
||||||
timer tasks to be created. See the memory management section on the
|
timer tasks to be created. See the memory management section on the
|
||||||
FreeRTOS web site for more details on the FreeRTOS heap
|
FreeRTOS web site for more details on the FreeRTOS heap
|
||||||
http://www.freertos.org/a00111.html. */
|
http://www.freertos.org/a00111.html. */
|
||||||
for( ;; );
|
for( ;; );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void prvQueueSendTask( void *pvParameters )
|
static void prvQueueSendTask( void *pvParameters )
|
||||||
@ -82,23 +81,23 @@ static void prvQueueSendTask( void *pvParameters )
|
|||||||
TickType_t xNextWakeTime;
|
TickType_t xNextWakeTime;
|
||||||
const uint32_t ulValueToSend = 100UL;
|
const uint32_t ulValueToSend = 100UL;
|
||||||
|
|
||||||
/* Remove compiler warning about unused parameter. */
|
/* Remove compiler warning about unused parameter. */
|
||||||
( void ) pvParameters;
|
( void ) pvParameters;
|
||||||
|
|
||||||
/* Initialise xNextWakeTime - this only needs to be done once. */
|
/* Initialise xNextWakeTime - this only needs to be done once. */
|
||||||
xNextWakeTime = xTaskGetTickCount();
|
xNextWakeTime = xTaskGetTickCount();
|
||||||
|
|
||||||
for( ;; )
|
for( ;; )
|
||||||
{
|
{
|
||||||
/* Place this task in the blocked state until it is time to run again. */
|
/* Place this task in the blocked state until it is time to run again. */
|
||||||
vTaskDelayUntil( &xNextWakeTime, mainQUEUE_SEND_FREQUENCY_MS );
|
vTaskDelayUntil( &xNextWakeTime, mainQUEUE_SEND_FREQUENCY_MS );
|
||||||
|
|
||||||
/* Send to the queue - causing the queue receive task to unblock and
|
/* Send to the queue - causing the queue receive task to unblock and
|
||||||
toggle the LED. 0 is used as the block time so the sending operation
|
toggle the LED. 0 is used as the block time so the sending operation
|
||||||
will not block - it shouldn't need to block as the queue should always
|
will not block - it shouldn't need to block as the queue should always
|
||||||
be empty at this point in the code. */
|
be empty at this point in the code. */
|
||||||
xQueueSend( xQueue, &ulValueToSend, 0U );
|
xQueueSend( xQueue, &ulValueToSend, 0U );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
volatile uint32_t ulRxEvents = 0;
|
volatile uint32_t ulRxEvents = 0;
|
||||||
@ -107,25 +106,25 @@ static void prvQueueReceiveTask( void *pvParameters )
|
|||||||
uint32_t ulReceivedValue;
|
uint32_t ulReceivedValue;
|
||||||
const uint32_t ulExpectedValue = 100UL;
|
const uint32_t ulExpectedValue = 100UL;
|
||||||
|
|
||||||
/* Remove compiler warning about unused parameter. */
|
/* Remove compiler warning about unused parameter. */
|
||||||
( void ) pvParameters;
|
( void ) pvParameters;
|
||||||
|
|
||||||
for( ;; )
|
for( ;; )
|
||||||
{
|
{
|
||||||
/* Wait until something arrives in the queue - this task will block
|
/* Wait until something arrives in the queue - this task will block
|
||||||
indefinitely provided INCLUDE_vTaskSuspend is set to 1 in
|
indefinitely provided INCLUDE_vTaskSuspend is set to 1 in
|
||||||
FreeRTOSConfig.h. */
|
FreeRTOSConfig.h. */
|
||||||
xQueueReceive( xQueue, &ulReceivedValue, portMAX_DELAY );
|
xQueueReceive( xQueue, &ulReceivedValue, portMAX_DELAY );
|
||||||
|
|
||||||
/* To get here something must have been received from the queue, but
|
/* To get here something must have been received from the queue, but
|
||||||
is it the expected value? If it is, toggle the LED. */
|
is it the expected value? If it is, toggle the LED. */
|
||||||
if( ulReceivedValue == ulExpectedValue )
|
if( ulReceivedValue == ulExpectedValue )
|
||||||
{
|
{
|
||||||
_write(1, "blinking\n", 9);
|
printf("%s\n","blinking");
|
||||||
vTaskDelay(1000);
|
vTaskDelay(1000);
|
||||||
ulReceivedValue = 0U;
|
ulReceivedValue = 0U;
|
||||||
ulRxEvents++;
|
ulRxEvents++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
341
FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC/main_networking.c
Normal file
341
FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC/main_networking.c
Normal file
@ -0,0 +1,341 @@
|
|||||||
|
/*
|
||||||
|
* FreeRTOS V202011.00
|
||||||
|
* Copyright (C) 2020 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.
|
||||||
|
*
|
||||||
|
* https://www.FreeRTOS.org
|
||||||
|
* https://github.com/FreeRTOS
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This project is a cut down version of the project described on the following
|
||||||
|
* link. Only the simple UDP client and server and the TCP echo clients are
|
||||||
|
* included in the build:
|
||||||
|
* http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Standard includes. */
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* FreeRTOS includes. */
|
||||||
|
#include <FreeRTOS.h>
|
||||||
|
#include "task.h"
|
||||||
|
|
||||||
|
/* Demo application includes. */
|
||||||
|
#include "FreeRTOS_IP.h"
|
||||||
|
#include "FreeRTOS_Sockets.h"
|
||||||
|
/*#include "SimpleUDPClientAndServer.h" */
|
||||||
|
/*#include "SimpleTCPEchoServer.h" */
|
||||||
|
/*#include "logging.h" */
|
||||||
|
#include "TCPEchoClient_SingleTasks.h"
|
||||||
|
|
||||||
|
/* Simple UDP client and server task parameters. */
|
||||||
|
#define mainSIMPLE_UDP_CLIENT_SERVER_TASK_PRIORITY ( tskIDLE_PRIORITY )
|
||||||
|
#define mainSIMPLE_UDP_CLIENT_SERVER_PORT ( 5005UL )
|
||||||
|
|
||||||
|
/* Echo client task parameters - used for both TCP and UDP echo clients. */
|
||||||
|
#define mainECHO_CLIENT_TASK_STACK_SIZE ( configMINIMAL_STACK_SIZE * 2 ) /* Not used in the linux port. */
|
||||||
|
#define mainECHO_CLIENT_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
||||||
|
|
||||||
|
/* Echo server task parameters. */
|
||||||
|
#define mainECHO_SERVER_TASK_STACK_SIZE ( configMINIMAL_STACK_SIZE * 2 ) /* Not used in the linux port. */
|
||||||
|
#define mainECHO_SERVER_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
||||||
|
|
||||||
|
/* Define a name that will be used for LLMNR and NBNS searches. */
|
||||||
|
#define mainHOST_NAME "RTOSDemo"
|
||||||
|
#define mainDEVICE_NICK_NAME "qemu_demo"
|
||||||
|
|
||||||
|
/* Set the following constants to 1 or 0 to define which tasks to include and
|
||||||
|
* exclude:
|
||||||
|
*
|
||||||
|
* mainCREATE_TCP_ECHO_TASKS_SINGLE: When set to 1 a set of tasks are created that
|
||||||
|
* send TCP echo requests to the standard echo port (port 7), then wait for and
|
||||||
|
* verify the echo reply, from within the same task (Tx and Rx are performed in the
|
||||||
|
* same RTOS task). The IP address of the echo server must be configured using the
|
||||||
|
* configECHO_SERVER_ADDR0 to configECHO_SERVER_ADDR3 constants in
|
||||||
|
* FreeRTOSConfig.h.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Just seeds the simple pseudo random number generator.
|
||||||
|
*/
|
||||||
|
static void prvSRand( UBaseType_t ulSeed );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Miscellaneous initialisation including preparing the logging and seeding the
|
||||||
|
* random number generator.
|
||||||
|
*/
|
||||||
|
static void prvMiscInitialisation( void );
|
||||||
|
|
||||||
|
/* The default IP and MAC address used by the demo. The address configuration
|
||||||
|
* defined here will be used if ipconfigUSE_DHCP is 0, or if ipconfigUSE_DHCP is
|
||||||
|
* 1 but a DHCP server could not be contacted. See the online documentation for
|
||||||
|
* more information. */
|
||||||
|
static const uint8_t ucIPAddress[ 4 ] = { configIP_ADDR0,
|
||||||
|
configIP_ADDR1,
|
||||||
|
configIP_ADDR2,
|
||||||
|
configIP_ADDR3
|
||||||
|
};
|
||||||
|
static const uint8_t ucNetMask[ 4 ] = { configNET_MASK0,
|
||||||
|
configNET_MASK1,
|
||||||
|
configNET_MASK2,
|
||||||
|
configNET_MASK3
|
||||||
|
};
|
||||||
|
static const uint8_t ucGatewayAddress[ 4 ] = { configGATEWAY_ADDR0,
|
||||||
|
configGATEWAY_ADDR1,
|
||||||
|
configGATEWAY_ADDR2,
|
||||||
|
configGATEWAY_ADDR3
|
||||||
|
};
|
||||||
|
static const uint8_t ucDNSServerAddress[ 4 ] = { configDNS_SERVER_ADDR0,
|
||||||
|
configDNS_SERVER_ADDR1,
|
||||||
|
configDNS_SERVER_ADDR2,
|
||||||
|
configDNS_SERVER_ADDR3
|
||||||
|
};
|
||||||
|
const uint8_t ucMACAddress[ 6 ] = { configMAC_ADDR0,
|
||||||
|
configMAC_ADDR1,
|
||||||
|
configMAC_ADDR2,
|
||||||
|
configMAC_ADDR3,
|
||||||
|
configMAC_ADDR4,
|
||||||
|
configMAC_ADDR5
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Set the following constant to pdTRUE to log using the method indicated by the
|
||||||
|
* name of the constant, or pdFALSE to not log using the method indicated by the
|
||||||
|
* name of the constant. Options include to standard out (xLogToStdout), to a disk
|
||||||
|
* file (xLogToFile), and to a UDP port (xLogToUDP). If xLogToUDP is set to pdTRUE
|
||||||
|
* then UDP messages are sent to the IP address configured as the echo server
|
||||||
|
* address (see the configECHO_SERVER_ADDR0 definitions in FreeRTOSConfig.h) and
|
||||||
|
* the port number set by configPRINT_PORT in FreeRTOSConfig.h. */
|
||||||
|
//const BaseType_t xLogToStdout = pdTRUE, xLogToFile = pdFALSE, xLogToUDP = pdFALSE;
|
||||||
|
|
||||||
|
|
||||||
|
/* Use by the pseudo random number generator. */
|
||||||
|
static UBaseType_t ulNextRand;
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void main_tcp_echo_client_tasks( void )
|
||||||
|
{
|
||||||
|
const uint32_t ulLongTime_ms = pdMS_TO_TICKS( 1000UL );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Instructions for using this project are provided on:
|
||||||
|
* http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Miscellaneous initialisation including preparing the logging and seeding
|
||||||
|
* the random number generator. */
|
||||||
|
prvMiscInitialisation();
|
||||||
|
|
||||||
|
/* Initialise the network interface.
|
||||||
|
*
|
||||||
|
***NOTE*** Tasks that use the network are created in the network event hook
|
||||||
|
* when the network is connected and ready for use (see the definition of
|
||||||
|
* vApplicationIPNetworkEventHook() below). The address values passed in here
|
||||||
|
* are used if ipconfigUSE_DHCP is set to 0, or if ipconfigUSE_DHCP is set to 1
|
||||||
|
* but a DHCP server cannot be contacted. */
|
||||||
|
FreeRTOS_debug_printf( ( "FreeRTOS_IPInit\n" ) );
|
||||||
|
FreeRTOS_IPInit( ucIPAddress,
|
||||||
|
ucNetMask,
|
||||||
|
ucGatewayAddress,
|
||||||
|
ucDNSServerAddress,
|
||||||
|
ucMACAddress );
|
||||||
|
|
||||||
|
/* Start the RTOS scheduler. */
|
||||||
|
FreeRTOS_debug_printf( ( "vTaskStartScheduler\n" ) );
|
||||||
|
vTaskStartScheduler();
|
||||||
|
FreeRTOS_debug_printf( ( "Should not reach this point after scheduler\n" ) );
|
||||||
|
|
||||||
|
/* If all is well, the scheduler will now be running, and the following
|
||||||
|
* line will never be reached. If the following line does execute, then
|
||||||
|
* there was insufficient FreeRTOS heap memory available for the idle and/or
|
||||||
|
* timer tasks to be created. See the memory management section on the
|
||||||
|
* FreeRTOS web site for more details (this is standard text that is not not
|
||||||
|
* really applicable to the Linux simulator port). */
|
||||||
|
for( ; ; )
|
||||||
|
{
|
||||||
|
usleep( ulLongTime_ms * 1000 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
BaseType_t xTasksAlreadyCreated = pdFALSE;
|
||||||
|
/* Called by FreeRTOS+TCP when the network connects or disconnects. Disconnect
|
||||||
|
* events are only received if implemented in the MAC driver. */
|
||||||
|
void vApplicationIPNetworkEventHook( eIPCallbackEvent_t eNetworkEvent )
|
||||||
|
{
|
||||||
|
uint32_t ulIPAddress;
|
||||||
|
uint32_t ulNetMask;
|
||||||
|
uint32_t ulGatewayAddress;
|
||||||
|
uint32_t ulDNSServerAddress;
|
||||||
|
char cBuffer[ 16 ];
|
||||||
|
|
||||||
|
/* If the network has just come up...*/
|
||||||
|
if( eNetworkEvent == eNetworkUp )
|
||||||
|
{
|
||||||
|
/* Create the tasks that use the IP stack if they have not already been
|
||||||
|
* created. */
|
||||||
|
if( xTasksAlreadyCreated == pdFALSE )
|
||||||
|
{
|
||||||
|
/* See the comments above the definitions of these pre-processor
|
||||||
|
* macros at the top of this file for a description of the individual
|
||||||
|
* demo tasks. */
|
||||||
|
|
||||||
|
#if ( mainCREATE_TCP_ECHO_TASKS_SINGLE == 1 )
|
||||||
|
{
|
||||||
|
vStartTCPEchoClientTasks_SingleTasks( mainECHO_CLIENT_TASK_STACK_SIZE,
|
||||||
|
mainECHO_CLIENT_TASK_PRIORITY );
|
||||||
|
}
|
||||||
|
#endif /* mainCREATE_TCP_ECHO_TASKS_SINGLE */
|
||||||
|
|
||||||
|
xTasksAlreadyCreated = pdTRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print out the network configuration, which may have come from a DHCP
|
||||||
|
* server. */
|
||||||
|
FreeRTOS_GetAddressConfiguration( &ulIPAddress, &ulNetMask, &ulGatewayAddress, &ulDNSServerAddress );
|
||||||
|
FreeRTOS_inet_ntoa( ulIPAddress, cBuffer );
|
||||||
|
FreeRTOS_printf( ( "\r\n\r\nIP Address: %s\r\n", cBuffer ) );
|
||||||
|
|
||||||
|
FreeRTOS_inet_ntoa( ulNetMask, cBuffer );
|
||||||
|
FreeRTOS_printf( ( "Subnet Mask: %s\r\n", cBuffer ) );
|
||||||
|
|
||||||
|
FreeRTOS_inet_ntoa( ulGatewayAddress, cBuffer );
|
||||||
|
FreeRTOS_printf( ( "Gateway Address: %s\r\n", cBuffer ) );
|
||||||
|
|
||||||
|
FreeRTOS_inet_ntoa( ulDNSServerAddress, cBuffer );
|
||||||
|
FreeRTOS_printf( ( "DNS Server Address: %s\r\n\r\n\r\n", cBuffer ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FreeRTOS_printf( ("Application idle hook network down\n") );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
UBaseType_t uxRand( void )
|
||||||
|
{
|
||||||
|
const uint32_t ulMultiplier = 0x015a4e35UL, ulIncrement = 1UL;
|
||||||
|
|
||||||
|
/* Utility function to generate a pseudo random number. */
|
||||||
|
|
||||||
|
ulNextRand = ( ulMultiplier * ulNextRand ) + ulIncrement;
|
||||||
|
return( ( int ) ( ulNextRand >> 16UL ) & 0x7fffUL );
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void prvSRand( UBaseType_t ulSeed )
|
||||||
|
{
|
||||||
|
/* Utility function to seed the pseudo random number generator. */
|
||||||
|
ulNextRand = ulSeed;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void prvMiscInitialisation( void )
|
||||||
|
{
|
||||||
|
time_t xTimeNow;
|
||||||
|
|
||||||
|
/* Seed the random number generator. */
|
||||||
|
time( &xTimeNow );
|
||||||
|
FreeRTOS_debug_printf( ( "Seed for randomiser: %lu\n", xTimeNow ) );
|
||||||
|
prvSRand( ( uint32_t ) xTimeNow );
|
||||||
|
FreeRTOS_debug_printf( ( "Random numbers: %08X %08X %08X %08X\n",
|
||||||
|
ipconfigRAND32(),
|
||||||
|
ipconfigRAND32(),
|
||||||
|
ipconfigRAND32(),
|
||||||
|
ipconfigRAND32() ) );
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if ( ipconfigUSE_LLMNR != 0 ) || ( ipconfigUSE_NBNS != 0 ) || ( ipconfigDHCP_REGISTER_HOSTNAME == 1 )
|
||||||
|
|
||||||
|
const char * pcApplicationHostnameHook( void )
|
||||||
|
{
|
||||||
|
/* Assign the name "FreeRTOS" to this network node. This function will
|
||||||
|
* be called during the DHCP: the machine will be registered with an IP
|
||||||
|
* address plus this name. */
|
||||||
|
return mainHOST_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if ( ipconfigUSE_LLMNR != 0 ) || ( ipconfigUSE_NBNS != 0 )
|
||||||
|
|
||||||
|
BaseType_t xApplicationDNSQueryHook( const char * pcName )
|
||||||
|
{
|
||||||
|
BaseType_t xReturn;
|
||||||
|
|
||||||
|
/* Determine if a name lookup is for this node. Two names are given
|
||||||
|
* to this node: that returned by pcApplicationHostnameHook() and that set
|
||||||
|
* by mainDEVICE_NICK_NAME. */
|
||||||
|
if( strcasecmp( pcName, pcApplicationHostnameHook() ) == 0 )
|
||||||
|
{
|
||||||
|
xReturn = pdPASS;
|
||||||
|
}
|
||||||
|
else if( strcasecmp( pcName, mainDEVICE_NICK_NAME ) == 0 )
|
||||||
|
{
|
||||||
|
xReturn = pdPASS;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
xReturn = pdFAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return xReturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* if ( ipconfigUSE_LLMNR != 0 ) || ( ipconfigUSE_NBNS != 0 ) */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Callback that provides the inputs necessary to generate a randomized TCP
|
||||||
|
* Initial Sequence Number per RFC 6528. THIS IS ONLY A DUMMY IMPLEMENTATION
|
||||||
|
* THAT RETURNS A PSEUDO RANDOM NUMBER SO IS NOT INTENDED FOR USE IN PRODUCTION
|
||||||
|
* SYSTEMS.
|
||||||
|
*/
|
||||||
|
extern uint32_t ulApplicationGetNextSequenceNumber( uint32_t ulSourceAddress,
|
||||||
|
uint16_t usSourcePort,
|
||||||
|
uint32_t ulDestinationAddress,
|
||||||
|
uint16_t usDestinationPort )
|
||||||
|
{
|
||||||
|
( void ) ulSourceAddress;
|
||||||
|
( void ) usSourcePort;
|
||||||
|
( void ) ulDestinationAddress;
|
||||||
|
( void ) usDestinationPort;
|
||||||
|
|
||||||
|
return uxRand();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Supply a random number to FreeRTOS+TCP stack.
|
||||||
|
* THIS IS ONLY A DUMMY IMPLEMENTATION THAT RETURNS A PSEUDO RANDOM NUMBER
|
||||||
|
* SO IS NOT INTENDED FOR USE IN PRODUCTION SYSTEMS.
|
||||||
|
*/
|
||||||
|
BaseType_t xApplicationGetRandomNumber( uint32_t * pulNumber )
|
||||||
|
{
|
||||||
|
*( pulNumber ) = uxRand();
|
||||||
|
return pdTRUE;
|
||||||
|
}
|
@ -20,43 +20,90 @@
|
|||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* https://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* https://www.gihub.com/FreeRTOS
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
MEMORY
|
MEMORY
|
||||||
{
|
{
|
||||||
RAM (xrw) : ORIGIN = 0x00000000, LENGTH = 4M
|
FLASH (xr) : ORIGIN = 0x00000000, LENGTH = 4M /* to 0x00003FFF = 0x007FFFFF*/
|
||||||
|
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 4M /* to 0x21FFFFFF = 0xFFFFFF */
|
||||||
}
|
}
|
||||||
|
ENTRY(Reset_Handler)
|
||||||
|
|
||||||
_Min_Heap_Size = 0x200 ; /* Required amount of heap. */
|
_Min_Heap_Size = 0x40000 ; /* Required amount of heap. */
|
||||||
_Min_Stack_Size = 0x400 ; /* Required amount of stack. */
|
_Min_Stack_Size = 0x4000 ; /* Required amount of stack. */
|
||||||
|
M_VECTOR_RAM_SIZE = (16 + 48) * 4;
|
||||||
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
.text : {
|
|
||||||
. = ALIGN(4);
|
.isr_vector :
|
||||||
|
{
|
||||||
|
__vector_table = .;
|
||||||
KEEP(*(.isr_vector))
|
KEEP(*(.isr_vector))
|
||||||
|
. = ALIGN(4);
|
||||||
|
} > FLASH
|
||||||
|
|
||||||
|
.text :
|
||||||
|
{
|
||||||
|
. = ALIGN(4);
|
||||||
*(.text*)
|
*(.text*)
|
||||||
KEEP (*(.init))
|
KEEP (*(.init))
|
||||||
KEEP (*(.fini))
|
KEEP (*(.fini))
|
||||||
|
KEEP(*(.eh_frame))
|
||||||
|
*(.rodata*)
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
_etext = .;
|
_etext = .;
|
||||||
_sidata = _etext;
|
_sidata = _etext;
|
||||||
} > RAM
|
} > FLASH
|
||||||
|
|
||||||
.data : AT ( _sidata )
|
.ARM.extab :
|
||||||
|
{
|
||||||
|
. = ALIGN(4);
|
||||||
|
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
||||||
|
. = ALIGN(4);
|
||||||
|
} >FLASH
|
||||||
|
|
||||||
|
.ARM :
|
||||||
|
{
|
||||||
|
. = ALIGN(4);
|
||||||
|
__exidx_start = .;
|
||||||
|
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
||||||
|
__exidx_end = .;
|
||||||
|
. = ALIGN(4);
|
||||||
|
} >FLASH
|
||||||
|
|
||||||
|
.interrupts_ram :
|
||||||
|
{
|
||||||
|
. = ALIGN(4);
|
||||||
|
__VECTOR_RAM__ = .;
|
||||||
|
__interrupts_ram_start__ = .;
|
||||||
|
. += M_VECTOR_RAM_SIZE;
|
||||||
|
. = ALIGN(4);
|
||||||
|
__interrupts_ram_end = .;
|
||||||
|
|
||||||
|
} > RAM
|
||||||
|
|
||||||
|
.data : /* AT ( _sidata ) */
|
||||||
{
|
{
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
_sdata = .;
|
_sdata = .;
|
||||||
*(.data*)
|
*(.data*)
|
||||||
*(.rodata*)
|
|
||||||
KEEP(*(.eh_frame))
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
_edata = .;
|
_edata = .;
|
||||||
} >RAM
|
} > RAM AT > FLASH
|
||||||
|
|
||||||
|
.uninitialized (NOLOAD):
|
||||||
|
{
|
||||||
|
. = ALIGN(32);
|
||||||
|
__uninitialized_start = .;
|
||||||
|
*(.uninitialized)
|
||||||
|
KEEP(*(.keep.uninitialized))
|
||||||
|
. = ALIGN(32);
|
||||||
|
__uninitialized_end = .;
|
||||||
|
} > RAM
|
||||||
|
|
||||||
.bss :
|
.bss :
|
||||||
{
|
{
|
||||||
@ -70,7 +117,7 @@ SECTIONS
|
|||||||
__bss_end__ = _ebss;
|
__bss_end__ = _ebss;
|
||||||
} >RAM
|
} >RAM
|
||||||
|
|
||||||
._user_heap_stack :
|
.heap :
|
||||||
{
|
{
|
||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
PROVIDE ( end = . );
|
PROVIDE ( end = . );
|
||||||
@ -82,20 +129,13 @@ SECTIONS
|
|||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
} >RAM
|
} >RAM
|
||||||
|
|
||||||
.ARM.extab :
|
/* Set stack top to end of RAM, and stack limit move down by
|
||||||
{
|
* size of stack_dummy section */
|
||||||
. = ALIGN(4);
|
__StackTop = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
__StackLimit = __StackTop - _Min_Stack_Size;
|
||||||
. = ALIGN(4);
|
PROVIDE(__stack = __StackTop);
|
||||||
} >RAM
|
|
||||||
|
/* Check if data + heap + stack exceeds RAM limit */
|
||||||
.ARM :
|
ASSERT(__StackLimit >= _heap_top, "region RAM overflowed with stack")
|
||||||
{
|
|
||||||
. = ALIGN(4);
|
|
||||||
__exidx_start = .;
|
|
||||||
*(.ARM.exidx*)
|
|
||||||
__exidx_end = .;
|
|
||||||
. = ALIGN(4);
|
|
||||||
} >RAM
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* https://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* https://www.gihub.com/FreeRTOS
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
@ -44,66 +44,85 @@ typedef struct UART_t {
|
|||||||
#define UART_CTRL_TX_EN (1 << 0)
|
#define UART_CTRL_TX_EN (1 << 0)
|
||||||
#define UART_CTRL_RX_EN (1 << 1)
|
#define UART_CTRL_RX_EN (1 << 1)
|
||||||
|
|
||||||
static char *heap_end = 0;
|
|
||||||
extern unsigned long _heap_bottom;
|
extern unsigned long _heap_bottom;
|
||||||
extern unsigned long _heap_top;
|
extern unsigned long _heap_top;
|
||||||
extern unsigned long g_ulBase;
|
extern unsigned long g_ulBase;
|
||||||
|
|
||||||
|
static void *heap_end = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief initializes the UART emulated hardware
|
||||||
|
*/
|
||||||
void uart_init()
|
void uart_init()
|
||||||
{
|
{
|
||||||
UART0_ADDR->BAUDDIV = 16;
|
UART0_ADDR->BAUDDIV = 16;
|
||||||
UART0_ADDR->CTRL = UART_CTRL_TX_EN;
|
UART0_ADDR->CTRL = UART_CTRL_TX_EN;
|
||||||
}
|
}
|
||||||
|
|
||||||
int _close(int file){
|
/**
|
||||||
return -1;
|
* @brief not used anywhere in the code
|
||||||
}
|
* @todo implement if necessary
|
||||||
|
*
|
||||||
int _fstat(int file){
|
*/
|
||||||
|
int _fstat(int file)
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int _isatty(int file){
|
/**
|
||||||
return 1;
|
* @brief not used anywhere in the code
|
||||||
}
|
* @todo implement if necessary
|
||||||
|
*
|
||||||
int _lseek(int file, int buf, int dir){
|
*/
|
||||||
return 0;
|
int _read(int file, char *buf, int len)
|
||||||
}
|
{
|
||||||
|
|
||||||
int _open(const char *name, int flags, int mode){
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _read(int file, char *buf, int len){
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int _write(int file, char *buf, int len){
|
/**
|
||||||
|
* @brief Write bytes to the UART channel to be displayed on the command line
|
||||||
|
* with qemu
|
||||||
|
* @param [in] file ignored
|
||||||
|
* @param [in] buf buffer to send
|
||||||
|
* @param [in] len length of the buffer
|
||||||
|
* @returns the number of bytes written
|
||||||
|
*/
|
||||||
|
int _write(int file, char *buf, int len)
|
||||||
|
{
|
||||||
int todo;
|
int todo;
|
||||||
|
|
||||||
for (todo = 0; todo < len; todo++){
|
for (todo = 0; todo < len; todo++){
|
||||||
UART_DR(UART0_ADDR) = *buf++;
|
UART_DR(UART0_ADDR) = *buf++;
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
caddr_t _sbrk(unsigned int incr){
|
/**
|
||||||
|
* @brief function called by malloc and friends to reserve memory on the heap
|
||||||
|
* @param [in] incr the amount of bytes to increase or decrease
|
||||||
|
* @returns the previous top of the heap
|
||||||
|
* @note uses a global variable <b>heap_end</b> to keep track of the previous top
|
||||||
|
*/
|
||||||
|
void* _sbrk(int incr)
|
||||||
|
{
|
||||||
char *prev_heap_end;
|
char *prev_heap_end;
|
||||||
|
|
||||||
if (heap_end == 0){
|
if (heap_end == 0)
|
||||||
heap_end = (caddr_t)&_heap_bottom;
|
{
|
||||||
|
heap_end = (void*) &_heap_bottom;
|
||||||
}
|
}
|
||||||
|
|
||||||
prev_heap_end = heap_end;
|
prev_heap_end = heap_end;
|
||||||
|
|
||||||
if (heap_end + incr > (caddr_t)&_heap_top){
|
if ((heap_end + incr) > (void*)&_heap_top)
|
||||||
return (caddr_t)0;
|
{
|
||||||
|
return (void*)-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
heap_end += incr;
|
heap_end += incr;
|
||||||
|
|
||||||
return (caddr_t) prev_heap_end;
|
return prev_heap_end;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -22,7 +22,6 @@
|
|||||||
* https://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* https://github.com/FreeRTOS
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
@ -34,11 +33,11 @@
|
|||||||
* If mainSELECTED_APPLICATION = BLINKY_DEMO the simple blinky demo will be built.
|
* If mainSELECTED_APPLICATION = BLINKY_DEMO the simple blinky demo will be built.
|
||||||
* The simply blinky demo is implemented and described in main_blinky.c.
|
* The simply blinky demo is implemented and described in main_blinky.c.
|
||||||
*
|
*
|
||||||
* If mainSELECTED_APPLICATION = FULL_DEMO the more comprehensive test and demo
|
* If mainSELECTED_APPLICATION = FULL_DEMO the more comprehensive test and demo
|
||||||
* application built. This is implemented and described in main_full.c.
|
* application built. This is implemented and described in main_full.c.
|
||||||
*
|
*
|
||||||
* If mainSELECTED_APPLICATION = ECHO_CLIENT_DEMO the tcp echo demo will be built.
|
* If mainSELECTED_APPLICATION = ECHO_CLIENT_DEMO the tcp echo demo will be built.
|
||||||
* This is implemented and described in main_networking.c
|
* This is implemented and described in main_networking.c
|
||||||
*
|
*
|
||||||
* This file implements the code that is not demo specific, including the
|
* This file implements the code that is not demo specific, including the
|
||||||
* hardware setup and FreeRTOS hook functions.
|
* hardware setup and FreeRTOS hook functions.
|
||||||
@ -94,14 +93,14 @@ void vFullDemoIdleFunction( void );
|
|||||||
void vApplicationMallocFailedHook( void );
|
void vApplicationMallocFailedHook( void );
|
||||||
void vApplicationIdleHook( void );
|
void vApplicationIdleHook( void );
|
||||||
void vApplicationStackOverflowHook( TaskHandle_t pxTask,
|
void vApplicationStackOverflowHook( TaskHandle_t pxTask,
|
||||||
char *pcTaskName );
|
char *pcTaskName );
|
||||||
void vApplicationTickHook( void );
|
void vApplicationTickHook( void );
|
||||||
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer,
|
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer,
|
||||||
StackType_t **ppxIdleTaskStackBuffer,
|
StackType_t **ppxIdleTaskStackBuffer,
|
||||||
uint32_t *pulIdleTaskStackSize );
|
uint32_t *pulIdleTaskStackSize );
|
||||||
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer,
|
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer,
|
||||||
StackType_t **ppxTimerTaskStackBuffer,
|
StackType_t **ppxTimerTaskStackBuffer,
|
||||||
uint32_t *pulTimerTaskStackSize );
|
uint32_t *pulTimerTaskStackSize );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Writes trace data to a disk file when the trace recording is stopped.
|
* Writes trace data to a disk file when the trace recording is stopped.
|
||||||
@ -125,224 +124,224 @@ static BaseType_t xTraceRunning = pdTRUE;
|
|||||||
|
|
||||||
int main( void )
|
int main( void )
|
||||||
{
|
{
|
||||||
/* Do not include trace code when performing a code coverage analysis. */
|
/* Do not include trace code when performing a code coverage analysis. */
|
||||||
#if ( projCOVERAGE_TEST != 1 )
|
#if ( projCOVERAGE_TEST != 1 )
|
||||||
{
|
{
|
||||||
/* Initialise the trace recorder. Use of the trace recorder is optional.
|
/* Initialise the trace recorder. Use of the trace recorder is optional.
|
||||||
See http://www.FreeRTOS.org/trace for more information. */
|
See http://www.FreeRTOS.org/trace for more information. */
|
||||||
vTraceEnable( TRC_START );
|
vTraceEnable( TRC_START );
|
||||||
|
|
||||||
/* Start the trace recording - the recording is written to a file if
|
/* Start the trace recording - the recording is written to a file if
|
||||||
configASSERT() is called. */
|
configASSERT() is called. */
|
||||||
printf( "\r\nTrace started.\r\nThe trace will be dumped to disk if a call to configASSERT() fails.\r\n" );
|
printf( "\r\nTrace started.\r\nThe trace will be dumped to disk if a call to configASSERT() fails.\r\n" );
|
||||||
printf( "\r\nThe trace will be dumped to disk if Enter is hit.\r\n" );
|
printf( "\r\nThe trace will be dumped to disk if Enter is hit.\r\n" );
|
||||||
uiTraceStart();
|
uiTraceStart();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
console_init();
|
console_init();
|
||||||
#if ( mainSELECTED_APPLICATION == ECHO_CLIENT_DEMO )
|
#if ( mainSELECTED_APPLICATION == ECHO_CLIENT_DEMO )
|
||||||
{
|
{
|
||||||
console_print("Starting echo client demo\n");
|
console_print("Starting echo client demo\n");
|
||||||
main_tcp_echo_client_tasks();
|
main_tcp_echo_client_tasks();
|
||||||
}
|
}
|
||||||
#elif ( mainSELECTED_APPLICATION == BLINKY_DEMO )
|
#elif ( mainSELECTED_APPLICATION == BLINKY_DEMO )
|
||||||
{
|
{
|
||||||
console_print("Starting echo blinky demo\n");
|
console_print("Starting echo blinky demo\n");
|
||||||
main_blinky();
|
main_blinky();
|
||||||
}
|
}
|
||||||
#elif ( mainSELECTED_APPLICATION == FULL_DEMO)
|
#elif ( mainSELECTED_APPLICATION == FULL_DEMO)
|
||||||
{
|
{
|
||||||
console_print("Starting full demo\n");
|
console_print("Starting full demo\n");
|
||||||
main_full();
|
main_full();
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
{
|
{
|
||||||
#error "The selected demo is not valid"
|
#error "The selected demo is not valid"
|
||||||
}
|
}
|
||||||
#endif /* if ( mainSELECTED_APPLICATION ) */
|
#endif /* if ( mainSELECTED_APPLICATION ) */
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
void vApplicationMallocFailedHook( void )
|
void vApplicationMallocFailedHook( void )
|
||||||
{
|
{
|
||||||
/* vApplicationMallocFailedHook() will only be called if
|
/* vApplicationMallocFailedHook() will only be called if
|
||||||
configUSE_MALLOC_FAILED_HOOK is set to 1 in FreeRTOSConfig.h. It is a hook
|
configUSE_MALLOC_FAILED_HOOK is set to 1 in FreeRTOSConfig.h. It is a hook
|
||||||
function that will get called if a call to pvPortMalloc() fails.
|
function that will get called if a call to pvPortMalloc() fails.
|
||||||
pvPortMalloc() is called internally by the kernel whenever a task, queue,
|
pvPortMalloc() is called internally by the kernel whenever a task, queue,
|
||||||
timer or semaphore is created. It is also called by various parts of the
|
timer or semaphore is created. It is also called by various parts of the
|
||||||
demo application. If heap_1.c, heap_2.c or heap_4.c is being used, then the
|
demo application. If heap_1.c, heap_2.c or heap_4.c is being used, then the
|
||||||
size of the heap available to pvPortMalloc() is defined by
|
size of the heap available to pvPortMalloc() is defined by
|
||||||
configTOTAL_HEAP_SIZE in FreeRTOSConfig.h, and the xPortGetFreeHeapSize()
|
configTOTAL_HEAP_SIZE in FreeRTOSConfig.h, and the xPortGetFreeHeapSize()
|
||||||
API function can be used to query the size of free heap space that remains
|
API function can be used to query the size of free heap space that remains
|
||||||
(although it does not provide information on how the remaining heap might be
|
(although it does not provide information on how the remaining heap might be
|
||||||
fragmented). See http://www.freertos.org/a00111.html for more
|
fragmented). See http://www.freertos.org/a00111.html for more
|
||||||
information. */
|
information. */
|
||||||
vAssertCalled( __FILE__, __LINE__ );
|
vAssertCalled( __FILE__, __LINE__ );
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
void vApplicationIdleHook( void )
|
void vApplicationIdleHook( void )
|
||||||
{
|
{
|
||||||
/* vApplicationIdleHook() will only be called if configUSE_IDLE_HOOK is set
|
/* vApplicationIdleHook() will only be called if configUSE_IDLE_HOOK is set
|
||||||
to 1 in FreeRTOSConfig.h. It will be called on each iteration of the idle
|
to 1 in FreeRTOSConfig.h. It will be called on each iteration of the idle
|
||||||
task. It is essential that code added to this hook function never attempts
|
task. It is essential that code added to this hook function never attempts
|
||||||
to block in any way (for example, call xQueueReceive() with a block time
|
to block in any way (for example, call xQueueReceive() with a block time
|
||||||
specified, or call vTaskDelay()). If application tasks make use of the
|
specified, or call vTaskDelay()). If application tasks make use of the
|
||||||
vTaskDelete() API function to delete themselves then it is also important
|
vTaskDelete() API function to delete themselves then it is also important
|
||||||
that vApplicationIdleHook() is permitted to return to its calling function,
|
that vApplicationIdleHook() is permitted to return to its calling function,
|
||||||
because it is the responsibility of the idle task to clean up memory
|
because it is the responsibility of the idle task to clean up memory
|
||||||
allocated by the kernel to any task that has since deleted itself. */
|
allocated by the kernel to any task that has since deleted itself. */
|
||||||
|
|
||||||
|
|
||||||
usleep(15000);
|
usleep(15000);
|
||||||
traceOnEnter();
|
traceOnEnter();
|
||||||
|
|
||||||
#if ( mainSELECTED_APPLICATION == FULL_DEMO )
|
#if ( mainSELECTED_APPLICATION == FULL_DEMO )
|
||||||
{
|
{
|
||||||
/* Call the idle task processing used by the full demo. The simple
|
/* Call the idle task processing used by the full demo. The simple
|
||||||
blinky demo does not use the idle task hook. */
|
blinky demo does not use the idle task hook. */
|
||||||
vFullDemoIdleFunction();
|
vFullDemoIdleFunction();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
void vApplicationStackOverflowHook( TaskHandle_t pxTask,
|
void vApplicationStackOverflowHook( TaskHandle_t pxTask,
|
||||||
char *pcTaskName )
|
char *pcTaskName )
|
||||||
{
|
{
|
||||||
( void ) pcTaskName;
|
( void ) pcTaskName;
|
||||||
( void ) pxTask;
|
( void ) pxTask;
|
||||||
|
|
||||||
/* Run time stack overflow checking is performed if
|
/* Run time stack overflow checking is performed if
|
||||||
configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2. This hook
|
configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2. This hook
|
||||||
function is called if a stack overflow is detected. This function is
|
function is called if a stack overflow is detected. This function is
|
||||||
provided as an example only as stack overflow checking does not function
|
provided as an example only as stack overflow checking does not function
|
||||||
when running the FreeRTOS POSIX port. */
|
when running the FreeRTOS POSIX port. */
|
||||||
vAssertCalled( __FILE__, __LINE__ );
|
vAssertCalled( __FILE__, __LINE__ );
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
void vApplicationTickHook( void )
|
void vApplicationTickHook( void )
|
||||||
{
|
{
|
||||||
/* This function will be called by each tick interrupt if
|
/* This function will be called by each tick interrupt if
|
||||||
configUSE_TICK_HOOK is set to 1 in FreeRTOSConfig.h. User code can be
|
configUSE_TICK_HOOK is set to 1 in FreeRTOSConfig.h. User code can be
|
||||||
added here, but the tick hook is called from an interrupt context, so
|
added here, but the tick hook is called from an interrupt context, so
|
||||||
code must not attempt to block, and only the interrupt safe FreeRTOS API
|
code must not attempt to block, and only the interrupt safe FreeRTOS API
|
||||||
functions can be used (those that end in FromISR()). */
|
functions can be used (those that end in FromISR()). */
|
||||||
|
|
||||||
#if (mainSELECTED_APPLICATION == FULL_DEMO )
|
#if (mainSELECTED_APPLICATION == FULL_DEMO )
|
||||||
{
|
{
|
||||||
vFullDemoTickHookFunction();
|
vFullDemoTickHookFunction();
|
||||||
}
|
}
|
||||||
#endif /* mainSELECTED_APPLICATION */
|
#endif /* mainSELECTED_APPLICATION */
|
||||||
}
|
}
|
||||||
|
|
||||||
void traceOnEnter()
|
void traceOnEnter()
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct timeval tv = { 0L, 0L };
|
struct timeval tv = { 0L, 0L };
|
||||||
fd_set fds;
|
fd_set fds;
|
||||||
FD_ZERO(&fds);
|
FD_ZERO(&fds);
|
||||||
FD_SET(0, &fds);
|
FD_SET(0, &fds);
|
||||||
ret = select(1, &fds, NULL, NULL, &tv);
|
ret = select(1, &fds, NULL, NULL, &tv);
|
||||||
if ( ret > 0 )
|
if ( ret > 0 )
|
||||||
{
|
{
|
||||||
if( xTraceRunning == pdTRUE )
|
if( xTraceRunning == pdTRUE )
|
||||||
{
|
{
|
||||||
prvSaveTraceFile();
|
prvSaveTraceFile();
|
||||||
}
|
}
|
||||||
/* clear the buffer */
|
/* clear the buffer */
|
||||||
char buffer[200];
|
char buffer[200];
|
||||||
read(1, &buffer, 200);
|
read(1, &buffer, 200);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void vLoggingPrintf( const char *pcFormat,
|
void vLoggingPrintf( const char *pcFormat,
|
||||||
... )
|
... )
|
||||||
{
|
{
|
||||||
va_list arg;
|
va_list arg;
|
||||||
|
|
||||||
va_start( arg, pcFormat );
|
va_start( arg, pcFormat );
|
||||||
vprintf( pcFormat, arg );
|
vprintf( pcFormat, arg );
|
||||||
va_end( arg );
|
va_end( arg );
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
void vApplicationDaemonTaskStartupHook( void )
|
void vApplicationDaemonTaskStartupHook( void )
|
||||||
{
|
{
|
||||||
/* This function will be called once only, when the daemon task starts to
|
/* This function will be called once only, when the daemon task starts to
|
||||||
execute (sometimes called the timer task). This is useful if the
|
execute (sometimes called the timer task). This is useful if the
|
||||||
application includes initialisation code that would benefit from executing
|
application includes initialisation code that would benefit from executing
|
||||||
after the scheduler has been started. */
|
after the scheduler has been started. */
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
void vAssertCalled( const char * const pcFileName,
|
void vAssertCalled( const char * const pcFileName,
|
||||||
unsigned long ulLine )
|
unsigned long ulLine )
|
||||||
{
|
{
|
||||||
static BaseType_t xPrinted = pdFALSE;
|
static BaseType_t xPrinted = pdFALSE;
|
||||||
volatile uint32_t ulSetToNonZeroInDebuggerToContinue = 0;
|
volatile uint32_t ulSetToNonZeroInDebuggerToContinue = 0;
|
||||||
|
|
||||||
/* Called if an assertion passed to configASSERT() fails. See
|
/* Called if an assertion passed to configASSERT() fails. See
|
||||||
http://www.freertos.org/a00110.html#configASSERT for more information. */
|
http://www.freertos.org/a00110.html#configASSERT for more information. */
|
||||||
|
|
||||||
/* Parameters are not used. */
|
/* Parameters are not used. */
|
||||||
( void ) ulLine;
|
( void ) ulLine;
|
||||||
( void ) pcFileName;
|
( void ) pcFileName;
|
||||||
|
|
||||||
|
|
||||||
taskENTER_CRITICAL();
|
taskENTER_CRITICAL();
|
||||||
{
|
{
|
||||||
/* Stop the trace recording. */
|
/* Stop the trace recording. */
|
||||||
if( xPrinted == pdFALSE )
|
if( xPrinted == pdFALSE )
|
||||||
{
|
{
|
||||||
xPrinted = pdTRUE;
|
xPrinted = pdTRUE;
|
||||||
|
|
||||||
if( xTraceRunning == pdTRUE )
|
if( xTraceRunning == pdTRUE )
|
||||||
{
|
{
|
||||||
prvSaveTraceFile();
|
prvSaveTraceFile();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* You can step out of this function to debug the assertion by using
|
/* You can step out of this function to debug the assertion by using
|
||||||
the debugger to set ulSetToNonZeroInDebuggerToContinue to a non-zero
|
the debugger to set ulSetToNonZeroInDebuggerToContinue to a non-zero
|
||||||
value. */
|
value. */
|
||||||
while( ulSetToNonZeroInDebuggerToContinue == 0 )
|
while( ulSetToNonZeroInDebuggerToContinue == 0 )
|
||||||
{
|
{
|
||||||
__asm volatile ( "NOP" );
|
__asm volatile ( "NOP" );
|
||||||
__asm volatile ( "NOP" );
|
__asm volatile ( "NOP" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
taskEXIT_CRITICAL();
|
taskEXIT_CRITICAL();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
static void prvSaveTraceFile( void )
|
static void prvSaveTraceFile( void )
|
||||||
{
|
{
|
||||||
/* Tracing is not used when code coverage analysis is being performed. */
|
/* Tracing is not used when code coverage analysis is being performed. */
|
||||||
#if ( projCOVERAGE_TEST != 1 )
|
#if ( projCOVERAGE_TEST != 1 )
|
||||||
{
|
{
|
||||||
FILE * pxOutputFile;
|
FILE * pxOutputFile;
|
||||||
|
|
||||||
vTraceStop();
|
vTraceStop();
|
||||||
|
|
||||||
pxOutputFile = fopen( "Trace.dump", "wb" );
|
pxOutputFile = fopen( "Trace.dump", "wb" );
|
||||||
|
|
||||||
if( pxOutputFile != NULL )
|
if( pxOutputFile != NULL )
|
||||||
{
|
{
|
||||||
fwrite( RecorderDataPtr, sizeof( RecorderDataType ), 1, pxOutputFile );
|
fwrite( RecorderDataPtr, sizeof( RecorderDataType ), 1, pxOutputFile );
|
||||||
fclose( pxOutputFile );
|
fclose( pxOutputFile );
|
||||||
printf( "\r\nTrace output saved to Trace.dump\r\n" );
|
printf( "\r\nTrace output saved to Trace.dump\r\n" );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
printf( "\r\nFailed to create trace dump file\r\n" );
|
printf( "\r\nFailed to create trace dump file\r\n" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* if ( projCOVERAGE_TEST != 1 ) */
|
#endif /* if ( projCOVERAGE_TEST != 1 ) */
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
@ -350,26 +349,26 @@ static void prvSaveTraceFile( void )
|
|||||||
implementation of vApplicationGetIdleTaskMemory() to provide the memory that is
|
implementation of vApplicationGetIdleTaskMemory() to provide the memory that is
|
||||||
used by the Idle task. */
|
used by the Idle task. */
|
||||||
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer,
|
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer,
|
||||||
StackType_t **ppxIdleTaskStackBuffer,
|
StackType_t **ppxIdleTaskStackBuffer,
|
||||||
uint32_t *pulIdleTaskStackSize )
|
uint32_t *pulIdleTaskStackSize )
|
||||||
{
|
{
|
||||||
/* If the buffers to be provided to the Idle task are declared inside this
|
/* 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
|
function then they must be declared static - otherwise they will be allocated on
|
||||||
the stack and so not exists after this function exits. */
|
the stack and so not exists after this function exits. */
|
||||||
static StaticTask_t xIdleTaskTCB;
|
static StaticTask_t xIdleTaskTCB;
|
||||||
static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ];
|
static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ];
|
||||||
|
|
||||||
/* Pass out a pointer to the StaticTask_t structure in which the Idle task's
|
/* Pass out a pointer to the StaticTask_t structure in which the Idle task's
|
||||||
state will be stored. */
|
state will be stored. */
|
||||||
*ppxIdleTaskTCBBuffer = &xIdleTaskTCB;
|
*ppxIdleTaskTCBBuffer = &xIdleTaskTCB;
|
||||||
|
|
||||||
/* Pass out the array that will be used as the Idle task's stack. */
|
/* Pass out the array that will be used as the Idle task's stack. */
|
||||||
*ppxIdleTaskStackBuffer = uxIdleTaskStack;
|
*ppxIdleTaskStackBuffer = uxIdleTaskStack;
|
||||||
|
|
||||||
/* Pass out the size of the array pointed to by *ppxIdleTaskStackBuffer.
|
/* Pass out the size of the array pointed to by *ppxIdleTaskStackBuffer.
|
||||||
Note that, as the array is necessarily of type StackType_t,
|
Note that, as the array is necessarily of type StackType_t,
|
||||||
configMINIMAL_STACK_SIZE is specified in words, not bytes. */
|
configMINIMAL_STACK_SIZE is specified in words, not bytes. */
|
||||||
*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
|
*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
@ -377,23 +376,23 @@ the stack and so not exists after this function exits. */
|
|||||||
application must provide an implementation of vApplicationGetTimerTaskMemory()
|
application must provide an implementation of vApplicationGetTimerTaskMemory()
|
||||||
to provide the memory that is used by the Timer service task. */
|
to provide the memory that is used by the Timer service task. */
|
||||||
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer,
|
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer,
|
||||||
StackType_t **ppxTimerTaskStackBuffer,
|
StackType_t **ppxTimerTaskStackBuffer,
|
||||||
uint32_t *pulTimerTaskStackSize )
|
uint32_t *pulTimerTaskStackSize )
|
||||||
{
|
{
|
||||||
/* If the buffers to be provided to the Timer task are declared inside this
|
/* 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
|
function then they must be declared static - otherwise they will be allocated on
|
||||||
the stack and so not exists after this function exits. */
|
the stack and so not exists after this function exits. */
|
||||||
static StaticTask_t xTimerTaskTCB;
|
static StaticTask_t xTimerTaskTCB;
|
||||||
|
|
||||||
/* Pass out a pointer to the StaticTask_t structure in which the Timer
|
/* Pass out a pointer to the StaticTask_t structure in which the Timer
|
||||||
task's state will be stored. */
|
task's state will be stored. */
|
||||||
*ppxTimerTaskTCBBuffer = &xTimerTaskTCB;
|
*ppxTimerTaskTCBBuffer = &xTimerTaskTCB;
|
||||||
|
|
||||||
/* Pass out the array that will be used as the Timer task's stack. */
|
/* Pass out the array that will be used as the Timer task's stack. */
|
||||||
*ppxTimerTaskStackBuffer = uxTimerTaskStack;
|
*ppxTimerTaskStackBuffer = uxTimerTaskStack;
|
||||||
|
|
||||||
/* Pass out the size of the array pointed to by *ppxTimerTaskStackBuffer.
|
/* Pass out the size of the array pointed to by *ppxTimerTaskStackBuffer.
|
||||||
Note that, as the array is necessarily of type StackType_t,
|
Note that, as the array is necessarily of type StackType_t,
|
||||||
configMINIMAL_STACK_SIZE is specified in words, not bytes. */
|
configMINIMAL_STACK_SIZE is specified in words, not bytes. */
|
||||||
*pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;
|
*pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;
|
||||||
}
|
}
|
||||||
|
Submodule FreeRTOS/Source updated: 50a2321838...1431b65110
Reference in New Issue
Block a user