summaryrefslogtreecommitdiff
path: root/src/class/cdc/serial/ftdi_sio.h
blob: 91843d0c4846c0175f94575260385173e8ebbaef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
/*
 * SPDX-FileCopyrightText: Copyright (c) 2023 Ha Thach (tinyusb.org)
 * SPDX-License-Identifier: MIT
 */

#ifndef TUSB_FTDI_SIO_H
#define TUSB_FTDI_SIO_H

#include <stdint.h>

// Commands
#define FTDI_SIO_RESET                0 // Reset the port
#define FTDI_SIO_MODEM_CTRL           1 // Set the modem control register
#define FTDI_SIO_SET_FLOW_CTRL        2 // Set flow control register
#define FTDI_SIO_SET_BAUD_RATE        3 // Set baud rate
#define FTDI_SIO_SET_DATA             4 // Set the data characteristics of the port
#define FTDI_SIO_GET_MODEM_STATUS     5 // Retrieve current value of modem status register
#define FTDI_SIO_SET_EVENT_CHAR       6 // Set the event character
#define FTDI_SIO_SET_ERROR_CHAR       7 // Set the error character
#define FTDI_SIO_SET_LATENCY_TIMER    9 // Set the latency timer
#define FTDI_SIO_GET_LATENCY_TIMER   10 // Get the latency timer
#define FTDI_SIO_SET_BITMODE         11 // Set bitbang mode
#define FTDI_SIO_READ_PINS           12 // Read immediate value of pins
#define FTDI_SIO_READ_EEPROM       0x90 // Read EEPROM

// Channel indices for FT2232, FT2232H and FT4232H devices
#define CHANNEL_A 1
#define CHANNEL_B 2
#define CHANNEL_C 3
#define CHANNEL_D 4

// Port Identifier Table
#define PIT_DEFAULT  0 // SIOA
#define PIT_SIOA     1 // SIOA
// The device this driver is tested with one has only one port
#define PIT_SIOB     2 // SIOB
#define PIT_PARALLEL 3 // Parallel

// FTDI_SIO_RESET
#define FTDI_SIO_RESET_REQUEST                    FTDI_SIO_RESET
#define FTDI_SIO_RESET_REQUEST_TYPE               0x40
#define FTDI_SIO_RESET_SIO                        0
#define FTDI_SIO_RESET_PURGE_RX                   1
#define FTDI_SIO_RESET_PURGE_TX                   2

// FTDI_SIO_SET_BAUDRATE
#define FTDI_SIO_SET_BAUDRATE_REQUEST_TYPE        0x40
#define FTDI_SIO_SET_BAUDRATE_REQUEST             3

enum ftdi_sio_baudrate {
  ftdi_sio_b300 = 0,
  ftdi_sio_b600 = 1,
  ftdi_sio_b1200 = 2,
  ftdi_sio_b2400 = 3,
  ftdi_sio_b4800 = 4,
  ftdi_sio_b9600 = 5,
  ftdi_sio_b19200 = 6,
  ftdi_sio_b38400 = 7,
  ftdi_sio_b57600 = 8,
  ftdi_sio_b115200 = 9
};

// FTDI_SIO_SET_DATA
#define FTDI_SIO_SET_DATA_REQUEST                 FTDI_SIO_SET_DATA
#define FTDI_SIO_SET_DATA_REQUEST_TYPE            0x40
#define FTDI_SIO_SET_DATA_PARITY_NONE             (0x0 << 8)
#define FTDI_SIO_SET_DATA_PARITY_ODD              (0x1 << 8)
#define FTDI_SIO_SET_DATA_PARITY_EVEN             (0x2 << 8)
#define FTDI_SIO_SET_DATA_PARITY_MARK             (0x3 << 8)
#define FTDI_SIO_SET_DATA_PARITY_SPACE            (0x4 << 8)
#define FTDI_SIO_SET_DATA_STOP_BITS_1             (0x0 << 11) // same coding as ACM
#define FTDI_SIO_SET_DATA_STOP_BITS_15            (0x1 << 11) // 1.5 not supported, for future use?
#define FTDI_SIO_SET_DATA_STOP_BITS_2             (0x2 << 11)
#define FTDI_SIO_SET_BREAK                        (0x1 << 14)

// FTDI_SIO_MODEM_CTRL
#define FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE      0x40
#define FTDI_SIO_SET_MODEM_CTRL_REQUEST           FTDI_SIO_MODEM_CTRL

#define FTDI_SIO_SET_DTR_MASK                     0x1UL
#define FTDI_SIO_SET_DTR_HIGH                     ((FTDI_SIO_SET_DTR_MASK << 8) | 1UL)
#define FTDI_SIO_SET_DTR_LOW                      ((FTDI_SIO_SET_DTR_MASK << 8) | 0UL)
#define FTDI_SIO_SET_RTS_MASK                     0x2UL
#define FTDI_SIO_SET_RTS_HIGH                     ((FTDI_SIO_SET_RTS_MASK << 8) | 2UL)
#define FTDI_SIO_SET_RTS_LOW                      ((FTDI_SIO_SET_RTS_MASK << 8) | 0UL)

