From f9f0c2d10cc7192639f85da017cbdb83ab6a9afa Mon Sep 17 00:00:00 2001 From: Fabien Poussin Date: Tue, 1 Oct 2019 19:50:42 +0200 Subject: Fixed DMA for 19.1.x --- os/hal/ports/STM32/LLD/COMPv1/hal_comp_lld.c | 2 +- os/hal/ports/STM32/LLD/CRCv1/hal_crc_lld.c | 2 +- os/hal/ports/STM32/LLD/FSMCv1/hal_nand_lld.c | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) (limited to 'os/hal') diff --git a/os/hal/ports/STM32/LLD/COMPv1/hal_comp_lld.c b/os/hal/ports/STM32/LLD/COMPv1/hal_comp_lld.c index b1dde2f..a54290e 100644 --- a/os/hal/ports/STM32/LLD/COMPv1/hal_comp_lld.c +++ b/os/hal/ports/STM32/LLD/COMPv1/hal_comp_lld.c @@ -303,7 +303,7 @@ void comp_ext_lld_channel_enable(COMPDriver *compp, uint32_t channel) { if (channel < 32) { #endif /* Masked out lines must not be touched by this driver.*/ - if ((cmask & STM32_EXTI_IMR_MASK) != 0U) { + if ((cmask & STM32_EXTI_IMR1_MASK) != 0U) { return; } diff --git a/os/hal/ports/STM32/LLD/CRCv1/hal_crc_lld.c b/os/hal/ports/STM32/LLD/CRCv1/hal_crc_lld.c index 882022b..993a3ab 100755 --- a/os/hal/ports/STM32/LLD/CRCv1/hal_crc_lld.c +++ b/os/hal/ports/STM32/LLD/CRCv1/hal_crc_lld.c @@ -235,7 +235,7 @@ void crc_lld_start(CRCDriver *crcp) { */ void crc_lld_stop(CRCDriver *crcp) { #if CRC_USE_DMA == TRUE - dmaStreamRelease(crcp->dma); + dmaStreamFree(crcp->dma); #else (void)crcp; #endif diff --git a/os/hal/ports/STM32/LLD/FSMCv1/hal_nand_lld.c b/os/hal/ports/STM32/LLD/FSMCv1/hal_nand_lld.c index 5729f92..cc6dc20 100644 --- a/os/hal/ports/STM32/LLD/FSMCv1/hal_nand_lld.c +++ b/os/hal/ports/STM32/LLD/FSMCv1/hal_nand_lld.c @@ -328,10 +328,10 @@ void nand_lld_start(NANDDriver *nandp) { fsmc_start(&FSMCD1); if (nandp->state == NAND_STOP) { - b = dmaStreamAllocate(nandp->dma, - STM32_EMC_FSMC1_IRQ_PRIORITY, - (stm32_dmaisr_t)nand_lld_serve_transfer_end_irq, - (void *)nandp); + b = dmaStreamAlloc(nandp->dma, + STM32_EMC_FSMC1_IRQ_PRIORITY, + (stm32_dmaisr_t)nand_lld_serve_transfer_end_irq, + (void *)nandp); osalDbgAssert(!b, "stream already allocated"); #if AHB_TRANSACTION_WIDTH == 4 @@ -377,7 +377,7 @@ void nand_lld_start(NANDDriver *nandp) { void nand_lld_stop(NANDDriver *nandp) { if (nandp->state == NAND_READY) { - dmaStreamRelease(nandp->dma); + dmaStreamFree(nandp->dma); nandp->nand->PCR &= ~FSMC_PCR_PBKEN; nand_ready_isr_disable(nandp); nandp->isr_handler = NULL; -- cgit v1.2.3 From 2e17d54017ef2eb2b31a1ed239ad9ebbfda2936a Mon Sep 17 00:00:00 2001 From: Fabien Poussin Date: Wed, 2 Oct 2019 13:09:49 +0200 Subject: Kinetis ADC --- os/hal/ports/KINETIS/LLD/ADCv1/hal_adc_lld.h | 145 ++++++--------------------- 1 file changed, 30 insertions(+), 115 deletions(-) (limited to 'os/hal') diff --git a/os/hal/ports/KINETIS/LLD/ADCv1/hal_adc_lld.h b/os/hal/ports/KINETIS/LLD/ADCv1/hal_adc_lld.h index 2d11a7d..45cf95b 100644 --- a/os/hal/ports/KINETIS/LLD/ADCv1/hal_adc_lld.h +++ b/os/hal/ports/KINETIS/LLD/ADCv1/hal_adc_lld.h @@ -201,132 +201,47 @@ typedef enum { /** * @brief Type of a structure representing an ADC driver. */ -typedef struct ADCDriver ADCDriver; +typedef struct hal_adc_driver 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 + * @brief Low level fields of the ADC configuration structure. */ -typedef void (*adcerrorcallback_t)(ADCDriver *adcp, adcerror_t err); - -/** - * @brief Conversion group configuration structure. - * @details This implementation-dependent structure describes a conversion - * operation. - */ -typedef struct { - /** - * @brief Enables the circular buffer mode for the group. - */ - bool 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 Bitmask of channels for ADC conversion. - */ - uint32_t channel_mask; - /** - * @brief ADC CFG1 register initialization data. - * @note All the required bits must be defined into this field. - */ - uint32_t cfg1; - /** - * @brief ADC SC3 register initialization data. - * @note All the required bits must be defined into this field. - */ +#define adc_lld_configuration_group_fields \ + /** \ + * @brief Bitmask of channels for ADC conversion. \ + */ \ + uint32_t channel_mask; \ + /** \ + * @brief ADC CFG1 register initialization data. \ + * @note All the required bits must be defined into this field. \ + */ \ + uint32_t cfg1; \ + /** \ + * @brief ADC SC3 register initialization data. \ + * @note All the required bits must be defined into this field. \ + */ \ uint32_t sc3; -} ADCConversionGroup; + /** - * @brief Driver configuration structure. - * @note It could be empty on some architectures. + * @brief Low level fields of the ADC configuration structure. */ -typedef struct { - /* Perform first time calibration */ +#define adc_lld_config_fields \ + /* Perform first time calibration */ \ bool calibrate; -} ADCConfig; /** - * @brief Structure representing an ADC driver. + * @brief Low level fields of the ADC driver structure. */ -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_reference_t thread; -#endif -#if ADC_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__) - /** - * @brief Mutex protecting the peripheral. - */ - mutex_t mutex; -#endif /* ADC_USE_MUTUAL_EXCLUSION */ -#if defined(ADC_DRIVER_EXT_FIELDS) - ADC_DRIVER_EXT_FIELDS -#endif - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the ADCx registers block. - */ - ADC_TypeDef *adc; - /** - * @brief Number of samples expected. - */ - size_t number_of_samples; - /** - * @brief Current position in the buffer. - */ - size_t current_index; - /** - * @brief Current channel index into group channel_mask. - */ - size_t current_channel; -}; +#define adc_lld_driver_fields \ + /* Pointer to the ADCx registers block.*/ \ + ADC_TypeDef *adc; \ + /* @brief Number of samples expected. */ \ + size_t number_of_samples; \ + /* @brief Current position in the buffer. */ \ + size_t current_index; \ + /* @brief Current channel index into group channel_mask. */ \ + size_t current_channel; \ /*===========================================================================*/ /* Driver macros. */ -- cgit v1.2.3 From bc65ee451393f7cc67e874fd56f0aa55671a4069 Mon Sep 17 00:00:00 2001 From: Fabien Poussin Date: Wed, 2 Oct 2019 13:54:24 +0200 Subject: Kinetis SPI driver --- os/hal/ports/KINETIS/LLD/SPIv1/hal_spi_lld.h | 85 +++++----------------------- 1 file changed, 13 insertions(+), 72 deletions(-) (limited to 'os/hal') diff --git a/os/hal/ports/KINETIS/LLD/SPIv1/hal_spi_lld.h b/os/hal/ports/KINETIS/LLD/SPIv1/hal_spi_lld.h index d25dd75..cadc240 100644 --- a/os/hal/ports/KINETIS/LLD/SPIv1/hal_spi_lld.h +++ b/os/hal/ports/KINETIS/LLD/SPIv1/hal_spi_lld.h @@ -105,11 +105,6 @@ /* Driver data structures and types. */ /*===========================================================================*/ -/** - * @brief Type of a structure representing an SPI driver. - */ -typedef struct SPIDriver SPIDriver; - /** * @brief SPI notification callback type. * @@ -119,77 +114,23 @@ typedef struct SPIDriver SPIDriver; typedef void (*spicallback_t)(SPIDriver *spip); /** - * @brief Driver configuration structure. + * @brief Low level fields of the SPI configuration structure. */ -typedef struct { - /** - * @brief Operation complete callback or @p NULL. - */ - spicallback_t end_cb; - /* End of the mandatory fields.*/ - /** - * @brief The chip select line port - when not using pcs. - */ - ioportid_t ssport; - /** - * @brief The chip select line pad number - when not using pcs. - */ - uint16_t sspad; - /** - * @brief SPI initialization data. - */ +#define spi_lld_config_fields \ + /* @brief SPI initialization data. */ \ uint32_t tar0; -} SPIConfig; -/** - * @brief Structure representing a SPI driver. - */ -struct SPIDriver { - /** - * @brief Driver state. - */ - spistate_t state; - /** - * @brief Current configuration data. - */ - const SPIConfig *config; -#if SPI_USE_WAIT || defined(__DOXYGEN__) - /** - * @brief Waiting thread. - */ - thread_reference_t thread; -#endif /* SPI_USE_WAIT */ -#if SPI_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__) - /** - * @brief Mutex protecting the bus. - */ - mutex_t mutex; -#endif /* SPI_USE_MUTUAL_EXCLUSION */ -#if defined(SPI_DRIVER_EXT_FIELDS) - SPI_DRIVER_EXT_FIELDS -#endif - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the SPIx registers block. - */ - SPI_TypeDef *spi; - /** - * @brief Number of bytes/words of data to transfer. - */ - size_t count; - /** - * @brief Word size in bytes. - */ - size_t word_size; - /** - * @brief Pointer to the buffer with data to send. - */ - const uint8_t *txbuf; - /** - * @brief Pointer to the buffer to put received data. - */ +#define spi_lld_driver_fields \ + /* @brief Pointer to the SPIx registers block. */ \ + SPI_TypeDef *spi; \ + /* @brief Number of bytes/words of data to transfer. */ \ + size_t count; \ + /* @brief Word size in bytes. */ \ + size_t word_size; \ + /* @brief Pointer to the buffer with data to send. */ \ + const uint8_t *txbuf; \ + /* @brief Pointer to the buffer to put received data. */ \ uint8_t *rxbuf; -}; /*===========================================================================*/ /* Driver macros. */ -- cgit v1.2.3 From de7bb19599a28715826bf6ce0f4a54be2a34f7f0 Mon Sep 17 00:00:00 2001 From: Fabien Poussin Date: Wed, 2 Oct 2019 15:19:07 +0200 Subject: NRF51 ADC fix --- os/hal/ports/NRF5/LLD/ADCv1/hal_adc_lld.h | 140 +++++++----------------------- 1 file changed, 33 insertions(+), 107 deletions(-) (limited to 'os/hal') diff --git a/os/hal/ports/NRF5/LLD/ADCv1/hal_adc_lld.h b/os/hal/ports/NRF5/LLD/ADCv1/hal_adc_lld.h index 4e185d5..1497727 100644 --- a/os/hal/ports/NRF5/LLD/ADCv1/hal_adc_lld.h +++ b/os/hal/ports/NRF5/LLD/ADCv1/hal_adc_lld.h @@ -73,6 +73,15 @@ /*===========================================================================*/ /* Driver data structures and types. */ /*===========================================================================*/ +/** + * @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 ADC sample data type. @@ -85,118 +94,35 @@ typedef uint16_t adcsample_t; typedef uint8_t adc_channels_num_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 + * @brief Low level fields of the ADC driver structure. */ -typedef void (*adccallback_t)(ADCDriver *adcp, adcsample_t *buffer, size_t n); +#define adc_lld_driver_fields \ + /* @brief Pointer to the ADCx registers block. */ \ + NRF_ADC_Type *adc; \ + /* @brief Number of samples expected. */ \ + size_t number_of_samples; \ + /* @brief Current position in the buffer. */ \ + size_t current_index; \ + /* @brief Current channel index into group channel_mask. */ \ + size_t current_channel; /** - * @brief Conversion group configuration structure. - * @details This implementation-dependent structure describes a conversion - * operation. - * @note The use of this configuration structure requires knowledge of - * STM32 ADC cell registers interface, please refer to the STM32 - * reference manual for details. + * @brief Low level fields of the ADC configuration structure. */ -typedef struct { - /** - * @brief Enables the circular buffer mode for the group. - */ - bool 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; - /* End of the mandatory fields.*/ - /** - * @brief Bitmask of channels for ADC conversion. - */ - uint32_t channel_mask; - /** - * @brief ADC CONFIG register details. - * @note All the required bits must be defined into this field. - */ +#define adc_lld_config_fields \ + /* Dummy configuration, it is not needed.*/ \ + uint32_t dummy + +#define adc_lld_configuration_group_fields \ + /** \ + * @brief Bitmask of channels for ADC conversion. \ + */ \ + uint32_t channel_mask; \ + /** \ + * @brief ADC CONFIG register details. \ + * @note All the required bits must be defined into this field. \ + */ \ uint32_t cfg; -} 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_reference_t thread; -#endif -#if ADC_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__) - /** - * @brief Mutex protecting the peripheral. - */ - mutex_t mutex; -#endif /* ADC_USE_MUTUAL_EXCLUSION */ -#if defined(ADC_DRIVER_EXT_FIELDS) - ADC_DRIVER_EXT_FIELDS -#endif - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the ADCx registers block. - */ - NRF_ADC_Type *adc; - /** - * @brief Number of samples expected. - */ - size_t number_of_samples; - /** - * @brief Current position in the buffer. - */ - size_t current_index; - /** - * @brief Current channel index into group channel_mask. - */ - size_t current_channel; -}; /*===========================================================================*/ /* Driver macros. */ -- cgit v1.2.3 From 8282de41346a9a761db877c53f3f1f697eadac5a Mon Sep 17 00:00:00 2001 From: Fabien Poussin Date: Wed, 2 Oct 2019 15:57:56 +0200 Subject: NRF SPI driver fix --- os/hal/ports/NRF5/LLD/SPIv1/hal_spi_lld.h | 124 ++++++------------------------ 1 file changed, 25 insertions(+), 99 deletions(-) (limited to 'os/hal') diff --git a/os/hal/ports/NRF5/LLD/SPIv1/hal_spi_lld.h b/os/hal/ports/NRF5/LLD/SPIv1/hal_spi_lld.h index 1c6d858..09ff381 100644 --- a/os/hal/ports/NRF5/LLD/SPIv1/hal_spi_lld.h +++ b/os/hal/ports/NRF5/LLD/SPIv1/hal_spi_lld.h @@ -79,19 +79,6 @@ /* Driver data structures and types. */ /*===========================================================================*/ -/** - * @brief Type of a structure representing an SPI driver. - */ -typedef struct SPIDriver SPIDriver; - -/** - * @brief SPI notification callback type. - * - * @param[in] spip pointer to the @p SPIDriver object triggering the - * callback - */ -typedef void (*spicallback_t)(SPIDriver *spip); - /** * @brief SPI frequency */ @@ -106,97 +93,36 @@ typedef enum { } spifreq_t; /** - * @brief Driver configuration structure. + * @brief Low level fields of the SPI configuration structure. */ -typedef struct { - /** - * @brief Operation complete callback or @p NULL. - */ - spicallback_t end_cb; - /** - * @brief The frequency of the SPI peripheral - */ - spifreq_t freq; - /** - * @brief The SCK pad - */ - uint16_t sckpad; - /** - * @brief The MOSI pad - */ - uint16_t mosipad; - /** - * @brief The MOSI pad - */ - uint16_t misopad; - /* End of the mandatory fields.*/ - /** - * @brief The chip select line pad number. - */ - uint16_t sspad; - /** - * @brief Shift out least significant bit first - */ - uint8_t lsbfirst; - /** - * @brief SPI mode - */ - uint8_t mode; -} SPIConfig; +#define spi_lld_config_fields \ + /* @brief The frequency of the SPI peripheral */ \ + spifreq_t freq; \ + /* @brief The SCK pad */ \ + uint16_t sckpad; \ + /* @brief The MOSI pad */ \ + uint16_t mosipad; \ + /* @brief The MOSI pad */ \ + uint16_t misopad; \ + /* @brief Shift out least significant bit first */ \ + uint8_t lsbfirst; \ + /* @brief SPI mode */ \ + uint8_t mode; \ /** - * @brief Structure representing a SPI driver. + * @brief Low level fields of the SPI driver structure. */ -struct SPIDriver { - /** - * @brief Driver state. - */ - spistate_t state; - /** - * @brief Current configuration data. - */ - const SPIConfig *config; -#if SPI_USE_WAIT || defined(__DOXYGEN__) - /** - * @brief Waiting thread. - */ - thread_reference_t thread; -#endif /* SPI_USE_WAIT */ -#if SPI_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__) -#if CH_CFG_USE_MUTEXES || defined(__DOXYGEN__) - /** - * @brief Mutex protecting the bus. - */ - mutex_t mutex; -#elif CH_CFG_USE_SEMAPHORES - semaphore_t semaphore; -#endif -#endif /* SPI_USE_MUTUAL_EXCLUSION */ -#if defined(SPI_DRIVER_EXT_FIELDS) - SPI_DRIVER_EXT_FIELDS -#endif - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the SPI port. - */ - NRF_SPI_Type *port; - /** - * @brief Number of bytes yet to be received. - */ - uint32_t rxcnt; - /** - * @brief Receive pointer or @p NULL. - */ - void *rxptr; - /** - * @brief Number of bytes yet to be transmitted. - */ - uint32_t txcnt; - /** - * @brief Transmit pointer or @p NULL. - */ +#define spi_lld_driver_fields \ + /* @brief Pointer to the SPI port. */ \ + NRF_SPI_Type *port; \ + /* @brief Number of bytes yet to be received. */ \ + uint32_t rxcnt; \ + /* @brief Receive pointer or @p NULL. */ \ + void *rxptr; \ + /* @brief Number of bytes yet to be transmitted. */ \ + uint32_t txcnt; \ + /* @brief Transmit pointer or @p NULL. */ \ const void *txptr; -}; /*===========================================================================*/ /* Driver macros. */ -- cgit v1.2.3