/* * ======== SPICC3200DMA_close ======== * @pre Function assumes that the handle is not NULL */ void SPICC3200DMA_close(SPI_Handle handle) { uintptr_t key; SPICC3200DMA_Object *object = handle->object; SPICC3200DMA_HWAttrs const *hwAttrs = handle->hwAttrs; MAP_SPIDisable(hwAttrs->baseAddr); MAP_SPICSDisable(hwAttrs->baseAddr); MAP_SPIDmaDisable(hwAttrs->baseAddr, SPI_RX_DMA | SPI_TX_DMA); MAP_SPIFIFODisable(hwAttrs->baseAddr, SPI_RX_FIFO | SPI_TX_FIFO); /* Release power dependency on SPI. */ Power_releaseDependency(getPowerMgrId(hwAttrs->baseAddr)); Power_releaseDependency(PowerCC3200_PERIPH_UDMA); Power_unregisterNotify(&(object->notifyObj)); if (object->hwiHandle) { HwiP_delete(object->hwiHandle); } if (object->transferComplete) { SemaphoreP_delete(object->transferComplete); } DebugP_log1("SPI:(%p) closed", hwAttrs->baseAddr); key = HwiP_disable(); object->isOpen = false; HwiP_restore(key); }
/*! \brief closes an opened spi communication port \param fd - file descriptor of an opened SPI channel \return upon successful completion, the function shall return 0. Otherwise, -1 shall be returned \sa spi_Open \note \warning */ int spi_Close(Fd_t fd) { unsigned long ulBase = LSPI_BASE; g_SpiFd = 0; if(g_ucDMAEnabled) { #ifdef SL_PLATFORM_MULTI_THREADED osi_InterruptDeRegister(INT_LSPI); osi_MsgQDelete(&DMAMsgQ); #else MAP_SPIIntUnregister(ulBase); g_cDummy = 0; #endif MAP_SPIFIFODisable(ulBase,SPI_RX_FIFO); MAP_SPIFIFODisable(ulBase,SPI_TX_FIFO); MAP_SPIDmaDisable(ulBase,SPI_RX_DMA); MAP_SPIDmaDisable(ulBase,SPI_TX_DMA); } //Disable Chip Select MAP_SPICSDisable(LSPI_BASE); //Disable SPI Channel MAP_SPIDisable(ulBase); // Reset SPI MAP_SPIReset(ulBase); // Enable SPI Peripheral MAP_PRCMPeripheralClkDisable(PRCM_LSPI,PRCM_RUN_MODE_CLK|PRCM_SLP_MODE_CLK); return 0; }