// FTDI_SIO_SET_FLOW_CTRL
#define FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE       0x40
#define FTDI_SIO_SET_FLOW_CTRL_REQUEST            FTDI_SIO_SET_FLOW_CTRL
#define FTDI_SIO_DISABLE_FLOW_CTRL                0x0
#define FTDI_SIO_RTS_CTS_HS                       (0x1 << 8)
#define FTDI_SIO_DTR_DSR_HS                       (0x2 << 8)
#define FTDI_SIO_XON_XOFF_HS                      (0x4 << 8)

// FTDI_SIO_GET_LATENCY_TIMER
#define  FTDI_SIO_GET_LATENCY_TIMER_REQUEST       FTDI_SIO_GET_LATENCY_TIMER
#define  FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE  0xC0

// FTDI_SIO_SET_LATENCY_TIMER
#define  FTDI_SIO_SET_LATENCY_TIMER_REQUEST       FTDI_SIO_SET_LATENCY_TIMER
#define  FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE  0x40

// FTDI_SIO_SET_EVENT_CHAR
#define  FTDI_SIO_SET_EVENT_CHAR_REQUEST          FTDI_SIO_SET_EVENT_CHAR
#define  FTDI_SIO_SET_EVENT_CHAR_REQUEST_TYPE     0x40

// FTDI_SIO_GET_MODEM_STATUS
#define FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE    0xc0
#define FTDI_SIO_GET_MODEM_STATUS_REQUEST         FTDI_SIO_GET_MODEM_STATUS
#define FTDI_SIO_CTS_MASK                         0x10
#define FTDI_SIO_DSR_MASK                         0x20
#define FTDI_SIO_RI_MASK                          0x40
#define FTDI_SIO_RLSD_MASK                        0x80

// FTDI_SIO_SET_BITMODE
#define FTDI_SIO_SET_BITMODE_REQUEST_TYPE         0x40
#define FTDI_SIO_SET_BITMODE_REQUEST              FTDI_SIO_SET_BITMODE

// Possible bitmodes for FTDI_SIO_SET_BITMODE_REQUEST
#define FTDI_SIO_BITMODE_RESET                    0x00
#define FTDI_SIO_BITMODE_CBUS                     0x20

// FTDI_SIO_READ_PINS
#define FTDI_SIO_READ_PINS_REQUEST_TYPE           0xc0
#define FTDI_SIO_READ_PINS_REQUEST                FTDI_SIO_READ_PINS

// FTDI_SIO_READ_EEPROM
#define FTDI_SIO_READ_EEPROM_REQUEST_TYPE         0xc0
#define FTDI_SIO_READ_EEPROM_REQUEST              FTDI_SIO_READ_EEPROM

#define FTDI_FTX_CBUS_MUX_GPIO    0x8
#define FTDI_FT232R_CBUS_MUX_GPIO 0xa

#define FTDI_RS0_CTS  (1 << 4)
#define FTDI_RS0_DSR  (1 << 5)
#define FTDI_RS0_RI   (1 << 6)
#define FTDI_RS0_RLSD (1 << 7)

#define FTDI_RS_DR    1
#define FTDI_RS_OE    (1 << 1)
#define FTDI_RS_PE    (1 << 2)
#define FTDI_RS_FE    (1 << 3)
#define FTDI_RS_BI    (1 << 4)
#define FTDI_RS_THRE  (1 << 5)
#define FTDI_RS_TEMT  (1 << 6)
#define FTDI_RS_FIFO  (1 << 7)

// chip types and names
typedef enum ftdi_chip_type {
  FTDI_SIO = 0,
//  FTDI_FT232A,
  FTDI_FT232B,
  FTDI_FT2232C,
  FTDI_FT232R,
  FTDI_FT232H,
  FTDI_FT2232H,
  FTDI_FT4232H,
  FTDI_FT4232HA,
  FTDI_FT232HP,
  FTDI_FT233HP,
  FTDI_FT2232HP,
  FTDI_FT2233HP,
  FTDI_FT4232HP,
  FTDI_FT4233HP,
  FTDI_FTX,
  FTDI_UNKNOWN
} ftdi_chip_type_t;

#define FTDI_CHIP_NAMES \
  [FTDI_SIO]       = "SIO", /* the serial part of FT8U100AX */ \
/*  [FTDI_FT232A]    = "FT232A", */ \
  [FTDI_FT232B]    = "FT232B", \
  [FTDI_FT2232C]   = "FT2232C/D", \
  [FTDI_FT232R]    = "FT232R", \
  [FTDI_FT232H]    = "FT232H", \
  [FTDI_FT2232H]   = "FTDI_FT2232H", \
  [FTDI_FT4232H]   = "FT4232H", \
  [FTDI_FT4232HA]  = "FT4232HA", \
  [FTDI_FT232HP]   = "FT232HP", \
  [FTDI_FT233HP]   = "FT233HP", \
  [FTDI_FT2232HP]  = "FT2232HP", \
  [FTDI_FT2233HP]  = "FT2233HP", \
  [FTDI_FT4232HP]  = "FT4232HP", \
  [FTDI_FT4233HP]  = "FT4233HP", \
  [FTDI_FTX]       = "FT-X", \
  [FTDI_UNKNOWN]   = "UNKNOWN"

// private interface data
typedef struct ftdi_private {
  ftdi_chip_type_t chip_type;
  uint8_t channel;                  // channel index, or 0 for legacy types
} ftdi_private_t;

#define FTDI_OK           true
#define FTDI_FAIL         false
#define FTDI_NOT_POSSIBLE -1
#define FTDI_REQUESTED    -2

#endif //TUSB_FTDI_SIO_H