diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/cy_mbed_post_init.h b/targets/TARGET_Cypress/TARGET_PSOC6/cy_mbed_post_init.h new file mode 100644 index 0000000000..e307a7f065 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSOC6/cy_mbed_post_init.h @@ -0,0 +1,45 @@ +/* + * mbed Microcontroller Library + * Copyright (c) 2019, Arm Limited and affiliates. + * 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 + * + * 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 CY_MBED_POST_INIT_H +#define CY_MBED_POST_INIT_H + +#include "mbed_toolchain.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************************* +* Function Name: cy_mbed_post_bsp_init_hook +****************************************************************************//** +* +* Function that is called immediately after cybsp_init finishes executing +* Applications can override this definition if they need to reserve resources +* early in the startup process so that later stages won't try and use them. +* For example, a timer instance might be reserved so that the us_ticker won't +* try to allocate it. +* +*******************************************************************************/ +void cy_mbed_post_bsp_init_hook(void); + +#ifdef __cplusplus +} +#endif + +#endif /* CY_MBED_POST_INIT_H */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/cy_sleep_api.c b/targets/TARGET_Cypress/TARGET_PSOC6/cy_sleep_api.c index 0372585d2a..6ceb994fec 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/cy_sleep_api.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/cy_sleep_api.c @@ -19,21 +19,30 @@ #include "cmsis.h" #include "device.h" -#include "cy_syspm.h" +#include "cyhal_syspm.h" +#include "cy_us_ticker.h" #if DEVICE_SLEEP void hal_sleep(void) { - Cy_SysPm_CpuEnterSleep(CY_SYSPM_WAIT_FOR_INTERRUPT); + cyhal_syspm_sleep(); } void hal_deepsleep(void) { #if DEVICE_LPTICKER - Cy_SysPm_CpuEnterDeepSleep(CY_SYSPM_WAIT_FOR_INTERRUPT); + // A running timer will block DeepSleep, which would normally be + // good because we don't want the timer to accidentally + // lose counts. We don't care about that for us_ticker + // (If we're requesting deepsleep the upper layers already determined + // that they are okay with that), so explicitly stop the us_ticker + // timer before we go to sleep and start it back up afterwards. + cy_us_ticker_stop(); + cyhal_syspm_deepsleep(); + cy_us_ticker_start(); #else - Cy_SysPm_CpuEnterSleep(CY_SYSPM_WAIT_FOR_INTERRUPT); + cyhal_syspm_sleep(); #endif /* DEVICE_LPTICKER */ } diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/cy_us_ticker.h b/targets/TARGET_Cypress/TARGET_PSOC6/cy_us_ticker.h new file mode 100644 index 0000000000..b4ee6cf300 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSOC6/cy_us_ticker.h @@ -0,0 +1,37 @@ +/* + * mbed Microcontroller Library + * Copyright (c) 2017-2018 Future Electronics + * Copyright (c) 2019, Arm Limited and affiliates. + * 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 + * + * 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_CY_US_TICKER_H +#define MBED_CY_US_TICKER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** Starts the us_ticker. */ +void cy_us_ticker_start(); + +/** Stops the us_ticker. */ +void cy_us_ticker_stop(); + +#ifdef __cplusplus +} +#endif + +#endif // MBED_CY_US_TICKER_H diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/cy_us_ticker_api.c b/targets/TARGET_Cypress/TARGET_PSOC6/cy_us_ticker_api.c index 767acd0642..ec53834d10 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/cy_us_ticker_api.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/cy_us_ticker_api.c @@ -17,6 +17,7 @@ #include "cmsis.h" #include "us_ticker_api.h" #include "mbed_error.h" +#include "cy_us_ticker.h" #include "cyhal_timer.h" #include "cy_tcpwm_counter.h" @@ -51,6 +52,16 @@ static void cy_us_ticker_irq_handler(MBED_UNUSED void *arg, MBED_UNUSED cyhal_ti us_ticker_irq_handler(); } +void cy_us_ticker_start() +{ + cyhal_timer_start(&cy_us_timer); +} + +void cy_us_ticker_stop() +{ + cyhal_timer_stop(&cy_us_timer); +} + void us_ticker_init(void) { if (!cy_us_ticker_initialized) { diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/mbed_overrides.c b/targets/TARGET_Cypress/TARGET_PSOC6/mbed_overrides.c index f030dd4be6..c62c895624 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/mbed_overrides.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/mbed_overrides.c @@ -20,6 +20,7 @@ #include "cycfg.h" #include "cyhal_hwmgr.h" #include "cybsp.h" +#include "cy_mbed_post_init.h" #include "mbed_power_mgmt.h" #if MBED_CONF_RTOS_PRESENT #include "rtos_idle.h" @@ -49,6 +50,11 @@ static void active_idle_hook(void) } #endif +MBED_WEAK void cy_mbed_post_bsp_init_hook(void) +{ + /* By default, do nothing */ +} + /******************************************************************************* * Function Name: mbed_sdk_init ****************************************************************************//** @@ -71,6 +77,8 @@ void mbed_sdk_init(void) /* Set up the device based on configurator selections */ cybsp_init(); + cy_mbed_post_bsp_init_hook(); + #if CY_CPU_CORTEX_M0P /* Enable global interrupts */ __enable_irq();