libftdi: (tomj) extended FT2232C support
[libftdi] / src / ftdi.h
1 /***************************************************************************
2                           ftdi.h  -  description
3                              -------------------
4     begin                : Fri Apr 4 2003
5     copyright            : (C) 2003 by Intra2net AG
6     email                : opensource@intra2net.com
7  ***************************************************************************/
8
9 /***************************************************************************
10  *                                                                         *
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;             *
14  *                                                                         *
15  ***************************************************************************/
16
17 #ifndef __libftdi_h__
18 #define __libftdi_h__
19
20 #include <usb.h>
21
22 enum ftdi_chip_type { TYPE_AM=0, TYPE_BM=1, TYPE_2232C=2 };
23 enum ftdi_mpsse_mode {
24     BITMODE_RESET  = 0x00,
25     BITMODE_BITBANG= 0x01,
26     BITMODE_MPSSE  = 0x02,
27     BITMODE_SYNCBB = 0x04,
28     BITMODE_MCU    = 0x08,
29     BITMODE_OPTO   = 0x10
30 };
31
32 /* Port interface code for FT2232C */
33 enum ftdi_interface {
34     INTERFACE_ANY = 0,
35     INTERFACE_A   = 1,
36     INTERFACE_B   = 2
37 };
38
39 /* Shifting commands IN MPSSE Mode*/
40 #define MPSSE_WRITE_NEG 0x01   /* Write TDI/DO on negative TCK/SK edge*/
41 #define MPSSE_BITMODE   0x02   /* Write bits, not bytes */
42 #define MPSSE_READ_NEG  0x04   /* Sample TDO/DI on negative TCK/SK edge */
43 #define MPSSE_LSB       0x08   /* LSB first */
44 #define MPSSE_DO_WRITE  0x10   /* Write TDI/DO */
45 #define MPSSE_DO_READ   0x20   /* Read TDO/DI */
46 #define MPSSE_WRITE_TMS 0x40   /* Write TMS/CS */
47
48 /* FTDI MPSSE commands */
49 #define SET_BITS_LOW   0x80
50 /*BYTE DATA*/
51 /*BYTE Direction*/
52 #define SET_BITS_HIGH  0x82
53 /*BYTE DATA*/
54 /*BYTE Direction*/
55 #define GET_BITS_LOW   0x81
56 #define GET_BITS_HIGH  0x83
57 #define LOOPBACK_START 0x84
58 #define LOOPBACK_END   0x85
59 #define TCK_DIVISOR    0x86
60 /* Value Low */
61 /* Value HIGH */ /*rate is 12000000/((1+value)*2) */
62 #define DIV_VALUE(rate) (rate > 6000000)?0:((6000000/rate -1) > 0xffff)? 0xffff: (6000000/rate -1)
63
64 /* Commands in MPSSE and Host Emulation Mode */
65 #define SEND_IMMEDIATE 0x87 
66 #define WAIT_ON_HIGH   0x88
67 #define WAIT_ON_LOW    0x89
68
69 /* Commands in Host Emulation Mode */
70 #define READ_SHORT     0x90
71 /* Address_Low */
72 #define READ_EXTENDED  0x91
73 /* Address High */
74 /* Address Low  */
75 #define WRITE_SHORT    0x92
76 /* Address_Low */
77 #define WRITE_EXTENDED 0x93
78 /* Address High */
79 /* Address Low  */
80
81 struct ftdi_context {
82     // USB specific
83     struct usb_dev_handle *usb_dev;
84     int usb_read_timeout;
85     int usb_write_timeout;
86
87     // FTDI specific
88     enum ftdi_chip_type type;
89     int baudrate;
90     unsigned char bitbang_enabled;
91     unsigned char *readbuffer;
92     unsigned int readbuffer_offset;
93     unsigned int readbuffer_remaining;
94     unsigned int readbuffer_chunksize;
95     unsigned int writebuffer_chunksize;
96
97     // FTDI FT2232C requirecments
98     int interface;   // 0 or 1
99     int index;       // 1 or 2
100     // Endpoints
101     int in_ep;
102     int out_ep;      // 1 or 2
103
104     /* 1: (default) Normal bitbang mode, 2: FT2232C SPI bitbang mode */
105     unsigned char bitbang_mode;
106
107     // misc
108     char *error_str;
109 };
110
111 struct ftdi_eeprom {
112     int vendor_id;
113     int product_id;
114
115     int self_powered;
116     int remote_wakeup;
117     int BM_type_chip;
118
119     int in_is_isochronous;
120     int out_is_isochronous;
121     int suspend_pull_downs;
122
123     int use_serial;
124     int change_usb_version;
125     int usb_version;
126     int max_power;
127
128     char *manufacturer;
129     char *product;
130     char *serial;
131 };
132
133 #ifdef __cplusplus
134 extern "C" {
135 #endif
136
137     int ftdi_init(struct ftdi_context *ftdi);
138     int ftdi_select_interfae(struct ftdi_context *ftdi, enum ftdi_interface interface);
139
140     void ftdi_deinit(struct ftdi_context *ftdi);
141     void ftdi_set_usbdev (struct ftdi_context *ftdi, usb_dev_handle *usbdev);
142     int ftdi_usb_open(struct ftdi_context *ftdi, int vendor, int product);
143     int ftdi_usb_open_desc(struct ftdi_context *ftdi, int vendor, int product,
144                            const char* description, const char* serial);
145     int ftdi_usb_close(struct ftdi_context *ftdi);
146     int ftdi_usb_reset(struct ftdi_context *ftdi);
147     int ftdi_usb_purge_buffers(struct ftdi_context *ftdi);
148
149     int ftdi_set_baudrate(struct ftdi_context *ftdi, int baudrate);
150
151     int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size);
152     int ftdi_read_data_set_chunksize(struct ftdi_context *ftdi, unsigned int chunksize);
153     int ftdi_read_data_get_chunksize(struct ftdi_context *ftdi, unsigned int *chunksize);
154
155     int ftdi_write_data(struct ftdi_context *ftdi, unsigned char *buf, int size);
156     int ftdi_write_data_set_chunksize(struct ftdi_context *ftdi, unsigned int chunksize);
157     int ftdi_write_data_get_chunksize(struct ftdi_context *ftdi, unsigned int *chunksize);
158
159     int ftdi_enable_bitbang(struct ftdi_context *ftdi, unsigned char bitmask);
160     int ftdi_disable_bitbang(struct ftdi_context *ftdi);
161     int ftdi_set_bitmode(struct ftdi_context *ftdi, unsigned char bitmask, unsigned char mode);
162     int ftdi_read_pins(struct ftdi_context *ftdi, unsigned char *pins);
163
164     int ftdi_set_latency_timer(struct ftdi_context *ftdi, unsigned char latency);
165     int ftdi_get_latency_timer(struct ftdi_context *ftdi, unsigned char *latency);
166
167     // init and build eeprom from ftdi_eeprom structure
168     void ftdi_eeprom_initdefaults(struct ftdi_eeprom *eeprom);
169     int  ftdi_eeprom_build(struct ftdi_eeprom *eeprom, unsigned char *output);
170
171     // "eeprom" needs to be valid 128 byte eeprom (generated by the eeprom generator)
172     // the checksum of the eeprom is valided
173     int ftdi_read_eeprom(struct ftdi_context *ftdi, unsigned char *eeprom);
174     int ftdi_write_eeprom(struct ftdi_context *ftdi, unsigned char *eeprom);
175     int ftdi_erase_eeprom(struct ftdi_context *ftdi);
176
177     char *ftdi_get_error_string(struct ftdi_context *ftdi);
178
179 #ifdef __cplusplus
180 }
181 #endif
182
183 #endif /* __libftdi_h__ */