int cmd_rx_data(struct libusb_device_handle* devh) { empty_usb_buf =(u8 *) malloc(BUFFER_SIZE); rx_xfer = libusb_alloc_transfer(0); libusb_fill_bulk_transfer(rx_xfer, devh, DATA_IN, empty_usb_buf, BUFFER_SIZE, cb_xfer, NULL, TIMEOUT); cmd_rx_syms(devh, num_blocks); r = libusb_submit_transfer(rx_xfer); if (r < 0) { fprintf(stderr, "rx_xfer submission: %d\n", r); return -1; } while (1) { while (!usb_really_full) { handle_events_wrapper(); } /* process each received block */ for (i = 0; i < xfer_blocks; i++) { rx = (usb_pkt_rx *)(full_usb_buf + PKT_LEN * i); if(rx->pkt_type != KEEP_ALIVE) (*cb)(cb_args, rx, bank); bank = (bank + 1) % NUM_BANKS; } usb_really_full = 0; } }
int stream_rx_usb(ubertooth_t* ut, rx_callback cb, void* cb_args) { int r; // init USB transfer r = ubertooth_bulk_init(ut); if (r < 0) return r; // tell ubertooth to send packets r = cmd_rx_syms(ut->devh); if (r < 0) return r; // receive and process each packet while(1) { ubertooth_bulk_wait(ut); r = ubertooth_bulk_receive(ut, cb, cb_args); if (r == 1) return 1; } }
int stream_rx_usb(struct libusb_device_handle* devh, int xfer_size, uint16_t num_blocks, rx_callback cb, void* cb_args) { int r; int i; int xfer_blocks; int num_xfers; uint8_t bank = 0; uint8_t rx_buf1[BUFFER_SIZE]; uint8_t rx_buf2[BUFFER_SIZE]; /* * A block is 64 bytes transferred over USB (includes 50 bytes of rx symbol * payload). A transfer consists of one or more blocks. Consecutive * blocks should be approximately 400 microseconds apart (timestamps about * 4000 apart in units of 100 nanoseconds). */ if (xfer_size > BUFFER_SIZE) xfer_size = BUFFER_SIZE; xfer_blocks = xfer_size / PKT_LEN; xfer_size = xfer_blocks * PKT_LEN; num_xfers = num_blocks / xfer_blocks; num_blocks = num_xfers * xfer_blocks; /* fprintf(stderr, "rx %d blocks of 64 bytes in %d byte transfers\n", num_blocks, xfer_size); */ empty_buf = &rx_buf1[0]; full_buf = &rx_buf2[0]; really_full = 0; rx_xfer = libusb_alloc_transfer(0); libusb_fill_bulk_transfer(rx_xfer, devh, DATA_IN, empty_buf, xfer_size, cb_xfer, NULL, TIMEOUT); cmd_rx_syms(devh, num_blocks); r = libusb_submit_transfer(rx_xfer); if (r < 0) { fprintf(stderr, "rx_xfer submission: %d\n", r); return -1; } while (1) { while (!really_full) { r = libusb_handle_events(NULL); if (r < 0) { fprintf(stderr, "libusb_handle_events: %d\n", r); return -1; } } /* fprintf(stderr, "transfer completed\n"); */ /* process each received block */ for (i = 0; i < xfer_blocks; i++) { (*cb)(cb_args, (usb_pkt_rx *)(full_buf + PKT_LEN * i), bank); bank = (bank + 1) % NUM_BANKS; } really_full = 0; fflush(stderr); } }
int stream_rx_usb(struct libusb_device_handle* devh, int xfer_size, rx_callback cb, void* cb_args) { int r; int i; int xfer_blocks; usb_pkt_rx* rx; uint8_t bank = 0; uint8_t rx_buf1[BUFFER_SIZE]; uint8_t rx_buf2[BUFFER_SIZE]; fprintf(stderr, "xfer_size=%d\n", xfer_size); /* * A block is 64 bytes transferred over USB (includes 50 bytes of rx symbol * payload). A transfer consists of one or more blocks. Consecutive * blocks should be approximately 400 microseconds apart (timestamps about * 4000 apart in units of 100 nanoseconds). */ if (xfer_size > BUFFER_SIZE) xfer_size = BUFFER_SIZE; xfer_blocks = xfer_size / PKT_LEN; xfer_size = xfer_blocks * PKT_LEN; fprintf(stderr, "xfer_blocks=%d\n", xfer_blocks); fprintf(stderr, "xfer_size=%d\n", xfer_size); fprintf(stderr, "PKT_LEN=%d\n", PKT_LEN); /* fprintf(stderr, "rx %d blocks of 64 bytes in %d byte transfers\n", num_blocks, xfer_size); */ empty_usb_buf = &rx_buf1[0]; full_usb_buf = &rx_buf2[0]; usb_really_full = 0; rx_xfer = libusb_alloc_transfer(0); libusb_fill_bulk_transfer(rx_xfer, devh, DATA_IN, empty_usb_buf, xfer_size, cb_xfer, NULL, TIMEOUT); cmd_rx_syms(devh); r = libusb_submit_transfer(rx_xfer); if (r < 0) { fprintf(stderr, "rx_xfer submission: %d\n", r); return -1; } while (1) { while (!usb_really_full) { handle_events_wrapper(); } /* process each received block */ for (i = 0; i < xfer_blocks; i++) { rx = (usb_pkt_rx *)(full_usb_buf + PKT_LEN * i); if(rx->pkt_type != KEEP_ALIVE) (*cb)(cb_args, rx, bank); bank = (bank + 1) % NUM_BANKS; if(stop_ubertooth) { stop_ubertooth = 0; usb_really_full = 0; usb_retry = 0; handle_events_wrapper(); usb_retry = 1; return 1; } } usb_really_full = 0; fflush(stderr); } }