Un-unroll some loops and save a few bytes

This commit is contained in:
Juan Antonio
2023-12-22 18:21:23 +01:00
committed by egzumer
parent 7d982f1f8d
commit bc9bb489e6
3 changed files with 142 additions and 145 deletions

View File

@@ -16,6 +16,7 @@
#include "app/spectrum.h" #include "app/spectrum.h"
#include "am_fix.h" #include "am_fix.h"
#include "audio.h" #include "audio.h"
#include "misc.h"
#ifdef ENABLE_SCAN_RANGES #ifdef ENABLE_SCAN_RANGES
#include "chFrScanner.h" #include "chFrScanner.h"
@@ -37,7 +38,6 @@ struct FrequencyBandInfo {
const uint16_t RSSI_MAX_VALUE = 65535; const uint16_t RSSI_MAX_VALUE = 65535;
static uint16_t R30, R37, R3D, R43, R47, R48, R7E;
static uint32_t initialFreq; static uint32_t initialFreq;
static char String[32]; static char String[32];
@@ -221,24 +221,29 @@ static void ToggleAFBit(bool on) {
BK4819_WriteRegister(BK4819_REG_47, reg); BK4819_WriteRegister(BK4819_REG_47, reg);
} }
static const BK4819_REGISTER_t registers_to_save[] ={
BK4819_REG_30,
BK4819_REG_37,
BK4819_REG_3D,
BK4819_REG_43,
BK4819_REG_47,
BK4819_REG_48,
BK4819_REG_7E,
};
static uint16_t registers_stack [sizeof(registers_to_save)];
static void BackupRegisters() { static void BackupRegisters() {
R30 = BK4819_ReadRegister(BK4819_REG_30); for (uint32_t i = 0; i < ARRAY_SIZE(registers_to_save); i++){
R37 = BK4819_ReadRegister(BK4819_REG_37); registers_stack[i] = BK4819_ReadRegister(registers_to_save[i]);
R3D = BK4819_ReadRegister(BK4819_REG_3D); }
R43 = BK4819_ReadRegister(BK4819_REG_43);
R47 = BK4819_ReadRegister(BK4819_REG_47);
R48 = BK4819_ReadRegister(BK4819_REG_48);
R7E = BK4819_ReadRegister(BK4819_REG_7E);
} }
static void RestoreRegisters() { static void RestoreRegisters() {
BK4819_WriteRegister(BK4819_REG_30, R30);
BK4819_WriteRegister(BK4819_REG_37, R37); for (uint32_t i = 0; i < ARRAY_SIZE(registers_to_save); i++){
BK4819_WriteRegister(BK4819_REG_3D, R3D); BK4819_WriteRegister(registers_to_save[i], registers_stack[i]);
BK4819_WriteRegister(BK4819_REG_43, R43); }
BK4819_WriteRegister(BK4819_REG_47, R47);
BK4819_WriteRegister(BK4819_REG_48, R48);
BK4819_WriteRegister(BK4819_REG_7E, R7E);
} }
static void ToggleAFDAC(bool on) { static void ToggleAFDAC(bool on) {
@@ -490,6 +495,7 @@ static void UpdateScanStep(bool inc) {
} else { } else {
return; return;
} }
settings.frequencyChangeStep = GetBW() >> 1; settings.frequencyChangeStep = GetBW() >> 1;
RelaunchScan(); RelaunchScan();
ResetBlacklist(); ResetBlacklist();

View File

@@ -17,6 +17,7 @@
#ifndef BK4819_REGS_H #ifndef BK4819_REGS_H
#define BK4819_REGS_H #define BK4819_REGS_H
#include <stdint.h>
typedef struct { typedef struct {
const char *name; const char *name;
@@ -387,4 +388,3 @@ enum {
}; };
#endif #endif

View File

@@ -14,7 +14,10 @@
* limitations under the License. * limitations under the License.
*/ */
#include <stdio.h> // NULL #include <stdint.h>
#include <stdio.h>
#include "settings.h"
#include "../audio.h" #include "../audio.h"
#include "../bsp/dp32g030/gpio.h" #include "../bsp/dp32g030/gpio.h"
@@ -605,89 +608,54 @@ void BK4819_SetFilterBandwidth(const BK4819_FilterBandwidth_t Bandwidth, const b
// //
// <1:0> 0 ??? // <1:0> 0 ???
uint16_t val; uint16_t val = 0;
switch (Bandwidth) switch (Bandwidth)
{ {
default: default:
case BK4819_FILTER_BW_WIDE: // 25kHz case BK4819_FILTER_BW_WIDE: // 25kHz
if (weak_no_different) val = (4u << 12) | // *3 RF filter bandwidth
{ // make the RX bandwidth the same with weak signals
val =
(0u << 15) | // 0
(4u << 12) | // *3 RF filter bandwidth
(4u << 9) | // *0 RF filter bandwidth when signal is weak
(6u << 6) | // *0 AFTxLPF2 filter Band Width (6u << 6) | // *0 AFTxLPF2 filter Band Width
(2u << 4) | // 2 BW Mode Selection (2u << 4) | // 2 BW Mode Selection
(1u << 3) | // 1 (1u << 3) | // 1
(0u << 2) | // 0 Gain after FM Demodulation (0u << 2); // 0 Gain after FM Demodulation
(0u << 0); // 0
} if (weak_no_different) {
else // make the RX bandwidth the same with weak signals
{ // with weak RX signals the RX bandwidth is reduced val |= (4u << 9); // *0 RF filter bandwidth when signal is weak
val = // 0x3028); // 0 011 000 000 10 1 0 00 } else {
(0u << 15) | // 0 /// with weak RX signals the RX bandwidth is reduced
(4u << 12) | // *3 RF filter bandwidth val |= (2u << 9); // *0 RF filter bandwidth when signal is weak
(2u << 9) | // *0 RF filter bandwidth when signal is weak
(6u << 6) | // *0 AFTxLPF2 filter Band Width
(2u << 4) | // 2 BW Mode Selection
(1u << 3) | // 1
(0u << 2) | // 0 Gain after FM Demodulation
(0u << 0); // 0
} }
break; break;
case BK4819_FILTER_BW_NARROW: // 12.5kHz case BK4819_FILTER_BW_NARROW: // 12.5kHz
if (weak_no_different) val = (4u << 12) | // *4 RF filter bandwidth
{
val =
(0u << 15) | // 0
(4u << 12) | // *4 RF filter bandwidth
(4u << 9) | // *0 RF filter bandwidth when signal is weak
(0u << 6) | // *1 AFTxLPF2 filter Band Width (0u << 6) | // *1 AFTxLPF2 filter Band Width
(0u << 4) | // 0 BW Mode Selection (0u << 4) | // 0 BW Mode Selection
(1u << 3) | // 1 (1u << 3) | // 1
(0u << 2) | // 0 Gain after FM Demodulation (0u << 2); // 0 Gain after FM Demodulation
(0u << 0); // 0
} if (weak_no_different) {
else val |= (4u << 9); // *0 RF filter bandwidth when signal is weak
{ } else {
val = // 0x4048); // 0 100 000 001 00 1 0 00 val |= (2u << 9);
(0u << 15) | // 0
(4u << 12) | // *4 RF filter bandwidth
(2u << 9) | // *0 RF filter bandwidth when signal is weak
(0u << 6) | // *1 AFTxLPF2 filter Band Width
(0u << 4) | // 0 BW Mode Selection
(1u << 3) | // 1
(0u << 2) | // 0 Gain after FM Demodulation
(0u << 0); // 0
} }
break; break;
case BK4819_FILTER_BW_NARROWER: // 6.25kHz case BK4819_FILTER_BW_NARROWER: // 6.25kHz
if (weak_no_different) val = (3u << 12) | // 3 RF filter bandwidth
{
val =
(0u << 15) | // 0
(3u << 12) | // 3 RF filter bandwidth
(3u << 9) | // *0 RF filter bandwidth when signal is weak (3u << 9) | // *0 RF filter bandwidth when signal is weak
(1u << 6) | // 1 AFTxLPF2 filter Band Width (1u << 6) | // 1 AFTxLPF2 filter Band Width
(1u << 4) | // 1 BW Mode Selection (1u << 4) | // 1 BW Mode Selection
(1u << 3) | // 1 (1u << 3) | // 1
(0u << 2) | // 0 Gain after FM Demodulation (0u << 2); // 0 Gain after FM Demodulation
(0u << 0); // 0
} if (weak_no_different) {
else val |= (3u << 9);
{ } else {
val = val |= (0u << 9); // 0 RF filter bandwidth when signal is weak
(0u << 15) | // 0
(3u << 12) | // 3 RF filter bandwidth
(0u << 9) | // 0 RF filter bandwidth when signal is weak
(1u << 6) | // 1 AFTxLPF2 filter Band Width
(1u << 4) | // 1 BW Mode Selection
(1u << 3) | // 1
(0u << 2) | // 1 Gain after FM Demodulation
(0u << 0); // 0
} }
break; break;
} }
@@ -1266,33 +1234,46 @@ void BK4819_EnableTXLink(void)
void BK4819_PlayDTMF(char Code) void BK4819_PlayDTMF(char Code)
{ {
uint16_t tone1 = 0;
uint16_t tone2 = 0;
struct DTMF_TonePair {
uint16_t tone1;
uint16_t tone2;
};
const struct DTMF_TonePair tones[] = {
{941, 1336},
{697, 1209},
{697, 1336},
{697, 1477},
{770, 1209},
{770, 1336},
{770, 1477},
{852, 1209},
{852, 1336},
{852, 1477},
{697, 1633},
{770, 1633},
{852, 1633},
{941, 1633},
{941, 1209},
{941, 1477},
};
const struct DTMF_TonePair *pSelectedTone = NULL;
switch (Code) switch (Code)
{ {
case '0': tone1 = 941; tone2 = 1336; break; case '0'...'9': pSelectedTone = &tones[0 + Code - '0']; break;
case '1': tone1 = 697; tone2 = 1209; break; case 'A'...'D': pSelectedTone = &tones[10 + Code - 'A']; break;
case '2': tone1 = 697; tone2 = 1336; break; case '*': pSelectedTone = &tones[14]; break;
case '3': tone1 = 697; tone2 = 1477; break; case '#': pSelectedTone = &tones[15]; break;
case '4': tone1 = 770; tone2 = 1209; break; default: pSelectedTone = NULL;
case '5': tone1 = 770; tone2 = 1336; break;
case '6': tone1 = 770; tone2 = 1477; break;
case '7': tone1 = 852; tone2 = 1209; break;
case '8': tone1 = 852; tone2 = 1336; break;
case '9': tone1 = 852; tone2 = 1477; break;
case 'A': tone1 = 697; tone2 = 1633; break;
case 'B': tone1 = 770; tone2 = 1633; break;
case 'C': tone1 = 852; tone2 = 1633; break;
case 'D': tone1 = 941; tone2 = 1633; break;
case '*': tone1 = 941; tone2 = 1209; break;
case '#': tone1 = 941; tone2 = 1477; break;
} }
if (tone1 > 0) if (pSelectedTone) {
BK4819_WriteRegister(BK4819_REG_71, (((uint32_t)tone1 * 103244) + 5000) / 10000); // with rounding BK4819_WriteRegister(BK4819_REG_71, (((uint32_t)pSelectedTone->tone1 * 103244) + 5000) / 10000); // with rounding
if (tone2 > 0) BK4819_WriteRegister(BK4819_REG_72, (((uint32_t)pSelectedTone->tone2 * 103244) + 5000) / 10000); // with rounding
BK4819_WriteRegister(BK4819_REG_72, (((uint32_t)tone2 * 103244) + 5000) / 10000); // with rounding }
} }
void BK4819_PlayDTMFString(const char *pString, bool bDelayFirst, uint16_t FirstCodePersistTime, uint16_t HashCodePersistTime, uint16_t CodePersistTime, uint16_t CodeInternalTime) void BK4819_PlayDTMFString(const char *pString, bool bDelayFirst, uint16_t FirstCodePersistTime, uint16_t HashCodePersistTime, uint16_t CodePersistTime, uint16_t CodeInternalTime)
@@ -1707,7 +1688,7 @@ void BK4819_PrepareFSKReceive(void)
BK4819_WriteRegister(BK4819_REG_59, 0x3068); BK4819_WriteRegister(BK4819_REG_59, 0x3068);
} }
void BK4819_PlayRoger(void) void BK4819_PlayRogerNormal(void)
{ {
#if 0 #if 0
const uint32_t tone1_Hz = 500; const uint32_t tone1_Hz = 500;
@@ -1744,28 +1725,38 @@ void BK4819_PlayRoger(void)
void BK4819_PlayRogerMDC(void) void BK4819_PlayRogerMDC(void)
{ {
unsigned int i; struct reg_value {
BK4819_REGISTER_t reg;
uint16_t value;
};
BK4819_SetAF(BK4819_AF_MUTE); struct reg_value RogerMDC_Configuration [] = {
{ BK4819_REG_58, 0x37C3 }, // FSK Enable,
BK4819_WriteRegister(BK4819_REG_58, 0x37C3); // FSK Enable,
// RX Bandwidth FFSK 1200/1800 // RX Bandwidth FFSK 1200/1800
// 0xAA or 0x55 Preamble // 0xAA or 0x55 Preamble
// 11 RX Gain, // 11 RX Gain,
// 101 RX Mode // 101 RX Mode
// TX FFSK 1200/1800 // TX FFSK 1200/1800
BK4819_WriteRegister(BK4819_REG_72, 0x3065); // Set Tone-2 to 1200Hz { BK4819_REG_72, 0x3065 }, // Set Tone-2 to 1200Hz
BK4819_WriteRegister(BK4819_REG_70, 0x00E0); // Enable Tone-2 and Set Tone2 Gain { BK4819_REG_70, 0x00E0 }, // Enable Tone-2 and Set Tone2 Gain
BK4819_WriteRegister(BK4819_REG_5D, 0x0D00); // Set FSK data length to 13 bytes { BK4819_REG_5D, 0x0D00 }, // Set FSK data length to 13 bytes
BK4819_WriteRegister(BK4819_REG_59, 0x8068); // 4 byte sync length, 6 byte preamble, clear TX FIFO { BK4819_REG_59, 0x8068 }, // 4 byte sync length, 6 byte preamble, clear TX FIFO
BK4819_WriteRegister(BK4819_REG_59, 0x0068); // Same, but clear TX FIFO is now unset (clearing done) { BK4819_REG_59, 0x0068 }, // Same, but clear TX FIFO is now unset (clearing done)
BK4819_WriteRegister(BK4819_REG_5A, 0x5555); // First two sync bytes { BK4819_REG_5A, 0x5555 }, // First two sync bytes
BK4819_WriteRegister(BK4819_REG_5B, 0x55AA); // End of sync bytes. Total 4 bytes: 555555aa { BK4819_REG_5B, 0x55AA }, // End of sync bytes. Total 4 bytes: 555555aa
BK4819_WriteRegister(BK4819_REG_5C, 0xAA30); // Disable CRC { BK4819_REG_5C, 0xAA30 }, // Disable CRC
};
BK4819_SetAF(BK4819_AF_MUTE);
for (unsigned int i = 0; i < ARRAY_SIZE(RogerMDC_Configuration); i++) {
BK4819_WriteRegister(RogerMDC_Configuration[i].reg, RogerMDC_Configuration[i].value);
}
// Send the data from the roger table // Send the data from the roger table
for (i = 0; i < 7; i++) for (unsigned int i = 0; i < ARRAY_SIZE(FSK_RogerTable); i++) {
BK4819_WriteRegister(BK4819_REG_5F, FSK_RogerTable[i]); BK4819_WriteRegister(BK4819_REG_5F, FSK_RogerTable[i]);
}
SYSTEM_DelayMs(20); SYSTEM_DelayMs(20);