HAL callbacks rework.

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@12470 110e8d01-0319-4d1e-a829-52ad28d1bb01
This commit is contained in:
gdisirio 2018-12-15 17:50:05 +00:00
parent 984f865b45
commit f20ecc7817
30 changed files with 233 additions and 202 deletions

View File

@ -104,11 +104,8 @@ typedef struct hal_adc_configuration_group ADCConversionGroup;
* @brief Type of an ADC notification callback. * @brief Type of an ADC notification callback.
* *
* @param[in] adcp pointer to the @p ADCDriver object triggering the * @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); typedef void (*adccallback_t)(ADCDriver *adcp);
/** /**
* @brief Type of an ADC error callback. * @brief Type of an ADC error callback.
@ -203,6 +200,26 @@ struct hal_adc_driver {
/* Driver macros. */ /* Driver macros. */
/*===========================================================================*/ /*===========================================================================*/
/**
* @name Macro Functions
* @{
*/
/**
* @brief Buffer state.
* @note This function is meant to be called from the SPI callback only.
*
* @param[in] adcp pointer to the @p ADCDriver object
* @return The buffer state.
* @retval false if the driver filled/sent the first half of the
* buffer.
* @retval true if the driver filled/sent the second half of the
* buffer.
*
* @special
*/
#define adcIsBufferComplete(adcp) ((bool)((adcp)->state == ADC_COMPLETE))
/** @} */
/** /**
* @name Low level driver helper macros * @name Low level driver helper macros
* @{ * @{
@ -275,7 +292,7 @@ struct hal_adc_driver {
*/ */
#define _adc_isr_half_code(adcp) { \ #define _adc_isr_half_code(adcp) { \
if ((adcp)->grpp->end_cb != NULL) { \ if ((adcp)->grpp->end_cb != NULL) { \
(adcp)->grpp->end_cb(adcp, (adcp)->samples, (adcp)->depth / 2); \ (adcp)->grpp->end_cb(adcp); \
} \ } \
} }
@ -297,15 +314,10 @@ struct hal_adc_driver {
if ((adcp)->grpp->circular) { \ if ((adcp)->grpp->circular) { \
/* Callback handling.*/ \ /* Callback handling.*/ \
if ((adcp)->grpp->end_cb != NULL) { \ if ((adcp)->grpp->end_cb != NULL) { \
if ((adcp)->depth > 1) { \ (adcp)->state = ADC_COMPLETE; \
/* Invokes the callback passing the 2nd half of the buffer.*/ \ (adcp)->grpp->end_cb(adcp); \
size_t half = (adcp)->depth / 2; \ if ((adcp)->state == ADC_COMPLETE) { \
size_t half_index = half * (adcp)->grpp->num_channels; \ (adcp)->state = ADC_ACTIVE; \
(adcp)->grpp->end_cb(adcp, (adcp)->samples + half_index, half); \
} \
else { \
/* Invokes the callback passing the whole buffer.*/ \
(adcp)->grpp->end_cb(adcp, (adcp)->samples, (adcp)->depth); \
} \ } \
} \ } \
} \ } \
@ -314,8 +326,7 @@ struct hal_adc_driver {
adc_lld_stop_conversion(adcp); \ adc_lld_stop_conversion(adcp); \
if ((adcp)->grpp->end_cb != NULL) { \ if ((adcp)->grpp->end_cb != NULL) { \
(adcp)->state = ADC_COMPLETE; \ (adcp)->state = ADC_COMPLETE; \
/* Invoke the callback passing the whole buffer.*/ \ (adcp)->grpp->end_cb(adcp); \
(adcp)->grpp->end_cb(adcp, (adcp)->samples, (adcp)->depth); \
if ((adcp)->state == ADC_COMPLETE) { \ if ((adcp)->state == ADC_COMPLETE) { \
(adcp)->state = ADC_READY; \ (adcp)->state = ADC_READY; \
(adcp)->grpp = NULL; \ (adcp)->grpp = NULL; \

View File

@ -99,11 +99,8 @@ typedef struct hal_dac_conversion_group DACConversionGroup;
* @brief DAC notification callback type. * @brief DAC notification callback type.
* *
* @param[in] dacp pointer to the @p DACDriver object triggering the * @param[in] dacp pointer to the @p DACDriver object triggering the
* @param[in] buffer pointer to the next semi-buffer to be filled
* @param[in] n number of buffer rows available starting from @p buffer
* callback
*/ */
typedef void (*daccallback_t)(DACDriver *dacp, dacsample_t *buffer, size_t n); typedef void (*daccallback_t)(DACDriver *dacp);
/** /**
* @brief DAC error callback type. * @brief DAC error callback type.
@ -193,6 +190,21 @@ struct hal_dac_driver {
* @name Low level driver helper macros * @name Low level driver helper macros
* @{ * @{
*/ */
/**
* @brief Buffer state.
* @note This function is meant to be called from the DAC callback only.
*
* @param[in] dacp pointer to the @p DACDriver object
* @return The buffer state.
* @retval false if the driver filled/sent the first half of the
* buffer.
* @retval true if the driver filled/sent the second half of the
* buffer.
*
* @special
*/
#define dacIsBufferComplete(dacp) ((bool)((dacp)->state == DAC_COMPLETE))
#if (DAC_USE_WAIT == TRUE) || defined(__DOXYGEN__) #if (DAC_USE_WAIT == TRUE) || defined(__DOXYGEN__)
/** /**
* @brief Waits for operation completion. * @brief Waits for operation completion.
@ -274,7 +286,7 @@ struct hal_dac_driver {
*/ */
#define _dac_isr_half_code(dacp) { \ #define _dac_isr_half_code(dacp) { \
if ((dacp)->grpp->end_cb != NULL) { \ if ((dacp)->grpp->end_cb != NULL) { \
(dacp)->grpp->end_cb(dacp, (dacp)->samples, (dacp)->depth / 2); \ (dacp)->grpp->end_cb(dacp); \
} \ } \
} }
@ -282,7 +294,6 @@ struct hal_dac_driver {
* @brief Common ISR code, full buffer event. * @brief Common ISR code, full buffer event.
* @details This code handles the portable part of the ISR code: * @details This code handles the portable part of the ISR code:
* - Callback invocation. * - Callback invocation.
* - Waiting thread wakeup, if any.
* - Driver state transitions. * - Driver state transitions.
* . * .
* @note This macro is meant to be used in the low level drivers * @note This macro is meant to be used in the low level drivers
@ -293,17 +304,11 @@ struct hal_dac_driver {
* @notapi * @notapi
*/ */
#define _dac_isr_full_code(dacp) { \ #define _dac_isr_full_code(dacp) { \
if ((dacp)->grpp->end_cb != NULL) { \ if ((dacp)->grpp->end_cb) { \
if ((dacp)->depth > 1) { \ (dacp)->state = DAC_COMPLETE; \
/* Invokes the callback passing the 2nd half of the buffer.*/ \ (dacp)->grpp->end_cb(dacp); \
size_t half = (dacp)->depth / 2; \ if ((dacp)->state == DAC_COMPLETE) \
size_t half_index = half * (dacp)->grpp->num_channels; \ (dacp)->state = DAC_ACTIVE; \
(dacp)->grpp->end_cb(dacp, (dacp)->samples + half_index, half); \
} \
else { \
/* Invokes the callback passing the whole buffer.*/ \
(dacp)->grpp->end_cb(dacp, (dacp)->samples, (dacp)->depth); \
} \
} \ } \
} }

View File

@ -76,10 +76,8 @@ typedef struct hal_i2s_config I2SConfig;
* @brief I2S notification callback type. * @brief I2S notification callback type.
* *
* @param[in] i2sp pointer to the @p I2SDriver object * @param[in] i2sp pointer to the @p I2SDriver object
* @param[in] offset offset in buffers of the data to read/write
* @param[in] n number of samples to read/write
*/ */
typedef void (*i2scallback_t)(I2SDriver *i2sp, size_t offset, size_t n); typedef void (*i2scallback_t)(I2SDriver *i2sp);
/* Including the low level driver header, it exports information required /* Including the low level driver header, it exports information required
for completing types.*/ for completing types.*/
@ -135,6 +133,21 @@ struct hal_i2s_config {
* @name Macro Functions * @name Macro Functions
* @{ * @{
*/ */
/**
* @brief Buffer state.
* @note This function is meant to be called from the SPI callback only.
*
* @param[in] i2sp pointer to the @p I2SDriver object
* @return The buffer state.
* @retval false if the driver filled/sent the first half of the
* buffer.
* @retval true if the driver filled/sent the second half of the
* buffer.
*
* @special
*/
#define i2sIsBufferComplete(i2sp) ((bool)((i2sp)->state == I2S_COMPLETE))
/** /**
* @brief Starts a I2S data exchange. * @brief Starts a I2S data exchange.
* *
@ -175,7 +188,7 @@ struct hal_i2s_config {
*/ */
#define _i2s_isr_half_code(i2sp) { \ #define _i2s_isr_half_code(i2sp) { \
if ((i2sp)->config->end_cb != NULL) { \ if ((i2sp)->config->end_cb != NULL) { \
(i2sp)->config->end_cb(i2sp, 0, (i2sp)->config->size / 2); \ (i2sp)->config->end_cb(i2sp); \
} \ } \
} }
@ -195,9 +208,7 @@ struct hal_i2s_config {
#define _i2s_isr_full_code(i2sp) { \ #define _i2s_isr_full_code(i2sp) { \
if ((i2sp)->config->end_cb) { \ if ((i2sp)->config->end_cb) { \
(i2sp)->state = I2S_COMPLETE; \ (i2sp)->state = I2S_COMPLETE; \
(i2sp)->config->end_cb(i2sp, \ (i2sp)->config->end_cb(i2sp); \
(i2sp)->config->size / 2, \
(i2sp)->config->size / 2); \
if ((i2sp)->state == I2S_COMPLETE) { \ if ((i2sp)->state == I2S_COMPLETE) { \
(i2sp)->state = I2S_ACTIVE; \ (i2sp)->state = I2S_ACTIVE; \
} \ } \

View File

@ -225,6 +225,21 @@ struct hal_spi_driver {
* @name Macro Functions * @name Macro Functions
* @{ * @{
*/ */
/**
* @brief Buffer state.
* @note This function is meant to be called from the SPI callback only.
*
* @param[in] spip pointer to the @p SPIDriver object
* @return The buffer state.
* @retval false if the driver filled/sent the first half of the
* buffer.
* @retval true if the driver filled/sent the second half of the
* buffer.
*
* @special
*/
#define spiIsBufferComplete(spip) ((bool)((spip)->state == SPI_COMPLETE))
#if (SPI_SELECT_MODE == SPI_SELECT_MODE_LLD) || defined(__DOXYGEN__) #if (SPI_SELECT_MODE == SPI_SELECT_MODE_LLD) || defined(__DOXYGEN__)
/** /**
* @brief Asserts the slave select signal and prepares for transfers. * @brief Asserts the slave select signal and prepares for transfers.
@ -408,7 +423,7 @@ do { \
#endif /* !SPI_USE_WAIT */ #endif /* !SPI_USE_WAIT */
/** /**
* @brief Common ISR code. * @brief Common ISR code when circular mode is not supported.
* @details This code handles the portable part of the ISR code: * @details This code handles the portable part of the ISR code:
* - Callback invocation. * - Callback invocation.
* - Waiting thread wakeup, if any. * - Waiting thread wakeup, if any.
@ -434,7 +449,7 @@ do { \
} }
/** /**
* @brief Common ISR code in circular mode. * @brief Half buffer filled ISR code in circular mode.
* @details This code handles the portable part of the ISR code: * @details This code handles the portable part of the ISR code:
* - Callback invocation. * - Callback invocation.
* . * .
@ -445,14 +460,14 @@ do { \
* *
* @notapi * @notapi
*/ */
#define _spi_isr_code_half1(spip) { \ #define _spi_isr_half_code(spip) { \
if ((spip)->config->end_cb) { \ if ((spip)->config->end_cb) { \
(spip)->config->end_cb(spip); \ (spip)->config->end_cb(spip); \
} \ } \
} }
/** /**
* @brief Common ISR code in circular mode. * @brief Full buffer filled ISR code in circular mode.
* @details This code handles the portable part of the ISR code: * @details This code handles the portable part of the ISR code:
* - Callback invocation. * - Callback invocation.
* - Driver state transitions. * - Driver state transitions.
@ -464,7 +479,7 @@ do { \
* *
* @notapi * @notapi
*/ */
#define _spi_isr_code_half2(spip) { \ #define _spi_isr_full_code(spip) { \
if ((spip)->config->end_cb) { \ if ((spip)->config->end_cb) { \
(spip)->state = SPI_COMPLETE; \ (spip)->state = SPI_COMPLETE; \
(spip)->config->end_cb(spip); \ (spip)->config->end_cb(spip); \

View File

@ -143,11 +143,11 @@ static void spi_lld_serve_rx_interrupt(SPIDriver *spip, uint32_t flags) {
if (spip->config->circular) { if (spip->config->circular) {
if ((flags & STM32_DMA_ISR_HTIF) != 0U) { if ((flags & STM32_DMA_ISR_HTIF) != 0U) {
/* Half buffer interrupt.*/ /* Half buffer interrupt.*/
_spi_isr_code_half1(spip); _spi_isr_half_code(spip);
} }
else { if ((flags & STM32_DMA_ISR_TCIF) != 0U) {
/* End buffer interrupt.*/ /* End buffer interrupt.*/
_spi_isr_code_half2(spip); _spi_isr_full_code(spip);
} }
} }
else { else {

View File

@ -198,11 +198,11 @@ static void i2s_lld_serve_tx_interrupt(I2SDriver *i2sp, uint32_t flags) {
level driver.*/ level driver.*/
if ((flags & STM32_DMA_ISR_TCIF) != 0) { if ((flags & STM32_DMA_ISR_TCIF) != 0) {
/* Transfer complete processing.*/ /* Transfer complete processing.*/
_i2s_isr_full_code(i2sp); _i2s_isr_code_half2(i2sp);
} }
else if ((flags & STM32_DMA_ISR_HTIF) != 0) { else if ((flags & STM32_DMA_ISR_HTIF) != 0) {
/* Half transfer processing.*/ /* Half transfer processing.*/
_i2s_isr_half_code(i2sp); _i2s_isr_code_half1(i2sp);
} }
} }
#endif #endif

View File

@ -143,11 +143,11 @@ static void spi_lld_serve_rx_interrupt(SPIDriver *spip, uint32_t flags) {
if (spip->config->circular) { if (spip->config->circular) {
if ((flags & STM32_DMA_ISR_HTIF) != 0U) { if ((flags & STM32_DMA_ISR_HTIF) != 0U) {
/* Half buffer interrupt.*/ /* Half buffer interrupt.*/
_spi_isr_code_half1(spip); _spi_isr_half_code(spip);
} }
else { if ((flags & STM32_DMA_ISR_TCIF) != 0U) {
/* End buffer interrupt.*/ /* End buffer interrupt.*/
_spi_isr_code_half2(spip); _spi_isr_full_code(spip);
} }
} }
else { else {

View File

@ -198,11 +198,11 @@ static void i2s_lld_serve_tx_interrupt(I2SDriver *i2sp, uint32_t flags) {
level driver.*/ level driver.*/
if ((flags & STM32_DMA_ISR_TCIF) != 0) { if ((flags & STM32_DMA_ISR_TCIF) != 0) {
/* Transfer complete processing.*/ /* Transfer complete processing.*/
_i2s_isr_full_code(i2sp); _i2s_isr_code_half2(i2sp);
} }
else if ((flags & STM32_DMA_ISR_HTIF) != 0) { else if ((flags & STM32_DMA_ISR_HTIF) != 0) {
/* Half transfer processing.*/ /* Half transfer processing.*/
_i2s_isr_half_code(i2sp); _i2s_isr_code_half1(i2sp);
} }
} }
#endif #endif

View File

@ -96,11 +96,11 @@ static void spi_lld_serve_bdma_rx_interrupt(SPIDriver *spip, uint32_t flags) {
if (spip->config->circular) { if (spip->config->circular) {
if ((flags & STM32_BDMA_ISR_HTIF) != 0U) { if ((flags & STM32_BDMA_ISR_HTIF) != 0U) {
/* Half buffer interrupt.*/ /* Half buffer interrupt.*/
_spi_isr_code_half1(spip); _spi_isr_half_code(spip);
} }
else { if ((flags & STM32_BDMA_ISR_TCIF) != 0U) {
/* End buffer interrupt.*/ /* End buffer interrupt.*/
_spi_isr_code_half2(spip); _spi_isr_full_code(spip);
} }
} }
else { else {
@ -159,11 +159,11 @@ static void spi_lld_serve_dma_rx_interrupt(SPIDriver *spip, uint32_t flags) {
if (spip->config->circular) { if (spip->config->circular) {
if ((flags & STM32_DMA_ISR_HTIF) != 0U) { if ((flags & STM32_DMA_ISR_HTIF) != 0U) {
/* Half buffer interrupt.*/ /* Half buffer interrupt.*/
_spi_isr_code_half1(spip); _spi_isr_half_code(spip);
} }
else { if ((flags & STM32_DMA_ISR_TCIF) != 0U) {
/* End buffer interrupt.*/ /* End buffer interrupt.*/
_spi_isr_code_half2(spip); _spi_isr_full_code(spip);
} }
} }
else { else {

View File

@ -181,7 +181,6 @@ void adcStartConversionI(ADCDriver *adcp,
osalDbgCheck((adcp != NULL) && (grpp != NULL) && (samples != NULL) && osalDbgCheck((adcp != NULL) && (grpp != NULL) && (samples != NULL) &&
(depth > 0U) && ((depth == 1U) || ((depth & 1U) == 0U))); (depth > 0U) && ((depth == 1U) || ((depth & 1U) == 0U)));
osalDbgAssert((adcp->state == ADC_READY) || osalDbgAssert((adcp->state == ADC_READY) ||
(adcp->state == ADC_COMPLETE) ||
(adcp->state == ADC_ERROR), (adcp->state == ADC_ERROR),
"not ready"); "not ready");

View File

@ -75,6 +75,13 @@
***************************************************************************** *****************************************************************************
*** Next *** *** Next ***
- NEW: The callback of drivers with circular buffers (ADC, DAC, I2S, SPI) has
been simplified, no parameters. A driver function xxxIsBufferComplete()
has been added to determine if it is the half buffer callback or the
final callback.
- NEW: ADC driver state machine change, now the state ADC_COMPLETE is set
before calling the 2nd callback even in circular mode. This has been
done for consistency with other drivers with circular buffers.
- NEW: Low level drivers simplification. There is a new template of LLD, now - NEW: Low level drivers simplification. There is a new template of LLD, now
driver and configuration types are defined in the HLD, LLD just exports driver and configuration types are defined in the HLD, LLD just exports
macros with the fields to be added to the structures. macros with the fields to be added to the structures.

View File

@ -30,14 +30,13 @@ static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH];
* ADC streaming callback. * ADC streaming callback.
*/ */
size_t nx = 0, ny = 0; size_t nx = 0, ny = 0;
static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { static void adccallback(ADCDriver *adcp) {
(void)adcp; if (adcIsBufferComplete(adcp)) {
if (samples2 == buffer) { nx += 1;
nx += n;
} }
else { else {
ny += n; ny += 1;
} }
} }

View File

@ -30,14 +30,13 @@ static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH];
* ADC streaming callback. * ADC streaming callback.
*/ */
size_t nx = 0, ny = 0; size_t nx = 0, ny = 0;
static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { static void adccallback(ADCDriver *adcp) {
(void)adcp; if (adcIsBufferComplete(adcp)) {
if (samples2 == buffer) { nx += 1;
nx += n;
} }
else { else {
ny += n; ny += 1;
} }
} }

View File

@ -30,14 +30,13 @@ static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH];
* ADC streaming callback. * ADC streaming callback.
*/ */
size_t nx = 0, ny = 0; size_t nx = 0, ny = 0;
static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { static void adccallback(ADCDriver *adcp) {
(void)adcp; if (adcIsBufferComplete(adcp)) {
if (samples2 == buffer) { nx += 1;
nx += n;
} }
else { else {
ny += n; ny += 1;
} }
} }

View File

@ -30,14 +30,13 @@ static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH];
* ADC streaming callback. * ADC streaming callback.
*/ */
size_t nx = 0, ny = 0; size_t nx = 0, ny = 0;
static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { static void adccallback(ADCDriver *adcp) {
(void)adcp; if (adcIsBufferComplete(adcp)) {
if (samples2 == buffer) { nx += 1;
nx += n;
} }
else { else {
ny += n; ny += 1;
} }
} }

View File

@ -30,14 +30,13 @@ static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH];
* ADC streaming callback. * ADC streaming callback.
*/ */
size_t nx = 0, ny = 0; size_t nx = 0, ny = 0;
static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { static void adccallback(ADCDriver *adcp) {
(void)adcp; if (adcIsBufferComplete(adcp)) {
if (samples2 == buffer) { nx += 1;
nx += n;
} }
else { else {
ny += n; ny += 1;
} }
} }

View File

@ -30,14 +30,13 @@ static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH];
* ADC streaming callback. * ADC streaming callback.
*/ */
size_t nx = 0, ny = 0; size_t nx = 0, ny = 0;
static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { static void adccallback(ADCDriver *adcp) {
(void)adcp; if (adcIsBufferComplete(adcp)) {
if (samples2 == buffer) { nx += 1;
nx += n;
} }
else { else {
ny += n; ny += 1;
} }
} }

View File

@ -59,16 +59,14 @@ static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = {
* DAC streaming callback. * DAC streaming callback.
*/ */
size_t nx = 0, ny = 0, nz = 0; size_t nx = 0, ny = 0, nz = 0;
static void end_cb1(DACDriver *dacp, dacsample_t *buffer, size_t n) { static void end_cb1(DACDriver *dacp) {
(void)dacp;
nz++; nz++;
if (dac_buffer == buffer) { if (dacIsBufferComplete(dacp)) {
nx += n; nx += DAC_BUFFER_SIZE / 2;
} }
else { else {
ny += n; ny += DAC_BUFFER_SIZE / 2;
} }
if ((nz % 1000) == 0) { if ((nz % 1000) == 0) {

View File

@ -30,14 +30,13 @@ static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH];
* ADC streaming callback. * ADC streaming callback.
*/ */
size_t nx = 0, ny = 0; size_t nx = 0, ny = 0;
static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { static void adccallback(ADCDriver *adcp) {
(void)adcp; if (adcIsBufferComplete(adcp)) {
if (samples2 == buffer) { nx += 1;
nx += n;
} }
else { else {
ny += n; ny += 1;
} }
} }

View File

@ -59,16 +59,14 @@ static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = {
* DAC streaming callback. * DAC streaming callback.
*/ */
size_t nx = 0, ny = 0, nz = 0; size_t nx = 0, ny = 0, nz = 0;
static void end_cb1(DACDriver *dacp, dacsample_t *buffer, size_t n) { static void end_cb1(DACDriver *dacp) {
(void)dacp;
nz++; nz++;
if (dac_buffer == buffer) { if (dacIsBufferComplete(dacp)) {
nx += n; nx += DAC_BUFFER_SIZE / 2;
} }
else { else {
ny += n; ny += DAC_BUFFER_SIZE / 2;
} }
if ((nz % 1000) == 0) { if ((nz % 1000) == 0) {

View File

@ -59,16 +59,14 @@ static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = {
* DAC streaming callback. * DAC streaming callback.
*/ */
size_t nx = 0, ny = 0, nz = 0; size_t nx = 0, ny = 0, nz = 0;
static void end_cb1(DACDriver *dacp, dacsample_t *buffer, size_t n) { static void end_cb1(DACDriver *dacp) {
(void)dacp;
nz++; nz++;
if (dac_buffer == buffer) { if (dacIsBufferComplete(dacp)) {
nx += n; nx += DAC_BUFFER_SIZE / 2;
} }
else { else {
ny += n; ny += DAC_BUFFER_SIZE / 2;
} }
if ((nz % 1000) == 0) { if ((nz % 1000) == 0) {

View File

@ -21,7 +21,7 @@
static uint16_t i2s_rx_buf[I2S_BUF_SIZE]; static uint16_t i2s_rx_buf[I2S_BUF_SIZE];
static void i2scallback(I2SDriver *i2sp, size_t offset, size_t n); static void i2scallback(I2SDriver *i2sp);
static const I2SConfig i2scfg = { static const I2SConfig i2scfg = {
NULL, NULL,
@ -32,11 +32,14 @@ static const I2SConfig i2scfg = {
16 16
}; };
static void i2scallback(I2SDriver *i2sp, size_t offset, size_t n) { static void i2scallback(I2SDriver *i2sp) {
(void)i2sp; if (i2sIsBufferComplete(i2sp)) {
(void)offset; /* 2nd buffer half processing.*/
(void)n; }
else {
/* 1st buffer half processing.*/
}
} }
/* /*

View File

@ -57,7 +57,7 @@ static adcsample_t samples1[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH];
* ADC streaming callback. * ADC streaming callback.
*/ */
size_t nx = 0, ny = 0; size_t nx = 0, ny = 0;
static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { static void adccallback(ADCDriver *adcp) {
#if !DMA_BUFFERS_COHERENCE #if !DMA_BUFFERS_COHERENCE
/* DMA buffer invalidation because data cache, only invalidating the /* DMA buffer invalidation because data cache, only invalidating the
@ -65,16 +65,14 @@ static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) {
Only required if the ADC buffer is placed in a cache-able area.*/ Only required if the ADC buffer is placed in a cache-able area.*/
dmaBufferInvalidate(buffer, dmaBufferInvalidate(buffer,
n * adcp->grpp->num_channels * sizeof (adcsample_t)); n * adcp->grpp->num_channels * sizeof (adcsample_t));
#else
(void)adcp;
#endif #endif
/* Updating counters.*/ /* Updating counters.*/
if (samples1 == buffer) { if (adcIsBufferComplete(adcp)) {
nx += n; nx += 1;
} }
else { else {
ny += n; ny += 1;
} }
} }

View File

@ -30,14 +30,13 @@ static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH];
* ADC streaming callback. * ADC streaming callback.
*/ */
size_t nx = 0, ny = 0; size_t nx = 0, ny = 0;
static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { static void adccallback(ADCDriver *adcp) {
(void)adcp; if (adcIsBufferComplete(adcp)) {
if (samples2 == buffer) { nx += 1;
nx += n;
} }
else { else {
ny += n; ny += 1;
} }
} }

View File

@ -30,14 +30,13 @@ static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH];
* ADC streaming callback. * ADC streaming callback.
*/ */
size_t nx = 0, ny = 0; size_t nx = 0, ny = 0;
static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { static void adccallback(ADCDriver *adcp) {
(void)adcp; if (adcIsBufferComplete(adcp)) {
if (samples2 == buffer) { nx += 1;
nx += n;
} }
else { else {
ny += n; ny += 1;
} }
} }

View File

@ -5,7 +5,7 @@
# Compiler options here. # Compiler options here.
ifeq ($(USE_OPT),) ifeq ($(USE_OPT),)
USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 USE_OPT = -O0 -ggdb -fomit-frame-pointer -falign-functions=16
endif endif
# C specific options here (added to USE_OPT). # C specific options here (added to USE_OPT).

View File

@ -1,52 +1,52 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.cdt.debug.gdbjtag.launchConfigurationType"> <launchConfiguration type="org.eclipse.cdt.debug.gdbjtag.launchConfigurationType">
<stringAttribute key="bad_container_name" value="\STM32L4xx-ADC\debug"/> <stringAttribute key="bad_container_name" value="\STM32L4xx-ADC\debug"/>
<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.delay" value="1"/> <intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.delay" value="1"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.doHalt" value="true"/> <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.doHalt" value="true"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.doReset" value="true"/> <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.doReset" value="true"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageFileName" value=""/> <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageFileName" value=""/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageOffset" value=""/> <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageOffset" value=""/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.initCommands" value="set remotetimeout 20&#13;&#10;monitor reset init&#13;&#10;monitor sleep 50&#13;&#10;"/> <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.initCommands" value="set remotetimeout 20&#13;&#10;monitor reset init&#13;&#10;monitor sleep 50&#13;&#10;"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.ipAddress" value="localhost"/> <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.ipAddress" value="localhost"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDevice" value="Generic TCP/IP"/> <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDevice" value="Generic TCP/IP"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadImage" value="true"/> <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadImage" value="true"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadSymbols" value="true"/> <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadSymbols" value="true"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value=""/> <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value=""/>
<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="3333"/> <intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="3333"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.runCommands" value=""/> <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.runCommands" value=""/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/> <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="true"/> <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="true"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/> <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/> <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/> <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/> <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForImage" value="false"/> <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForImage" value="false"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForSymbols" value="false"/> <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForSymbols" value="false"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForImage" value="true"/> <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForImage" value="true"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForSymbols" value="true"/> <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForSymbols" value="true"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useRemoteTarget" value="true"/> <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useRemoteTarget" value="true"/>
<stringAttribute key="org.eclipse.cdt.debug.mi.core.DEBUG_NAME" value="arm-none-eabi-gdb"/> <stringAttribute key="org.eclipse.cdt.debug.mi.core.DEBUG_NAME" value="arm-none-eabi-gdb"/>
<stringAttribute key="org.eclipse.cdt.debug.mi.core.commandFactory" value="Standard"/> <stringAttribute key="org.eclipse.cdt.debug.mi.core.commandFactory" value="Standard"/>
<stringAttribute key="org.eclipse.cdt.debug.mi.core.protocol" value="mi"/> <stringAttribute key="org.eclipse.cdt.debug.mi.core.protocol" value="mi"/>
<booleanAttribute key="org.eclipse.cdt.debug.mi.core.verboseMode" value="false"/> <booleanAttribute key="org.eclipse.cdt.debug.mi.core.verboseMode" value="false"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="arm-none-eabi-gdb"/> <stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="arm-none-eabi-gdb"/>
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/> <intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/> <stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/> <stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.FORMAT" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&lt;contentList/&gt;"/> <stringAttribute key="org.eclipse.cdt.launch.FORMAT" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&lt;contentList/&gt;"/>
<stringAttribute key="org.eclipse.cdt.launch.GLOBAL_VARIABLES" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;globalVariableList/&gt;&#13;&#10;"/> <stringAttribute key="org.eclipse.cdt.launch.GLOBAL_VARIABLES" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;globalVariableList/&gt;&#10;"/>
<stringAttribute key="org.eclipse.cdt.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;memoryBlockExpressionList/&gt;&#13;&#10;"/> <stringAttribute key="org.eclipse.cdt.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;memoryBlockExpressionList/&gt;&#10;"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="./build/ch.elf"/> <stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="./build/ch.elf"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="STM32L4xx-ADC"/> <stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="STM32L4xx-ADC"/>
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="true"/> <booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="true"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="0.1093754934"/> <stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="0.1093754934"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/STM32L4xx-ADC"/> <listEntry value="/STM32L4xx-ADC"/>
</listAttribute> </listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/> <listEntry value="4"/>
</listAttribute> </listAttribute>
<listAttribute key="org.eclipse.debug.ui.favoriteGroups"> <listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/> <listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
</listAttribute> </listAttribute>
</launchConfiguration> </launchConfiguration>

View File

@ -30,14 +30,13 @@ static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH];
* ADC streaming callback. * ADC streaming callback.
*/ */
size_t nx = 0, ny = 0; size_t nx = 0, ny = 0;
static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { static void adccallback(ADCDriver *adcp) {
(void)adcp; if (adcIsBufferComplete(adcp)) {
if (samples2 == buffer) { nx += 1;
nx += n;
} }
else { else {
ny += n; ny += 1;
} }
} }
@ -161,7 +160,7 @@ int main(void) {
* Normal main() thread activity, in this demo it does nothing. * Normal main() thread activity, in this demo it does nothing.
*/ */
while (true) { while (true) {
if (palReadPad(GPIOC, GPIOC_BUTTON)) { if (!palReadPad(GPIOC, GPIOC_BUTTON)) {
adcStopConversion(&ADCD1); adcStopConversion(&ADCD1);
} }
chThdSleepMilliseconds(500); chThdSleepMilliseconds(500);

View File

@ -61,16 +61,14 @@ static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = {
* DAC streaming callback. * DAC streaming callback.
*/ */
size_t nx = 0, ny = 0, nz = 0; size_t nx = 0, ny = 0, nz = 0;
static void end_cb1(DACDriver *dacp, dacsample_t *buffer, size_t n) { static void end_cb1(DACDriver *dacp) {
(void)dacp;
nz++; nz++;
if (dac_buffer == buffer) { if (dacIsBufferComplete(dacp)) {
nx += n; nx += DAC_BUFFER_SIZE / 2;
} }
else { else {
ny += n; ny += DAC_BUFFER_SIZE / 2;
} }
if ((nz % 1000) == 0) { if ((nz % 1000) == 0) {

View File

@ -32,7 +32,7 @@ CC_ALIGN(32) static uint8_t rxbuf[512];
*/ */
void spi_circular_cb(SPIDriver *spip) { void spi_circular_cb(SPIDriver *spip) {
if(spip->state == SPI_COMPLETE) { if (spiIsBufferComplete(spip)) {
/* 2nd half.*/ /* 2nd half.*/
palWriteLine(PORTAB_LINE_LED1, PORTAB_LED_OFF); palWriteLine(PORTAB_LINE_LED1, PORTAB_LED_OFF);
} }