Skip to content

Commit 092385f

Browse files
committed
Merge remote-tracking branch 'upstream/master' into refactor/rx-spi-dma-migration
2 parents 3a8b63a + b50c475 commit 092385f

5 files changed

Lines changed: 56 additions & 8 deletions

File tree

src/main/drivers/light_ws2811strip_hal.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ void ws2811LedStripHardwareInit(ioTag_t ioTag) {
5353
const timerHardware_t *timerHardware = timerGetByTag(ioTag);
5454
TIM_TypeDef *timer = timerHardware->tim;
5555
timerChannel = timerHardware->channel;
56-
if (timerHardware->dmaRef == NULL) {
56+
if (timerHardware->dmaRef == NULL || !dmaAllocate(timerHardware->dmaIrqHandler, OWNER_LED_STRIP, 0)) {
5757
return;
5858
}
5959
TimHandle.Instance = timer;
@@ -99,7 +99,7 @@ void ws2811LedStripHardwareInit(ioTag_t ioTag) {
9999
uint16_t dmaIndex = timerDmaIndex(timerChannel);
100100
/* Link hdma_tim to hdma[x] (channelx) */
101101
__HAL_LINKDMA(&TimHandle, hdma[dmaIndex], hdma_tim);
102-
dmaInit(timerHardware->dmaIrqHandler, OWNER_LED_STRIP, 0);
102+
dmaEnable(timerHardware->dmaIrqHandler);
103103
dmaSetHandler(timerHardware->dmaIrqHandler, WS2811_DMA_IRQHandler, NVIC_PRIO_WS2811_DMA, dmaIndex);
104104
/* Initialize TIMx DMA handle */
105105
if (HAL_DMA_Init(TimHandle.hdma[dmaIndex]) != HAL_OK) {

src/main/drivers/light_ws2811strip_stdperiph.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ void ws2811LedStripHardwareInit(ioTag_t ioTag) {
6262
DMA_InitTypeDef DMA_InitStructure;
6363
const timerHardware_t *timerHardware = timerGetByTag(ioTag);
6464
timer = timerHardware->tim;
65-
if (timerHardware->dmaRef == NULL) {
65+
if (timerHardware->dmaRef == NULL || !dmaAllocate(timerHardware->dmaIrqHandler, OWNER_LED_STRIP, 0)) {
6666
return;
6767
}
6868
ws2811IO = IOGetByTag(ioTag);
@@ -106,7 +106,7 @@ void ws2811LedStripHardwareInit(ioTag_t ioTag) {
106106
TIM_CCxCmd(timer, timerHardware->channel, TIM_CCx_Enable);
107107
}
108108
TIM_Cmd(timer, ENABLE);
109-
dmaInit(timerHardware->dmaIrqHandler, OWNER_LED_STRIP, 0);
109+
dmaEnable(timerHardware->dmaIrqHandler);
110110
dmaSetHandler(timerHardware->dmaIrqHandler, WS2811_DMA_IRQHandler, NVIC_PRIO_WS2811_DMA, 0);
111111
dmaRef = timerHardware->dmaRef;
112112
DMA_DeInit(dmaRef);

src/main/drivers/transponder_ir_io_hal.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,10 @@ void transponderIrHardwareInit(ioTag_t ioTag, transponder_t *transponder) {
124124
uint16_t dmaIndex = timerDmaIndex(timerChannel);
125125
/* Link hdma_tim to hdma[x] (channelx) */
126126
__HAL_LINKDMA(&TimHandle, hdma[dmaIndex], hdma_tim);
127-
dmaInit(timerHardware->dmaIrqHandler, OWNER_TRANSPONDER, 0);
127+
if (!dmaAllocate(timerHardware->dmaIrqHandler, OWNER_TRANSPONDER, 0)) {
128+
return;
129+
}
130+
dmaEnable(timerHardware->dmaIrqHandler);
128131
dmaSetHandler(timerHardware->dmaIrqHandler, TRANSPONDER_DMA_IRQHandler, NVIC_PRIO_TRANSPONDER_DMA, dmaIndex);
129132
/* Initialize TIMx DMA handle */
130133
if (HAL_DMA_Init(TimHandle.hdma[dmaIndex]) != HAL_OK) {

src/main/drivers/transponder_ir_io_stdperiph.c

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ volatile uint8_t transponderIrDataTransferInProgress = 0;
4242

4343
static IO_t transponderIO = IO_NONE;
4444
static TIM_TypeDef *timer = NULL;
45+
static bool transponderInitialised = false;
4546
#if defined(STM32F4)
4647
static DMA_Stream_TypeDef *dmaRef = NULL;
4748
#else
@@ -59,6 +60,7 @@ static void TRANSPONDER_DMA_IRQHandler(dmaChannelDescriptor_t* descriptor) {
5960
}
6061

6162
void transponderIrHardwareInit(ioTag_t ioTag, transponder_t *transponder) {
63+
transponderInitialised = false;
6264
if (!ioTag) {
6365
return;
6466
}
@@ -73,7 +75,11 @@ void transponderIrHardwareInit(ioTag_t ioTag, transponder_t *transponder) {
7375
transponderIO = IOGetByTag(ioTag);
7476
IOInit(transponderIO, OWNER_TRANSPONDER, 0);
7577
IOConfigGPIOAF(transponderIO, IO_CONFIG(GPIO_Mode_AF, GPIO_Speed_50MHz, GPIO_OType_PP, GPIO_PuPd_DOWN), timerHardware->alternateFunction);
76-
dmaInit(timerHardware->dmaIrqHandler, OWNER_TRANSPONDER, 0);
78+
dmaRef = timerHardware->dmaRef;
79+
if (!dmaAllocate(timerHardware->dmaIrqHandler, OWNER_TRANSPONDER, 0)) {
80+
return;
81+
}
82+
dmaEnable(timerHardware->dmaIrqHandler);
7783
dmaSetHandler(timerHardware->dmaIrqHandler, TRANSPONDER_DMA_IRQHandler, NVIC_PRIO_TRANSPONDER_DMA, 0);
7884
RCC_ClockCmd(timerRCC(timer), ENABLE);
7985
uint16_t prescaler = timerGetPrescalerByDesiredMhz(timer, transponder->timer_hz);
@@ -102,7 +108,6 @@ void transponderIrHardwareInit(ioTag_t ioTag, transponder_t *transponder) {
102108
timerOCPreloadConfig(timer, timerHardware->channel, TIM_OCPreload_Enable);
103109
TIM_CtrlPWMOutputs(timer, ENABLE);
104110
/* configure DMA */
105-
dmaRef = timerHardware->dmaRef;
106111
DMA_Cmd(dmaRef, DISABLE);
107112
DMA_DeInit(dmaRef);
108113
DMA_StructInit(&DMA_InitStructure);
@@ -124,6 +129,7 @@ void transponderIrHardwareInit(ioTag_t ioTag, transponder_t *transponder) {
124129
DMA_Init(dmaRef, &DMA_InitStructure);
125130
TIM_DMACmd(timer, timerDmaSource(timerHardware->channel), ENABLE);
126131
DMA_ITConfig(dmaRef, DMA_IT_TC, ENABLE);
132+
transponderInitialised = true;
127133
}
128134

129135
bool transponderIrInit(const ioTag_t ioTag, const transponderProvider_e provider) {
@@ -144,7 +150,7 @@ bool transponderIrInit(const ioTag_t ioTag, const transponderProvider_e provider
144150
return false;
145151
}
146152
transponderIrHardwareInit(ioTag, &transponder);
147-
return true;
153+
return transponderInitialised;
148154
}
149155

150156
bool isTransponderIrReady(void) {
@@ -166,13 +172,19 @@ void transponderIrUpdateData(const uint8_t* transponderData) {
166172
}
167173

168174
void transponderIrDMAEnable(transponder_t *transponder) {
175+
if (!transponderInitialised) {
176+
return;
177+
}
169178
DMA_SetCurrDataCounter(dmaRef, transponder->dma_buffer_size); // load number of bytes to be transferred
170179
TIM_SetCounter(timer, 0);
171180
TIM_Cmd(timer, ENABLE);
172181
DMA_Cmd(dmaRef, ENABLE);
173182
}
174183

175184
void transponderIrDisable(void) {
185+
if (!transponderInitialised) {
186+
return;
187+
}
176188
DMA_Cmd(dmaRef, DISABLE);
177189
TIM_Cmd(timer, DISABLE);
178190
IOInit(transponderIO, OWNER_TRANSPONDER, 0);

src/main/interface/cli.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4053,6 +4053,31 @@ static dmaoptValue_t *dmaoptAddr(const dmaoptEntry_t *entry, int index) {
40534053
return (dmaoptValue_t *)(base + entry->stride * index + entry->offset);
40544054
}
40554055

4056+
// Surfaces serialUART()'s otherwise-silent IRQ-driven fallback via dmaAllocate()'s live ownership state.
4057+
static void printDmaoptClaimStatus(const dmaoptEntry_t *entry, int index, const dmaChannelSpec_t *dmaChannelSpec) {
4058+
const dmaIdentifier_e identifier = dmaGetIdentifier((DMA_Stream_TypeDef *)dmaChannelSpec->ref);
4059+
if (identifier == DMA_NONE) {
4060+
// reqmap table points at a stream absent from dmaDescriptors[] -- a map bug, not a live contention case.
4061+
cliPrintLinef("# %s %d: DMA MAP ERROR", entry->device, index + 1);
4062+
return;
4063+
}
4064+
const resourceOwner_e expectedOwner = (entry->peripheral == DMA_PERIPH_UART_TX) ? OWNER_SERIAL_TX : OWNER_SERIAL_RX;
4065+
const resourceOwner_e actualOwner = dmaGetOwner(identifier);
4066+
const uint8_t actualIndex = dmaGetResourceIndex(identifier);
4067+
if (actualOwner == expectedOwner && actualIndex == RESOURCE_INDEX(index)) {
4068+
return;
4069+
}
4070+
// OWNER_FREE is indistinguishable from "this UART not opened this boot" (unassigned serial function) -- skip to avoid false positives on every unused UART slot.
4071+
if (actualOwner == OWNER_FREE) {
4072+
return;
4073+
}
4074+
char idxSuffix[DMA_OPT_STRING_BUFSIZE] = "";
4075+
if (actualIndex > 0) {
4076+
tfp_sprintf(idxSuffix, " %d", actualIndex);
4077+
}
4078+
cliPrintLinef("# %s %d: CLAIMED BY %s%s", entry->device, index + 1, ownerNames[actualOwner], idxSuffix);
4079+
}
4080+
40564081
static void printDmaoptEntry(const dmaoptEntry_t *entry, int index) {
40574082
const dmaoptValue_t *addr = dmaoptAddr(entry, index);
40584083
if (!addr) {
@@ -4066,6 +4091,7 @@ static void printDmaoptEntry(const dmaoptEntry_t *entry, int index) {
40664091
if (dmaChannelSpec) {
40674092
cliPrintLinef("# %s %d: " DMASPEC_FORMAT_STRING, entry->device, index + 1,
40684093
DMA_CODE_CONTROLLER(dmaChannelSpec->code), DMA_CODE_STREAM(dmaChannelSpec->code), DMA_CODE_CHANNEL(dmaChannelSpec->code));
4094+
printDmaoptClaimStatus(entry, index, dmaChannelSpec);
40694095
}
40704096
} else {
40714097
cliPrintLinef("dma %s %d NONE", entry->device, index + 1);
@@ -4162,6 +4188,13 @@ static void cliDmaopt(char *cmdline) {
41624188
} else {
41634189
cliPrintLinef("# dma %s %d: no change: %s", entry->device, index + 1, orgvalString);
41644190
}
4191+
4192+
if (optval != DMA_OPT_UNUSED) {
4193+
const dmaChannelSpec_t *dmaChannelSpec = dmaGetChannelSpecByPeripheral(entry->peripheral, index, optval);
4194+
if (dmaChannelSpec) {
4195+
printDmaoptClaimStatus(entry, index, dmaChannelSpec);
4196+
}
4197+
}
41654198
}
41664199
#endif // STM32F4 || STM32F7 || STM32H7
41674200

0 commit comments

Comments
 (0)