1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-13 11:29:58 +03:00

Nonblocking w25n01g code tidy up (#13562)

* In case of BUS_ABORT still process and linked segments

* Tidy up segments

* Set SPI clock speed for w25n01g
This commit is contained in:
Steve Evans 2024-04-22 22:14:20 +01:00 committed by GitHub
parent d447d795f4
commit e0c0b64a4b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 31 additions and 22 deletions

View file

@ -417,8 +417,13 @@ FAST_IRQ_HANDLER static void spiIrqHandler(const extDevice_t *dev)
break;
case BUS_ABORT:
bus->curSegment = (busSegment_t *)BUS_SPI_FREE;
return;
// Skip to the end of the segment list
nextSegment = (busSegment_t *)bus->curSegment + 1;
while (nextSegment->len != 0) {
bus->curSegment = nextSegment;
nextSegment = (busSegment_t *)bus->curSegment + 1;
}
break;
case BUS_READY:
default:

View file

@ -353,7 +353,10 @@ bool w25n01g_identify(flashDevice_t *fdevice, uint32_t jedecID)
fdevice->couldBeBusy = true; // Just for luck we'll assume the chip could be busy even though it isn't specced to be
fdevice->vTable = &w25n01g_vTable;
#ifndef USE_QUADSPI
// Need to set clock speed for 8kHz logging support with SPI
spiSetClkDivisor(fdevice->io.handle.dev, spiCalculateDivider(100000000));
#endif // USE_QUADSPI
return true;
}
@ -663,18 +666,10 @@ uint32_t w25n01g_pageProgramContinue(flashDevice_t *fdevice, uint8_t const **buf
STATIC_DMA_DATA_AUTO uint8_t progExecDataLoad[] = { W25N01G_INSTRUCTION_PROGRAM_DATA_LOAD, 0, 0};
STATIC_DMA_DATA_AUTO uint8_t progRandomProgDataLoad[] = { W25N01G_INSTRUCTION_RANDOM_PROGRAM_DATA_LOAD, 0, 0};
static busSegment_t segmentsFlash[] = {
{.u.buffers = {readStatus, readyStatus}, sizeof(readStatus), true, w25n01g_callbackReady},
{.u.buffers = {writeEnable, NULL}, sizeof(writeEnable), true, w25n01g_callbackWriteEnable},
{.u.buffers = {progExecCmd, NULL}, sizeof(progExecCmd), true, w25n01g_callbackWriteComplete},
{.u.link = {NULL, NULL}, 0, true, NULL},
};
static busSegment_t segmentsDataLoad[] = {
{.u.buffers = {readStatus, readyStatus}, sizeof(readStatus), true, w25n01g_callbackReady},
{.u.buffers = {writeEnable, NULL}, sizeof(writeEnable), true, w25n01g_callbackWriteEnable},
{.u.buffers = {progExecDataLoad, NULL}, sizeof(progExecDataLoad), false, NULL},
{.u.buffers = {NULL, NULL}, 0, true, NULL}, // Patch in pointer to data buffer here
{.u.link = {NULL, NULL}, 0, true, NULL},
};
@ -682,7 +677,18 @@ uint32_t w25n01g_pageProgramContinue(flashDevice_t *fdevice, uint8_t const **buf
{.u.buffers = {readStatus, readyStatus}, sizeof(readStatus), true, w25n01g_callbackReady},
{.u.buffers = {writeEnable, NULL}, sizeof(writeEnable), true, w25n01g_callbackWriteEnable},
{.u.buffers = {progRandomProgDataLoad, NULL}, sizeof(progRandomProgDataLoad), false, NULL},
{.u.buffers = {NULL, NULL}, 0, true, NULL}, // Patch in pointer to data buffer here
{.u.link = {NULL, NULL}, 0, true, NULL},
};
static busSegment_t segmentsBuffer[] = {
{.u.buffers = {NULL, NULL}, 0, true, NULL},
{.u.link = {NULL, NULL}, 0, true, NULL},
};
static busSegment_t segmentsFlash[] = {
{.u.buffers = {readStatus, readyStatus}, sizeof(readStatus), true, w25n01g_callbackReady},
{.u.buffers = {writeEnable, NULL}, sizeof(writeEnable), true, w25n01g_callbackWriteEnable},
{.u.buffers = {progExecCmd, NULL}, sizeof(progExecCmd), true, w25n01g_callbackWriteComplete},
{.u.link = {NULL, NULL}, 0, true, NULL},
};
@ -698,9 +704,6 @@ uint32_t w25n01g_pageProgramContinue(flashDevice_t *fdevice, uint8_t const **buf
// Set the address and buffer details for the random data load
progRandomProgDataLoad[1] = (columnAddress >> 8) & 0xff;
progRandomProgDataLoad[2] = columnAddress & 0xff;
segmentsRandomDataLoad[3].u.buffers.txData = (uint8_t *)buffers[0];
segmentsRandomDataLoad[3].len = bufferSizes[0];
programSegment = segmentsRandomDataLoad;
} else {
programStartAddress = programLoadAddress = fdevice->currentWriteAddress;
@ -708,12 +711,16 @@ uint32_t w25n01g_pageProgramContinue(flashDevice_t *fdevice, uint8_t const **buf
// Set the address and buffer details for the data load
progExecDataLoad[1] = (columnAddress >> 8) & 0xff;
progExecDataLoad[2] = columnAddress & 0xff;
segmentsDataLoad[3].u.buffers.txData = (uint8_t *)buffers[0];
segmentsDataLoad[3].len = bufferSizes[0];
programSegment = segmentsDataLoad;
}
// Add the data buffer
segmentsBuffer[0].u.buffers.txData = (uint8_t *)buffers[0];
segmentsBuffer[0].len = bufferSizes[0];
segmentsBuffer[0].callback = NULL;
spiLinkSegments(fdevice->io.handle.dev, programSegment, segmentsBuffer);
bufferDirty = true;
programLoadAddress += bufferSizes[0];
@ -724,17 +731,14 @@ uint32_t w25n01g_pageProgramContinue(flashDevice_t *fdevice, uint8_t const **buf
progExecCmd[2] = (currentPage >> 8) & 0xff;
progExecCmd[3] = currentPage & 0xff;
// Don't callback on completion of data load but rather after flashing
programSegment[3].callback = NULL;
spiLinkSegments(fdevice->io.handle.dev, programSegment, segmentsFlash);
spiLinkSegments(fdevice->io.handle.dev, segmentsBuffer, segmentsFlash);
bufferDirty = false;
programStartAddress = programLoadAddress;
} else {
// Callback on completion of data load
programSegment[3].callback = w25n01g_callbackWriteComplete;
segmentsBuffer[0].callback = w25n01g_callbackWriteComplete;
}
if (!fdevice->couldBeBusy) {