Skip to content

Commit 8c81b16

Browse files
committed
Guard I2S modes, depending on what is supported by the chip
1 parent 6fcf128 commit 8c81b16

File tree

3 files changed

+85
-8
lines changed

3 files changed

+85
-8
lines changed

.github/workflows/push.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ jobs:
8686
name: Build with ESP-IDF ${{ matrix.idf_ver }} for ${{ matrix.idf_target }}
8787
runs-on: ubuntu-20.04
8888
strategy:
89+
fail-fast: false
8990
matrix:
9091
# The version names here correspond to the versions of espressif/idf Docker image.
9192
# See https://hub.docker.com/r/espressif/idf/tags and

libraries/ESP_I2S/src/ESP_I2S.cpp

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
}, \
3232
}
3333

34+
#if SOC_I2S_SUPPORTS_TDM
3435
#define I2S_TDM_CHAN_CFG(_sample_rate, _data_bit_width, _slot_mode, _mask) \
3536
{ \
3637
.clk_cfg = I2S_TDM_CLK_DEFAULT_CONFIG(_sample_rate), \
@@ -48,7 +49,8 @@
4849
}, \
4950
}, \
5051
}
51-
52+
#endif
53+
#if SOC_I2S_SUPPORTS_PDM_TX
5254
#if (SOC_I2S_PDM_MAX_TX_LINES > 1)
5355
#define I2S_PDM_TX_CHAN_CFG(_sample_rate, _data_bit_width, _slot_mode) \
5456
{ \
@@ -77,7 +79,9 @@
7779
}, \
7880
}
7981
#endif
82+
#endif
8083

84+
#if SOC_I2S_SUPPORTS_PDM_RX
8185
#if (SOC_I2S_PDM_MAX_RX_LINES > 1)
8286
#define I2S_PDM_RX_CHAN_CFG(_sample_rate, _data_bit_width, _slot_mode) \
8387
{ \
@@ -110,6 +114,7 @@
110114
}, \
111115
}
112116
#endif
117+
#endif
113118

114119
#define I2S_ERROR_CHECK_RETURN(x,r) do { last_error = (x); if(unlikely(last_error != ESP_OK)){ log_e("ERROR: %s", esp_err_to_name(last_error)); return (r); } } while(0)
115120
#define I2S_ERROR_CHECK_RETURN_FALSE(x) I2S_ERROR_CHECK_RETURN(x,false)
@@ -192,17 +197,20 @@ I2SClass::I2SClass(){
192197
_bclk_inv = false;
193198
_ws_inv = false;
194199

200+
#if SOC_I2S_SUPPORTS_PDM_TX
195201
_tx_clk = -1;
196202
_tx_dout0 = -1;
197203
_tx_dout1 = -1;
198204
_tx_clk_inv = false;
199-
205+
#endif
206+
#if SOC_I2S_SUPPORTS_PDM_RX
200207
_rx_clk = -1;
201208
_rx_din0 = -1;
202209
_rx_din1 = -1;
203210
_rx_din2 = -1;
204211
_rx_din3 = -1;
205212
_rx_clk_inv = false;
213+
#endif
206214
}
207215

