From 7535dbc454344286fc2ce33e8cb1263457cde5f5 Mon Sep 17 00:00:00 2001 From: Zhang Zhao Xiang Date: Mon, 23 Apr 2018 14:36:19 +0800 Subject: [PATCH] fix zero dma buffer bug: must be 4-bytes aligned --- components/driver/i2s.c | 12 +++++++++--- components/driver/include/driver/i2s.h | 6 +++--- 2 files changed, 12 insertions(+), 6 deletions(-) mode change 100755 => 100644 components/driver/i2s.c mode change 100755 => 100644 components/driver/include/driver/i2s.h diff --git a/components/driver/i2s.c b/components/driver/i2s.c old mode 100755 new mode 100644 index e88ad521f0..61bfbeb5d3 --- a/components/driver/i2s.c +++ b/components/driver/i2s.c @@ -1010,6 +1010,12 @@ esp_err_t i2s_zero_dma_buffer(i2s_port_t i2s_num) } } if (p_i2s_obj[i2s_num]->tx && p_i2s_obj[i2s_num]->tx->buf != NULL && p_i2s_obj[i2s_num]->tx->buf_size != 0) { + int bytes_left = 0; + bytes_left = (p_i2s_obj[i2s_num]->tx->buf_size - p_i2s_obj[i2s_num]->tx->rw_pos) % 4; + if (bytes_left) { + size_t zero_bytes = 0, bytes_written; + i2s_write(i2s_num, (void *)&zero_bytes, bytes_left, &bytes_written, portMAX_DELAY); + } for (int i = 0; i < p_i2s_obj[i2s_num]->dma_buf_count; i++) { memset(p_i2s_obj[i2s_num]->tx->buf[i], 0, p_i2s_obj[i2s_num]->tx->buf_size); } @@ -1228,7 +1234,7 @@ esp_err_t i2s_write_expand(i2s_port_t i2s_num, const void *src, size_t size, siz return ESP_OK; } -int i2s_read_bytes(i2s_port_t i2s_num, const void *dest, size_t size, TickType_t ticks_to_wait) +int i2s_read_bytes(i2s_port_t i2s_num, void *dest, size_t size, TickType_t ticks_to_wait) { size_t bytes_read = 0; int res = 0; @@ -1240,7 +1246,7 @@ int i2s_read_bytes(i2s_port_t i2s_num, const void *dest, size_t size, TickType_t } } -esp_err_t i2s_read(i2s_port_t i2s_num, const void *dest, size_t size, size_t *bytes_read, TickType_t ticks_to_wait) +esp_err_t i2s_read(i2s_port_t i2s_num, void *dest, size_t size, size_t *bytes_read, TickType_t ticks_to_wait) { char *data_ptr, *dest_byte; int bytes_can_read; @@ -1286,7 +1292,7 @@ int i2s_push_sample(i2s_port_t i2s_num, const void *sample, TickType_t ticks_to_ } } -int i2s_pop_sample(i2s_port_t i2s_num, const void *sample, TickType_t ticks_to_wait) +int i2s_pop_sample(i2s_port_t i2s_num, void *sample, TickType_t ticks_to_wait) { size_t bytes_pop = 0; int res = 0; diff --git a/components/driver/include/driver/i2s.h b/components/driver/include/driver/i2s.h old mode 100755 new mode 100644 index be3e7748ea..78fa80334f --- a/components/driver/include/driver/i2s.h +++ b/components/driver/include/driver/i2s.h @@ -336,7 +336,7 @@ esp_err_t i2s_write_expand(i2s_port_t i2s_num, const void *src, size_t size, siz * - The amount of bytes read, if timeout, bytes read will be less than the size passed in * - ESP_FAIL Parameter error */ -int i2s_read_bytes(i2s_port_t i2s_num, const void *dest, size_t size, TickType_t ticks_to_wait) __attribute__ ((deprecated)); +int i2s_read_bytes(i2s_port_t i2s_num, void *dest, size_t size, TickType_t ticks_to_wait) __attribute__ ((deprecated)); /** * @brief Read data from I2S DMA receive buffer @@ -358,7 +358,7 @@ int i2s_read_bytes(i2s_port_t i2s_num, const void *dest, size_t size, TickType_t * - ESP_OK Success * - ESP_ERR_INVALID_ARG Parameter error */ -esp_err_t i2s_read(i2s_port_t i2s_num, const void *dest, size_t size, size_t *bytes_read, TickType_t ticks_to_wait); +esp_err_t i2s_read(i2s_port_t i2s_num, void *dest, size_t size, size_t *bytes_read, TickType_t ticks_to_wait); /** * @brief Write a single sample to the I2S DMA TX buffer. @@ -394,7 +394,7 @@ int i2s_push_sample(i2s_port_t i2s_num, const void *sample, TickType_t ticks_to_ * - Number of bytes successfully read from DMA buffer, will be either zero or the size of configured sample buffer (in bytes). * - ESP_FAIL Parameter error */ -int i2s_pop_sample(i2s_port_t i2s_num, const void *sample, TickType_t ticks_to_wait) __attribute__ ((deprecated)); +int i2s_pop_sample(i2s_port_t i2s_num, void *sample, TickType_t ticks_to_wait) __attribute__ ((deprecated)); /** * @brief Set sample rate used for I2S RX and TX.