Skip to content

Commit b0d45ce

Browse files
committed
Initial implementation of PDM support (untested)
1 parent 8519d67 commit b0d45ce

File tree

2 files changed

+36
-13
lines changed

2 files changed

+36
-13
lines changed

libraries/I2S/src/I2S.cpp

+32-10
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ void I2SClass::destroyCallbackTask()
134134
}
135135
}
136136

137-
int I2SClass::_install_driver(){
137+
int I2SClass::_installDriver(){
138138
esp_i2s::i2s_mode_t i2s_mode = (esp_i2s::i2s_mode_t)(esp_i2s::I2S_MODE_RX | esp_i2s::I2S_MODE_TX);
139139

140140
if(_driveClock){
@@ -144,12 +144,19 @@ int I2SClass::_install_driver(){
144144
i2s_mode = (esp_i2s::i2s_mode_t)(i2s_mode | esp_i2s::I2S_MODE_SLAVE);
145145
}
146146
if(_mode == I2S_ADC_DAC){
147-
if(_bitsPerSample != 16){ // ADC/DAC can only work in 16-bit sample mode
148-
log_e("ERROR I2SClass::begin invalid bps for ADC/DAC");
147+
#if SOC_I2S_SUPPORTS_ADC_DAC
148+
if(_bitsPerSample != 16){ // ADC/DAC can only work in 16-bit sample mode
149+
log_e("ERROR I2SClass::begin invalid bps for ADC/DAC");
150+
return 0; // ERR
151+
}
152+
i2s_mode = (esp_i2s::i2s_mode_t)(i2s_mode | esp_i2s::I2S_MODE_DAC_BUILT_IN | esp_i2s::I2S_MODE_ADC_BUILT_IN);
153+
#else
154+
log_e("This chip does not support DAC / ADC");
149155
return 0; // ERR
150-
}
151-
i2s_mode = (esp_i2s::i2s_mode_t)(i2s_mode | esp_i2s::I2S_MODE_DAC_BUILT_IN | esp_i2s::I2S_MODE_ADC_BUILT_IN);
152-
}else{ // End of ADC/DAC mode; start of Normal mode
156+
#endif
157+
}else if(_mode == I2S_PHILIPS_MODE ||
158+
_mode == I2S_RIGHT_JUSTIFIED_MODE ||
159+
_mode == I2S_LEFT_JUSTIFIED_MODE){ // End of ADC/DAC mode; start of Normal mode
153160
if(_bitsPerSample != 16 && _bitsPerSample != 24 && _bitsPerSample != 32){
154161
if(_bitsPerSample == 8){
155162
log_e("ESP unfortunately does not support 8 bits per sample");
@@ -162,7 +169,14 @@ int I2SClass::_install_driver(){
162169
log_w("Original Arduino library does not support 24 bits per sample - keep that in mind if you should switch back");
163170
}
164171

165-
} // Normal mode
172+
}else if(_mode == I2S_PDM){
173+
#if SOC_I2S_SUPPORTS_PDM
174+
i2s_mode = (esp_i2s::i2s_mode_t)(i2s_mode | esp_i2s::I2S_MODE_PDM);
175+
#else
176+
log_e("This chip does not support PDM");
177+
return 0; // ERR
178+
#endif
179+
} // Mode
166180
esp_i2s::i2s_config_t i2s_config = {
167181
.mode = i2s_mode,
168182
.sample_rate = _sampleRate,
@@ -174,10 +188,16 @@ int I2SClass::_install_driver(){
174188
.dma_buf_len = _i2s_dma_buffer_size
175189
};
176190

177-
if (ESP_OK != esp_i2s::i2s_driver_install((esp_i2s::i2s_port_t) _deviceIndex, &i2s_config, _I2S_EVENT_QUEUE_LENGTH, &_i2sEventQueue)){ // Install and start i2s driver
191+
if(ESP_OK != esp_i2s::i2s_driver_install((esp_i2s::i2s_port_t) _deviceIndex, &i2s_config, _I2S_EVENT_QUEUE_LENGTH, &_i2sEventQueue)){ // Install and start i2s driver
178192
log_e("ERROR could not install i2s driver");
179193
return 0; // ERR
180194
}
195+
if(_i2sEventQueue == NULL){
196+
log_e("ERROR i2s driver did not create event queue");
197+
//return 0; // ERR
198+
}else{
199+
log_d("DEBUG MSG i2s event queue exists");
200+
}
181201

182202
if(_mode == I2S_ADC_DAC){
183203
esp_i2s::adc_unit_t adc_unit = (esp_i2s::adc_unit_t) 1;
@@ -239,6 +259,7 @@ int I2SClass::begin(int mode, long sampleRate, int bitsPerSample, bool driveCloc
239259
switch (mode) {
240260
case I2S_PHILIPS_MODE:
241261
case I2S_ADC_DAC:
262+
case I2S_PDM:
242263
break;
243264

244265
case I2S_RIGHT_JUSTIFIED_MODE: // normally this should work, but i don't how to set it up for ESP
@@ -257,7 +278,7 @@ int I2SClass::begin(int mode, long sampleRate, int bitsPerSample, bool driveCloc
257278
return 0; // ERR
258279
}
259280

260-
if(!_install_driver()){
281+
if(!_installDriver()){
261282
return 0; // ERR
262283
}
263284

@@ -411,7 +432,7 @@ int I2SClass::getDataOutPin(){
411432
return _outSdPin;
412433
}
413434

414-
int I2SClass::_uninstall_driver(){
435+
int I2SClass::_uninstallDriver(){
415436
// TODO
416437
return 1; // Ok
417438
}
@@ -624,6 +645,7 @@ void I2SClass::onTransferComplete()
624645

625646
xQueueSet = xQueueCreateSet(sizeof(i2s_event)*_I2S_EVENT_QUEUE_LENGTH + 1);
626647
configASSERT(xQueueSet);
648+
configASSERT(_i2sEventQueue);
627649
xQueueAddToSet(_i2sEventQueue, xQueueSet);
628650
xQueueAddToSet(_task_kill_cmd_semaphore_handle, xQueueSet);
629651

libraries/I2S/src/I2S.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ typedef enum {
4747
I2S_PHILIPS_MODE,
4848
I2S_RIGHT_JUSTIFIED_MODE,
4949
I2S_LEFT_JUSTIFIED_MODE,
50-
I2S_ADC_DAC
50+
I2S_ADC_DAC,
51+
I2S_PDM
5152
} i2s_mode_t;
5253

5354
class I2SClass : public Stream
@@ -117,8 +118,8 @@ class I2SClass : public Stream
117118
int createCallbackTask();
118119

119120
static void onDmaTransferComplete(void*);
120-
int _install_driver();
121-
int _uninstall_driver();
121+
int _installDriver();
122+
int _uninstallDriver();
122123
void _setSckPin(int sckPin);
123124
void _setFsPin(int fsPin);
124125
void _setDataInPin(int inSdPin);

0 commit comments

Comments
 (0)