From 02d65c01db18d4460e421242e4be82b25a723ad0 Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Tue, 7 Jun 2016 13:10:04 +0000 Subject: [PATCH] Configuration cleanup on stop in the entire HAL. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9601 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/hal/src/hal_adc.c | 6 +++++- os/hal/src/hal_can.c | 1 + os/hal/src/hal_dac.c | 3 ++- os/hal/src/hal_ext.c | 6 +++++- os/hal/src/hal_gpt.c | 6 +++++- os/hal/src/hal_i2c.c | 8 ++++++-- os/hal/src/hal_i2s.c | 6 +++++- os/hal/src/hal_icu.c | 6 +++++- os/hal/src/hal_mac.c | 6 +++++- os/hal/src/hal_mmc_spi.c | 3 ++- os/hal/src/hal_pwm.c | 4 ++++ os/hal/src/hal_qspi.c | 3 ++- os/hal/src/hal_sdc.c | 6 +++++- os/hal/src/hal_serial.c | 6 +++++- os/hal/src/hal_serial_usb.c | 5 ++++- os/hal/src/hal_spi.c | 6 +++++- os/hal/src/hal_uart.c | 5 ++++- os/hal/src/hal_usb.c | 6 +++++- os/hal/src/hal_wdg.c | 6 +++++- 19 files changed, 80 insertions(+), 18 deletions(-) diff --git a/os/hal/src/hal_adc.c b/os/hal/src/hal_adc.c index 0945ea9f2..222aaea4f 100644 --- a/os/hal/src/hal_adc.c +++ b/os/hal/src/hal_adc.c @@ -117,10 +117,14 @@ void adcStop(ADCDriver *adcp) { osalDbgCheck(adcp != NULL); osalSysLock(); + osalDbgAssert((adcp->state == ADC_STOP) || (adcp->state == ADC_READY), "invalid state"); + adc_lld_stop(adcp); - adcp->state = ADC_STOP; + adcp->config = NULL; + adcp->state = ADC_STOP; + osalSysUnlock(); } diff --git a/os/hal/src/hal_can.c b/os/hal/src/hal_can.c index 173700afd..08cf7cc5e 100644 --- a/os/hal/src/hal_can.c +++ b/os/hal/src/hal_can.c @@ -129,6 +129,7 @@ void canStop(CANDriver *canp) { /* The low level driver is stopped.*/ can_lld_stop(canp); + canp->config = NULL; canp->state = CAN_STOP; /* Threads waiting on CAN APIs are notified that the driver has been diff --git a/os/hal/src/hal_dac.c b/os/hal/src/hal_dac.c index 3496bead5..0297f9bd4 100644 --- a/os/hal/src/hal_dac.c +++ b/os/hal/src/hal_dac.c @@ -125,7 +125,8 @@ void dacStop(DACDriver *dacp) { "invalid state"); dac_lld_stop(dacp); - dacp->state = DAC_STOP; + dacp->config = NULL; + dacp->state = DAC_STOP; osalSysUnlock(); } diff --git a/os/hal/src/hal_ext.c b/os/hal/src/hal_ext.c index 9d0c6ff33..658640e31 100644 --- a/os/hal/src/hal_ext.c +++ b/os/hal/src/hal_ext.c @@ -106,10 +106,14 @@ void extStop(EXTDriver *extp) { osalDbgCheck(extp != NULL); osalSysLock(); + osalDbgAssert((extp->state == EXT_STOP) || (extp->state == EXT_ACTIVE), "invalid state"); + ext_lld_stop(extp); - extp->state = EXT_STOP; + extp->config = NULL; + extp->state = EXT_STOP; + osalSysUnlock(); } diff --git a/os/hal/src/hal_gpt.c b/os/hal/src/hal_gpt.c index cd08a2779..b224fc5fb 100644 --- a/os/hal/src/hal_gpt.c +++ b/os/hal/src/hal_gpt.c @@ -104,10 +104,14 @@ void gptStop(GPTDriver *gptp) { osalDbgCheck(gptp != NULL); osalSysLock(); + osalDbgAssert((gptp->state == GPT_STOP) || (gptp->state == GPT_READY), "invalid state"); + gpt_lld_stop(gptp); - gptp->state = GPT_STOP; + gptp->config = NULL; + gptp->state = GPT_STOP; + osalSysUnlock(); } diff --git a/os/hal/src/hal_i2c.c b/os/hal/src/hal_i2c.c index 30e8809a1..54a362f0c 100644 --- a/os/hal/src/hal_i2c.c +++ b/os/hal/src/hal_i2c.c @@ -113,12 +113,16 @@ void i2cStart(I2CDriver *i2cp, const I2CConfig *config) { void i2cStop(I2CDriver *i2cp) { osalDbgCheck(i2cp != NULL); + + osalSysLock(); + osalDbgAssert((i2cp->state == I2C_STOP) || (i2cp->state == I2C_READY) || (i2cp->state == I2C_LOCKED), "invalid state"); - osalSysLock(); i2c_lld_stop(i2cp); - i2cp->state = I2C_STOP; + i2cp->config = NULL; + i2cp->state = I2C_STOP; + osalSysUnlock(); } diff --git a/os/hal/src/hal_i2s.c b/os/hal/src/hal_i2s.c index 2434e8477..e34068bf5 100644 --- a/os/hal/src/hal_i2s.c +++ b/os/hal/src/hal_i2s.c @@ -104,10 +104,14 @@ void i2sStop(I2SDriver *i2sp) { osalDbgCheck(i2sp != NULL); osalSysLock(); + osalDbgAssert((i2sp->state == I2S_STOP) || (i2sp->state == I2S_READY), "invalid state"); + i2s_lld_stop(i2sp); - i2sp->state = I2S_STOP; + i2sp->config = NULL; + i2sp->state = I2S_STOP; + osalSysUnlock(); } diff --git a/os/hal/src/hal_icu.c b/os/hal/src/hal_icu.c index 8ee4ed8cd..cb8eaec64 100644 --- a/os/hal/src/hal_icu.c +++ b/os/hal/src/hal_icu.c @@ -104,10 +104,14 @@ void icuStop(ICUDriver *icup) { osalDbgCheck(icup != NULL); osalSysLock(); + osalDbgAssert((icup->state == ICU_STOP) || (icup->state == ICU_READY), "invalid state"); + icu_lld_stop(icup); - icup->state = ICU_STOP; + icup->config = NULL; + icup->state = ICU_STOP; + osalSysUnlock(); } diff --git a/os/hal/src/hal_mac.c b/os/hal/src/hal_mac.c index c4027f500..7d0f4cf43 100644 --- a/os/hal/src/hal_mac.c +++ b/os/hal/src/hal_mac.c @@ -117,10 +117,14 @@ void macStop(MACDriver *macp) { osalDbgCheck(macp != NULL); osalSysLock(); + osalDbgAssert((macp->state == MAC_STOP) || (macp->state == MAC_ACTIVE), "invalid state"); + mac_lld_stop(macp); - macp->state = MAC_STOP; + macp->config = NULL; + macp->state = MAC_STOP; + osalSysUnlock(); } diff --git a/os/hal/src/hal_mmc_spi.c b/os/hal/src/hal_mmc_spi.c index 19c794501..2e6ef7658 100644 --- a/os/hal/src/hal_mmc_spi.c +++ b/os/hal/src/hal_mmc_spi.c @@ -430,7 +430,8 @@ void mmcStop(MMCDriver *mmcp) { "invalid state"); spiStop(mmcp->config->spip); - mmcp->state = BLK_STOP; + mmcp->config = NULL; + mmcp->state = BLK_STOP; } /** diff --git a/os/hal/src/hal_pwm.c b/os/hal/src/hal_pwm.c index e11011248..453606c19 100644 --- a/os/hal/src/hal_pwm.c +++ b/os/hal/src/hal_pwm.c @@ -113,11 +113,15 @@ void pwmStop(PWMDriver *pwmp) { osalDbgCheck(pwmp != NULL); osalSysLock(); + osalDbgAssert((pwmp->state == PWM_STOP) || (pwmp->state == PWM_READY), "invalid state"); + pwm_lld_stop(pwmp); pwmp->enabled = 0; + pwmp->config = NULL; pwmp->state = PWM_STOP; + osalSysUnlock(); } diff --git a/os/hal/src/hal_qspi.c b/os/hal/src/hal_qspi.c index dd091498b..cca5dd747 100644 --- a/os/hal/src/hal_qspi.c +++ b/os/hal/src/hal_qspi.c @@ -124,7 +124,8 @@ void qspiStop(QSPIDriver *qspip) { "invalid state"); qspi_lld_stop(qspip); - qspip->state = QSPI_STOP; + qspip->config = NULL; + qspip->state = QSPI_STOP; osalSysUnlock(); } diff --git a/os/hal/src/hal_sdc.c b/os/hal/src/hal_sdc.c index 654f179e4..80cbca3bf 100644 --- a/os/hal/src/hal_sdc.c +++ b/os/hal/src/hal_sdc.c @@ -594,10 +594,14 @@ void sdcStop(SDCDriver *sdcp) { osalDbgCheck(sdcp != NULL); osalSysLock(); + osalDbgAssert((sdcp->state == BLK_STOP) || (sdcp->state == BLK_ACTIVE), "invalid state"); + sdc_lld_stop(sdcp); - sdcp->state = BLK_STOP; + sdcp->config = NULL; + sdcp->state = BLK_STOP; + osalSysUnlock(); } diff --git a/os/hal/src/hal_serial.c b/os/hal/src/hal_serial.c index 0b578fdc4..5439245ed 100644 --- a/os/hal/src/hal_serial.c +++ b/os/hal/src/hal_serial.c @@ -170,13 +170,17 @@ void sdStop(SerialDriver *sdp) { osalDbgCheck(sdp != NULL); osalSysLock(); + osalDbgAssert((sdp->state == SD_STOP) || (sdp->state == SD_READY), "invalid state"); + sd_lld_stop(sdp); - sdp->state = SD_STOP; + sdp->config = NULL; + sdp->state = SD_STOP; oqResetI(&sdp->oqueue); iqResetI(&sdp->iqueue); osalOsRescheduleS(); + osalSysUnlock(); } diff --git a/os/hal/src/hal_serial_usb.c b/os/hal/src/hal_serial_usb.c index adf5856c4..7d4ed05a8 100644 --- a/os/hal/src/hal_serial_usb.c +++ b/os/hal/src/hal_serial_usb.c @@ -264,6 +264,7 @@ void sduStop(SerialUSBDriver *sdup) { osalDbgCheck(sdup != NULL); osalSysLock(); + osalDbgAssert((sdup->state == SDU_STOP) || (sdup->state == SDU_READY), "invalid state"); @@ -273,11 +274,13 @@ void sduStop(SerialUSBDriver *sdup) { if (sdup->config->int_in > 0U) { usbp->in_params[sdup->config->int_in - 1U] = NULL; } - sdup->state = SDU_STOP; + sdup->config = NULL; + sdup->state = SDU_STOP; /* Enforces a disconnection.*/ sduDisconnectI(sdup); osalOsRescheduleS(); + osalSysUnlock(); } diff --git a/os/hal/src/hal_spi.c b/os/hal/src/hal_spi.c index 86bd78677..a16b61591 100644 --- a/os/hal/src/hal_spi.c +++ b/os/hal/src/hal_spi.c @@ -115,10 +115,14 @@ void spiStop(SPIDriver *spip) { osalDbgCheck(spip != NULL); osalSysLock(); + osalDbgAssert((spip->state == SPI_STOP) || (spip->state == SPI_READY), "invalid state"); + spi_lld_stop(spip); - spip->state = SPI_STOP; + spip->config = NULL; + spip->state = SPI_STOP; + osalSysUnlock(); } diff --git a/os/hal/src/hal_uart.c b/os/hal/src/hal_uart.c index 8db39deb9..72d6221dd 100644 --- a/os/hal/src/hal_uart.c +++ b/os/hal/src/hal_uart.c @@ -120,13 +120,16 @@ void uartStop(UARTDriver *uartp) { osalDbgCheck(uartp != NULL); osalSysLock(); + osalDbgAssert((uartp->state == UART_STOP) || (uartp->state == UART_READY), "invalid state"); uart_lld_stop(uartp); - uartp->state = UART_STOP; + uartp->config = NULL; + uartp->state = UART_STOP; uartp->txstate = UART_TX_IDLE; uartp->rxstate = UART_RX_IDLE; + osalSysUnlock(); } diff --git a/os/hal/src/hal_usb.c b/os/hal/src/hal_usb.c index bc0cf088b..f0da64978 100644 --- a/os/hal/src/hal_usb.c +++ b/os/hal/src/hal_usb.c @@ -314,12 +314,15 @@ void usbStop(USBDriver *usbp) { osalDbgCheck(usbp != NULL); osalSysLock(); + osalDbgAssert((usbp->state == USB_STOP) || (usbp->state == USB_READY) || (usbp->state == USB_SELECTED) || (usbp->state == USB_ACTIVE) || (usbp->state == USB_SUSPENDED), + "invalid state"); usb_lld_stop(usbp); - usbp->state = USB_STOP; + spip->config = NULL; + spip->state = USB_STOP; /* Resetting all ongoing synchronous operations.*/ for (i = 0; i <= (unsigned)USB_MAX_ENDPOINTS; i++) { @@ -336,6 +339,7 @@ void usbStop(USBDriver *usbp) { usbp->epc[i] = NULL; } osalOsRescheduleS(); + osalSysUnlock(); } diff --git a/os/hal/src/hal_wdg.c b/os/hal/src/hal_wdg.c index 1b3ec70c6..c5797e810 100644 --- a/os/hal/src/hal_wdg.c +++ b/os/hal/src/hal_wdg.c @@ -91,10 +91,14 @@ void wdgStop(WDGDriver *wdgp) { osalDbgCheck(wdgp != NULL); osalSysLock(); + osalDbgAssert((wdgp->state == WDG_STOP) || (wdgp->state == WDG_READY), "invalid state"); + wdg_lld_stop(wdgp); - wdgp->state = WDG_STOP; + wdgp->config = NULL; + wdgp->state = WDG_STOP; + osalSysUnlock(); }