From afd4ffdd577e99310c28d59236cee71e73ccb83e Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Thu, 24 Aug 2023 12:15:08 +0000 Subject: [PATCH] git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@16379 27425a3e-05d8-49a3-a47f-9c15f0e5edd8 --- os/sb/common/sbsysc.h | 2 ++ os/sb/vio/sbvio_spi.c | 36 +++++++++++++++++++++++---- os/xhal/codegen/hal_spi.xml | 35 +++++++++++++++++--------- os/xhal/include/hal_spi.h | 49 ++++++++++++++++++++++++++++--------- 4 files changed, 94 insertions(+), 28 deletions(-) diff --git a/os/sb/common/sbsysc.h b/os/sb/common/sbsysc.h index 22978d5f9..ed2903834 100644 --- a/os/sb/common/sbsysc.h +++ b/os/sb/common/sbsysc.h @@ -117,9 +117,11 @@ #define SB_VSPI_RECEIVE 3 #define SB_VSPI_SEND 4 #define SB_VSPI_EXCHANGE 5 +#define SB_VSPI_GETCLRSTS 6 #define SB_VSPI_SETCFG 0 #define SB_VSPI_SELECT 1 #define SB_VSPI_UNSELECT 2 +#define SB_VSPI_GETSTS 3 /** @} */ /** diff --git a/os/sb/vio/sbvio_spi.c b/os/sb/vio/sbvio_spi.c index 55d05c001..e497c97fb 100644 --- a/os/sb/vio/sbvio_spi.c +++ b/os/sb/vio/sbvio_spi.c @@ -126,13 +126,16 @@ void sb_sysc_vio_spi(struct port_extctx *ectxp) { msg_t msg; uint32_t n = ectxp->r1; void *rxbuf = (void *)ectxp->r2; + size_t bufsize; if (n == 0U) { ectxp->r0 = CH_RET_EINVAL; break; } - if (!sb_is_valid_write_range(sbp, rxbuf, n)) { /* TODO frame size */ + bufsize = n * spiGetFrameSizeX(unitp->spip); + + if (!sb_is_valid_write_range(sbp, rxbuf, bufsize)) { ectxp->r0 = (uint32_t)0; /* TODO enforce fault instead.*/ break; @@ -155,13 +158,16 @@ void sb_sysc_vio_spi(struct port_extctx *ectxp) { msg_t msg; uint32_t n = ectxp->r1; const void *txbuf = (const void *)ectxp->r2; + size_t bufsize; if (n == 0U) { ectxp->r0 = CH_RET_EINVAL; break; } - if (!sb_is_valid_read_range(sbp, txbuf, n)) { /* TODO frame size */ + bufsize = n * spiGetFrameSizeX(unitp->spip); + + if (!sb_is_valid_read_range(sbp, txbuf, bufsize)) { ectxp->r0 = (uint32_t)0; /* TODO enforce fault instead.*/ break; @@ -182,22 +188,25 @@ void sb_sysc_vio_spi(struct port_extctx *ectxp) { case SB_VSPI_EXCHANGE: { msg_t msg; - uint32_t n = ectxp->r1; + size_t n = (size_t)ectxp->r1; void *rxbuf = (void *)ectxp->r2; const void *txbuf = (const void *)ectxp->r3; + size_t bufsize; if (n == 0U) { ectxp->r0 = CH_RET_EINVAL; break; } - if (!sb_is_valid_write_range(sbp, rxbuf, n)) { /* TODO frame size */ + bufsize = n * spiGetFrameSizeX(unitp->spip); + + if (!sb_is_valid_write_range(sbp, rxbuf, bufsize)) { ectxp->r0 = (uint32_t)0; /* TODO enforce fault instead.*/ break; } - if (!sb_is_valid_read_range(sbp, txbuf, n)) { /* TODO frame size */ + if (!sb_is_valid_read_range(sbp, txbuf, bufsize)) { ectxp->r0 = (uint32_t)0; /* TODO enforce fault instead.*/ break; @@ -215,6 +224,18 @@ void sb_sysc_vio_spi(struct port_extctx *ectxp) { ectxp->r0 = (uint32_t)msg; break; } + case SB_VSPI_GETCLRSTS: + { + drv_status_t mask = (size_t)ectxp->r1; + drv_status_t sts; + + chSysLock(); + sts = drvGetAndClearStatusI(unitp->spip, mask); + chSysUnlock(); + + ectxp->r0 = (uint32_t)sts; + break; + } default: ectxp->r0 = (uint32_t)CH_RET_ENOSYS; break; @@ -272,6 +293,11 @@ void sb_fastc_vio_spi(struct port_extctx *ectxp) { ectxp->r0 = (uint32_t)HAL_RET_SUCCESS; break; } + case SB_VSPI_GETSTS: + { + ectxp->r0 = (uint32_t)drvGetStatusX(unitp->spip); + break; + } default: /* Silently ignored.*/ break; diff --git a/os/xhal/codegen/hal_spi.xml b/os/xhal/codegen/hal_spi.xml index 3b2b0ad56..f1d559d81 100644 --- a/os/xhal/codegen/hal_spi.xml +++ b/os/xhal/codegen/hal_spi.xml @@ -9,24 +9,30 @@ - - Enables the circular buffer mode. + + Memory buffers frame size bit position. - - Enables the slave mode. + + Memory buffers frame size mask. - - Memory buffers frame size. - - + Memory frame size is 8 bits - + Memory frame size is 16 bits - + Memory frame size is 32 bits + + Memory frame size is 64 bits + + + Enables the circular buffer mode. + + + Enables the slave mode. + @@ -739,7 +745,13 @@ return msg;]]> - + + Returns the configured size, in bytes, of data frames. + > SPI_MODE_FSIZE_POS)); +]]> + Asserts the slave select signal and prepares for transfers. @@ -889,6 +901,7 @@ __cbdrv_invoke_cb_with_transition(self, HAL_DRV_STATE_READY); __spi_wakeup_isr(self, msg);]]> + diff --git a/os/xhal/include/hal_spi.h b/os/xhal/include/hal_spi.h index 5d7fb8f20..775256d2d 100644 --- a/os/xhal/include/hal_spi.h +++ b/os/xhal/include/hal_spi.h @@ -38,34 +38,44 @@ * @{ */ /** - * @brief Enables the circular buffer mode. + * @brief Memory buffers frame size bit position. */ -#define SPI_MODE_CIRCULAR 1U << 0 +#define SPI_MODE_FSIZE_POS 0U /** - * @brief Enables the slave mode. + * @brief Memory buffers frame size mask. */ -#define SPI_MODE_SLAVE 1U << 1 - -/** - * @brief Memory buffers frame size. - */ -#define SPI_MODE_FSIZE_MASK 3U << 2 +#define SPI_MODE_FSIZE_MASK (3U << SPI_MODE_FSIZE_POS) /** * @brief Memory frame size is 8 bits. */ -#define SPI_MODE_FSIZE_8 0U << 2 +#define SPI_MODE_FSIZE_8 (0U << SPI_MODE_FSIZE_POS) /** * @brief Memory frame size is 16 bits. */ -#define SPI_MODE_FSIZE_16 1U << 2 +#define SPI_MODE_FSIZE_16 (1U << SPI_MODE_FSIZE_POS) /** * @brief Memory frame size is 32 bits. */ -#define SPI_MODE_FSIZE_32 2U << 2 +#define SPI_MODE_FSIZE_32 (2U << SPI_MODE_FSIZE_POS) + +/** + * @brief Memory frame size is 64 bits. + */ +#define SPI_MODE_FSIZE_64 (3U << SPI_MODE_FSIZE_POS) + +/** + * @brief Enables the circular buffer mode. + */ +#define SPI_MODE_CIRCULAR (1U << 2) + +/** + * @brief Enables the slave mode. + */ +#define SPI_MODE_SLAVE (1U << 3) /** @} */ /** @@ -430,6 +440,21 @@ static inline hal_spi_driver_c *spiObjectInit(hal_spi_driver_c *self) { * @name Inline methods of hal_spi_driver_c * @{ */ +/** + * @memberof hal_spi_driver_c + * @public + * + * @brief Returns the configured size, in bytes, of data frames. + * + * @param[in,out] ip Pointer to a @p hal_spi_driver_c instance. + */ +CC_FORCE_INLINE +static inline size_t spiGetFrameSizeX(void *ip) { + hal_spi_driver_c *self = (hal_spi_driver_c *)ip; + + return (size_t)(1U << ((__spi_getfield(self, mode) & SPI_MODE_FSIZE_MASK) >> SPI_MODE_FSIZE_POS)); +} + #if (SPI_SELECT_MODE == SPI_SELECT_MODE_LLD) || defined (__DOXYGEN__) /** * @memberof hal_spi_driver_c