diff options
Diffstat (limited to 'os/hal')
-rw-r--r-- | os/hal/platforms/SPC5xx/EQADC_v1/adc_lld.c | 152 | ||||
-rw-r--r-- | os/hal/platforms/SPC5xx/EQADC_v1/adc_lld.h | 268 | ||||
-rw-r--r-- | os/hal/platforms/SPC5xx/ESCI_v1/serial_lld.h | 2 | ||||
-rw-r--r-- | os/hal/templates/adc_lld.c | 2 | ||||
-rw-r--r-- | os/hal/templates/can_lld.c | 2 | ||||
-rw-r--r-- | os/hal/templates/ext_lld.c | 2 | ||||
-rw-r--r-- | os/hal/templates/gpt_lld.c | 2 | ||||
-rw-r--r-- | os/hal/templates/i2c_lld.c | 2 | ||||
-rw-r--r-- | os/hal/templates/icu_lld.c | 2 | ||||
-rw-r--r-- | os/hal/templates/mac_lld.c | 2 | ||||
-rw-r--r-- | os/hal/templates/meta/driver_lld.c | 2 | ||||
-rw-r--r-- | os/hal/templates/pwm_lld.c | 2 | ||||
-rw-r--r-- | os/hal/templates/serial_lld.c | 2 | ||||
-rw-r--r-- | os/hal/templates/spi_lld.c | 2 | ||||
-rw-r--r-- | os/hal/templates/uart_lld.c | 2 | ||||
-rw-r--r-- | os/hal/templates/usb_lld.c | 2 |
16 files changed, 434 insertions, 14 deletions
diff --git a/os/hal/platforms/SPC5xx/EQADC_v1/adc_lld.c b/os/hal/platforms/SPC5xx/EQADC_v1/adc_lld.c new file mode 100644 index 000000000..083d84500 --- /dev/null +++ b/os/hal/platforms/SPC5xx/EQADC_v1/adc_lld.c @@ -0,0 +1,152 @@ +/*
+ * Licensed under ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
+ *
+ * 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 SPC5xx/EQADC_v1/adc_lld.c
+ * @brief SPC5xx low level ADC driver code.
+ *
+ * @addtogroup ADC
+ * @{
+ */
+
+#include "ch.h"
+#include "hal.h"
+
+#if HAL_USE_ADC || defined(__DOXYGEN__)
+
+/*===========================================================================*/
+/* Driver local definitions. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver exported variables. */
+/*===========================================================================*/
+
+/**
+ * @brief ADCD1 driver identifier.
+ */
+#if SPC5_ADC_USE_EQADC1_Q0 || defined(__DOXYGEN__)
+ADCDriver ADCD10;
+#endif
+
+/**
+ * @brief ADCD20 driver identifier.
+ */
+#if SPC5_ADC_USE_EQADC2_Q0 || defined(__DOXYGEN__)
+ADCDriver ADCD20;
+#endif
+
+/*===========================================================================*/
+/* Driver local variables. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver local functions. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver interrupt handlers. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver exported functions. */
+/*===========================================================================*/
+
+/**
+ * @brief Low level ADC driver initialization.
+ *
+ * @notapi
+ */
+void adc_lld_init(void) {
+
+#if SPC5_ADC_USE_EQADC1_Q0
+ /* Driver initialization.*/
+ adcObjectInit(&ADCD10);
+#endif /* SPC5_ADC_USE_EQADC1_Q0 */
+
+#if SPC5_ADC_USE_EQADC2_Q0
+ /* Driver initialization.*/
+ adcObjectInit(&ADCD20);
+#endif /* SPC5_ADC_USE_EQADC2_Q0 */
+}
+
+/**
+ * @brief Configures and activates the ADC peripheral.
+ *
+ * @param[in] adcp pointer to the @p ADCDriver object
+ *
+ * @notapi
+ */
+void adc_lld_start(ADCDriver *adcp) {
+
+ if (adcp->state == ADC_STOP) {
+ /* Enables the peripheral.*/
+#if SPC5_ADC_USE_EQADC1_Q0
+ if (&ADCD10 == adcp) {
+
+ }
+#endif /* SPC5_ADC_USE_EQADC1_Q0 */
+ }
+ /* Configures the peripheral.*/
+
+}
+
+/**
+ * @brief Deactivates the ADC peripheral.
+ *
+ * @param[in] adcp pointer to the @p ADCDriver object
+ *
+ * @notapi
+ */
+void adc_lld_stop(ADCDriver *adcp) {
+
+ if (adcp->state == ADC_READY) {
+ /* Resets the peripheral.*/
+
+ /* Disables the peripheral.*/
+#if SPC5_ADC_USE_EQADC1_Q0
+ if (&ADCD1 == adcp) {
+
+ }
+#endif /* SPC5_ADC_USE_EQADC1_Q0 */
+ }
+}
+
+/**
+ * @brief Starts an ADC conversion.
+ *
+ * @param[in] adcp pointer to the @p ADCDriver object
+ *
+ * @notapi
+ */
+void adc_lld_start_conversion(ADCDriver *adcp) {
+
+ (void)adcp;
+}
+
+/**
+ * @brief Stops an ongoing conversion.
+ *
+ * @param[in] adcp pointer to the @p ADCDriver object
+ *
+ * @notapi
+ */
+void adc_lld_stop_conversion(ADCDriver *adcp) {
+
+ (void)adcp;
+}
+
+#endif /* HAL_USE_ADC */
+
+/** @} */
diff --git a/os/hal/platforms/SPC5xx/EQADC_v1/adc_lld.h b/os/hal/platforms/SPC5xx/EQADC_v1/adc_lld.h new file mode 100644 index 000000000..e04da1b69 --- /dev/null +++ b/os/hal/platforms/SPC5xx/EQADC_v1/adc_lld.h @@ -0,0 +1,268 @@ +/*
+ * Licensed under ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
+ *
+ * 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 SPC5xx/EQADC_v1/adc_lld.c
+ * @brief SPC5xx low level ADC driver header.
+ *
+ * @addtogroup ADC
+ * @{
+ */
+
+#ifndef _ADC_LLD_H_
+#define _ADC_LLD_H_
+
+#if HAL_USE_ADC || defined(__DOXYGEN__)
+
+/*===========================================================================*/
+/* Driver constants. */
+/*===========================================================================*/
+
+/**
+ * @name CFIFO commands
+ * @{
+ */
+#define ADC_CFIFO_CHANNEL_MASK (0xFFU << 8)/**< @brief Channel number mask.*/
+#define ADC_CFIFO_CHANNEL(n) ((n) << 8) /**< @brief Channel number. */
+#define ADC_CFIFO_FMT_RJU (0U << 16) /**< @brief Unsigned samples. */
+#define ADC_CFIFO_FMT_RJS (1U << 16) /**< @brief Signed samples. */
+#define ADC_CFIFO_TSR (1U << 17) /**< @brief Time stamp request. */
+#define ADC_CFIFO_LST_MASK (3U << 18) /**< @brief Sample time. */
+#define ADC_CFIFO_LST_2 (0U << 18) /**< @brief 2 clock cycles. */
+#define ADC_CFIFO_LST_8 (1U << 18) /**< @brief 8 clock cycles. */
+#define ADC_CFIFO_LST_64 (2U << 18) /**< @brief 64 clock cycles. */
+#define ADC_CFIFO_LST_128 (3U << 18) /**< @brief 128 clock cycles. */
+#define ADC_CFIFO_MSG_MASK (15U << 20) /**< @brief Message mask. */
+#define ADC_CFIFO_MSG_RFIFO(n) ((n) << 20) /**< @brief Result in RFIFO0..5.*/
+#define ADC_CFIFO_MSG_NULL (6U << 20) /**< @brief Null message. */
+#define ADC_CFIFO_CAL (1U << 24) /**< @brief Calibrated result. */
+#define ADC_CFIFO_BN_MASK (1U << 25) /**< @brief Buffer number mask. */
+#define ADC_CFIFO_BN(n) ((n) << 25) /**< @brief Buffer number. */
+#define ADC_CFIFO_REP (1U << 29) /**< @brief Repeat loop flag. */
+#define ADC_CFIFO_PAUSE (1U << 30) /**< @brief Pause flag. */
+#define ADC_CFIFO_EOQ (1U << 31) /**< @brief End of queue flag. */
+/** @} */
+
+/*===========================================================================*/
+/* Driver pre-compile time settings. */
+/*===========================================================================*/
+
+/**
+ * @name Configuration options
+ * @{
+ */
+/**
+ * @brief ADCD10 driver enable switch.
+ * @details If set to @p TRUE the support for EQADC1 queue 0 is included.
+ * @note The default is @p FALSE.
+ */
+#if !defined(SPC5_ADC_USE_EQADC1_Q0) || defined(__DOXYGEN__)
+#define SPC5_ADC_USE_EQADC1_Q0 FALSE
+#endif
+
+/**
+ * @brief ADCD20 driver enable switch.
+ * @details If set to @p TRUE the support for EQADC2 queue 0 is included.
+ * @note The default is @p FALSE.
+ */
+#if !defined(SPC5_ADC_USE_EQADC2_Q0) || defined(__DOXYGEN__)
+#define SPC5_ADC_USE_EQADC2_Q0 FALSE
+#endif
+/** @} */
+
+/*===========================================================================*/
+/* Derived constants and error checks. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver data structures and types. */
+/*===========================================================================*/
+
+/**
+ * @brief ADC command data type.
+ */
+typedef uint32_t adccommand_t;
+
+/**
+ * @brief ADC sample data type.
+ */
+typedef uint16_t adcsample_t;
+
+/**
+ * @brief Channels number in a conversion group.
+ */
+typedef uint16_t adc_channels_num_t;
+
+/**
+ * @brief Possible ADC failure causes.
+ * @note Error codes are architecture dependent and should not relied
+ * upon.
+ */
+typedef enum {
+ ADC_ERR_DMAFAILURE = 0, /**< DMA operations failure. */
+ ADC_ERR_OVERFLOW = 1 /**< ADC overflow condition. */
+} adcerror_t;
+
+/**
+ * @brief Type of a structure representing an ADC driver.
+ */
+typedef struct ADCDriver ADCDriver;
+
+/**
+ * @brief ADC notification callback type.
+ *
+ * @param[in] adcp pointer to the @p ADCDriver object triggering the
+ * callback
+ * @param[in] buffer pointer to the most recent samples data
+ * @param[in] n number of buffer rows available starting from @p buffer
+ */
+typedef void (*adccallback_t)(ADCDriver *adcp, adcsample_t *buffer, size_t n);
+
+/**
+ * @brief ADC error callback type.
+ *
+ * @param[in] adcp pointer to the @p ADCDriver object triggering the
+ * callback
+ * @param[in] err ADC error code
+ */
+typedef void (*adcerrorcallback_t)(ADCDriver *adcp, adcerror_t err);
+
+/**
+ * @brief Conversion group configuration structure.
+ * @details This implementation-dependent structure describes a conversion
+ * operation.
+ * @note Implementations may extend this structure to contain more,
+ * architecture dependent, fields.
+ */
+typedef struct {
+ /**
+ * @brief Enables the circular buffer mode for the group.
+ */
+ bool_t circular;
+ /**
+ * @brief Number of the analog channels belonging to the conversion group.
+ */
+ adc_channels_num_t num_channels;
+ /**
+ * @brief Callback function associated to the group or @p NULL.
+ */
+ adccallback_t end_cb;
+ /**
+ * @brief Error callback or @p NULL.
+ */
+ adcerrorcallback_t error_cb;
+ /* End of the mandatory fields.*/
+ /**
+ * @brief Number of command iterations stored in @p commands.
+ * @note The total number of array elements must be @p num_channels *
+ * @p num_iterations.
+ * @note This fields is the upper limit of the parameter @p n that can
+ * be passed to the functions @p adcConvert() and
+ * @p adcStartConversion().
+ */
+ uint32_t num_iterations;
+ /**
+ * @brief Pointer to an array of low level EQADC commands to be pushed
+ * into the CFIFO during a conversion.
+ */
+ const adccommand_t *commands;
+} ADCConversionGroup;
+
+/**
+ * @brief Driver configuration structure.
+ * @note It could be empty on some architectures.
+ */
+typedef struct {
+ uint32_t dummy;
+} ADCConfig;
+
+/**
+ * @brief Structure representing an ADC driver.
+ */
+struct ADCDriver {
+ /**
+ * @brief Driver state.
+ */
+ adcstate_t state;
+ /**
+ * @brief Current configuration data.
+ */
+ const ADCConfig *config;
+ /**
+ * @brief Current samples buffer pointer or @p NULL.
+ */
+ adcsample_t *samples;
+ /**
+ * @brief Current samples buffer depth or @p 0.
+ */
+ size_t depth;
+ /**
+ * @brief Current conversion group pointer or @p NULL.
+ */
+ const ADCConversionGroup *grpp;
+#if ADC_USE_WAIT || defined(__DOXYGEN__)
+ /**
+ * @brief Waiting thread.
+ */
+ Thread *thread;
+#endif
+#if ADC_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__)
+#if CH_USE_MUTEXES || defined(__DOXYGEN__)
+ /**
+ * @brief Mutex protecting the peripheral.
+ */
+ Mutex mutex;
+#elif CH_USE_SEMAPHORES
+ Semaphore semaphore;
+#endif
+#endif /* ADC_USE_MUTUAL_EXCLUSION */
+#if defined(ADC_DRIVER_EXT_FIELDS)
+ ADC_DRIVER_EXT_FIELDS
+#endif
+ /* End of the mandatory fields.*/
+};
+
+/*===========================================================================*/
+/* Driver macros. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* External declarations. */
+/*===========================================================================*/
+
+#if SPC5_ADC_USE_EQADC1_Q0 && !defined(__DOXYGEN__)
+extern ADCDriver ADCD10;
+#endif
+
+#if SPC5_ADC_USE_EQADC2_Q0 && !defined(__DOXYGEN__)
+extern ADCDriver ADCD20;
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ void adc_lld_init(void);
+ void adc_lld_start(ADCDriver *adcp);
+ void adc_lld_stop(ADCDriver *adcp);
+ void adc_lld_start_conversion(ADCDriver *adcp);
+ void adc_lld_stop_conversion(ADCDriver *adcp);
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* HAL_USE_ADC */
+
+#endif /* _ADC_LLD_H_ */
+
+/** @} */
diff --git a/os/hal/platforms/SPC5xx/ESCI_v1/serial_lld.h b/os/hal/platforms/SPC5xx/ESCI_v1/serial_lld.h index 2624ef413..93fd94a10 100644 --- a/os/hal/platforms/SPC5xx/ESCI_v1/serial_lld.h +++ b/os/hal/platforms/SPC5xx/ESCI_v1/serial_lld.h @@ -14,7 +14,7 @@ /**
* @file SPC5xx/ESCI_v1/serial_lld.c
- * @brief SPC5xx low level serial driver code.
+ * @brief SPC5xx low level serial driver header.
*
* @addtogroup SERIAL
* @{
diff --git a/os/hal/templates/adc_lld.c b/os/hal/templates/adc_lld.c index 8b058ab3c..bd98d9d93 100644 --- a/os/hal/templates/adc_lld.c +++ b/os/hal/templates/adc_lld.c @@ -85,7 +85,7 @@ void adc_lld_init(void) { void adc_lld_start(ADCDriver *adcp) {
if (adcp->state == ADC_STOP) {
- /* Enables the pehipheral.*/
+ /* Enables the peripheral.*/
#if PLATFORM_ADC_USE_ADC1
if (&ADCD1 == adcp) {
diff --git a/os/hal/templates/can_lld.c b/os/hal/templates/can_lld.c index b00cc2c8b..e220f2a3d 100644 --- a/os/hal/templates/can_lld.c +++ b/os/hal/templates/can_lld.c @@ -85,7 +85,7 @@ void can_lld_init(void) { void can_lld_start(CANDriver *canp) {
if (canp->state == CAN_STOP) {
- /* Enables the pehipheral.*/
+ /* Enables the peripheral.*/
#if PLATFORM_CAN_USE_CAN1
if (&CAND1 == canp) {
diff --git a/os/hal/templates/ext_lld.c b/os/hal/templates/ext_lld.c index e1ce295b7..d26e0acf6 100644 --- a/os/hal/templates/ext_lld.c +++ b/os/hal/templates/ext_lld.c @@ -85,7 +85,7 @@ void ext_lld_init(void) { void ext_lld_start(EXTDriver *extp) {
if (extp->state == EXT_STOP) {
- /* Enables the pehipheral.*/
+ /* Enables the peripheral.*/
#if PLATFORM_EXT_USE_EXT1
if (&EXTD1 == extp) {
diff --git a/os/hal/templates/gpt_lld.c b/os/hal/templates/gpt_lld.c index be2241144..de1b5fe13 100644 --- a/os/hal/templates/gpt_lld.c +++ b/os/hal/templates/gpt_lld.c @@ -85,7 +85,7 @@ void gpt_lld_init(void) { void gpt_lld_start(GPTDriver *gptp) {
if (gptp->state == GPT_STOP) {
- /* Enables the pehipheral.*/
+ /* Enables the peripheral.*/
#if PLATFORM_GPT_USE_GPT1
if (&GPTD1 == gptp) {
diff --git a/os/hal/templates/i2c_lld.c b/os/hal/templates/i2c_lld.c index 9c47cd40e..015962628 100644 --- a/os/hal/templates/i2c_lld.c +++ b/os/hal/templates/i2c_lld.c @@ -84,7 +84,7 @@ void i2c_lld_init(void) { void i2c_lld_start(I2CDriver *i2cp) {
if (i2cp->state == I2C_STOP) {
- /* Enables the pehipheral.*/
+ /* Enables the peripheral.*/
#if PLATFORM_I2C_USE_I2C1
if (&I2CD1 == i2cp) {
diff --git a/os/hal/templates/icu_lld.c b/os/hal/templates/icu_lld.c index 008d75c22..fa41fb874 100644 --- a/os/hal/templates/icu_lld.c +++ b/os/hal/templates/icu_lld.c @@ -85,7 +85,7 @@ void icu_lld_init(void) { void icu_lld_start(ICUDriver *icup) {
if (icup->state == ICU_STOP) {
- /* Enables the pehipheral.*/
+ /* Enables the peripheral.*/
#if PLATFORM_ICU_USE_ICU1
if (&ICUD1 == icup) {
diff --git a/os/hal/templates/mac_lld.c b/os/hal/templates/mac_lld.c index b442d0879..f87a8cc22 100644 --- a/os/hal/templates/mac_lld.c +++ b/os/hal/templates/mac_lld.c @@ -88,7 +88,7 @@ void mac_lld_init(void) { void mac_lld_start(MACDriver *macp) {
if (macp->state == MAC_STOP) {
- /* Enables the pehipheral.*/
+ /* Enables the peripheral.*/
#if PLATFORM_MAC_USE_MAC1
if (&MACD1 == macp) {
diff --git a/os/hal/templates/meta/driver_lld.c b/os/hal/templates/meta/driver_lld.c index 91ff4a0b6..62076bd2d 100644 --- a/os/hal/templates/meta/driver_lld.c +++ b/os/hal/templates/meta/driver_lld.c @@ -85,7 +85,7 @@ void xxx_lld_init(void) { void xxx_lld_start(XXXDriver *xxxp) {
if (xxxp->state == XXX_STOP) {
- /* Enables the pehipheral.*/
+ /* Enables the peripheral.*/
#if PLATFORM_XXX_USE_XXX1
if (&XXXD1 == xxxp) {
diff --git a/os/hal/templates/pwm_lld.c b/os/hal/templates/pwm_lld.c index f8744e478..0993e5655 100644 --- a/os/hal/templates/pwm_lld.c +++ b/os/hal/templates/pwm_lld.c @@ -85,7 +85,7 @@ void pwm_lld_init(void) { void pwm_lld_start(PWMDriver *pwmp) {
if (pwmp->state == PWM_STOP) {
- /* Enables the pehipheral.*/
+ /* Enables the peripheral.*/
#if PLATFORM_PWM_USE_PWM1
if (&PWMD1 == pwmp) {
diff --git a/os/hal/templates/serial_lld.c b/os/hal/templates/serial_lld.c index 79cf9229e..8b4ac4b24 100644 --- a/os/hal/templates/serial_lld.c +++ b/os/hal/templates/serial_lld.c @@ -98,7 +98,7 @@ void sd_lld_start(SerialDriver *sdp, const SerialConfig *config) { config = &default_config;
if (sdp->state == SD_STOP) {
- /* Enables the pehipheral.*/
+ /* Enables the peripheral.*/
#if PLATFORM_SERIAL_USE_SD1
if (&SD1 == sdp) {
diff --git a/os/hal/templates/spi_lld.c b/os/hal/templates/spi_lld.c index d25a91ae4..49147edea 100644 --- a/os/hal/templates/spi_lld.c +++ b/os/hal/templates/spi_lld.c @@ -85,7 +85,7 @@ void spi_lld_init(void) { void spi_lld_start(SPIDriver *spip) {
if (spip->state == SPI_STOP) {
- /* Enables the pehipheral.*/
+ /* Enables the peripheral.*/
#if PLATFORM_SPI_USE_SPI1
if (&SPID1 == spip) {
diff --git a/os/hal/templates/uart_lld.c b/os/hal/templates/uart_lld.c index 40c88b5a2..45c53fb12 100644 --- a/os/hal/templates/uart_lld.c +++ b/os/hal/templates/uart_lld.c @@ -85,7 +85,7 @@ void uart_lld_init(void) { void uart_lld_start(UARTDriver *uartp) {
if (uartp->state == UART_STOP) {
- /* Enables the pehipheral.*/
+ /* Enables the peripheral.*/
#if PLATFORM_UART_USE_UART1
if (&UARTD1 == uartp) {
diff --git a/os/hal/templates/usb_lld.c b/os/hal/templates/usb_lld.c index c5138e497..dd629ce5f 100644 --- a/os/hal/templates/usb_lld.c +++ b/os/hal/templates/usb_lld.c @@ -119,7 +119,7 @@ void usb_lld_init(void) { void usb_lld_start(USBDriver *usbp) {
if (usbp->state == USB_STOP) {
- /* Enables the pehipheral.*/
+ /* Enables the peripheral.*/
#if PLATFORM_USB_USE_USB1
if (&USBD1 == usbp) {
|