Skip to content

Made saml21 target run on mbed5 #7276

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/* mbed Microcontroller Library
* CMSIS-style functionality to support dynamic vectors
*******************************************************************************
* Copyright (c) 2011 ARM Limited. All rights reserved.
* 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 ARM Limited 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.
*******************************************************************************
*/
#include "cmsis_nvic.h"

#define NVIC_FLASH_VECTOR_ADDRESS (0x0) // Initial vector position in flash

void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)
{
uint32_t *vectors = (uint32_t*)SCB->VTOR;
uint32_t i;

// Copy and switch to dynamic vectors if the first time called
if (SCB->VTOR == NVIC_FLASH_VECTOR_ADDRESS) {
uint32_t *old_vectors = vectors;
vectors = (uint32_t*)NVIC_RAM_VECTOR_ADDRESS;
for (i=0; i<NVIC_NUM_VECTORS; i++) {
vectors[i] = old_vectors[i];
}
SCB->VTOR = (uint32_t)NVIC_RAM_VECTOR_ADDRESS;
}
vectors[IRQn + 16] = vector;
}

uint32_t NVIC_GetVector(IRQn_Type IRQn)
{
uint32_t *vectors = (uint32_t*)SCB->VTOR;
return vectors[IRQn + 16];
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/* mbed Microcontroller Library
* CMSIS-style functionality to support dynamic vectors
*******************************************************************************
* Copyright (c) 2011 ARM Limited. All rights reserved.
* All rights reserved.
Expand Down Expand Up @@ -31,7 +32,21 @@
#ifndef MBED_CMSIS_NVIC_H
#define MBED_CMSIS_NVIC_H

#define NVIC_NUM_VECTORS (16 + 29) // CORE + MCU Peripherals
#define NVIC_USER_IRQ_OFFSET 16
#define NVIC_NUM_VECTORS (NVIC_USER_IRQ_OFFSET + 29) // CORE + MCU Peripherals
#define NVIC_RAM_VECTOR_ADDRESS 0x20000000 // Vectors positioned at start of RAM

#include "cmsis.h"

#ifdef __cplusplus
extern "C" {
#endif

void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector);
uint32_t NVIC_GetVector(IRQn_Type IRQn);

#ifdef __cplusplus
}
#endif

#endif
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
SYSTEM_INTERRUPT_MODULE_TCC##n,
#endif

#define min(a, b) (((a) < (b)) ? (a) : (b))
#define _SIZE_MAX(size) ((size==32u) ? 0xFFFFFFFF : ( \
(1u << size) - 1))

Expand Down
5 changes: 5 additions & 0 deletions targets/TARGET_Atmel/TARGET_SAM_CortexM0P/us_ticker.c
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,11 @@ void us_ticker_disable_interrupt(void)
NVIC_DisableIRQ(TICKER_COUNTER_IRQn);
}

void us_ticker_fire_interrupt(void)
{
NVIC_SetPendingIRQ(TICKER_COUNTER_IRQn);
}

void us_ticker_clear_interrupt(void)
{
uint32_t status_flags;
Expand Down
71 changes: 0 additions & 71 deletions targets/TARGET_Atmel/TARGET_SAM_CortexM0P/utils/compiler.h
Original file line number Diff line number Diff line change
Expand Up @@ -632,77 +632,6 @@ typedef struct {

/** @} */


/** \name Mathematics
*
* The same considerations as for clz and ctz apply here but GCC does not
* provide built-in functions to access the assembly instructions abs, min and
* max and it does not produce them by itself in most cases, so two sets of
* macros are defined here:
* - Abs, Min and Max to apply to constant expressions (values known at
* compile time);
* - abs, min and max to apply to non-constant expressions (values unknown at
* compile time), abs is found in stdlib.h.
*
* @{ */

/** \brief Takes the absolute value of \a a.
*
* \param[in] a Input value.
*
* \return Absolute value of \a a.
*
* \note More optimized if only used with values known at compile time.
*/
#define Abs(a) (((a) < 0 ) ? -(a) : (a))

/** \brief Takes the minimal value of \a a and \a b.
*
* \param[in] a Input value.
* \param[in] b Input value.
*
* \return Minimal value of \a a and \a b.
*
* \note More optimized if only used with values known at compile time.
*/
#define Min(a, b) (((a) < (b)) ? (a) : (b))

/** \brief Takes the maximal value of \a a and \a b.
*
* \param[in] a Input value.
* \param[in] b Input value.
*
* \return Maximal value of \a a and \a b.
*
* \note More optimized if only used with values known at compile time.
*/
#define Max(a, b) (((a) > (b)) ? (a) : (b))

/** \brief Takes the minimal value of \a a and \a b.
*
* \param[in] a Input value.
* \param[in] b Input value.
*
* \return Minimal value of \a a and \a b.
*
* \note More optimized if only used with values unknown at compile time.
*/
#define min(a, b) Min(a, b)

/** \brief Takes the maximal value of \a a and \a b.
*
* \param[in] a Input value.
* \param[in] b Input value.
*
* \return Maximal value of \a a and \a b.
*
* \note More optimized if only used with values unknown at compile time.
*/
#define max(a, b) Max(a, b)

/** @} */


/** \brief Calls the routine at address \a addr.
*
* It generates a long call opcode.
Expand Down
30 changes: 30 additions & 0 deletions targets/TARGET_Atmel/mbed_rtx.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/* mbed Microcontroller Library
* Copyright (c) 2017 ARM Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#ifndef MBED_MBED_RTX_H
#define MBED_MBED_RTX_H

#ifndef INITIAL_SP

#if (defined(TARGET_SAML21J18A))
#define INITIAL_SP (0x20008000UL)
#else
#error "INITIAL_SP is not defined for this target in the mbed_rtx.h file"
#endif

#endif // INITIAL_SP

#endif // MBED_MBED_RTX_H
3 changes: 2 additions & 1 deletion targets/targets.json
Original file line number Diff line number Diff line change
Expand Up @@ -3366,10 +3366,11 @@
"SAML21J18A": {
"inherits": ["Target"],
"core": "Cortex-M0+",
"macros": ["__SAML21J18A__", "I2C_MASTER_CALLBACK_MODE=true", "EXTINT_CALLBACK_MODE=true", "USART_CALLBACK_MODE=true", "TC_ASYNC=true"],
"macros": ["__SAML21J18A__", "I2C_MASTER_CALLBACK_MODE=true", "EXTINT_CALLBACK_MODE=true", "USART_CALLBACK_MODE=true", "TC_ASYNC=true", "CMSIS_VECTAB_VIRTUAL", "CMSIS_VECTAB_VIRTUAL_HEADER_FILE=\"cmsis_nvic.h\""],
"extra_labels": ["Atmel", "SAM_CortexM0P", "SAML21"],
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

release_versions is missing if you want to add support for OS 5. Also, why RTOS support is removed via .mbedignore?

Copy link
Contributor Author

@martinichka martinichka Jun 23, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why RTOS support is removed via .mbedignore?

as we don't use RTOS for our project and it was failing with:

Compile [  0.3%]: main.cpp
[Fatal Error] mbed_rtx_conf.h@25,22: mbed_rtx.h: No such file or directory
[ERROR] In file included from ./mbed-os/rtos/TARGET_CORTEX/rtx5/RTX/Config/RTX_Config.h:31:0,
                 from ./mbed-os/rtos/TARGET_CORTEX/rtx5/RTX/Include/rtx_evr.h:31,
                 from ./mbed-os/rtos/TARGET_CORTEX/rtx5/RTX/Source/rtx_lib.h:38,
                 from ./mbed-os/rtos/TARGET_CORTEX/mbed_rtos_storage.h:43,
                 from ./mbed-os/rtos/rtos.h:28,
                 from ./mbed-os/mbed.h:20,
                 from ./main.cpp:1:
./mbed-os/rtos/TARGET_CORTEX/mbed_rtx_conf.h:25:22: fatal error: mbed_rtx.h: No such file or directory
 #include "mbed_rtx.h"
                      ^
compilation terminated.

"supported_toolchains": ["GCC_ARM", "ARM", "uARM"],
"device_has": ["ANALOGIN", "ANALOGOUT", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH"],
"release_versions": ["2", "5"],
"device_name": "ATSAML21J18A"
},
"SAMG55J19": {
Expand Down