From 48026bb824fd2d9cfb00ecd040db6ef3a416bae9 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Fri, 22 Jan 2021 21:43:36 -0500 Subject: upload initial port --- ChibiOS_20.3.2/os/hal/src/hal_st.c | 262 +++++++++++++++++++++++++++++++++++++ 1 file changed, 262 insertions(+) create mode 100644 ChibiOS_20.3.2/os/hal/src/hal_st.c (limited to 'ChibiOS_20.3.2/os/hal/src/hal_st.c') diff --git a/ChibiOS_20.3.2/os/hal/src/hal_st.c b/ChibiOS_20.3.2/os/hal/src/hal_st.c new file mode 100644 index 0000000..ef60182 --- /dev/null +++ b/ChibiOS_20.3.2/os/hal/src/hal_st.c @@ -0,0 +1,262 @@ +/* + ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio + + 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. +*/ + +/** + * @file hal_st.c + * @brief ST Driver code. + * + * @addtogroup ST + * @{ + */ + +#include "hal.h" + +#if (OSAL_ST_MODE != OSAL_ST_MODE_NONE) || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Driver local definitions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver exported variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local variables. */ +/*===========================================================================*/ + +#if (ST_LLD_NUM_ALARMS > 1) || defined(__DOXYGEN__) +st_callback_t st_callbacks[ST_LLD_NUM_ALARMS - 1]; +#endif + +/*===========================================================================*/ +/* Driver local functions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver exported functions. */ +/*===========================================================================*/ + +/** + * @brief ST Driver initialization. + * @note This function is implicitly invoked by @p halInit(), there is + * no need to explicitly initialize the driver. + * + * @init + */ +void stInit(void) { +#if ST_LLD_NUM_ALARMS > 1 + unsigned i; + + for (i = 0U; i < (unsigned)ST_LLD_NUM_ALARMS - 1U; i++) { + st_callbacks[i] = NULL; + } +#endif + st_lld_init(); +} + +#if (OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING) || defined(__DOXYGEN__) +/** + * @brief Starts the alarm zero. + * @note Makes sure that no spurious alarms are triggered after + * this call. + * @note This functionality is only available in free running mode, the + * behavior in periodic mode is undefined. + * + * @param[in] abstime the time to be set for the first alarm + * + * @api + */ +void stStartAlarm(systime_t abstime) { + + osalDbgAssert(stIsAlarmActive() == false, "already active"); + + st_lld_start_alarm(abstime); +} + +/** + * @brief Stops the alarm zero interrupt. + * @note This functionality is only available in free running mode, the + * behavior in periodic mode is undefined. + * + * @api + */ +void stStopAlarm(void) { + + st_lld_stop_alarm(); +} + +/** + * @brief Sets the alarm zero time. + * @note This functionality is only available in free running mode, the + * behavior in periodic mode is undefined. + * + * @param[in] abstime the time to be set for the next alarm + * + * @api + */ +void stSetAlarm(systime_t abstime) { + + osalDbgAssert(stIsAlarmActive() != false, "not active"); + + st_lld_set_alarm(abstime); +} + +/** + * @brief Returns the alarm zero current time. + * @note This functionality is only available in free running mode, the + * behavior in periodic mode is undefined. + * + * @return The currently set alarm time. + * + * @api + */ +systime_t stGetAlarm(void) { + + osalDbgAssert(stIsAlarmActive() != false, "not active"); + + return st_lld_get_alarm(); +} + +/** + * @brief Returns the time counter value. + * @note This functionality is only available in free running mode, the + * behaviour in periodic mode is undefined. + * + * @return The counter value. + * + * @api + */ +systime_t stGetCounter(void) { + + return st_lld_get_counter(); +} + +/** + * @brief Determines if the alarm zero is active. + * + * @return The alarm status. + * @retval false if the alarm is not active. + * @retval true is the alarm is active + * + * @api + */ +bool stIsAlarmActive(void) { + + return st_lld_is_alarm_active(); +} + +#if (ST_LLD_NUM_ALARMS > 1) || defined(__DOXYGEN__) +/** + * @brief Determines if the specified alarm is active. + * + * @param[in] alarm alarm channel number (1..ST_LLD_NUM_ALARMS) + * @return The alarm status. + * @retval false if the alarm is not active. + * @retval true is the alarm is active + * + * @api + */ +bool stIsAlarmActiveN(unsigned alarm) { + + return st_lld_is_alarm_active_n(n); +} + +/** + * @brief Starts an additional alarm. + * @note Makes sure that no spurious alarms are triggered after + * this call. + * @note This functionality is only available in free running mode, the + * behavior in periodic mode is undefined. + * + * @param[in] abstime the time to be set for the first alarm + * @param[in] alarm alarm channel number (1..ST_LLD_NUM_ALARMS) + * @param[in] cb alarm callback + * + * @api + */ +void stStartAlarmN(unsigned alarm, systime_t abstime, st_callback_t cb) { + + osalDbgCheck((alarm > 0U) && (alarm < (unsigned)ST_LLD_NUM_ALARMS)); + osalDbgAssert(stIsAlarmActiveN(alarm) == false, "already active"); + + st_callbacks[alarm - 1U] = cb; + st_lld_start_alarm_n(alarm, abstime); +} + +/** + * @brief Stops an additional alarm. + * @note This functionality is only available in free running mode, the + * behavior in periodic mode is undefined. + * + * @param[in] alarm alarm channel number (1..ST_LLD_NUM_ALARMS) + * + * @api + */ +void stStopAlarmN(unsigned alarm) { + + osalDbgCheck((alarm > 0U) && (alarm < (unsigned)ST_LLD_NUM_ALARMS)); + + st_callbacks[alarm - 1U] = NULL; + st_lld_stop_alarm_n(alarm); +} + +/** + * @brief Sets an additional alarm time. + * @note This functionality is only available in free running mode, the + * behavior in periodic mode is undefined. + * + * @param[in] alarm alarm channel number (1..ST_LLD_NUM_ALARMS) + * @param[in] abstime the time to be set for the next alarm + * + * @api + */ +void stSetAlarmN(unsigned alarm, systime_t abstime) { + + osalDbgCheck((alarm > 0U) && (alarm < (unsigned)ST_LLD_NUM_ALARMS)); + osalDbgAssert(stIsAlarmActiveN(alarm) != false, "not active"); + + st_lld_set_alarm_n(alarm, abstime); +} + +/** + * @brief Returns an additional alarm current time. + * @note This functionality is only available in free running mode, the + * behavior in periodic mode is undefined. + * + * @param[in] alarm alarm channel number (1..ST_LLD_NUM_ALARMS) + * @return The currently set alarm time. + * + * @api + */ +systime_t stGetAlarmN(unsigned alarm) { + + osalDbgCheck((alarm > 0U) && (alarm < (unsigned)ST_LLD_NUM_ALARMS)); + osalDbgAssert(stIsAlarmActiveN(alarm) != false, "not active"); + + return st_lld_get_alarm_n(alarm); +} +#endif /* ST_LLD_NUM_ALARMS > 1 */ + +#endif /* OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING */ + +#endif /* OSAL_ST_MODE != OSAL_ST_MODE_NONE */ + +/** @} */ -- cgit v1.2.3