1 /***************************************************************************
2 ftdi.cpp - C++ wraper for libftdi
4 begin : Mon Oct 13 2008
5 copyright : (C) 2008 by Marek VavruĊĦa
6 email : opensource@intra2net.com and marek@vavrusa.com
7 ***************************************************************************/
9 /***************************************************************************
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU Lesser General Public License *
13 * version 2.1 as published by the Free Software Foundation; *
15 ***************************************************************************/
23 class Context::Private
27 : ftdi(0), dev(0), open(false)
42 struct ftdi_context* ftdi;
43 struct usb_device* dev;
46 std::string description;
50 /*! \brief Constructor.
57 /*! \brief Destructor.
63 bool Context::is_open()
68 int Context::open(int vendor, int product, const std::string& description, const std::string& serial)
72 if (description.empty() && serial.empty())
73 ret = ftdi_usb_open(d->ftdi, vendor, product);
75 ret = ftdi_usb_open_desc(d->ftdi, vendor, product, description.c_str(), serial.c_str());
77 d->dev = usb_device(d->ftdi->usb_dev);
79 if ((ret = ftdi_usb_open_dev(d->ftdi, d->dev)) >= 0)
88 int Context::open(struct usb_device *dev)
98 if ((ret = ftdi_usb_open_dev(d->ftdi, d->dev)) >= 0)
110 return ftdi_usb_close(d->ftdi);
115 return ftdi_usb_reset(d->ftdi);
118 int Context::flush(int mask)
123 ret &= ftdi_usb_purge_rx_buffer(d->ftdi);
125 ret &= ftdi_usb_purge_tx_buffer(d->ftdi);
130 int Context::set_interface(enum ftdi_interface interface)
132 return ftdi_set_interface(d->ftdi, interface);
135 void Context::set_usb_device(struct usb_dev_handle *dev)
137 ftdi_set_usbdev(d->ftdi, dev);
138 d->dev = usb_device(dev);
141 int Context::set_baud_rate(int baudrate)
143 return ftdi_set_baudrate(d->ftdi, baudrate);
146 int Context::set_line_property(enum ftdi_bits_type bits, enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity)
148 return ftdi_set_line_property(d->ftdi, bits, sbit, parity);
151 int Context::set_line_property(enum ftdi_bits_type bits, enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity, enum ftdi_break_type break_type)
153 return ftdi_set_line_property2(d->ftdi, bits, sbit, parity, break_type);
156 int Context::read(unsigned char *buf, int size)
158 return ftdi_read_data(d->ftdi, buf, size);
161 int Context::set_read_chunk_size(unsigned int chunksize)
163 return ftdi_read_data_set_chunksize(d->ftdi, chunksize);
166 int Context::read_chunk_size()
169 if (ftdi_read_data_get_chunksize(d->ftdi, &chunk) < 0)
175 int Context::write(unsigned char *buf, int size)
177 return ftdi_write_data(d->ftdi, buf, size);
180 int Context::set_write_chunk_size(unsigned int chunksize)
182 return ftdi_write_data_set_chunksize(d->ftdi, chunksize);
185 int Context::write_chunk_size()
188 if (ftdi_write_data_get_chunksize(d->ftdi, &chunk) < 0)
194 int Context::set_flow_control(int flowctrl)
196 return ftdi_setflowctrl(d->ftdi, flowctrl);
199 int Context::set_modem_control(int mask)
201 int dtr = 0, rts = 0;
208 return ftdi_setdtr_rts(d->ftdi, dtr, rts);
211 int Context::set_dtr(bool state)
213 return ftdi_setdtr(d->ftdi, state);
216 int Context::set_rts(bool state)
218 return ftdi_setrts(d->ftdi, state);
221 int Context::set_latency(unsigned char latency)
223 return ftdi_set_latency_timer(d->ftdi, latency);
226 unsigned Context::latency()
228 unsigned char latency = 0;
229 ftdi_get_latency_timer(d->ftdi, &latency);
233 unsigned short Context::poll_modem_status()
235 unsigned short status = 0;
236 ftdi_poll_modem_status(d->ftdi, &status);
240 int Context::set_event_char(unsigned char eventch, unsigned char enable)
242 return ftdi_set_event_char(d->ftdi, eventch, enable);
245 int Context::set_error_char(unsigned char errorch, unsigned char enable)
247 return ftdi_set_error_char(d->ftdi, errorch, enable);
250 int Context::bitbang_enable(unsigned char bitmask)
252 return ftdi_enable_bitbang(d->ftdi, bitmask);
255 int Context::bitbang_disable()
257 return ftdi_disable_bitbang(d->ftdi);
260 int Context::set_bitmode(unsigned char bitmask, unsigned char mode)
262 return ftdi_set_bitmode(d->ftdi, bitmask, mode);
265 int Context::read_pins(unsigned char *pins)
267 return ftdi_read_pins(d->ftdi, pins);
270 char* Context::error_string()
272 return ftdi_get_error_string(d->ftdi);
275 int Context::get_strings()
278 char vendor[512], desc[512], serial[512];
280 int ret = ftdi_usb_get_strings(d->ftdi, d->dev, vendor, 512, desc, 512, serial, 512);
286 d->description = desc;
295 * \brief Device strings properties.
297 const std::string& Context::vendor()
302 const std::string& Context::description()
304 return d->description;
307 const std::string& Context::serial()
312 void Context::set_context(struct ftdi_context* context)
318 void Context::set_usb_device(struct usb_device *dev)
323 struct ftdi_context* Context::context()
328 class Eeprom::Private
335 struct ftdi_eeprom eeprom;
336 struct ftdi_context* context;
339 Eeprom::Eeprom(Context* parent)
340 : d ( new Private() )
342 d->context = parent->context();
349 void Eeprom::init_defaults()
351 return ftdi_eeprom_initdefaults(&d->eeprom);
354 void Eeprom::set_size(int size)
356 return ftdi_eeprom_setsize(d->context, &d->eeprom, size);
359 int Eeprom::size(unsigned char *eeprom, int maxsize)
361 return ftdi_read_eeprom_getsize(d->context, eeprom, maxsize);
364 int Eeprom::chip_id(unsigned int *chipid)
366 return ftdi_read_chipid(d->context, chipid);
369 int Eeprom::build(unsigned char *output)
371 return ftdi_eeprom_build(&d->eeprom, output);
374 int Eeprom::read(unsigned char *eeprom)
376 return ftdi_read_eeprom(d->context, eeprom);
379 int Eeprom::write(unsigned char *eeprom)
381 return ftdi_write_eeprom(d->context, eeprom);
386 return ftdi_erase_eeprom(d->context);
392 Private(struct ftdi_device_list* devlist)
398 ftdi_list_free(&list);
401 struct ftdi_device_list* list;
404 List::List(struct ftdi_device_list* devlist)
405 : ListBase(), d( new Private(devlist) )
410 for (d->list = devlist; d->list != 0; d->list = d->list->next)
413 c.set_usb_device(d->list->dev);
424 List* List::find_all(int vendor, int product)
426 struct ftdi_device_list* dlist = 0;
427 struct ftdi_context ftdi;
429 ftdi_usb_find_all(&ftdi, &dlist, vendor, product);
431 return new List(dlist);