source: azure_iot_hub_f767zi/trunk/asp_baseplatform/gdic/adafruitts_stmp610/adafruitts_stmp610.c@ 457

Last change on this file since 457 was 457, checked in by coas-nagasima, 4 years ago

ファイルを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 8.8 KB
Line 
1/*
2 * TOPPERS BASE PLATFORM MIDDLEWARE
3 *
4 * Copyright (C) 2017-2019 by TOPPERS PROJECT
5 * Educational Working Group.
6 *
7 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
8 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
9 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
10 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
11 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
12 * スコード中に含まれていること.
13 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
14 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
15 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
16 * の無保証規定を掲載すること.
17 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
18 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
19 * と.
20 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
21 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
22 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
23 * 報告すること.
24 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
25 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
26 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
27 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
28 * 免責すること.
29 *
30 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
31 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
32 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
33 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
34 * の責任を負わない.
35 *
36 * @(#) $Id$
37 */
38
39/*
40 * Written by Limor Fried/Ladyada for Adafruit Industries.
41 * MIT license, all text above must be included in any redistribution
42 * http://opensource.org/licenses/mit-license.php
43 */
44
45#include <kernel.h>
46#include <t_syslog.h>
47#include <t_stdlib.h>
48#include <sil.h>
49#include <target_syssvc.h>
50#include "device.h"
51#include "pinmode.h"
52#include "adafruitts_stmp610.h"
53
54#define PORT_HIGH 1
55#define PORT_LOW 0
56
57#define TS_MINX 150
58#define TS_MINY 130
59#define TS_MAXX 3800
60#define TS_MAXY 4000
61
62#define cs_set(sw) digitalWrite(hts->cs_pin, (sw))
63
64static uint8_t aTxBuffer[4];
65
66/*
67 * STMP610レジスタ読み出し
68 */
69static ER_UINT
70touchscreen_readRegister(TouchScreen_Handle_t *hts, uint8_t reg)
71{
72 ER_UINT ercd = E_OK;
73
74 if(hts->spi_lock != 0){
75 if((ercd = wai_sem(hts->spi_lock)) != E_OK)
76 return ercd;
77 }
78 cs_set(PORT_LOW);
79
80 aTxBuffer[0] = 0x80 | reg;
81 aTxBuffer[1] = 0;
82#if SPI_WAIT_TIME != 0
83 ercd = spi_transmit(hts->hspi, (uint8_t*)aTxBuffer, 2);
84#else
85 if((ercd = spi_transmit(hts->hspi, (uint8_t*)aTxBuffer, 2)) == E_OK){
86 ercd = spi_wait(hts->hspi, 100);
87 }
88#endif
89
90 if(ercd == E_OK){
91#if SPI_WAIT_TIME != 0
92 ercd = spi_receive(hts->hspi, (uint8_t*)aTxBuffer, 1);
93#else
94 if((ercd = spi_receive(hts->hspi, (uint8_t*)aTxBuffer, 1)) == E_OK){
95 ercd = spi_wait(hts->hspi, 100);
96 }
97#endif
98 }
99 if(ercd == E_OK)
100 ercd = aTxBuffer[0];
101
102 cs_set(PORT_HIGH);
103 if(hts->spi_lock != 0)
104 sig_sem(hts->spi_lock);
105 return ercd;
106}
107
108/*
109 * STMP610レジスタ書き込み
110 */
111ER
112touchscreen_writeRegister(TouchScreen_Handle_t *hts, uint8_t reg, uint8_t val)
113{
114 ER ercd = E_OK;
115
116 if(hts->spi_lock != 0){
117 if((ercd = wai_sem(hts->spi_lock)) != E_OK)
118 return ercd;
119 }
120 cs_set(PORT_LOW);
121
122 aTxBuffer[0] = reg;
123 aTxBuffer[1] = val;
124#if SPI_WAIT_TIME != 0
125 ercd = spi_transmit(hts->hspi, (uint8_t*)aTxBuffer, 2);
126#else
127 if((ercd = spi_transmit(hts->hspi, (uint8_t*)aTxBuffer, 2)) == E_OK){
128 ercd = spi_wait(hts->hspi, 100);
129 }
130#endif
131
132 cs_set(PORT_HIGH);
133 if(hts->spi_lock != 0)
134 sig_sem(hts->spi_lock);
135 return ercd;
136}
137
138
139/*
140 * STMP610 初期化
141 */
142ER
143touchscreen_init(TouchScreen_Handle_t *hts, uint8_t orientation)
144{
145 Arduino_PortControlBlock *pgcb = getGpioTable(DIGITAL_PIN, hts->cs_pin);
146 GPIO_Init_t GPIO_Init_Data;
147 ER ercd;
148 uint32_t i;
149
150 if(hts == NULL)
151 return E_PAR;
152 if(hts->hspi == NULL)
153 return E_PAR;
154 pgcb = getGpioTable(DIGITAL_PIN, hts->cs_pin);
155 if(pgcb == NULL)
156 return E_PAR;
157
158 GPIO_Init_Data.mode = GPIO_MODE_OUTPUT;
159 GPIO_Init_Data.pull = hts->pullmode;
160 GPIO_Init_Data.otype = hts->otype;
161 GPIO_Init_Data.speed = GPIO_SPEED_FAST;
162 gpio_setup(pgcb->giobase, &GPIO_Init_Data, pgcb->giopin);
163
164 /*
165 * VERSIONを検証
166 */
167 if(touchscreen_getversion(hts) != 0x811)
168 return E_SYS;
169 hts->min_x = TS_MINX;
170 hts->min_y = TS_MINY;
171 hts->max_x = TS_MAXX;
172 hts->max_y = TS_MAXY;
173
174 ercd = touchscreen_writeRegister(hts, STMPE_SYS_CTRL1, STMPE_SYS_CTRL1_RESET);
175 dly_tsk(10);
176
177 for(i = 0 ; i < 65 ; i++){
178 touchscreen_readRegister(hts, i);
179 }
180
181 if(ercd == E_OK)
182 ercd = touchscreen_writeRegister(hts, STMPE_SYS_CTRL2, 0x0); /* turn on clocks! */
183 if(ercd == E_OK)
184 ercd = touchscreen_writeRegister(hts, STMPE_TSC_CTRL, STMPE_TSC_CTRL_XYZ | STMPE_TSC_CTRL_EN); /* XYZ and enable! */
185 if(ercd == E_OK)
186 ercd = touchscreen_writeRegister(hts, STMPE_INT_EN, STMPE_INT_EN_TOUCHDET);
187 if(ercd == E_OK)
188 ercd = touchscreen_writeRegister(hts, STMPE_ADC_CTRL1, STMPE_ADC_CTRL1_10BIT | (0x6 << 4)); /* 96 clocks per conversion */
189 if(ercd == E_OK)
190 ercd = touchscreen_writeRegister(hts, STMPE_ADC_CTRL2, STMPE_ADC_CTRL2_6_5MHZ);
191 if(ercd == E_OK)
192 ercd = touchscreen_writeRegister(hts, STMPE_TSC_CFG, STMPE_TSC_CFG_4SAMPLE | STMPE_TSC_CFG_DELAY_1MS | STMPE_TSC_CFG_SETTLE_5MS);
193 if(ercd == E_OK)
194 ercd = touchscreen_writeRegister(hts, STMPE_TSC_FRACTION_Z, 0x6);
195 if(ercd == E_OK)
196 ercd = touchscreen_writeRegister(hts, STMPE_FIFO_TH, 1);
197 if(ercd == E_OK)
198 ercd = touchscreen_writeRegister(hts, STMPE_FIFO_STA, STMPE_FIFO_STA_RESET);
199 if(ercd == E_OK)
200 ercd = touchscreen_writeRegister(hts, STMPE_FIFO_STA, 0); /* unreset */
201 if(ercd == E_OK)
202 ercd = touchscreen_writeRegister(hts, STMPE_TSC_I_DRIVE, STMPE_TSC_I_DRIVE_50MA);
203 if(ercd == E_OK)
204 ercd = touchscreen_writeRegister(hts, STMPE_INT_STA, 0xFF); /* reset all ints */
205 if(ercd == E_OK)
206 ercd = touchscreen_writeRegister(hts, STMPE_INT_CTRL, STMPE_INT_CTRL_POL_HIGH | STMPE_INT_CTRL_ENABLE);
207 return ercd;
208}
209
210/*
211 * STMP610 タッチ判定
212 * param1 hts: Pointer to Touch Screen Handler
213 * result エラーまたはbool判定
214 */
215ER_BOOL
216touchscreen_touched(TouchScreen_Handle_t *hts)
217{
218 ER_BOOL ercd;
219
220 if(hts == NULL)
221 return E_PAR;
222 if((ercd = touchscreen_readRegister(hts, STMPE_TSC_CTRL)) >= E_OK)
223 ercd = (ercd & 0x80) != 0;
224 return ercd;
225}
226
227/*
228 * STMP610 FIFOサイズ読み出し
229 * param1 hts: Pointer to Touch Screen Handler
230 * result エラーまたは現在のアイテム数
231 */
232ER_UINT
233touchscreen_buffersize(TouchScreen_Handle_t *hts)
234{
235 ER_BOOL ercd;
236
237 if(hts == NULL)
238 return E_PAR;
239 if((ercd = touchscreen_readRegister(hts, STMPE_FIFO_STA)) >= E_OK){
240 if((ercd & STMPE_FIFO_STA_EMPTY) == 0)
241 ercd = touchscreen_readRegister(hts, STMPE_FIFO_SIZE);
242 else
243 ercd = 0;
244 }
245 return ercd;
246}
247
248/*
249 * STMP610 ポイント読み出し
250 * param1 hts: Pointer to Touch Screen Handler
251 * param2 pt: Pointer to Point type arry
252 * param3 len: max number of arry items
253 * result エラーまたは設定アイテム数
254 */
255ER_UINT
256touchscreen_getpoint(TouchScreen_Handle_t *hts, TouchScreen_Point_t *pt, uint8_t len)
257{
258 ER_UINT buffer[4], no = 0, ercd;
259 uint32_t i;
260
261 if(hts == NULL || pt == NULL)
262 return E_PAR;
263 while((ercd = touchscreen_buffersize(hts)) > 0){
264 for(i = 0 ; i < 4 ; i++){
265 if((buffer[i] = touchscreen_readRegister(hts, 0xD7)) < E_OK)
266 return buffer[i];
267 }
268 if(no < len){
269 pt->x = buffer[0] << 4;
270 pt->x |= (buffer[1] >> 4 & 0x0F);
271 pt->y = (buffer[1] & 0x0F) << 8;
272 pt->y |= buffer[2] & 0xFF;
273 pt->z = buffer[3];
274 no++;
275 pt++;
276 }
277 }
278 return no;
279}
280
281/*
282 * STMP610 バージョン読み出し
283 */
284ER_UINT
285touchscreen_getversion(TouchScreen_Handle_t *hts)
286{
287 ER_UINT ercd, ercd2;
288
289 if(hts == NULL)
290 return E_PAR;
291
292 if((ercd = touchscreen_readRegister(hts, 0)) >= E_OK){
293 ercd <<= 8;
294 if((ercd2 = touchscreen_readRegister(hts, 1)) >= E_OK){
295 ercd |= ercd2 & 0xFF;
296 return ercd;
297 }
298 ercd = ercd2;
299 }
300 return ercd;
301}
302
Note: See TracBrowser for help on using the repository browser.