From 2e69acbdc4e7b0e10a39a135b8c0304996635874 Mon Sep 17 00:00:00 2001 From: Juan Antonio Date: Sat, 9 Dec 2023 17:06:24 +0100 Subject: [PATCH] Fix aircopy bypassing TX restrictions & refactor And scrapes together a few more bytes. --- app/aircopy.c | 280 ++++++++++++++++++++++++++------------------------ app/aircopy.h | 3 +- app/app.c | 32 +++--- frequencies.c | 2 +- frequencies.h | 4 +- misc.c | 3 - misc.h | 3 - 7 files changed, 164 insertions(+), 163 deletions(-) diff --git a/app/aircopy.c b/app/aircopy.c index a7340aa8e..57134b150 100644 --- a/app/aircopy.c +++ b/app/aircopy.c @@ -28,18 +28,26 @@ #include "ui/inputbox.h" #include "ui/ui.h" -static const uint16_t Obfuscation[8] = {0x6C16, 0xE614, 0x912E, 0x400D, 0x3521, 0x40D5, 0x0313, 0x80E9}; +static const uint16_t Obfuscation[8] = { 0x6C16, 0xE614, 0x912E, 0x400D, 0x3521, 0x40D5, 0x0313, 0x80E9 }; AIRCOPY_State_t gAircopyState; -uint16_t gAirCopyBlockNumber; -uint16_t gErrorsDuringAirCopy; -uint8_t gAirCopyIsSendMode; +uint16_t gAirCopyBlockNumber; +uint16_t gErrorsDuringAirCopy; +uint8_t gAirCopyIsSendMode; -uint16_t g_FSK_Buffer[36]; +uint16_t g_FSK_Buffer[36]; -void AIRCOPY_SendMessage(void) +bool AIRCOPY_SendMessage(void) { - unsigned int i; + static uint8_t gAircopySendCountdown = 1; + + if (gAircopyState != AIRCOPY_TRANSFER) { + return 1; + } + + if (--gAircopySendCountdown) { + return 1; + } g_FSK_Buffer[1] = (gAirCopyBlockNumber & 0x3FF) << 6; @@ -47,11 +55,13 @@ void AIRCOPY_SendMessage(void) g_FSK_Buffer[34] = CRC_Calculate(&g_FSK_Buffer[1], 2 + 64); - for (i = 0; i < 34; i++) + for (unsigned int i = 0; i < 34; i++) { g_FSK_Buffer[i + 1] ^= Obfuscation[i % 8]; + } - if (++gAirCopyBlockNumber >= 0x78) + if (++gAirCopyBlockNumber >= 0x78) { gAircopyState = AIRCOPY_COMPLETE; + } RADIO_SetTxParameters(); @@ -60,170 +70,172 @@ void AIRCOPY_SendMessage(void) BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_PA_ENABLE, false); gAircopySendCountdown = 30; + + return 0; } void AIRCOPY_StorePacket(void) { - uint16_t Status; - - if (gFSKWriteIndex < 36) + if (gFSKWriteIndex < 36) { return; + } gFSKWriteIndex = 0; gUpdateDisplay = true; - Status = BK4819_ReadRegister(BK4819_REG_0B); + uint16_t Status = BK4819_ReadRegister(BK4819_REG_0B); BK4819_PrepareFSKReceive(); // Doc says bit 4 should be 1 = CRC OK, 0 = CRC FAIL, but original firmware checks for FAIL. - if ((Status & 0x0010U) == 0 && g_FSK_Buffer[0] == 0xABCD && g_FSK_Buffer[35] == 0xDCBA) - { - uint16_t CRC; - unsigned int i; - - for (i = 0; i < 34; i++) - g_FSK_Buffer[i + 1] ^= Obfuscation[i % 8]; - - CRC = CRC_Calculate(&g_FSK_Buffer[1], 2 + 64); - if (g_FSK_Buffer[34] == CRC) - { - const uint16_t *pData; - uint16_t Offset; - - Offset = g_FSK_Buffer[1]; - if (Offset < 0x1E00) - { - pData = &g_FSK_Buffer[2]; - for (i = 0; i < 8; i++) - { - EEPROM_WriteBuffer(Offset, pData); - pData += 4; - Offset += 8; - } - - if (Offset == 0x1E00) - gAircopyState = AIRCOPY_COMPLETE; - - gAirCopyBlockNumber++; - - return; - } - } + if ((Status & 0x0010U) != 0 || g_FSK_Buffer[0] != 0xABCD || g_FSK_Buffer[35] != 0xDCBA) { + gErrorsDuringAirCopy++; + return; + } + + for (unsigned int i = 0; i < 34; i++) { + g_FSK_Buffer[i + 1] ^= Obfuscation[i % 8]; } - gErrorsDuringAirCopy++; + + uint16_t CRC = CRC_Calculate(&g_FSK_Buffer[1], 2 + 64); + if (g_FSK_Buffer[34] != CRC) { + gErrorsDuringAirCopy++; + return; + } + + uint16_t Offset = g_FSK_Buffer[1]; + + if (Offset >= 0x1E00) { + gErrorsDuringAirCopy++; + return; + } + + const uint16_t *pData = &g_FSK_Buffer[2]; + for (unsigned int i = 0; i < 8; i++) { + EEPROM_WriteBuffer(Offset, pData); + pData += 4; + Offset += 8; + } + + if (Offset == 0x1E00) { + gAircopyState = AIRCOPY_COMPLETE; + } + + gAirCopyBlockNumber++; } static void AIRCOPY_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) { - if (!bKeyHeld && bKeyPressed) - { - uint32_t Frequency; - unsigned int i; - - INPUTBOX_Append(Key); - gRequestDisplayScreen = DISPLAY_AIRCOPY; - if (gInputBoxIndex < 6) - { - #ifdef ENABLE_VOICE - gAnotherVoiceID = (VOICE_ID_t)Key; - #endif - return; + if (bKeyHeld || !bKeyPressed) { + return; + } + + INPUTBOX_Append(Key); + + gRequestDisplayScreen = DISPLAY_AIRCOPY; + + if (gInputBoxIndex < 6) { +#ifdef ENABLE_VOICE + gAnotherVoiceID = (VOICE_ID_t)Key; +#endif + return; + } + + gInputBoxIndex = 0; + uint32_t Frequency = StrToUL(INPUTBOX_GetAscii()) * 100; + + for (unsigned int i = 0; i < BAND_N_ELEM; i++) { + if (Frequency < frequencyBandTable[i].lower || Frequency >= frequencyBandTable[i].upper) { + continue; } - gInputBoxIndex = 0; - Frequency = StrToUL(INPUTBOX_GetAscii()) * 100; - - for (i = 0; i < BAND_N_ELEM; i++) - { - if (Frequency >= frequencyBandTable[i].lower && Frequency < frequencyBandTable[i].upper) - { - #ifdef ENABLE_VOICE - gAnotherVoiceID = (VOICE_ID_t)Key; - #endif - gRxVfo->Band = i; - Frequency = FREQUENCY_RoundToStep(Frequency, gRxVfo->StepFrequency); - gRxVfo->freq_config_RX.Frequency = Frequency; - gRxVfo->freq_config_TX.Frequency = Frequency; - RADIO_ConfigureSquelchAndOutputPower(gRxVfo); - gCurrentVfo = gRxVfo; - RADIO_SetupRegisters(true); - BK4819_SetupAircopy(); - BK4819_ResetFSK(); - return; - } + if (TX_freq_check(Frequency)) { + continue; } - gRequestDisplayScreen = DISPLAY_AIRCOPY; +#ifdef ENABLE_VOICE + gAnotherVoiceID = (VOICE_ID_t)Key; +#endif + + Frequency = FREQUENCY_RoundToStep(Frequency, gRxVfo->StepFrequency); + gRxVfo->Band = i; + gRxVfo->freq_config_RX.Frequency = Frequency; + gRxVfo->freq_config_TX.Frequency = Frequency; + RADIO_ConfigureSquelchAndOutputPower(gRxVfo); + gCurrentVfo = gRxVfo; + RADIO_SetupRegisters(true); + BK4819_SetupAircopy(); + BK4819_ResetFSK(); + return; } + + gRequestDisplayScreen = DISPLAY_AIRCOPY; } static void AIRCOPY_Key_EXIT(bool bKeyPressed, bool bKeyHeld) { - if (!bKeyHeld && bKeyPressed) - { - if (gInputBoxIndex == 0) - { - gFSKWriteIndex = 0; - gAirCopyBlockNumber = 0; - gErrorsDuringAirCopy = 0; - gInputBoxIndex = 0; - gAirCopyIsSendMode = 0; - - BK4819_PrepareFSKReceive(); - - gAircopyState = AIRCOPY_TRANSFER; - } - else - gInputBox[--gInputBoxIndex] = 10; + if (bKeyHeld || !bKeyPressed) { + return; + } + + if (gInputBoxIndex == 0) { + gFSKWriteIndex = 0; + gAirCopyBlockNumber = 0; + gInputBoxIndex = 0; + gErrorsDuringAirCopy = 0; + gAirCopyIsSendMode = 0; + + BK4819_PrepareFSKReceive(); - gRequestDisplayScreen = DISPLAY_AIRCOPY; + gAircopyState = AIRCOPY_TRANSFER; + } else { + gInputBox[--gInputBoxIndex] = 10; } + + gRequestDisplayScreen = DISPLAY_AIRCOPY; } static void AIRCOPY_Key_MENU(bool bKeyPressed, bool bKeyHeld) { - if (!bKeyHeld && bKeyPressed) - { - gFSKWriteIndex = 0; - gAirCopyBlockNumber = 0; - gInputBoxIndex = 0; - gAirCopyIsSendMode = 1; - g_FSK_Buffer[0] = 0xABCD; - g_FSK_Buffer[1] = 0; - g_FSK_Buffer[35] = 0xDCBA; + if (bKeyHeld || !bKeyPressed) { + return; + } - AIRCOPY_SendMessage(); + gFSKWriteIndex = 0; + gAirCopyBlockNumber = 0; + gInputBoxIndex = 0; + gAirCopyIsSendMode = 1; + g_FSK_Buffer[0] = 0xABCD; + g_FSK_Buffer[1] = 0; + g_FSK_Buffer[35] = 0xDCBA; - GUI_DisplayScreen(); + GUI_DisplayScreen(); - gAircopyState = AIRCOPY_TRANSFER; - } + gAircopyState = AIRCOPY_TRANSFER; } void AIRCOPY_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) { - switch (Key) - { - case KEY_0: - case KEY_1: - case KEY_2: - case KEY_3: - case KEY_4: - case KEY_5: - case KEY_6: - case KEY_7: - case KEY_8: - case KEY_9: - AIRCOPY_Key_DIGITS(Key, bKeyPressed, bKeyHeld); - break; - case KEY_MENU: - AIRCOPY_Key_MENU(bKeyPressed, bKeyHeld); - break; - case KEY_EXIT: - AIRCOPY_Key_EXIT(bKeyPressed, bKeyHeld); - break; - default: - break; + switch (Key) { + case KEY_0: + case KEY_1: + case KEY_2: + case KEY_3: + case KEY_4: + case KEY_5: + case KEY_6: + case KEY_7: + case KEY_8: + case KEY_9: + AIRCOPY_Key_DIGITS(Key, bKeyPressed, bKeyHeld); + break; + case KEY_MENU: + AIRCOPY_Key_MENU(bKeyPressed, bKeyHeld); + break; + case KEY_EXIT: + AIRCOPY_Key_EXIT(bKeyPressed, bKeyHeld); + break; + default: + break; } } diff --git a/app/aircopy.h b/app/aircopy.h index d951290e5..4ea18f945 100644 --- a/app/aircopy.h +++ b/app/aircopy.h @@ -37,11 +37,10 @@ extern uint8_t gAirCopyIsSendMode; extern uint16_t g_FSK_Buffer[36]; -void AIRCOPY_SendMessage(void); +bool AIRCOPY_SendMessage(void); void AIRCOPY_StorePacket(void); void AIRCOPY_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld); #endif #endif - diff --git a/app/app.c b/app/app.c index 2dd3f3b44..413d029e6 100644 --- a/app/app.c +++ b/app/app.c @@ -714,18 +714,19 @@ static void CheckRadioInterrupts(void) BK4819_ToggleGpioOut(BK4819_GPIO6_PIN2_GREEN, false); } - #ifdef ENABLE_AIRCOPY - if (interrupt_status_bits & BK4819_REG_02_FSK_FIFO_ALMOST_FULL && - gScreenToDisplay == DISPLAY_AIRCOPY && - gAircopyState == AIRCOPY_TRANSFER && - gAirCopyIsSendMode == 0) - { - unsigned int i; - for (i = 0; i < 4; i++) - g_FSK_Buffer[gFSKWriteIndex++] = BK4819_ReadRegister(BK4819_REG_5F); - AIRCOPY_StorePacket(); +#ifdef ENABLE_AIRCOPY + if (interrupt_status_bits & BK4819_REG_02_FSK_FIFO_ALMOST_FULL && + gScreenToDisplay == DISPLAY_AIRCOPY && + gAircopyState == AIRCOPY_TRANSFER && + gAirCopyIsSendMode == 0) + { + for (unsigned int i = 0; i < 4; i++) { + g_FSK_Buffer[gFSKWriteIndex++] = BK4819_ReadRegister(BK4819_REG_5F); } - #endif + + AIRCOPY_StorePacket(); + } +#endif } } @@ -1281,13 +1282,8 @@ void APP_TimeSlice10ms(void) #ifdef ENABLE_AIRCOPY if (gScreenToDisplay == DISPLAY_AIRCOPY && gAircopyState == AIRCOPY_TRANSFER && gAirCopyIsSendMode == 1) { - if (gAircopySendCountdown > 0) - { - if (--gAircopySendCountdown == 0) - { - AIRCOPY_SendMessage(); - GUI_DisplayScreen(); - } + if (!AIRCOPY_SendMessage()) { + GUI_DisplayScreen(); } } #endif diff --git a/frequencies.c b/frequencies.c index bbbd4ffb9..d58f22ebe 100644 --- a/frequencies.c +++ b/frequencies.c @@ -223,7 +223,7 @@ int32_t TX_freq_check(const uint32_t Frequency) break; case F_LOCK_NONE: - for (uint8_t i = 0; i < ARRAY_SIZE(frequencyBandTable); i++) + for (uint32_t i = 0; i < ARRAY_SIZE(frequencyBandTable); i++) if (Frequency >= frequencyBandTable[i].lower && Frequency < frequencyBandTable[i].upper) return 0; break; diff --git a/frequencies.h b/frequencies.h index 06955b3e7..3b421bfb5 100644 --- a/frequencies.h +++ b/frequencies.h @@ -84,7 +84,7 @@ uint32_t FREQUENCY_RoundToStep(uint32_t freq, uint16_t step); STEP_Setting_t FREQUENCY_GetStepIdxFromSortedIdx(uint8_t sortedIdx); uint32_t FREQUENCY_GetSortedIdxFromStepIdx(uint8_t step); -int32_t TX_freq_check(const uint32_t Frequency); -int32_t RX_freq_check(const uint32_t Frequency); +int32_t TX_freq_check(uint32_t Frequency); +int32_t RX_freq_check(uint32_t Frequency); #endif diff --git a/misc.c b/misc.c index 24b832f6f..769dffb22 100644 --- a/misc.c +++ b/misc.c @@ -216,9 +216,6 @@ uint8_t gPttDebounceCounter; uint8_t gMenuListCount; uint8_t gBackup_CROSS_BAND_RX_TX; uint8_t gScanDelay_10ms; -#ifdef ENABLE_AIRCOPY - uint8_t gAircopySendCountdown; -#endif uint8_t gFSKWriteIndex; #ifdef ENABLE_NOAA diff --git a/misc.h b/misc.h index b544d769b..7e05ea534 100644 --- a/misc.h +++ b/misc.h @@ -295,9 +295,6 @@ extern uint8_t gPttDebounceCounter; extern uint8_t gMenuListCount; extern uint8_t gBackup_CROSS_BAND_RX_TX; extern uint8_t gScanDelay_10ms; -#ifdef ENABLE_AIRCOPY - extern uint8_t gAircopySendCountdown; -#endif extern uint8_t gFSKWriteIndex; #ifdef ENABLE_NOAA extern bool gIsNoaaMode;