From 1c909fee7f266f2cad2243e4f404c972acfa4445 Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Thu, 26 May 2016 17:26:47 +0000 Subject: [PATCH] git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9537 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/ex/Micron/m25q.c | 60 ++++++++++++++++++++++++++++++++++++++++++--- os/ex/Micron/m25q.h | 12 ++++----- 2 files changed, 62 insertions(+), 10 deletions(-) diff --git a/os/ex/Micron/m25q.c b/os/ex/Micron/m25q.c index c43fb7fe1..212d5b787 100644 --- a/os/ex/Micron/m25q.c +++ b/os/ex/Micron/m25q.c @@ -839,9 +839,6 @@ void m25qObjectInit(M25QDriver *devp) { devp->vmt = &m25q_vmt; devp->state = FLASH_STOP; devp->config = NULL; -#if (M25Q_BUS_MODE != M25Q_BUS_MODE_SPI) || defined(__DOXYGEN__) - devp->qspi_mode = 0U; -#endif } static const qspi_command_t cmd_test_reset_enable_4 = { @@ -951,7 +948,7 @@ void m25qStart(M25QDriver *devp, const M25QConfig *config) { /** * @brief Deactivates the N25Q128 driver. * - * @param[in] devp pointer to the @p M25QDriver object + * @param[in] devp pointer to the @p M25QDriver object * * @api */ @@ -981,4 +978,59 @@ void m25qStop(M25QDriver *devp) { } } +#if (M25Q_BUS_MODE != M25Q_BUS_MODE_SPI) || defined(__DOXYGEN__) +#if (QSPI_SUPPORTS_MEMMAP == TRUE) || defined(__DOXYGEN__) +/** + * @brief Enters the memory Mapping mode. + * @details The memory mapping mode is only available when the QSPI mode + * is selected and the underlying QSPI controller supports the + * feature. + * + * @param[in] devp pointer to the @p M25QDriver object + * @param[out] addrp pointer to the memory start address of the mapped + * flash or @p NULL + * + * @api + */ +void m25qMemoryMap(M25QDriver *devp, uint8_t ** addrp) { + qspi_command_t cmd; + + cmd.cfg = QSPI_CFG_CMD(M25Q_CMD_FAST_READ) | + QSPI_CFG_ADDR_SIZE_24 | +#if M25Q_BUS_MODE == M25Q_BUS_MODE_QSPI1L + QSPI_CFG_CMD_MODE_ONE_LINE | + QSPI_CFG_ADDR_MODE_ONE_LINE | + QSPI_CFG_ALT_MODE_ONE_LINE | + QSPI_CFG_DATA_MODE_ONE_LINE | +#elif M25Q_BUS_MODE == M25Q_BUS_MODE_QSPI2L + QSPI_CFG_CMD_MODE_TWO_LINES | + QSPI_CFG_ADDR_MODE_TWO_LINES | + QSPI_CFG_ALT_MODE_TWO_LINES | + QSPI_CFG_DATA_MODE_TWO_LINES | +#else + QSPI_CFG_CMD_MODE_FOUR_LINES | + QSPI_CFG_ADDR_MODE_FOUR_LINES | + QSPI_CFG_ALT_MODE_FOUR_LINES | + QSPI_CFG_DATA_MODE_FOUR_LINES | +#endif + QSPI_CFG_SIOO | + QSPI_CFG_DUMMY_CYCLES(M25Q_READ_DUMMY_CYCLES); + + qspiMapFlash(devp->config->qspip, &cmd, addrp); +} + +/** + * @brief Leaves the memory Mapping mode. + * + * @param[in] devp pointer to the @p M25QDriver object + * + * @api + */ +void m25qMemoryUnmap(M25QDriver *devp) { + + qspiUnmapFlash(devp->config->qspip); +} +#endif /* QSPI_SUPPORTS_MEMMAP == TRUE */ +#endif /* M25Q_BUS_MODE != M25Q_BUS_MODE_SPI */ + /** @} */ diff --git a/os/ex/Micron/m25q.h b/os/ex/Micron/m25q.h index c5a98eadf..f08ca1627 100644 --- a/os/ex/Micron/m25q.h +++ b/os/ex/Micron/m25q.h @@ -279,12 +279,6 @@ typedef struct { * @brief Current configuration data. */ const M25QConfig *config; -#if (M25Q_BUS_MODE != M25Q_BUS_MODE_SPI) || defined(__DOXYGEN__) - /** - * @brief Command width flags to be used for commands sent over QSPI. - */ - uint32_t qspi_mode; -#endif /** * @brief Device ID and unique ID. */ @@ -305,6 +299,12 @@ extern "C" { void m25qObjectInit(M25QDriver *devp); void m25qStart(M25QDriver *devp, const M25QConfig *config); void m25qStop(M25QDriver *devp); +#if (M25Q_BUS_MODE != M25Q_BUS_MODE_SPI) || defined(__DOXYGEN__) +#if (QSPI_SUPPORTS_MEMMAP == TRUE) || defined(__DOXYGEN__) + void m25qMemoryMap(M25QDriver *devp, uint8_t ** addrp); + void m25qMemoryUnmap(M25QDriver *devp); +#endif /* QSPI_SUPPORTS_MEMMAP == TRUE */ +#endif /* M25Q_BUS_MODE != M25Q_BUS_MODE_SPI */ #ifdef __cplusplus } #endif