예제 #1
0
void interrupt_read_temperature(usb_dev_handle *dev, float *tempC) {
 
    int r,i, temperature[2];
    unsigned char answer[reqIntLen];
    bzero(answer, reqIntLen);
    
    r = usb_interrupt_read(dev, 0x82, answer, reqIntLen, timeout);

    // If reading failed, retry once more...
    if( r != reqIntLen )
    {
      r = usb_interrupt_read(dev, 0x82, answer, reqIntLen, timeout);
    }

   if( r != reqIntLen )
    {
          perror("USB interrupt read"); bad("USB read failed"); 
    }


    if(debug) {
      for (i=0;i<reqIntLen; i++) printf("%02x ",answer[i]  & 0xFF);
    
      printf("\n");
    }
    
    temperature[0] = (answer[3] & 0xFF) + ((signed char)answer[2] << 8);
    temperature[0] += calibration;
    tempC[0] = temperature[0] * (125.0 / 32000.0);

    temperature[1] = (answer[5] & 0xFF) + ((signed char)answer[4] << 8);
    temperature[1] += calibration;
    tempC[1] = temperature[1] * (125.0 / 32000.0);

}
예제 #2
0
파일: pcsensor.c 프로젝트: raff/temper
static int interrupt_read_temperatura(usb_dev_handle *dev, float *tempC) {
 
	int r,i, temperature;
	char answer[reqIntLen];
	bzero(answer, reqIntLen);
    
	r = usb_interrupt_read(dev, 0x82, answer, reqIntLen, timeout);
	if( r != reqIntLen )
	{
		if(debug){
			printf("USB interrupt read");
		}
		return -1;
	}


	if(debug) {
		for (i=0;i<reqIntLen; i++) printf("%02x ",answer[i]  & 0xFF);
    
		printf("\n");
	}
    
	temperature = (answer[3] & 0xFF) + (answer[2] << 8);
	*tempC = temperature * (125.0 / 32000.0);
	return 0;
}
예제 #3
0
/*
 void test_control_transfer(usb_dev_handle *dev)
 {
//   usb_set_altinterface(dev, 0);
   usb_release_interface(dev, 0);
 }
*/
 void test_interrupt_transfer(usb_dev_handle *dev)
 {
   int r,i;
   char answer[reqIntLen];
   char question[reqIntLen];
   for (i=0;i<reqIntLen; i++) question[i]=i;
   r = usb_interrupt_write(dev, endpoint_Int_out, question, reqIntLen, timeout);
   if( r < 0 )
   {
	  perror("USB interrupt write"); bad("USB write failed"); 
   }
   r = usb_interrupt_read(dev, endpoint_Int_in, answer, reqIntLen, timeout);
   if( r != reqIntLen )
   {
	  perror("USB interrupt read"); bad("USB read failed"); 
   }
//   for (i=0;i<reqIntLen; i++) printf("%i, %i, \n",question[i],answer[i]);
	for(i = 0;i < reqIntLen; i++) {
		if(i%8 == 0)
			printf("\n");
		printf("%02x, %02x; ",question[i],answer[i]);
	}
	printf("\n");

//   usb_set_altinterface(dev, 0);
   usb_release_interface(dev, 0);
 }
