Various fixes to OCTOSPI e DMAv1 and MX25.

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@12401 110e8d01-0319-4d1e-a829-52ad28d1bb01
This commit is contained in:
Giovanni Di Sirio 2018-11-02 17:15:38 +00:00
parent da54384531
commit 9f6a17e4f1
4 changed files with 55 additions and 12 deletions

View File

@ -352,8 +352,7 @@ void snor_device_init(SNORDriver *devp) {
n25q_reset_memory(devp); n25q_reset_memory(devp);
/* Reading device ID and unique ID.*/ /* Reading device ID and unique ID.*/
wspiReceive(devp->config->busp, &mx25_cmd_read_id, wspiReceive(devp->config->busp, &mx25_cmd_read_id, 3U, devp->device_id);
sizeof devp->device_id, devp->device_id);
#endif /* SNOR_BUS_DRIVER == SNOR_BUS_DRIVER_WSPI */ #endif /* SNOR_BUS_DRIVER == SNOR_BUS_DRIVER_WSPI */
/* Checking if the device is white listed.*/ /* Checking if the device is white listed.*/
@ -382,7 +381,7 @@ void snor_device_init(SNORDriver *devp) {
/* Reading ID again for confirmation, in DTR mode bytes are read twice, /* Reading ID again for confirmation, in DTR mode bytes are read twice,
it needs adjusting.*/ it needs adjusting.*/
#if MX25_BUS_MODE == MX25_BUS_MODE_OPI_DTR #if MX25_BUS_MODE == MX25_BUS_MODE_OPI_DTR
bus_cmd_dummy_receive(devp->config->busp, MX25_CMD_OPI_RDID, 6, id); bus_cmd_dummy_receive(devp->config->busp, MX25_CMD_OPI_RDID, 6U, id);
id[1] = id[2]; id[1] = id[2];
id[2] = id[4]; id[2] = id[4];
#else #else

View File

@ -545,6 +545,13 @@ bool dmaStreamAllocate(const stm32_dma_stream_t *dmastp,
} }
#endif #endif
#if STM32_DMA_SUPPORTS_DMAMUX == TRUE
/* Enabling DMAMUX if present.*/
if (dma.streams_mask == 0U) {
rccEnableDMAMUX(true);
}
#endif
/* Putting the stream in a safe state.*/ /* Putting the stream in a safe state.*/
dmaStreamDisable(dmastp); dmaStreamDisable(dmastp);
dmastp->channel->CCR = STM32_DMA_CCR_RESET_VALUE; dmastp->channel->CCR = STM32_DMA_CCR_RESET_VALUE;
@ -607,6 +614,13 @@ void dmaStreamRelease(const stm32_dma_stream_t *dmastp) {
rccDisableDMA2(); rccDisableDMA2();
} }
#endif #endif
#if STM32_DMA_SUPPORTS_DMAMUX == TRUE
/* Shutting down DMAMUX if present.*/
if (dma.streams_mask == 0U) {
rccDisableDMAMUX();
}
#endif
} }
#if (STM32_DMA_SUPPORTS_DMAMUX == TRUE) || defined(__DOXYGEN__) #if (STM32_DMA_SUPPORTS_DMAMUX == TRUE) || defined(__DOXYGEN__)

View File

