diff --git a/src/main/cli/cli.c b/src/main/cli/cli.c index 17a3333ff..ecb596e27 100644 --- a/src/main/cli/cli.c +++ b/src/main/cli/cli.c @@ -250,6 +250,7 @@ extern uint32_t inputBuffer[DSHOT_TELEMETRY_INPUT_LEN]; extern uint32_t setDirectionMicros; #endif +typedef bool printFn(uint8_t dumpMask, bool equalsDefault, const char *format, ...); static void backupPgConfig(const pgRegistry_t *pg) @@ -4638,6 +4639,28 @@ static void dmaoptToString(int optval, char *buf) } } +static void printPeripheralDmaoptDetails(dmaoptEntry_t *entry, int index, const dmaoptValue_t dmaopt, const bool equalsDefault, const uint8_t dumpMask, printFn *printValue) +{ + if (dmaopt != DMA_OPT_UNUSED) { + printValue(dumpMask, equalsDefault, + "dma %s %d %d", + entry->device, DMA_OPT_UI_INDEX(index), dmaopt); + + const dmaChannelSpec_t *dmaChannelSpec = dmaGetChannelSpecByPeripheral(entry->peripheral, index, dmaopt); + dmaCode_t dmaCode = 0; + if (dmaChannelSpec) { + dmaCode = dmaChannelSpec->code; + } + printValue(dumpMask, equalsDefault, + "# %s %d: DMA%d Stream %d Channel %d", + entry->device, DMA_OPT_UI_INDEX(index), DMA_CODE_CONTROLLER(dmaCode), DMA_CODE_STREAM(dmaCode), DMA_CODE_CHANNEL(dmaCode)); + } else if (!(dumpMask & HIDE_UNUSED)) { + printValue(dumpMask, equalsDefault, + "dma %s %d NONE", + entry->device, DMA_OPT_UI_INDEX(index)); + } +} + static void printPeripheralDmaopt(dmaoptEntry_t *entry, int index, uint8_t dumpMask) { const pgRegistry_t* pg = pgFind(entry->pgn); @@ -4664,80 +4687,72 @@ static void printPeripheralDmaopt(dmaoptEntry_t *entry, int index, uint8_t dumpM bool equalsDefault = currentOpt == defaultOpt; if (defaultConfig) { - if (defaultOpt != DMA_OPT_UNUSED) { - const dmaChannelSpec_t *dmaChannelSpec = dmaGetChannelSpecByPeripheral(entry->peripheral, index, defaultOpt); - dmaCode_t dmaCode = 0; - if (dmaChannelSpec) { - dmaCode = dmaChannelSpec->code; - } - cliDefaultPrintLinef(dumpMask, equalsDefault, - "dma %s %d %d", - entry->device, DMA_OPT_UI_INDEX(index), defaultOpt); - cliDefaultPrintLinef(dumpMask, equalsDefault, - "# %s %d: DMA%d Stream %d Channel %d", - entry->device, DMA_OPT_UI_INDEX(index), DMA_CODE_CONTROLLER(dmaCode), DMA_CODE_STREAM(dmaCode), DMA_CODE_CHANNEL(dmaCode)); - } else { - cliDefaultPrintLinef(dumpMask, equalsDefault, - "dma %s %d NONE", - entry->device, DMA_OPT_UI_INDEX(index)); - } + printPeripheralDmaoptDetails(entry, index, defaultOpt, equalsDefault, dumpMask, cliDefaultPrintLinef); } - if (currentOpt != DMA_OPT_UNUSED) { - cliDumpPrintLinef(dumpMask, equalsDefault, - "dma %s %d %d", - entry->device, DMA_OPT_UI_INDEX(index), currentOpt); - - const dmaChannelSpec_t *dmaChannelSpec = dmaGetChannelSpecByPeripheral(entry->peripheral, index, currentOpt); - dmaCode_t dmaCode = 0; - if (dmaChannelSpec) { - dmaCode = dmaChannelSpec->code; - } - cliDumpPrintLinef(dumpMask, equalsDefault, - "# %s %d: DMA%d Stream %d Channel %d", - entry->device, DMA_OPT_UI_INDEX(index), DMA_CODE_CONTROLLER(dmaCode), DMA_CODE_STREAM(dmaCode), DMA_CODE_CHANNEL(dmaCode)); - } else if (!(dumpMask & HIDE_UNUSED)) { - cliDumpPrintLinef(dumpMask, equalsDefault, - "dma %s %d NONE", - entry->device, DMA_OPT_UI_INDEX(index)); - } + printPeripheralDmaoptDetails(entry, index, currentOpt, equalsDefault, dumpMask, cliDumpPrintLinef); } #if defined(USE_TIMER_MGMT) -static void printTimerDmaopt(const timerIOConfig_t *timerIoConfig, uint8_t dumpMask) +static void printTimerDmaoptDetails(const ioTag_t ioTag, const timerHardware_t *timer, const dmaoptValue_t dmaopt, const bool equalsDefault, const uint8_t dumpMask, printFn *printValue) { const char *format = "dma pin %c%02d %d"; - const ioTag_t ioTag = timerIoConfig->ioTag; + if (dmaopt != DMA_OPT_UNUSED) { + const bool printDetails = printValue(dumpMask, equalsDefault, format, + IO_GPIOPortIdxByTag(ioTag) + 'A', IO_GPIOPinIdxByTag(ioTag), + dmaopt + ); + + if (printDetails) { + const dmaChannelSpec_t *dmaChannelSpec = dmaGetChannelSpecByTimerValue(timer->tim, timer->channel, dmaopt); + dmaCode_t dmaCode = 0; + if (dmaChannelSpec) { + dmaCode = dmaChannelSpec->code; + printValue(dumpMask, false, + "# pin %c%02d: DMA%d Stream %d Channel %d", + IO_GPIOPortIdxByTag(ioTag) + 'A', IO_GPIOPinIdxByTag(ioTag), + DMA_CODE_CONTROLLER(dmaCode), DMA_CODE_STREAM(dmaCode), DMA_CODE_CHANNEL(dmaCode) + ); + } + } + } else if (!(dumpMask & HIDE_UNUSED)) { + printValue(dumpMask, equalsDefault, + "dma pin %c%02d NONE", + IO_GPIOPortIdxByTag(ioTag) + 'A', IO_GPIOPinIdxByTag(ioTag) + ); + } +} + +static void printTimerDmaopt(const timerIOConfig_t *currentConfig, const timerIOConfig_t *defaultConfig, unsigned index, uint8_t dumpMask) +{ + const ioTag_t ioTag = currentConfig[index].ioTag; if (!ioTag) { return; } - const dmaoptValue_t dmaopt = timerIoConfig->dmaopt; - const timerHardware_t *timer = timerGetByTag(ioTag); + const timerHardware_t *timer = timerGetByTagAndIndex(ioTag, currentConfig[index].index); + const dmaoptValue_t dmaopt = currentConfig[index].dmaopt; - if (dmaopt != DMA_OPT_UNUSED) { - cliDumpPrintLinef(dumpMask, false, format, - IO_GPIOPortIdxByTag(ioTag) + 'A', IO_GPIOPinIdxByTag(ioTag), - dmaopt - ); - const dmaChannelSpec_t *dmaChannelSpec = dmaGetChannelSpecByTimer(timer); - dmaCode_t dmaCode = 0; - if (dmaChannelSpec) { - dmaCode = dmaChannelSpec->code; + dmaoptValue_t defaultDmaopt = DMA_OPT_UNUSED; + if (defaultConfig) { + for (unsigned i = 0; i < MAX_TIMER_PINMAP_COUNT; i++) { + if (defaultConfig[i].ioTag == ioTag) { + defaultDmaopt = defaultConfig[index].dmaopt; + + break; + } } - cliDumpPrintLinef(dumpMask, false, - "# pin %c%02d: DMA%d Stream %d Channel %d", - IO_GPIOPortIdxByTag(ioTag) + 'A', IO_GPIOPinIdxByTag(ioTag), - DMA_CODE_CONTROLLER(dmaCode), DMA_CODE_STREAM(dmaCode), DMA_CODE_CHANNEL(dmaCode) - ); - } else if (!(dumpMask & HIDE_UNUSED)) { - cliDumpPrintLinef(dumpMask, false, - "dma pin %c%02d NONE", - IO_GPIOPortIdxByTag(ioTag) + 'A', IO_GPIOPinIdxByTag(ioTag) - ); } + + const bool equalsDefault = defaultDmaopt == dmaopt; + + if (defaultConfig) { + printTimerDmaoptDetails(ioTag, timer, defaultDmaopt, equalsDefault, dumpMask, cliDefaultPrintLinef); + } + + printTimerDmaoptDetails(ioTag, timer, dmaopt, equalsDefault, dumpMask, cliDumpPrintLinef); } #endif @@ -4751,8 +4766,20 @@ static void printDmaopt(uint8_t dumpMask) } #if defined(USE_TIMER_MGMT) + const pgRegistry_t* pg = pgFind(PG_TIMER_IO_CONFIG); + const timerIOConfig_t *currentConfig; + const timerIOConfig_t *defaultConfig; + + if (configIsInCopy) { + currentConfig = (timerIOConfig_t *)pg->copy; + defaultConfig = (timerIOConfig_t *)pg->address; + } else { + currentConfig = (timerIOConfig_t *)pg->address; + defaultConfig = NULL; + } + for (unsigned i = 0; i < MAX_TIMER_PINMAP_COUNT; i++) { - printTimerDmaopt(timerIOConfig(i), dumpMask); + printTimerDmaopt(currentConfig, defaultConfig, i, dumpMask); } #endif } @@ -4766,6 +4793,11 @@ static void cliDmaopt(char *cmdline) pch = strtok_r(cmdline, " ", &saveptr); if (!pch) { printDmaopt(DUMP_MASTER | HIDE_UNUSED); + + return; + } else if (strcasecmp(pch, "list") == 0) { + cliPrintErrorLinef("NOT IMPLEMENTED YET"); + return; } @@ -5018,17 +5050,50 @@ static void printTimer(uint8_t dumpMask) { const char *format = "timer %c%02d %d"; - for (unsigned int i = 0; i < MAX_TIMER_PINMAP_COUNT; i++) { + const pgRegistry_t* pg = pgFind(PG_TIMER_IO_CONFIG); + const timerIOConfig_t *currentConfig; + const timerIOConfig_t *defaultConfig; - const ioTag_t ioTag = timerIOConfig(i)->ioTag; - const uint8_t timerIndex = timerIOConfig(i)->index; + if (configIsInCopy) { + currentConfig = (timerIOConfig_t *)pg->copy; + defaultConfig = (timerIOConfig_t *)pg->address; + } else { + currentConfig = (timerIOConfig_t *)pg->address; + defaultConfig = NULL; + } + + for (unsigned int i = 0; i < MAX_TIMER_PINMAP_COUNT; i++) { + const ioTag_t ioTag = currentConfig[i].ioTag; if (!ioTag) { continue; } - cliDumpPrintLinef(dumpMask, false, format, - IO_GPIOPortIdxByTag(ioTag) + 'A', + const uint8_t timerIndex = currentConfig[i].index; + + uint8_t defaultTimerIndex = 0; + if (defaultConfig) { + for (unsigned i = 0; i < MAX_TIMER_PINMAP_COUNT; i++) { + if (defaultConfig[i].ioTag == ioTag) { + defaultTimerIndex = defaultConfig[i].index; + + break; + } + } + } + + const bool equalsDefault = defaultTimerIndex == timerIndex; + + if (defaultConfig && defaultTimerIndex) { + cliDefaultPrintLinef(dumpMask, equalsDefault, format, + IO_GPIOPortIdxByTag(ioTag) + 'A', + IO_GPIOPinIdxByTag(ioTag), + defaultTimerIndex - 1 + ); + } + + cliDumpPrintLinef(dumpMask, equalsDefault, format, + IO_GPIOPortIdxByTag(ioTag) + 'A', IO_GPIOPinIdxByTag(ioTag), timerIndex - 1 ); @@ -5042,6 +5107,10 @@ static void cliTimer(char *cmdline) if (len == 0) { printTimer(DUMP_MASTER); + return; + } else if (strncasecmp(cmdline, "list", len) == 0) { + cliPrintErrorLinef("NOT IMPLEMENTED YET"); + return; } else if (strncasecmp(cmdline, "show", len) == 0) { cliPrintErrorLinef("NOT IMPLEMENTED YET"); @@ -5073,7 +5142,8 @@ static void cliTimer(char *cmdline) } if (timerIOIndex < 0) { - cliPrintErrorLinef("INDEX OUT OF RANGE."); + cliPrintErrorLinef("PIN TIMER MAP FULL."); + return; } diff --git a/src/main/drivers/dma_reqmap.c b/src/main/drivers/dma_reqmap.c index 36ff889a0..9f4e60e0c 100644 --- a/src/main/drivers/dma_reqmap.c +++ b/src/main/drivers/dma_reqmap.c @@ -252,7 +252,8 @@ dmaoptValue_t dmaoptByTag(ioTag_t ioTag) #else UNUSED(ioTag); #endif - return -1; + + return DMA_OPT_UNUSED; } const dmaChannelSpec_t *dmaGetChannelSpecByTimerValue(TIM_TypeDef *tim, uint8_t channel, dmaoptValue_t dmaopt) @@ -300,6 +301,6 @@ dmaoptValue_t dmaGetOptionByTimer(const timerHardware_t *timer) } } - return -1; + return DMA_OPT_UNUSED; } #endif // USE_DMA_SPEC diff --git a/src/main/drivers/timer.h b/src/main/drivers/timer.h index 553128c77..88cd32950 100644 --- a/src/main/drivers/timer.h +++ b/src/main/drivers/timer.h @@ -261,6 +261,7 @@ uint8_t timerInputIrq(TIM_TypeDef *tim); timerIOConfig_t *timerIoConfigByTag(ioTag_t ioTag); #endif const timerHardware_t *timerGetByTag(ioTag_t ioTag); +const timerHardware_t *timerGetByTagAndIndex(ioTag_t ioTag, unsigned timerIndex); ioTag_t timerioTagGetByUsage(timerUsageFlag_e usageFlag, uint8_t index); #if defined(USE_HAL_DRIVER) diff --git a/src/main/drivers/timer_common.c b/src/main/drivers/timer_common.c index b9f562645..7c158ad22 100644 --- a/src/main/drivers/timer_common.c +++ b/src/main/drivers/timer_common.c @@ -54,14 +54,13 @@ static uint8_t timerIndexByTag(ioTag_t ioTag) return 0; } -const timerHardware_t *timerGetByTag(ioTag_t ioTag) +const timerHardware_t *timerGetByTagAndIndex(ioTag_t ioTag, unsigned timerIndex) { if (!ioTag) { return NULL; } #if TIMER_CHANNEL_COUNT > 0 - uint8_t timerIndex = timerIndexByTag(ioTag); uint8_t index = 1; for (unsigned i = 0; i < TIMER_CHANNEL_COUNT; i++) { if (TIMER_HARDWARE[i].tag == ioTag) { @@ -72,11 +71,19 @@ const timerHardware_t *timerGetByTag(ioTag_t ioTag) } } #else - UNUSED(timerIndexByTag); + UNUSED(timerIndex); #endif + return NULL; } +const timerHardware_t *timerGetByTag(ioTag_t ioTag) +{ + uint8_t timerIndex = timerIndexByTag(ioTag); + + return timerGetByTagAndIndex(ioTag, timerIndex); +} + ioTag_t timerioTagGetByUsage(timerUsageFlag_e usageFlag, uint8_t index) { #if !defined(USE_UNIFIED_TARGET) && USABLE_TIMER_CHANNEL_COUNT > 0 diff --git a/unified_targets/configs/OMNIBUSF4.config b/unified_targets/configs/OMNIBUSF4.config new file mode 100644 index 000000000..c960fa226 --- /dev/null +++ b/unified_targets/configs/OMNIBUSF4.config @@ -0,0 +1,111 @@ +# Betaflight / STM32F405 (S405) 4.0.0 Mar 7 2019 / 06:40:55 (fee4ee5e0) MSP API: 1.41 + +board_name OMNIBUSF4 +manufacturer_id AIRB + +# resources +resource BEEPER 1 B04 +resource MOTOR 1 B00 +resource MOTOR 2 B01 +resource MOTOR 3 A03 +resource MOTOR 4 A02 +resource MOTOR 5 A01 +resource MOTOR 6 A08 +resource PPM 1 B14 +resource PWM 1 B14 +resource PWM 2 B15 +resource PWM 3 C06 +resource PWM 4 C07 +resource PWM 5 C08 +resource PWM 6 C09 +resource SONAR_TRIGGER 1 A01 +resource SONAR_ECHO 1 A08 +resource LED_STRIP 1 A01 +resource SERIAL_TX 1 A09 +resource SERIAL_TX 3 B10 +resource SERIAL_TX 6 C06 +resource SERIAL_RX 1 A10 +resource SERIAL_RX 3 B11 +resource SERIAL_RX 6 C07 +resource INVERTER 1 C00 +resource LED 1 B05 +resource SPI_SCK 1 A05 +resource SPI_SCK 3 C10 +resource SPI_MISO 1 A06 +resource SPI_MISO 3 C11 +resource SPI_MOSI 1 A07 +resource SPI_MOSI 3 C12 +resource ADC_BATT 1 C02 +resource ADC_CURR 1 C01 +resource FLASH_CS 1 B03 +resource OSD_CS 1 A15 +resource RX_SPI_CS 1 D02 +resource RX_SPI_EXTI 1 A00 +resource GYRO_EXTI 1 C04 +resource GYRO_CS 1 A04 +resource USB_DETECT 1 C05 + +# timer +timer B14 2 +timer B15 2 +timer C06 1 +timer C07 1 +timer C08 1 +timer C09 1 +timer B00 1 +timer B01 1 +timer A03 0 +timer A02 0 +timer A01 1 +timer A08 0 +timer A09 0 +timer A10 0 + +# dma +dma ADC 2 1 +# ADC 2: DMA2 Stream 3 Channel 1 +dma pin C06 0 +# pin C06: DMA2 Stream 2 Channel 0 +dma pin C07 0 +# pin C07: DMA2 Stream 2 Channel 0 +dma pin C08 0 +# pin C08: DMA2 Stream 2 Channel 0 +dma pin C09 0 +# pin C09: DMA2 Stream 7 Channel 7 +dma pin B00 0 +# pin B00: DMA1 Stream 7 Channel 5 +dma pin B01 0 +# pin B01: DMA1 Stream 2 Channel 5 +dma pin A03 1 +# pin A03: DMA1 Stream 6 Channel 3 +dma pin A02 0 +# pin A02: DMA1 Stream 1 Channel 3 +dma pin A01 0 +# pin A01: DMA1 Stream 4 Channel 6 +dma pin A08 0 +# pin A08: DMA2 Stream 6 Channel 0 +dma pin A09 0 +# pin A09: DMA2 Stream 6 Channel 0 +dma pin A10 0 +# pin A10: DMA2 Stream 6 Channel 0 + +# master +set mag_bustype = I2C +set mag_i2c_device = 2 +set baro_bustype = I2C +set baro_i2c_device = 2 +set rx_spi_bus = 3 +set adc_device = 2 +set current_meter = ADC +set battery_meter = ADC +set beeper_inversion = ON +set beeper_od = OFF +set system_hse_mhz = 8 +set max7456_clock = FULL +set max7456_spi_bus = 3 +set dashboard_i2c_bus = 2 +set flash_spi_bus = 3 +set gyro_1_bustype = SPI +set gyro_1_spibus = 1 +set gyro_1_sensor_align = CW180 +set gyro_2_spibus = 1