static void hackrf_libusb_transfer_callback(struct libusb_transfer* usb_transfer) { hackrf_device* device = (hackrf_device*)usb_transfer->user_data; if(usb_transfer->status == LIBUSB_TRANSFER_COMPLETED) { hackrf_transfer transfer = { transfer.device = device, transfer.buffer = usb_transfer->buffer, transfer.buffer_length = usb_transfer->length, transfer.valid_length = usb_transfer->actual_length, transfer.rx_ctx = device->rx_ctx, transfer.tx_ctx = device->tx_ctx }; if( device->callback(&transfer) == 0 ) { if( libusb_submit_transfer(usb_transfer) < 0) { request_exit(); }else { return; } }else { request_exit(); } } else { /* Other cases LIBUSB_TRANSFER_NO_DEVICE LIBUSB_TRANSFER_ERROR, LIBUSB_TRANSFER_TIMED_OUT LIBUSB_TRANSFER_STALL, LIBUSB_TRANSFER_OVERFLOW LIBUSB_TRANSFER_CANCELLED ... */ request_exit(); /* Fatal error stop transfer */ } }
static void LIBUSB_CALL cb_mode_changed(struct libusb_transfer *transfer) { if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { fprintf(stderr, "mode change transfer not completed!\n"); request_exit(2); } printf("async cb_mode_changed length=%d actual_length=%d\n", transfer->length, transfer->actual_length); if (next_state() < 0) request_exit(2); }
static void cb_data(struct libusb_transfer *transfer) { CB_Data * p = (CB_Data*) transfer->user_data; if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { qDebug()<<"img transfer status "<<transfer->status<<"?"; libusb_free_transfer(transfer); p->transfer = 0; request_exit(p); return; } p->device->onHidData(transfer->buffer, transfer->actual_length); //showBytes(transfer->buffer, transfer->actual_length, "read"); if (libusb_submit_transfer(p->transfer) < 0) request_exit(p); }
static void LIBUSB_CALL cb_img(struct libusb_transfer *transfer) { if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { fprintf(stderr, "img transfer status %d?\n", transfer->status); img_transfer = NULL; request_exit(2); return; } printf("Image callback\n"); save_to_file(imgbuf); if (next_state() < 0) { request_exit(2); return; } if (libusb_submit_transfer(img_transfer) < 0) request_exit(2); }
static void LIBUSB_CALL cb_irq(struct libusb_transfer *transfer) { unsigned char irqtype = transfer->buffer[0]; if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { fprintf(stderr, "irq transfer status %d?\n", transfer->status); irq_transfer = NULL; request_exit(2); return; } printf("IRQ callback %02x\n", irqtype); switch (state) { case STATE_AWAIT_IRQ_FINGER_DETECTED: if (irqtype == 0x01) { if (next_state() < 0) { request_exit(2); return; } } else { printf("finger-on-sensor detected in wrong state!\n"); } break; case STATE_AWAIT_IRQ_FINGER_REMOVED: if (irqtype == 0x02) { if (next_state() < 0) { request_exit(2); return; } } else { printf("finger-on-sensor detected in wrong state!\n"); } break; } if (libusb_submit_transfer(irq_transfer) < 0) request_exit(2); }
static void *poll_thread_main(void *arg) { int r = 0; printf("poll thread running\n"); while (!do_exit) { struct timeval tv = { 1, 0 }; r = libusb_handle_events_timeout(NULL, &tv); if (r < 0) { request_exit(2); break; } } printf("poll thread shutting down\n"); pthread_exit(NULL); }
static int kill_transfer_thread(hackrf_device* device) { void* value; int result; request_exit(); if( device->transfer_thread_started != false ) { value = NULL; result = pthread_join(device->transfer_thread, &value); if( result != 0 ) { return HACKRF_ERROR_THREAD; } device->transfer_thread_started = false; /* Cancel all transfers */ cancel_transfers(device); } return HACKRF_SUCCESS; }
int main(void) { struct sigaction sigact; int r = 1; r = libusb_init(NULL); if (r < 0) { fprintf(stderr, "failed to initialise libusb\n"); exit(1); } r = find_dpfp_device(); if (r < 0) { fprintf(stderr, "Could not find/open device\n"); goto out; } r = libusb_claim_interface(devh, 0); if (r < 0) { fprintf(stderr, "usb_claim_interface error %d %s\n", r, strerror(-r)); goto out; } printf("claimed interface\n"); r = print_f0_data(); if (r < 0) goto out_release; r = do_init(); if (r < 0) goto out_deinit; /* async from here onwards */ sigact.sa_handler = sighandler; sigemptyset(&sigact.sa_mask); sigact.sa_flags = 0; sigaction(SIGINT, &sigact, NULL); sigaction(SIGTERM, &sigact, NULL); sigaction(SIGQUIT, &sigact, NULL); r = pthread_create(&poll_thread, NULL, poll_thread_main, NULL); if (r) goto out_deinit; r = alloc_transfers(); if (r < 0) { request_exit(1); pthread_join(poll_thread, NULL); goto out_deinit; } r = init_capture(); if (r < 0) { request_exit(1); pthread_join(poll_thread, NULL); goto out_deinit; } while (!do_exit) { pthread_mutex_lock(&exit_cond_lock); pthread_cond_wait(&exit_cond, &exit_cond_lock); pthread_mutex_unlock(&exit_cond_lock); } printf("shutting down...\n"); pthread_join(poll_thread, NULL); r = libusb_cancel_transfer(irq_transfer); if (r < 0) { request_exit(1); goto out_deinit; } r = libusb_cancel_transfer(img_transfer); if (r < 0) { request_exit(1); goto out_deinit; } while (img_transfer || irq_transfer) if (libusb_handle_events(NULL) < 0) break; if (do_exit == 1) r = 0; else r = 1; out_deinit: libusb_free_transfer(img_transfer); libusb_free_transfer(irq_transfer); set_mode(0); set_hwstat(0x80); out_release: libusb_release_interface(devh, 0); out: libusb_close(devh); libusb_exit(NULL); return r >= 0 ? r : -r; }
static void sighandler(int signum) { request_exit(1); }