Exemple #1
0
Fichier : yusb.c Projet : emmt/yusb
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);
}
Exemple #2
0
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);
}
Exemple #3
0
Fichier : yusb.c Projet : emmt/yusb
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);
}
Exemple #4
0
Fichier : yusb.c Projet : emmt/yusb
 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);
}