mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-05-14 14:58:36 -07:00
Merge branch 'dev' into zlo/tlsf-and-a-temple-of-memcorrupt
This commit is contained in:
13
.clangd
Normal file
13
.clangd
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
CompileFlags:
|
||||||
|
Add:
|
||||||
|
- -Wno-unknown-warning-option
|
||||||
|
- -Wno-format
|
||||||
|
Remove:
|
||||||
|
- -mword-relocations
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
If:
|
||||||
|
PathMatch: .*\.h
|
||||||
|
Diagnostics:
|
||||||
|
UnusedIncludes: None
|
||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -12,6 +12,9 @@ compile_commands.json
|
|||||||
# JetBrains IDEs
|
# JetBrains IDEs
|
||||||
.idea/
|
.idea/
|
||||||
|
|
||||||
|
# Sublime Text
|
||||||
|
.sublime-project.sublime-workspace
|
||||||
|
|
||||||
# Python VirtEnvironments
|
# Python VirtEnvironments
|
||||||
.env
|
.env
|
||||||
.venv
|
.venv
|
||||||
|
|||||||
21
.sublime-project
vendored
Normal file
21
.sublime-project
vendored
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"folders":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"path": ".",
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"settings": {
|
||||||
|
"LSP": {
|
||||||
|
"clangd": {
|
||||||
|
"initializationOptions": {
|
||||||
|
"clangd.compile-commands-dir": "build/latest",
|
||||||
|
"clangd.header-insertion": null,
|
||||||
|
"clangd.query-driver": "**",
|
||||||
|
"clangd.clang-tidy": true,
|
||||||
|
},
|
||||||
|
"enabled": true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
4
.vscode/example/settings.json
vendored
4
.vscode/example/settings.json
vendored
@@ -19,6 +19,8 @@
|
|||||||
"clangd.arguments": [
|
"clangd.arguments": [
|
||||||
// We might be able to tighten this a bit more to only include the correct toolchain.
|
// We might be able to tighten this a bit more to only include the correct toolchain.
|
||||||
"--query-driver=**",
|
"--query-driver=**",
|
||||||
"--compile-commands-dir=${workspaceFolder}/build/latest"
|
"--compile-commands-dir=${workspaceFolder}/build/latest",
|
||||||
|
"--clang-tidy",
|
||||||
|
"--header-insertion=never"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -6,8 +6,9 @@
|
|||||||
#include <gui/view_dispatcher.h>
|
#include <gui/view_dispatcher.h>
|
||||||
#include <gui/modules/submenu.h>
|
#include <gui/modules/submenu.h>
|
||||||
#include <gui/gui.h>
|
#include <gui/gui.h>
|
||||||
|
#include "iso7816_callbacks.h"
|
||||||
#include "iso7816_t0_apdu.h"
|
#include "iso7816_t0_apdu.h"
|
||||||
|
#include "iso7816_atr.h"
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
EventTypeInput,
|
EventTypeInput,
|
||||||
@@ -33,38 +34,6 @@ typedef enum {
|
|||||||
CcidTestSubmenuIndexInsertSmartcardReader
|
CcidTestSubmenuIndexInsertSmartcardReader
|
||||||
} SubmenuIndex;
|
} SubmenuIndex;
|
||||||
|
|
||||||
void icc_power_on_callback(uint8_t* atrBuffer, uint32_t* atrlen, void* context) {
|
|
||||||
UNUSED(context);
|
|
||||||
|
|
||||||
iso7816_answer_to_reset(atrBuffer, atrlen);
|
|
||||||
}
|
|
||||||
|
|
||||||
//dataBlock points to the buffer
|
|
||||||
//dataBlockLen tells reader how nany bytes should be read
|
|
||||||
void xfr_datablock_callback(
|
|
||||||
const uint8_t* dataBlock,
|
|
||||||
uint32_t dataBlockLen,
|
|
||||||
uint8_t* responseDataBlock,
|
|
||||||
uint32_t* responseDataBlockLen,
|
|
||||||
void* context) {
|
|
||||||
UNUSED(context);
|
|
||||||
|
|
||||||
struct ISO7816_Command_APDU commandAPDU;
|
|
||||||
iso7816_read_command_apdu(&commandAPDU, dataBlock, dataBlockLen);
|
|
||||||
|
|
||||||
struct ISO7816_Response_APDU responseAPDU;
|
|
||||||
//class not supported
|
|
||||||
responseAPDU.SW1 = 0x6E;
|
|
||||||
responseAPDU.SW2 = 0x00;
|
|
||||||
|
|
||||||
iso7816_write_response_apdu(&responseAPDU, responseDataBlock, responseDataBlockLen);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const CcidCallbacks ccid_cb = {
|
|
||||||
icc_power_on_callback,
|
|
||||||
xfr_datablock_callback,
|
|
||||||
};
|
|
||||||
|
|
||||||
static void ccid_test_app_render_callback(Canvas* canvas, void* ctx) {
|
static void ccid_test_app_render_callback(Canvas* canvas, void* ctx) {
|
||||||
UNUSED(ctx);
|
UNUSED(ctx);
|
||||||
canvas_clear(canvas);
|
canvas_clear(canvas);
|
||||||
@@ -127,6 +96,86 @@ void ccid_test_app_free(CcidTestApp* app) {
|
|||||||
free(app);
|
free(app);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ccid_icc_power_on_callback(uint8_t* atrBuffer, uint32_t* atrlen, void* context) {
|
||||||
|
UNUSED(context);
|
||||||
|
|
||||||
|
iso7816_icc_power_on_callback(atrBuffer, atrlen);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ccid_xfr_datablock_callback(
|
||||||
|
const uint8_t* pcToReaderDataBlock,
|
||||||
|
uint32_t pcToReaderDataBlockLen,
|
||||||
|
uint8_t* readerToPcDataBlock,
|
||||||
|
uint32_t* readerToPcDataBlockLen,
|
||||||
|
void* context) {
|
||||||
|
UNUSED(context);
|
||||||
|
|
||||||
|
iso7816_xfr_datablock_callback(
|
||||||
|
pcToReaderDataBlock, pcToReaderDataBlockLen, readerToPcDataBlock, readerToPcDataBlockLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const CcidCallbacks ccid_cb = {
|
||||||
|
ccid_icc_power_on_callback,
|
||||||
|
ccid_xfr_datablock_callback,
|
||||||
|
};
|
||||||
|
|
||||||
|
void iso7816_answer_to_reset(Iso7816Atr* atr) {
|
||||||
|
//minimum valid ATR: https://smartcard-atr.apdu.fr/parse?ATR=3B+00
|
||||||
|
atr->TS = 0x3B;
|
||||||
|
atr->T0 = 0x00;
|
||||||
|
}
|
||||||
|
|
||||||
|
void iso7816_process_command(
|
||||||
|
const struct ISO7816_Command_APDU* commandAPDU,
|
||||||
|
struct ISO7816_Response_APDU* responseAPDU,
|
||||||
|
const uint8_t* commandApduDataBuffer,
|
||||||
|
uint8_t commandApduDataBufferLen,
|
||||||
|
uint8_t* responseApduDataBuffer,
|
||||||
|
uint8_t* responseApduDataBufferLen) {
|
||||||
|
//example 1: sends a command with no body, receives a response with no body
|
||||||
|
//sends APDU 0x01:0x02:0x00:0x00
|
||||||
|
//receives SW1=0x90, SW2=0x00
|
||||||
|
if(commandAPDU->CLA == 0x01 && commandAPDU->INS == 0x01) {
|
||||||
|
responseAPDU->SW1 = 0x90;
|
||||||
|
responseAPDU->SW2 = 0x00;
|
||||||
|
}
|
||||||
|
//example 2: sends a command with no body, receives a response with a body with two bytes
|
||||||
|
//sends APDU 0x01:0x02:0x00:0x00
|
||||||
|
//receives 'bc' (0x62, 0x63) SW1=0x80, SW2=0x10
|
||||||
|
else if(commandAPDU->CLA == 0x01 && commandAPDU->INS == 0x02) {
|
||||||
|
responseApduDataBuffer[0] = 0x62;
|
||||||
|
responseApduDataBuffer[1] = 0x63;
|
||||||
|
|
||||||
|
*responseApduDataBufferLen = 2;
|
||||||
|
|
||||||
|
responseAPDU->SW1 = 0x90;
|
||||||
|
responseAPDU->SW2 = 0x00;
|
||||||
|
}
|
||||||
|
//example 3: ends a command with a body with two bytes, receives a response with a body with two bytes
|
||||||
|
//sends APDU 0x01:0x03:0x00:0x00:0x02:CA:FE
|
||||||
|
//receives (0xCA, 0xFE) SW1=0x90, SW2=0x02
|
||||||
|
else if(
|
||||||
|
commandAPDU->CLA == 0x01 && commandAPDU->INS == 0x03 && commandApduDataBufferLen == 2 &&
|
||||||
|
commandAPDU->Lc == 2) {
|
||||||
|
//echo command body to response body
|
||||||
|
responseApduDataBuffer[0] = commandApduDataBuffer[0];
|
||||||
|
responseApduDataBuffer[1] = commandApduDataBuffer[1];
|
||||||
|
|
||||||
|
*responseApduDataBufferLen = 2;
|
||||||
|
|
||||||
|
responseAPDU->SW1 = 0x90;
|
||||||
|
responseAPDU->SW2 = 0x00;
|
||||||
|
} else {
|
||||||
|
responseAPDU->SW1 = 0x6A;
|
||||||
|
responseAPDU->SW2 = 0x00;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static const Iso7816Callbacks iso87816_cb = {
|
||||||
|
iso7816_answer_to_reset,
|
||||||
|
iso7816_process_command,
|
||||||
|
};
|
||||||
|
|
||||||
int32_t ccid_test_app(void* p) {
|
int32_t ccid_test_app(void* p) {
|
||||||
UNUSED(p);
|
UNUSED(p);
|
||||||
|
|
||||||
@@ -135,14 +184,16 @@ int32_t ccid_test_app(void* p) {
|
|||||||
|
|
||||||
//setup CCID USB
|
//setup CCID USB
|
||||||
// On linux: set VID PID using: /usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist
|
// On linux: set VID PID using: /usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist
|
||||||
app->ccid_cfg.vid = 0x1234;
|
app->ccid_cfg.vid = 0x076B;
|
||||||
app->ccid_cfg.pid = 0x5678;
|
app->ccid_cfg.pid = 0x3A21;
|
||||||
|
|
||||||
FuriHalUsbInterface* usb_mode_prev = furi_hal_usb_get_config();
|
FuriHalUsbInterface* usb_mode_prev = furi_hal_usb_get_config();
|
||||||
furi_hal_usb_unlock();
|
furi_hal_usb_unlock();
|
||||||
furi_hal_ccid_set_callbacks((CcidCallbacks*)&ccid_cb);
|
furi_hal_ccid_set_callbacks((CcidCallbacks*)&ccid_cb, NULL);
|
||||||
furi_check(furi_hal_usb_set_config(&usb_ccid, &app->ccid_cfg) == true);
|
furi_check(furi_hal_usb_set_config(&usb_ccid, &app->ccid_cfg) == true);
|
||||||
|
|
||||||
|
iso7816_set_callbacks((Iso7816Callbacks*)&iso87816_cb);
|
||||||
|
|
||||||
//handle button events
|
//handle button events
|
||||||
CcidTestAppEvent event;
|
CcidTestAppEvent event;
|
||||||
while(1) {
|
while(1) {
|
||||||
@@ -161,7 +212,9 @@ int32_t ccid_test_app(void* p) {
|
|||||||
|
|
||||||
//tear down USB
|
//tear down USB
|
||||||
furi_hal_usb_set_config(usb_mode_prev, NULL);
|
furi_hal_usb_set_config(usb_mode_prev, NULL);
|
||||||
furi_hal_ccid_set_callbacks(NULL);
|
furi_hal_ccid_set_callbacks(NULL, NULL);
|
||||||
|
|
||||||
|
iso7816_set_callbacks(NULL);
|
||||||
|
|
||||||
//teardown view
|
//teardown view
|
||||||
ccid_test_app_free(app);
|
ccid_test_app_free(app);
|
||||||
|
|||||||
9
applications/debug/ccid_test/iso7816_atr.h
Normal file
9
applications/debug/ccid_test/iso7816_atr.h
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
#ifndef _ISO7816_ATR_H_
|
||||||
|
#define _ISO7816_ATR_H_
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t TS;
|
||||||
|
uint8_t T0;
|
||||||
|
} Iso7816Atr;
|
||||||
|
|
||||||
|
#endif //_ISO7816_ATR_H_
|
||||||
76
applications/debug/ccid_test/iso7816_callbacks.c
Normal file
76
applications/debug/ccid_test/iso7816_callbacks.c
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
// transforms low level calls such as XFRCallback or ICC Power on to a structured one
|
||||||
|
// an application can register these calls and listen for the callbacks defined in Iso7816Callbacks
|
||||||
|
|
||||||
|
#include "iso7816_t0_apdu.h"
|
||||||
|
#include "iso7816_atr.h"
|
||||||
|
#include "iso7816_callbacks.h"
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <furi.h>
|
||||||
|
|
||||||
|
#define ISO7816_RESPONSE_BUFFER_SIZE 255
|
||||||
|
|
||||||
|
static Iso7816Callbacks* callbacks = NULL;
|
||||||
|
|
||||||
|
void iso7816_set_callbacks(Iso7816Callbacks* cb) {
|
||||||
|
callbacks = cb;
|
||||||
|
}
|
||||||
|
|
||||||
|
void iso7816_icc_power_on_callback(uint8_t* atrBuffer, uint32_t* atrlen) {
|
||||||
|
Iso7816Atr atr;
|
||||||
|
callbacks->iso7816_answer_to_reset(&atr);
|
||||||
|
|
||||||
|
furi_assert(atr.T0 == 0x00);
|
||||||
|
|
||||||
|
uint8_t AtrBuffer[2] = {atr.TS, atr.T0};
|
||||||
|
|
||||||
|
*atrlen = 2;
|
||||||
|
|
||||||
|
memcpy(atrBuffer, AtrBuffer, sizeof(uint8_t) * (*atrlen));
|
||||||
|
}
|
||||||
|
|
||||||
|
//dataBlock points to the buffer
|
||||||
|
//dataBlockLen tells reader how nany bytes should be read
|
||||||
|
void iso7816_xfr_datablock_callback(
|
||||||
|
const uint8_t* pcToReaderDataBlock,
|
||||||
|
uint32_t pcToReaderDataBlockLen,
|
||||||
|
uint8_t* readerToPcDataBlock,
|
||||||
|
uint32_t* readerToPcDataBlockLen) {
|
||||||
|
struct ISO7816_Response_APDU responseAPDU;
|
||||||
|
uint8_t responseApduDataBuffer[ISO7816_RESPONSE_BUFFER_SIZE];
|
||||||
|
uint8_t responseApduDataBufferLen = 0;
|
||||||
|
|
||||||
|
if(callbacks != NULL) {
|
||||||
|
struct ISO7816_Command_APDU commandAPDU;
|
||||||
|
|
||||||
|
const uint8_t* commandApduDataBuffer = NULL;
|
||||||
|
uint8_t commandApduDataBufferLen = 0;
|
||||||
|
|
||||||
|
iso7816_read_command_apdu(&commandAPDU, pcToReaderDataBlock, pcToReaderDataBlockLen);
|
||||||
|
|
||||||
|
if(commandAPDU.Lc > 0) {
|
||||||
|
commandApduDataBufferLen = commandAPDU.Lc;
|
||||||
|
commandApduDataBuffer = &pcToReaderDataBlock[5];
|
||||||
|
}
|
||||||
|
|
||||||
|
callbacks->iso7816_process_command(
|
||||||
|
&commandAPDU,
|
||||||
|
&responseAPDU,
|
||||||
|
commandApduDataBuffer,
|
||||||
|
commandApduDataBufferLen,
|
||||||
|
responseApduDataBuffer,
|
||||||
|
&responseApduDataBufferLen);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
//class not supported
|
||||||
|
responseAPDU.SW1 = 0x6E;
|
||||||
|
responseAPDU.SW2 = 0x00;
|
||||||
|
}
|
||||||
|
|
||||||
|
iso7816_write_response_apdu(
|
||||||
|
&responseAPDU,
|
||||||
|
readerToPcDataBlock,
|
||||||
|
readerToPcDataBlockLen,
|
||||||
|
responseApduDataBuffer,
|
||||||
|
responseApduDataBufferLen);
|
||||||
|
}
|
||||||
28
applications/debug/ccid_test/iso7816_callbacks.h
Normal file
28
applications/debug/ccid_test/iso7816_callbacks.h
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
#ifndef _ISO7816_CALLBACKS_H_
|
||||||
|
#define _ISO7816_CALLBACKS_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "iso7816_atr.h"
|
||||||
|
#include "iso7816_t0_apdu.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
void (*iso7816_answer_to_reset)(Iso7816Atr* atr);
|
||||||
|
void (*iso7816_process_command)(
|
||||||
|
const struct ISO7816_Command_APDU* command,
|
||||||
|
struct ISO7816_Response_APDU* response,
|
||||||
|
const uint8_t* commandApduDataBuffer,
|
||||||
|
uint8_t commandApduDataBufferLen,
|
||||||
|
uint8_t* responseApduDataBuffer,
|
||||||
|
uint8_t* responseApduDataBufferLen);
|
||||||
|
} Iso7816Callbacks;
|
||||||
|
|
||||||
|
void iso7816_set_callbacks(Iso7816Callbacks* cb);
|
||||||
|
|
||||||
|
void iso7816_icc_power_on_callback(uint8_t* atrBuffer, uint32_t* atrlen);
|
||||||
|
void iso7816_xfr_datablock_callback(
|
||||||
|
const uint8_t* dataBlock,
|
||||||
|
uint32_t dataBlockLen,
|
||||||
|
uint8_t* responseDataBlock,
|
||||||
|
uint32_t* responseDataBlockLen);
|
||||||
|
|
||||||
|
#endif //_ISO7816_CALLBACKS_H_
|
||||||
@@ -4,22 +4,14 @@
|
|||||||
#include <furi.h>
|
#include <furi.h>
|
||||||
#include "iso7816_t0_apdu.h"
|
#include "iso7816_t0_apdu.h"
|
||||||
|
|
||||||
void iso7816_answer_to_reset(uint8_t* dataBuffer, uint32_t* atrlen) {
|
//reads dataBuffer with dataLen size, translate it into a ISO7816_Command_APDU type
|
||||||
//minimum valid ATR: https://smartcard-atr.apdu.fr/parse?ATR=3B+00
|
//extra data will be pointed to commandDataBuffer
|
||||||
uint8_t AtrBuffer[2] = {
|
|
||||||
0x3B, //TS (direct convention)
|
|
||||||
0x00 // T0 (Y(1): b0000, K: 0 (historical bytes))
|
|
||||||
};
|
|
||||||
*atrlen = 2;
|
|
||||||
|
|
||||||
memcpy(dataBuffer, AtrBuffer, sizeof(uint8_t) * (*atrlen));
|
|
||||||
}
|
|
||||||
|
|
||||||
void iso7816_read_command_apdu(
|
void iso7816_read_command_apdu(
|
||||||
struct ISO7816_Command_APDU* command,
|
struct ISO7816_Command_APDU* command,
|
||||||
const uint8_t* dataBuffer,
|
const uint8_t* dataBuffer,
|
||||||
uint32_t dataLen) {
|
uint32_t dataLen) {
|
||||||
UNUSED(dataLen);
|
UNUSED(dataLen);
|
||||||
|
|
||||||
command->CLA = dataBuffer[0];
|
command->CLA = dataBuffer[0];
|
||||||
command->INS = dataBuffer[1];
|
command->INS = dataBuffer[1];
|
||||||
command->P1 = dataBuffer[2];
|
command->P1 = dataBuffer[2];
|
||||||
@@ -27,11 +19,30 @@ void iso7816_read_command_apdu(
|
|||||||
command->Lc = dataBuffer[4];
|
command->Lc = dataBuffer[4];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//data buffer countains the whole APU response (response + trailer (SW1+SW2))
|
||||||
void iso7816_write_response_apdu(
|
void iso7816_write_response_apdu(
|
||||||
const struct ISO7816_Response_APDU* response,
|
const struct ISO7816_Response_APDU* response,
|
||||||
uint8_t* dataBuffer,
|
uint8_t* readerToPcDataBlock,
|
||||||
uint32_t* dataLen) {
|
uint32_t* readerToPcDataBlockLen,
|
||||||
dataBuffer[0] = response->SW1;
|
uint8_t* responseDataBuffer,
|
||||||
dataBuffer[1] = response->SW2;
|
uint32_t responseDataLen) {
|
||||||
*dataLen = 2;
|
uint32_t responseDataBufferIndex = 0;
|
||||||
|
|
||||||
|
//response body
|
||||||
|
if(responseDataLen > 0) {
|
||||||
|
while(responseDataBufferIndex < responseDataLen) {
|
||||||
|
readerToPcDataBlock[responseDataBufferIndex] =
|
||||||
|
responseDataBuffer[responseDataBufferIndex];
|
||||||
|
responseDataBufferIndex++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//trailer
|
||||||
|
readerToPcDataBlock[responseDataBufferIndex] = response->SW1;
|
||||||
|
responseDataBufferIndex++;
|
||||||
|
|
||||||
|
readerToPcDataBlock[responseDataBufferIndex] = response->SW2;
|
||||||
|
responseDataBufferIndex++;
|
||||||
|
|
||||||
|
*readerToPcDataBlockLen = responseDataBufferIndex;
|
||||||
}
|
}
|
||||||
@@ -2,6 +2,8 @@
|
|||||||
#define _ISO7816_T0_APDU_H_
|
#define _ISO7816_T0_APDU_H_
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include "iso7816_atr.h"
|
||||||
|
#include "core/common_defines.h"
|
||||||
|
|
||||||
struct ISO7816_Command_APDU {
|
struct ISO7816_Command_APDU {
|
||||||
//header
|
//header
|
||||||
@@ -20,13 +22,15 @@ struct ISO7816_Response_APDU {
|
|||||||
uint8_t SW2;
|
uint8_t SW2;
|
||||||
} FURI_PACKED;
|
} FURI_PACKED;
|
||||||
|
|
||||||
void iso7816_answer_to_reset(uint8_t* atrBuffer, uint32_t* atrlen);
|
void iso7816_answer_to_reset(Iso7816Atr* atr);
|
||||||
void iso7816_read_command_apdu(
|
void iso7816_read_command_apdu(
|
||||||
struct ISO7816_Command_APDU* command,
|
struct ISO7816_Command_APDU* command,
|
||||||
const uint8_t* dataBuffer,
|
const uint8_t* dataBuffer,
|
||||||
uint32_t dataLen);
|
uint32_t dataLen);
|
||||||
void iso7816_write_response_apdu(
|
void iso7816_write_response_apdu(
|
||||||
const struct ISO7816_Response_APDU* response,
|
const struct ISO7816_Response_APDU* response,
|
||||||
uint8_t* dataBuffer,
|
uint8_t* readerToPcDataBlock,
|
||||||
uint32_t* dataLen);
|
uint32_t* readerToPcDataBlockLen,
|
||||||
|
uint8_t* responseDataBuffer,
|
||||||
|
uint32_t responseDataLen);
|
||||||
#endif //_ISO7816_T0_APDU_H_
|
#endif //_ISO7816_T0_APDU_H_
|
||||||
|
|||||||
@@ -80,6 +80,14 @@ SubGhzProtocolStatus subghz_txrx_gen_data_protocol_and_te(
|
|||||||
FURI_LOG_E(TAG, "Unable to update Te");
|
FURI_LOG_E(TAG, "Unable to update Te");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(ret == SubGhzProtocolStatusOk) {
|
||||||
|
uint32_t guard_time = 30;
|
||||||
|
if(!flipper_format_update_uint32(
|
||||||
|
instance->fff_data, "Guard_time", (uint32_t*)&guard_time, 1)) {
|
||||||
|
ret = SubGhzProtocolStatusErrorParserOthers;
|
||||||
|
FURI_LOG_E(TAG, "Unable to update Guard_time");
|
||||||
|
}
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ env = ENV.Clone(
|
|||||||
"fbt_resources",
|
"fbt_resources",
|
||||||
],
|
],
|
||||||
COMPILATIONDB_USE_ABSPATH=False,
|
COMPILATIONDB_USE_ABSPATH=False,
|
||||||
|
COMPILATIONDB_USE_BINARY_ABSPATH=True,
|
||||||
BUILD_DIR=fw_build_meta["build_dir"],
|
BUILD_DIR=fw_build_meta["build_dir"],
|
||||||
IS_BASE_FIRMWARE=fw_build_meta["type"] == "firmware",
|
IS_BASE_FIRMWARE=fw_build_meta["type"] == "firmware",
|
||||||
FW_FLAVOR=fw_build_meta["flavor"],
|
FW_FLAVOR=fw_build_meta["flavor"],
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define TAG "SubGhzProtocolPrinceton"
|
#define TAG "SubGhzProtocolPrinceton"
|
||||||
|
#define PRINCETON_GUARD_TIME_DEFALUT 30 //GUARD_TIME = PRINCETON_GUARD_TIME_DEFALUT * TE
|
||||||
|
|
||||||
static const SubGhzBlockConst subghz_protocol_princeton_const = {
|
static const SubGhzBlockConst subghz_protocol_princeton_const = {
|
||||||
.te_short = 390,
|
.te_short = 390,
|
||||||
@@ -29,6 +30,7 @@ struct SubGhzProtocolDecoderPrinceton {
|
|||||||
|
|
||||||
uint32_t te;
|
uint32_t te;
|
||||||
uint32_t last_data;
|
uint32_t last_data;
|
||||||
|
uint32_t guard_time;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SubGhzProtocolEncoderPrinceton {
|
struct SubGhzProtocolEncoderPrinceton {
|
||||||
@@ -38,6 +40,7 @@ struct SubGhzProtocolEncoderPrinceton {
|
|||||||
SubGhzBlockGeneric generic;
|
SubGhzBlockGeneric generic;
|
||||||
|
|
||||||
uint32_t te;
|
uint32_t te;
|
||||||
|
uint32_t guard_time;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@@ -135,8 +138,9 @@ static bool
|
|||||||
|
|
||||||
//Send Stop bit
|
//Send Stop bit
|
||||||
instance->encoder.upload[index++] = level_duration_make(true, (uint32_t)instance->te);
|
instance->encoder.upload[index++] = level_duration_make(true, (uint32_t)instance->te);
|
||||||
//Send PT_GUARD
|
//Send PT_GUARD_TIME
|
||||||
instance->encoder.upload[index++] = level_duration_make(false, (uint32_t)instance->te * 30);
|
instance->encoder.upload[index++] =
|
||||||
|
level_duration_make(false, (uint32_t)instance->te * instance->guard_time);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -165,6 +169,11 @@ SubGhzProtocolStatus
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
//optional parameter parameter
|
//optional parameter parameter
|
||||||
|
if(!flipper_format_read_uint32(
|
||||||
|
flipper_format, "Guard_time", (uint32_t*)&instance->guard_time, 1)) {
|
||||||
|
instance->guard_time = PRINCETON_GUARD_TIME_DEFALUT;
|
||||||
|
}
|
||||||
|
|
||||||
flipper_format_read_uint32(
|
flipper_format_read_uint32(
|
||||||
flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
|
flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
|
||||||
|
|
||||||
@@ -235,6 +244,7 @@ void subghz_protocol_decoder_princeton_feed(void* context, bool level, uint32_t
|
|||||||
instance->decoder.decode_data = 0;
|
instance->decoder.decode_data = 0;
|
||||||
instance->decoder.decode_count_bit = 0;
|
instance->decoder.decode_count_bit = 0;
|
||||||
instance->te = 0;
|
instance->te = 0;
|
||||||
|
instance->guard_time = PRINCETON_GUARD_TIME_DEFALUT;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PrincetonDecoderStepSaveDuration:
|
case PrincetonDecoderStepSaveDuration:
|
||||||
@@ -257,6 +267,7 @@ void subghz_protocol_decoder_princeton_feed(void* context, bool level, uint32_t
|
|||||||
|
|
||||||
instance->generic.data = instance->decoder.decode_data;
|
instance->generic.data = instance->decoder.decode_data;
|
||||||
instance->generic.data_count_bit = instance->decoder.decode_count_bit;
|
instance->generic.data_count_bit = instance->decoder.decode_count_bit;
|
||||||
|
instance->guard_time = round((float)duration / instance->te);
|
||||||
|
|
||||||
if(instance->base.callback)
|
if(instance->base.callback)
|
||||||
instance->base.callback(&instance->base, instance->base.context);
|
instance->base.callback(&instance->base, instance->base.context);
|
||||||
@@ -323,6 +334,12 @@ SubGhzProtocolStatus subghz_protocol_decoder_princeton_serialize(
|
|||||||
FURI_LOG_E(TAG, "Unable to add TE");
|
FURI_LOG_E(TAG, "Unable to add TE");
|
||||||
ret = SubGhzProtocolStatusErrorParserTe;
|
ret = SubGhzProtocolStatusErrorParserTe;
|
||||||
}
|
}
|
||||||
|
if((ret == SubGhzProtocolStatusOk) &&
|
||||||
|
!flipper_format_write_uint32(flipper_format, "Guard_time", &instance->guard_time, 1)) {
|
||||||
|
FURI_LOG_E(TAG, "Unable to add Guard_time");
|
||||||
|
ret = SubGhzProtocolStatusErrorParserOthers;
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -349,6 +366,10 @@ SubGhzProtocolStatus
|
|||||||
ret = SubGhzProtocolStatusErrorParserTe;
|
ret = SubGhzProtocolStatusErrorParserTe;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if(!flipper_format_read_uint32(
|
||||||
|
flipper_format, "Guard_time", (uint32_t*)&instance->guard_time, 1)) {
|
||||||
|
instance->guard_time = PRINCETON_GUARD_TIME_DEFALUT;
|
||||||
|
}
|
||||||
} while(false);
|
} while(false);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
@@ -12,3 +12,4 @@ def generate(env):
|
|||||||
env["LINK"] = env["CXX"]
|
env["LINK"] = env["CXX"]
|
||||||
env["CXX_NOCACHE"] = env["CXX"]
|
env["CXX_NOCACHE"] = env["CXX"]
|
||||||
env["CXX"] = "$CCACHE $CXX_NOCACHE"
|
env["CXX"] = "$CCACHE $CXX_NOCACHE"
|
||||||
|
env.AppendUnique(COMPILATIONDB_OMIT_BINARIES=["ccache"])
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ which is the name that most clang tools search for by default.
|
|||||||
import fnmatch
|
import fnmatch
|
||||||
import itertools
|
import itertools
|
||||||
import json
|
import json
|
||||||
from shlex import quote
|
from shlex import join, split
|
||||||
|
|
||||||
import SCons
|
import SCons
|
||||||
from SCons.Tool.asm import ASPPSuffixes, ASSuffixes
|
from SCons.Tool.asm import ASPPSuffixes, ASSuffixes
|
||||||
@@ -108,6 +108,10 @@ def make_emit_compilation_DB_entry(comstr):
|
|||||||
return emit_compilation_db_entry
|
return emit_compilation_db_entry
|
||||||
|
|
||||||
|
|
||||||
|
def __is_value_true(value):
|
||||||
|
return value in [True, 1, "True", "true"]
|
||||||
|
|
||||||
|
|
||||||
def compilation_db_entry_action(target, source, env, **kw):
|
def compilation_db_entry_action(target, source, env, **kw):
|
||||||
"""
|
"""
|
||||||
Create a dictionary with evaluated command line, target, source
|
Create a dictionary with evaluated command line, target, source
|
||||||
@@ -126,16 +130,19 @@ def compilation_db_entry_action(target, source, env, **kw):
|
|||||||
env=env["__COMPILATIONDB_ENV"],
|
env=env["__COMPILATIONDB_ENV"],
|
||||||
)
|
)
|
||||||
|
|
||||||
# We assume first non-space character is the executable
|
cmdline = split(command)
|
||||||
executable = command.split(" ", 1)[0]
|
binaries_to_omit = env["COMPILATIONDB_OMIT_BINARIES"]
|
||||||
if not (tool_path := _TOOL_PATH_CACHE.get(executable, None)):
|
while (executable := cmdline[0]) in binaries_to_omit:
|
||||||
tool_path = env.WhereIs(executable) or executable
|
cmdline.pop(0)
|
||||||
_TOOL_PATH_CACHE[executable] = tool_path
|
|
||||||
# If there are spaces in the executable path, we need to quote it
|
if __is_value_true(env["COMPILATIONDB_USE_BINARY_ABSPATH"]):
|
||||||
if " " in tool_path:
|
if not (tool_path := _TOOL_PATH_CACHE.get(executable, None)):
|
||||||
tool_path = quote(tool_path)
|
tool_path = env.WhereIs(executable) or executable
|
||||||
# Replacing the executable with the full path
|
_TOOL_PATH_CACHE[executable] = tool_path
|
||||||
command = tool_path + command[len(executable) :]
|
# Replacing the executable with the full path
|
||||||
|
executable = tool_path
|
||||||
|
|
||||||
|
command = join((executable, *cmdline[1:]))
|
||||||
|
|
||||||
entry = {
|
entry = {
|
||||||
"directory": env.Dir("#").abspath,
|
"directory": env.Dir("#").abspath,
|
||||||
@@ -150,7 +157,7 @@ def compilation_db_entry_action(target, source, env, **kw):
|
|||||||
def write_compilation_db(target, source, env):
|
def write_compilation_db(target, source, env):
|
||||||
entries = []
|
entries = []
|
||||||
|
|
||||||
use_abspath = env["COMPILATIONDB_USE_ABSPATH"] in [True, 1, "True", "true"]
|
use_abspath = __is_value_true(env["COMPILATIONDB_USE_ABSPATH"])
|
||||||
use_path_filter = env.subst("$COMPILATIONDB_PATH_FILTER")
|
use_path_filter = env.subst("$COMPILATIONDB_PATH_FILTER")
|
||||||
use_srcpath_filter = env.subst("$COMPILATIONDB_SRCPATH_FILTER")
|
use_srcpath_filter = env.subst("$COMPILATIONDB_SRCPATH_FILTER")
|
||||||
|
|
||||||
@@ -225,6 +232,8 @@ def generate(env, **kwargs):
|
|||||||
COMPILATIONDB_USE_ABSPATH=False,
|
COMPILATIONDB_USE_ABSPATH=False,
|
||||||
COMPILATIONDB_PATH_FILTER="",
|
COMPILATIONDB_PATH_FILTER="",
|
||||||
COMPILATIONDB_SRCPATH_FILTER="",
|
COMPILATIONDB_SRCPATH_FILTER="",
|
||||||
|
COMPILATIONDB_OMIT_BINARIES=[],
|
||||||
|
COMPILATIONDB_USE_BINARY_ABSPATH=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
components_by_suffix = itertools.chain(
|
components_by_suffix = itertools.chain(
|
||||||
|
|||||||
@@ -102,6 +102,7 @@ env = core_env.Clone(
|
|||||||
core_env.subst("$SDK_DEFINITION"), load_version_only=True
|
core_env.subst("$SDK_DEFINITION"), load_version_only=True
|
||||||
).version,
|
).version,
|
||||||
APPCHECK_COMSTR="\tAPPCHK\t${SOURCE}\n\t\tTarget: ${TARGET_HW}, API: ${UFBT_API_VERSION}",
|
APPCHECK_COMSTR="\tAPPCHK\t${SOURCE}\n\t\tTarget: ${TARGET_HW}, API: ${UFBT_API_VERSION}",
|
||||||
|
COMPILATIONDB_USE_BINARY_ABSPATH=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
wrap_tempfile(env, "LINKCOM")
|
wrap_tempfile(env, "LINKCOM")
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
entry,status,name,type,params
|
entry,status,name,type,params
|
||||||
Version,+,62.0,,
|
Version,+,63.0,,
|
||||||
Header,+,applications/services/bt/bt_service/bt.h,,
|
Header,+,applications/services/bt/bt_service/bt.h,,
|
||||||
|
Header,+,applications/services/bt/bt_service/bt_keys_storage.h,,
|
||||||
Header,+,applications/services/cli/cli.h,,
|
Header,+,applications/services/cli/cli.h,,
|
||||||
Header,+,applications/services/cli/cli_vcp.h,,
|
Header,+,applications/services/cli/cli_vcp.h,,
|
||||||
Header,+,applications/services/dialogs/dialogs.h,,
|
Header,+,applications/services/dialogs/dialogs.h,,
|
||||||
@@ -156,10 +157,12 @@ Header,+,lib/toolbox/hex.h,,
|
|||||||
Header,+,lib/toolbox/keys_dict.h,,
|
Header,+,lib/toolbox/keys_dict.h,,
|
||||||
Header,+,lib/toolbox/manchester_decoder.h,,
|
Header,+,lib/toolbox/manchester_decoder.h,,
|
||||||
Header,+,lib/toolbox/manchester_encoder.h,,
|
Header,+,lib/toolbox/manchester_encoder.h,,
|
||||||
|
Header,+,lib/toolbox/md5_calc.h,,
|
||||||
Header,+,lib/toolbox/name_generator.h,,
|
Header,+,lib/toolbox/name_generator.h,,
|
||||||
Header,+,lib/toolbox/path.h,,
|
Header,+,lib/toolbox/path.h,,
|
||||||
Header,+,lib/toolbox/pretty_format.h,,
|
Header,+,lib/toolbox/pretty_format.h,,
|
||||||
Header,+,lib/toolbox/protocols/protocol_dict.h,,
|
Header,+,lib/toolbox/protocols/protocol_dict.h,,
|
||||||
|
Header,+,lib/toolbox/pulse_protocols/pulse_glue.h,,
|
||||||
Header,+,lib/toolbox/saved_struct.h,,
|
Header,+,lib/toolbox/saved_struct.h,,
|
||||||
Header,+,lib/toolbox/simple_array.h,,
|
Header,+,lib/toolbox/simple_array.h,,
|
||||||
Header,+,lib/toolbox/stream/buffered_file_stream.h,,
|
Header,+,lib/toolbox/stream/buffered_file_stream.h,,
|
||||||
@@ -168,6 +171,7 @@ Header,+,lib/toolbox/stream/stream.h,,
|
|||||||
Header,+,lib/toolbox/stream/string_stream.h,,
|
Header,+,lib/toolbox/stream/string_stream.h,,
|
||||||
Header,+,lib/toolbox/tar/tar_archive.h,,
|
Header,+,lib/toolbox/tar/tar_archive.h,,
|
||||||
Header,+,lib/toolbox/value_index.h,,
|
Header,+,lib/toolbox/value_index.h,,
|
||||||
|
Header,+,lib/toolbox/varint.h,,
|
||||||
Header,+,lib/toolbox/version.h,,
|
Header,+,lib/toolbox/version.h,,
|
||||||
Header,+,targets/f18/furi_hal/furi_hal_resources.h,,
|
Header,+,targets/f18/furi_hal/furi_hal_resources.h,,
|
||||||
Header,+,targets/f18/furi_hal/furi_hal_spi_config.h,,
|
Header,+,targets/f18/furi_hal/furi_hal_spi_config.h,,
|
||||||
@@ -516,7 +520,9 @@ Function,-,acosh,double,double
|
|||||||
Function,-,acoshf,float,float
|
Function,-,acoshf,float,float
|
||||||
Function,-,acoshl,long double,long double
|
Function,-,acoshl,long double,long double
|
||||||
Function,-,acosl,long double,long double
|
Function,-,acosl,long double,long double
|
||||||
Function,+,aligned_alloc,void*,"size_t, size_t"
|
Function,-,aligned_alloc,void*,"size_t, size_t"
|
||||||
|
Function,+,aligned_free,void,void*
|
||||||
|
Function,+,aligned_malloc,void*,"size_t, size_t"
|
||||||
Function,-,arc4random,__uint32_t,
|
Function,-,arc4random,__uint32_t,
|
||||||
Function,-,arc4random_buf,void,"void*, size_t"
|
Function,-,arc4random_buf,void,"void*, size_t"
|
||||||
Function,-,arc4random_uniform,__uint32_t,__uint32_t
|
Function,-,arc4random_uniform,__uint32_t,__uint32_t
|
||||||
@@ -678,8 +684,15 @@ Function,+,ble_svc_serial_update_tx,_Bool,"BleServiceSerial*, uint8_t*, uint16_t
|
|||||||
Function,-,bsearch,void*,"const void*, const void*, size_t, size_t, __compar_fn_t"
|
Function,-,bsearch,void*,"const void*, const void*, size_t, size_t, __compar_fn_t"
|
||||||
Function,+,bt_disconnect,void,Bt*
|
Function,+,bt_disconnect,void,Bt*
|
||||||
Function,+,bt_forget_bonded_devices,void,Bt*
|
Function,+,bt_forget_bonded_devices,void,Bt*
|
||||||
|
Function,+,bt_keys_storage_alloc,BtKeysStorage*,const char*
|
||||||
|
Function,+,bt_keys_storage_delete,_Bool,BtKeysStorage*
|
||||||
|
Function,+,bt_keys_storage_free,void,BtKeysStorage*
|
||||||
|
Function,+,bt_keys_storage_load,_Bool,BtKeysStorage*
|
||||||
Function,+,bt_keys_storage_set_default_path,void,Bt*
|
Function,+,bt_keys_storage_set_default_path,void,Bt*
|
||||||
|
Function,+,bt_keys_storage_set_file_path,void,"BtKeysStorage*, const char*"
|
||||||
|
Function,+,bt_keys_storage_set_ram_params,void,"BtKeysStorage*, uint8_t*, uint16_t"
|
||||||
Function,+,bt_keys_storage_set_storage_path,void,"Bt*, const char*"
|
Function,+,bt_keys_storage_set_storage_path,void,"Bt*, const char*"
|
||||||
|
Function,+,bt_keys_storage_update,_Bool,"BtKeysStorage*, uint8_t*, uint32_t"
|
||||||
Function,+,bt_profile_restore_default,_Bool,Bt*
|
Function,+,bt_profile_restore_default,_Bool,Bt*
|
||||||
Function,+,bt_profile_start,FuriHalBleProfileBase*,"Bt*, const FuriHalBleProfileTemplate*, FuriHalBleProfileParams"
|
Function,+,bt_profile_start,FuriHalBleProfileBase*,"Bt*, const FuriHalBleProfileTemplate*, FuriHalBleProfileParams"
|
||||||
Function,+,bt_set_status_changed_callback,void,"Bt*, BtStatusChangedCallback, void*"
|
Function,+,bt_set_status_changed_callback,void,"Bt*, BtStatusChangedCallback, void*"
|
||||||
@@ -771,7 +784,7 @@ Function,+,compress_alloc,Compress*,uint16_t
|
|||||||
Function,+,compress_decode,_Bool,"Compress*, uint8_t*, size_t, uint8_t*, size_t, size_t*"
|
Function,+,compress_decode,_Bool,"Compress*, uint8_t*, size_t, uint8_t*, size_t, size_t*"
|
||||||
Function,+,compress_encode,_Bool,"Compress*, uint8_t*, size_t, uint8_t*, size_t, size_t*"
|
Function,+,compress_encode,_Bool,"Compress*, uint8_t*, size_t, uint8_t*, size_t, size_t*"
|
||||||
Function,+,compress_free,void,Compress*
|
Function,+,compress_free,void,Compress*
|
||||||
Function,+,compress_icon_alloc,CompressIcon*,
|
Function,+,compress_icon_alloc,CompressIcon*,size_t
|
||||||
Function,+,compress_icon_decode,void,"CompressIcon*, const uint8_t*, uint8_t**"
|
Function,+,compress_icon_decode,void,"CompressIcon*, const uint8_t*, uint8_t**"
|
||||||
Function,+,compress_icon_free,void,CompressIcon*
|
Function,+,compress_icon_free,void,CompressIcon*
|
||||||
Function,-,copysign,double,"double, double"
|
Function,-,copysign,double,"double, double"
|
||||||
@@ -1144,7 +1157,7 @@ Function,+,furi_hal_bus_is_enabled,_Bool,FuriHalBus
|
|||||||
Function,+,furi_hal_bus_reset,void,FuriHalBus
|
Function,+,furi_hal_bus_reset,void,FuriHalBus
|
||||||
Function,+,furi_hal_ccid_ccid_insert_smartcard,void,
|
Function,+,furi_hal_ccid_ccid_insert_smartcard,void,
|
||||||
Function,+,furi_hal_ccid_ccid_remove_smartcard,void,
|
Function,+,furi_hal_ccid_ccid_remove_smartcard,void,
|
||||||
Function,+,furi_hal_ccid_set_callbacks,void,CcidCallbacks*
|
Function,+,furi_hal_ccid_set_callbacks,void,"CcidCallbacks*, void*"
|
||||||
Function,+,furi_hal_cdc_get_ctrl_line_state,uint8_t,uint8_t
|
Function,+,furi_hal_cdc_get_ctrl_line_state,uint8_t,uint8_t
|
||||||
Function,+,furi_hal_cdc_get_port_settings,usb_cdc_line_coding*,uint8_t
|
Function,+,furi_hal_cdc_get_port_settings,usb_cdc_line_coding*,uint8_t
|
||||||
Function,+,furi_hal_cdc_receive,int32_t,"uint8_t, uint8_t*, uint16_t"
|
Function,+,furi_hal_cdc_receive,int32_t,"uint8_t, uint8_t*, uint16_t"
|
||||||
@@ -1488,7 +1501,7 @@ Function,+,furi_mutex_free,void,FuriMutex*
|
|||||||
Function,+,furi_mutex_get_owner,FuriThreadId,FuriMutex*
|
Function,+,furi_mutex_get_owner,FuriThreadId,FuriMutex*
|
||||||
Function,+,furi_mutex_release,FuriStatus,FuriMutex*
|
Function,+,furi_mutex_release,FuriStatus,FuriMutex*
|
||||||
Function,+,furi_pubsub_alloc,FuriPubSub*,
|
Function,+,furi_pubsub_alloc,FuriPubSub*,
|
||||||
Function,-,furi_pubsub_free,void,FuriPubSub*
|
Function,+,furi_pubsub_free,void,FuriPubSub*
|
||||||
Function,+,furi_pubsub_publish,void,"FuriPubSub*, void*"
|
Function,+,furi_pubsub_publish,void,"FuriPubSub*, void*"
|
||||||
Function,+,furi_pubsub_subscribe,FuriPubSubSubscription*,"FuriPubSub*, FuriPubSubCallback, void*"
|
Function,+,furi_pubsub_subscribe,FuriPubSubSubscription*,"FuriPubSub*, FuriPubSubCallback, void*"
|
||||||
Function,+,furi_pubsub_unsubscribe,void,"FuriPubSub*, FuriPubSubSubscription*"
|
Function,+,furi_pubsub_unsubscribe,void,"FuriPubSub*, FuriPubSubSubscription*"
|
||||||
@@ -1673,8 +1686,10 @@ Function,+,icon_animation_set_update_callback,void,"IconAnimation*, IconAnimatio
|
|||||||
Function,+,icon_animation_start,void,IconAnimation*
|
Function,+,icon_animation_start,void,IconAnimation*
|
||||||
Function,+,icon_animation_stop,void,IconAnimation*
|
Function,+,icon_animation_stop,void,IconAnimation*
|
||||||
Function,+,icon_get_data,const uint8_t*,const Icon*
|
Function,+,icon_get_data,const uint8_t*,const Icon*
|
||||||
Function,+,icon_get_height,uint8_t,const Icon*
|
Function,+,icon_get_frame_count,uint32_t,const Icon*
|
||||||
Function,+,icon_get_width,uint8_t,const Icon*
|
Function,+,icon_get_frame_data,const uint8_t*,"const Icon*, uint32_t"
|
||||||
|
Function,+,icon_get_height,uint16_t,const Icon*
|
||||||
|
Function,+,icon_get_width,uint16_t,const Icon*
|
||||||
Function,-,ilogb,int,double
|
Function,-,ilogb,int,double
|
||||||
Function,-,ilogbf,int,float
|
Function,-,ilogbf,int,float
|
||||||
Function,-,ilogbl,int,long double
|
Function,-,ilogbl,int,long double
|
||||||
@@ -1978,13 +1993,14 @@ Function,-,mbedtls_sha256_update,int,"mbedtls_sha256_context*, const unsigned ch
|
|||||||
Function,-,mblen,int,"const char*, size_t"
|
Function,-,mblen,int,"const char*, size_t"
|
||||||
Function,-,mbstowcs,size_t,"wchar_t*, const char*, size_t"
|
Function,-,mbstowcs,size_t,"wchar_t*, const char*, size_t"
|
||||||
Function,-,mbtowc,int,"wchar_t*, const char*, size_t"
|
Function,-,mbtowc,int,"wchar_t*, const char*, size_t"
|
||||||
|
Function,+,md5_calc_file,_Bool,"File*, const char*, unsigned char[16], FS_Error*"
|
||||||
|
Function,+,md5_string_calc_file,_Bool,"File*, const char*, FuriString*, FS_Error*"
|
||||||
Function,-,memccpy,void*,"void*, const void*, int, size_t"
|
Function,-,memccpy,void*,"void*, const void*, int, size_t"
|
||||||
Function,+,memchr,void*,"const void*, int, size_t"
|
Function,+,memchr,void*,"const void*, int, size_t"
|
||||||
Function,+,memcmp,int,"const void*, const void*, size_t"
|
Function,+,memcmp,int,"const void*, const void*, size_t"
|
||||||
Function,+,memcpy,void*,"void*, const void*, size_t"
|
Function,+,memcpy,void*,"void*, const void*, size_t"
|
||||||
Function,-,memmem,void*,"const void*, size_t, const void*, size_t"
|
Function,-,memmem,void*,"const void*, size_t, const void*, size_t"
|
||||||
Function,+,memmgr_aux_pool_alloc,void*,size_t
|
Function,-,memmgr_alloc_from_pool,void*,size_t
|
||||||
Function,+,memmgr_aux_pool_get_free,size_t,
|
|
||||||
Function,+,memmgr_get_free_heap,size_t,
|
Function,+,memmgr_get_free_heap,size_t,
|
||||||
Function,+,memmgr_get_minimum_free_heap,size_t,
|
Function,+,memmgr_get_minimum_free_heap,size_t,
|
||||||
Function,+,memmgr_get_total_heap,size_t,
|
Function,+,memmgr_get_total_heap,size_t,
|
||||||
@@ -1992,7 +2008,8 @@ Function,+,memmgr_heap_disable_thread_trace,void,FuriThreadId
|
|||||||
Function,+,memmgr_heap_enable_thread_trace,void,FuriThreadId
|
Function,+,memmgr_heap_enable_thread_trace,void,FuriThreadId
|
||||||
Function,+,memmgr_heap_get_max_free_block,size_t,
|
Function,+,memmgr_heap_get_max_free_block,size_t,
|
||||||
Function,+,memmgr_heap_get_thread_memory,size_t,FuriThreadId
|
Function,+,memmgr_heap_get_thread_memory,size_t,FuriThreadId
|
||||||
Function,+,memmgr_heap_walk_blocks,void,"BlockWalker, void*"
|
Function,+,memmgr_heap_printf_free_blocks,void,
|
||||||
|
Function,-,memmgr_pool_get_free,size_t,
|
||||||
Function,-,memmgr_pool_get_max_block,size_t,
|
Function,-,memmgr_pool_get_max_block,size_t,
|
||||||
Function,+,memmove,void*,"void*, const void*, size_t"
|
Function,+,memmove,void*,"void*, const void*, size_t"
|
||||||
Function,-,mempcpy,void*,"void*, const void*, size_t"
|
Function,-,mempcpy,void*,"void*, const void*, size_t"
|
||||||
@@ -2252,6 +2269,11 @@ Function,+,protocol_dict_render_brief_data,void,"ProtocolDict*, FuriString*, siz
|
|||||||
Function,+,protocol_dict_render_data,void,"ProtocolDict*, FuriString*, size_t"
|
Function,+,protocol_dict_render_data,void,"ProtocolDict*, FuriString*, size_t"
|
||||||
Function,+,protocol_dict_render_uid,void,"ProtocolDict*, FuriString*, size_t"
|
Function,+,protocol_dict_render_uid,void,"ProtocolDict*, FuriString*, size_t"
|
||||||
Function,+,protocol_dict_set_data,void,"ProtocolDict*, size_t, const uint8_t*, size_t"
|
Function,+,protocol_dict_set_data,void,"ProtocolDict*, size_t, const uint8_t*, size_t"
|
||||||
|
Function,+,pulse_glue_alloc,PulseGlue*,
|
||||||
|
Function,+,pulse_glue_free,void,PulseGlue*
|
||||||
|
Function,+,pulse_glue_pop,void,"PulseGlue*, uint32_t*, uint32_t*"
|
||||||
|
Function,+,pulse_glue_push,_Bool,"PulseGlue*, _Bool, uint32_t"
|
||||||
|
Function,+,pulse_glue_reset,void,PulseGlue*
|
||||||
Function,-,pulse_reader_alloc,PulseReader*,"const GpioPin*, uint32_t"
|
Function,-,pulse_reader_alloc,PulseReader*,"const GpioPin*, uint32_t"
|
||||||
Function,-,pulse_reader_free,void,PulseReader*
|
Function,-,pulse_reader_free,void,PulseReader*
|
||||||
Function,-,pulse_reader_receive,uint32_t,"PulseReader*, int"
|
Function,-,pulse_reader_receive,uint32_t,"PulseReader*, int"
|
||||||
@@ -2640,6 +2662,12 @@ Function,+,variable_item_list_set_selected_item,void,"VariableItemList*, uint8_t
|
|||||||
Function,+,variable_item_set_current_value_index,void,"VariableItem*, uint8_t"
|
Function,+,variable_item_set_current_value_index,void,"VariableItem*, uint8_t"
|
||||||
Function,+,variable_item_set_current_value_text,void,"VariableItem*, const char*"
|
Function,+,variable_item_set_current_value_text,void,"VariableItem*, const char*"
|
||||||
Function,+,variable_item_set_values_count,void,"VariableItem*, uint8_t"
|
Function,+,variable_item_set_values_count,void,"VariableItem*, uint8_t"
|
||||||
|
Function,+,varint_int32_length,size_t,int32_t
|
||||||
|
Function,+,varint_int32_pack,size_t,"int32_t, uint8_t*"
|
||||||
|
Function,+,varint_int32_unpack,size_t,"int32_t*, const uint8_t*, size_t"
|
||||||
|
Function,+,varint_uint32_length,size_t,uint32_t
|
||||||
|
Function,+,varint_uint32_pack,size_t,"uint32_t, uint8_t*"
|
||||||
|
Function,+,varint_uint32_unpack,size_t,"uint32_t*, const uint8_t*, size_t"
|
||||||
Function,-,vasiprintf,int,"char**, const char*, __gnuc_va_list"
|
Function,-,vasiprintf,int,"char**, const char*, __gnuc_va_list"
|
||||||
Function,-,vasniprintf,char*,"char*, size_t*, const char*, __gnuc_va_list"
|
Function,-,vasniprintf,char*,"char*, size_t*, const char*, __gnuc_va_list"
|
||||||
Function,-,vasnprintf,char*,"char*, size_t*, const char*, __gnuc_va_list"
|
Function,-,vasnprintf,char*,"char*, size_t*, const char*, __gnuc_va_list"
|
||||||
|
|||||||
|
@@ -1,7 +1,8 @@
|
|||||||
entry,status,name,type,params
|
entry,status,name,type,params
|
||||||
Version,+,62.0,,
|
Version,+,63.0,,
|
||||||
Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,,
|
Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,,
|
||||||
Header,+,applications/services/bt/bt_service/bt.h,,
|
Header,+,applications/services/bt/bt_service/bt.h,,
|
||||||
|
Header,+,applications/services/bt/bt_service/bt_keys_storage.h,,
|
||||||
Header,+,applications/services/cli/cli.h,,
|
Header,+,applications/services/cli/cli.h,,
|
||||||
Header,+,applications/services/cli/cli_vcp.h,,
|
Header,+,applications/services/cli/cli_vcp.h,,
|
||||||
Header,+,applications/services/dialogs/dialogs.h,,
|
Header,+,applications/services/dialogs/dialogs.h,,
|
||||||
@@ -158,6 +159,7 @@ Header,+,lib/nfc/protocols/mf_ultralight/mf_ultralight_listener.h,,
|
|||||||
Header,+,lib/nfc/protocols/mf_ultralight/mf_ultralight_poller.h,,
|
Header,+,lib/nfc/protocols/mf_ultralight/mf_ultralight_poller.h,,
|
||||||
Header,+,lib/nfc/protocols/mf_ultralight/mf_ultralight_poller_sync.h,,
|
Header,+,lib/nfc/protocols/mf_ultralight/mf_ultralight_poller_sync.h,,
|
||||||
Header,+,lib/nfc/protocols/slix/slix.h,,
|
Header,+,lib/nfc/protocols/slix/slix.h,,
|
||||||
|
Header,+,lib/nfc/protocols/slix/slix_poller.h,,
|
||||||
Header,+,lib/nfc/protocols/st25tb/st25tb.h,,
|
Header,+,lib/nfc/protocols/st25tb/st25tb.h,,
|
||||||
Header,+,lib/nfc/protocols/st25tb/st25tb_poller.h,,
|
Header,+,lib/nfc/protocols/st25tb/st25tb_poller.h,,
|
||||||
Header,+,lib/nfc/protocols/st25tb/st25tb_poller_sync.h,,
|
Header,+,lib/nfc/protocols/st25tb/st25tb_poller_sync.h,,
|
||||||
@@ -206,6 +208,7 @@ Header,+,lib/subghz/protocols/public_api.h,,
|
|||||||
Header,+,lib/subghz/protocols/raw.h,,
|
Header,+,lib/subghz/protocols/raw.h,,
|
||||||
Header,+,lib/subghz/receiver.h,,
|
Header,+,lib/subghz/receiver.h,,
|
||||||
Header,+,lib/subghz/registry.h,,
|
Header,+,lib/subghz/registry.h,,
|
||||||
|
Header,+,lib/subghz/subghz_file_encoder_worker.h,,
|
||||||
Header,+,lib/subghz/subghz_protocol_registry.h,,
|
Header,+,lib/subghz/subghz_protocol_registry.h,,
|
||||||
Header,+,lib/subghz/subghz_setting.h,,
|
Header,+,lib/subghz/subghz_setting.h,,
|
||||||
Header,+,lib/subghz/subghz_tx_rx_worker.h,,
|
Header,+,lib/subghz/subghz_tx_rx_worker.h,,
|
||||||
@@ -222,10 +225,12 @@ Header,+,lib/toolbox/hex.h,,
|
|||||||
Header,+,lib/toolbox/keys_dict.h,,
|
Header,+,lib/toolbox/keys_dict.h,,
|
||||||
Header,+,lib/toolbox/manchester_decoder.h,,
|
Header,+,lib/toolbox/manchester_decoder.h,,
|
||||||
Header,+,lib/toolbox/manchester_encoder.h,,
|
Header,+,lib/toolbox/manchester_encoder.h,,
|
||||||
|
Header,+,lib/toolbox/md5_calc.h,,
|
||||||
Header,+,lib/toolbox/name_generator.h,,
|
Header,+,lib/toolbox/name_generator.h,,
|
||||||
Header,+,lib/toolbox/path.h,,
|
Header,+,lib/toolbox/path.h,,
|
||||||
Header,+,lib/toolbox/pretty_format.h,,
|
Header,+,lib/toolbox/pretty_format.h,,
|
||||||
Header,+,lib/toolbox/protocols/protocol_dict.h,,
|
Header,+,lib/toolbox/protocols/protocol_dict.h,,
|
||||||
|
Header,+,lib/toolbox/pulse_protocols/pulse_glue.h,,
|
||||||
Header,+,lib/toolbox/saved_struct.h,,
|
Header,+,lib/toolbox/saved_struct.h,,
|
||||||
Header,+,lib/toolbox/simple_array.h,,
|
Header,+,lib/toolbox/simple_array.h,,
|
||||||
Header,+,lib/toolbox/stream/buffered_file_stream.h,,
|
Header,+,lib/toolbox/stream/buffered_file_stream.h,,
|
||||||
@@ -234,6 +239,7 @@ Header,+,lib/toolbox/stream/stream.h,,
|
|||||||
Header,+,lib/toolbox/stream/string_stream.h,,
|
Header,+,lib/toolbox/stream/string_stream.h,,
|
||||||
Header,+,lib/toolbox/tar/tar_archive.h,,
|
Header,+,lib/toolbox/tar/tar_archive.h,,
|
||||||
Header,+,lib/toolbox/value_index.h,,
|
Header,+,lib/toolbox/value_index.h,,
|
||||||
|
Header,+,lib/toolbox/varint.h,,
|
||||||
Header,+,lib/toolbox/version.h,,
|
Header,+,lib/toolbox/version.h,,
|
||||||
Header,+,targets/f7/ble_glue/furi_ble/event_dispatcher.h,,
|
Header,+,targets/f7/ble_glue/furi_ble/event_dispatcher.h,,
|
||||||
Header,+,targets/f7/ble_glue/furi_ble/gatt.h,,
|
Header,+,targets/f7/ble_glue/furi_ble/gatt.h,,
|
||||||
@@ -587,7 +593,9 @@ Function,-,acosh,double,double
|
|||||||
Function,-,acoshf,float,float
|
Function,-,acoshf,float,float
|
||||||
Function,-,acoshl,long double,long double
|
Function,-,acoshl,long double,long double
|
||||||
Function,-,acosl,long double,long double
|
Function,-,acosl,long double,long double
|
||||||
Function,+,aligned_alloc,void*,"size_t, size_t"
|
Function,-,aligned_alloc,void*,"size_t, size_t"
|
||||||
|
Function,+,aligned_free,void,void*
|
||||||
|
Function,+,aligned_malloc,void*,"size_t, size_t"
|
||||||
Function,-,arc4random,__uint32_t,
|
Function,-,arc4random,__uint32_t,
|
||||||
Function,-,arc4random_buf,void,"void*, size_t"
|
Function,-,arc4random_buf,void,"void*, size_t"
|
||||||
Function,-,arc4random_uniform,__uint32_t,__uint32_t
|
Function,-,arc4random_uniform,__uint32_t,__uint32_t
|
||||||
@@ -749,8 +757,15 @@ Function,+,ble_svc_serial_update_tx,_Bool,"BleServiceSerial*, uint8_t*, uint16_t
|
|||||||
Function,-,bsearch,void*,"const void*, const void*, size_t, size_t, __compar_fn_t"
|
Function,-,bsearch,void*,"const void*, const void*, size_t, size_t, __compar_fn_t"
|
||||||
Function,+,bt_disconnect,void,Bt*
|
Function,+,bt_disconnect,void,Bt*
|
||||||
Function,+,bt_forget_bonded_devices,void,Bt*
|
Function,+,bt_forget_bonded_devices,void,Bt*
|
||||||
|
Function,+,bt_keys_storage_alloc,BtKeysStorage*,const char*
|
||||||
|
Function,+,bt_keys_storage_delete,_Bool,BtKeysStorage*
|
||||||
|
Function,+,bt_keys_storage_free,void,BtKeysStorage*
|
||||||
|
Function,+,bt_keys_storage_load,_Bool,BtKeysStorage*
|
||||||
Function,+,bt_keys_storage_set_default_path,void,Bt*
|
Function,+,bt_keys_storage_set_default_path,void,Bt*
|
||||||
|
Function,+,bt_keys_storage_set_file_path,void,"BtKeysStorage*, const char*"
|
||||||
|
Function,+,bt_keys_storage_set_ram_params,void,"BtKeysStorage*, uint8_t*, uint16_t"
|
||||||
Function,+,bt_keys_storage_set_storage_path,void,"Bt*, const char*"
|
Function,+,bt_keys_storage_set_storage_path,void,"Bt*, const char*"
|
||||||
|
Function,+,bt_keys_storage_update,_Bool,"BtKeysStorage*, uint8_t*, uint32_t"
|
||||||
Function,+,bt_profile_restore_default,_Bool,Bt*
|
Function,+,bt_profile_restore_default,_Bool,Bt*
|
||||||
Function,+,bt_profile_start,FuriHalBleProfileBase*,"Bt*, const FuriHalBleProfileTemplate*, FuriHalBleProfileParams"
|
Function,+,bt_profile_start,FuriHalBleProfileBase*,"Bt*, const FuriHalBleProfileTemplate*, FuriHalBleProfileParams"
|
||||||
Function,+,bt_set_status_changed_callback,void,"Bt*, BtStatusChangedCallback, void*"
|
Function,+,bt_set_status_changed_callback,void,"Bt*, BtStatusChangedCallback, void*"
|
||||||
@@ -842,7 +857,7 @@ Function,+,compress_alloc,Compress*,uint16_t
|
|||||||
Function,+,compress_decode,_Bool,"Compress*, uint8_t*, size_t, uint8_t*, size_t, size_t*"
|
Function,+,compress_decode,_Bool,"Compress*, uint8_t*, size_t, uint8_t*, size_t, size_t*"
|
||||||
Function,+,compress_encode,_Bool,"Compress*, uint8_t*, size_t, uint8_t*, size_t, size_t*"
|
Function,+,compress_encode,_Bool,"Compress*, uint8_t*, size_t, uint8_t*, size_t, size_t*"
|
||||||
Function,+,compress_free,void,Compress*
|
Function,+,compress_free,void,Compress*
|
||||||
Function,+,compress_icon_alloc,CompressIcon*,
|
Function,+,compress_icon_alloc,CompressIcon*,size_t
|
||||||
Function,+,compress_icon_decode,void,"CompressIcon*, const uint8_t*, uint8_t**"
|
Function,+,compress_icon_decode,void,"CompressIcon*, const uint8_t*, uint8_t**"
|
||||||
Function,+,compress_icon_free,void,CompressIcon*
|
Function,+,compress_icon_free,void,CompressIcon*
|
||||||
Function,-,copysign,double,"double, double"
|
Function,-,copysign,double,"double, double"
|
||||||
@@ -1241,7 +1256,7 @@ Function,+,furi_hal_bus_is_enabled,_Bool,FuriHalBus
|
|||||||
Function,+,furi_hal_bus_reset,void,FuriHalBus
|
Function,+,furi_hal_bus_reset,void,FuriHalBus
|
||||||
Function,+,furi_hal_ccid_ccid_insert_smartcard,void,
|
Function,+,furi_hal_ccid_ccid_insert_smartcard,void,
|
||||||
Function,+,furi_hal_ccid_ccid_remove_smartcard,void,
|
Function,+,furi_hal_ccid_ccid_remove_smartcard,void,
|
||||||
Function,+,furi_hal_ccid_set_callbacks,void,CcidCallbacks*
|
Function,+,furi_hal_ccid_set_callbacks,void,"CcidCallbacks*, void*"
|
||||||
Function,+,furi_hal_cdc_get_ctrl_line_state,uint8_t,uint8_t
|
Function,+,furi_hal_cdc_get_ctrl_line_state,uint8_t,uint8_t
|
||||||
Function,+,furi_hal_cdc_get_port_settings,usb_cdc_line_coding*,uint8_t
|
Function,+,furi_hal_cdc_get_port_settings,usb_cdc_line_coding*,uint8_t
|
||||||
Function,+,furi_hal_cdc_receive,int32_t,"uint8_t, uint8_t*, uint16_t"
|
Function,+,furi_hal_cdc_receive,int32_t,"uint8_t, uint8_t*, uint16_t"
|
||||||
@@ -1694,7 +1709,7 @@ Function,+,furi_mutex_free,void,FuriMutex*
|
|||||||
Function,+,furi_mutex_get_owner,FuriThreadId,FuriMutex*
|
Function,+,furi_mutex_get_owner,FuriThreadId,FuriMutex*
|
||||||
Function,+,furi_mutex_release,FuriStatus,FuriMutex*
|
Function,+,furi_mutex_release,FuriStatus,FuriMutex*
|
||||||
Function,+,furi_pubsub_alloc,FuriPubSub*,
|
Function,+,furi_pubsub_alloc,FuriPubSub*,
|
||||||
Function,-,furi_pubsub_free,void,FuriPubSub*
|
Function,+,furi_pubsub_free,void,FuriPubSub*
|
||||||
Function,+,furi_pubsub_publish,void,"FuriPubSub*, void*"
|
Function,+,furi_pubsub_publish,void,"FuriPubSub*, void*"
|
||||||
Function,+,furi_pubsub_subscribe,FuriPubSubSubscription*,"FuriPubSub*, FuriPubSubCallback, void*"
|
Function,+,furi_pubsub_subscribe,FuriPubSubSubscription*,"FuriPubSub*, FuriPubSubCallback, void*"
|
||||||
Function,+,furi_pubsub_unsubscribe,void,"FuriPubSub*, FuriPubSubSubscription*"
|
Function,+,furi_pubsub_unsubscribe,void,"FuriPubSub*, FuriPubSubSubscription*"
|
||||||
@@ -1918,8 +1933,10 @@ Function,+,icon_animation_set_update_callback,void,"IconAnimation*, IconAnimatio
|
|||||||
Function,+,icon_animation_start,void,IconAnimation*
|
Function,+,icon_animation_start,void,IconAnimation*
|
||||||
Function,+,icon_animation_stop,void,IconAnimation*
|
Function,+,icon_animation_stop,void,IconAnimation*
|
||||||
Function,+,icon_get_data,const uint8_t*,const Icon*
|
Function,+,icon_get_data,const uint8_t*,const Icon*
|
||||||
Function,+,icon_get_height,uint8_t,const Icon*
|
Function,+,icon_get_frame_count,uint32_t,const Icon*
|
||||||
Function,+,icon_get_width,uint8_t,const Icon*
|
Function,+,icon_get_frame_data,const uint8_t*,"const Icon*, uint32_t"
|
||||||
|
Function,+,icon_get_height,uint16_t,const Icon*
|
||||||
|
Function,+,icon_get_width,uint16_t,const Icon*
|
||||||
Function,-,ilogb,int,double
|
Function,-,ilogb,int,double
|
||||||
Function,-,ilogbf,int,float
|
Function,-,ilogbf,int,float
|
||||||
Function,-,ilogbl,int,long double
|
Function,-,ilogbl,int,long double
|
||||||
@@ -2388,13 +2405,14 @@ Function,-,mbedtls_sha256_update,int,"mbedtls_sha256_context*, const unsigned ch
|
|||||||
Function,-,mblen,int,"const char*, size_t"
|
Function,-,mblen,int,"const char*, size_t"
|
||||||
Function,-,mbstowcs,size_t,"wchar_t*, const char*, size_t"
|
Function,-,mbstowcs,size_t,"wchar_t*, const char*, size_t"
|
||||||
Function,-,mbtowc,int,"wchar_t*, const char*, size_t"
|
Function,-,mbtowc,int,"wchar_t*, const char*, size_t"
|
||||||
|
Function,+,md5_calc_file,_Bool,"File*, const char*, unsigned char[16], FS_Error*"
|
||||||
|
Function,+,md5_string_calc_file,_Bool,"File*, const char*, FuriString*, FS_Error*"
|
||||||
Function,-,memccpy,void*,"void*, const void*, int, size_t"
|
Function,-,memccpy,void*,"void*, const void*, int, size_t"
|
||||||
Function,+,memchr,void*,"const void*, int, size_t"
|
Function,+,memchr,void*,"const void*, int, size_t"
|
||||||
Function,+,memcmp,int,"const void*, const void*, size_t"
|
Function,+,memcmp,int,"const void*, const void*, size_t"
|
||||||
Function,+,memcpy,void*,"void*, const void*, size_t"
|
Function,+,memcpy,void*,"void*, const void*, size_t"
|
||||||
Function,-,memmem,void*,"const void*, size_t, const void*, size_t"
|
Function,-,memmem,void*,"const void*, size_t, const void*, size_t"
|
||||||
Function,+,memmgr_aux_pool_alloc,void*,size_t
|
Function,-,memmgr_alloc_from_pool,void*,size_t
|
||||||
Function,+,memmgr_aux_pool_get_free,size_t,
|
|
||||||
Function,+,memmgr_get_free_heap,size_t,
|
Function,+,memmgr_get_free_heap,size_t,
|
||||||
Function,+,memmgr_get_minimum_free_heap,size_t,
|
Function,+,memmgr_get_minimum_free_heap,size_t,
|
||||||
Function,+,memmgr_get_total_heap,size_t,
|
Function,+,memmgr_get_total_heap,size_t,
|
||||||
@@ -2402,7 +2420,8 @@ Function,+,memmgr_heap_disable_thread_trace,void,FuriThreadId
|
|||||||
Function,+,memmgr_heap_enable_thread_trace,void,FuriThreadId
|
Function,+,memmgr_heap_enable_thread_trace,void,FuriThreadId
|
||||||
Function,+,memmgr_heap_get_max_free_block,size_t,
|
Function,+,memmgr_heap_get_max_free_block,size_t,
|
||||||
Function,+,memmgr_heap_get_thread_memory,size_t,FuriThreadId
|
Function,+,memmgr_heap_get_thread_memory,size_t,FuriThreadId
|
||||||
Function,+,memmgr_heap_walk_blocks,void,"BlockWalker, void*"
|
Function,+,memmgr_heap_printf_free_blocks,void,
|
||||||
|
Function,-,memmgr_pool_get_free,size_t,
|
||||||
Function,-,memmgr_pool_get_max_block,size_t,
|
Function,-,memmgr_pool_get_max_block,size_t,
|
||||||
Function,+,memmove,void*,"void*, const void*, size_t"
|
Function,+,memmove,void*,"void*, const void*, size_t"
|
||||||
Function,-,mempcpy,void*,"void*, const void*, size_t"
|
Function,-,mempcpy,void*,"void*, const void*, size_t"
|
||||||
@@ -2850,6 +2869,11 @@ Function,+,protocol_dict_render_brief_data,void,"ProtocolDict*, FuriString*, siz
|
|||||||
Function,+,protocol_dict_render_data,void,"ProtocolDict*, FuriString*, size_t"
|
Function,+,protocol_dict_render_data,void,"ProtocolDict*, FuriString*, size_t"
|
||||||
Function,+,protocol_dict_render_uid,void,"ProtocolDict*, FuriString*, size_t"
|
Function,+,protocol_dict_render_uid,void,"ProtocolDict*, FuriString*, size_t"
|
||||||
Function,+,protocol_dict_set_data,void,"ProtocolDict*, size_t, const uint8_t*, size_t"
|
Function,+,protocol_dict_set_data,void,"ProtocolDict*, size_t, const uint8_t*, size_t"
|
||||||
|
Function,+,pulse_glue_alloc,PulseGlue*,
|
||||||
|
Function,+,pulse_glue_free,void,PulseGlue*
|
||||||
|
Function,+,pulse_glue_pop,void,"PulseGlue*, uint32_t*, uint32_t*"
|
||||||
|
Function,+,pulse_glue_push,_Bool,"PulseGlue*, _Bool, uint32_t"
|
||||||
|
Function,+,pulse_glue_reset,void,PulseGlue*
|
||||||
Function,-,pulse_reader_alloc,PulseReader*,"const GpioPin*, uint32_t"
|
Function,-,pulse_reader_alloc,PulseReader*,"const GpioPin*, uint32_t"
|
||||||
Function,-,pulse_reader_free,void,PulseReader*
|
Function,-,pulse_reader_free,void,PulseReader*
|
||||||
Function,-,pulse_reader_receive,uint32_t,"PulseReader*, int"
|
Function,-,pulse_reader_receive,uint32_t,"PulseReader*, int"
|
||||||
@@ -2990,6 +3014,11 @@ Function,+,slix_is_counter_increment_protected,_Bool,const SlixData*
|
|||||||
Function,+,slix_is_equal,_Bool,"const SlixData*, const SlixData*"
|
Function,+,slix_is_equal,_Bool,"const SlixData*, const SlixData*"
|
||||||
Function,+,slix_is_privacy_mode,_Bool,const SlixData*
|
Function,+,slix_is_privacy_mode,_Bool,const SlixData*
|
||||||
Function,+,slix_load,_Bool,"SlixData*, FlipperFormat*, uint32_t"
|
Function,+,slix_load,_Bool,"SlixData*, FlipperFormat*, uint32_t"
|
||||||
|
Function,+,slix_poller_get_nxp_system_info,SlixError,"SlixPoller*, SlixSystemInfo*"
|
||||||
|
Function,+,slix_poller_get_random_number,SlixError,"SlixPoller*, SlixRandomNumber*"
|
||||||
|
Function,+,slix_poller_read_signature,SlixError,"SlixPoller*, SlixSignature*"
|
||||||
|
Function,+,slix_poller_send_frame,SlixError,"SlixPoller*, const BitBuffer*, BitBuffer*, uint32_t"
|
||||||
|
Function,+,slix_poller_set_password,SlixError,"SlixPoller*, SlixPasswordType, SlixPassword, SlixRandomNumber"
|
||||||
Function,+,slix_reset,void,SlixData*
|
Function,+,slix_reset,void,SlixData*
|
||||||
Function,+,slix_save,_Bool,"const SlixData*, FlipperFormat*"
|
Function,+,slix_save,_Bool,"const SlixData*, FlipperFormat*"
|
||||||
Function,+,slix_set_uid,_Bool,"SlixData*, const uint8_t*, size_t"
|
Function,+,slix_set_uid,_Bool,"SlixData*, const uint8_t*, size_t"
|
||||||
@@ -3242,6 +3271,13 @@ Function,+,subghz_environment_set_alutech_at_4n_rainbow_table_file_name,void,"Su
|
|||||||
Function,+,subghz_environment_set_came_atomo_rainbow_table_file_name,void,"SubGhzEnvironment*, const char*"
|
Function,+,subghz_environment_set_came_atomo_rainbow_table_file_name,void,"SubGhzEnvironment*, const char*"
|
||||||
Function,+,subghz_environment_set_nice_flor_s_rainbow_table_file_name,void,"SubGhzEnvironment*, const char*"
|
Function,+,subghz_environment_set_nice_flor_s_rainbow_table_file_name,void,"SubGhzEnvironment*, const char*"
|
||||||
Function,+,subghz_environment_set_protocol_registry,void,"SubGhzEnvironment*, const SubGhzProtocolRegistry*"
|
Function,+,subghz_environment_set_protocol_registry,void,"SubGhzEnvironment*, const SubGhzProtocolRegistry*"
|
||||||
|
Function,+,subghz_file_encoder_worker_alloc,SubGhzFileEncoderWorker*,
|
||||||
|
Function,+,subghz_file_encoder_worker_callback_end,void,"SubGhzFileEncoderWorker*, SubGhzFileEncoderWorkerCallbackEnd, void*"
|
||||||
|
Function,+,subghz_file_encoder_worker_free,void,SubGhzFileEncoderWorker*
|
||||||
|
Function,+,subghz_file_encoder_worker_get_level_duration,LevelDuration,void*
|
||||||
|
Function,+,subghz_file_encoder_worker_is_running,_Bool,SubGhzFileEncoderWorker*
|
||||||
|
Function,+,subghz_file_encoder_worker_start,_Bool,"SubGhzFileEncoderWorker*, const char*, const char*"
|
||||||
|
Function,+,subghz_file_encoder_worker_stop,void,SubGhzFileEncoderWorker*
|
||||||
Function,-,subghz_keystore_alloc,SubGhzKeystore*,
|
Function,-,subghz_keystore_alloc,SubGhzKeystore*,
|
||||||
Function,-,subghz_keystore_free,void,SubGhzKeystore*
|
Function,-,subghz_keystore_free,void,SubGhzKeystore*
|
||||||
Function,-,subghz_keystore_get_data,SubGhzKeyArray_t*,SubGhzKeystore*
|
Function,-,subghz_keystore_get_data,SubGhzKeyArray_t*,SubGhzKeystore*
|
||||||
@@ -3440,6 +3476,12 @@ Function,+,variable_item_list_set_selected_item,void,"VariableItemList*, uint8_t
|
|||||||
Function,+,variable_item_set_current_value_index,void,"VariableItem*, uint8_t"
|
Function,+,variable_item_set_current_value_index,void,"VariableItem*, uint8_t"
|
||||||
Function,+,variable_item_set_current_value_text,void,"VariableItem*, const char*"
|
Function,+,variable_item_set_current_value_text,void,"VariableItem*, const char*"
|
||||||
Function,+,variable_item_set_values_count,void,"VariableItem*, uint8_t"
|
Function,+,variable_item_set_values_count,void,"VariableItem*, uint8_t"
|
||||||
|
Function,+,varint_int32_length,size_t,int32_t
|
||||||
|
Function,+,varint_int32_pack,size_t,"int32_t, uint8_t*"
|
||||||
|
Function,+,varint_int32_unpack,size_t,"int32_t*, const uint8_t*, size_t"
|
||||||
|
Function,+,varint_uint32_length,size_t,uint32_t
|
||||||
|
Function,+,varint_uint32_pack,size_t,"uint32_t, uint8_t*"
|
||||||
|
Function,+,varint_uint32_unpack,size_t,"uint32_t*, const uint8_t*, size_t"
|
||||||
Function,-,vasiprintf,int,"char**, const char*, __gnuc_va_list"
|
Function,-,vasiprintf,int,"char**, const char*, __gnuc_va_list"
|
||||||
Function,-,vasniprintf,char*,"char*, size_t*, const char*, __gnuc_va_list"
|
Function,-,vasniprintf,char*,"char*, size_t*, const char*, __gnuc_va_list"
|
||||||
Function,-,vasnprintf,char*,"char*, size_t*, const char*, __gnuc_va_list"
|
Function,-,vasnprintf,char*,"char*, size_t*, const char*, __gnuc_va_list"
|
||||||
|
|||||||
|
@@ -184,6 +184,7 @@ static usbd_device* usb_dev;
|
|||||||
static bool connected = false;
|
static bool connected = false;
|
||||||
static bool smartcard_inserted = true;
|
static bool smartcard_inserted = true;
|
||||||
static CcidCallbacks* callbacks[CCID_TOTAL_SLOTS] = {NULL};
|
static CcidCallbacks* callbacks[CCID_TOTAL_SLOTS] = {NULL};
|
||||||
|
static void* cb_ctx[CCID_TOTAL_SLOTS];
|
||||||
|
|
||||||
static void* ccid_set_string_descr(char* str) {
|
static void* ccid_set_string_descr(char* str) {
|
||||||
furi_check(str);
|
furi_check(str);
|
||||||
@@ -330,7 +331,9 @@ void CALLBACK_CCID_IccPowerOn(
|
|||||||
if(smartcard_inserted) {
|
if(smartcard_inserted) {
|
||||||
if(callbacks[CCID_SLOT_INDEX] != NULL) {
|
if(callbacks[CCID_SLOT_INDEX] != NULL) {
|
||||||
callbacks[CCID_SLOT_INDEX]->icc_power_on_callback(
|
callbacks[CCID_SLOT_INDEX]->icc_power_on_callback(
|
||||||
responseDataBlock->abData, &responseDataBlock->dwLength, NULL);
|
responseDataBlock->abData,
|
||||||
|
&responseDataBlock->dwLength,
|
||||||
|
cb_ctx[CCID_SLOT_INDEX]);
|
||||||
responseDataBlock->bStatus = CCID_COMMANDSTATUS_PROCESSEDWITHOUTERROR |
|
responseDataBlock->bStatus = CCID_COMMANDSTATUS_PROCESSEDWITHOUTERROR |
|
||||||
CCID_ICCSTATUS_PRESENTANDACTIVE;
|
CCID_ICCSTATUS_PRESENTANDACTIVE;
|
||||||
} else {
|
} else {
|
||||||
@@ -364,7 +367,7 @@ void CALLBACK_CCID_XfrBlock(
|
|||||||
receivedXfrBlock->dwLength,
|
receivedXfrBlock->dwLength,
|
||||||
responseDataBlock->abData,
|
responseDataBlock->abData,
|
||||||
&responseDataBlock->dwLength,
|
&responseDataBlock->dwLength,
|
||||||
NULL);
|
cb_ctx[CCID_SLOT_INDEX]);
|
||||||
responseDataBlock->bStatus = CCID_COMMANDSTATUS_PROCESSEDWITHOUTERROR |
|
responseDataBlock->bStatus = CCID_COMMANDSTATUS_PROCESSEDWITHOUTERROR |
|
||||||
CCID_ICCSTATUS_PRESENTANDACTIVE;
|
CCID_ICCSTATUS_PRESENTANDACTIVE;
|
||||||
} else {
|
} else {
|
||||||
@@ -389,8 +392,9 @@ void furi_hal_ccid_ccid_remove_smartcard(void) {
|
|||||||
smartcard_inserted = false;
|
smartcard_inserted = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void furi_hal_ccid_set_callbacks(CcidCallbacks* cb) {
|
void furi_hal_ccid_set_callbacks(CcidCallbacks* cb, void* context) {
|
||||||
callbacks[CCID_SLOT_INDEX] = cb;
|
callbacks[CCID_SLOT_INDEX] = cb;
|
||||||
|
cb_ctx[CCID_SLOT_INDEX] = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ccid_rx_ep_callback(usbd_device* dev, uint8_t event, uint8_t ep) {
|
static void ccid_rx_ep_callback(usbd_device* dev, uint8_t event, uint8_t ep) {
|
||||||
|
|||||||
@@ -19,14 +19,14 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
void (*icc_power_on_callback)(uint8_t* dataBlock, uint32_t* dataBlockLen, void* context);
|
void (*icc_power_on_callback)(uint8_t* dataBlock, uint32_t* dataBlockLen, void* context);
|
||||||
void (*xfr_datablock_callback)(
|
void (*xfr_datablock_callback)(
|
||||||
const uint8_t* dataBlock,
|
const uint8_t* pcToReaderDataBlock,
|
||||||
uint32_t dataBlockLen,
|
uint32_t pcToReaderDataBlockLen,
|
||||||
uint8_t* responseDataBlock,
|
uint8_t* readerToPcDataBlock,
|
||||||
uint32_t* responseDataBlockLen,
|
uint32_t* readerToPcDataBlockLen,
|
||||||
void* context);
|
void* context);
|
||||||
} CcidCallbacks;
|
} CcidCallbacks;
|
||||||
|
|
||||||
void furi_hal_ccid_set_callbacks(CcidCallbacks* cb);
|
void furi_hal_ccid_set_callbacks(CcidCallbacks* cb, void* context);
|
||||||
|
|
||||||
void furi_hal_ccid_ccid_insert_smartcard(void);
|
void furi_hal_ccid_ccid_insert_smartcard(void);
|
||||||
void furi_hal_ccid_ccid_remove_smartcard(void);
|
void furi_hal_ccid_ccid_remove_smartcard(void);
|
||||||
|
|||||||
Reference in New Issue
Block a user