usb-bus c -> c++ wip
Change-Id: I08fff42facc2dcf8b23ebadaee6015bf16353d23
diff --git a/system/dev/usb/usb-bus/rules.mk b/system/dev/usb/usb-bus/rules.mk
index d9c0df6..34fd27d 100644
--- a/system/dev/usb/usb-bus/rules.mk
+++ b/system/dev/usb/usb-bus/rules.mk
@@ -9,13 +9,14 @@
MODULE_TYPE := driver
MODULE_SRCS := \
- $(LOCAL_DIR)/usb-bus.c \
- $(LOCAL_DIR)/usb-device.c \
- $(LOCAL_DIR)/util.c \
+ $(LOCAL_DIR)/usb-bus.cpp \
+ $(LOCAL_DIR)/usb-device.cpp \
+ $(LOCAL_DIR)/util.cpp \
MODULE_STATIC_LIBS := \
system/dev/lib/usb \
system/ulib/ddk \
+ system/ulib/fbl \
system/ulib/fidl \
system/ulib/sync \
system/ulib/utf_conversion \
diff --git a/system/dev/usb/usb-bus/usb-bus.c b/system/dev/usb/usb-bus/usb-bus.cpp
similarity index 87%
rename from system/dev/usb/usb-bus/usb-bus.c
rename to system/dev/usb/usb-bus/usb-bus.cpp
index c7618b7..29d9506 100644
--- a/system/dev/usb/usb-bus/usb-bus.c
+++ b/system/dev/usb/usb-bus/usb-bus.cpp
@@ -14,7 +14,7 @@
static zx_status_t bus_add_device(void* ctx, uint32_t device_id, uint32_t hub_id,
usb_speed_t speed) {
- usb_bus_t* bus = ctx;
+ auto* bus = static_cast<usb_bus_t*>(ctx);
if (device_id >= bus->max_device_count) return ZX_ERR_INVALID_ARGS;
@@ -24,7 +24,7 @@
}
static zx_status_t bus_remove_device(void* ctx, uint32_t device_id) {
- usb_bus_t* bus = ctx;
+ auto* bus = static_cast<usb_bus_t*>(ctx);
if (device_id >= bus->max_device_count) {
zxlogf(ERROR, "device_id out of range in usb_bus_remove_device\n");
return ZX_ERR_INVALID_ARGS;
@@ -39,7 +39,7 @@
}
static zx_status_t bus_reset_hub_port(void* ctx, uint32_t hub_id, uint32_t port) {
- usb_bus_t* bus = ctx;
+ auto* bus = static_cast<usb_bus_t*>(ctx);
if (hub_id >= bus->max_device_count) {
zxlogf(ERROR, "hub_id out of range in usb_bus_reset_hub_port\n");
return ZX_ERR_INVALID_ARGS;
@@ -73,7 +73,7 @@
static zx_status_t bus_configure_hub(void* ctx, zx_device_t* hub_device, usb_speed_t speed,
const usb_hub_descriptor_t* desc) {
- usb_bus_t* bus = ctx;
+ auto* bus = static_cast<usb_bus_t*>(ctx);
uint32_t hub_id;
if (bus_get_device_id(hub_device, &hub_id) != ZX_OK) {
return ZX_ERR_INTERNAL;
@@ -83,7 +83,7 @@
static zx_status_t bus_device_added(void* ctx, zx_device_t* hub_device, uint32_t port,
usb_speed_t speed) {
- usb_bus_t* bus = ctx;
+ auto* bus = static_cast<usb_bus_t*>(ctx);
uint32_t hub_id;
if (bus_get_device_id(hub_device, &hub_id) != ZX_OK) {
return ZX_ERR_INTERNAL;
@@ -92,7 +92,7 @@
}
static zx_status_t bus_device_removed(void* ctx, zx_device_t* hub_device, uint32_t port) {
- usb_bus_t* bus = ctx;
+ auto* bus = static_cast<usb_bus_t*>(ctx);
uint32_t hub_id;
if (bus_get_device_id(hub_device, &hub_id) != ZX_OK) {
return ZX_ERR_INTERNAL;
@@ -102,7 +102,7 @@
static zx_status_t bus_set_hub_interface(void* ctx, zx_device_t* usb_device,
const usb_hub_interface_t* hub) {
- usb_bus_t* bus = ctx;
+ auto* bus = static_cast<usb_bus_t*>(ctx);
uint32_t usb_device_id;
if (bus_get_device_id(usb_device, &usb_device_id) != ZX_OK) {
return ZX_ERR_INTERNAL;
@@ -125,7 +125,7 @@
static void usb_bus_unbind(void* ctx) {
zxlogf(INFO, "usb_bus_unbind\n");
- usb_bus_t* bus = ctx;
+ auto* bus = static_cast<usb_bus_t*>(ctx);
usb_hci_set_bus_interface(&bus->hci, NULL);
for (size_t i = 0; i < bus->max_device_count; i++) {
@@ -140,19 +140,21 @@
static void usb_bus_release(void* ctx) {
zxlogf(INFO, "usb_bus_release\n");
- usb_bus_t* bus = ctx;
+ auto* bus = static_cast<usb_bus_t*>(ctx);
free(bus->devices);
free(bus);
}
-static zx_protocol_device_t usb_bus_device_proto = {
- .version = DEVICE_OPS_VERSION,
- .unbind = usb_bus_unbind,
- .release = usb_bus_release,
-};
+static zx_protocol_device_t usb_bus_device_proto = [](){
+ zx_protocol_device_t proto;
+ proto.version = DEVICE_OPS_VERSION;
+ proto.unbind = usb_bus_unbind;
+ proto.release = usb_bus_release;
+ return proto;
+}();
static zx_status_t usb_bus_bind(void* ctx, zx_device_t* device) {
- usb_bus_t* bus = calloc(1, sizeof(usb_bus_t));
+ auto* bus = static_cast<usb_bus_t*>(calloc(1, sizeof(usb_bus_t)));
if (!bus) {
zxlogf(ERROR, "Not enough memory for usb_bus_t.\n");
return ZX_ERR_NO_MEMORY;
@@ -165,7 +167,7 @@
bus->hci_zxdev = device;
bus->max_device_count = usb_hci_get_max_device_count(&bus->hci);
- bus->devices = calloc(bus->max_device_count, sizeof(usb_device_t *));
+ bus->devices = static_cast<usb_device_t**>(calloc(bus->max_device_count, sizeof(usb_device_t *)));
if (!bus->devices) {
zxlogf(ERROR, "Not enough memory for usb_bus_t->devices. max_device_count: %zu\n",
bus->max_device_count);
diff --git a/system/dev/usb/usb-bus/usb-device.c b/system/dev/usb/usb-bus/usb-device.cpp
similarity index 93%
rename from system/dev/usb/usb-bus/usb-device.c
rename to system/dev/usb/usb-bus/usb-device.cpp
index a674369..013db48 100644
--- a/system/dev/usb/usb-bus/usb-device.c
+++ b/system/dev/usb/usb-bus/usb-device.cpp
@@ -93,7 +93,7 @@
// usb request completion for the requests passed down to the HCI driver
static void request_complete(void* ctx, usb_request_t* req) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
mtx_lock(&dev->callback_lock);
// move original request to completed_reqs list so it can be completed on the callback_thread
@@ -133,12 +133,12 @@
}
static void usb_device_unbind(void* ctx) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
device_remove(dev->zxdev);
}
static void usb_device_release(void* ctx) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
stop_callback_thread(dev);
@@ -159,7 +159,7 @@
static zx_status_t usb_device_control(void* ctx, uint8_t request_type, uint8_t request,
uint16_t value, uint16_t index, void* data, size_t length,
zx_time_t timeout, size_t* out_length) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
usb_request_t* req = NULL;
bool use_free_list = length == 0;
@@ -234,7 +234,7 @@
static void usb_device_request_queue(void* ctx, usb_request_t* req, usb_request_complete_cb cb,
void* cookie) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
usb_device_req_internal_t* req_int = USB_REQ_TO_DEV_INTERNAL(req, dev->parent_req_size);
req_int->complete_cb = cb;
@@ -258,24 +258,24 @@
}
static usb_speed_t usb_device_get_speed(void* ctx) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
return dev->speed;
}
static zx_status_t usb_device_set_interface(void* ctx, uint8_t interface_number,
uint8_t alt_setting) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
return usb_util_control(dev, USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_INTERFACE,
USB_REQ_SET_INTERFACE, alt_setting, interface_number, NULL, 0);
}
static uint8_t usb_device_get_configuration(void* ctx) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
return dev->config_descs[dev->current_config_index]->bConfigurationValue;
}
static zx_status_t usb_device_set_configuration(void* ctx, uint8_t configuration) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
for (uint8_t i = 0; i < dev->num_configurations; i++) {
usb_configuration_descriptor_t* descriptor = dev->config_descs[i];
if (descriptor->bConfigurationValue == configuration) {
@@ -294,34 +294,34 @@
static zx_status_t usb_device_enable_endpoint(void* ctx, usb_endpoint_descriptor_t* ep_desc,
usb_ss_ep_comp_descriptor_t* ss_comp_desc,
bool enable) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
return usb_hci_enable_endpoint(&dev->hci, dev->device_id, ep_desc, ss_comp_desc, enable);
}
static zx_status_t usb_device_reset_endpoint(void* ctx, uint8_t ep_address) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
return usb_hci_reset_endpoint(&dev->hci, dev->device_id, ep_address);
}
static size_t usb_device_get_max_transfer_size(void* ctx, uint8_t ep_address) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
return usb_hci_get_max_transfer_size(&dev->hci, dev->device_id, ep_address);
}
static uint32_t _usb_device_get_device_id(void* ctx) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
return dev->device_id;
}
static void usb_device_get_device_descriptor(void* ctx, usb_device_descriptor_t* out_desc) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
memcpy(out_desc, &dev->device_desc, sizeof(usb_device_descriptor_t));
}
static zx_status_t usb_device_get_configuration_descriptor(void* ctx, uint8_t configuration,
usb_configuration_descriptor_t** out,
size_t* out_length) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
for (int i = 0; i < dev->num_configurations; i++) {
usb_configuration_descriptor_t* config_desc = dev->config_descs[i];
if (config_desc->bConfigurationValue == configuration) {
@@ -343,7 +343,7 @@
static zx_status_t usb_device_get_descriptor_list(void* ctx, void** out_descriptors,
size_t* out_length) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
usb_configuration_descriptor_t* config_desc = dev->config_descs[dev->current_config_index];
size_t length = le16toh(config_desc->wTotalLength);
@@ -362,23 +362,23 @@
zx_status_t usb_device_get_string_descriptor(void* ctx, uint8_t desc_id, uint16_t lang_id,
uint8_t* buf, size_t buflen, size_t* out_actual,
uint16_t* out_actual_lang_id) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
return usb_util_get_string_descriptor(dev, desc_id, lang_id, buf, buflen,
out_actual, out_actual_lang_id);
}
static zx_status_t usb_device_cancel_all(void* ctx, uint8_t ep_address) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
return usb_hci_cancel_all(&dev->hci, dev->device_id, ep_address);
}
static uint64_t usb_device_get_current_frame(void* ctx) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
return usb_hci_get_current_frame(&dev->hci);
}
static size_t usb_device_get_request_size(void* ctx) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
return dev->req_size;
}
@@ -404,17 +404,17 @@
};
static zx_status_t fidl_GetDeviceSpeed(void* ctx, fidl_txn_t* txn) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
return zircon_usb_device_DeviceGetDeviceSpeed_reply(txn, dev->speed);
}
static zx_status_t fidl_GetDeviceDescriptor(void* ctx, fidl_txn_t* txn) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
return zircon_usb_device_DeviceGetDeviceDescriptor_reply(txn, (uint8_t*)&dev->device_desc);
}
static zx_status_t fidl_GetConfigurationDescriptorSize(void* ctx, uint8_t config, fidl_txn_t* txn) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
usb_configuration_descriptor_t* descriptor = get_config_desc(dev, config);
if (!descriptor) {
return zircon_usb_device_DeviceGetConfigurationDescriptorSize_reply(txn,
@@ -426,7 +426,7 @@
}
static zx_status_t fidl_GetConfigurationDescriptor(void* ctx, uint8_t config, fidl_txn_t* txn) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
usb_configuration_descriptor_t* descriptor = get_config_desc(dev, config);
if (!descriptor) {
return zircon_usb_device_DeviceGetConfigurationDescriptor_reply(txn, ZX_ERR_INVALID_ARGS,
@@ -440,7 +440,7 @@
static zx_status_t fidl_GetStringDescriptor(void* ctx, uint8_t desc_id, uint16_t lang_id,
fidl_txn_t* txn) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
uint8_t buffer[zircon_usb_device_MAX_STRING_DESC_SIZE];
size_t actual;
zx_status_t status = usb_util_get_string_descriptor(dev, desc_id, lang_id, buffer,
@@ -450,29 +450,29 @@
static zx_status_t fidl_SetInterface(void* ctx, uint8_t interface_number, uint8_t alt_setting,
fidl_txn_t* txn) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
zx_status_t status = usb_device_set_interface(dev, interface_number, alt_setting);
return zircon_usb_device_DeviceSetInterface_reply(txn, status);
}
static zx_status_t fidl_GetDeviceId(void* ctx, fidl_txn_t* txn) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
return zircon_usb_device_DeviceGetDeviceId_reply(txn, dev->device_id);
}
static zx_status_t fidl_GetHubDeviceId(void* ctx, fidl_txn_t* txn) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
return zircon_usb_device_DeviceGetHubDeviceId_reply(txn, dev->hub_id);
}
static zx_status_t fidl_GetConfiguration(void* ctx, fidl_txn_t* txn) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
usb_configuration_descriptor_t* descriptor = dev->config_descs[dev->current_config_index];
return zircon_usb_device_DeviceGetConfiguration_reply(txn, descriptor->bConfigurationValue);
}
static zx_status_t fidl_SetConfiguration(void* ctx, uint8_t configuration, fidl_txn_t* txn) {
- usb_device_t* dev = ctx;
+ auto* dev = static_cast<usb_device_t*>(ctx);
zx_status_t status = usb_device_set_configuration(dev, configuration);
return zircon_usb_device_DeviceSetConfiguration_reply(txn, status);
}
diff --git a/system/dev/usb/usb-bus/usb-device.h b/system/dev/usb/usb-bus/usb-device.h
index 69516f3..e969033 100644
--- a/system/dev/usb/usb-bus/usb-device.h
+++ b/system/dev/usb/usb-bus/usb-device.h
@@ -9,12 +9,12 @@
#include <ddk/protocol/usb/hci.h>
#include <ddk/protocol/usb/hub.h>
#include <ddk/protocol/usb-old.h>
+#include <fbl/atomic.h>
#include <usb/usb-request.h>
#include <lib/sync/completion.h>
#include <zircon/hw/usb.h>
#include <threads.h>
-#include <stdatomic.h>
typedef struct usb_bus usb_bus_t;
@@ -39,8 +39,8 @@
uint8_t current_config_index;
uint8_t num_configurations;
- atomic_bool langids_fetched;
- atomic_uintptr_t lang_ids;
+ fbl::atomic<bool> langids_fetched;
+ fbl::atomic<uintptr_t> lang_ids;
// thread for calling client's usb request complete callback
thrd_t callback_thread;
diff --git a/system/dev/usb/usb-bus/util.c b/system/dev/usb/usb-bus/util.cpp
similarity index 94%
rename from system/dev/usb/usb-bus/util.c
rename to system/dev/usb/usb-bus/util.cpp
index 5c556f6..75cd06f 100644
--- a/system/dev/usb/usb-bus/util.c
+++ b/system/dev/usb/usb-bus/util.cpp
@@ -28,7 +28,8 @@
}
zx_status_t usb_util_control(usb_device_t* dev, uint8_t request_type, uint8_t request,
- uint16_t value, uint16_t index, void* data, size_t length) {
+ uint16_t value, uint16_t index, void* data, size_t length,
+ size_t* out_actual) {
usb_request_t* req = NULL;
bool use_free_list = length == 0;
if (use_free_list) {
@@ -43,9 +44,9 @@
usb_setup_t* setup = &req->setup;
setup->bmRequestType = request_type;
setup->bRequest = request;
- setup->wValue = value;
- setup->wIndex = index;
- setup->wLength = length;
+ setup->wValue = htole16(value);
+ setup->wIndex = htole16(index);
+ setup->wLength = htole16(static_cast<uint16_t>(length));
req->header.device_id = dev->device_id;
bool out = !!((request_type & USB_DIR_MASK) == USB_DIR_OUT);
@@ -53,7 +54,7 @@
usb_request_copy_to(req, data, length, 0);
}
- sync_completion_t completion = SYNC_COMPLETION_INIT;
+ sync_completion_t completion;
req->header.length = length;
@@ -104,7 +105,7 @@
// If we have never attempted to load our language ID table, do so now.
zx_status_t result;
if (!atomic_load_explicit(&dev->langids_fetched, memory_order_relaxed)) {
- usb_langid_desc_t* id_desc = calloc(1, sizeof(usb_langid_desc_t));
+ auto* id_desc = static_cast<usb_langid_desc_t*>(calloc(1, sizeof(usb_langid_desc_t)));
if (id_desc != NULL) {
result = usb_util_get_descriptor(dev, USB_DT_STRING, 0, 0, id_desc, sizeof(*id_desc));
@@ -155,7 +156,7 @@
// tried to obtain or synthesize one in the past, we are not going to get
// one. Just fail.
usb_langid_desc_t* lang_ids =
- (usb_langid_desc_t*)(atomic_load_explicit(&dev->lang_ids, memory_order_relaxed));
+ (usb_langid_desc_t*)(dev->lang_ids.load(memory_order_relaxed));
if (!lang_ids) {
return ZX_ERR_BAD_STATE;
}