Update TinyUSB and close device endpoints
This commit is contained in:
parent
70fe5cdbe3
commit
ca063ae563
5 changed files with 40 additions and 5 deletions
|
|
@ -1 +1 @@
|
|||
Subproject commit 6bba41045a4224abb68256dcf2fce893da47a743
|
||||
Subproject commit 8c1802e41d37c915334a19b859b24cb2a1b48ee5
|
||||
|
|
@ -1 +1 @@
|
|||
Subproject commit 1862cc008e026cbd07b97b28e29eafb5f38b35fb
|
||||
Subproject commit e0aba546813d89cb7f321bef3363bfba5f282e14
|
||||
|
|
@ -39,6 +39,7 @@
|
|||
|
||||
#include "py/objproperty.h"
|
||||
#include "shared-bindings/usb/core/Device.h"
|
||||
#include "shared-bindings/util.h"
|
||||
#include "py/runtime.h"
|
||||
|
||||
//| class Device:
|
||||
|
|
@ -49,6 +50,12 @@
|
|||
//| ...
|
||||
//|
|
||||
|
||||
static void check_for_deinit(usb_core_device_obj_t *self) {
|
||||
if (common_hal_usb_core_device_deinited(self)) {
|
||||
raise_deinited_error();
|
||||
}
|
||||
}
|
||||
|
||||
//| def __del__(self) -> None:
|
||||
//| """Closes any resources used for this device."""
|
||||
//| ...
|
||||
|
|
@ -64,6 +71,7 @@ static MP_DEFINE_CONST_FUN_OBJ_1(usb_core_device_deinit_obj, usb_core_device_dei
|
|||
//| """The USB vendor ID of the device"""
|
||||
static mp_obj_t usb_core_device_obj_get_idVendor(mp_obj_t self_in) {
|
||||
usb_core_device_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||
check_for_deinit(self);
|
||||
return MP_OBJ_NEW_SMALL_INT(common_hal_usb_core_device_get_idVendor(self));
|
||||
}
|
||||
MP_DEFINE_CONST_FUN_OBJ_1(usb_core_device_get_idVendor_obj, usb_core_device_obj_get_idVendor);
|
||||
|
|
@ -75,6 +83,7 @@ MP_PROPERTY_GETTER(usb_core_device_idVendor_obj,
|
|||
//| """The USB product ID of the device"""
|
||||
static mp_obj_t usb_core_device_obj_get_idProduct(mp_obj_t self_in) {
|
||||
usb_core_device_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||
check_for_deinit(self);
|
||||
return MP_OBJ_NEW_SMALL_INT(common_hal_usb_core_device_get_idProduct(self));
|
||||
}
|
||||
MP_DEFINE_CONST_FUN_OBJ_1(usb_core_device_get_idProduct_obj, usb_core_device_obj_get_idProduct);
|
||||
|
|
@ -86,6 +95,7 @@ MP_PROPERTY_GETTER(usb_core_device_idProduct_obj,
|
|||
//| """The USB device's serial number string."""
|
||||
static mp_obj_t usb_core_device_obj_get_serial_number(mp_obj_t self_in) {
|
||||
usb_core_device_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||
check_for_deinit(self);
|
||||
return common_hal_usb_core_device_get_serial_number(self);
|
||||
}
|
||||
MP_DEFINE_CONST_FUN_OBJ_1(usb_core_device_get_serial_number_obj, usb_core_device_obj_get_serial_number);
|
||||
|
|
@ -97,6 +107,7 @@ MP_PROPERTY_GETTER(usb_core_device_serial_number_obj,
|
|||
//| """The USB device's product string."""
|
||||
static mp_obj_t usb_core_device_obj_get_product(mp_obj_t self_in) {
|
||||
usb_core_device_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||
check_for_deinit(self);
|
||||
return common_hal_usb_core_device_get_product(self);
|
||||
}
|
||||
MP_DEFINE_CONST_FUN_OBJ_1(usb_core_device_get_product_obj, usb_core_device_obj_get_product);
|
||||
|
|
@ -109,6 +120,7 @@ MP_PROPERTY_GETTER(usb_core_device_product_obj,
|
|||
//|
|
||||
static mp_obj_t usb_core_device_obj_get_manufacturer(mp_obj_t self_in) {
|
||||
usb_core_device_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||
check_for_deinit(self);
|
||||
return common_hal_usb_core_device_get_manufacturer(self);
|
||||
}
|
||||
MP_DEFINE_CONST_FUN_OBJ_1(usb_core_device_get_manufacturer_obj, usb_core_device_obj_get_manufacturer);
|
||||
|
|
@ -121,6 +133,7 @@ MP_PROPERTY_GETTER(usb_core_device_manufacturer_obj,
|
|||
//|
|
||||
static mp_obj_t usb_core_device_obj_get_bus(mp_obj_t self_in) {
|
||||
usb_core_device_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||
check_for_deinit(self);
|
||||
return MP_OBJ_NEW_SMALL_INT(common_hal_usb_core_device_get_bus(self));
|
||||
}
|
||||
MP_DEFINE_CONST_FUN_OBJ_1(usb_core_device_get_bus_obj, usb_core_device_obj_get_bus);
|
||||
|
|
@ -134,6 +147,7 @@ MP_PROPERTY_GETTER(usb_core_device_bus_obj,
|
|||
//|
|
||||
static mp_obj_t usb_core_device_obj_get_port_numbers(mp_obj_t self_in) {
|
||||
usb_core_device_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||
check_for_deinit(self);
|
||||
return common_hal_usb_core_device_get_port_numbers(self);
|
||||
}
|
||||
MP_DEFINE_CONST_FUN_OBJ_1(usb_core_device_get_port_numbers_obj, usb_core_device_obj_get_port_numbers);
|
||||
|
|
@ -147,6 +161,7 @@ MP_PROPERTY_GETTER(usb_core_device_port_numbers_obj,
|
|||
//|
|
||||
static mp_obj_t usb_core_device_obj_get_speed(mp_obj_t self_in) {
|
||||
usb_core_device_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||
check_for_deinit(self);
|
||||
return MP_OBJ_NEW_SMALL_INT(common_hal_usb_core_device_get_speed(self));
|
||||
}
|
||||
MP_DEFINE_CONST_FUN_OBJ_1(usb_core_device_get_speed_obj, usb_core_device_obj_get_speed);
|
||||
|
|
@ -171,6 +186,7 @@ static mp_obj_t usb_core_device_set_configuration(size_t n_args, const mp_obj_t
|
|||
{ MP_QSTR_configuration, MP_ARG_INT, {.u_int = 1} },
|
||||
};
|
||||
usb_core_device_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
|
||||
check_for_deinit(self);
|
||||
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
||||
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
||||
|
||||
|
|
@ -197,6 +213,7 @@ static mp_obj_t usb_core_device_write(size_t n_args, const mp_obj_t *pos_args, m
|
|||
{ MP_QSTR_timeout, MP_ARG_INT, {.u_int = 0} },
|
||||
};
|
||||
usb_core_device_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
|
||||
check_for_deinit(self);
|
||||
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
||||
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
||||
|
||||
|
|
@ -228,6 +245,7 @@ static mp_obj_t usb_core_device_read(size_t n_args, const mp_obj_t *pos_args, mp
|
|||
{ MP_QSTR_timeout, MP_ARG_INT, {.u_int = 0} },
|
||||
};
|
||||
usb_core_device_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
|
||||
check_for_deinit(self);
|
||||
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
||||
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
||||
|
||||
|
|
@ -277,6 +295,7 @@ static mp_obj_t usb_core_device_ctrl_transfer(size_t n_args, const mp_obj_t *pos
|
|||
{ MP_QSTR_timeout, MP_ARG_INT, {.u_int = 0} },
|
||||
};
|
||||
usb_core_device_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
|
||||
check_for_deinit(self);
|
||||
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
||||
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
||||
|
||||
|
|
@ -310,6 +329,7 @@ MP_DEFINE_CONST_FUN_OBJ_KW(usb_core_device_ctrl_transfer_obj, 2, usb_core_device
|
|||
//|
|
||||
static mp_obj_t usb_core_device_is_kernel_driver_active(mp_obj_t self_in, mp_obj_t interface_in) {
|
||||
usb_core_device_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||
check_for_deinit(self);
|
||||
mp_int_t interface = mp_obj_get_int(interface_in);
|
||||
bool active = common_hal_usb_core_device_is_kernel_driver_active(self, interface);
|
||||
return mp_obj_new_bool(active);
|
||||
|
|
@ -327,6 +347,7 @@ MP_DEFINE_CONST_FUN_OBJ_2(usb_core_device_is_kernel_driver_active_obj, usb_core_
|
|||
//|
|
||||
static mp_obj_t usb_core_device_detach_kernel_driver(mp_obj_t self_in, mp_obj_t interface_in) {
|
||||
usb_core_device_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||
check_for_deinit(self);
|
||||
mp_int_t interface = mp_obj_get_int(interface_in);
|
||||
common_hal_usb_core_device_detach_kernel_driver(self, interface);
|
||||
return mp_const_none;
|
||||
|
|
@ -343,6 +364,7 @@ MP_DEFINE_CONST_FUN_OBJ_2(usb_core_device_detach_kernel_driver_obj, usb_core_dev
|
|||
//|
|
||||
static mp_obj_t usb_core_device_attach_kernel_driver(mp_obj_t self_in, mp_obj_t interface_in) {
|
||||
usb_core_device_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||
check_for_deinit(self);
|
||||
mp_int_t interface = mp_obj_get_int(interface_in);
|
||||
common_hal_usb_core_device_attach_kernel_driver(self, interface);
|
||||
return mp_const_none;
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
extern const mp_obj_type_t usb_core_device_type;
|
||||
|
||||
bool common_hal_usb_core_device_construct(usb_core_device_obj_t *self, uint8_t device_number);
|
||||
bool common_hal_usb_core_device_deinited(usb_core_device_obj_t *self);
|
||||
void common_hal_usb_core_device_deinit(usb_core_device_obj_t *self);
|
||||
uint16_t common_hal_usb_core_device_get_idVendor(usb_core_device_obj_t *self);
|
||||
uint16_t common_hal_usb_core_device_get_idProduct(usb_core_device_obj_t *self);
|
||||
|
|
|
|||
|
|
@ -49,10 +49,22 @@ bool common_hal_usb_core_device_construct(usb_core_device_obj_t *self, uint8_t d
|
|||
return true;
|
||||
}
|
||||
|
||||
bool common_hal_usb_core_device_deinited(usb_core_device_obj_t *self) {
|
||||
return self->device_address == 0;
|
||||
}
|
||||
|
||||
void common_hal_usb_core_device_deinit(usb_core_device_obj_t *self) {
|
||||
// TODO: Close all of the endpoints we've opened. Some drivers store state
|
||||
// for each open endpoint. If we don't close them, then we'll leak memory.
|
||||
// Waiting for TinyUSB to add this.
|
||||
if (common_hal_usb_core_device_deinited(self)) {
|
||||
return;
|
||||
}
|
||||
size_t open_size = sizeof(self->open_endpoints);
|
||||
for (size_t i = 0; i < open_size; i++) {
|
||||
if (self->open_endpoints[i] != 0) {
|
||||
tuh_edpt_close(self->device_address, self->open_endpoints[i]);
|
||||
self->open_endpoints[i] = 0;
|
||||
}
|
||||
}
|
||||
self->device_address = 0;
|
||||
}
|
||||
|
||||
uint16_t common_hal_usb_core_device_get_idVendor(usb_core_device_obj_t *self) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue