From c4cea4ae2b28b49b8922c55a421fe5fdfbc9576b Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Mon, 23 Jan 2017 22:01:35 +0100 Subject: [PATCH] winusb: extract usb_sco_[un]register_buffers, make sure to call after setting alternative setting --- platform/windows/hci_transport_h2_winusb.c | 66 ++++++++++++++-------- 1 file changed, 43 insertions(+), 23 deletions(-) diff --git a/platform/windows/hci_transport_h2_winusb.c b/platform/windows/hci_transport_h2_winusb.c index 108ff9c61..30cef273c 100644 --- a/platform/windows/hci_transport_h2_winusb.c +++ b/platform/windows/hci_transport_h2_winusb.c @@ -328,6 +328,30 @@ static void sco_ring_init(void){ static int sco_ring_have_space(void){ return sco_ring_transfers_active < SCO_RING_BUFFER_COUNT; } +static void usb_sco_register_buffers(void){ + BOOL result; + result = WinUsb_RegisterIsochBuffer(usb_interface_1_handle, sco_in_addr, hci_sco_in_buffer, sizeof(hci_sco_in_buffer), &hci_sco_in_buffer_handle); + if (!result) { + log_error("usb_sco_register_buffers: register in buffer failed, error %lu", GetLastError()); + } + log_info("hci_sco_in_buffer_handle %p", hci_sco_in_buffer_handle); + + result = WinUsb_RegisterIsochBuffer(usb_interface_1_handle, sco_out_addr, sco_ring_buffer, sizeof(sco_ring_buffer), &hci_sco_out_buffer_handle); + if (!result) { + log_error("usb_sco_unregister_buffers: register out buffer failed, error %lu", GetLastError()); + } + log_info("hci_sco_out_buffer_handle %p", hci_sco_out_buffer_handle); +} +static void usb_sco_unregister_buffers(void){ + if (hci_sco_in_buffer_handle){ + WinUsb_UnregisterIsochBuffer(hci_sco_in_buffer_handle); + hci_sco_in_buffer_handle = NULL; + } + if (hci_sco_out_buffer_handle){ + WinUsb_UnregisterIsochBuffer(hci_sco_out_buffer_handle); + hci_sco_out_buffer_handle = NULL; + } +} #endif static void usb_register_packet_handler(void (*handler)(uint8_t packet_type, uint8_t *packet, uint16_t size)){ @@ -358,14 +382,7 @@ static void usb_free_resources(void){ } #ifdef ENABLE_SCO_OVER_HCI - if (hci_sco_in_buffer_handle){ - WinUsb_UnregisterIsochBuffer(hci_sco_in_buffer_handle); - hci_sco_in_buffer_handle = NULL; - } - if (hci_sco_out_buffer_handle){ - WinUsb_UnregisterIsochBuffer(hci_sco_out_buffer_handle); - hci_sco_out_buffer_handle = NULL; - } + usb_sco_unregister_buffers(); #endif } @@ -786,6 +803,7 @@ exit_on_error: } #ifdef ENABLE_SCO_OVER_HCI + static int usb_sco_start(void){ printf("usb_sco_start\n"); log_info("usb_sco_start"); @@ -899,10 +917,10 @@ static int usb_try_open_device(const char * device_path){ if (!result) goto exit_on_error; log_info("Claiming interface 1: success"); - log_info("Switching to setting %u on interface 1..", ALT_SETTING); - // WinUsb_SetCurrentAlternateSetting returns TRUE if the operation succeeds. - result = WinUsb_SetCurrentAlternateSetting(usb_interface_1_handle, ALT_SETTING); - if (!result) goto exit_on_error; + // log_info("Switching to setting %u on interface 1..", ALT_SETTING); + // // WinUsb_SetCurrentAlternateSetting returns TRUE if the operation succeeds. + // result = WinUsb_SetCurrentAlternateSetting(usb_interface_1_handle, ALT_SETTING); + // if (!result) goto exit_on_error; #endif result = usb_scan_for_bluetooth_endpoints(); @@ -918,14 +936,6 @@ static int usb_try_open_device(const char * device_path){ memset(hci_sco_packet_descriptors, 0, sizeof(hci_sco_packet_descriptors)); log_info("Size of packet descriptors for SCO IN%u", (int) sizeof(hci_sco_packet_descriptors)); - result = WinUsb_RegisterIsochBuffer(usb_interface_1_handle, sco_in_addr, hci_sco_in_buffer, sizeof(hci_sco_in_buffer), &hci_sco_in_buffer_handle); - if (!result) goto exit_on_error; - log_info("hci_sco_in_buffer_handle %p", hci_sco_in_buffer_handle); - - result = WinUsb_RegisterIsochBuffer(usb_interface_1_handle, sco_out_addr, sco_ring_buffer, sizeof(sco_ring_buffer), &hci_sco_out_buffer_handle); - if (!result) goto exit_on_error; - log_info("hci_sco_out_buffer_handle %p", hci_sco_out_buffer_handle); - // setup async io && btstack handler memset(&usb_overlapped_sco_in, 0, sizeof(usb_overlapped_sco_in)); for (i=0;i