diff --git a/project.xcodeproj/project.pbxproj b/project.xcodeproj/project.pbxproj index e21a3942c..fb56e2732 100644 --- a/project.xcodeproj/project.pbxproj +++ b/project.xcodeproj/project.pbxproj @@ -17,6 +17,7 @@ 9C04B876107D2B7C002A63D0 /* run_loop_cocoa.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CEB4DAA10753B4B00DD5720 /* run_loop_cocoa.m */; }; 9C04B87A107D2BA7002A63D0 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C04B879107D2BA7002A63D0 /* CoreFoundation.framework */; }; 9C05FC971020D3F300255261 /* socket_connection.c in Sources */ = {isa = PBXBuildFile; fileRef = 9C00F7301017ACC3008DAB17 /* socket_connection.c */; }; + 9C18015C108BAA7200824BE7 /* libusb-1.0.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C18015B108BAA7200824BE7 /* libusb-1.0.dylib */; }; 9C2071F310014D3200A07EA4 /* hci_transport_usb.c in Sources */ = {isa = PBXBuildFile; fileRef = 9C2071F210014D3200A07EA4 /* hci_transport_usb.c */; }; 9C46FC3A0FA906F700ABEF05 /* hci_transport_h4.c in Sources */ = {isa = PBXBuildFile; fileRef = 9C46FC360FA906F700ABEF05 /* hci_transport_h4.c */; }; 9C77E79210667F0600F39DCF /* platform_iphone.c in Sources */ = {isa = PBXBuildFile; fileRef = 9C77E79110667F0600F39DCF /* platform_iphone.c */; }; @@ -56,6 +57,7 @@ 9C04B825107D1CED002A63D0 /* run_loop.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = run_loop.c; path = src/run_loop.c; sourceTree = ""; }; 9C04B879107D2BA7002A63D0 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = ""; }; 9C04BD3110826575002A63D0 /* logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = logo.png; path = resources/logo.png; sourceTree = ""; }; + 9C18015B108BAA7200824BE7 /* libusb-1.0.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libusb-1.0.dylib"; path = "/usr/local/lib/libusb-1.0.dylib"; sourceTree = ""; }; 9C1813F71042FCCA00C68F09 /* mitm.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = mitm.c; path = example/mitm.c; sourceTree = ""; }; 9C2071F210014D3200A07EA4 /* hci_transport_usb.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = hci_transport_usb.c; path = src/hci_transport_usb.c; sourceTree = ""; }; 9C46FC340FA906F700ABEF05 /* hci.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = hci.c; path = src/hci.c; sourceTree = ""; }; @@ -112,6 +114,7 @@ buildActionMask = 2147483647; files = ( 9C04B87A107D2BA7002A63D0 /* CoreFoundation.framework in Frameworks */, + 9C18015C108BAA7200824BE7 /* libusb-1.0.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -205,6 +208,7 @@ 9C77E4AD10634E3100F39DCF /* 3rdparty */ = { isa = PBXGroup; children = ( + 9C18015B108BAA7200824BE7 /* libusb-1.0.dylib */, 9C77E4AE10634E3100F39DCF /* launch.h */, 9C77E4AF10634E3100F39DCF /* libsubstrate.dylib */, 9C77E4B010634E3100F39DCF /* README */, diff --git a/src/hci_transport_usb.c b/src/hci_transport_usb.c index 63a3f15fd..1669e53f2 100644 --- a/src/hci_transport_usb.c +++ b/src/hci_transport_usb.c @@ -47,8 +47,9 @@ static hci_transport_t * hci_transport_usb = NULL; static void (*event_packet_handler)(uint8_t *packet, int size) = dummy_handler; static void (*acl_packet_handler) (uint8_t *packet, int size) = dummy_handler; -static uint8_t hci_event_buffer[255+2]; // maximal payload + 2 bytes header -static uint8_t hci_packet[400]; // bigger than largest packet +static uint8_t hci_cmd_out[400]; // bigger than largest packet +static uint8_t hci_event_buffer[400]; // bigger than largest packet +static uint8_t hci_acl_in[400]; // bigger than largest packet // libusb static struct libusb_device_descriptor desc; @@ -56,6 +57,9 @@ static libusb_device * dev; static libusb_device_handle * handle; static struct libusb_transfer *interrupt_transfer; static struct libusb_transfer *control_transfer; +static struct libusb_transfer *bulk_in_transfer; +static struct libusb_transfer *bulk_out_transfer; + int find_bt(libusb_device **devs) { @@ -95,14 +99,22 @@ static void control_callback(struct libusb_transfer *transfer){ transfer->length, transfer->actual_length); } +static void bulk_out_callback(struct libusb_transfer *transfer){ + if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { + fprintf(stderr, "bulk_out_callback not completed!\n"); + return; + } + + printf("bulk_out_callback length=%d actual_length=%d\n", + transfer->length, transfer->actual_length); +} + + static void event_callback(struct libusb_transfer *transfer) { - if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { - fprintf(stderr, "event_callback not completed!\n"); - } else { - - printf("event_callback length=%d actual_length=%d: ", - transfer->length, transfer->actual_length); + printf("event_callback length=%d actual_length=%d: ", + transfer->length, transfer->actual_length); + if (transfer->status == LIBUSB_TRANSFER_COMPLETED) { int i; for (i=0;iactual_length; i++) printf("0x%02x ", transfer->buffer[i]); printf("\n"); @@ -116,6 +128,24 @@ static void event_callback(struct libusb_transfer *transfer) } } +static void bulk_in_callback(struct libusb_transfer *transfer) +{ + printf("bulk_in_callback length=%d actual_length=%d: ", + transfer->length, transfer->actual_length); + if (transfer->status == LIBUSB_TRANSFER_COMPLETED) { + int i; + for (i=0;iactual_length; i++) printf("0x%02x ", transfer->buffer[i]); + printf("\n"); + + hci_dump_packet( HCI_EVENT_PACKET, 1, transfer->buffer, transfer->actual_length); + acl_packet_handler(transfer->buffer, transfer->actual_length); + } + int r = libusb_submit_transfer(bulk_in_transfer); + if (r) { + printf("Error submitting bulk in transfer %d\n", r); + } +} + static int usb_process(struct data_source *ds) { if (libusb_state != LIB_USB_TRANSFERS_ALLOCATED) return -1; struct timeval tv; @@ -170,17 +200,7 @@ static int usb_open(void *transport_config){ #endif libusb_state = LIB_USB_KERNEL_DETACHED; - libusb_set_debug(0,3); - -#if 0 - int config = -1; - r = libusb_get_configuration(handle, &config); - printf("Get configuration %i (%i)\n", config, r); - // if (config != 1) { - // r= libusb_set_configuration(handle,0); - // } - printf("Set configuration = %u\n", r); -#endif + // libusb_set_debug(0,3); // reserve access to device printf("claiming interface 0...\n"); @@ -193,6 +213,7 @@ static int usb_open(void *transport_config){ libusb_state = LIB_USB_INTERFACE_CLAIMED; printf("claimed interface 0\n"); +/* // get endpoints - broken on OS X until libusb 1.0.3 struct libusb_config_descriptor *config_descriptor; r = libusb_get_active_config_descriptor(dev, &config_descriptor); @@ -204,38 +225,18 @@ static int usb_open(void *transport_config){ for (r=0;rbNumEndpoints;r++,endpoint++){ printf("endpoint %x, attributes %x\n", endpoint->bEndpointAddress, endpoint->bmAttributes); } - +*/ // allocation control_transfer = libusb_alloc_transfer(0); // 0 isochronous transfers CMDs interrupt_transfer = libusb_alloc_transfer(0); // 0 isochronous transfers Events - if (!control_transfer || !interrupt_transfer){ + bulk_in_transfer = libusb_alloc_transfer(0); // 0 isochronous transfers ACL in + bulk_out_transfer = libusb_alloc_transfer(0); // 0 isochronous transfers ACL in + if (!control_transfer || !interrupt_transfer || !bulk_in_transfer || !bulk_out_transfer){ usb_close(); return LIBUSB_ERROR_NO_MEM; } libusb_state = LIB_USB_TRANSFERS_ALLOCATED; - -#if 0 - // data transfer - // get answer - - // control - uint8_t hci_reset[] = { 0x03, 0x0c, 0x00 }; - - // synchronous - r = libusb_control_transfer (handle, LIBUSB_REQUEST_TYPE_CLASS, - 0, 0, 0, - hci_reset, sizeof (hci_reset), - 0); - - int length = -1; - r = libusb_interrupt_transfer(handle, 0x81, hci_event_buffer, 100, &length, 0); - printf("received data len %u, r= %d\n", length, r); - for (r=0;rflags = LIBUSB_TRANSFER_SHORT_NOT_OK; @@ -245,6 +246,16 @@ static int usb_open(void *transport_config){ } printf("interrupt started\n"); + + // bulk in (= ACL packets) handler + libusb_fill_bulk_transfer(bulk_in_transfer, handle, 0x82, hci_acl_in, 400, bulk_in_callback, NULL, 3000) ; + // bulk_in_transfer->flags = LIBUSB_TRANSFER_SHORT_NOT_OK; + r = libusb_submit_transfer(bulk_in_transfer); + if (r) { + printf("Error submitting bulk in transfer %d\n", r); + } + printf("bulk in started\n"); + // set up data_sources const struct libusb_pollfd ** pollfd = libusb_get_pollfds(NULL); for (r = 0 ; pollfd[r] ; r++) { @@ -291,9 +302,9 @@ static int usb_send_cmd_packet(uint8_t *packet, int size){ printf("send HCI packet, len %u\n", size); // send packet over USB - libusb_fill_control_setup(hci_packet, LIBUSB_REQUEST_TYPE_CLASS, 0, 0, 0, size); - memcpy(&hci_packet[LIBUSB_CONTROL_SETUP_SIZE], packet, size); - libusb_fill_control_transfer(control_transfer, handle, hci_packet, control_callback, NULL, 1000); + libusb_fill_control_setup(hci_cmd_out, LIBUSB_REQUEST_TYPE_CLASS, 0, 0, 0, size); + memcpy(&hci_cmd_out[LIBUSB_CONTROL_SETUP_SIZE], packet, size); + libusb_fill_control_transfer(control_transfer, handle, hci_cmd_out, control_callback, NULL, 1000); control_transfer->flags = LIBUSB_TRANSFER_SHORT_NOT_OK; int r = libusb_submit_transfer(control_transfer); if (r) { @@ -311,6 +322,13 @@ static int usb_send_acl_packet(uint8_t *packet, int size){ hci_dump_packet( HCI_ACL_DATA_PACKET, 0, packet, size); // send packet over USB + libusb_fill_bulk_transfer(bulk_out_transfer, handle, 0x02, packet, size, bulk_out_callback, NULL, 1000); + bulk_out_transfer->flags = LIBUSB_TRANSFER_SHORT_NOT_OK; + int r = libusb_submit_transfer(bulk_out_transfer); + if (r) { + printf("Error submitting control transfer %d\n", r); + return r; + } return 0; }