예제 #4
0
파일: RF24ComVUsb.cpp 프로젝트: kaqmak/RF24
void RF24ComVUsb::initialize(void)
{
    const unsigned char rawVid[2] = {USB_CFG_VENDOR_ID}, rawPid[2] = {USB_CFG_DEVICE_ID};
    char vendor[] = {USB_CFG_VENDOR_NAME, 0}, product[] = {USB_CFG_DEVICE_NAME, 0};
    int vid, pid;
    int ret;
    uint8_t buffer[128];

    usb_init();

    vid = rawVid[1] * 256 + rawVid[0];
    pid = rawPid[1] * 256 + rawPid[0];

    if(usbOpenDevice(&handle, vid, vendor, pid, product, NULL, NULL, NULL) != 0)
        fatal(-1, "Could not find USB device \"%s\" with vid=0x%x pid=0x%x\n", product, vid, pid);

    // exmptiy thei interrupt queue
    DPRINT("Emptying usb interrupt queue...");
    ret = usb_interrupt_read(handle, USB_ENDPOINT_IN | 1, (char *)buffer, sizeof(buffer), 100);
    DPRINT("done, returned %d.\n", ret);

    DPRINT("Verifying protocol version\n");
    buffer[0] = 4;
    buffer[1] = 1;
    buffer[2] = RF24_getProtocolVersion;
    buffer[3] = 0;
    sendRequest(buffer);
    getResponse(buffer);
    if (buffer[4] != RF24REMOTE_PROTOCOL_VERSION)
        fatal(-1, "usb client returned wrong protocol version. Expected:%d, received:%d\n", RF24REMOTE_PROTOCOL_VERSION, buffer[4]);
}
예제 #5
0
int usbReadCode_USBDIO96H(HIDInterface* hid, __u32 address, __u8 count, __u8 data[])
{
  struct t_readCode {
    __u8 reportID;
    __u8 address[3];
    __u8 count;
  } readCode;

  struct t_readCodeI {
    __u8 reportID;
    __u8 data[62];
  } readCodeI;

  int bRead;  // bytes read

  if ( count > 62 ) count = 62;  

  readCode.reportID = READ_CODE;
  memcpy(readCode.address, &address, 3);   // 24 bit address
  readCode.count = count;
  PMD_SendOutputReport(hid, READ_CODE, (__u8 *) &readCode, sizeof(readCode), FS_DELAY);
  do {
    readCode.reportID = 0x0;
    bRead = usb_interrupt_read(hid->dev_handle, USB_ENDPOINT_IN | 1,
			       (char *) &readCodeI, count+1, FS_DELAY);
  } while (readCodeI.reportID != READ_CODE && (bRead != count+1));
  memcpy(data, readCodeI.data, count);
  return bRead;
}
예제 #6
0
void sendBuffer(char* buffer, size_t size) {
	OpenIBootCmd cmd;

	cmd.command = OPENIBOOTCMD_SENDCOMMAND;
	cmd.dataLen = size;

	usb_interrupt_write(device, 4, (char*) (&cmd), sizeof(OpenIBootCmd), 1000);

	while(1) {
		usb_interrupt_read(device, 3, (char*) (&cmd), sizeof(OpenIBootCmd), 1000);
		if(cmd.command == OPENIBOOTCMD_SENDCOMMAND_GOAHEAD)
			break;
	}

	int toSend = 0;
	while(size > 0) {
		if(size <= MAX_TO_SEND)
			toSend = size;
		else
			toSend = MAX_TO_SEND;

		usb_bulk_write(device, 2, buffer, toSend, 1000);
		buffer += toSend;
		size -= toSend;
	}
}
예제 #7
0
int write_cmd(usb_dev_handle *udev, unsigned char *cmd, int read)
{
	int ret=0, i=0;

	unsigned char receive_data[1024];
	unsigned char interrupt_data;
	for (i=0; i<1024; i++)
		receive_data[i] = 0x00;

	printf("write_cmd\n");
	ret = usb_bulk_write(udev, 0x02, cmd, sizeof(cmd), 10000);
	if (ret != sizeof(cmd))
		printf("Error!\n");

	//if (read)
	{
		ret = usb_bulk_read(udev, 0x81, receive_data, sizeof(receive_data), 10000);
		mcrw_debug(receive_data, ret);
	}
	//else
	{
		ret = usb_interrupt_read(udev, 0x83, &interrupt_data, 1, 10000);
		mcrw_debug(&interrupt_data, ret);
	}
	return 0;
}
예제 #8
0
파일: gotemp.c 프로젝트: ezrec/usense
int gotemp_update(struct usense_device *dev, void *priv)
{
	/* From the GoIO_SDK */
	const double conversion = 0.0078125;
	struct gotemp *gotemp = priv;
	double kelvin;
	char buff[64];
	int len;

	assert(sizeof(gotemp->packet) == 8);

	do {
		len = usb_interrupt_read(gotemp->usb, 0x81, (void *)&gotemp->packet, sizeof(gotemp->packet), 1000);
		if (len < 0 || len != sizeof(gotemp->packet)) {
			if (len == -EAGAIN) {
				continue;
			}
			return -EINVAL;
		}
	} while (0);

	kelvin = C_TO_K(((double) gotemp->packet.measurement0) * conversion);
	snprintf(buff, sizeof(buff), "%g", kelvin);
	return usense_prop_set(dev, "reading", buff);
}
예제 #9
0
파일: pcsensor.c 프로젝트: MacMarc/pcsensor
void interrupt_read_temperatura(usb_dev_handle *dev, float *tempInC, float *tempOutC) {

    int r,i, temperature;
    unsigned char answer[reqIntLen];
    bzero(answer, reqIntLen);

    r = usb_interrupt_read(dev, 0x82, answer, reqIntLen, timeout);
    if( r != reqIntLen )
    {
          perror("USB interrupt read"); bad("USB read failed");
    }


    if(debug) {
      for (i=0;i<reqIntLen; i++) printf("%02x ",answer[i]  & 0xFF);

      printf("\n");
    }

    temperature = (answer[3] & 0xFF) + ((signed char)answer[2] << 8);
    temperature += calibration;
    *tempInC = temperature * (125.0 / 32000.0);

    temperature = (answer[5] & 0xFF) + ((signed char)answer[4] << 8);
    temperature += calibration;
    *tempOutC = temperature * (125.0 / 32000.0);

}
예제 #10
0
int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length)
{
    int bytes_read = -1;

    bytes_read = usb_interrupt_read(dev->device_handle, 0x81, data, length, -1);

    return bytes_read;
}
예제 #11
0
int interrupt_read(struct usb_dev_handle *handle, int ep, char *data, int datalength)
{
	int r;

	r = usb_return(usb_interrupt_read(handle, ep, data, datalength, READ_TIMEOUT),
			"usb_interrupt_read");
	
	return r;
}
예제 #12
0
int INDI::USBDevice::ReadInterrupt(char *buf,int c,int timeout)
{
	int rc;

	rc=usb_interrupt_read(usb_handle,InputEndpoint,buf,c,timeout);
	//rc=usb_bulk_read(usb_handle,InputEndpoint,buf,c,timeout);
	return rc;

}
예제 #13
0
static int
gusb_libusb_get(garmin_usb_packet *ibuf, size_t sz)
{
	unsigned char *buf = &ibuf->dbuf[0];
	int r = -1;

	r = usb_interrupt_read(udev, gusb_intr_in_ep, (char *) buf, sz, TMOUT_I);
	return r;
}
예제 #14
0
/* This function assumes we have locked the receiveBuffer mutex! */
unsigned int 
USBDevice_internalFillReceiveBuffer(LPSKYETEK_DEVICE device, unsigned int timeout)
{
	unsigned char receiveBuffer[64];
	LPUSB_DEVICE usbDevice;
	int result;
	unsigned char retried;
#ifdef LINUX
	unsigned char flushBuffer[3];
#endif

	if((device == NULL) || (device->user == NULL))
		return 0;

	usbDevice = (LPUSB_DEVICE)device->user;

	/* We emptied the buffer so reset all of our pointers */
	usbDevice->receiveBufferReadPtr = usbDevice->receiveBufferWritePtr = usbDevice->receiveBuffer;

#ifdef LINUX
	retried = 0;
again:
#endif
	if((result = usb_interrupt_read(usbDevice->usbDevHandle, 1, receiveBuffer, 64, (timeout == 0) ? 100 : timeout)) < 0)
	{
		/*printf("usb_interrupt_read failed: %d\r\n", result);*/
	
#ifdef LINUX
		if(!retried)
		{
			flushBuffer[0] = 0x00;
			flushBuffer[1] = 0x00;
			flushBuffer[2] = 0x00;
		
			USBDevice_Write(device, flushBuffer, 3, 100);
			USBDevice_Flush();
			retried = 1;
		}
#endif
		return 0;
	}

#ifdef LINUX
	usbDevice->packetParity++;
#endif

	/*printf("Reading - %d \r\n", receiveBuffer[0]);
	for(size_t ix = 0; ix < receiveBuffer[0]; ix++)
		printf("%02x", receiveBuffer[ix]);
	printf("\r\n");*/
	
	memcpy(usbDevice->receiveBuffer, (receiveBuffer + 1), receiveBuffer[0]);
	usbDevice->receiveBufferWritePtr = usbDevice->receiveBuffer + receiveBuffer[0];

	return 1;
}
/**
 * Send a command with data to usb4all controller and reads the answer.
 * Even if some inputs should be read a command to do this has to send before.
 * \param p            pointer to private data structure
 * \param data_out     pointer to data send to controller
 * \param data_in      pointer to buffer where read in data is stored
 * \return             number of bytes read in
 */
