38
38
#include "libmpsse_i2c.h"
39
39
#include "ftd2xx_platform.h"
40
40
41
+ static uint8_t ftd2xx_gpio_pins_dir [FTD2XX_MAX_PORT_NB ] = { 0 };
42
+ static uint8_t ftd2xx_gpio_pins_val [FTD2XX_MAX_PORT_NB ] = { 0 };
43
+
41
44
/**
42
45
* @brief Obtain the GPIO decriptor.
43
46
* @param desc - The GPIO descriptor.
@@ -48,9 +51,9 @@ int32_t ftd2xx_gpio_get(struct no_os_gpio_desc **desc,
48
51
const struct no_os_gpio_init_param * param )
49
52
{
50
53
struct ftd2xx_gpio_desc * extra_desc ;
51
- struct ftd2xx_gpio_init * extra_init ;
52
54
struct no_os_gpio_desc * descriptor ;
53
55
FT_STATUS status ;
56
+ bool gpio_dir ;
54
57
int32_t ret ;
55
58
56
59
if (!param || param -> port >= FTD2XX_MAX_DEV_PER_CHIP
@@ -80,8 +83,6 @@ int32_t ftd2xx_gpio_get(struct no_os_gpio_desc **desc,
80
83
extra_desc -> ftHandle = ftHandle [param -> port ];
81
84
}
82
85
83
- extra_init = param -> extra ;
84
- extra_desc -> pins_dir = extra_init -> pins_dir ;
85
86
descriptor -> extra = extra_desc ;
86
87
descriptor -> number = param -> number ;
87
88
descriptor -> port = param -> port ;
@@ -149,16 +150,17 @@ int32_t ftd2xx_gpio_direction_input(struct no_os_gpio_desc *desc)
149
150
150
151
extra_desc = desc -> extra ;
151
152
152
- dir = extra_desc -> pins_dir ;
153
+ dir = ftd2xx_gpio_pins_dir [ desc -> port ] ;
153
154
dir &= ~NO_OS_BIT (desc -> number );
154
155
dir |= NO_OS_BIT (desc -> number ) & no_os_field_prep (NO_OS_BIT (desc -> number ), 0 );
155
- status = FT_WriteGPIO (extra_desc -> ftHandle , (UCHAR )dir , extra_desc -> pins_val );
156
+ status = FT_WriteGPIO (extra_desc -> ftHandle , (UCHAR )dir ,
157
+ ftd2xx_gpio_pins_val [desc -> port ]);
156
158
if (status != FT_OK ) {
157
159
ret = status ;
158
160
return ret ;
159
161
}
160
162
161
- extra_desc -> pins_dir = dir ;
163
+ ftd2xx_gpio_pins_dir [ desc -> port ] = dir ;
162
164
163
165
return 0 ;
164
166
}
@@ -180,10 +182,10 @@ int32_t ftd2xx_gpio_direction_output(struct no_os_gpio_desc *desc,
180
182
int32_t ret ;
181
183
182
184
extra_desc = desc -> extra ;
183
- dir = extra_desc -> pins_dir ;
185
+ dir = ftd2xx_gpio_pins_dir [ desc -> port ] ;
184
186
dir &= ~NO_OS_BIT (desc -> number );
185
- dir |= NO_OS_BIT (desc -> number ) & no_os_field_prep (NO_OS_BIT (desc -> number ), 0 );
186
- val = extra_desc -> pins_val ;
187
+ dir |= NO_OS_BIT (desc -> number ) & no_os_field_prep (NO_OS_BIT (desc -> number ), 1 );
188
+ val = ftd2xx_gpio_pins_val [ desc -> port ] ;
187
189
val &= ~NO_OS_BIT (desc -> number );
188
190
val |= NO_OS_BIT (desc -> number ) & no_os_field_prep (NO_OS_BIT (desc -> number ),
189
191
value );
@@ -193,8 +195,8 @@ int32_t ftd2xx_gpio_direction_output(struct no_os_gpio_desc *desc,
193
195
return ret ;
194
196
}
195
197
196
- extra_desc -> pins_dir = dir ;
197
- extra_desc -> pins_val = val ;
198
+ ftd2xx_gpio_pins_dir [ desc -> port ] = dir ;
199
+ ftd2xx_gpio_pins_val [ desc -> port ] = val ;
198
200
199
201
return 0 ;
200
202
}
@@ -213,7 +215,8 @@ int32_t ftd2xx_gpio_get_direction(struct no_os_gpio_desc *desc,
213
215
struct ftd2xx_gpio_desc * extra_desc ;
214
216
extra_desc = desc -> extra ;
215
217
216
- * direction = no_os_field_get (NO_OS_BIT (desc -> number ), extra_desc -> pins_dir );
218
+ * direction = no_os_field_get (FTD2XX_GPIO_PIN (desc -> number ),
219
+ ftd2xx_gpio_pins_dir [desc -> port ]);
217
220
218
221
return 0 ;
219
222
}
@@ -230,19 +233,26 @@ int32_t ftd2xx_gpio_set_value(struct no_os_gpio_desc *desc, uint8_t value)
230
233
{
231
234
struct ftd2xx_gpio_desc * extra_desc ;
232
235
FT_STATUS status ;
233
- uint8_t val = 0 ;
236
+ uint8_t val ;
234
237
int32_t ret ;
235
238
239
+ if (no_os_field_get (FTD2XX_GPIO_PIN (desc -> number ),
240
+ ftd2xx_gpio_pins_dir [desc -> port ]) == 0 )
241
+ return - EINVAL ;
242
+
236
243
extra_desc = desc -> extra ;
244
+
245
+ val = ftd2xx_gpio_pins_val [desc -> port ];
237
246
val &= ~NO_OS_BIT (desc -> number );
238
247
val |= NO_OS_BIT (desc -> number ) & no_os_field_prep (NO_OS_BIT (desc -> number ),
239
248
value );
240
- status = FT_WriteGPIO (extra_desc -> ftHandle , extra_desc -> pins_dir , val );
249
+ status = FT_WriteGPIO (extra_desc -> ftHandle , ftd2xx_gpio_pins_dir [desc -> port ],
250
+ val );
241
251
if (status != FT_OK ) {
242
252
ret = status ;
243
253
return ret ;
244
254
}
245
- extra_desc -> pins_val = val ;
255
+ ftd2xx_gpio_pins_val [ desc -> port ] = val ;
246
256
247
257
return 0 ;
248
258
}
@@ -263,19 +273,19 @@ int32_t ftd2xx_gpio_get_value(struct no_os_gpio_desc *desc, uint8_t *value)
263
273
int32_t ret ;
264
274
265
275
extra_desc = desc -> extra ;
266
- if (no_os_field_get (NO_OS_BIT (desc -> number ),
267
- extra_desc -> pins_dir ) == NO_OS_GPIO_IN ) {
276
+ if (no_os_field_get (FTD2XX_GPIO_PIN (desc -> number ),
277
+ ftd2xx_gpio_pins_dir [ desc -> port ] ) == NO_OS_GPIO_IN ) {
268
278
status = FT_ReadGPIO (extra_desc -> ftHandle , & val );
269
279
if (status != FT_OK ) {
270
280
ret = status ;
271
281
return ret ;
272
282
}
273
- extra_desc -> pins_val &= ~NO_OS_BIT (desc -> number );
274
- extra_desc -> pins_val |= NO_OS_BIT (desc -> number ) & no_os_field_prep (NO_OS_BIT (
275
- desc -> number ), no_os_field_get (NO_OS_BIT (desc -> number ), val ));
283
+
284
+ * value = no_os_field_get (FTD2XX_GPIO_PIN (desc -> number ), val );
276
285
}
277
286
278
- * value = no_os_field_get (NO_OS_BIT (desc -> number ), extra_desc -> pins_val );
287
+ * value = no_os_field_get (FTD2XX_GPIO_PIN (desc -> number ),
288
+ ftd2xx_gpio_pins_dir [desc -> port ]);
279
289
280
290
return 0 ;
281
291
}
0 commit comments