1 | /*
|
---|
2 | * TOPPERS/ASP Kernel
|
---|
3 | * Toyohashi Open Platform for Embedded Real-Time Systems/
|
---|
4 | * Advanced Standard Profile Kernel
|
---|
5 | *
|
---|
6 | * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
|
---|
7 | * Toyohashi Univ. of Technology, JAPAN
|
---|
8 | * Copyright (C) 2004-2012 by Embedded and Real-Time Systems Laboratory
|
---|
9 | * Graduate School of Information Science, Nagoya Univ., JAPAN
|
---|
10 | * Copyright (C) 2015-2016 by TOPPERS PROJECT Educational Working Group.
|
---|
11 | *
|
---|
12 | * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
|
---|
13 | * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
|
---|
14 | * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
|
---|
15 | * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
|
---|
16 | * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
|
---|
17 | * スコード中に含まれていること.
|
---|
18 | * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
|
---|
19 | * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
|
---|
20 | * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
|
---|
21 | * の無保証規定を掲載すること.
|
---|
22 | * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
|
---|
23 | * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
|
---|
24 | * と.
|
---|
25 | * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
|
---|
26 | * 作権表示,この利用条件および下記の無保証規定を掲載すること.
|
---|
27 | * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
|
---|
28 | * 報告すること.
|
---|
29 | * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
|
---|
30 | * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
|
---|
31 | * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
|
---|
32 | * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
|
---|
33 | * 免責すること.
|
---|
34 | *
|
---|
35 | * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
|
---|
36 | * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
|
---|
37 | * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
|
---|
38 | * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
|
---|
39 | * の責任を負わない.
|
---|
40 | *
|
---|
41 | * $Id$
|
---|
42 | */
|
---|
43 |
|
---|
44 | /*
|
---|
45 | * LCDシールド制御プログラムの本体
|
---|
46 | */
|
---|
47 |
|
---|
48 | #include <kernel.h>
|
---|
49 | #include <t_syslog.h>
|
---|
50 | #include <t_stdlib.h>
|
---|
51 | #include <stdio.h>
|
---|
52 | #include <string.h>
|
---|
53 | #include <target_syssvc.h>
|
---|
54 | #include "syssvc/serial.h"
|
---|
55 | #include "syssvc/syslog.h"
|
---|
56 | #include "kernel_cfg.h"
|
---|
57 | #include "device.h"
|
---|
58 | #include "spi.h"
|
---|
59 | #include "pinmode.h"
|
---|
60 | #include "adafruit_st7735.h"
|
---|
61 | #ifdef USE_MSC_FILE
|
---|
62 | #include "storagedevice.h"
|
---|
63 | #include "mscdiskio.h"
|
---|
64 | #endif
|
---|
65 | #include "lcdshield.h"
|
---|
66 | #include "adc.h"
|
---|
67 | #include "topamelogo.h"
|
---|
68 |
|
---|
69 | /*
|
---|
70 | * サービスコールのエラーのログ出力
|
---|
71 | */
|
---|
72 | Inline void
|
---|
73 | svc_perror(const char *file, int_t line, const char *expr, ER ercd)
|
---|
74 | {
|
---|
75 | if (ercd < 0) {
|
---|
76 | t_perror(LOG_ERROR, file, line, expr, ercd);
|
---|
77 | }
|
---|
78 | }
|
---|
79 |
|
---|
80 | #define SVC_PERROR(expr) svc_perror(__FILE__, __LINE__, #expr, (expr))
|
---|
81 | #define ABS(X) ((X) > 0 ? (X) : -(X))
|
---|
82 |
|
---|
83 |
|
---|
84 | /*
|
---|
85 | * 使用する変数の定義
|
---|
86 | */
|
---|
87 | static const Point testPolygon[7] = {
|
---|
88 | {0, 0},
|
---|
89 | {127, 159},
|
---|
90 | {64, 0},
|
---|
91 | {64, 159},
|
---|
92 | {127, 0},
|
---|
93 | {0, 159},
|
---|
94 | {0, 0}
|
---|
95 | };
|
---|
96 |
|
---|
97 | static const uint32_t pos_tbl[NUM_JSPOSITION-1][2] = {
|
---|
98 | { 500, JS_DOWN },
|
---|
99 | { 1000, JS_RIGHT },
|
---|
100 | { 1500, JS_ON },
|
---|
101 | { 2500, JS_UP },
|
---|
102 | { 3800, JS_LEFT }
|
---|
103 | };
|
---|
104 | static const char *pos_str[NUM_JSPOSITION-1] = {
|
---|
105 | " ON ",
|
---|
106 | " UP ",
|
---|
107 | " DOWN ",
|
---|
108 | " LEFT ",
|
---|
109 | " RIGHT "
|
---|
110 | };
|
---|
111 |
|
---|
112 |
|
---|
113 | LCD_Handler_t LcdHandle;
|
---|
114 | LCD_DrawProp_t DrawProp;
|
---|
115 | uint8_t msc_state;
|
---|
116 |
|
---|
117 | #define NUM_ADCBUF 1 /* 96:1ms */
|
---|
118 | volatile uint32_t uhADCxConvertedValue;
|
---|
119 |
|
---|
120 | #ifndef USE_MSC_FILE
|
---|
121 | uint32_t sdbuffer[514/4];
|
---|
122 | #endif
|
---|
123 |
|
---|
124 | /* Buffer used for transmission */
|
---|
125 | uint8_t aTxBuffer[BUFFERSIZE];
|
---|
126 |
|
---|
127 | /* Buffer used for reception */
|
---|
128 | uint8_t aRxBuffer[BUFFERSIZE];
|
---|
129 |
|
---|
130 | static uint32_t heap_area[2*1024];
|
---|
131 |
|
---|
132 | uint32_t heap_param[2] = {
|
---|
133 | (uint32_t)heap_area,
|
---|
134 | (2*4*1024)
|
---|
135 | };
|
---|
136 |
|
---|
137 | #ifdef USE_MSC_FILE
|
---|
138 | /*
|
---|
139 | * 時刻の取出し
|
---|
140 | */
|
---|
141 | static uint32_t get_fat_time(void)
|
---|
142 | {
|
---|
143 | int reqtime = 0;
|
---|
144 | struct tm2 timedate;
|
---|
145 |
|
---|
146 | rtc_get_time(&timedate);
|
---|
147 | reqtime = ((timedate.tm_year-10)<<25)+(timedate.tm_mon<<21)+(timedate.tm_mday<<16);
|
---|
148 | reqtime += (timedate.tm_hour<<11)+(timedate.tm_min<<5)+(timedate.tm_sec/2);
|
---|
149 | return reqtime;
|
---|
150 | }
|
---|
151 | #endif
|
---|
152 |
|
---|
153 | /*
|
---|
154 | * SW1割込み
|
---|
155 | */
|
---|
156 | void sw_int(void)
|
---|
157 | {
|
---|
158 | syslog_0(LOG_NOTICE, "## sw_int() ##");
|
---|
159 | }
|
---|
160 |
|
---|
161 | /*
|
---|
162 | * GPIO設定関数
|
---|
163 | */
|
---|
164 | static void
|
---|
165 | pinMode(uint8_t no, uint32_t mode)
|
---|
166 | {
|
---|
167 | Arduino_PortControlBlock *pgcb = getGpioTable(DIGITAL_PIN, no);
|
---|
168 | GPIO_Init_t GPIO_Init_Data;
|
---|
169 |
|
---|
170 | if(pgcb == NULL)
|
---|
171 | return;
|
---|
172 | pinClock(no);
|
---|
173 | GPIO_Init_Data.mode = mode;
|
---|
174 | GPIO_Init_Data.pull = GPIO_PULLMODE;
|
---|
175 | GPIO_Init_Data.otype = GPIO_OTYPE;
|
---|
176 | GPIO_Init_Data.speed = GPIO_SPEED_FAST;
|
---|
177 | gpio_setup(pgcb->giobase, &GPIO_Init_Data, pgcb->giopin);
|
---|
178 | }
|
---|
179 |
|
---|
180 |
|
---|
181 | /*
|
---|
182 | * グラフィック表示テスト
|
---|
183 | */
|
---|
184 | void
|
---|
185 | grapics_test(LCD_Handler_t *hlcd)
|
---|
186 | {
|
---|
187 | uint16_t x, y;
|
---|
188 | int i;
|
---|
189 |
|
---|
190 | DrawProp.BackColor = ST7735_BLACK;
|
---|
191 | lcd_fillScreen(&DrawProp);
|
---|
192 | dly_tsk(1000);
|
---|
193 | lcd_drawPixel(hlcd, hlcd->_width/2, hlcd->_height/2, ST7735_GREEN);
|
---|
194 | dly_tsk(1000);
|
---|
195 |
|
---|
196 | lcd_fillScreen(&DrawProp);
|
---|
197 | for(y=0; y < hlcd->_height; y+=5) {
|
---|
198 | lcd_drawFastHLine(hlcd, 0, y, hlcd->_width, ST7735_RED);
|
---|
199 | }
|
---|
200 | for (x=0; x < hlcd->_width; x+=5) {
|
---|
201 | lcd_drawFastVLine(hlcd, x, 0, hlcd->_height, ST7735_BLUE);
|
---|
202 | }
|
---|
203 | dly_tsk(1000);
|
---|
204 |
|
---|
205 | lcd_fillScreen(&DrawProp);
|
---|
206 | DrawProp.TextColor = ST7735_GREEN;
|
---|
207 | lcd_drawPolygon(&DrawProp, (Point *)testPolygon, sizeof(testPolygon)/sizeof(Point));
|
---|
208 | dly_tsk(1000);
|
---|
209 |
|
---|
210 | lcd_fillScreen(&DrawProp);
|
---|
211 | DrawProp.TextColor = ST7735_GREEN;
|
---|
212 | for (x=0; x < hlcd->_width; x+=6) {
|
---|
213 | lcd_drawRect(&DrawProp, hlcd->_width/2 -x/2, hlcd->_height/2 -x/2 , x, x);
|
---|
214 | }
|
---|
215 | for(i = 0 ; i < 3 ; i++){
|
---|
216 | lcd_invertDisplay(hlcd, true);
|
---|
217 | dly_tsk(500);
|
---|
218 | lcd_invertDisplay(hlcd, false);
|
---|
219 | dly_tsk(500);
|
---|
220 | }
|
---|
221 | lcd_fillScreen(&DrawProp);
|
---|
222 | lcd_drawBitmap(hlcd, 33, 48, (uint8_t *)topamelogo);
|
---|
223 | dly_tsk(1000);
|
---|
224 | }
|
---|
225 |
|
---|
226 | /*
|
---|
227 | * USB HOST INFORMATION CALLBACK
|
---|
228 | * parameter1: Host Handler
|
---|
229 | * parameter2: Device Handler
|
---|
230 | * parameter3: Host state ID.
|
---|
231 | */
|
---|
232 | static void USBH_UserProcess(USBH_HandleTypeDef *phost, TUSBH_Device_t *pdevice, uint8_t id)
|
---|
233 | {
|
---|
234 | msc_state = id;
|
---|
235 | if(pdevice->pClass != NULL){
|
---|
236 | syslog_3(LOG_NOTICE, "## CLASS[%s](%d)(%d) ##", pdevice->pClass->Name, pdevice->type, id);
|
---|
237 | }
|
---|
238 | }
|
---|
239 |
|
---|
240 | /*
|
---|
241 | * メインタスク
|
---|
242 | */
|
---|
243 | void
|
---|
244 | main_task(intptr_t exinf)
|
---|
245 | {
|
---|
246 | #ifdef USE_MSC_FILE
|
---|
247 | StorageDevice_t *psdev;
|
---|
248 | #else
|
---|
249 | TUSBH_ERCODE status = TUSBH_E_OK;
|
---|
250 | char pdrv = 0;
|
---|
251 | #endif
|
---|
252 | SPI_Init_t spi_initd;
|
---|
253 | USB_OTG_Init_t USB_Data_Init;
|
---|
254 | LCD_Handler_t *hlcd;
|
---|
255 | SPI_Handle_t *hspi;
|
---|
256 | USB_OTG_Handle_t *husb;
|
---|
257 | USBH_HandleTypeDef *husbh;
|
---|
258 | FLGPTN flgptn;
|
---|
259 | ER_UINT ercd;
|
---|
260 | int sens = 1000;
|
---|
261 | int i;
|
---|
262 |
|
---|
263 | SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)));
|
---|
264 | syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (int_t) exinf);
|
---|
265 |
|
---|
266 | /*
|
---|
267 | * シリアルポートの初期化
|
---|
268 | *
|
---|
269 | * システムログタスクと同じシリアルポートを使う場合など,シリアル
|
---|
270 | * ポートがオープン済みの場合にはここでE_OBJエラーになるが,支障は
|
---|
271 | * ない.
|
---|
272 | */
|
---|
273 | ercd = serial_opn_por(TASK_PORTID);
|
---|
274 | if (ercd < 0 && MERCD(ercd) != E_OBJ) {
|
---|
275 | syslog(LOG_ERROR, "%s (%d) reported by `serial_opn_por'.",
|
---|
276 | itron_strerror(ercd), SERCD(ercd));
|
---|
277 | }
|
---|
278 | SVC_PERROR(serial_ctl_por(TASK_PORTID,
|
---|
279 | (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV)));
|
---|
280 |
|
---|
281 | syslog_0(LOG_NOTICE, "## START ##");
|
---|
282 | /*
|
---|
283 | * CS PORT(D10-PB6)
|
---|
284 | */
|
---|
285 | pinMode(CS_PORT, GPIO_MODE_OUTPUT);
|
---|
286 | /*
|
---|
287 | * RS PORT(D8-PA9)
|
---|
288 | */
|
---|
289 | pinMode(RS_PORT, GPIO_MODE_OUTPUT);
|
---|
290 | /*
|
---|
291 | * RST PORT(D9-PC7)
|
---|
292 | */
|
---|
293 | pinMode(RST_PORT, GPIO_MODE_OUTPUT);
|
---|
294 |
|
---|
295 | spi_initd.Prescaler = SPI_BAUDRATEPRESCALER_64;
|
---|
296 | spi_initd.Direction = SPI_DIRECTION_2LINES;
|
---|
297 | spi_initd.CLKPhase = SPI_PHASE_1EDGE;
|
---|
298 | spi_initd.CLKPolarity = SPI_POLARITY_LOW;
|
---|
299 | spi_initd.CRC = SPI_CRC_DISABLE;
|
---|
300 | spi_initd.CRCPolynomial = 7;
|
---|
301 | spi_initd.DataSize = SPI_DATASIZE_8BIT;
|
---|
302 | spi_initd.SignBit = SPI_DATA_MSB;
|
---|
303 | spi_initd.NSS = SPI_NSS_SOFT;
|
---|
304 | spi_initd.TIMode = SPI_TIMODE_DISABLE;
|
---|
305 | spi_initd.Mode = SPI_MODE_MASTER;
|
---|
306 | spi_initd.semid = SPI1DMA_SEM;
|
---|
307 | spi_initd.semlock = 0;
|
---|
308 | if((hspi = spi_init(SPI1_PORTID, &spi_initd)) == NULL){
|
---|
309 | syslog_0(LOG_ERROR, "spi_start initialize error !");
|
---|
310 | }
|
---|
311 |
|
---|
312 | /* Init USB OTG Hard */
|
---|
313 | /* Set the LL Driver parameters */
|
---|
314 | USB_Data_Init.usb_otg_mode = USB_OTG_MODE_HOST;
|
---|
315 | USB_Data_Init.host_channels = 11; /* HOST */
|
---|
316 | USB_Data_Init.dma_enable = 0;
|
---|
317 | USB_Data_Init.low_power_enable = 0;
|
---|
318 | USB_Data_Init.phy_itface = USB_PHY_EMBEDDED;
|
---|
319 | USB_Data_Init.sof_enable = 0;
|
---|
320 | USB_Data_Init.speed = USB_SPEED_FULL;
|
---|
321 | USB_Data_Init.vbus_sensing_enable = 0; /* HOST */
|
---|
322 | USB_Data_Init.lpm_enable = 0;
|
---|
323 | USB_Data_Init.use_external_vbus = 0;
|
---|
324 | husb = usbo_init(USB1_PORTID, &USB_Data_Init);
|
---|
325 |
|
---|
326 | /*
|
---|
327 | * USB HOSTミドルウェア設定
|
---|
328 | */
|
---|
329 | husbh = (USBH_HandleTypeDef *)malloc(sizeof(USBH_HandleTypeDef));
|
---|
330 | husbh->pSysData = husb;
|
---|
331 | tusbhInit(husbh, USBH_UserProcess, 0);
|
---|
332 | #ifdef USE_MSC_FILE
|
---|
333 | psdev = SDMGetStorageDevice(MSC_DEVNO);
|
---|
334 | psdev->_sdev_local[1] = husbh;
|
---|
335 | SDeviceHead._get_datetime = get_fat_time;
|
---|
336 | #endif
|
---|
337 |
|
---|
338 | /*
|
---|
339 | * USB HOSTスタート
|
---|
340 | */
|
---|
341 | tusbhStart(husbh);
|
---|
342 |
|
---|
343 | i = 0;
|
---|
344 | while(msc_state != HOST_USER_CLASS_ACTIVE && i < 15){
|
---|
345 | syslog_2(LOG_NOTICE, " WAIT MSC READY(%d)(%d) !", msc_state, i);
|
---|
346 | dly_tsk(1000);
|
---|
347 | i++;
|
---|
348 | }
|
---|
349 | if(msc_state != HOST_USER_CLASS_ACTIVE)
|
---|
350 | syslog_0(LOG_NOTICE, "MSC INITIAL ERROR !");
|
---|
351 |
|
---|
352 | #ifndef USE_MSC_FILE
|
---|
353 | if(msc_state == HOST_USER_CLASS_ACTIVE && tusbhMscUnitIsReady(husbh, pdrv)){
|
---|
354 | unsigned char *p;
|
---|
355 | int j, bpb;
|
---|
356 | int SecPerCls, Rsv, NumFat, Fsize, RootDirC, RootSec, tsect;
|
---|
357 | p = (unsigned char *)sdbuffer;
|
---|
358 | for(i = 0 ; i < 1 ; i++){
|
---|
359 | status = tusbhMscRead(husbh, pdrv, i, (uint8_t *)sdbuffer, 1);
|
---|
360 | syslog_3(LOG_NOTICE, "## status(%d) i(%d) sdbuffer[%08x] ##", status, i, sdbuffer);
|
---|
361 | dly_tsk(300);
|
---|
362 | if(i == 0){
|
---|
363 | if(p[0x36] == 'F' && p[0x37] == 'A' && p[0x38] == 'T')
|
---|
364 | bpb = 0;
|
---|
365 | else{
|
---|
366 | bpb = p[0x1c6];
|
---|
367 | bpb |= p[0x1c7]<<8;
|
---|
368 | bpb |= p[0x1c8]<<16;
|
---|
369 | bpb |= p[0x1c9]<<24;
|
---|
370 | }
|
---|
371 | }
|
---|
372 | printf("\nsec(%d) ", i);
|
---|
373 | for(j = 0 ; j < 512 ; j++){
|
---|
374 | if((j % 16) == 0)
|
---|
375 | printf("\n%03x ", j);
|
---|
376 | printf("%02x ", p[j]);
|
---|
377 | }
|
---|
378 | printf("\n");
|
---|
379 | }
|
---|
380 | syslog_1(LOG_NOTICE, "## bpb(%08x) ##", bpb);
|
---|
381 | if(bpb != 0){
|
---|
382 | status = tusbhMscRead(husbh, pdrv, bpb, (uint8_t *)sdbuffer, 1);
|
---|
383 | syslog_3(LOG_NOTICE, "## status(%d) i(%d) sdbuffer[%08x] ##", status, bpb, sdbuffer);
|
---|
384 | dly_tsk(300);
|
---|
385 | printf("\nsec(%d) ", bpb);
|
---|
386 | for(j = 0 ; j < 512 ; j++){
|
---|
387 | if((j % 16) == 0)
|
---|
388 | printf("\n%03x ", j);
|
---|
389 | printf("%02x ", p[j]);
|
---|
390 | }
|
---|
391 | printf("\n");
|
---|
392 | }
|
---|
393 | SecPerCls = p[13];
|
---|
394 | Rsv = p[14] + (p[15] << 8);
|
---|
395 | NumFat = p[16];
|
---|
396 | RootDirC = p[17] + (p[18]<<8);
|
---|
397 | Fsize = p[22] + (p[23] << 8);
|
---|
398 | if(Fsize == 0){
|
---|
399 | Fsize = p[36] + (p[37] << 8);
|
---|
400 | RootSec = p[44] + (p[45] << 8) + (p[46] << 16) + (p[47] << 24);
|
---|
401 | }
|
---|
402 | else
|
---|
403 | RootSec = bpb + Rsv + (NumFat * Fsize);
|
---|
404 | tsect = p[32] + (p[33] << 8) + (p[34] << 16) + (p[35] << 24);
|
---|
405 | if(tsect == 0)
|
---|
406 | tsect = p[19] + (p[20] << 8) + (p[21] << 16) + (p[22] << 24);
|
---|
407 | syslog_4(LOG_NOTICE, "## SecPerCls(%d) Rsv(%d) NumFat(%d) RootDirC(%d) ##", SecPerCls, Rsv, NumFat, RootDirC);
|
---|
408 | syslog_3(LOG_NOTICE, "## Fsize(%d) RootSec(%d) totalsec(%d) ##", Fsize, RootSec, tsect);
|
---|
409 |
|
---|
410 | for(i = 0 ; i < 2 ; i++){
|
---|
411 | status = tusbhMscRead(husbh, pdrv, (i+RootSec), (uint8_t *)sdbuffer, 1);
|
---|
412 | syslog_3(LOG_NOTICE, "## status(%d) i(%d) sdbuffer[%08x] ##", status, (i+RootSec), sdbuffer);
|
---|
413 | dly_tsk(300);
|
---|
414 | p = (unsigned char *)sdbuffer;
|
---|
415 | printf("\nsec(%d) ", (i+RootSec));
|
---|
416 | for(j = 0 ; j < 512 ; j++){
|
---|
417 | if((j % 16) == 0)
|
---|
418 | printf("\n%03x ", j);
|
---|
419 | printf("%02x ", p[j]);
|
---|
420 | }
|
---|
421 | printf("\n");
|
---|
422 | }
|
---|
423 | }
|
---|
424 | #endif
|
---|
425 | hlcd = &LcdHandle;
|
---|
426 | hlcd->hspi = hspi;
|
---|
427 | hlcd->spi_lock= 0;
|
---|
428 | hlcd->cs_pin = CS_PORT;
|
---|
429 | hlcd->rs_pin = RS_PORT;
|
---|
430 | hlcd->rst_pin = RST_PORT;
|
---|
431 | hlcd->cs2_pin = CS2_PORT;
|
---|
432 | DrawProp.hlcd = hlcd;
|
---|
433 | lcd_initR(hlcd, INITR_BLACKTAB);
|
---|
434 | DrawProp.BackColor = ST7735_BLACK;
|
---|
435 | DrawProp.TextColor = ST7735_WHITE;
|
---|
436 | grapics_test(hlcd);
|
---|
437 | #if 1 /* LOCAL DEFINE */
|
---|
438 | DrawProp.TextColor = ST7735_BLACK;
|
---|
439 | DrawProp.BackColor = ST7735_WHITE;
|
---|
440 | lcd_fillScreen(&DrawProp);
|
---|
441 | lcd_fillRect(hlcd, 0, 0, hlcd->_width, hlcd->_height/3, ST7735_BLUE);
|
---|
442 | DrawProp.TextColor = ST7735_WHITE;
|
---|
443 | DrawProp.BackColor = ST7735_BLUE;
|
---|
444 | DrawProp.pFont = &Font20;
|
---|
445 | lcd_DisplayStringAt(&DrawProp, 0, 20, (uint8_t *)"TBP TEST", CENTER_MODE);
|
---|
446 | DrawProp.TextColor = ST7735_BLACK;
|
---|
447 | DrawProp.BackColor = ST7735_WHITE;
|
---|
448 | DrawProp.pFont = &Font8;
|
---|
449 | lcd_DisplayStringAt(&DrawProp, 0, 80, (uint8_t *)"Helle World !", CENTER_MODE);
|
---|
450 | DrawProp.pFont = &Font12;
|
---|
451 | lcd_DisplayStringAt(&DrawProp, 0, 100, (uint8_t *)"Helle World !", CENTER_MODE);
|
---|
452 | DrawProp.pFont = &Font16;
|
---|
453 | lcd_DisplayStringAt(&DrawProp, 0, 120, (uint8_t *)"Helle World !", CENTER_MODE);
|
---|
454 |
|
---|
455 | DrawProp.TextColor = ST7735_RED;
|
---|
456 | for(i = 20 ; i < 40 ; i++){
|
---|
457 | lcd_DrawCircle(&DrawProp, hlcd->_width/2, hlcd->_height/2+30, i);
|
---|
458 | if(i == 25)
|
---|
459 | i += 10;
|
---|
460 | }
|
---|
461 | #endif /* LOCAL DEFINE */
|
---|
462 | syslog_0(LOG_NOTICE, "LCD TEST END");
|
---|
463 | while(sens > 0){
|
---|
464 | wai_flg(SW_FLG, JS_MASK, TWF_ORW, &flgptn);
|
---|
465 | syslog_1(LOG_NOTICE, "## JS EVENT[%04x] ##", flgptn);
|
---|
466 | for(i = 0 ; i < NUM_JSPOSITION ; i++){
|
---|
467 | if(flgptn & (1<<i))
|
---|
468 | break;
|
---|
469 | }
|
---|
470 | if(i == NUM_JSPOSITION)
|
---|
471 | i = 0;
|
---|
472 | #if 1 /* LOCAL DEFINE */
|
---|
473 | DrawProp.pFont = &Font12;
|
---|
474 | if(i == 0 || i == NUM_JSPOSITION)
|
---|
475 | lcd_DisplayStringAt(&DrawProp, 0, 100, (uint8_t *)"Helle World !", CENTER_MODE);
|
---|
476 | else
|
---|
477 | lcd_DisplayStringAt(&DrawProp, 0, 100, (uint8_t *)pos_str[i-1], CENTER_MODE);
|
---|
478 | #else /* LOCAL DEFINE */
|
---|
479 | syslog_1(LOG_NOTICE, "## event(%d) ##", i);
|
---|
480 | #endif /* LOCAL DEFINE */
|
---|
481 | sens--;
|
---|
482 | }
|
---|
483 | #ifdef USE_MSC_FILE
|
---|
484 | syslog_0(LOG_NOTICE, "## STOP ##");
|
---|
485 | slp_tsk();
|
---|
486 | #endif
|
---|
487 | spi_deinit(hspi);
|
---|
488 |
|
---|
489 | syslog(LOG_NOTICE, "Sample program ends.");
|
---|
490 | // SVC_PERROR(ext_ker());
|
---|
491 | }
|
---|
492 |
|
---|
493 |
|
---|
494 | /*
|
---|
495 | * ADC転送終了コールバック関数
|
---|
496 | */
|
---|
497 | static void HAL_ADC_ConvCpltCallback2(ADC_Handle_t* hadc)
|
---|
498 | {
|
---|
499 | isig_sem(ADCDMA_SEM);
|
---|
500 | }
|
---|
501 |
|
---|
502 | /*
|
---|
503 | * ジョイスティック監視タスク
|
---|
504 | */
|
---|
505 | void stick_task(intptr_t exinf)
|
---|
506 | {
|
---|
507 | ADC_Init_t aInit;
|
---|
508 | ADC_ChannelConf_t sConfig;
|
---|
509 | ADC_Handle_t *hadc;
|
---|
510 | uint32_t event = 0;
|
---|
511 | int i;
|
---|
512 |
|
---|
513 | /*
|
---|
514 | * ADC3初期化
|
---|
515 | */
|
---|
516 | aInit.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
|
---|
517 | aInit.Resolution = ADC_RESOLUTION_12B;
|
---|
518 | aInit.ScanConvMode = ADC_SCANMODE_DISABLE;
|
---|
519 | // aInit.ContinuousConvMode = ADC_CONTINUOUS_ENABLE;
|
---|
520 | aInit.ContinuousConvMode = ADC_CONTINUOUS_DISABLE;
|
---|
521 | aInit.DiscontinuousConvMode = ADC_DISCONTINUOUS_DISABLE;
|
---|
522 | aInit.NumDiscConversion = 0;
|
---|
523 | aInit.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
|
---|
524 | aInit.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
|
---|
525 | aInit.DataAlign = ADC_DATAALIGN_RIGHT;
|
---|
526 | aInit.NumConversion = 1;
|
---|
527 | aInit.DMAContinuousRequests = ADC_DMACONTINUOUS_ENABLE;
|
---|
528 | aInit.EOCSelection = ADC_EOC_SEQ_DISABLE;
|
---|
529 |
|
---|
530 | if((hadc = adc_init(ADC3_PORTID, &aInit)) == NULL){
|
---|
531 | /* Initialization Error */
|
---|
532 | syslog_0(LOG_NOTICE, "## adc_init ERROR ##");
|
---|
533 | }
|
---|
534 | hadc->xfercallback = HAL_ADC_ConvCpltCallback2;
|
---|
535 |
|
---|
536 | /*
|
---|
537 | * ADCチャネル設定
|
---|
538 | */
|
---|
539 | sConfig.Channel = ADCx_CHANNEL;
|
---|
540 | sConfig.Rank = 1;
|
---|
541 | // sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
|
---|
542 | sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES;
|
---|
543 | sConfig.GpioBase = ADCx_CHANNEL_GPIO_PORT;
|
---|
544 | sConfig.GpioPin = ADCx_CHANNEL_PINNO;
|
---|
545 | if(adc_setupchannel(hadc, &sConfig) != E_OK){
|
---|
546 | /* Channel Configuration Error */
|
---|
547 | syslog_0(LOG_NOTICE, "## adc_setupchannel ERROR ##");
|
---|
548 | }
|
---|
549 |
|
---|
550 | for(;;){
|
---|
551 | uhADCxConvertedValue = 0;
|
---|
552 | /*
|
---|
553 | * ADC DMAスタート
|
---|
554 | */
|
---|
555 | if(adc_start_dma(hadc, (uint32_t*)&uhADCxConvertedValue, 1) != E_OK){
|
---|
556 | /* Start Conversation Error */
|
---|
557 | syslog_0(LOG_NOTICE, "## adc_start_dma ERROR ##");
|
---|
558 | }
|
---|
559 | while(hadc->status == ADC_STATUS_BUSY){
|
---|
560 | twai_sem(ADCDMA_SEM, 10);
|
---|
561 | }
|
---|
562 | adc_end_dma(hadc);
|
---|
563 | for(i = 0 ; i < (NUM_JSPOSITION-1) ; i++){
|
---|
564 | if(uhADCxConvertedValue < pos_tbl[i][0]){
|
---|
565 | event = pos_tbl[i][1];
|
---|
566 | set_flg(SW_FLG, event);
|
---|
567 | break;
|
---|
568 | }
|
---|
569 | }
|
---|
570 | if(i == 5 && event != JS_OFF){
|
---|
571 | event = JS_OFF;
|
---|
572 | set_flg(SW_FLG, JS_OFF);
|
---|
573 | }
|
---|
574 | dly_tsk(50);
|
---|
575 | }
|
---|
576 | syslog_2(LOG_NOTICE, "## STOP[%08x] (%d) ##", &uhADCxConvertedValue, hadc->status);
|
---|
577 | slp_tsk();
|
---|
578 | }
|
---|
579 |
|
---|