208216
I2SClass::~I2SClass(){
@@ -233,15 +241,18 @@ void I2SClass::setInverted(bool bclk, bool ws, bool mclk){
233241
}
234242

235243
// Set pins for PDM TX mode
244+
#if SOC_I2S_SUPPORTS_PDM_TX
236245
void I2SClass::setPinsPdmTx(int8_t clk, int8_t dout0, int8_t dout1){
237246
_tx_clk = clk;
238247
_tx_dout0 = dout0;
239248
#if (SOC_I2S_PDM_MAX_TX_LINES > 1)
240249
_tx_dout1 = dout1;
241250
#endif
242251
}
252+
#endif
243253

244254
// Set pins for PDM RX mode
255+
#if SOC_I2S_SUPPORTS_PDM_RX
245256
void I2SClass::setPinsPdmRx(int8_t clk, int8_t din0, int8_t din1, int8_t din2, int8_t din3){
246257
_rx_clk = clk;
247258
_rx_din0 = din0;
@@ -251,11 +262,18 @@ void I2SClass::setPinsPdmRx(int8_t clk, int8_t din0, int8_t din1, int8_t din2, i
251262
_rx_din3 = din3;
252263
#endif
253264
}
265+
#endif
254266

267+
#if SOC_I2S_SUPPORTS_PDM_TX || SOC_I2S_SUPPORTS_PDM_RX
255268
void I2SClass::setInvertedPdm(bool clk){
269+
#if SOC_I2S_SUPPORTS_PDM_TX
256270
_tx_clk_inv = clk;
271+
#endif
272+
#if SOC_I2S_SUPPORTS_PDM_RX
257273
_rx_clk_inv = clk;
274+
#endif
258275
}
276+
#endif
259277

260278
bool I2SClass::initSTD(uint32_t rate, i2s_data_bit_width_t bits_cfg, i2s_slot_mode_t ch){
261279
// Peripheral manager deinit previous peripheral if pin was used
@@ -305,6 +323,7 @@ bool I2SClass::initSTD(uint32_t rate, i2s_data_bit_width_t bits_cfg, i2s_slot_mo
305323
return false;
306324
}
307325

326+
#if SOC_I2S_SUPPORTS_TDM
308327
bool I2SClass::initTDM(uint32_t rate, i2s_data_bit_width_t bits_cfg, i2s_slot_mode_t ch, int8_t slot_mask){
309328
// Peripheral manager deinit previous peripheral if pin was used
310329
if (_mclk >= 0) if (!perimanSetPinBus(_mclk, ESP32_BUS_TYPE_INIT, NULL)){ return false; }
@@ -352,7 +371,9 @@ bool I2SClass::initTDM(uint32_t rate, i2s_data_bit_width_t bits_cfg, i2s_slot_mo
352371
I2SClass::i2sDetachBus((void *)(this));
353372
return false;
354373
}
374+
#endif
355375

376+
#if SOC_I2S_SUPPORTS_PDM_TX
356377
bool I2SClass::initPDMtx(uint32_t rate, i2s_data_bit_width_t bits_cfg, i2s_slot_mode_t ch){
357378
// Peripheral manager deinit previous peripheral if pin was used
358379
if (_tx_clk >= 0) if (!perimanSetPinBus(_tx_clk, ESP32_BUS_TYPE_INIT, NULL)){ return false; }
@@ -383,7 +404,9 @@ bool I2SClass::initPDMtx(uint32_t rate, i2s_data_bit_width_t bits_cfg, i2s_slot_
383404
I2SClass::i2sDetachBus((void *)(this));
384405
return false;
385406
}
407+
#endif
386408

409+
#if SOC_I2S_SUPPORTS_PDM_RX
387410
bool I2SClass::initPDMrx(uint32_t rate, i2s_data_bit_width_t bits_cfg, i2s_slot_mode_t ch){
388411
// Peripheral manager deinit previous peripheral if pin was used
389412
if (_rx_clk >= 0) if (!perimanSetPinBus(_rx_clk, ESP32_BUS_TYPE_INIT, NULL)){ return false; }
@@ -418,10 +441,15 @@ bool I2SClass::initPDMrx(uint32_t rate, i2s_data_bit_width_t bits_cfg, i2s_slot_
418441
I2SClass::i2sDetachBus((void *)(this));
419442
return false;
420443
}
444+
#endif
421445

422-
bool I2SClass::begin(i2s_mode_t mode, uint32_t rate, i2s_data_bit_width_t bits_cfg, i2s_slot_mode_t ch, int8_t slot_mask){
446+
bool I2SClass::begin(i2s_mode_t mode, uint32_t rate, i2s_data_bit_width_t bits_cfg, i2s_slot_mode_t ch
447+
#if SOC_I2S_SUPPORTS_TDM
448+
, int8_t slot_mask
449+
#endif
450+
){
423451
/* Setup I2S peripheral */
424-
if (mode > I2S_MODE_PDM_RX){
452+
if (mode >= I2S_MODE_MAX){
425453
log_e("Invalid I2S mode selected.");
426454
return false;
427455
}
@@ -432,15 +460,23 @@ bool I2SClass::begin(i2s_mode_t mode, uint32_t rate, i2s_data_bit_width_t bits_c
432460
case I2S_MODE_STD:
433461
init = initSTD(rate, bits_cfg, ch);
434462
break;
463+
#if SOC_I2S_SUPPORTS_TDM
435464
case I2S_MODE_TDM:
436465
init = initTDM(rate, bits_cfg, ch, slot_mask);
437466
break;
467+
#endif
468+
#if SOC_I2S_SUPPORTS_PDM_TX
438469
case I2S_MODE_PDM_TX:
439470
init = initPDMtx(rate, bits_cfg, ch);
440471
break;
472+
#endif
473+
#if SOC_I2S_SUPPORTS_PDM_RX
441474
case I2S_MODE_PDM_RX:
442475
init = initPDMrx(rate, bits_cfg, ch);
443476
break;
477+
#endif
478+
default:
479+
break;
444480
}
445481

446482
if (init == false){
@@ -469,25 +505,34 @@ bool I2SClass::end(){
469505

470506
//Peripheral manager deinit used pins
471507
switch (_mode){
472-
case I2S_MODE_STD: case I2S_MODE_TDM:
508+
case I2S_MODE_STD:
509+
#if SOC_I2S_SUPPORTS_TDM
510+
case I2S_MODE_TDM:
511+
#endif
473512
perimanSetPinBus(_mclk, ESP32_BUS_TYPE_INIT, NULL);
474513
perimanSetPinBus(_bclk, ESP32_BUS_TYPE_INIT, NULL);
475514
perimanSetPinBus(_ws, ESP32_BUS_TYPE_INIT, NULL);
476515
if (_dout >= 0) perimanSetPinBus(_dout, ESP32_BUS_TYPE_INIT, NULL);
477516
if (_din >= 0) perimanSetPinBus(_din, ESP32_BUS_TYPE_INIT, NULL);
478517
break;
518+
#if SOC_I2S_SUPPORTS_PDM_TX
479519
case I2S_MODE_PDM_TX:
480520
perimanSetPinBus(_tx_clk, ESP32_BUS_TYPE_INIT, NULL);
481521
if (_tx_dout0 >= 0) perimanSetPinBus(_tx_dout0, ESP32_BUS_TYPE_INIT, NULL);
482522
if (_tx_dout1 >= 0) perimanSetPinBus(_tx_dout1, ESP32_BUS_TYPE_INIT, NULL);
483523
break;
524+
#endif
525+
#if SOC_I2S_SUPPORTS_PDM_RX
484526
case I2S_MODE_PDM_RX:
485527
perimanSetPinBus(_rx_clk, ESP32_BUS_TYPE_INIT, NULL);
486528
if (_rx_din0 >= 0) perimanSetPinBus(_rx_din0, ESP32_BUS_TYPE_INIT, NULL);
487529
if (_rx_din1 >= 0) perimanSetPinBus(_rx_din1, ESP32_BUS_TYPE_INIT, NULL);
488530
if (_rx_din2 >= 0) perimanSetPinBus(_rx_din2, ESP32_BUS_TYPE_INIT, NULL);
489531
if (_rx_din3 >= 0) perimanSetPinBus(_rx_din3, ESP32_BUS_TYPE_INIT, NULL);
490532
break;
533+
#endif
534+
default:
535+
break;
491536
}
492537
return true;
493538
}

libraries/ESP_I2S/src/ESP_I2S.h

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,29 @@
11
#pragma once
22
#include "Arduino.h"
33
#include "esp_err.h"
4+
#include "soc/soc_caps.h"
45
#include "driver/i2s_std.h"
6+
#if SOC_I2S_SUPPORTS_TDM
57
#include "driver/i2s_tdm.h"
8+
#endif
9+
#if SOC_I2S_SUPPORTS_PDM_TX || SOC_I2S_SUPPORTS_PDM_RX
610
#include "driver/i2s_pdm.h"
7-
#include "soc/soc_caps.h"
11+
#endif
812

913
typedef esp_err_t (*i2s_channel_read_fn)(i2s_chan_handle_t handle, char * tmp_buf, void *dest, size_t size, size_t *bytes_read, uint32_t timeout_ms);
1014

1115
typedef enum {
1216
I2S_MODE_STD,
17+
#if SOC_I2S_SUPPORTS_TDM
1318
I2S_MODE_TDM,
19+
#endif
20+
#if SOC_I2S_SUPPORTS_PDM_TX
1421
I2S_MODE_PDM_TX,
15-
I2S_MODE_PDM_RX
22+
#endif
23+
#if SOC_I2S_SUPPORTS_PDM_RX
24+
I2S_MODE_PDM_RX,
25+
#endif
26+
I2S_MODE_MAX
1627
} i2s_mode_t;
1728

1829
typedef enum {
@@ -32,11 +43,21 @@ class I2SClass: public Stream {
3243
void setInverted(bool bclk, bool ws, bool mclk=false);
3344

3445
//PDM TX + PDM RX mode
46+
#if SOC_I2S_SUPPORTS_PDM_TX
3547
void setPinsPdmTx(int8_t clk, int8_t dout0, int8_t dout1=-1);
48+
#endif
49+
#if SOC_I2S_SUPPORTS_PDM_RX
3650
void setPinsPdmRx(int8_t clk, int8_t din0, int8_t din1=-1, int8_t din2=-1, int8_t din3=-1);
51+
#endif
52+
#if SOC_I2S_SUPPORTS_PDM_TX || SOC_I2S_SUPPORTS_PDM_RX
3753
void setInvertedPdm(bool clk);
54+
#endif
3855

39-
bool begin(i2s_mode_t mode, uint32_t rate, i2s_data_bit_width_t bits_cfg, i2s_slot_mode_t ch, int8_t slot_mask=-1);
56+
bool begin(i2s_mode_t mode, uint32_t rate, i2s_data_bit_width_t bits_cfg, i2s_slot_mode_t ch
57+
#if SOC_I2S_SUPPORTS_TDM
58+
, int8_t slot_mask=-1
59+
#endif
60+
);
4061
bool configureTX(uint32_t rate, i2s_data_bit_width_t bits_cfg, i2s_slot_mode_t ch);
4162
bool configureRX(uint32_t rate, i2s_data_bit_width_t bits_cfg, i2s_slot_mode_t ch, i2s_rx_transform_t transform=I2S_RX_TRANSFORM_NONE);
4263
bool end();
@@ -93,17 +114,27 @@ class I2SClass: public Stream {
93114
bool _mclk_inv, _bclk_inv, _ws_inv;
94115

95116
//PDM mode
117+
#if SOC_I2S_SUPPORTS_PDM_RX
96118
int8_t _rx_clk, _rx_din0, _rx_din1, _rx_din2, _rx_din3; //TODO: soc_caps.h 1/4
97119
bool _rx_clk_inv;
120+
#endif
121+
#if SOC_I2S_SUPPORTS_PDM_TX
98122
int8_t _tx_clk, _tx_dout0, _tx_dout1;
99123
bool _tx_clk_inv;
124+
#endif
100125

101126
bool allocTranformRX(size_t buf_len);
102127
bool transformRX(i2s_rx_transform_t transform);
103128

104129
static bool i2sDetachBus(void * bus_pointer);
105130
bool initSTD(uint32_t rate, i2s_data_bit_width_t bits_cfg, i2s_slot_mode_t ch);
131+
#if SOC_I2S_SUPPORTS_TDM
106132
bool initTDM(uint32_t rate, i2s_data_bit_width_t bits_cfg, i2s_slot_mode_t ch, int8_t slot_mask);
133+
#endif
134+
#if SOC_I2S_SUPPORTS_PDM_TX
107135
bool initPDMtx(uint32_t rate, i2s_data_bit_width_t bits_cfg, i2s_slot_mode_t ch);
136+
#endif
137+
#if SOC_I2S_SUPPORTS_PDM_RX
108138
bool initPDMrx(uint32_t rate, i2s_data_bit_width_t bits_cfg, i2s_slot_mode_t ch);
139+
#endif
109140
};

0 commit comments

Comments
 (0)