From a87f5c6c02294da9ec81ac0fe655ae41006c55af Mon Sep 17 00:00:00 2001 From: Armando Date: Fri, 16 Apr 2021 21:33:14 +0800 Subject: [PATCH] spi_slave_hd: add polling api to read/write buf to essl_spi --- components/esp_serial_slave_link/essl_spi.c | 31 ++++++++++++++ .../include/esp_serial_slave_link/essl_spi.h | 40 ++++++++++++++++++- 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/components/esp_serial_slave_link/essl_spi.c b/components/esp_serial_slave_link/essl_spi.c index a6605f72d6..03ad5120ee 100644 --- a/components/esp_serial_slave_link/essl_spi.c +++ b/components/esp_serial_slave_link/essl_spi.c @@ -76,6 +76,22 @@ esp_err_t essl_spi_rdbuf(spi_device_handle_t spi, uint8_t *out_data, int addr, i return spi_device_transmit(spi, (spi_transaction_t*)&t); } +esp_err_t essl_spi_rdbuf_polling(spi_device_handle_t spi, uint8_t *out_data, int addr, int len, uint32_t flags) +{ + spi_transaction_ext_t t = { + .base = { + .cmd = get_hd_command(CMD_HD_RDBUF_REG, flags), + .addr = addr % 72, + .rxlength = len * 8, + .rx_buffer = out_data, + .flags = flags | SPI_TRANS_VARIABLE_DUMMY, + }, + .dummy_bits = get_hd_dummy_bits(flags), + }; + + return spi_device_polling_transmit(spi, (spi_transaction_t*)&t); +} + esp_err_t essl_spi_wrbuf(spi_device_handle_t spi, const uint8_t *data, int addr, int len, uint32_t flags) { spi_transaction_ext_t t = { @@ -91,6 +107,21 @@ esp_err_t essl_spi_wrbuf(spi_device_handle_t spi, const uint8_t *data, int addr, return spi_device_transmit(spi, (spi_transaction_t*)&t); } +esp_err_t essl_spi_wrbuf_polling(spi_device_handle_t spi, const uint8_t *data, int addr, int len, uint32_t flags) +{ + spi_transaction_ext_t t = { + .base = { + .cmd = get_hd_command(CMD_HD_WRBUF_REG, flags), + .addr = addr % 72, + .length = len * 8, + .tx_buffer = data, + .flags = flags | SPI_TRANS_VARIABLE_DUMMY, + }, + .dummy_bits = get_hd_dummy_bits(flags), + }; + return spi_device_polling_transmit(spi, (spi_transaction_t*)&t); +} + esp_err_t essl_spi_rddma_seg(spi_device_handle_t spi, uint8_t *out_data, int seg_len, uint32_t flags) { spi_transaction_ext_t t = { diff --git a/components/esp_serial_slave_link/include/esp_serial_slave_link/essl_spi.h b/components/esp_serial_slave_link/include/esp_serial_slave_link/essl_spi.h index b788910095..a6c3c40c04 100644 --- a/components/esp_serial_slave_link/include/esp_serial_slave_link/essl_spi.h +++ b/components/esp_serial_slave_link/include/esp_serial_slave_link/essl_spi.h @@ -28,7 +28,7 @@ extern "C" //////////////////////////////////////////////////////////////////////////////// /** - * @brief Read the shared buffer from the slave. + * @brief Read the shared buffer from the slave in ISR way * * @note ``out_data`` should be prepared in words and in the DRAM. The buffer may be written in words * by the DMA. When a byte is written, the remaining bytes in the same word will also be @@ -46,7 +46,25 @@ extern "C" esp_err_t essl_spi_rdbuf(spi_device_handle_t spi, uint8_t *out_data, int addr, int len, uint32_t flags); /** - * @brief Write the shared buffer of the slave. + * @brief Read the shared buffer from the slave in polling way + * + * @note ``out_data`` should be prepared in words and in the DRAM. The buffer may be written in words + * by the DMA. When a byte is written, the remaining bytes in the same word will also be + * overwritten, even the ``len`` is shorter than a word. + * + * @param spi SPI device handle representing the slave + * @param out_data Buffer for read data, strongly suggested to be in the DRAM and align to 4 + * @param addr Address of the slave shared buffer + * @param len Length to read + * @param flags `SPI_TRANS_*` flags to control the transaction mode of the transaction to send. + * @return + * - ESP_OK: on success + * - or other return value from :cpp:func:`spi_device_transmit`. + */ +esp_err_t essl_spi_rdbuf_polling(spi_device_handle_t spi, uint8_t *out_data, int addr, int len, uint32_t flags); + +/** + * @brief Write the shared buffer of the slave in ISR way * * @note ``out_data`` should be prepared in words and in the DRAM. The buffer may be written in words * by the DMA. When a byte is written, the remaining bytes in the same word will also be @@ -63,6 +81,24 @@ esp_err_t essl_spi_rdbuf(spi_device_handle_t spi, uint8_t *out_data, int addr, i */ esp_err_t essl_spi_wrbuf(spi_device_handle_t spi, const uint8_t *data, int addr, int len, uint32_t flags); +/** + * @brief Write the shared buffer of the slave in polling way + * + * @note ``out_data`` should be prepared in words and in the DRAM. The buffer may be written in words + * by the DMA. When a byte is written, the remaining bytes in the same word will also be + * overwritten, even the ``len`` is shorter than a word. + * + * @param spi SPI device handle representing the slave + * @param data Buffer for data to send, strongly suggested to be in the DRAM and align to 4 + * @param addr Address of the slave shared buffer, + * @param len Length to write + * @param flags `SPI_TRANS_*` flags to control the transaction mode of the transaction to send. + * @return + * - ESP_OK: success + * - or other return value from :cpp:func:`spi_device_polling_transmit`. + */ +esp_err_t essl_spi_wrbuf_polling(spi_device_handle_t spi, const uint8_t *data, int addr, int len, uint32_t flags); + /** * @brief Receive long buffer in segments from the slave through its DMA. *