aboutsummaryrefslogtreecommitdiff
path: root/FT245.h
blob: 4ccd118baf35666ee18f8a0d4a5649390d422c73 (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
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
#ifndef FT245_H
#define FT245_H

#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#include "circular_buffer.h"

#define FT245_BUFFER_SIZE_TX 64
#define FT245_BUFFER_SIZE_RX 64

typedef circular_buffer_struct(uint8_t, FT245_BUFFER_SIZE_TX) buffer_tx_t;
typedef circular_buffer_struct(uint8_t, FT245_BUFFER_SIZE_RX) buffer_rx_t;

typedef struct ft245 {
    // Options
    bool full_word_mode;
    // Ring buffers
    buffer_tx_t buffer_tx;
    buffer_rx_t buffer_rx;
    // CLK state
    bool clk_state;
    uint8_t clk_count;
    // To input
    void (*const DATA0_to_input)(void);
    void (*const DATA1_to_input)(void);
    void (*const DATA2_to_input)(void);
    void (*const DATA3_to_input)(void);
    void (*const DATA4_to_input)(void);
    void (*const DATA5_to_input)(void);
    void (*const DATA6_to_input)(void);
    void (*const DATA7_to_input)(void);
    void (*const DATA8_to_input)(void);
    void (*const DATA9_to_input)(void);
    void (*const DATA10_to_input)(void);
    void (*const DATA11_to_input)(void);
    void (*const DATA12_to_input)(void);
    void (*const DATA13_to_input)(void);
    void (*const DATA14_to_input)(void);
    void (*const DATA15_to_input)(void);
    void (*const DATA16_to_input)(void);
    void (*const DATA17_to_input)(void);
    void (*const DATA18_to_input)(void);
    void (*const DATA19_to_input)(void);
    void (*const DATA20_to_input)(void);
    void (*const DATA21_to_input)(void);
    void (*const DATA22_to_input)(void);
    void (*const DATA23_to_input)(void);
    void (*const DATA24_to_input)(void);
    void (*const DATA25_to_input)(void);
    void (*const DATA26_to_input)(void);
    void (*const DATA27_to_input)(void);
    void (*const DATA28_to_input)(void);
    void (*const DATA29_to_input)(void);
    void (*const DATA30_to_input)(void);
    void (*const DATA31_to_input)(void);
    void (*const BE0_to_input)(void);
    void (*const BE1_to_input)(void);
    void (*const BE2_to_input)(void);
    void (*const BE3_to_input)(void);
    // To output
    void (*const DATA0_to_output)(void);
    void (*const DATA1_to_output)(void);
    void (*const DATA2_to_output)(void);
    void (*const DATA3_to_output)(void);
    void (*const DATA4_to_output)(void);
    void (*const DATA5_to_output)(void);
    void (*const DATA6_to_output)(void);
    void (*const DATA7_to_output)(void);
    void (*const DATA8_to_output)(void);
    void (*const DATA9_to_output)(void);
    void (*const DATA10_to_output)(void);
    void (*const DATA11_to_output)(void);
    void (*const DATA12_to_output)(void);
    void (*const DATA13_to_output)(void);
    void (*const DATA14_to_output)(void);
    void (*const DATA15_to_output)(void);
    void (*const DATA16_to_output)(void);
    void (*const DATA17_to_output)(void);
    void (*const DATA18_to_output)(void);
    void (*const DATA19_to_output)(void);
    void (*const DATA20_to_output)(void);
    void (*const DATA21_to_output)(void);
    void (*const DATA22_to_output)(void);
    void (*const DATA23_to_output)(void);
    void (*const DATA24_to_output)(void);
    void (*const DATA25_to_output)(void);
    void (*const DATA26_to_output)(void);
    void (*const DATA27_to_output)(void);
    void (*const DATA28_to_output)(void);
    void (*const DATA29_to_output)(void);
    void (*const DATA30_to_output)(void);
    void (*const DATA31_to_output)(void);
    void (*const BE0_to_output)(void);
    void (*const BE1_to_output)(void);
    void (*const BE2_to_output)(void);
    void (*const BE3_to_output)(void);
    // Set
    void (*const CLK_set)(void);
    void (*const RXF_N_set)(void);
    void (*const TXE_N_set)(void);
    void (*const DATA0_set)(void);
    void (*const DATA1_set)(void);
    void (*const DATA2_set)(void);
    void (*const DATA3_set)(void);
    void (*const DATA4_set)(void);
    void (*const DATA5_set)(void);
    void (*const DATA6_set)(void);
    void (*const DATA7_set)(void);
    void (*const DATA8_set)(void);
    void (*const DATA9_set)(void);
    void (*const DATA10_set)(void);
    void (*const DATA11_set)(void);
    void (*const DATA12_set)(void);
    void (*const DATA13_set)(void);
    void (*const DATA14_set)(void);
    void (*const DATA15_set)(void);
    void (*const DATA16_set)(void);
    void (*const DATA17_set)(void);
    void (*const DATA18_set)(void);
    void (*const DATA19_set)(void);
    void (*const DATA20_set)(void);
    void (*const DATA21_set)(void);
    void (*const DATA22_set)(void);
    void (*const DATA23_set)(void);
    void (*const DATA24_set)(void);
    void (*const DATA25_set)(void);
    void (*const DATA26_set)(void);
    void (*const DATA27_set)(void);
    void (*const DATA28_set)(void);
    void (*const DATA29_set)(void);
    void (*const DATA30_set)(void);
    void (*const DATA31_set)(void);
    void (*const BE0_set)(void);
    void (*const BE1_set)(void);
    void (*const BE2_set)(void);
    void (*const BE3_set)(void);
    // Reset
    void (*const CLK_reset)(void);
    void (*const RXF_N_reset)(void);
    void (*const TXE_N_reset)(void);
    void (*const DATA0_reset)(void);
    void (*const DATA1_reset)(void);
    void (*const DATA2_reset)(void);
    void (*const DATA3_reset)(void);
    void (*const DATA4_reset)(void);
    void (*const DATA5_reset)(void);
    void (*const DATA6_reset)(void);
    void (*const DATA7_reset)(void);
    void (*const DATA8_reset)(void);
    void (*const DATA9_reset)(void);
    void (*const DATA10_reset)(void);
    void (*const DATA11_reset)(void);
    void (*const DATA12_reset)(void);
    void (*const DATA13_reset)(void);
    void (*const DATA14_reset)(void);
    void (*const DATA15_reset)(void);
    void (*const DATA16_reset)(void);
    void (*const DATA17_reset)(void);
    void (*const DATA18_reset)(void);
    void (*const DATA19_reset)(void);
    void (*const DATA20_reset)(void);
    void (*const DATA21_reset)(void);
    void (*const DATA22_reset)(void);
    void (*const DATA23_reset)(void);
    void (*const DATA24_reset)(void);
    void (*const DATA25_reset)(void);
    void (*const DATA26_reset)(void);
    void (*const DATA27_reset)(void);
    void (*const DATA28_reset)(void);
    void (*const DATA29_reset)(void);
    void (*const DATA30_reset)(void);
    void (*const DATA31_reset)(void);
    void (*const BE0_reset)(void);
    void (*const BE1_reset)(void);
    void (*const BE2_reset)(void);
    void (*const BE3_reset)(void);
    // Toggle
    void (*const CLK_toggle)(void);
    // Read
    uint32_t (*const TXE_N_read)(void);
    uint32_t (*const RXF_N_read)(void);
    uint32_t (*const WR_N_read)(void);
    uint32_t (*const SIWU_N_read)(void);
    uint32_t (*const RD_N_read)(void);
    uint32_t (*const OE_N_read)(void);
    uint32_t (*const RST_N_read)(void);
    uint32_t (*const DATA0_read)(void);
    uint32_t (*const DATA1_read)(void);
    uint32_t (*const DATA2_read)(void);
    uint32_t (*const DATA3_read)(void);
    uint32_t (*const DATA4_read)(void);
    uint32_t (*const DATA5_read)(void);
    uint32_t (*const DATA6_read)(void);
    uint32_t (*const DATA7_read)(void);
    uint32_t (*const DATA8_read)(void);
    uint32_t (*const DATA9_read)(void);
    uint32_t (*const DATA10_read)(void);
    uint32_t (*const DATA11_read)(void);
    uint32_t (*const DATA12_read)(void);
    uint32_t (*const DATA13_read)(void);
    uint32_t (*const DATA14_read)(void);
    uint32_t (*const DATA15_read)(void);
    uint32_t (*const DATA16_read)(void);
    uint32_t (*const DATA17_read)(void);
    uint32_t (*const DATA18_read)(void);
    uint32_t (*const DATA19_read)(void);
    uint32_t (*const DATA20_read)(void);
    uint32_t (*const DATA21_read)(void);
    uint32_t (*const DATA22_read)(void);
    uint32_t (*const DATA23_read)(void);
    uint32_t (*const DATA24_read)(void);
    uint32_t (*const DATA25_read)(void);
    uint32_t (*const DATA26_read)(void);
    uint32_t (*const DATA27_read)(void);
    uint32_t (*const DATA28_read)(void);
    uint32_t (*const DATA29_read)(void);
    uint32_t (*const DATA30_read)(void);
    uint32_t (*const DATA31_read)(void);
    uint32_t (*const BE0_read)(void);
    uint32_t (*const BE1_read)(void);
    uint32_t (*const BE2_read)(void);
    uint32_t (*const BE3_read)(void);
} ft245_t;

void ft245_init(ft245_t *ft245);
void ft245_periodic(ft245_t *ft245);
bool ft245_write_buffered(ft245_t *ft245, uint8_t *data, size_t size);
bool ft245_read_buffered(ft245_t *ft245, uint8_t *data, size_t size);
bool ft245_write_word_buffered(ft245_t *ft245, uint32_t word);
bool ft245_read_word_buffered(ft245_t *ft245, uint32_t *word);
size_t ft245_available_read(ft245_t *ft245);
size_t ft245_available_write(ft245_t *ft245);

#endif