@ -205,6 +205,7 @@ void wspi_lld_start(WSPIDriver *wspip) {
(void *)wspip); (void *)wspip);
osalDbgAssert(!b, "stream already allocated"); osalDbgAssert(!b, "stream already allocated");
rccEnableOCTOSPI1(true); rccEnableOCTOSPI1(true);
dmaSetRequestSource(wspip->dma, STM32_DMAMUX1_OCTOSPI1);
} }
#endif #endif
@ -216,6 +217,7 @@ void wspi_lld_start(WSPIDriver *wspip) {
(void *)wspip); (void *)wspip);
osalDbgAssert(!b, "stream already allocated"); osalDbgAssert(!b, "stream already allocated");
rccEnableOCTOSPI2(true); rccEnableOCTOSPI2(true);
dmaSetRequestSource(wspip->dma, STM32_DMAMUX1_OCTOSPI2);
} }
#endif #endif
@ -285,10 +287,10 @@ void wspi_lld_command(WSPIDriver *wspip, const wspi_command_t *cmdp) {
#endif #endif
wspip->ospi->CR &= ~OCTOSPI_CR_FMODE; wspip->ospi->CR &= ~OCTOSPI_CR_FMODE;
wspip->ospi->DLR = 0U; wspip->ospi->DLR = 0U;
wspip->ospi->IR = cmdp->cmd;
wspip->ospi->ABR = cmdp->alt;
wspip->ospi->TCR = cmdp->dummy; wspip->ospi->TCR = cmdp->dummy;
wspip->ospi->CCR = cmdp->cfg; wspip->ospi->CCR = cmdp->cfg;
wspip->ospi->ABR = cmdp->alt;
wspip->ospi->IR = cmdp->cmd;
if ((cmdp->cfg & WSPI_CFG_ADDR_MODE_MASK) != WSPI_CFG_ADDR_MODE_NONE) { if ((cmdp->cfg & WSPI_CFG_ADDR_MODE_MASK) != WSPI_CFG_ADDR_MODE_NONE) {
wspip->ospi->AR = cmdp->addr; wspip->ospi->AR = cmdp->addr;
} }
@ -314,10 +316,10 @@ void wspi_lld_send(WSPIDriver *wspip, const wspi_command_t *cmdp,
wspip->ospi->CR &= ~OCTOSPI_CR_FMODE; wspip->ospi->CR &= ~OCTOSPI_CR_FMODE;
wspip->ospi->DLR = n - 1; wspip->ospi->DLR = n - 1;
wspip->ospi->IR = cmdp->cmd;
wspip->ospi->ABR = cmdp->alt;
wspip->ospi->TCR = cmdp->dummy; wspip->ospi->TCR = cmdp->dummy;
wspip->ospi->CCR = cmdp->cfg; wspip->ospi->CCR = cmdp->cfg;
wspip->ospi->ABR = cmdp->alt;
wspip->ospi->IR = cmdp->cmd;
if ((cmdp->cfg & WSPI_CFG_ADDR_MODE_MASK) != WSPI_CFG_ADDR_MODE_NONE) { if ((cmdp->cfg & WSPI_CFG_ADDR_MODE_MASK) != WSPI_CFG_ADDR_MODE_NONE) {
wspip->ospi->AR = cmdp->addr; wspip->ospi->AR = cmdp->addr;
} }
@ -345,10 +347,10 @@ void wspi_lld_receive(WSPIDriver *wspip, const wspi_command_t *cmdp,
wspip->ospi->CR = (wspip->ospi->CR & ~OCTOSPI_CR_FMODE) | OCTOSPI_CR_FMODE_0; wspip->ospi->CR = (wspip->ospi->CR & ~OCTOSPI_CR_FMODE) | OCTOSPI_CR_FMODE_0;
wspip->ospi->DLR = n - 1; wspip->ospi->DLR = n - 1;
wspip->ospi->IR = cmdp->cmd;
wspip->ospi->ABR = cmdp->alt;
wspip->ospi->TCR = cmdp->dummy; wspip->ospi->TCR = cmdp->dummy;
wspip->ospi->CCR = cmdp->cfg; wspip->ospi->CCR = cmdp->cfg;
wspip->ospi->ABR = cmdp->alt;
wspip->ospi->IR = cmdp->cmd;
if ((cmdp->cfg & WSPI_CFG_ADDR_MODE_MASK) != WSPI_CFG_ADDR_MODE_NONE) { if ((cmdp->cfg & WSPI_CFG_ADDR_MODE_MASK) != WSPI_CFG_ADDR_MODE_NONE) {
wspip->ospi->AR = cmdp->addr; wspip->ospi->AR = cmdp->addr;
} }
@ -380,11 +382,11 @@ void wspi_lld_map_flash(WSPIDriver *wspip,
wspip->ospi->CR = (wspip->ospi->CR & ~OCTOSPI_CR_FMODE) | wspip->ospi->CR = (wspip->ospi->CR & ~OCTOSPI_CR_FMODE) |
(OCTOSPI_CR_FMODE_1 | OCTOSPI_CR_FMODE_0); (OCTOSPI_CR_FMODE_1 | OCTOSPI_CR_FMODE_0);
wspip->ospi->DLR = 0; wspip->ospi->DLR = 0;
wspip->ospi->IR = cmdp->cmd;
wspip->ospi->ABR = 0;
wspip->ospi->TCR = cmdp->dummy; wspip->ospi->TCR = cmdp->dummy;
wspip->ospi->AR = 0;
wspip->ospi->CCR = cmdp->cfg; wspip->ospi->CCR = cmdp->cfg;
wspip->ospi->ABR = 0;
wspip->ospi->IR = cmdp->cmd;
wspip->ospi->AR = 0;
/* Mapped flash absolute base address.*/ /* Mapped flash absolute base address.*/
if (addrp != NULL) { if (addrp != NULL) {

View File

@ -416,6 +416,34 @@
#define rccResetDMA2() rccResetAHB1(RCC_AHB1RSTR_DMA2RST) #define rccResetDMA2() rccResetAHB1(RCC_AHB1RSTR_DMA2RST)
/** @} */ /** @} */
/**
* @name DMAMUX peripheral specific RCC operations
* @{
*/
/**
* @brief Enables the DMAMUX peripheral clock.
*
* @param[in] lp low power enable flag
*
* @api
*/
#define rccEnableDMAMUX(lp) rccEnableAHB1(RCC_AHB1ENR_DMAMUX1EN, lp)
/**
* @brief Disables the DMAMUX peripheral clock.
*
* @api
*/
#define rccDisableDMAMUX() rccDisableAHB1(RCC_AHB1ENR_DMAMUX1EN)
/**
* @brief Resets the DMAMUX peripheral.
*
* @api
*/
#define rccResetDMAMUX() rccResetAHB1(RCC_AHB1RSTR_DMAMUX1RST)
/** @} */
/** /**
* @name PWR interface specific RCC operations * @name PWR interface specific RCC operations
* @{ * @{