/** Release a SPI object * * TODO: spi_free is currently unimplemented * This will require reference counting at the C++ level to be safe * * Return the pins owned by the SPI object to their reset state * Disable the SPI peripheral * Disable the SPI clock * @param[in] obj The SPI object to deinitialize */ void spi_free(spi_t *obj) { struct spi_s *spiobj = SPI_S(obj); spi_disable(spiobj->spi); /* Disable and deinit SPI */ if (spiobj->spi == SPI0) { spi_i2s_deinit(SPI0); rcu_periph_clock_disable(RCU_SPI0); } if (spiobj->spi == SPI1) { spi_i2s_deinit(SPI1); rcu_periph_clock_disable(RCU_SPI1); } if (spiobj->spi == SPI2) { spi_i2s_deinit(SPI2); rcu_periph_clock_disable(RCU_SPI2); } /* Deinit GPIO mode of SPI pins */ pin_function(spiobj->pin_miso, MODE_IN_FLOATING); pin_function(spiobj->pin_mosi, MODE_IN_FLOATING); pin_function(spiobj->pin_sclk, MODE_IN_FLOATING); if (spiobj->spi_struct.nss != SPI_NSS_SOFT) { pin_function(spiobj->pin_ssel, MODE_IN_FLOATING); } }
/** disable CAN. * */ void can_free(can_t *obj) { can_deinit(obj->can); if (obj->can == CAN0) { rcu_periph_clock_disable(RCU_CAN0); } if (obj->can == CAN1) { rcu_periph_clock_disable(RCU_CAN1); } }
/** Release the analogout object * * Note: This is not currently used in the mbed-drivers * @param obj The analogout object */ void analogout_free(dac_t *obj) { /* reset DAC and disable clock */ dac_deinit(); rcu_periph_clock_disable(RCU_DAC); /* configure GPIO */ /* get the pin function and assign the used channel to the object */ uint32_t function = pinmap_function(obj->pin, PinMap_DAC); MBED_ASSERT(function != (uint32_t)NC); pin_function(obj->pin, function); }
/** Release the serial peripheral, not currently invoked. It requires further * resource management. * * @param obj The serial object */ void serial_free(serial_t *obj) { struct serial_s *p_obj = GET_SERIAL_S(obj); rcu_periph_enum rcu_periph = usart_clk[p_obj->index]; /* reset USART and disable clock */ usart_deinit(p_obj->uart); rcu_periph_clock_disable(rcu_periph); serial_irq_ids[p_obj->index] = 0; /* reset the GPIO state */ pin_function(p_obj->pin_tx, MODE_IN_FLOATING); pin_function(p_obj->pin_rx, MODE_IN_FLOATING); }