Skip to content

Commit b2b8f62

Browse files
committed
Fix I2S/DMA crashes
1 parent 2bb6897 commit b2b8f62

File tree

4 files changed

+20
-31
lines changed

4 files changed

+20
-31
lines changed

BoxAudioBuffer.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ void BoxAudioBuffer::init(uint8_t* buffer, uint16_t size) {
1313
}
1414

1515
void BoxAudioBuffer::logState() {
16+
//noIRQ = true;
1617
Log.info("BoxAudioBuffer bufferStart=%X, _bufferEnd=%X, _bufferSize=%X, _readPointer=%X, _writePointer=%X", _bufferStart, _bufferEnd, _bufferSize, _readPointer, _writePointer);
1718
Log.info(" getBytesReadable()=%X, getBytesReadableBlock()=%X, getBytesWritable()=%X, getBytesWritableBlock()=%X", getBytesReadable(), getBytesReadableBlock(), getBytesWritable(), getBytesWritableBlock());
19+
//noIRQ = false;
1820
}
1921

2022
bool BoxAudioBuffer::readPointerEqualsWritePointer() {
@@ -57,7 +59,7 @@ void BoxAudioBuffer::updateReadPointer(uint16_t readLength) {
5759
}
5860

5961
void BoxAudioBuffer::write(uint8_t* buffer, uint16_t size) {
60-
isWriting = true;
62+
noIRQ = true;
6163
uint16_t writableBlock = getBytesWritableBlock();
6264
//Log.info("write *buffer=%X, size=%i, writableBlock=%i", buffer, size, writableBlock);
6365

@@ -78,7 +80,7 @@ void BoxAudioBuffer::write(uint8_t* buffer, uint16_t size) {
7880
_isEmpty = false;
7981
_isFull = true;
8082
}
81-
isWriting = false;
83+
noIRQ = false;
8284
}
8385

8486

BoxAudioBuffer.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
class BoxAudioBuffer {
77
public:
8-
bool isWriting = false;
8+
bool noIRQ = false;
99

1010
void init(uint8_t* buffer, uint16_t size);
1111
void logState();

BoxDAC.cpp

+15-27
Original file line numberDiff line numberDiff line change
@@ -40,27 +40,18 @@ void BoxDAC::logDmaIrqChanges() {
4040
}
4141
}
4242

43-
void BoxDAC::logAudioBuffer() {/*
44-
Log.info("Log audioBuffer=%X", audioBuffer);
45-
Log.info(" dataBuffer=%X", dataBuffer);
46-
Log.info(" *pucBufferStartPtr=%X", buffer->pucBufferStartPtr);
47-
Log.info(" *pucBufferEndPtr=%X", buffer->pucBufferEndPtr);
48-
Log.info(" *pucReadPtr=%X", buffer->pucReadPtr - buffer->pucBufferStartPtr);
49-
Log.info(" *pucWritePtr=%X", buffer->pucWritePtr - buffer->pucBufferStartPtr);
50-
Log.info(" *GetBufferSize()=%X", GetBufferBlockSize(buffer));
51-
Log.info(" ulBufferSize=%X", buffer->ulBufferSize);*/
52-
}
53-
5443
void dma_irq() {
5544
Box.boxDAC.dmaPingPingComplete();
5645
}
5746

5847
void BoxDAC::begin() {
5948
Log.info("Initialize DAC...");
6049
audioBuffer.init(dataBuffer, PLAY_BUFFER_SIZE);
50+
audioBuffer.logState();
6151
fillBuffer(25);
52+
audioBuffer.logState();
6253

63-
uint32_t clock; //(Num of bytes * STEREO * sampling)
54+
uint32_t clock; //(Num of bits * STEREO * sampling)
6455
clock = 16*2*16000;
6556

6657
MAP_PinTypeI2S(PIN_50, PIN_MODE_4); //I2S Data0 (DIN)
@@ -74,7 +65,6 @@ void BoxDAC::begin() {
7465
initDACI2C();
7566

7667
Log.info("DMA");
77-
logAudioBuffer();
7868

7969
UDMAInit();
8070
UDMAChannelSelect(UDMA_CH5_I2S_TX, NULL);
@@ -138,6 +128,9 @@ void BoxDAC::begin() {
138128
setInterval(0);
139129

140130
Log.info("sample[0]=%i", sample[0]);
131+
setVolume(current_volume);
132+
send(ADDR::PAGE_CONTROL, PAGE::SERIAL_IO);
133+
send(ADDR_P0_SERIAL::DAC_VOL_CTRL, 0x00);
141134

142135
Log.info("...initialized");
143136
}
@@ -186,8 +179,7 @@ void BoxDAC::fillBuffer(uint16_t timeoutMs) {
186179
}
187180

188181
void BoxDAC::dmaPingPingComplete() {
189-
if (audioBuffer.isWriting)
190-
return;
182+
MAP_I2SIntClear(I2S_BASE, I2S_INT_XDMA);
191183

192184
unsigned long intStatus = MAP_uDMAIntStatus();
193185
unsigned int bytesReadable = audioBuffer.getBytesReadable();
@@ -196,6 +188,7 @@ void BoxDAC::dmaPingPingComplete() {
196188

197189
dmaIRQcount++;
198190
if (intStatus & 0x20) { //TX IRQ I2S_INT_XDMA?
191+
//MAP_I2SIntClear(I2S_BASE, I2S_INT_XDMA);
199192

200193
tDMAControlTable *pControlTable;
201194
pControlTable = (tDMAControlTable*)MAP_uDMAControlBaseGet();
@@ -206,38 +199,33 @@ void BoxDAC::dmaPingPingComplete() {
206199
unsigned long bufferSize = audioBuffer.getBytesReadableBlock();
207200
unsigned long size = bufferSize > I2S_PACKET_SIZE ? I2S_PACKET_SIZE : bufferSize;
208201
unsigned long elements = size / 2;
209-
210-
if (size == 1) {
211-
audioBuffer.updateReadPointer(1); //Workaround
212-
}
213202
size = elements * 2;
214203

215204
if (MAP_uDMAChannelModeGet(UDMA_CH5_I2S_TX | UDMA_PRI_SELECT) == UDMA_MODE_STOP) {
216205
//if((pControlTable[ulPrimaryIndexRx].ulControl & UDMA_CHCTL_XFERMODE_M) == 0) {
217-
if (elements<4) {
218-
ulPrimaryIndexRxEmpty++;
206+
if (audioBuffer.noIRQ || elements<I2S_PACKET_ELEMENTS) {
219207
MAP_uDMAChannelTransferSet(UDMA_CH5_I2S_TX, UDMA_MODE_PINGPONG, (void *)aZeroBuffer, (void *)I2S_TX_DMA_PORT, I2S_PACKET_ELEMENTS);
208+
ulPrimaryIndexRxEmpty++;
220209
} else {
221-
ulPrimaryIndexRxFilled++;
222210
MAP_uDMAChannelTransferSet(UDMA_CH5_I2S_TX, UDMA_MODE_PINGPONG, (void *)audioBuffer.getReadPointer(), (void *)I2S_TX_DMA_PORT, elements);
223211
audioBuffer.updateReadPointer(size);
212+
ulPrimaryIndexRxFilled++;
224213
}
225214
MAP_uDMAChannelEnable(UDMA_CH5_I2S_TX);
226215
} else if (MAP_uDMAChannelModeGet(UDMA_CH5_I2S_TX | UDMA_ALT_SELECT) == UDMA_MODE_STOP) {
227216
//} else if((pControlTable[ulAltIndexRx].ulControl & UDMA_CHCTL_XFERMODE_M) == 0) {
228-
if (elements<0) {
229-
ulAltIndexRxEmpty++;
217+
if (audioBuffer.noIRQ || elements<I2S_PACKET_ELEMENTS) {
230218
MAP_uDMAChannelTransferSet(UDMA_CH5_I2S_TX|UDMA_ALT_SELECT, UDMA_MODE_PINGPONG, (void *)aZeroBuffer, (void *)I2S_TX_DMA_PORT, I2S_PACKET_ELEMENTS);
219+
ulAltIndexRxEmpty++;
231220
} else {
232-
ulAltIndexRxFilled++;
233221
MAP_uDMAChannelTransferSet(UDMA_CH5_I2S_TX|UDMA_ALT_SELECT, UDMA_MODE_PINGPONG, (void *)audioBuffer.getReadPointer(), (void *)I2S_TX_DMA_PORT, elements);
234222
audioBuffer.updateReadPointer(size);
223+
ulAltIndexRxFilled++;
235224
}
236225
MAP_uDMAChannelEnable(UDMA_CH5_I2S_TX|UDMA_ALT_SELECT);
237226
}
238-
MAP_I2SIntClear(I2S_BASE, I2S_INT_XDMA);
239227
} else {
240-
Log.error("Unintended intStatus=%X", intStatus);
228+
//Log.error("Unintended intStatus=%X", intStatus);
241229
}
242230
}
243231

BoxDAC.h

-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ class BoxDAC : public EnhancedThread {
4949
unsigned long dmaBufferFilled = 0;
5050
unsigned long lastDmaBufferFilled = 0xFFFF;
5151

52-
void logAudioBuffer();
5352
void logDmaIrqChanges();
5453

5554

0 commit comments

Comments
 (0)