diff --git a/applications/main/bad_usb/bad_usb_app_i.h b/applications/main/bad_usb/bad_usb_app_i.h index b34bd5de6..93c24ea8c 100644 --- a/applications/main/bad_usb/bad_usb_app_i.h +++ b/applications/main/bad_usb/bad_usb_app_i.h @@ -44,7 +44,7 @@ struct BadUsbApp { BadUsbScript* bad_usb_script; BadUsbHidInterface interface; - FuriHalUsbInterface* usb_if_prev; + const FuriHalUsbInterface* usb_if_prev; }; typedef enum { diff --git a/applications/main/u2f/u2f_hid.c b/applications/main/u2f/u2f_hid.c index 76d3d7cec..a1b614b19 100644 --- a/applications/main/u2f/u2f_hid.c +++ b/applications/main/u2f/u2f_hid.c @@ -189,7 +189,7 @@ static int32_t u2f_hid_worker(void* context) { FURI_LOG_D(WORKER_TAG, "Init"); - FuriHalUsbInterface* usb_mode_prev = furi_hal_usb_get_config(); + const FuriHalUsbInterface* usb_mode_prev = furi_hal_usb_get_config(); furi_check(furi_hal_usb_set_config(&usb_hid_u2f, NULL) == true); u2f_hid->lock_timer = diff --git a/applications/services/cli/cli_vcp.c b/applications/services/cli/cli_vcp.c index 39802bd79..bc4ea592a 100644 --- a/applications/services/cli/cli_vcp.c +++ b/applications/services/cli/cli_vcp.c @@ -40,7 +40,7 @@ typedef struct { volatile bool connected; volatile bool running; - FuriHalUsbInterface* usb_if_prev; + const FuriHalUsbInterface* usb_if_prev; uint8_t data_buffer[USB_CDC_PKT_LEN]; } CliVcp; diff --git a/applications/system/hid_app/hid.c b/applications/system/hid_app/hid.c index 15c49e3b0..9f3a246ef 100644 --- a/applications/system/hid_app/hid.c +++ b/applications/system/hid_app/hid.c @@ -174,7 +174,7 @@ int32_t hid_usb_app(void* p) { FURI_LOG_D("HID", "Starting as USB app"); - FuriHalUsbInterface* usb_mode_prev = furi_hal_usb_get_config(); + const FuriHalUsbInterface* usb_mode_prev = furi_hal_usb_get_config(); furi_hal_usb_unlock(); furi_check(furi_hal_usb_set_config(&usb_hid, NULL) == true); diff --git a/applications/system/js_app/modules/js_badusb.c b/applications/system/js_app/modules/js_badusb.c index 27f38cbda..880bbdc48 100644 --- a/applications/system/js_app/modules/js_badusb.c +++ b/applications/system/js_app/modules/js_badusb.c @@ -7,7 +7,7 @@ typedef struct { FuriHalUsbHidConfig* hid_cfg; uint16_t layout[128]; - FuriHalUsbInterface* usb_if_prev; + const FuriHalUsbInterface* usb_if_prev; uint8_t key_hold_cnt; } JsBadusbInst; diff --git a/targets/f18/api_symbols.csv b/targets/f18/api_symbols.csv index a95ba0f5e..27d0fe38c 100644 --- a/targets/f18/api_symbols.csv +++ b/targets/f18/api_symbols.csv @@ -1489,12 +1489,12 @@ Function,+,furi_hal_usb_ccid_remove_smartcard,void, Function,+,furi_hal_usb_ccid_set_callbacks,void,"CcidCallbacks*, void*" Function,+,furi_hal_usb_disable,void, Function,+,furi_hal_usb_enable,void, -Function,+,furi_hal_usb_get_config,FuriHalUsbInterface*, +Function,+,furi_hal_usb_get_config,const FuriHalUsbInterface*, Function,-,furi_hal_usb_init,void, Function,+,furi_hal_usb_is_locked,_Bool, Function,+,furi_hal_usb_lock,void, Function,+,furi_hal_usb_reinit,void, -Function,+,furi_hal_usb_set_config,_Bool,"FuriHalUsbInterface*, void*" +Function,+,furi_hal_usb_set_config,_Bool,"const FuriHalUsbInterface*, void*" Function,-,furi_hal_usb_set_state_callback,void,"FuriHalUsbStateCallback, void*" Function,+,furi_hal_usb_unlock,void, Function,+,furi_hal_version_do_i_belong_here,_Bool, diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index b09803e40..b9e555339 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -1709,12 +1709,12 @@ Function,+,furi_hal_usb_ccid_remove_smartcard,void, Function,+,furi_hal_usb_ccid_set_callbacks,void,"CcidCallbacks*, void*" Function,+,furi_hal_usb_disable,void, Function,+,furi_hal_usb_enable,void, -Function,+,furi_hal_usb_get_config,FuriHalUsbInterface*, +Function,+,furi_hal_usb_get_config,const FuriHalUsbInterface*, Function,-,furi_hal_usb_init,void, Function,+,furi_hal_usb_is_locked,_Bool, Function,+,furi_hal_usb_lock,void, Function,+,furi_hal_usb_reinit,void, -Function,+,furi_hal_usb_set_config,_Bool,"FuriHalUsbInterface*, void*" +Function,+,furi_hal_usb_set_config,_Bool,"const FuriHalUsbInterface*, void*" Function,-,furi_hal_usb_set_state_callback,void,"FuriHalUsbStateCallback, void*" Function,+,furi_hal_usb_unlock,void, Function,+,furi_hal_version_do_i_belong_here,_Bool, diff --git a/targets/f7/furi_hal/furi_hal_usb.c b/targets/f7/furi_hal/furi_hal_usb.c index 22d1523b6..03e92cc16 100644 --- a/targets/f7/furi_hal/furi_hal_usb.c +++ b/targets/f7/furi_hal/furi_hal_usb.c @@ -32,7 +32,7 @@ typedef struct { } UsbApiEventDataStateCallback; typedef struct { - FuriHalUsbInterface* interface; + const FuriHalUsbInterface* interface; void* context; } UsbApiEventDataInterface; @@ -43,7 +43,7 @@ typedef union { typedef union { bool bool_value; - void* void_value; + const void* void_value; } UsbApiEventReturnData; typedef struct { @@ -60,7 +60,7 @@ typedef struct { bool connected; bool mode_lock; bool request_pending; - FuriHalUsbInterface* interface; + const FuriHalUsbInterface* interface; void* interface_context; FuriHalUsbStateCallback callback; void* callback_context; @@ -132,7 +132,7 @@ static void furi_hal_usb_send_message(UsbApiEventMessage* message) { api_lock_wait_unlock_and_free(message->lock); } -bool furi_hal_usb_set_config(FuriHalUsbInterface* new_if, void* ctx) { +bool furi_hal_usb_set_config(const FuriHalUsbInterface* new_if, void* ctx) { UsbApiEventReturnData return_data = { .bool_value = false, }; @@ -152,7 +152,7 @@ bool furi_hal_usb_set_config(FuriHalUsbInterface* new_if, void* ctx) { return return_data.bool_value; } -FuriHalUsbInterface* furi_hal_usb_get_config(void) { +const FuriHalUsbInterface* furi_hal_usb_get_config(void) { UsbApiEventReturnData return_data = { .void_value = NULL, }; @@ -326,7 +326,7 @@ static void wkup_evt(usbd_device* dev, uint8_t event, uint8_t ep) { } } -static void usb_process_mode_start(FuriHalUsbInterface* interface, void* context) { +static void usb_process_mode_start(const FuriHalUsbInterface* interface, void* context) { if(usb.interface != NULL) { usb.interface->deinit(&udev); } @@ -344,7 +344,7 @@ static void usb_process_mode_start(FuriHalUsbInterface* interface, void* context } } -static void usb_process_mode_change(FuriHalUsbInterface* interface, void* context) { +static void usb_process_mode_change(const FuriHalUsbInterface* interface, void* context) { if((interface != usb.interface) || (context != usb.interface_context)) { if(usb.enabled) { // Disable current interface @@ -374,7 +374,7 @@ static void usb_process_mode_reinit(void) { usb_process_mode_start(usb.interface, usb.interface_context); } -static bool usb_process_set_config(FuriHalUsbInterface* interface, void* context) { +static bool usb_process_set_config(const FuriHalUsbInterface* interface, void* context) { if(usb.mode_lock) { return false; } else { diff --git a/targets/f7/furi_hal/furi_hal_usb_ccid.c b/targets/f7/furi_hal/furi_hal_usb_ccid.c index a2c1a0583..5725c70cf 100644 --- a/targets/f7/furi_hal/furi_hal_usb_ccid.c +++ b/targets/f7/furi_hal/furi_hal_usb_ccid.c @@ -170,7 +170,7 @@ static const struct CcidConfigDescriptor ccid_cfg_desc = { }, }; -static void ccid_init(usbd_device* dev, FuriHalUsbInterface* intf, void* ctx); +static void ccid_init(usbd_device* dev, const FuriHalUsbInterface* intf, void* ctx); static void ccid_deinit(usbd_device* dev); static void ccid_on_wakeup(usbd_device* dev); static void ccid_on_suspend(usbd_device* dev); @@ -223,7 +223,7 @@ static void* ccid_set_string_descr(char* str) { return dev_str_desc; } -static void ccid_init(usbd_device* dev, FuriHalUsbInterface* intf, void* ctx) { +static void ccid_init(usbd_device* dev, const FuriHalUsbInterface* intf, void* ctx) { UNUSED(intf); FuriHalUsbCcidConfig* cfg = (FuriHalUsbCcidConfig*)ctx; diff --git a/targets/f7/furi_hal/furi_hal_usb_cdc.c b/targets/f7/furi_hal/furi_hal_usb_cdc.c index f9c1d3a42..62c43ea64 100644 --- a/targets/f7/furi_hal/furi_hal_usb_cdc.c +++ b/targets/f7/furi_hal/furi_hal_usb_cdc.c @@ -385,7 +385,7 @@ static const struct CdcConfigDescriptorDual static struct usb_cdc_line_coding cdc_config[IF_NUM_MAX] = {}; static uint8_t cdc_ctrl_line_state[IF_NUM_MAX]; -static void cdc_init(usbd_device* dev, FuriHalUsbInterface* intf, void* ctx); +static void cdc_init(usbd_device* dev, const FuriHalUsbInterface* intf, void* ctx); static void cdc_deinit(usbd_device* dev); static void cdc_on_wakeup(usbd_device* dev); static void cdc_on_suspend(usbd_device* dev); @@ -429,10 +429,11 @@ FuriHalUsbInterface usb_cdc_dual = { .cfg_descr = (void*)&cdc_cfg_desc_dual, }; -static void cdc_init(usbd_device* dev, FuriHalUsbInterface* intf, void* ctx) { +static void cdc_init(usbd_device* dev, const FuriHalUsbInterface* intf, void* ctx) { UNUSED(ctx); usb_dev = dev; - cdc_if_cur = intf; + cdc_if_cur = malloc(sizeof(FuriHalUsbInterface)); + memcpy((void*)cdc_if_cur, intf, sizeof(FuriHalUsbInterface)); char* name = (char*)furi_hal_version_get_device_name_ptr(); uint8_t len = (name == NULL) ? (0) : (strlen(name)); @@ -469,6 +470,7 @@ static void cdc_deinit(usbd_device* dev) { free(cdc_if_cur->str_prod_descr); free(cdc_if_cur->str_serial_descr); + free((void*)cdc_if_cur); cdc_if_cur = NULL; } diff --git a/targets/f7/furi_hal/furi_hal_usb_hid.c b/targets/f7/furi_hal/furi_hal_usb_hid.c index c83261226..cad8f040b 100644 --- a/targets/f7/furi_hal/furi_hal_usb_hid.c +++ b/targets/f7/furi_hal/furi_hal_usb_hid.c @@ -226,7 +226,7 @@ static struct HidReport { struct HidReportConsumer consumer; } FURI_PACKED hid_report; -static void hid_init(usbd_device* dev, FuriHalUsbInterface* intf, void* ctx); +static void hid_init(usbd_device* dev, const FuriHalUsbInterface* intf, void* ctx); static void hid_deinit(usbd_device* dev); static void hid_on_wakeup(usbd_device* dev); static void hid_on_suspend(usbd_device* dev); @@ -374,7 +374,7 @@ static void* hid_set_string_descr(char* str) { return dev_str_desc; } -static void hid_init(usbd_device* dev, FuriHalUsbInterface* intf, void* ctx) { +static void hid_init(usbd_device* dev, const FuriHalUsbInterface* intf, void* ctx) { UNUSED(intf); FuriHalUsbHidConfig* cfg = (FuriHalUsbHidConfig*)ctx; if(hid_semaphore == NULL) hid_semaphore = furi_semaphore_alloc(1, 1); diff --git a/targets/f7/furi_hal/furi_hal_usb_u2f.c b/targets/f7/furi_hal/furi_hal_usb_u2f.c index 82aeaf6d7..2c0ad7694 100644 --- a/targets/f7/furi_hal/furi_hal_usb_u2f.c +++ b/targets/f7/furi_hal/furi_hal_usb_u2f.c @@ -137,7 +137,7 @@ static const struct HidConfigDescriptor hid_u2f_cfg_desc = { }, }; -static void hid_u2f_init(usbd_device* dev, FuriHalUsbInterface* intf, void* ctx); +static void hid_u2f_init(usbd_device* dev, const FuriHalUsbInterface* intf, void* ctx); static void hid_u2f_deinit(usbd_device* dev); static void hid_u2f_on_wakeup(usbd_device* dev); static void hid_u2f_on_suspend(usbd_device* dev); @@ -189,7 +189,7 @@ const FuriHalUsbInterface usb_hid_u2f = { .cfg_descr = (void*)&hid_u2f_cfg_desc, }; -static void hid_u2f_init(usbd_device* dev, FuriHalUsbInterface* intf, void* ctx) { +static void hid_u2f_init(usbd_device* dev, const FuriHalUsbInterface* intf, void* ctx) { UNUSED(intf); UNUSED(ctx); if(hid_u2f_semaphore == NULL) { diff --git a/targets/furi_hal_include/furi_hal_usb.h b/targets/furi_hal_include/furi_hal_usb.h index dc4e3eaad..03c5247c5 100644 --- a/targets/furi_hal_include/furi_hal_usb.h +++ b/targets/furi_hal_include/furi_hal_usb.h @@ -9,7 +9,7 @@ extern "C" { typedef struct FuriHalUsbInterface FuriHalUsbInterface; struct FuriHalUsbInterface { - void (*init)(usbd_device* dev, FuriHalUsbInterface* intf, void* ctx); + void (*init)(usbd_device* dev, const FuriHalUsbInterface* intf, void* ctx); void (*deinit)(usbd_device* dev); void (*wakeup)(usbd_device* dev); void (*suspend)(usbd_device* dev); @@ -49,13 +49,13 @@ void furi_hal_usb_init(void); * @param ctx context passed to device mode init function * @return true - mode switch started, false - mode switch is locked */ -bool furi_hal_usb_set_config(FuriHalUsbInterface* new_if, void* ctx); +bool furi_hal_usb_set_config(const FuriHalUsbInterface* new_if, void* ctx); /** Get USB device configuration * * @return current USB device mode */ -FuriHalUsbInterface* furi_hal_usb_get_config(void); +const FuriHalUsbInterface* furi_hal_usb_get_config(void); /** Lock USB device mode switch */