Select one of the symbols to view example projects that use it.
 
Outline
#include "stm32469i_eval.h"
#include "stm32469i_eval_ts.h"
ts_driver
ts_orientation
I2C_Address
ts_event_string_tab
ts_gesture_id_string_tab
BSP_TS_Init(uint16_t, uint16_t)
BSP_TS_ITConfig()
BSP_TS_ITGetStatus()
BSP_TS_GetState(TS_StateTypeDef *)
BSP_TS_ITClear()
Files
loading...
CodeScopeSTM32 Libraries and SamplesSTM32469I_EVALstm32469i_eval_ts.c
 
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
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/** ****************************************************************************** * @file stm32469i_eval_ts.c * @author MCD Application Team * @brief This file provides a set of functions needed to manage the Touch * Screen on STM32469I-EVAL evaluation board. ****************************************************************************** * @attention * * Copyright (c) 2017 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** *//* ... */ /* File Info : ----------------------------------------------------------------- User NOTES 1. How To use this driver: -------------------------- - This driver is used to drive the touch screen module of the STM32469I-EVAL evaluation board on the K.O.D Optica Technology 480x800 TFT-LCD mounted on MB1166 daughter board. The touch screen driver IC inside the K.O.D module KM-040TMP-02 is a FT6206 by Focal Tech. 2. Driver description: --------------------- + Initialization steps: o Initialize the TS module using the BSP_TS_Init() function. This function includes the MSP layer hardware resources initialization and the communication layer configuration to start the TS use. The LCD size properties (x and y) are passed as parameters. o If TS interrupt mode is desired, you must configure the TS interrupt mode by calling the function BSP_TS_ITConfig(). The TS interrupt mode is generated as an external interrupt whenever a touch is detected. The interrupt mode internally uses the IO functionalities driver driven by the IO expander, to configure the IT line. + Touch screen use o The touch screen state is captured whenever the function BSP_TS_GetState() is used. This function returns information about the last LCD touch occurred in the TS_StateTypeDef structure. o If TS interrupt mode is used, the function BSP_TS_ITGetStatus() is needed to get the interrupt status. To clear the IT pending bits, you should call the function BSP_TS_ITClear(). o The IT is handled using the corresponding external interrupt IRQ handler, the user IT callback treatment is implemented on the same external interrupt callback. ------------------------------------------------------------------------------*//* ... */ /* Includes ------------------------------------------------------------------*/ #include "stm32469i_eval.h" #include "stm32469i_eval_ts.h" /** @addtogroup BSP * @{ *//* ... */ /** @addtogroup STM32469I_EVAL * @{ *//* ... */ /** @defgroup STM32469I-EVAL_TS STM32469I EVAL TS * @{ *//* ... */ /** @defgroup STM32469I-EVAL_TS_Private_Types_Definitions STM32469I EVAL TS Private Types Definitions * @{ *//* ... */ /** * @} *//* ... */ /** @defgroup STM32469I-EVAL_TS_Private_Defines STM32469I EVAL TS Private Types Defines * @{ *//* ... */ /** * @} *//* ... */ /** @defgroup STM32469I-EVAL_TS_Private_Macros STM32469I EVAL TS Private Macros * @{ *//* ... */ /** * @} *//* ... */ /** @defgroup STM32469I-EVAL_TS_Imported_Variables STM32469I EVAL TS Imported Variables * @{ *//* ... */ /** * @} *//* ... */ /** @defgroup STM32469I-EVAL_TS_Private_Variables STM32469I EVAL TS Private Variables * @{ *//* ... */ static TS_DrvTypeDef *ts_driver; static uint8_t ts_orientation; uint8_t I2C_Address = 0; /* Table for touchscreen event information display on LCD : table indexed on enum @ref TS_TouchEventTypeDef information */ char * ts_event_string_tab[TOUCH_EVENT_NB_MAX] = { "None", "Press down", "Lift up", "Contact" ...}; /* Table for touchscreen gesture Id information display on LCD : table indexed on enum @ref TS_GestureIdTypeDef information */ char * ts_gesture_id_string_tab[GEST_ID_NB_MAX] = { "None", "Move Up", "Move Right", "Move Down", "Move Left", "Zoom In", "Zoom Out" ...}; /** * @} *//* ... */ /** @defgroup STM32469I-EVAL_TS_Private_Function_Prototypes STM32469I EVAL TS Private Function Prototypes * @{ *//* ... */ /** * @} *//* ... */ /** @defgroup STM32469I-EVAL_TS_Public_Functions STM32469I EVAL TS Public Functions * @{ *//* ... */ /** * @brief Initializes and configures the touch screen functionalities and * configures all necessary hardware resources (GPIOs, I2C, clocks..). * @param ts_SizeX : Maximum X size of the TS area on LCD * @param ts_SizeY : Maximum Y size of the TS area on LCD * @retval TS_OK if all initializations are OK. Other value if error. *//* ... */ uint8_t BSP_TS_Init(uint16_t ts_SizeX, uint16_t ts_SizeY) { uint8_t ts_status = TS_OK; uint8_t ts_id1, ts_id2 = 0; /* Note : I2C_Address is un-initialized here, but is not used at all in init function */ /* but the prototype of Init() is like that in template and should be respected */ /* Initialize the communication channel to sensor (I2C) if necessary */ /* that is initialization is done only once after a power up */ ft6x06_ts_drv.Init(I2C_Address); ts_id1 = ft6x06_ts_drv.ReadID(TS_I2C_ADDRESS); if(ts_id1 != FT6206_ID_VALUE) { ts_id2 = ft6x06_ts_drv.ReadID(TS_I2C_ADDRESS_A02); I2C_Address = TS_I2C_ADDRESS_A02; }if (ts_id1 != FT6206_ID_VALUE) { ... } else { I2C_Address = TS_I2C_ADDRESS; }else { ... } /* Scan FT6xx6 TouchScreen IC controller ID register by I2C Read */ /* Verify this is a FT6206 or FT6336G, otherwise this is an error case */ if((ts_id1 == FT6206_ID_VALUE) || (ts_id2 == FT6x36_ID_VALUE)) { /* Found FT6206 : Initialize the TS driver structure */ ts_driver = &ft6x06_ts_drv; /* Get LCD chosen orientation */ if(ts_SizeX < ts_SizeY) { ts_orientation = TS_SWAP_NONE; }if (ts_SizeX < ts_SizeY) { ... } else { ts_orientation = TS_SWAP_XY | TS_SWAP_Y; }else { ... } if(ts_status == TS_OK) { /* Software reset the TouchScreen */ ts_driver->Reset(I2C_Address); /* Calibrate, Configure and Start the TouchScreen driver */ ts_driver->Start(I2C_Address); }if (ts_status == TS_OK) { ... } /* of if(ts_status == TS_OK) */ }if ((ts_id1 == FT6206_ID_VALUE) || (ts_id2 == FT6x36_ID_VALUE)) { ... } else { ts_status = TS_DEVICE_NOT_FOUND; }else { ... } return (ts_status); }{ ... } /** * @brief Configures and enables the touch screen interrupts. * @retval TS_OK if all initializations are OK. Other value if error. *//* ... */ uint8_t BSP_TS_ITConfig(void) { uint8_t ts_status = TS_ERROR; uint8_t io_status = IO_ERROR; /* Initialize the IO */ io_status = BSP_IO_Init(); if(io_status != IO_OK) { return (ts_status); }if (io_status != IO_OK) { ... } /* Configure TS IT line IO : is active low on FT6206 (see data sheet) */ /* Configure TS_INT_PIN (MFX_IO_14) low level to generate MFX_IRQ_OUT in EXTI on MCU */ /* This will call HAL_GPIO_EXTI_Callback() that is setting variable 'mfx_exti_received' to 1b1' */ io_status = BSP_IO_ConfigPin(TS_INT_PIN, IO_MODE_IT_LOW_LEVEL_PU); if(io_status != IO_OK) { return (ts_status); }if (io_status != IO_OK) { ... } /* Enable the TS in interrupt mode */ /* In that case the INT output of FT6206 when new touch is available */ /* is active low and directed on MFX IO14 */ ts_driver->EnableIT(I2C_Address); /* If arrived here : set good status on exit */ ts_status = TS_OK; return (ts_status); }{ ... } /** * @brief Gets the touch screen interrupt status. * @retval TS_IRQ_PENDING if touchscreen IRQ is pending, TS_NO_IRQ_PENDING when no IRQ TS is pending. *//* ... */ uint8_t BSP_TS_ITGetStatus(void) { uint8_t itStatus = TS_NO_IRQ_PENDING; /* By default no IRQ TS pending */ uint32_t mfx_irq_status = 0; /* No MFX IRQ by default */ /* Check status of MFX_IO14 in particular which is the Touch Screen INT pin active low */ mfx_irq_status = BSP_IO_ITGetStatus(TS_INT_PIN); if(mfx_irq_status != 0) /* Note : returned mfx_irq_status = 0x4000 == (1<<TS_INT_PIN) == (1<<14) */ { /* This is Touch Screen INT case : so this is a new touch available that produced the IRQ EXTI */ itStatus = TS_IRQ_PENDING; ...} /* Return the TS IT status */ return (itStatus); }{ ... } /** * @brief Returns status and positions of the touch screen. * @param TS_State: Pointer to touch screen current state structure * @retval TS_OK if all initializations are OK. Other value if error. *//* ... */ uint8_t BSP_TS_GetState(TS_StateTypeDef *TS_State) { static uint32_t _x[TS_MAX_NB_TOUCH] = {0, 0}; static uint32_t _y[TS_MAX_NB_TOUCH] = {0, 0}; uint8_t ts_status = TS_OK; uint16_t tmp; uint16_t Raw_x[TS_MAX_NB_TOUCH]; uint16_t Raw_y[TS_MAX_NB_TOUCH]; uint16_t xDiff; uint16_t yDiff; uint32_t index; #if (TS_MULTI_TOUCH_SUPPORTED == 1) uint32_t weight = 0; uint32_t area = 0; uint32_t event = 0;/* ... */ #endif /* TS_MULTI_TOUCH_SUPPORTED == 1 */ /* Check and update the number of touches active detected */ TS_State->touchDetected = ts_driver->DetectTouch(I2C_Address); if(TS_State->touchDetected) { for(index=0; index < TS_State->touchDetected; index++) { /* Get each touch coordinates */ ts_driver->GetXY(I2C_Address, &(Raw_x[index]), &(Raw_y[index])); if(ts_orientation & TS_SWAP_XY) { tmp = Raw_x[index]; Raw_x[index] = Raw_y[index]; Raw_y[index] = tmp; }if (ts_orientation & TS_SWAP_XY) { ... } if(ts_orientation & TS_SWAP_X) { Raw_x[index] = FT_6206_MAX_WIDTH - 1 - Raw_x[index]; }if (ts_orientation & TS_SWAP_X) { ... } if(ts_orientation & TS_SWAP_Y) { Raw_y[index] = FT_6206_MAX_HEIGHT - 1 - Raw_y[index]; }if (ts_orientation & TS_SWAP_Y) { ... } xDiff = Raw_x[index] > _x[index]? (Raw_x[index] - _x[index]): (_x[index] - Raw_x[index]); yDiff = Raw_y[index] > _y[index]? (Raw_y[index] - _y[index]): (_y[index] - Raw_y[index]); if ((xDiff + yDiff) > 5) { _x[index] = Raw_x[index]; _y[index] = Raw_y[index]; }if ((xDiff + yDiff) > 5) { ... } TS_State->touchX[index] = _x[index]; TS_State->touchY[index] = _y[index]; #if (TS_MULTI_TOUCH_SUPPORTED == 1) /* Get touch info related to the current touch */ ft6x06_TS_GetTouchInfo(I2C_Address, index, &weight, &area, &event); /* Update TS_State structure */ TS_State->touchWeight[index] = weight; TS_State->touchArea[index] = area; /* Remap touch event */ switch(event) { case FT6206_TOUCH_EVT_FLAG_PRESS_DOWN : TS_State->touchEventId[index] = TOUCH_EVENT_PRESS_DOWN; break;case FT6206_TOUCH_EVT_FLAG_PRESS_DOWN : case FT6206_TOUCH_EVT_FLAG_LIFT_UP : TS_State->touchEventId[index] = TOUCH_EVENT_LIFT_UP; break;case FT6206_TOUCH_EVT_FLAG_LIFT_UP : case FT6206_TOUCH_EVT_FLAG_CONTACT : TS_State->touchEventId[index] = TOUCH_EVENT_CONTACT; break;case FT6206_TOUCH_EVT_FLAG_CONTACT : case FT6206_TOUCH_EVT_FLAG_NO_EVENT : TS_State->touchEventId[index] = TOUCH_EVENT_NO_EVT; break;case FT6206_TOUCH_EVT_FLAG_NO_EVENT : default : ts_status = TS_ERROR; break;default }switch (event) { ... } /* of switch(event) */ /* ... */ #endif /* TS_MULTI_TOUCH_SUPPORTED == 1 */ }for (index=0; index < TS_State->touchDetected; index++) { ... } /* of for(index=0; index < TS_State->touchDetected; index++) */ #if (TS_MULTI_TOUCH_SUPPORTED == 1) /* Get gesture Id */ ts_status = BSP_TS_Get_GestureId(TS_State);/* ... */ #endif /* TS_MULTI_TOUCH_SUPPORTED == 1 */ }if (TS_State->touchDetected) { ... } /* end of if(TS_State->touchDetected != 0) */ return (ts_status); }{ ... } #if (TS_MULTI_TOUCH_SUPPORTED == 1) /** * @brief Update gesture Id following a touch detected. * @param TS_State: Pointer to touch screen current state structure * @retval TS_OK if all initializations are OK. Other value if error. *//* ... */ uint8_t BSP_TS_Get_GestureId(TS_StateTypeDef *TS_State) { uint32_t gestureId = 0; uint8_t ts_status = TS_OK; /* Get gesture Id */ ft6x06_TS_GetGestureID(I2C_Address, &gestureId); /* Remap gesture Id to a TS_GestureIdTypeDef value */ switch(gestureId) { case FT6206_GEST_ID_NO_GESTURE : TS_State->gestureId = GEST_ID_NO_GESTURE; break;case FT6206_GEST_ID_NO_GESTURE : case FT6206_GEST_ID_MOVE_UP : TS_State->gestureId = GEST_ID_MOVE_UP; break;case FT6206_GEST_ID_MOVE_UP : case FT6206_GEST_ID_MOVE_RIGHT : TS_State->gestureId = GEST_ID_MOVE_RIGHT; break;case FT6206_GEST_ID_MOVE_RIGHT : case FT6206_GEST_ID_MOVE_DOWN : TS_State->gestureId = GEST_ID_MOVE_DOWN; break;case FT6206_GEST_ID_MOVE_DOWN : case FT6206_GEST_ID_MOVE_LEFT : TS_State->gestureId = GEST_ID_MOVE_LEFT; break;case FT6206_GEST_ID_MOVE_LEFT : case FT6206_GEST_ID_ZOOM_IN : TS_State->gestureId = GEST_ID_ZOOM_IN; break;case FT6206_GEST_ID_ZOOM_IN : case FT6206_GEST_ID_ZOOM_OUT : TS_State->gestureId = GEST_ID_ZOOM_OUT; break;case FT6206_GEST_ID_ZOOM_OUT : default : ts_status = TS_ERROR; break;default }switch (gestureId) { ... } /* of switch(gestureId) */ return(ts_status); }BSP_TS_Get_GestureId (TS_StateTypeDef *TS_State) { ... } /* ... */#endif /* TS_MULTI_TOUCH_SUPPORTED == 1 */ /** * @brief Clears all touch screen interrupts. *//* ... */ void BSP_TS_ITClear(void) { /* Clear TS_INT_PIN IRQ in MFX */ BSP_IO_ITClearPin(TS_INT_PIN); }{ ... } /** * @} *//* ... */ /** @defgroup STM32469I-EVAL_TS_Private_Functions STM32469I EVAL TS Private Functions * @{ *//* ... */ #if (TS_MULTI_TOUCH_SUPPORTED == 1) /** * @brief Function used to reset all touch data before a new acquisition * of touch information. * @param TS_State: Pointer to touch screen current state structure * @retval TS_OK if OK, TE_ERROR if problem found. *//* ... */ uint8_t BSP_TS_ResetTouchData(TS_StateTypeDef *TS_State) { uint8_t ts_status = TS_ERROR; uint32_t index; if (TS_State != (TS_StateTypeDef *)NULL) { TS_State->gestureId = GEST_ID_NO_GESTURE; TS_State->touchDetected = 0; for(index = 0; index < TS_MAX_NB_TOUCH; index++) { TS_State->touchX[index] = 0; TS_State->touchY[index] = 0; TS_State->touchArea[index] = 0; TS_State->touchEventId[index] = TOUCH_EVENT_NO_EVT; TS_State->touchWeight[index] = 0; }for (index = 0; index < TS_MAX_NB_TOUCH; index++) { ... } ts_status = TS_OK; }if (TS_State != (TS_StateTypeDef *)NULL) { ... } /* of if (TS_State != (TS_StateTypeDef *)NULL) */ return (ts_status); }BSP_TS_ResetTouchData (TS_StateTypeDef *TS_State) { ... } /* ... */#endif /* TS_MULTI_TOUCH_SUPPORTED == 1 */ /** * @} *//* ... */ /** * @} *//* ... */ /** * @} *//* ... */ /** * @} *//* ... */