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)
33 struct ftdi_context* ftdi;
34 struct usb_device* dev;
37 std::string description;
41 /*! \brief Constructor.
49 /*! \brief Destructor.
60 bool Context::is_open()
65 int Context::open(int vendor, int product, const std::string& description, const std::string& serial)
69 if (description.empty() && serial.empty())
70 ret = ftdi_usb_open(d->ftdi, vendor, product);
72 ret = ftdi_usb_open_desc(d->ftdi, vendor, product, description.c_str(), serial.c_str());
74 d->dev = usb_device(d->ftdi->usb_dev);
76 if ((ret = ftdi_usb_open_dev(d->ftdi, d->dev)) >= 0)
85 int Context::open(struct usb_device *dev)
95 if ((ret = ftdi_usb_open_dev(d->ftdi, d->dev)) >= 0)
107 return ftdi_usb_close(d->ftdi);
112 return ftdi_usb_reset(d->ftdi);
115 int Context::flush(int mask)
120 ret &= ftdi_usb_purge_rx_buffer(d->ftdi);
122 ret &= ftdi_usb_purge_tx_buffer(d->ftdi);
127 int Context::set_interface(enum ftdi_interface interface)
129 return ftdi_set_interface(d->ftdi, interface);
132 void Context::set_usb_device(struct usb_dev_handle *dev)
134 ftdi_set_usbdev(d->ftdi, dev);
135 d->dev = usb_device(dev);
138 int Context::set_baud_rate(int baudrate)
140 return ftdi_set_baudrate(d->ftdi, baudrate);
143 int Context::set_line_property(enum ftdi_bits_type bits, enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity)
145 return ftdi_set_line_property(d->ftdi, bits, sbit, parity);
148 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)
150 return ftdi_set_line_property2(d->ftdi, bits, sbit, parity, break_type);
153 int Context::read(unsigned char *buf, int size)
155 return ftdi_read_data(d->ftdi, buf, size);
158 int Context::set_read_chunk_size(unsigned int chunksize)
160 return ftdi_read_data_set_chunksize(d->ftdi, chunksize);
163 int Context::read_chunk_size()
166 if (ftdi_read_data_get_chunksize(d->ftdi, &chunk) < 0)
172 int Context::write(unsigned char *buf, int size)
174 return ftdi_write_data(d->ftdi, buf, size);
177 int Context::set_write_chunk_size(unsigned int chunksize)
179 return ftdi_write_data_set_chunksize(d->ftdi, chunksize);
182 int Context::write_chunk_size()
185 if (ftdi_write_data_get_chunksize(d->ftdi, &chunk) < 0)
191 int Context::set_flow_control(int flowctrl)
193 return ftdi_setflowctrl(d->ftdi, flowctrl);
196 int Context::set_modem_control(int mask)
198 int dtr = 0, rts = 0;
205 return ftdi_setdtr_rts(d->ftdi, dtr, rts);
208 int Context::set_dtr(bool state)
210 return ftdi_setdtr(d->ftdi, state);
213 int Context::set_rts(bool state)
215 return ftdi_setrts(d->ftdi, state);
218 int Context::set_latency(unsigned char latency)
220 return ftdi_set_latency_timer(d->ftdi, latency);
223 unsigned Context::latency()
225 unsigned char latency = 0;
226 ftdi_get_latency_timer(d->ftdi, &latency);
230 unsigned short Context::poll_modem_status()
232 unsigned short status = 0;
233 ftdi_poll_modem_status(d->ftdi, &status);
237 int Context::set_event_char(unsigned char eventch, unsigned char enable)
239 return ftdi_set_event_char(d->ftdi, eventch, enable);
242 int Context::set_error_char(unsigned char errorch, unsigned char enable)
244 return ftdi_set_error_char(d->ftdi, errorch, enable);
247 int Context::bitbang_enable(unsigned char bitmask)
249 return ftdi_enable_bitbang(d->ftdi, bitmask);
252 int Context::bitbang_disable()
254 return ftdi_disable_bitbang(d->ftdi);
257 int Context::set_bitmode(unsigned char bitmask, unsigned char mode)
259 return ftdi_set_bitmode(d->ftdi, bitmask, mode);
262 int Context::read_pins(unsigned char *pins)
264 return ftdi_read_pins(d->ftdi, pins);
267 char* Context::error_string()
269 return ftdi_get_error_string(d->ftdi);
272 int Context::get_strings()
275 char vendor[512], desc[512], serial[512];
277 int ret = ftdi_usb_get_strings(d->ftdi, d->dev, vendor, 512, desc, 512, serial, 512);
283 d->description = desc;
292 * \brief Device strings properties.
294 const std::string& Context::vendor()
299 const std::string& Context::description()
301 return d->description;
304 const std::string& Context::serial()
309 void Context::set_context(struct ftdi_context* context)
315 void Context::set_usb_device(struct usb_device *dev)
320 struct ftdi_context* Context::context()
325 class Eeprom::Private
332 struct ftdi_eeprom eeprom;
333 struct ftdi_context* context;
336 Eeprom::Eeprom(Context* parent)
337 : d ( new Private() )
339 d->context = parent->context();
347 void Eeprom::init_defaults()
349 return ftdi_eeprom_initdefaults(&d->eeprom);
352 void Eeprom::set_size(int size)
354 return ftdi_eeprom_setsize(d->context, &d->eeprom, size);
357 int Eeprom::size(unsigned char *eeprom, int maxsize)
359 return ftdi_read_eeprom_getsize(d->context, eeprom, maxsize);
362 int Eeprom::chip_id(unsigned int *chipid)
364 return ftdi_read_chipid(d->context, chipid);
367 int Eeprom::build(unsigned char *output)
369 return ftdi_eeprom_build(&d->eeprom, output);
372 int Eeprom::read(unsigned char *eeprom)
374 return ftdi_read_eeprom(d->context, eeprom);
377 int Eeprom::write(unsigned char *eeprom)
379 return ftdi_write_eeprom(d->context, eeprom);
384 return ftdi_erase_eeprom(d->context);
394 struct ftdi_device_list* list;
397 List::List(struct ftdi_device_list* devlist)
398 : ListBase(), d( new Private() )
404 for (d->list = devlist; d->list != 0; d->list = d->list->next)
407 c->set_usb_device(d->list->dev);
418 // Deallocate instances
419 for (iterator it = begin(); it != end(); it++)
424 ftdi_list_free(&d->list);
430 List* List::find_all(int vendor, int product)
432 struct ftdi_device_list* dlist = 0;
433 struct ftdi_context ftdi;
435 ftdi_usb_find_all(&ftdi, &dlist, vendor, product);
437 return new List(dlist);