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

New SPI API supporting DMA

Call targetConfiguration() once before config is loaded and again afterwards in case the config needs to be changed to load from SD card etc

Drop SPI clock during binding

Remove debug

Add per device SPI DMA enable

Fix sdioPinConfigure() declaration warning

Reduce clock speed during SPI RX initialisation
This commit is contained in:
Steve Evans 2021-04-20 19:45:56 +01:00 committed by Michael Keller
parent 6d286e25f1
commit 87c8847c13
136 changed files with 3585 additions and 2721 deletions

View file

@ -62,7 +62,7 @@ static flashDevice_t dieDevice[MAX_DIE_COUNT];
static int dieCount;
static uint32_t dieSize;
static void w25m_dieSelect(busDevice_t *busdev, int die)
static void w25m_dieSelect(const extDevice_t *dev, int die)
{
static int activeDie = -1;
@ -72,11 +72,18 @@ static void w25m_dieSelect(busDevice_t *busdev, int die)
uint8_t command[2] = { W25M_INSTRUCTION_SOFTWARE_DIE_SELECT, die };
#ifdef SPI_BUS_TRANSACTION
spiBusTransactionTransfer(busdev, command, NULL, 2);
#else
spiBusTransfer(busdev, command, NULL, 2);
#endif
busSegment_t segments[] = {
{command, NULL, sizeof (command), true, NULL},
{NULL, NULL, 0, true, NULL},
};
// Ensure any prior DMA has completed before continuing
spiWait(dev);
spiSequence(dev, &segments[0]);
// Block pending completion of SPI access, but the erase will be ongoing
spiWait(dev);
activeDie = die;
}
@ -85,7 +92,7 @@ static bool w25m_isReady(flashDevice_t *fdevice)
{
for (int die = 0 ; die < dieCount ; die++) {
if (dieDevice[die].couldBeBusy) {
w25m_dieSelect(fdevice->io.handle.busdev, die);
w25m_dieSelect(fdevice->io.handle.dev, die);
if (!dieDevice[die].vTable->isReady(&dieDevice[die])) {
return false;
}
@ -98,7 +105,7 @@ static bool w25m_isReady(flashDevice_t *fdevice)
static bool w25m_waitForReady(flashDevice_t *fdevice)
{
for (int die = 0 ; die < dieCount ; die++) {
w25m_dieSelect(fdevice->io.handle.busdev, die);
w25m_dieSelect(fdevice->io.handle.dev, die);
if (!dieDevice[die].vTable->waitForReady(&dieDevice[die])) {
return false;
}
@ -117,8 +124,8 @@ bool w25m_detect(flashDevice_t *fdevice, uint32_t chipID)
dieCount = 2;
for (int die = 0 ; die < dieCount ; die++) {
w25m_dieSelect(fdevice->io.handle.busdev, die);
dieDevice[die].io.handle.busdev = fdevice->io.handle.busdev;
w25m_dieSelect(fdevice->io.handle.dev, die);
dieDevice[die].io.handle.dev = fdevice->io.handle.dev;
dieDevice[die].io.mode = fdevice->io.mode;
m25p16_detect(&dieDevice[die], JEDEC_ID_WINBOND_W25Q256);
}
@ -133,8 +140,8 @@ bool w25m_detect(flashDevice_t *fdevice, uint32_t chipID)
dieCount = 2;
for (int die = 0 ; die < dieCount ; die++) {
w25m_dieSelect(fdevice->io.handle.busdev, die);
dieDevice[die].io.handle.busdev = fdevice->io.handle.busdev;
w25m_dieSelect(fdevice->io.handle.dev, die);
dieDevice[die].io.handle.dev = fdevice->io.handle.dev;
dieDevice[die].io.mode = fdevice->io.mode;
w25n01g_detect(&dieDevice[die], JEDEC_ID_WINBOND_W25N01GV);
}
@ -167,7 +174,7 @@ void w25m_eraseSector(flashDevice_t *fdevice, uint32_t address)
{
int dieNumber = address / dieSize;
w25m_dieSelect(fdevice->io.handle.busdev, dieNumber);
w25m_dieSelect(fdevice->io.handle.dev, dieNumber);
dieDevice[dieNumber].vTable->eraseSector(&dieDevice[dieNumber], address % dieSize);
}
@ -175,7 +182,7 @@ void w25m_eraseSector(flashDevice_t *fdevice, uint32_t address)
void w25m_eraseCompletely(flashDevice_t *fdevice)
{
for (int dieNumber = 0 ; dieNumber < dieCount ; dieNumber++) {
w25m_dieSelect(fdevice->io.handle.busdev, dieNumber);
w25m_dieSelect(fdevice->io.handle.dev, dieNumber);
dieDevice[dieNumber].vTable->eraseCompletely(&dieDevice[dieNumber]);
}
}
@ -185,12 +192,10 @@ static int currentWriteDie;
void w25m_pageProgramBegin(flashDevice_t *fdevice, uint32_t address)
{
UNUSED(fdevice);
currentWriteDie = address / dieSize;
w25m_dieSelect(fdevice->io.handle.busdev, currentWriteDie);
w25m_dieSelect(fdevice->io.handle.dev, currentWriteDie);
currentWriteAddress = address % dieSize;
dieDevice[currentWriteDie].vTable->pageProgramBegin(&dieDevice[currentWriteDie], currentWriteAddress);
dieDevice[currentWriteDie].vTable->pageProgramBegin(&dieDevice[currentWriteDie], address);
}
void w25m_pageProgramContinue(flashDevice_t *fdevice, const uint8_t *data, int length)
@ -230,7 +235,7 @@ int w25m_readBytes(flashDevice_t *fdevice, uint32_t address, uint8_t *buffer, in
uint32_t dieAddress = address % dieSize;
tlen = MIN(dieAddress + rlen, dieSize) - dieAddress;
w25m_dieSelect(fdevice->io.handle.busdev, dieNumber);
w25m_dieSelect(fdevice->io.handle.dev, dieNumber);
rbytes = dieDevice[dieNumber].vTable->readBytes(&dieDevice[dieNumber], dieAddress, buffer, tlen);