X-Git-Url: http://developer.intra2net.com/git/?p=libftdi;a=blobdiff_plain;f=ftdi%2Fftdi.c;h=01d8f1a1a1c36dc5e38c76837e72da6f1a611712;hp=bd4524800f265e0bb6bb69bfc7b3bf74643978b0;hb=cbabb7d3356f831ba4499583535c006c76c53d14;hpb=be5d7eec32353ad4e86ec996d7c25a1063e46fcb diff --git a/ftdi/ftdi.c b/ftdi/ftdi.c index bd45248..01d8f1a 100644 --- a/ftdi/ftdi.c +++ b/ftdi/ftdi.c @@ -199,8 +199,10 @@ int ftdi_write_data(struct ftdi_context *ftdi, unsigned char *buf, int size) { write_size = size-offset; ret=usb_bulk_write(ftdi->usb_dev, 2, buf+offset, write_size, ftdi->usb_timeout); - if (ret == -1) + if (ret == -1) { + ftdi->error_str = "bulk write failed"; return -1; + } offset += write_size; } @@ -210,14 +212,29 @@ int ftdi_write_data(struct ftdi_context *ftdi, unsigned char *buf, int size) { int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size) { - /* - unsigned char buf[64]; - int read_bytes; - - read_bytes = usb_bulk_read (udev, 0x81, (char *)&buf, 64, USB_TIMEOUT); - */ - ftdi->error_str = "Not implemented yet"; - return -1; + static unsigned char readbuf[64]; + int ret = 1; + int offset = 0; + + while (offset < size && ret > 0) { + ret = usb_bulk_read (ftdi->usb_dev, 0x81, readbuf, 64, ftdi->usb_timeout); + // Skip FTDI status bytes + if (ret >= 2) + ret-=2; + + if (ret > 0) { + memcpy (buf+offset, readbuf+2, ret); + } + + if (ret == -1) { + ftdi->error_str = "bulk read failed"; + return -1; + } + + offset += ret; + } + + return offset; } @@ -507,3 +524,4 @@ int ftdi_erase_eeprom(struct ftdi_context *ftdi) { return 0; } +