Merge branch 'UNLEASHED' into 420

This commit is contained in:
RogueMaster
2022-10-26 18:41:50 -04:00
17 changed files with 328 additions and 262 deletions

View File

@@ -102,8 +102,8 @@ static bool subghz_tx(SubGhz* subghz, uint32_t frequency) {
furi_assert(subghz->txrx->txrx_state != SubGhzTxRxStateSleep); furi_assert(subghz->txrx->txrx_state != SubGhzTxRxStateSleep);
furi_hal_subghz_idle(); furi_hal_subghz_idle();
furi_hal_subghz_set_frequency_and_path(frequency); furi_hal_subghz_set_frequency_and_path(frequency);
furi_hal_gpio_write(&gpio_cc1101_g0, false);
furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow); furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow);
furi_hal_gpio_write(&gpio_cc1101_g0, true);
bool ret = furi_hal_subghz_tx(); bool ret = furi_hal_subghz_tx();
subghz->txrx->txrx_state = SubGhzTxRxStateTx; subghz->txrx->txrx_state = SubGhzTxRxStateTx;
return ret; return ret;

View File

@@ -20,12 +20,12 @@
#define MAX_HISTORY 4 #define MAX_HISTORY 4
static const uint32_t subghz_frequency_list[] = { static const uint32_t subghz_frequency_list[] = {
300000000, 302757000, 303875000, 304250000, 307000000, 307500000, 307800000, 300000000, 302757000, 303875000, 304250000, 307000000, 307500000, 307800000, 309000000,
309000000, 310000000, 312000000, 312100000, 313000000, 313850000, 314000000, 310000000, 312000000, 312100000, 313000000, 313850000, 314000000, 314350000, 315000000,
314350000, 315000000, 318000000, 345000000, 348000000, 387000000, 390000000, 318000000, 330000000, 345000000, 348000000, 387000000, 390000000, 418000000, 433075000,
418000000, 433075000, 433220000, 433420000, 433657070, 433889000, 433920000, 433220000, 433420000, 433657070, 433889000, 433920000, 434176948, 434420000, 434775000,
434176948, 434420000, 434775000, 438900000, 464000000, 779000000, 868350000, 438900000, 464000000, 779000000, 868350000, 868400000, 868800000, 868950000, 906400000,
868400000, 868950000, 906400000, 915000000, 925000000, 928000000}; 915000000, 925000000, 928000000};
typedef enum { typedef enum {
SubGhzFrequencyAnalyzerStatusIDLE, SubGhzFrequencyAnalyzerStatusIDLE,

View File

@@ -626,9 +626,10 @@ static bool unirfremix_send_sub(UniRFRemix* app, FlipperFormat* fff_data) {
furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeInput, GpioPullNo, GpioSpeedLow); furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeInput, GpioPullNo, GpioSpeedLow);
furi_hal_subghz_idle(); furi_hal_subghz_idle();
furi_hal_subghz_set_frequency_and_path(app->txpreset->frequency); furi_hal_subghz_set_frequency_and_path(app->txpreset->frequency);
furi_hal_gpio_write(&gpio_cc1101_g0, false);
furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow); furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow);
furi_hal_gpio_write(&gpio_cc1101_g0, true);
if(!furi_hal_subghz_tx()) { if(!furi_hal_subghz_tx()) {
FURI_LOG_E(TAG, "Sending not allowed"); FURI_LOG_E(TAG, "Sending not allowed");

View File

@@ -27,6 +27,7 @@ Frequency: 314000000
Frequency: 314350000 Frequency: 314350000
Frequency: 315000000 Frequency: 315000000
Frequency: 318000000 Frequency: 318000000
Frequency: 330000000
Frequency: 345000000 Frequency: 345000000
Frequency: 348000000 Frequency: 348000000
Frequency: 387000000 Frequency: 387000000

View File

@@ -2332,21 +2332,22 @@ Function,-,subghz_keystore_raw_get_data,_Bool,"const char*, size_t, uint8_t*, si
Function,-,subghz_keystore_save,_Bool,"SubGhzKeystore*, const char*, uint8_t*" Function,-,subghz_keystore_save,_Bool,"SubGhzKeystore*, const char*, uint8_t*"
Function,+,subghz_protocol_blocks_add_bit,void,"SubGhzBlockDecoder*, uint8_t" Function,+,subghz_protocol_blocks_add_bit,void,"SubGhzBlockDecoder*, uint8_t"
Function,+,subghz_protocol_blocks_add_bytes,uint8_t,"const uint8_t[], size_t" Function,+,subghz_protocol_blocks_add_bytes,uint8_t,"const uint8_t[], size_t"
Function,+,subghz_protocol_blocks_crc16,uint16_t,"const uint8_t[], unsigned, uint16_t, uint16_t" Function,+,subghz_protocol_blocks_add_to_128_bit,void,"SubGhzBlockDecoder*, uint8_t, uint64_t*"
Function,+,subghz_protocol_blocks_crc16lsb,uint16_t,"const uint8_t[], unsigned, uint16_t, uint16_t" Function,+,subghz_protocol_blocks_crc16,uint16_t,"const uint8_t[], size_t, uint16_t, uint16_t"
Function,+,subghz_protocol_blocks_crc4,uint8_t,"const uint8_t[], unsigned, uint8_t, uint8_t" Function,+,subghz_protocol_blocks_crc16lsb,uint16_t,"const uint8_t[], size_t, uint16_t, uint16_t"
Function,+,subghz_protocol_blocks_crc7,uint8_t,"const uint8_t[], unsigned, uint8_t, uint8_t" Function,+,subghz_protocol_blocks_crc4,uint8_t,"const uint8_t[], size_t, uint8_t, uint8_t"
Function,+,subghz_protocol_blocks_crc8,uint8_t,"const uint8_t[], unsigned, uint8_t, uint8_t" Function,+,subghz_protocol_blocks_crc7,uint8_t,"const uint8_t[], size_t, uint8_t, uint8_t"
Function,+,subghz_protocol_blocks_crc8le,uint8_t,"const uint8_t[], unsigned, uint8_t, uint8_t" Function,+,subghz_protocol_blocks_crc8,uint8_t,"const uint8_t[], size_t, uint8_t, uint8_t"
Function,+,subghz_protocol_blocks_crc8le,uint8_t,"const uint8_t[], size_t, uint8_t, uint8_t"
Function,+,subghz_protocol_blocks_get_bit_array,_Bool,"uint8_t[], size_t" Function,+,subghz_protocol_blocks_get_bit_array,_Bool,"uint8_t[], size_t"
Function,+,subghz_protocol_blocks_get_hash_data,uint8_t,"SubGhzBlockDecoder*, size_t" Function,+,subghz_protocol_blocks_get_hash_data,uint8_t,"SubGhzBlockDecoder*, size_t"
Function,+,subghz_protocol_blocks_get_parity,uint8_t,"uint64_t, uint8_t" Function,+,subghz_protocol_blocks_get_parity,uint8_t,"uint64_t, uint8_t"
Function,+,subghz_protocol_blocks_get_upload,size_t,"uint8_t[], size_t, LevelDuration*, size_t, uint32_t" Function,+,subghz_protocol_blocks_get_upload,size_t,"uint8_t[], size_t, LevelDuration*, size_t, uint32_t"
Function,+,subghz_protocol_blocks_lfsr_digest16,uint16_t,"const uint8_t[], unsigned, uint16_t, uint16_t" Function,+,subghz_protocol_blocks_lfsr_digest16,uint16_t,"const uint8_t[], size_t, uint16_t, uint16_t"
Function,+,subghz_protocol_blocks_lfsr_digest8,uint8_t,"const uint8_t[], unsigned, uint8_t, uint8_t" Function,+,subghz_protocol_blocks_lfsr_digest8,uint8_t,"const uint8_t[], size_t, uint8_t, uint8_t"
Function,+,subghz_protocol_blocks_lfsr_digest8_reflect,uint8_t,"const uint8_t[], int, uint8_t, uint8_t" Function,+,subghz_protocol_blocks_lfsr_digest8_reflect,uint8_t,"const uint8_t[], size_t, uint8_t, uint8_t"
Function,+,subghz_protocol_blocks_parity8,int,uint8_t Function,+,subghz_protocol_blocks_parity8,uint8_t,uint8_t
Function,+,subghz_protocol_blocks_parity_bytes,int,"const uint8_t[], size_t" Function,+,subghz_protocol_blocks_parity_bytes,uint8_t,"const uint8_t[], size_t"
Function,+,subghz_protocol_blocks_reverse_key,uint64_t,"uint64_t, uint8_t" Function,+,subghz_protocol_blocks_reverse_key,uint64_t,"uint64_t, uint8_t"
Function,+,subghz_protocol_blocks_set_bit_array,void,"_Bool, uint8_t[], size_t, size_t" Function,+,subghz_protocol_blocks_set_bit_array,void,"_Bool, uint8_t[], size_t, size_t"
Function,+,subghz_protocol_blocks_xor_bytes,uint8_t,"const uint8_t[], size_t" Function,+,subghz_protocol_blocks_xor_bytes,uint8_t,"const uint8_t[], size_t"
1 entry status name type params
2332 Function - subghz_keystore_save _Bool SubGhzKeystore*, const char*, uint8_t*
2333 Function + subghz_protocol_blocks_add_bit void SubGhzBlockDecoder*, uint8_t
2334 Function + subghz_protocol_blocks_add_bytes uint8_t const uint8_t[], size_t
2335 Function + subghz_protocol_blocks_crc16 subghz_protocol_blocks_add_to_128_bit uint16_t void const uint8_t[], unsigned, uint16_t, uint16_t SubGhzBlockDecoder*, uint8_t, uint64_t*
2336 Function + subghz_protocol_blocks_crc16lsb subghz_protocol_blocks_crc16 uint16_t const uint8_t[], unsigned, uint16_t, uint16_t const uint8_t[], size_t, uint16_t, uint16_t
2337 Function + subghz_protocol_blocks_crc4 subghz_protocol_blocks_crc16lsb uint8_t uint16_t const uint8_t[], unsigned, uint8_t, uint8_t const uint8_t[], size_t, uint16_t, uint16_t
2338 Function + subghz_protocol_blocks_crc7 subghz_protocol_blocks_crc4 uint8_t const uint8_t[], unsigned, uint8_t, uint8_t const uint8_t[], size_t, uint8_t, uint8_t
2339 Function + subghz_protocol_blocks_crc8 subghz_protocol_blocks_crc7 uint8_t const uint8_t[], unsigned, uint8_t, uint8_t const uint8_t[], size_t, uint8_t, uint8_t
2340 Function + subghz_protocol_blocks_crc8le subghz_protocol_blocks_crc8 uint8_t const uint8_t[], unsigned, uint8_t, uint8_t const uint8_t[], size_t, uint8_t, uint8_t
2341 Function + subghz_protocol_blocks_crc8le uint8_t const uint8_t[], size_t, uint8_t, uint8_t
2342 Function + subghz_protocol_blocks_get_bit_array _Bool uint8_t[], size_t
2343 Function + subghz_protocol_blocks_get_hash_data uint8_t SubGhzBlockDecoder*, size_t
2344 Function + subghz_protocol_blocks_get_parity uint8_t uint64_t, uint8_t
2345 Function + subghz_protocol_blocks_get_upload size_t uint8_t[], size_t, LevelDuration*, size_t, uint32_t
2346 Function + subghz_protocol_blocks_lfsr_digest16 uint16_t const uint8_t[], unsigned, uint16_t, uint16_t const uint8_t[], size_t, uint16_t, uint16_t
2347 Function + subghz_protocol_blocks_lfsr_digest8 uint8_t const uint8_t[], unsigned, uint8_t, uint8_t const uint8_t[], size_t, uint8_t, uint8_t
2348 Function + subghz_protocol_blocks_lfsr_digest8_reflect uint8_t const uint8_t[], int, uint8_t, uint8_t const uint8_t[], size_t, uint8_t, uint8_t
2349 Function + subghz_protocol_blocks_parity8 int uint8_t uint8_t
2350 Function + subghz_protocol_blocks_parity_bytes int uint8_t const uint8_t[], size_t
2351 Function + subghz_protocol_blocks_reverse_key uint64_t uint64_t, uint8_t
2352 Function + subghz_protocol_blocks_set_bit_array void _Bool, uint8_t[], size_t, size_t
2353 Function + subghz_protocol_blocks_xor_bytes uint8_t const uint8_t[], size_t

0
firmware/targets/f7/ble_glue/dev_info_service.c Executable file → Normal file
View File

View File

@@ -36,5 +36,6 @@ bool furi_hal_cortex_timer_is_expired(FuriHalCortexTimer cortex_timer) {
} }
void furi_hal_cortex_timer_wait(FuriHalCortexTimer cortex_timer) { void furi_hal_cortex_timer_wait(FuriHalCortexTimer cortex_timer) {
while(!furi_hal_cortex_timer_is_expired(cortex_timer)); while(!furi_hal_cortex_timer_is_expired(cortex_timer))
;
} }

View File

@@ -111,7 +111,7 @@ bool furi_hal_nfc_is_busy();
* *
* @return true if initialized * @return true if initialized
*/ */
bool furi_hal_nfc_is_init(); bool furi_hal_nfc_is_init();
/** NFC field on /** NFC field on
*/ */
@@ -234,7 +234,6 @@ void furi_hal_nfc_sleep();
void furi_hal_nfc_stop(); void furi_hal_nfc_stop();
/* Low level transport API, use it to implement your own transport layers */ /* Low level transport API, use it to implement your own transport layers */
#define furi_hal_nfc_ll_ms2fc rfalConvMsTo1fc #define furi_hal_nfc_ll_ms2fc rfalConvMsTo1fc
@@ -250,7 +249,8 @@ typedef enum {
FuriHalNfcReturnBusy = 2, /*!< device or resource busy */ FuriHalNfcReturnBusy = 2, /*!< device or resource busy */
FuriHalNfcReturnIo = 3, /*!< generic IO error */ FuriHalNfcReturnIo = 3, /*!< generic IO error */
FuriHalNfcReturnTimeout = 4, /*!< error due to timeout */ FuriHalNfcReturnTimeout = 4, /*!< error due to timeout */
FuriHalNfcReturnRequest = 5, /*!< invalid request or requested function can't be executed at the moment */ FuriHalNfcReturnRequest =
5, /*!< invalid request or requested function can't be executed at the moment */
FuriHalNfcReturnNomsg = 6, /*!< No message of desired type */ FuriHalNfcReturnNomsg = 6, /*!< No message of desired type */
FuriHalNfcReturnParam = 7, /*!< Parameter error */ FuriHalNfcReturnParam = 7, /*!< Parameter error */
FuriHalNfcReturnSystem = 8, /*!< System error */ FuriHalNfcReturnSystem = 8, /*!< System error */
@@ -261,20 +261,23 @@ typedef enum {
FuriHalNfcReturnAgain = 13, /*!< Call again */ FuriHalNfcReturnAgain = 13, /*!< Call again */
FuriHalNfcReturnMemCorrupt = 14, /*!< memory corruption */ FuriHalNfcReturnMemCorrupt = 14, /*!< memory corruption */
FuriHalNfcReturnNotImplemented = 15, /*!< not implemented */ FuriHalNfcReturnNotImplemented = 15, /*!< not implemented */
FuriHalNfcReturnPcCorrupt = 16, /*!< Program Counter has been manipulated or spike/noise trigger illegal operation */ FuriHalNfcReturnPcCorrupt =
16, /*!< Program Counter has been manipulated or spike/noise trigger illegal operation */
FuriHalNfcReturnSend = 17, /*!< error sending*/ FuriHalNfcReturnSend = 17, /*!< error sending*/
FuriHalNfcReturnIgnore = 18, /*!< indicates error detected but to be ignored */ FuriHalNfcReturnIgnore = 18, /*!< indicates error detected but to be ignored */
FuriHalNfcReturnSemantic = 19, /*!< indicates error in state machine (unexpected cmd) */ FuriHalNfcReturnSemantic = 19, /*!< indicates error in state machine (unexpected cmd) */
FuriHalNfcReturnSyntax = 20, /*!< indicates error in state machine (unknown cmd) */ FuriHalNfcReturnSyntax = 20, /*!< indicates error in state machine (unknown cmd) */
FuriHalNfcReturnCrc = 21, /*!< crc error */ FuriHalNfcReturnCrc = 21, /*!< crc error */
FuriHalNfcReturnNotfound = 22, /*!< transponder not found */ FuriHalNfcReturnNotfound = 22, /*!< transponder not found */
FuriHalNfcReturnNotunique = 23, /*!< transponder not unique - more than one transponder in field */ FuriHalNfcReturnNotunique =
23, /*!< transponder not unique - more than one transponder in field */
FuriHalNfcReturnNotsupp = 24, /*!< requested operation not supported */ FuriHalNfcReturnNotsupp = 24, /*!< requested operation not supported */
FuriHalNfcReturnWrite = 25, /*!< write error */ FuriHalNfcReturnWrite = 25, /*!< write error */
FuriHalNfcReturnFifo = 26, /*!< fifo over or underflow error */ FuriHalNfcReturnFifo = 26, /*!< fifo over or underflow error */
FuriHalNfcReturnPar = 27, /*!< parity error */ FuriHalNfcReturnPar = 27, /*!< parity error */
FuriHalNfcReturnDone = 28, /*!< transfer has already finished */ FuriHalNfcReturnDone = 28, /*!< transfer has already finished */
FuriHalNfcReturnRfCollision = 29, /*!< collision error (Bit Collision or during RF Collision avoidance ) */ FuriHalNfcReturnRfCollision =
29, /*!< collision error (Bit Collision or during RF Collision avoidance ) */
FuriHalNfcReturnHwOverrun = 30, /*!< lost one or more received bytes */ FuriHalNfcReturnHwOverrun = 30, /*!< lost one or more received bytes */
FuriHalNfcReturnReleaseReq = 31, /*!< device requested release */ FuriHalNfcReturnReleaseReq = 31, /*!< device requested release */
FuriHalNfcReturnSleepReq = 32, /*!< device requested sleep */ FuriHalNfcReturnSleepReq = 32, /*!< device requested sleep */
@@ -282,7 +285,8 @@ typedef enum {
FuriHalNfcReturnMaxReruns = 34, /*!< blocking procedure reached maximum runs */ FuriHalNfcReturnMaxReruns = 34, /*!< blocking procedure reached maximum runs */
FuriHalNfcReturnDisabled = 35, /*!< operation aborted due to disabled configuration */ FuriHalNfcReturnDisabled = 35, /*!< operation aborted due to disabled configuration */
FuriHalNfcReturnHwMismatch = 36, /*!< expected hw do not match */ FuriHalNfcReturnHwMismatch = 36, /*!< expected hw do not match */
FuriHalNfcReturnLinkLoss = 37, /*!< Other device's field didn't behave as expected: turned off by Initiator in Passive mode, or AP2P did not turn on field */ FuriHalNfcReturnLinkLoss =
37, /*!< Other device's field didn't behave as expected: turned off by Initiator in Passive mode, or AP2P did not turn on field */
FuriHalNfcReturnInvalidHandle = 38, /*!< invalid or not initalized device handle */ FuriHalNfcReturnInvalidHandle = 38, /*!< invalid or not initalized device handle */
FuriHalNfcReturnIncompleteByte = 40, /*!< Incomplete byte rcvd */ FuriHalNfcReturnIncompleteByte = 40, /*!< Incomplete byte rcvd */
FuriHalNfcReturnIncompleteByte01 = 41, /*!< Incomplete byte rcvd - 1 bit */ FuriHalNfcReturnIncompleteByte01 = 41, /*!< Incomplete byte rcvd - 1 bit */
@@ -295,38 +299,40 @@ typedef enum {
} FuriHalNfcReturn; } FuriHalNfcReturn;
typedef enum { typedef enum {
FuriHalNfcModeNone = 0, /*!< No mode selected/defined */ FuriHalNfcModeNone = 0, /*!< No mode selected/defined */
FuriHalNfcModePollNfca = 1, /*!< Mode to perform as NFCA (ISO14443A) Poller (PCD) */ FuriHalNfcModePollNfca = 1, /*!< Mode to perform as NFCA (ISO14443A) Poller (PCD) */
FuriHalNfcModePollNfcaT1t = 2, /*!< Mode to perform as NFCA T1T (Topaz) Poller (PCD) */ FuriHalNfcModePollNfcaT1t = 2, /*!< Mode to perform as NFCA T1T (Topaz) Poller (PCD) */
FuriHalNfcModePollNfcb = 3, /*!< Mode to perform as NFCB (ISO14443B) Poller (PCD) */ FuriHalNfcModePollNfcb = 3, /*!< Mode to perform as NFCB (ISO14443B) Poller (PCD) */
FuriHalNfcModePollBPrime = 4, /*!< Mode to perform as B' Calypso (Innovatron) (PCD) */ FuriHalNfcModePollBPrime = 4, /*!< Mode to perform as B' Calypso (Innovatron) (PCD) */
FuriHalNfcModePollBCts = 5, /*!< Mode to perform as CTS Poller (PCD) */ FuriHalNfcModePollBCts = 5, /*!< Mode to perform as CTS Poller (PCD) */
FuriHalNfcModePollNfcf = 6, /*!< Mode to perform as NFCF (FeliCa) Poller (PCD) */ FuriHalNfcModePollNfcf = 6, /*!< Mode to perform as NFCF (FeliCa) Poller (PCD) */
FuriHalNfcModePollNfcv = 7, /*!< Mode to perform as NFCV (ISO15963) Poller (PCD) */ FuriHalNfcModePollNfcv = 7, /*!< Mode to perform as NFCV (ISO15963) Poller (PCD) */
FuriHalNfcModePollPicopass = 8, /*!< Mode to perform as PicoPass / iClass Poller (PCD) */ FuriHalNfcModePollPicopass = 8, /*!< Mode to perform as PicoPass / iClass Poller (PCD) */
FuriHalNfcModePollActiveP2p = 9, /*!< Mode to perform as Active P2P (ISO18092) Initiator */ FuriHalNfcModePollActiveP2p = 9, /*!< Mode to perform as Active P2P (ISO18092) Initiator */
FuriHalNfcModeListenNfca = 10, /*!< Mode to perform as NFCA (ISO14443A) Listener (PICC) */ FuriHalNfcModeListenNfca = 10, /*!< Mode to perform as NFCA (ISO14443A) Listener (PICC) */
FuriHalNfcModeListenNfcb = 11, /*!< Mode to perform as NFCA (ISO14443B) Listener (PICC) */ FuriHalNfcModeListenNfcb = 11, /*!< Mode to perform as NFCA (ISO14443B) Listener (PICC) */
FuriHalNfcModeListenNfcf = 12, /*!< Mode to perform as NFCA (ISO15963) Listener (PICC) */ FuriHalNfcModeListenNfcf = 12, /*!< Mode to perform as NFCA (ISO15963) Listener (PICC) */
FuriHalNfcModeListenActiveP2p = 13 /*!< Mode to perform as Active P2P (ISO18092) Target */ FuriHalNfcModeListenActiveP2p = 13 /*!< Mode to perform as Active P2P (ISO18092) Target */
} FuriHalNfcMode; } FuriHalNfcMode;
typedef enum { typedef enum {
FuriHalNfcBitrate106 = 0, /*!< Bit Rate 106 kbit/s (fc/128) */ FuriHalNfcBitrate106 = 0, /*!< Bit Rate 106 kbit/s (fc/128) */
FuriHalNfcBitrate212 = 1, /*!< Bit Rate 212 kbit/s (fc/64) */ FuriHalNfcBitrate212 = 1, /*!< Bit Rate 212 kbit/s (fc/64) */
FuriHalNfcBitrate424 = 2, /*!< Bit Rate 424 kbit/s (fc/32) */ FuriHalNfcBitrate424 = 2, /*!< Bit Rate 424 kbit/s (fc/32) */
FuriHalNfcBitrate848 = 3, /*!< Bit Rate 848 kbit/s (fc/16) */ FuriHalNfcBitrate848 = 3, /*!< Bit Rate 848 kbit/s (fc/16) */
FuriHalNfcBitrate1695 = 4, /*!< Bit Rate 1695 kbit/s (fc/8) */ FuriHalNfcBitrate1695 = 4, /*!< Bit Rate 1695 kbit/s (fc/8) */
FuriHalNfcBitrate3390 = 5, /*!< Bit Rate 3390 kbit/s (fc/4) */ FuriHalNfcBitrate3390 = 5, /*!< Bit Rate 3390 kbit/s (fc/4) */
FuriHalNfcBitrate6780 = 6, /*!< Bit Rate 6780 kbit/s (fc/2) */ FuriHalNfcBitrate6780 = 6, /*!< Bit Rate 6780 kbit/s (fc/2) */
FuriHalNfcBitrate13560 = 7, /*!< Bit Rate 13560 kbit/s (fc) */ FuriHalNfcBitrate13560 = 7, /*!< Bit Rate 13560 kbit/s (fc) */
FuriHalNfcBitrate52p97 = 0xEB, /*!< Bit Rate 52.97 kbit/s (fc/256) Fast Mode VICC->VCD */ FuriHalNfcBitrate52p97 = 0xEB, /*!< Bit Rate 52.97 kbit/s (fc/256) Fast Mode VICC->VCD */
FuriHalNfcBitrate26p48 = 0xEC, /*!< Bit Rate 26,48 kbit/s (fc/512) NFCV VICC->VCD & VCD->VICC 1of4 */ FuriHalNfcBitrate26p48 =
FuriHalNfcBitrate1p66 = 0xED, /*!< Bit Rate 1,66 kbit/s (fc/8192) NFCV VCD->VICC 1of256 */ 0xEC, /*!< Bit Rate 26,48 kbit/s (fc/512) NFCV VICC->VCD & VCD->VICC 1of4 */
FuriHalNfcBitrateKeep = 0xFF /*!< Value indicating to keep the same previous bit rate */ FuriHalNfcBitrate1p66 = 0xED, /*!< Bit Rate 1,66 kbit/s (fc/8192) NFCV VCD->VICC 1of256 */
FuriHalNfcBitrateKeep = 0xFF /*!< Value indicating to keep the same previous bit rate */
} FuriHalNfcBitrate; } FuriHalNfcBitrate;
FuriHalNfcReturn furi_hal_nfc_ll_set_mode(FuriHalNfcMode mode, FuriHalNfcBitrate txBR, FuriHalNfcBitrate rxBR); FuriHalNfcReturn
furi_hal_nfc_ll_set_mode(FuriHalNfcMode mode, FuriHalNfcBitrate txBR, FuriHalNfcBitrate rxBR);
#define FURI_HAL_NFC_LL_GT_NFCA furi_hal_nfc_ll_ms2fc(5U) /*!< GTA Digital 2.0 6.10.4.1 & B.2 */ #define FURI_HAL_NFC_LL_GT_NFCA furi_hal_nfc_ll_ms2fc(5U) /*!< GTA Digital 2.0 6.10.4.1 & B.2 */
#define FURI_HAL_NFC_LL_GT_NFCB furi_hal_nfc_ll_ms2fc(5U) /*!< GTB Digital 2.0 7.9.4.1 & B.3 */ #define FURI_HAL_NFC_LL_GT_NFCB furi_hal_nfc_ll_ms2fc(5U) /*!< GTB Digital 2.0 7.9.4.1 & B.3 */
@@ -334,40 +340,57 @@ FuriHalNfcReturn furi_hal_nfc_ll_set_mode(FuriHalNfcMode mode, FuriHalNfcBitrate
#define FURI_HAL_NFC_LL_GT_NFCV furi_hal_nfc_ll_ms2fc(5U) /*!< GTV Digital 2.0 9.7.5.1 & B.5 */ #define FURI_HAL_NFC_LL_GT_NFCV furi_hal_nfc_ll_ms2fc(5U) /*!< GTV Digital 2.0 9.7.5.1 & B.5 */
#define FURI_HAL_NFC_LL_GT_PICOPASS furi_hal_nfc_ll_ms2fc(1U) /*!< GT Picopass */ #define FURI_HAL_NFC_LL_GT_PICOPASS furi_hal_nfc_ll_ms2fc(1U) /*!< GT Picopass */
#define FURI_HAL_NFC_LL_GT_AP2P furi_hal_nfc_ll_ms2fc(5U) /*!< TIRFG Ecma 340 11.1.1 */ #define FURI_HAL_NFC_LL_GT_AP2P furi_hal_nfc_ll_ms2fc(5U) /*!< TIRFG Ecma 340 11.1.1 */
#define FURI_HAL_NFC_LL_GT_AP2P_ADJUSTED furi_hal_nfc_ll_ms2fc(5U + 25U) /*!< Adjusted GT for greater interoperability (Sony XPERIA P, Nokia N9, Huawei P2) */ #define FURI_HAL_NFC_LL_GT_AP2P_ADJUSTED \
furi_hal_nfc_ll_ms2fc( \
5U + \
25U) /*!< Adjusted GT for greater interoperability (Sony XPERIA P, Nokia N9, Huawei P2) */
void furi_hal_nfc_ll_set_guard_time(uint32_t cycles); void furi_hal_nfc_ll_set_guard_time(uint32_t cycles);
typedef enum { typedef enum {
FuriHalNfcErrorHandlingNone = 0, /*!< No special error handling will be performed */ FuriHalNfcErrorHandlingNone = 0, /*!< No special error handling will be performed */
FuriHalNfcErrorHandlingNfc = 1, /*!< Error handling set to perform as NFC compliant device */ FuriHalNfcErrorHandlingNfc = 1, /*!< Error handling set to perform as NFC compliant device */
FuriHalNfcErrorHandlingEmvco = 2 /*!< Error handling set to perform as EMVCo compliant device */ FuriHalNfcErrorHandlingEmvco =
2 /*!< Error handling set to perform as EMVCo compliant device */
} FuriHalNfcErrorHandling; } FuriHalNfcErrorHandling;
void furi_hal_nfc_ll_set_error_handling(FuriHalNfcErrorHandling eHandling); void furi_hal_nfc_ll_set_error_handling(FuriHalNfcErrorHandling eHandling);
/* RFAL Frame Delay Time (FDT) Listen default values */ /* RFAL Frame Delay Time (FDT) Listen default values */
#define FURI_HAL_NFC_LL_FDT_LISTEN_NFCA_POLLER 1172U /*!< FDTA,LISTEN,MIN (n=9) Last bit: Logic "1" - tnn,min/2 Digital 1.1 6.10 ; EMV CCP Spec Book D v2.01 4.8.1.3 */ #define FURI_HAL_NFC_LL_FDT_LISTEN_NFCA_POLLER \
#define FURI_HAL_NFC_LL_FDT_LISTEN_NFCB_POLLER 1008U /*!< TR0B,MIN Digital 1.1 7.1.3 & A.3 ; EMV CCP Spec Book D v2.01 4.8.1.3 & Table A.5 */ 1172U /*!< FDTA,LISTEN,MIN (n=9) Last bit: Logic "1" - tnn,min/2 Digital 1.1 6.10 ; EMV CCP Spec Book D v2.01 4.8.1.3 */
#define FURI_HAL_NFC_LL_FDT_LISTEN_NFCF_POLLER 2672U /*!< TR0F,LISTEN,MIN Digital 1.1 8.7.1.1 & A.4 */ #define FURI_HAL_NFC_LL_FDT_LISTEN_NFCB_POLLER \
#define FURI_HAL_NFC_LL_FDT_LISTEN_NFCV_POLLER 4310U /*!< FDTV,LISTEN,MIN t1 min Digital 2.1 B.5 ; ISO15693-3 2009 9.1 */ 1008U /*!< TR0B,MIN Digital 1.1 7.1.3 & A.3 ; EMV CCP Spec Book D v2.01 4.8.1.3 & Table A.5 */
#define FURI_HAL_NFC_LL_FDT_LISTEN_PICOPASS_POLLER 3400U /*!< ISO15693 t1 min - observed adjustment */ #define FURI_HAL_NFC_LL_FDT_LISTEN_NFCF_POLLER \
#define FURI_HAL_NFC_LL_FDT_LISTEN_AP2P_POLLER 64U /*!< FDT AP2P No actual FDTListen is required as fields switch and collision avoidance */ 2672U /*!< TR0F,LISTEN,MIN Digital 1.1 8.7.1.1 & A.4 */
#define FURI_HAL_NFC_LL_FDT_LISTEN_NFCV_POLLER \
4310U /*!< FDTV,LISTEN,MIN t1 min Digital 2.1 B.5 ; ISO15693-3 2009 9.1 */
#define FURI_HAL_NFC_LL_FDT_LISTEN_PICOPASS_POLLER \
3400U /*!< ISO15693 t1 min - observed adjustment */
#define FURI_HAL_NFC_LL_FDT_LISTEN_AP2P_POLLER \
64U /*!< FDT AP2P No actual FDTListen is required as fields switch and collision avoidance */
#define FURI_HAL_NFC_LL_FDT_LISTEN_NFCA_LISTENER 1172U /*!< FDTA,LISTEN,MIN Digital 1.1 6.10 */ #define FURI_HAL_NFC_LL_FDT_LISTEN_NFCA_LISTENER 1172U /*!< FDTA,LISTEN,MIN Digital 1.1 6.10 */
#define FURI_HAL_NFC_LL_FDT_LISTEN_NFCB_LISTENER 1024U /*!< TR0B,MIN Digital 1.1 7.1.3 & A.3 ; EMV CCP Spec Book D v2.01 4.8.1.3 & Table A.5 */ #define FURI_HAL_NFC_LL_FDT_LISTEN_NFCB_LISTENER \
#define FURI_HAL_NFC_LL_FDT_LISTEN_NFCF_LISTENER 2688U /*!< TR0F,LISTEN,MIN Digital 2.1 8.7.1.1 & B.4 */ 1024U /*!< TR0B,MIN Digital 1.1 7.1.3 & A.3 ; EMV CCP Spec Book D v2.01 4.8.1.3 & Table A.5 */
#define FURI_HAL_NFC_LL_FDT_LISTEN_AP2P_LISTENER 64U /*!< FDT AP2P No actual FDTListen exists as fields switch and collision avoidance */ #define FURI_HAL_NFC_LL_FDT_LISTEN_NFCF_LISTENER \
2688U /*!< TR0F,LISTEN,MIN Digital 2.1 8.7.1.1 & B.4 */
#define FURI_HAL_NFC_LL_FDT_LISTEN_AP2P_LISTENER \
64U /*!< FDT AP2P No actual FDTListen exists as fields switch and collision avoidance */
void furi_hal_nfc_ll_set_fdt_listen(uint32_t cycles); void furi_hal_nfc_ll_set_fdt_listen(uint32_t cycles);
/* RFAL Frame Delay Time (FDT) Poll default values */ /* RFAL Frame Delay Time (FDT) Poll default values */
#define FURI_HAL_NFC_LL_FDT_POLL_NFCA_POLLER 6780U /*!< FDTA,POLL,MIN Digital 1.1 6.10.3.1 & A.2 */ #define FURI_HAL_NFC_LL_FDT_POLL_NFCA_POLLER \
#define FURI_HAL_NFC_LL_FDT_POLL_NFCA_T1T_POLLER 384U /*!< RRDDT1T,MIN,B1 Digital 1.1 10.7.1 & A.5 */ 6780U /*!< FDTA,POLL,MIN Digital 1.1 6.10.3.1 & A.2 */
#define FURI_HAL_NFC_LL_FDT_POLL_NFCB_POLLER 6780U /*!< FDTB,POLL,MIN = TR2B,MIN,DEFAULT Digital 1.1 7.9.3 & A.3 ; EMVCo 3.0 FDTB,PCD,MIN Table A.5 */ #define FURI_HAL_NFC_LL_FDT_POLL_NFCA_T1T_POLLER \
384U /*!< RRDDT1T,MIN,B1 Digital 1.1 10.7.1 & A.5 */
#define FURI_HAL_NFC_LL_FDT_POLL_NFCB_POLLER \
6780U /*!< FDTB,POLL,MIN = TR2B,MIN,DEFAULT Digital 1.1 7.9.3 & A.3 ; EMVCo 3.0 FDTB,PCD,MIN Table A.5 */
#define FURI_HAL_NFC_LL_FDT_POLL_NFCF_POLLER 6800U /*!< FDTF,POLL,MIN Digital 2.1 8.7.3 & B.4 */ #define FURI_HAL_NFC_LL_FDT_POLL_NFCF_POLLER 6800U /*!< FDTF,POLL,MIN Digital 2.1 8.7.3 & B.4 */
#define FURI_HAL_NFC_LL_FDT_POLL_NFCV_POLLER 4192U /*!< FDTV,POLL Digital 2.1 9.7.3.1 & B.5 */ #define FURI_HAL_NFC_LL_FDT_POLL_NFCV_POLLER 4192U /*!< FDTV,POLL Digital 2.1 9.7.3.1 & B.5 */
#define FURI_HAL_NFC_LL_FDT_POLL_PICOPASS_POLLER 1790U /*!< FDT Max */ #define FURI_HAL_NFC_LL_FDT_POLL_PICOPASS_POLLER 1790U /*!< FDT Max */
#define FURI_HAL_NFC_LL_FDT_POLL_AP2P_POLLER 0U /*!< FDT AP2P No actual FDTPoll exists as fields switch and collision avoidance */ #define FURI_HAL_NFC_LL_FDT_POLL_AP2P_POLLER \
0U /*!< FDT AP2P No actual FDTPoll exists as fields switch and collision avoidance */
void furi_hal_nfc_ll_set_fdt_poll(uint32_t FDTPoll); void furi_hal_nfc_ll_set_fdt_poll(uint32_t FDTPoll);

View File

@@ -1,6 +1,11 @@
Import("env") Import("env")
env.Append(LINT_SOURCES=["furi"]) env.Append(
LINT_SOURCES=[
"furi",
"furi/core",
]
)
libenv = env.Clone(FW_LIB_NAME="furi") libenv = env.Clone(FW_LIB_NAME="furi")

View File

@@ -86,7 +86,7 @@ void furi_timer_free(FuriTimer* instance) {
furi_check(xTimerDelete(hTimer, portMAX_DELAY) == pdPASS); furi_check(xTimerDelete(hTimer, portMAX_DELAY) == pdPASS);
while (furi_timer_is_running(instance)) furi_delay_tick(2); while(furi_timer_is_running(instance)) furi_delay_tick(2);
if((uint32_t)callb & 1U) { if((uint32_t)callb & 1U) {
/* Callback memory was allocated from dynamic pool, clear flag */ /* Callback memory was allocated from dynamic pool, clear flag */

0
furi/flipper.c Executable file → Normal file
View File

View File

@@ -2,7 +2,7 @@ Import("env")
env.Append( env.Append(
LINT_SOURCES=[ LINT_SOURCES=[
"#/lib/lfrfid", "lib/lfrfid",
], ],
CPPPATH=[ CPPPATH=[
"#/lib/lfrfid", "#/lib/lfrfid",

View File

@@ -207,7 +207,7 @@ bool protocol_awid_write_data(ProtocolAwid* protocol, void* data) {
// Fix incorrect length byte // Fix incorrect length byte
if(protocol->data[0] != 26 && protocol->data[0] != 50 && protocol->data[0] != 37 && if(protocol->data[0] != 26 && protocol->data[0] != 50 && protocol->data[0] != 37 &&
protocol->data[0] != 34 && protocol->data[0] != 36 ) { protocol->data[0] != 34 && protocol->data[0] != 36) {
protocol->data[0] = 26; protocol->data[0] = 26;
} }

View File

@@ -7,6 +7,16 @@ void subghz_protocol_blocks_add_bit(SubGhzBlockDecoder* decoder, uint8_t bit) {
decoder->decode_count_bit++; decoder->decode_count_bit++;
} }
void subghz_protocol_blocks_add_to_128_bit(
SubGhzBlockDecoder* decoder,
uint8_t bit,
uint64_t* head_64_bit) {
if(++decoder->decode_count_bit > 64) {
(*head_64_bit) = ((*head_64_bit) << 1) | (decoder->decode_data >> 63);
}
decoder->decode_data = decoder->decode_data << 1 | bit;
}
uint8_t subghz_protocol_blocks_get_hash_data(SubGhzBlockDecoder* decoder, size_t len) { uint8_t subghz_protocol_blocks_get_hash_data(SubGhzBlockDecoder* decoder, size_t len) {
uint8_t hash = 0; uint8_t hash = 0;
uint8_t* p = (uint8_t*)&decoder->decode_data; uint8_t* p = (uint8_t*)&decoder->decode_data;

View File

@@ -24,6 +24,17 @@ struct SubGhzBlockDecoder {
*/ */
void subghz_protocol_blocks_add_bit(SubGhzBlockDecoder* decoder, uint8_t bit); void subghz_protocol_blocks_add_bit(SubGhzBlockDecoder* decoder, uint8_t bit);
/**
* Add data to_128 bit when decoding.
* @param decoder Pointer to a SubGhzBlockDecoder instance
* @param head_64_bit Pointer to a head_64_bit
* @param bit data, 1bit
*/
void subghz_protocol_blocks_add_to_128_bit(
SubGhzBlockDecoder* decoder,
uint8_t bit,
uint64_t* head_64_bit);
/** /**
* Getting the hash sum of the last randomly received parcel. * Getting the hash sum of the last randomly received parcel.
* @param decoder Pointer to a SubGhzBlockDecoder instance * @param decoder Pointer to a SubGhzBlockDecoder instance

View File

@@ -1,16 +1,16 @@
#include "math.h" #include "math.h"
uint64_t subghz_protocol_blocks_reverse_key(uint64_t key, uint8_t count_bit) { uint64_t subghz_protocol_blocks_reverse_key(uint64_t key, uint8_t bit_count) {
uint64_t key_reverse = 0; uint64_t reverse_key = 0;
for(uint8_t i = 0; i < count_bit; i++) { for(uint8_t i = 0; i < bit_count; i++) {
key_reverse = key_reverse << 1 | bit_read(key, i); reverse_key = reverse_key << 1 | bit_read(key, i);
} }
return key_reverse; return reverse_key;
} }
uint8_t subghz_protocol_blocks_get_parity(uint64_t key, uint8_t count_bit) { uint8_t subghz_protocol_blocks_get_parity(uint64_t key, uint8_t bit_count) {
uint8_t parity = 0; uint8_t parity = 0;
for(uint8_t i = 0; i < count_bit; i++) { for(uint8_t i = 0; i < bit_count; i++) {
parity += bit_read(key, i); parity += bit_read(key, i);
} }
return parity & 0x01; return parity & 0x01;
@@ -18,14 +18,14 @@ uint8_t subghz_protocol_blocks_get_parity(uint64_t key, uint8_t count_bit) {
uint8_t subghz_protocol_blocks_crc4( uint8_t subghz_protocol_blocks_crc4(
uint8_t const message[], uint8_t const message[],
unsigned nBytes, size_t size,
uint8_t polynomial, uint8_t polynomial,
uint8_t init) { uint8_t init) {
unsigned remainder = init << 4; // LSBs are unused uint8_t remainder = init << 4; // LSBs are unused
unsigned poly = polynomial << 4; uint8_t poly = polynomial << 4;
unsigned bit; uint8_t bit;
while(nBytes--) { while(size--) {
remainder ^= *message++; remainder ^= *message++;
for(bit = 0; bit < 8; bit++) { for(bit = 0; bit < 8; bit++) {
if(remainder & 0x80) { if(remainder & 0x80) {
@@ -40,16 +40,15 @@ uint8_t subghz_protocol_blocks_crc4(
uint8_t subghz_protocol_blocks_crc7( uint8_t subghz_protocol_blocks_crc7(
uint8_t const message[], uint8_t const message[],
unsigned nBytes, size_t size,
uint8_t polynomial, uint8_t polynomial,
uint8_t init) { uint8_t init) {
unsigned remainder = init << 1; // LSB is unused uint8_t remainder = init << 1; // LSB is unused
unsigned poly = polynomial << 1; uint8_t poly = polynomial << 1;
unsigned byte, bit;
for(byte = 0; byte < nBytes; ++byte) { for(size_t byte = 0; byte < size; ++byte) {
remainder ^= message[byte]; remainder ^= message[byte];
for(bit = 0; bit < 8; ++bit) { for(uint8_t bit = 0; bit < 8; ++bit) {
if(remainder & 0x80) { if(remainder & 0x80) {
remainder = (remainder << 1) ^ poly; remainder = (remainder << 1) ^ poly;
} else { } else {
@@ -62,15 +61,14 @@ uint8_t subghz_protocol_blocks_crc7(
uint8_t subghz_protocol_blocks_crc8( uint8_t subghz_protocol_blocks_crc8(
uint8_t const message[], uint8_t const message[],
unsigned nBytes, size_t size,
uint8_t polynomial, uint8_t polynomial,
uint8_t init) { uint8_t init) {
uint8_t remainder = init; uint8_t remainder = init;
unsigned byte, bit;
for(byte = 0; byte < nBytes; ++byte) { for(size_t byte = 0; byte < size; ++byte) {
remainder ^= message[byte]; remainder ^= message[byte];
for(bit = 0; bit < 8; ++bit) { for(uint8_t bit = 0; bit < 8; ++bit) {
if(remainder & 0x80) { if(remainder & 0x80) {
remainder = (remainder << 1) ^ polynomial; remainder = (remainder << 1) ^ polynomial;
} else { } else {
@@ -83,16 +81,15 @@ uint8_t subghz_protocol_blocks_crc8(
uint8_t subghz_protocol_blocks_crc8le( uint8_t subghz_protocol_blocks_crc8le(
uint8_t const message[], uint8_t const message[],
unsigned nBytes, size_t size,
uint8_t polynomial, uint8_t polynomial,
uint8_t init) { uint8_t init) {
uint8_t remainder = subghz_protocol_blocks_reverse_key(init, 8); uint8_t remainder = subghz_protocol_blocks_reverse_key(init, 8);
unsigned byte, bit;
polynomial = subghz_protocol_blocks_reverse_key(polynomial, 8); polynomial = subghz_protocol_blocks_reverse_key(polynomial, 8);
for(byte = 0; byte < nBytes; ++byte) { for(size_t byte = 0; byte < size; ++byte) {
remainder ^= message[byte]; remainder ^= message[byte];
for(bit = 0; bit < 8; ++bit) { for(uint8_t bit = 0; bit < 8; ++bit) {
if(remainder & 1) { if(remainder & 1) {
remainder = (remainder >> 1) ^ polynomial; remainder = (remainder >> 1) ^ polynomial;
} else { } else {
@@ -105,15 +102,14 @@ uint8_t subghz_protocol_blocks_crc8le(
uint16_t subghz_protocol_blocks_crc16lsb( uint16_t subghz_protocol_blocks_crc16lsb(
uint8_t const message[], uint8_t const message[],
unsigned nBytes, size_t size,
uint16_t polynomial, uint16_t polynomial,
uint16_t init) { uint16_t init) {
uint16_t remainder = init; uint16_t remainder = init;
unsigned byte, bit;
for(byte = 0; byte < nBytes; ++byte) { for(size_t byte = 0; byte < size; ++byte) {
remainder ^= message[byte]; remainder ^= message[byte];
for(bit = 0; bit < 8; ++bit) { for(uint8_t bit = 0; bit < 8; ++bit) {
if(remainder & 1) { if(remainder & 1) {
remainder = (remainder >> 1) ^ polynomial; remainder = (remainder >> 1) ^ polynomial;
} else { } else {
@@ -126,15 +122,14 @@ uint16_t subghz_protocol_blocks_crc16lsb(
uint16_t subghz_protocol_blocks_crc16( uint16_t subghz_protocol_blocks_crc16(
uint8_t const message[], uint8_t const message[],
unsigned nBytes, size_t size,
uint16_t polynomial, uint16_t polynomial,
uint16_t init) { uint16_t init) {
uint16_t remainder = init; uint16_t remainder = init;
unsigned byte, bit;
for(byte = 0; byte < nBytes; ++byte) { for(size_t byte = 0; byte < size; ++byte) {
remainder ^= message[byte] << 8; remainder ^= message[byte] << 8;
for(bit = 0; bit < 8; ++bit) { for(uint8_t bit = 0; bit < 8; ++bit) {
if(remainder & 0x8000) { if(remainder & 0x8000) {
remainder = (remainder << 1) ^ polynomial; remainder = (remainder << 1) ^ polynomial;
} else { } else {
@@ -147,18 +142,18 @@ uint16_t subghz_protocol_blocks_crc16(
uint8_t subghz_protocol_blocks_lfsr_digest8( uint8_t subghz_protocol_blocks_lfsr_digest8(
uint8_t const message[], uint8_t const message[],
unsigned bytes, size_t size,
uint8_t gen, uint8_t gen,
uint8_t key) { uint8_t key) {
uint8_t sum = 0; uint8_t sum = 0;
for(unsigned k = 0; k < bytes; ++k) { for(size_t byte = 0; byte < size; ++byte) {
uint8_t data = message[k]; uint8_t data = message[byte];
for(int i = 7; i >= 0; --i) { for(int i = 7; i >= 0; --i) {
// XOR key into sum if data bit is set // XOR key into sum if data bit is set
if((data >> i) & 1) sum ^= key; if((data >> i) & 1) sum ^= key;
// roll the key right (actually the lsb is dropped here) // roll the key right (actually the LSB is dropped here)
// and apply the gen (needs to include the dropped lsb as msb) // and apply the gen (needs to include the dropped LSB as MSB)
if(key & 1) if(key & 1)
key = (key >> 1) ^ gen; key = (key >> 1) ^ gen;
else else
@@ -170,22 +165,22 @@ uint8_t subghz_protocol_blocks_lfsr_digest8(
uint8_t subghz_protocol_blocks_lfsr_digest8_reflect( uint8_t subghz_protocol_blocks_lfsr_digest8_reflect(
uint8_t const message[], uint8_t const message[],
int bytes, size_t size,
uint8_t gen, uint8_t gen,
uint8_t key) { uint8_t key) {
uint8_t sum = 0; uint8_t sum = 0;
// Process message from last byte to first byte (reflected) // Process message from last byte to first byte (reflected)
for(int k = bytes - 1; k >= 0; --k) { for(int byte = size - 1; byte >= 0; --byte) {
uint8_t data = message[k]; uint8_t data = message[byte];
// Process individual bits of each byte (reflected) // Process individual bits of each byte (reflected)
for(int i = 0; i < 8; ++i) { for(uint8_t i = 0; i < 8; ++i) {
// XOR key into sum if data bit is set // XOR key into sum if data bit is set
if((data >> i) & 1) { if((data >> i) & 1) {
sum ^= key; sum ^= key;
} }
// roll the key left (actually the lsb is dropped here) // roll the key left (actually the LSB is dropped here)
// and apply the gen (needs to include the dropped lsb as msb) // and apply the gen (needs to include the dropped lsb as MSB)
if(key & 0x80) if(key & 0x80)
key = (key << 1) ^ gen; key = (key << 1) ^ gen;
else else
@@ -197,18 +192,18 @@ uint8_t subghz_protocol_blocks_lfsr_digest8_reflect(
uint16_t subghz_protocol_blocks_lfsr_digest16( uint16_t subghz_protocol_blocks_lfsr_digest16(
uint8_t const message[], uint8_t const message[],
unsigned bytes, size_t size,
uint16_t gen, uint16_t gen,
uint16_t key) { uint16_t key) {
uint16_t sum = 0; uint16_t sum = 0;
for(unsigned k = 0; k < bytes; ++k) { for(size_t byte = 0; byte < size; ++byte) {
uint8_t data = message[k]; uint8_t data = message[byte];
for(int i = 7; i >= 0; --i) { for(int8_t i = 7; i >= 0; --i) {
// if data bit is set then xor with key // if data bit is set then xor with key
if((data >> i) & 1) sum ^= key; if((data >> i) & 1) sum ^= key;
// roll the key right (actually the lsb is dropped here) // roll the key right (actually the LSB is dropped here)
// and apply the gen (needs to include the dropped lsb as msb) // and apply the gen (needs to include the dropped LSB as MSB)
if(key & 1) if(key & 1)
key = (key >> 1) ^ gen; key = (key >> 1) ^ gen;
else else
@@ -218,31 +213,31 @@ uint16_t subghz_protocol_blocks_lfsr_digest16(
return sum; return sum;
} }
uint8_t subghz_protocol_blocks_add_bytes(uint8_t const message[], size_t num_bytes) { uint8_t subghz_protocol_blocks_add_bytes(uint8_t const message[], size_t size) {
int result = 0; uint32_t result = 0;
for(size_t i = 0; i < num_bytes; ++i) { for(size_t i = 0; i < size; ++i) {
result += message[i]; result += message[i];
} }
return (uint8_t)result; return (uint8_t)result;
} }
int subghz_protocol_blocks_parity8(uint8_t byte) { uint8_t subghz_protocol_blocks_parity8(uint8_t byte) {
byte ^= byte >> 4; byte ^= byte >> 4;
byte &= 0xf; byte &= 0xf;
return (0x6996 >> byte) & 1; return (0x6996 >> byte) & 1;
} }
int subghz_protocol_blocks_parity_bytes(uint8_t const message[], size_t num_bytes) { uint8_t subghz_protocol_blocks_parity_bytes(uint8_t const message[], size_t size) {
int result = 0; uint8_t result = 0;
for(size_t i = 0; i < num_bytes; ++i) { for(size_t i = 0; i < size; ++i) {
result ^= subghz_protocol_blocks_parity8(message[i]); result ^= subghz_protocol_blocks_parity8(message[i]);
} }
return result; return result;
} }
uint8_t subghz_protocol_blocks_xor_bytes(uint8_t const message[], size_t num_bytes) { uint8_t subghz_protocol_blocks_xor_bytes(uint8_t const message[], size_t size) {
uint8_t result = 0; uint8_t result = 0;
for(size_t i = 0; i < num_bytes; ++i) { for(size_t i = 0; i < size; ++i) {
result ^= message[i]; result ^= message[i];
} }
return result; return result;

View File

@@ -14,183 +14,201 @@
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
/**
* Flip the data bitwise.
* @param key In data
* @param count_bit number of data bits
* @return Reverse data
**/
uint64_t subghz_protocol_blocks_reverse_key(uint64_t key, uint8_t count_bit);
/** /** Flip the data bitwise
* Get parity the data bitwise. *
* @param key In data * @param key In data
* @param count_bit number of data bits * @param bit_count number of data bits
* @return parity *
**/ * @return Reverse data
uint8_t subghz_protocol_blocks_get_parity(uint64_t key, uint8_t count_bit); */
uint64_t subghz_protocol_blocks_reverse_key(uint64_t key, uint8_t bit_count);
/** /** Get parity the data bitwise
* CRC-4. *
* @param message array of bytes to check * @param key In data
* @param nBytes number of bytes in message * @param bit_count number of data bits
* @param polynomial CRC polynomial *
* @param init starting crc value * @return parity
* @return CRC value */
**/ uint8_t subghz_protocol_blocks_get_parity(uint64_t key, uint8_t bit_count);
/** CRC-4
*
* @param message array of bytes to check
* @param size number of bytes in message
* @param polynomial CRC polynomial
* @param init starting crc value
*
* @return CRC value
*/
uint8_t subghz_protocol_blocks_crc4( uint8_t subghz_protocol_blocks_crc4(
uint8_t const message[], uint8_t const message[],
unsigned nBytes, size_t size,
uint8_t polynomial, uint8_t polynomial,
uint8_t init); uint8_t init);
/** /** CRC-7
* CRC-7. *
* @param message array of bytes to check * @param message array of bytes to check
* @param nBytes number of bytes in message * @param size number of bytes in message
* @param polynomial CRC polynomial * @param polynomial CRC polynomial
* @param init starting crc value * @param init starting crc value
* @return CRC value *
**/ * @return CRC value
*/
uint8_t subghz_protocol_blocks_crc7( uint8_t subghz_protocol_blocks_crc7(
uint8_t const message[], uint8_t const message[],
unsigned nBytes, size_t size,
uint8_t polynomial, uint8_t polynomial,
uint8_t init); uint8_t init);
/** /** Generic Cyclic Redundancy Check CRC-8. Example polynomial: 0x31 = x8 + x5 +
* Generic Cyclic Redundancy Check CRC-8. * x4 + 1 (x8 is implicit) Example polynomial: 0x80 = x8 + x7 (a normal
* Example polynomial: 0x31 = x8 + x5 + x4 + 1 (x8 is implicit) * bit-by-bit parity XOR)
* Example polynomial: 0x80 = x8 + x7 (a normal bit-by-bit parity XOR) *
* @param message array of bytes to check * @param message array of bytes to check
* @param nBytes number of bytes in message * @param size number of bytes in message
* @param polynomial byte is from x^7 to x^0 (x^8 is implicitly one) * @param polynomial byte is from x^7 to x^0 (x^8 is implicitly one)
* @param init starting crc value * @param init starting crc value
* @return CRC value *
**/ * @return CRC value
*/
uint8_t subghz_protocol_blocks_crc8( uint8_t subghz_protocol_blocks_crc8(
uint8_t const message[], uint8_t const message[],
unsigned nBytes, size_t size,
uint8_t polynomial, uint8_t polynomial,
uint8_t init); uint8_t init);
/** /** "Little-endian" Cyclic Redundancy Check CRC-8 LE Input and output are
* "Little-endian" Cyclic Redundancy Check CRC-8 LE * reflected, i.e. least significant bit is shifted in first
* Input and output are reflected, i.e. least significant bit is shifted in first. *
* @param message array of bytes to check * @param message array of bytes to check
* @param nBytes number of bytes in message * @param size number of bytes in message
* @param polynomial CRC polynomial * @param polynomial CRC polynomial
* @param init starting crc value * @param init starting crc value
* @return CRC value *
**/ * @return CRC value
*/
uint8_t subghz_protocol_blocks_crc8le( uint8_t subghz_protocol_blocks_crc8le(
uint8_t const message[], uint8_t const message[],
unsigned nBytes, size_t size,
uint8_t polynomial, uint8_t polynomial,
uint8_t init); uint8_t init);
/** /** CRC-16 LSB. Input and output are reflected, i.e. least significant bit is
* CRC-16 LSB. * shifted in first. Note that poly and init already need to be reflected
* Input and output are reflected, i.e. least significant bit is shifted in first. *
* Note that poly and init already need to be reflected. * @param message array of bytes to check
* @param message array of bytes to check * @param size number of bytes in message
* @param nBytes number of bytes in message * @param polynomial CRC polynomial
* @param polynomial CRC polynomial * @param init starting crc value
* @param init starting crc value *
* @return CRC value * @return CRC value
**/ */
uint16_t subghz_protocol_blocks_crc16lsb( uint16_t subghz_protocol_blocks_crc16lsb(
uint8_t const message[], uint8_t const message[],
unsigned nBytes, size_t size,
uint16_t polynomial, uint16_t polynomial,
uint16_t init); uint16_t init);
/** /** CRC-16
* CRC-16. *
* @param message array of bytes to check * @param message array of bytes to check
* @param nBytes number of bytes in message * @param size number of bytes in message
* @param polynomial CRC polynomial * @param polynomial CRC polynomial
* @param init starting crc value * @param init starting crc value
* @return CRC value *
**/ * @return CRC value
*/
uint16_t subghz_protocol_blocks_crc16( uint16_t subghz_protocol_blocks_crc16(
uint8_t const message[], uint8_t const message[],
unsigned nBytes, size_t size,
uint16_t polynomial, uint16_t polynomial,
uint16_t init); uint16_t init);
/** /** Digest-8 by "LFSR-based Toeplitz hash"
* Digest-8 by "LFSR-based Toeplitz hash". *
* @param message bytes of message data * @param message bytes of message data
* @param bytes number of bytes to digest * @param size number of bytes to digest
* @param gen key stream generator, needs to includes the MSB if the LFSR is rolling * @param gen key stream generator, needs to includes the MSB if the
* @param key initial key * LFSR is rolling
* @return digest value * @param key initial key
**/ *
* @return digest value
*/
uint8_t subghz_protocol_blocks_lfsr_digest8( uint8_t subghz_protocol_blocks_lfsr_digest8(
uint8_t const message[], uint8_t const message[],
unsigned bytes, size_t size,
uint8_t gen, uint8_t gen,
uint8_t key); uint8_t key);
/** /** Digest-8 by "LFSR-based Toeplitz hash", byte reflect, bit reflect
* Digest-8 by "LFSR-based Toeplitz hash", byte reflect, bit reflect. *
* @param message bytes of message data * @param message bytes of message data
* @param bytes number of bytes to digest * @param size number of bytes to digest
* @param gen key stream generator, needs to includes the MSB if the LFSR is rolling * @param gen key stream generator, needs to includes the MSB if the
* @param key initial key * LFSR is rolling
* @return digest value * @param key initial key
**/ *
* @return digest value
*/
uint8_t subghz_protocol_blocks_lfsr_digest8_reflect( uint8_t subghz_protocol_blocks_lfsr_digest8_reflect(
uint8_t const message[], uint8_t const message[],
int bytes, size_t size,
uint8_t gen, uint8_t gen,
uint8_t key); uint8_t key);
/** /** Digest-16 by "LFSR-based Toeplitz hash"
* Digest-16 by "LFSR-based Toeplitz hash". *
* @param message bytes of message data * @param message bytes of message data
* @param bytes number of bytes to digest * @param size number of bytes to digest
* @param gen key stream generator, needs to includes the MSB if the LFSR is rolling * @param gen key stream generator, needs to includes the MSB if the
* @param key initial key * LFSR is rolling
* @return digest value * @param key initial key
**/ *
* @return digest value
*/
uint16_t subghz_protocol_blocks_lfsr_digest16( uint16_t subghz_protocol_blocks_lfsr_digest16(
uint8_t const message[], uint8_t const message[],
unsigned bytes, size_t size,
uint16_t gen, uint16_t gen,
uint16_t key); uint16_t key);
/** /** Compute Addition of a number of bytes
* Compute Addition of a number of bytes. *
* @param message bytes of message data * @param message bytes of message data
* @param num_bytes number of bytes to sum * @param size number of bytes to sum
* @return summation value *
**/ * @return summation value
uint8_t subghz_protocol_blocks_add_bytes(uint8_t const message[], size_t num_bytes); */
uint8_t subghz_protocol_blocks_add_bytes(uint8_t const message[], size_t size);
/** /** Compute bit parity of a single byte (8 bits)
* Compute bit parity of a single byte (8 bits). *
* @param byte single byte to check * @param byte single byte to check
* @return 1 odd parity, 0 even parity *
**/ * @return 1 odd parity, 0 even parity
int subghz_protocol_blocks_parity8(uint8_t byte); */
uint8_t subghz_protocol_blocks_parity8(uint8_t byte);
/** /** Compute bit parity of a number of bytes
* Compute bit parity of a number of bytes. *
* @param message bytes of message data * @param message bytes of message data
* @param num_bytes number of bytes to sum * @param size number of bytes to sum
* @return 1 odd parity, 0 even parity *
**/ * @return 1 odd parity, 0 even parity
int subghz_protocol_blocks_parity_bytes(uint8_t const message[], size_t num_bytes); */
uint8_t subghz_protocol_blocks_parity_bytes(uint8_t const message[], size_t size);
/** /** Compute XOR (byte-wide parity) of a number of bytes
* Compute XOR (byte-wide parity) of a number of bytes. *
* @param message bytes of message data * @param message bytes of message data
* @param num_bytes number of bytes to sum * @param size number of bytes to sum
* @return summation value, per bit-position 1 odd parity, 0 even parity *
**/ * @return summation value, per bit-position 1 odd parity, 0 even parity
uint8_t subghz_protocol_blocks_xor_bytes(uint8_t const message[], size_t num_bytes); */
uint8_t subghz_protocol_blocks_xor_bytes(uint8_t const message[], size_t size);
#ifdef __cplusplus #ifdef __cplusplus
} }