X-Git-Url: http://developer.intra2net.com/git/?a=blobdiff_plain;f=src%2Fftdi.c;h=41496ee1312e5337f25adeaaabc7510908458dd6;hb=ce3940810901906eb00d67fe259d5540a9008630;hp=30b5b550f59a76977442d8d72dede17c3f2d10e4;hpb=97c6b5f63d77f28968f4ad19c6901f11598898c9;p=libftdi diff --git a/src/ftdi.c b/src/ftdi.c index 30b5b55..41496ee 100644 --- a/src/ftdi.c +++ b/src/ftdi.c @@ -93,10 +93,7 @@ int ftdi_init(struct ftdi_context *ftdi) ftdi->writebuffer_chunksize = 4096; ftdi->max_packet_size = 0; - ftdi->interface = 0; - ftdi->index = 0; - ftdi->in_ep = 0x02; - ftdi->out_ep = 0x81; + ftdi_set_interface(ftdi, INTERFACE_ANY); ftdi->bitbang_mode = 1; /* when bitbang is enabled this holds the number of the mode */ ftdi->error_str = NULL; @@ -149,7 +146,10 @@ int ftdi_set_interface(struct ftdi_context *ftdi, enum ftdi_interface interface) { case INTERFACE_ANY: case INTERFACE_A: - /* ftdi_usb_open_desc cares to set the right index, depending on the found chip */ + ftdi->interface = 0; + ftdi->index = INTERFACE_A; + ftdi->in_ep = 0x02; + ftdi->out_ep = 0x81; break; case INTERFACE_B: ftdi->interface = 1; @@ -531,19 +531,6 @@ int ftdi_usb_open_dev(struct ftdi_context *ftdi, libusb_device *dev) else if (desc.bcdDevice == 0x800) ftdi->type = TYPE_4232H; - // Set default interface on dual/quad type chips - switch(ftdi->type) - { - case TYPE_2232C: - case TYPE_2232H: - case TYPE_4232H: - if (!ftdi->index) - ftdi->index = INTERFACE_A; - break; - default: - break; - } - // Determine maximum packet size ftdi->max_packet_size = _ftdi_determine_max_packet_size(ftdi, dev); @@ -630,12 +617,12 @@ int ftdi_usb_open_desc_index(struct ftdi_context *ftdi, int vendor, int product, char string[256]; int i = 0; - if (libusb_init(&ftdi->usb_ctx) < 0) - ftdi_error_return(-11, "libusb_init() failed"); - if (ftdi == NULL) ftdi_error_return(-11, "ftdi context invalid"); + if (libusb_init(&ftdi->usb_ctx) < 0) + ftdi_error_return(-11, "libusb_init() failed"); + if (libusb_get_device_list(ftdi->usb_ctx, &devs) < 0) ftdi_error_return(-12, "libusb_get_device_list() failed"); @@ -656,12 +643,12 @@ int ftdi_usb_open_desc_index(struct ftdi_context *ftdi, int vendor, int product, { if (libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iProduct, (unsigned char *)string, sizeof(string)) < 0) { - libusb_close (ftdi->usb_dev); + ftdi_usb_close_internal (ftdi); ftdi_error_return_free_device_list(-8, "unable to fetch product description", devs); } if (strncmp(string, description, sizeof(string)) != 0) { - libusb_close (ftdi->usb_dev); + ftdi_usb_close_internal (ftdi); continue; } } @@ -1969,7 +1956,7 @@ int ftdi_poll_modem_status(struct ftdi_context *ftdi, unsigned short *status) if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_POLL_MODEM_STATUS_REQUEST, 0, ftdi->index, (unsigned char *)usb_val, 2, ftdi->usb_read_timeout) != 2) ftdi_error_return(-1, "getting modem status failed"); - *status = (usb_val[1] << 8) | usb_val[0]; + *status = (usb_val[1] << 8) | (usb_val[0] & 0xFF); return 0; }