void Y_usb_claim_interface(int argc) { ydev_instance_t* obj; int interface_number; int ret; if (argc != 2) { y_error("expecting exactly 2 arguments"); } obj = get_device(1); interface_number = ygets_i(0); ret = libusb_claim_interface(obj->handle, interface_number); if (ret < 0 && yarg_subroutine()) { failure(NULL, ret); } ypush_int(ret); }
void Y_ml4scan(int nArgs) { char *filename=YGetString(sp-nArgs+1); int maxvar=0; int returnString=(1-yarg_subroutine()); if (nArgs==1) { maxvar=10000; } else if (nArgs==2) { maxvar=YGetInteger(sp-nArgs+2); } else { YError("ml4scan takes one or two arguments"); } FILE *fs; fs = openmat(filename); if (fs == NULL) YError(p_strncat("Can't open file ",filename,0)); matscan(fs,maxvar,returnString); matclose(filename); }
void Y_usb_control_transfer(int argc) { ydev_instance_t* obj; int ret; int type, request, value, index, length; long size; unsigned char* data; unsigned int timeout; /* Get arguments. */ if (argc != 8) { y_error("expecting exactly 8 arguments"); } obj = get_device(7); type = ygets_i(6) & 0xff; /* uint8_t */ request = ygets_i(5) & 0xff; /* uint8_t */ value = ygets_i(4) & 0xffff; /* uint16_t */ index = ygets_i(3) & 0xffff; /* uint16_t */ data = (unsigned char*)get_data(2, &size); length = ygets_i(1) & 0xffff; /* uint16_t */ timeout = (unsigned int)(ygets_l(0) & 0xffffffffL); if (length < 0) { y_error("invalid length"); } if (length > size) { y_error("length must be at most the size of the data"); } /* Apply operation. */ ret = libusb_control_transfer(obj->handle, type, request, value, index, data, length, timeout); if (ret < 0 && yarg_subroutine()) { failure(NULL, ret); } ypush_int(ret); }
static void do_transfer(int argc, int (*transfer)(struct libusb_device_handle* handle, unsigned char endpoint, unsigned char* data, int length, int* transferred, unsigned int timeout)) { ydev_instance_t* obj; int ret, iarg; int endpoint, length, transferred, offset; long size; unsigned char* data; unsigned int timeout; long transferred_index; /* Get arguments. */ if (argc != 6 && argc != 7) { y_error("expecting 6 or 7 arguments"); } iarg = argc; obj = get_device(--iarg); endpoint = ygets_i(--iarg) & 0xff; /* uint8_t */ data = (unsigned char*)get_data(--iarg, &size); length = ygets_i(--iarg); if (length < 0) { y_error("invalid length"); } if (length > size) { y_error("length must be at most the size of the data"); } transferred_index = yget_ref(--iarg); if (transferred_index < 0L) { y_error("expecting a simple variable reference"); } timeout = (unsigned int)(ygets_l(--iarg) & 0xffffffffL); if (iarg > 0) { offset = ygets_i(--iarg); if (offset < 0 || offset > length) { y_error("invalid offset"); } } else { offset = 0; } /* Apply operation. */ if (length > offset) { ret = transfer(obj->handle, endpoint, data + offset, length - offset, &transferred, timeout); if (!(ret == 0 || (ret == LIBUSB_ERROR_TIMEOUT && transferred > 0))) { /* No data has been transferred. */ transferred = 0; if (yarg_subroutine()) { /* Some error has occured. */ failure(NULL, ret); } } } else { /* Nothing to do. */ transferred = 0; ret = 0; } if (transferred_index >= 0L) { /* Store total number of transferred bytes so far. */ ypush_int(offset + transferred); yput_global(transferred_index, 0); } ypush_int(ret); }