int
usb4all_data_io(PrivateData *p, tx_buffer * data_out, tx_buffer * data_in)
{
	int res;

	if (p->usbMode == MODE_BULK) {
		res = usb_bulk_write(p->usbHandle,
				     p->usbEpOut,
				     (char *)data_out->buffer,
				     data_out->use_count,
				     TIMEOUT_WRITE);
	}
	else {
		res = usb_interrupt_write(p->usbHandle,
					  p->usbEpOut,
					  (char *)data_out->buffer,
					  data_out->use_count,
					  TIMEOUT_WRITE);
	}

	if (res < 0) {
		p->hd44780_functions->drv_report(RPT_WARNING,
		   "usb4all_data_io: unable to send, result = %d ...", res);
		return -1;
	}

	/* if a reset command is send the usb4all controller doesn't answer */
	if (data_out->buffer[0] == USB4ALL_RESET) {
		return 0;
	}

	if (res != data_out->use_count) {
		p->hd44780_functions->drv_report(RPT_WARNING,
						 "usb4all_data_io: Want to send %d bytes but currently only %d bytes was send!?",
						 data_out->use_count, res);
		return -1;
	}

	if (p->usbMode == MODE_BULK) {
		res = usb_bulk_read(p->usbHandle,
				    p->usbEpIn,
				    (char *)data_in->buffer,
				    USB4ALL_RX_MAX,
				    TIMEOUT_READ);
	}
	else {
		res = usb_interrupt_read(p->usbHandle,
					 p->usbEpIn,
					 (char *)data_in->buffer,
					 USB4ALL_RX_MAX,
					 TIMEOUT_READ);
	}

	return res;
}
예제 #16
0
int	hidReadPoll(char *buf,int Length, int id)
{
	int rc;
	buf[0] = id;
	rc = usb_interrupt_read(usb_dev, EP_IN , buf+1 , Length, 5000);
//	rc = HidD_GetFeature(hHID, buf, Length);
#if	DEBUG_PKTDUMP
	memdump("RD", buf, Length);
#endif
	return rc;
}
예제 #17
0
파일: usb_libusb.c 프로젝트: Feechka/UOBP
ssize_t
usbReadEndpoint (
  UsbDevice *device,
  unsigned char endpointNumber,
  void *buffer,
  size_t length,
  int timeout
) {
  UsbDeviceExtension *devx = device->extension;
  const UsbEndpoint *endpoint;

  if ((endpoint = usbGetInputEndpoint(device, endpointNumber))) {
    const UsbEndpointDescriptor *descriptor = endpoint->descriptor;
    UsbEndpointTransfer transfer = USB_ENDPOINT_TRANSFER(descriptor);
    ssize_t result = -1;

    switch (transfer) {
      case UsbEndpointTransfer_Bulk:
        result = usb_bulk_read(devx->handle, descriptor->bEndpointAddress,
                               buffer, length, timeout);
        break;

      case UsbEndpointTransfer_Interrupt:
        result = usb_interrupt_read(devx->handle, descriptor->bEndpointAddress,
                                    buffer, length, timeout);
        break;

      default:
        logMessage(LOG_ERR, "USB endpoint input transfer not supported: 0X%02X", transfer);
        result = -ENOSYS;
        break;
    }

    if (result >= 0) {
      if (!usbApplyInputFilters(device, buffer, length, &result)) {
        result = -EIO;
      }
    }

    if (result >= 0) return result;
    errno = -result;
  }

#if defined(__MINGW32__) && !defined(ETIMEDOUT)
#  define ETIMEDOUT 116
#endif /* __MINGW32__ && !ETIMEDOUT */

#ifdef ETIMEDOUT
  if (errno == ETIMEDOUT) errno = EAGAIN;
#endif /* ETIMEDOUT */

  if (errno != EAGAIN) logSystemError("USB endpoint read");
  return -1;
}
예제 #18
0
/*
 * Class:     ch_ntb_usb_LibusbJava
 * Method:    usb_interrupt_read
 * Signature: (JI[BII)I
 */
JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1interrupt_1read
  (JNIEnv *env, jclass obj, jlong dev_handle, jint ep, jbyteArray jbytes, jint size, jint timeout)
  {
  	clearLibusbJavaError();
  	char *bytes = (char *) malloc(size * sizeof(char));
 	int num_bytes = usb_interrupt_read((usb_dev_handle *) dev_handle, ep, bytes, size, timeout);
  	if (!bytes) { return num_bytes; }
  	(*env)->SetByteArrayRegion(env, jbytes, 0, size, (jbyte *) bytes);
  	free(bytes);
 	return num_bytes;
  }
예제 #19
0
/*
 *	HIDデバイスから HID Report を取得する.
 *	受け取ったバッファは先頭の1バイトに必ずReportIDが入っている.
 *
 *	id と Length の組はデバイス側で定義されたものでなければならない.
 *
 *	戻り値はHidD_GetFeatureの戻り値( 0 = 失敗 )
 *
 */
static int hidRead(char *buf, int Length, int id)
{
	int rc;
	buf[0] = id;
	rc = usb_interrupt_read(usb_dev, EP_IN , buf+1 , Length-1, 5000);
//	rc = HidD_GetFeature(h, buf, Length);
#if	DEBUG_PKTDUMP
	memdump("RD", buf, Length);
	printf("id=%d Length=%d rc=%d\n",id,Length,rc);
#endif
	return rc;
}
예제 #20
0
파일: hid_LINUX.cpp 프로젝트: Eih3/v0.83
//  rawhid_recv - receive a packet
//    Inputs:
//	num = device to receive from (zero based)
//	buf = buffer to receive packet
//	len = buffer's size
//	timeout = time to wait, in milliseconds
//    Output:
//	number of bytes received, or -1 on error
//
int rawhid_recv(int num, void *buf, int len, int timeout)
{
	hid_t *hid;
	int r;

	hid = get_hid(num);
	if (!hid || !hid->open) return -1;
	r = usb_interrupt_read(hid->usb, hid->ep_in, buf, len, timeout);
	if (r >= 0) return r;
	if (r == -110) return 0;  // timeout
	return -1;
}
예제 #21
0
static int
write_command (usb_dev_handle *handle,
	       char cmd,
	       const char *in,
	       int in_size,
	       char *out,
	       int out_size)
{
	char buffer[64];
	int rc;
	int ret = -1;

	/* setup write packet */
	memset (buffer, 0x00, sizeof (buffer));
	buffer[0] = cmd;
	if (in != NULL)
		memcpy (buffer + 1, in, in_size);

	/* write to device */
	rc = usb_interrupt_write (handle, 0x01, buffer, 64, 5000);
	if (rc < 0) {
		printf ("Failed to write, got %s\n", usb_strerror ());
		goto out;
	}
	if (rc < 64) {
		printf ("Failed to write stream, only wrote %i\n", rc);
		goto out;
	}

	/* read status */
	rc = usb_interrupt_read (handle, 0x81, buffer, 64, 5000);
	if (rc != 2 + out_size && rc != 64) {
		printf ("Failed to read, got %i bytes\n", rc);
		goto out;
	}
	if (buffer[0] != 0x00) {
		printf ("Failed to get valid command status %i\n", buffer[0]);
		goto out;
	}
	if (buffer[1] != cmd) {
		printf ("Failed to get valid command value %i\n", buffer[1]);
		goto out;
	}

	/* copy data out of buffer */
	if (out != NULL)
		memcpy (out, buffer + 2, out_size);

	/* success */
	ret = 0;
out:
	return ret;
}
예제 #22
0
파일: hid.c 프로젝트: lewurm/ppcskel
struct kbrep *usb_hidkb_getChars() {
	struct usb_device *dev = (struct usb_device*) hidkb.data;
	struct kbrep *ret = (struct kbrep*) malloc(sizeof(struct kbrep));

	memset(ret, 0, 8);
	s8 epnum = dev->conf->intf->endp->bEndpointAddress & 0xf;
	(void) usb_interrupt_read(dev, epnum, (u8*) ret, 8, 0);
#if 0
	printf("============\nusb_interrupt_read:\n");
	hexdump((void*)ret, 8);
#endif
	return ret;
}
예제 #23
0
void*
Xbox360UsbThread::thread_loop()
{
  thread_quit = false;
  while (!thread_quit)
    {
      uint8_t data[20];
      int ret = usb_interrupt_read(handle, 1 /*EndPoint*/, (char*)data, sizeof(data), 0 /*Timeout*/);
      if (ret < 0)
        { // Error
          std::ostringstream str;
          str << "USBError: " << ret << "\n" << usb_strerror() << std::endl;
          str << "Shutting down" << std::endl;
          throw std::runtime_error(str.str());
        }
      else if (ret == 0) // ignore
        {
          // happen with the Xbox360 every now and then, just
          // ignore, seems harmless
        }
      else if (ret == 3) // ignore
        {
          // This data gets send when the controller is accessed the
          // first time after being connected to the USB bus, no idea
          // what it means, it seems to be identical for different
          // controllers, we just ignore it
          //
          // len: 3 Data: 0x01 0x03 0x0e
          // len: 3 Data: 0x02 0x03 0x00
          // len: 3 Data: 0x03 0x03 0x03
          // len: 3 Data: 0x08 0x03 0x00
          // len: 3 Data: 0x01 0x03 0x00
        }
      else if (ret == 20 && data[0] == 0x00 && data[1] == 0x14)
        {
          //LOG("Data in Mailbox");
          Xbox360Msg& msg = (Xbox360Msg&)data;
          // mutex this
          mailbox.push(msg);
        }
      else
        {
          std::cout << "Unknown data: bytes: " << ret << " Data: ";
          for(int j = 0; j < ret; ++j)
            std::cout << boost::format("0x%02x ") % int(data[j]);
          std::cout << std::endl;     
        }
    }

  return NULL;      
}
예제 #24
0
/* reads digital port  */
void usbDIn_USBTEMP(HIDInterface* hid, __u8* value)
{
    __u8 reportID = DIN;
    struct t_read_port {
        __u8 reportID;
        __u8 value;
    } read_port;

    PMD_SendOutputReport(hid, 0, &reportID, 1, FS_DELAY);
    usb_interrupt_read(hid->dev_handle, USB_ENDPOINT_IN | 1,
                       (char *) &read_port, sizeof(read_port), FS_DELAY);
    *value = read_port.value;
    return;
}
예제 #25
0
void usbGetAll_USBDIO96H(HIDInterface* hid, __u8 data[])
{
  __u8 reportID = GET_ALL;
  struct t_get_all {
    __u8 reportID;
    __u8 values[19];
  } get_all;

  PMD_SendOutputReport(hid, GET_ALL, &reportID, sizeof(reportID), FS_DELAY);
  usb_interrupt_read(hid->dev_handle, USB_ENDPOINT_IN | 1,
		     (char *) &get_all, sizeof(get_all), FS_DELAY);
  memcpy(data, get_all.values, 19);
  return;
}
예제 #26
0
파일: pmd.c 프로젝트: JanaMa/psychophysics
int PMD_GetInputReport(HIDInterface* hid, __u8 reportID, __u8 *vals, int nbytes, int delay)
{
  char data[33];
  int ret;

  if ( reportID == 0 ) { // it's an LS device, use endpoint 1 
    ret = usb_interrupt_read(hid->dev_handle, USB_ENDPOINT_IN | 1, data, nbytes, delay);
    if ( ret < 0 ) {
      perror("PMD_GetInputReport");
    }
    memcpy(vals, data, nbytes);
    return ret;
  }
  return -1;
}
예제 #27
0
파일: blazer_usb.c 프로젝트: bsalvador/nut
static int ippon_command(const char *cmd, char *buf, size_t buflen)
{
	char	tmp[64];
	int	ret, len;
	size_t	i;

	snprintf(tmp, sizeof(tmp), "%s", cmd);

	for (i = 0; i < strlen(tmp); i += ret) {

		/* Write data in 8-byte chunks */
		ret = usb_control_msg(udev, USB_ENDPOINT_OUT + USB_TYPE_CLASS + USB_RECIP_INTERFACE,
			0x09, 0x2, 0, &tmp[i], 8, 1000);

		if (ret <= 0) {
			upsdebugx(3, "send: %s", (ret != -ETIMEDOUT) ? usb_strerror() : "Connection timed out");
			return ret;
		}
	}

	upsdebugx(3, "send: %.*s", (int)strcspn(tmp, "\r"), tmp);

	/* Read all 64 bytes of the reply in one large chunk */
	ret = usb_interrupt_read(udev, 0x81, tmp, sizeof(tmp), 1000);

	/*
	 * Any errors here mean that we are unable to read a reply (which
	 * will happen after successfully writing a command to the UPS)
	 */
	if (ret <= 0) {
		upsdebugx(3, "read: %s", (ret != -ETIMEDOUT) ? usb_strerror() : "Connection timed out");
		return ret;
	}

	/*
	 * As Ippon will always return 64 bytes in response, we have to
	 * calculate and return length of actual response data here.
	 * Empty response will look like 0x00 0x0D, otherwise it will be
	 * data string terminated by 0x0D.
	 */
	len = (int)strcspn(tmp, "\r");
	upsdebugx(3, "read: %.*s", len, tmp);
	if (len > 0) {
		len ++;
	}
	snprintf(buf, buflen, "%.*s", len, tmp);
	return len;
}
예제 #28
0
/* reads digital bit  */
void usbDInBit_USBTEMP(HIDInterface* hid, __u8 bit_num, __u8* value)
{
    struct t_read_bit {
        __u8 reportID;
        __u8 value;
    } read_bit;

    read_bit.reportID = DBIT_IN;
    read_bit.value = bit_num;

    PMD_SendOutputReport(hid, 0, (__u8*) &read_bit, 2, FS_DELAY);
    usb_interrupt_read(hid->dev_handle, USB_ENDPOINT_IN | 1,
                       (char *) &read_bit, sizeof(read_bit), FS_DELAY);
    *value = read_bit.value;
    return;
}
예제 #29
0
/* reads digital port  */
__u8 usbDIn_USBPDISO8(HIDInterface* hid, __u8 port)
{
  struct t_read_port {
    __u8 reportID;
    __u8 value;
  } read_port;

  read_port.reportID = DIN;
  read_port.value = port;

  PMD_SendOutputReport(hid, DIN, (__u8*) &read_port, sizeof(read_port), FS_DELAY);
  usb_interrupt_read(hid->dev_handle, USB_ENDPOINT_IN | 1,
		     (char *) &read_port, sizeof(read_port), FS_DELAY);

  return read_port.value;
}
예제 #30
0
static int pickit2_get_firmware_version(void)
{
	int ret;
	uint8_t command[CMD_LENGTH] = {CMD_GET_VERSION, CMD_END_OF_BUFFER};

	ret = usb_interrupt_write(pickit2_handle, ENDPOINT_OUT, (char *)command, CMD_LENGTH, DFLT_TIMEOUT);
	ret = usb_interrupt_read(pickit2_handle, ENDPOINT_IN, (char *)command, CMD_LENGTH, DFLT_TIMEOUT);
	
	msg_pdbg("PICkit2 Firmware Version: %d.%d\n", (int)command[0], (int)command[1]);
	if (ret != CMD_LENGTH) {
		msg_perr("Command Get Firmware Version failed (%s)!\n", usb_strerror());
		return 1;
	}

	return 0;
}