mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-12 19:10:32 +03:00
spiInternalInitStream extract common preInit code.
Clarify logic for init / preinit of spi DMA channels by extracting the code for when spiInternalInitStream was called with preInit = true. NB PICO updates to follow
This commit is contained in:
parent
b6d37008f5
commit
16283c4e14
6 changed files with 19 additions and 57 deletions
|
@ -490,7 +490,7 @@ void spiSequence(const extDevice_t *dev, busSegment_t *segments)
|
||||||
FAST_CODE void spiProcessSegmentsDMA(const extDevice_t *dev)
|
FAST_CODE void spiProcessSegmentsDMA(const extDevice_t *dev)
|
||||||
{
|
{
|
||||||
// Intialise the init structures for the first transfer
|
// Intialise the init structures for the first transfer
|
||||||
spiInternalInitStream(dev, false);
|
spiInternalInitStream(dev, dev->bus->curSegment);
|
||||||
|
|
||||||
// Assert Chip Select
|
// Assert Chip Select
|
||||||
IOLo(dev->busType_u.spi.csnPin);
|
IOLo(dev->busType_u.spi.csnPin);
|
||||||
|
@ -499,6 +499,16 @@ FAST_CODE void spiProcessSegmentsDMA(const extDevice_t *dev)
|
||||||
spiInternalStartDMA(dev);
|
spiInternalStartDMA(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void spiPreInitStream(const extDevice_t *dev)
|
||||||
|
{
|
||||||
|
// Prepare the init structure for the next segment to reduce inter-segment interval
|
||||||
|
// (if it's a "buffers" segment, not a "link" segment).
|
||||||
|
busSegment_t *segment = (busSegment_t *)dev->bus->curSegment + 1;
|
||||||
|
if (segment->len > 0) {
|
||||||
|
spiInternalInitStream(dev, segment);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Interrupt handler common code for SPI receive DMA completion.
|
// Interrupt handler common code for SPI receive DMA completion.
|
||||||
// Proceed to next segment as required.
|
// Proceed to next segment as required.
|
||||||
FAST_IRQ_HANDLER void spiIrqHandler(const extDevice_t *dev)
|
FAST_IRQ_HANDLER void spiIrqHandler(const extDevice_t *dev)
|
||||||
|
@ -512,7 +522,7 @@ FAST_IRQ_HANDLER void spiIrqHandler(const extDevice_t *dev)
|
||||||
// Repeat the last DMA segment
|
// Repeat the last DMA segment
|
||||||
bus->curSegment--;
|
bus->curSegment--;
|
||||||
// Reinitialise the cached init values as segment is not progressing
|
// Reinitialise the cached init values as segment is not progressing
|
||||||
spiInternalInitStream(dev, true);
|
spiPreInitStream(dev);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BUS_ABORT:
|
case BUS_ABORT:
|
||||||
|
@ -557,7 +567,7 @@ FAST_IRQ_HANDLER void spiIrqHandler(const extDevice_t *dev)
|
||||||
|
|
||||||
// After the completion of the first segment setup the init structure for the subsequent segment
|
// After the completion of the first segment setup the init structure for the subsequent segment
|
||||||
if (bus->initSegment) {
|
if (bus->initSegment) {
|
||||||
spiInternalInitStream(dev, false);
|
spiInternalInitStream(dev, bus->curSegment);
|
||||||
bus->initSegment = false;
|
bus->initSegment = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -570,7 +580,7 @@ FAST_IRQ_HANDLER void spiIrqHandler(const extDevice_t *dev)
|
||||||
spiInternalStartDMA(dev);
|
spiInternalStartDMA(dev);
|
||||||
|
|
||||||
// Prepare the init structures ready for the next segment to reduce inter-segment time
|
// Prepare the init structures ready for the next segment to reduce inter-segment time
|
||||||
spiInternalInitStream(dev, true);
|
spiPreInitStream(dev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -87,7 +87,7 @@ typedef struct SPIDevice_s {
|
||||||
extern spiDevice_t spiDevice[SPIDEV_COUNT];
|
extern spiDevice_t spiDevice[SPIDEV_COUNT];
|
||||||
|
|
||||||
void spiInitDevice(SPIDevice device);
|
void spiInitDevice(SPIDevice device);
|
||||||
void spiInternalInitStream(const extDevice_t *dev, bool preInit);
|
void spiInternalInitStream(const extDevice_t *dev, volatile busSegment_t *segment);
|
||||||
void spiInternalStartDMA(const extDevice_t *dev);
|
void spiInternalStartDMA(const extDevice_t *dev);
|
||||||
void spiInternalStopDMA (const extDevice_t *dev);
|
void spiInternalStopDMA (const extDevice_t *dev);
|
||||||
void spiInternalResetStream(dmaChannelDescriptor_t *descriptor);
|
void spiInternalResetStream(dmaChannelDescriptor_t *descriptor);
|
||||||
|
|
|
@ -156,23 +156,11 @@ FAST_CODE bool spiInternalReadWriteBufPolled(SPI_TypeDef *instance, const uint8_
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiInternalInitStream(const extDevice_t *dev, bool preInit)
|
void spiInternalInitStream(const extDevice_t *dev, volatile busSegment_t *segment)
|
||||||
{
|
{
|
||||||
STATIC_DMA_DATA_AUTO uint8_t dummyTxByte = 0xff;
|
STATIC_DMA_DATA_AUTO uint8_t dummyTxByte = 0xff;
|
||||||
STATIC_DMA_DATA_AUTO uint8_t dummyRxByte;
|
STATIC_DMA_DATA_AUTO uint8_t dummyRxByte;
|
||||||
busDevice_t *bus = dev->bus;
|
busDevice_t *bus = dev->bus;
|
||||||
|
|
||||||
busSegment_t *segment = (busSegment_t *)bus->curSegment;
|
|
||||||
|
|
||||||
if (preInit) {
|
|
||||||
// Prepare the init structure for the next segment to reduce inter-segment interval
|
|
||||||
segment++;
|
|
||||||
if(segment->len == 0) {
|
|
||||||
// There's no following segment
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int len = segment->len;
|
int len = segment->len;
|
||||||
|
|
||||||
uint8_t *txData = segment->u.buffers.txData;
|
uint8_t *txData = segment->u.buffers.txData;
|
||||||
|
|
|
@ -156,23 +156,11 @@ bool spiInternalReadWriteBufPolled(spi_type *instance, const uint8_t *txData, ui
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiInternalInitStream(const extDevice_t *dev, bool preInit)
|
void spiInternalInitStream(const extDevice_t *dev, volatile busSegment_t *segment)
|
||||||
{
|
{
|
||||||
STATIC_DMA_DATA_AUTO uint8_t dummyTxByte = 0xff;
|
STATIC_DMA_DATA_AUTO uint8_t dummyTxByte = 0xff;
|
||||||
STATIC_DMA_DATA_AUTO uint8_t dummyRxByte;
|
STATIC_DMA_DATA_AUTO uint8_t dummyRxByte;
|
||||||
busDevice_t *bus = dev->bus;
|
busDevice_t *bus = dev->bus;
|
||||||
|
|
||||||
volatile busSegment_t *segment = bus->curSegment;
|
|
||||||
|
|
||||||
if (preInit) {
|
|
||||||
// Prepare the init structure for the next segment to reduce inter-segment interval
|
|
||||||
segment++;
|
|
||||||
if(segment->len == 0) {
|
|
||||||
// There's no following segment
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int len = segment->len;
|
int len = segment->len;
|
||||||
|
|
||||||
uint8_t *txData = segment->u.buffers.txData;
|
uint8_t *txData = segment->u.buffers.txData;
|
||||||
|
|
|
@ -268,23 +268,11 @@ FAST_CODE bool spiInternalReadWriteBufPolled(SPI_TypeDef *instance, const uint8_
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiInternalInitStream(const extDevice_t *dev, bool preInit)
|
void spiInternalInitStream(const extDevice_t *dev, volatile busSegment_t *segment)
|
||||||
{
|
{
|
||||||
STATIC_DMA_DATA_AUTO uint8_t dummyTxByte = 0xff;
|
STATIC_DMA_DATA_AUTO uint8_t dummyTxByte = 0xff;
|
||||||
STATIC_DMA_DATA_AUTO uint8_t dummyRxByte;
|
STATIC_DMA_DATA_AUTO uint8_t dummyRxByte;
|
||||||
busDevice_t *bus = dev->bus;
|
busDevice_t *bus = dev->bus;
|
||||||
|
|
||||||
busSegment_t *segment = (busSegment_t *)bus->curSegment;
|
|
||||||
|
|
||||||
if (preInit) {
|
|
||||||
// Prepare the init structure for the next segment to reduce inter-segment interval
|
|
||||||
segment++;
|
|
||||||
if(segment->len == 0) {
|
|
||||||
// There's no following segment
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int len = segment->len;
|
int len = segment->len;
|
||||||
|
|
||||||
uint8_t *txData = segment->u.buffers.txData;
|
uint8_t *txData = segment->u.buffers.txData;
|
||||||
|
|
|
@ -162,23 +162,11 @@ bool spiInternalReadWriteBufPolled(SPI_TypeDef *instance, const uint8_t *txData,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiInternalInitStream(const extDevice_t *dev, bool preInit)
|
void spiInternalInitStream(const extDevice_t *dev, volatile busSegment_t *segment)
|
||||||
{
|
{
|
||||||
STATIC_DMA_DATA_AUTO uint8_t dummyTxByte = 0xff;
|
STATIC_DMA_DATA_AUTO uint8_t dummyTxByte = 0xff;
|
||||||
STATIC_DMA_DATA_AUTO uint8_t dummyRxByte;
|
STATIC_DMA_DATA_AUTO uint8_t dummyRxByte;
|
||||||
busDevice_t *bus = dev->bus;
|
busDevice_t *bus = dev->bus;
|
||||||
|
|
||||||
volatile busSegment_t *segment = bus->curSegment;
|
|
||||||
|
|
||||||
if (preInit) {
|
|
||||||
// Prepare the init structure for the next segment to reduce inter-segment interval
|
|
||||||
segment++;
|
|
||||||
if(segment->len == 0) {
|
|
||||||
// There's no following segment
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int len = segment->len;
|
int len = segment->len;
|
||||||
|
|
||||||
uint8_t *txData = segment->u.buffers.txData;
|
uint8_t *txData = segment->u.buffers.txData;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue