source: azure_iot_hub_riscv/trunk/asp_baseplatform/OBJ/K210_GCC/DEMO/demo.c@ 458

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

SPIとSerial、KPUの動作を改善

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 17.8 KB
Line 
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*
11* 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
12* ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13* 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
14* (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15* 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16* スコード中に含まれていること.
17* (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18* 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19* 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
20* の無保証規定を掲載すること.
21* (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22* 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
23* と.
24* (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25* 作権表示,この利用条件および下記の無保証規定を掲載すること.
26* (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
27* 報告すること.
28* (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29* 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30* また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
31* 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
32* 免責すること.
33*
34* 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
35* よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
36* に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
37* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
38* の責任を負わない.
39*
40* $Id$
41*/
42
43/*
44* K210 LEDデモプログラム
45* このデモプログラムは、デフォルトでSDEV_SENSE_ONETIMEコンパイルが
46* 有効となっておりSDカード中に東雲漢字フォントが書き込まれて
47* いることを前提としています。
48* TOPPERS BASE PLATFORM(CV)中のui/snfont_dispディレクトリ中の
49* 以下のフォントをSDカードに書き込んで起動してください。
50* shinonome_font12.fnt
51* shinonome_font16.fnt
52* プログラム中に漢字フォントをROMファイルして取り込んで漢字の表示も
53* 可能です。この場合、SDEV_SENSE_ONETIMEコンパイルスイッチを無効にし
54* USE_ROMFONTコンパイルスイッチを有効にして、Makefile中に
55* gdic/rom_file/Makefile.configを取り込んでビルドしてください。
56*/
57
58#include <kernel.h>
59#include <stdlib.h>
60#include <t_syslog.h>
61#include <t_stdlib.h>
62#include <target_syssvc.h>
63#include "syssvc/serial.h"
64#include "syssvc/syslog.h"
65#include "device.h"
66#include "pinmode.h"
67#include "sipeed_st7789.h"
68#include "sipeed_ov2640.h"
69#include "storagedevice.h"
70#ifdef SDEV_SENSE_ONETIME
71#include "spi_driver.h"
72#include "sddiskio.h"
73#else
74#include "rom_file.h"
75#endif
76#include "kernel_cfg.h"
77#include "demo.h"
78#include "topamelogo.h"
79
80#define IOMEM 0x40000000
81
82/*
83* サービスコールのエラーのログ出力
84*/
85Inline void
86svc_perror(const char *file, int_t line, const char *expr, ER ercd)
87{
88 if (ercd < 0) {
89 t_perror(LOG_ERROR, file, line, expr, ercd);
90 }
91}
92
93#define SVC_PERROR(expr) svc_perror(__FILE__, __LINE__, #expr, (expr))
94
95#define SWAP_32(x) ((x >> 24) | (x >> 8 & 0xff00) | (x << 8 & 0xff0000) | (x << 24))
96
97#ifndef SPI1DMATX_SEM
98#define SPI1DMATX_SEM 0
99#endif
100
101#if !defined(NOT_USEFILFONT)
102static const char string1[] = {
103 'T', 'O', 'P', 'P', 'E', 'R', 'S',0xE3,0x83,0x97,0xE3,0x83,0xAD,0xE3,0x82,0xB8,
104 0xE3,0x82,0xA7,0xE3,0x82,0xAF,0xE3,0x83,0x88,0
105};
106static const char string2[] = {
107 0xE6,0x95,0x99,0xE8,0x82,0xB2,0xE3,0x83,0xAF,0xE3,0x83,0xBC,0xE3,0x82,0xAD,
108 0xE3,0x83,0xB3,0xE3,0x82,0xB0,0xE3,0x83,0xAB,0xE3,0x83,0xBC,0xE3,0x83,0x97,0
109};
110#else
111static const char string1[] = "TOPPERS PROJECT";
112static const char string2[] = "Educational Working Group.";
113#endif
114
115static uint32_t heap_area[256*1024];
116
117intptr_t heap_param[2] = {
118 (intptr_t)heap_area,
119 sizeof(heap_area)
120};
121
122/*
123* 使用する変数の定義
124*/
125static const Point testPolygon[7] = {
126 {0, 0},
127 {319, 239},
128 {160, 0},
129 {160, 239},
130 {319, 0},
131 {0, 239},
132 {0, 0}
133};
134
135LCD_Handler_t LcdHandle;
136LCD_DrawProp_t DrawProp;
137DVP_Handle_t DvpHandle;
138OV2640_t CameraHandle;
139
140uint8_t sTxBuffer[16];
141
142static uint8_t time_string[12];
143
144static void
145set_value(uint8_t *buf, int value)
146{
147 buf[1] = (value % 10) + '0';
148 buf[0] = (value / 10) + '0';
149}
150
151static void
152set_time(uint8_t *buf, struct tm2 *tm)
153{
154 buf[8] = 0;
155 set_value(&buf[6], tm->tm_sec);
156 buf[5] = ':';
157 set_value(&buf[3], tm->tm_min);
158 buf[2] = ':';
159 set_value(&buf[0], tm->tm_hour);
160}
161
162
163/*
164* ダイレクトデジタルピン設定
165*/
166void
167pinMode(uint8_t Pin, uint8_t dwMode){
168 int gpionum = gpio_get_gpiohno(Pin, false);
169 GPIO_Init_t init = {0};
170
171 syslog_2(LOG_NOTICE, "## pinMode Pin(%d) gpionum(%d) ##", Pin, gpionum);
172 if(gpionum >= 0){
173 uint8_t function = FUNC_GPIOHS0 + gpionum;
174 fpioa_set_function(Pin, function);
175 switch(dwMode){
176 case INPUT:
177 init.mode = GPIO_MODE_INPUT;
178 init.pull = GPIO_NOPULL;
179 break;
180 case INPUT_PULLDOWN:
181 init.mode = GPIO_MODE_INPUT;
182 init.pull = GPIO_PULLDOWN;
183 break;
184 case INPUT_PULLUP:
185 init.mode = GPIO_MODE_INPUT;
186 init.pull = GPIO_PULLUP;
187 break;
188 case OUTPUT:
189 default:
190 init.mode = GPIO_MODE_OUTPUT;
191 init.pull = GPIO_PULLDOWN;
192 break;
193 }
194 gpio_setup(TADR_GPIOHS_BASE, &init, (uint8_t)gpionum);
195 }
196 return ;
197}
198
199/*
200* ダイレクトデジタルピン出力
201*/
202void
203digitalWrite(uint8_t Pin, int dwVal){
204 int8_t gpio_pin = gpio_get_gpiohno(Pin, false);
205
206 if( gpio_pin >= 0){
207 gpio_set_pin(TADR_GPIOHS_BASE, (uint8_t)gpio_pin, dwVal);
208 }
209}
210
211/*
212* 周期ハンドラ
213*/
214void cyclic_handler(intptr_t exinf)
215{
216 static bool_t b = 0;
217 b ^= 1;
218
219 digitalWrite(LED_PIN, b);
220}
221
222/*
223* グラフィック表示テスト
224*/
225void
226grapics_test(LCD_Handler_t *hlcd)
227{
228 uint16_t x, y;
229 int i;
230
231 DrawProp.BackColor = ST7789_BLACK;
232 lcd_fillScreen(&DrawProp);
233 dly_tsk(1000);
234 lcd_drawPixel(hlcd, hlcd->_width/2, hlcd->_height/2, ST7789_GREEN);
235 dly_tsk(1000);
236
237 lcd_fillScreen(&DrawProp);
238 for(y=0; y < hlcd->_height; y+=5) {
239 lcd_drawFastHLine(hlcd, 0, y, hlcd->_width, ST7789_RED);
240 }
241 for (x=0; x < hlcd->_width; x+=5) {
242 lcd_drawFastVLine(hlcd, x, 0, hlcd->_height, ST7789_BLUE);
243 }
244 dly_tsk(1000);
245
246 lcd_fillScreen(&DrawProp);
247 DrawProp.TextColor = ST7789_GREEN;
248 lcd_drawPolygon(&DrawProp, (Point *)testPolygon, sizeof(testPolygon)/sizeof(Point));
249 dly_tsk(1000);
250
251 lcd_fillScreen(&DrawProp);
252 DrawProp.TextColor = ST7789_GREEN;
253 for (y=0; y < hlcd->_height; y+=6) {
254 lcd_drawRect(&DrawProp, hlcd->_width/2 -y/2, hlcd->_height/2 -y/2 , y, y);
255 }
256 for(i = 0 ; i < 3 ; i++){
257 lcd_invertDisplay(hlcd, true);
258 dly_tsk(500);
259 lcd_invertDisplay(hlcd, false);
260 dly_tsk(500);
261 }
262 lcd_fillScreen(&DrawProp);
263 lcd_drawBitmap(hlcd, 33, 48, (uint8_t *)topamelogo);
264 dly_tsk(1000);
265}
266
267/*
268* メインタスク
269*/
270void main_task(intptr_t exinf)
271{
272 SPI_Init_t Init;
273 SPI_Handle_t *hspi;
274 LCD_Handler_t *hlcd;
275 OV2640_t *hcmr;
276 DVP_Handle_t *hdvp;
277 ER_UINT ercd;
278 uint32_t i;
279 struct tm2 time;
280 unsigned long atmp;
281#ifdef SDEV_SENSE_ONETIME
282 StorageDevice_t *psdev;
283 SDCARD_Handler_t *hsd = NULL;
284#else
285 uint32_t esize, fsize, headlen;
286 uint8_t *addr;
287#endif
288
289 SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)));
290 syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (int_t) exinf);
291
292 /*
293 * シリアルポートの初期化
294 *
295 * システムログタスクと同じシリアルポートを使う場合など,シリアル
296 * ポートがオープン済みの場合にはここでE_OBJエラーになるが,支障は
297 * ない.
298 */
299 ercd = serial_opn_por(TASK_PORTID);
300 if (ercd < 0 && MERCD(ercd) != E_OBJ) {
301 syslog(LOG_ERROR, "%s (%d) reported by `serial_opn_por'.",
302 itron_strerror(ercd), SERCD(ercd));
303 }
304 SVC_PERROR(serial_ctl_por(TASK_PORTID,
305 (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV)));
306
307 pinMode(LED_PIN, OUTPUT);
308 SVC_PERROR(sta_cyc(CYCHDR1));
309
310 select_spi0_dvp_mode(1);
311
312#ifdef SDEV_SENSE_ONETIME
313 pinMode(SPI_SS_PIN, OUTPUT);
314 digitalWrite(SPI_SS_PIN, HIGH);
315#else /* USE ROMFILE */
316 rom_file_init();
317 esize = 1*1024*1024;
318 addr = (uint8_t *)romfont;
319 while(esize > 4){
320 fsize = (addr[0] << 24) | (addr[1] << 16) | (addr[2] << 8) | addr[3];
321 if((fsize & 3) != 0 || fsize < 16 || fsize > esize)
322 break;
323 for(i = 0 ; i < 28 ; i++){
324 if(addr[i+4] == 0)
325 break;
326 }
327 if(i >= 28)
328 break;
329 if(i < 12)
330 headlen = 16;
331 else
332 headlen = 32;
333 if(create_rom_file((const char *)(addr+4), (uintptr_t)(addr+headlen), fsize-headlen) < 0)
334 break;
335 addr += fsize;
336 esize -= fsize;
337 }
338#endif
339
340 hcmr = &CameraHandle;
341 hcmr->frameSize = FRAMESIZE_QVGA;
342 hcmr->pixFormat = PIXFORMAT_RGB565;
343 ov2640_getResolition(hcmr, FRAMESIZE_QVGA);
344 hcmr->_resetPoliraty = ACTIVE_HIGH;
345 hcmr->_pwdnPoliraty = ACTIVE_HIGH;
346 hcmr->_slaveAddr = 0x00;
347 hcmr->_dataBuffer = NULL;
348 hcmr->_aiBuffer = NULL;
349
350 // just support RGB565 and YUV442 on k210
351
352 // Initialize the camera bus, 8bit reg
353 hdvp = &DvpHandle;
354 hcmr->hdvp = hdvp;
355 hdvp->Init.Freq = 24000000;
356 hdvp->Init.Width = hcmr->_width;
357 hdvp->Init.Height = hcmr->_height;
358 hdvp->Init.Format = DVP_FORMAT_RGB;
359 hdvp->Init.BurstMode = DVP_BURST_ENABLE;
360 hdvp->Init.AutoMode = DVP_AUTOMODE_DISABLE;
361 hdvp->Init.GMMlen = 4;
362
363 hdvp->Init.num_sccb_reg = 8;
364 hdvp->Init.CMosPClkPin = 47;
365 hdvp->Init.CMosXClkPin = 46;
366 hdvp->Init.CMosHRefPin = 45;
367 hdvp->Init.CMosPwDnPin = 44;
368 hdvp->Init.CMosVSyncPin = 43;
369 hdvp->Init.CMosRstPin = 42;
370 hdvp->Init.SccbSClkPin = 41;
371 hdvp->Init.SccbSdaPin = 40;
372 hdvp->Init.IntNo = INTNO_DVP;
373 syslog_1(LOG_NOTICE, "## DvpHandle[%08x] ##", &DvpHandle);
374
375 syslog_3(LOG_NOTICE, "## hcmr->_width(%d) hcmr->_height(%d) size[%08x] ##", hcmr->_width, hcmr->_height, (hcmr->_width * hcmr->_height * 2));
376 atmp = (unsigned long)malloc(hcmr->_width * hcmr->_height * 2 + 64); //RGB565
377 hcmr->_dataBuffer = (uint32_t *)((atmp + 63) & ~63);
378 if(hcmr->_dataBuffer == NULL){
379 hcmr->_width = 0;
380 hcmr->_height = 0;
381 syslog_0(LOG_ERROR, "Can't allocate _dataBuffer !");
382 slp_tsk();
383 }
384 atmp = (unsigned long)malloc(hcmr->_width * hcmr->_height * 3 + 128); //RGB888
385 hcmr->_aiBuffer = (uint32_t *)((atmp + 127) & ~127);
386 if(hcmr->_aiBuffer == NULL){
387 hcmr->_width = 0;
388 hcmr->_height = 0;
389 free(hcmr->_dataBuffer);
390 hcmr->_dataBuffer = NULL;
391 syslog_0(LOG_ERROR, "Can't allocate _aiBuffer !");
392 slp_tsk();
393 }
394 syslog_2(LOG_NOTICE, "## hcmr->_dataBuffer[%08x] hcmr->_aiBuffer[%08x] ##", hcmr->_dataBuffer, hcmr->_aiBuffer);
395 atmp = (unsigned long)hcmr->_aiBuffer - IOMEM;
396 hdvp->Init.RedAddr = (uint32_t)atmp;
397 atmp = (unsigned long)hcmr->_aiBuffer + hcmr->_width * hcmr->_height - IOMEM;
398 hdvp->Init.GreenAddr = (uint32_t)atmp;
399 atmp = (unsigned long)hcmr->_aiBuffer + hcmr->_width * hcmr->_height * 2 - IOMEM;
400 hdvp->Init.BlueAddr = (uint32_t)atmp;
401 atmp = (unsigned long)hcmr->_dataBuffer - IOMEM;
402 hdvp->Init.RGBAddr = (uint32_t)atmp;
403 dvp_init(hdvp);
404
405 if(ov2640_sensor_ov_detect(hcmr) == E_OK){
406 syslog_0(LOG_NOTICE, "find ov sensor !");
407 }
408 else if(ov2640_sensro_gc_detect(hcmr) == E_OK){
409 syslog_0(LOG_NOTICE, "find gc3028 !");
410 }
411 if(ov2640_reset(hcmr) != E_OK){
412 syslog_0(LOG_ERROR, "ov2640 reset error !");
413 slp_tsk();
414 }
415 if(ov2640_set_pixformat(hcmr) != E_OK){
416 syslog_0(LOG_ERROR, "set pixformat error !");
417 slp_tsk();
418 }
419 if(ov2640_set_framesize(hcmr) != E_OK){
420 syslog_0(LOG_ERROR, "set frame size error !");
421 slp_tsk();
422 }
423 if(ov2640_setInvert(hcmr, false) != E_OK){
424 syslog_0(LOG_ERROR, "set invert error !");
425 slp_tsk();
426 }
427 syslog_1(LOG_NOTICE, "OV2640 id(%d)", ov2640_id(hcmr));
428
429 Init.WorkMode = SPI_WORK_MODE_0;
430 Init.FrameFormat = SPI_FF_OCTAL;
431 Init.DataSize = 8;
432 Init.Prescaler = 15000000;
433 Init.SignBit = 0;
434 Init.InstLength = 8;
435 Init.AddrLength = 0;
436 Init.WaitCycles = 0;
437 Init.IATransMode = SPI_AITM_AS_FRAME_FORMAT;
438 Init.SclkPin = SIPEED_ST7789_SCLK_PIN;
439 Init.MosiPin = -1;
440 Init.MisoPin = -1;
441 Init.SsPin = SIPEED_ST7789_SS_PIN;
442 Init.SsNo = SIPEED_ST7789_SS;
443 Init.TxDMAChannel = SIPEED_DMA_CH;
444 Init.RxDMAChannel = -1;
445 Init.semid = SPI1TRN_SEM;
446 Init.semlock = SPI1LOCK_SEM;
447 Init.semdmaid = SPI1DMATX_SEM;
448 hspi = spi_init(SPI_PORTID, &Init);
449 if(hspi == NULL){
450 syslog_0(LOG_ERROR, "SPI INIT ERROR");
451 slp_tsk();
452 }
453
454 hlcd = &LcdHandle;
455 hlcd->hspi = hspi;
456// hlcd->spi_lock= SPI1LOCK_SEM;
457 hlcd->dir = DIR_YX_LRUD;
458 hlcd->dcx_pin = SIPEED_ST7789_DCX_PIN;
459 hlcd->rst_pin = SIPEED_ST7789_RST_PIN;
460 hlcd->cs_sel = SIPEED_ST7789_SS;
461 hlcd->rst_no = SIPEED_ST7789_RST_GPIONUM;
462 hlcd->dcx_no = SIPEED_ST7789_DCX_GPIONUM;
463 DrawProp.hlcd = hlcd;
464 lcd_init(hlcd);
465 syslog_2(LOG_NOTICE, "width(%d) height(%d)", hlcd->_width, hlcd->_height);
466
467 DrawProp.BackColor = ST7789_WHITE;
468 DrawProp.TextColor = ST7789_BLACK;
469 lcd_fillScreen(&DrawProp);
470
471#ifdef SDEV_SENSE_ONETIME
472 Init.WorkMode = SPI_WORK_MODE_0;
473 Init.FrameFormat = SPI_FF_STANDARD;
474 Init.DataSize = 8;
475 Init.Prescaler = 5000000;
476 Init.SignBit = 0;
477 Init.InstLength = 0;
478 Init.AddrLength = 0;
479 Init.WaitCycles = 0;
480 Init.IATransMode = SPI_AITM_STANDARD;
481 Init.SclkPin = SPI_SCK_PIN;
482 Init.MosiPin = SPI_MOSI_PIN;
483 Init.MisoPin = SPI_MISO_PIN;
484 Init.SsPin = -1;
485 Init.SsNo = -1;
486 Init.TxDMAChannel = -1;
487 Init.RxDMAChannel = SPI_DMA1_CH;
488 Init.semid = SPI2TRN_SEM;
489 Init.semlock = SPI2LOCK_SEM;
490 Init.semdmaid = SPI2DMATX_SEM;
491 hspi = spi_init(SPICARD_PORTID, &Init);
492 if(hspi == NULL){
493 syslog_0(LOG_ERROR, "SPI-CARD INIT ERROR");
494 slp_tsk();
495 }
496 sdcard_setspi2(SPISDCARD_PORTID, hspi, SPI_SS_PIN);
497
498 /*
499 * SD-CARD SPI通信設定
500 */
501 for(i = 0 ; i < 10 ; i++)
502 sTxBuffer[i] = 0xff;
503 if((ercd = spi_core_transmit(hspi, -1, (uint8_t*)sTxBuffer, 10)) != E_OK){
504 /* Transfer error in transmission process */
505 syslog_1(LOG_NOTICE, "## call Error_Handler(2)(%d) ##", ercd);
506 }
507#if SPI_WAIT_TIME == 0
508 if((ercd = spi_wait(hspi, 100)) != E_OK){
509 syslog_0(LOG_NOTICE, "## call Error_Handler(3) ##");
510 }
511#endif
512 dly_tsk(100);
513 SDMSence_task(0);
514 psdev = SDMGetStorageDevice(SDCARD_DEVNO);
515 hsd = (SDCARD_Handler_t *)psdev->_sdev_local[1];
516 if(hsd == NULL)
517 syslog_0(LOG_ERROR, "SD-CARD INITAIL ERROR !");
518#endif
519
520 for(;;){
521 DrawProp.BackColor = ST7789_WHITE;
522 DrawProp.TextColor = ST7789_BLACK;
523 lcd_fillScreen(&DrawProp);
524 lcd_fillRect(hlcd, 0, 0, hlcd->_width, (hlcd->_height/3)*2-20, ST7789_BLUE);
525 DrawProp.TextColor = ST7789_WHITE;
526 DrawProp.BackColor = ST7789_BLUE;
527 DrawProp.pFont = &Font16;
528 lcd_DisplayStringAt(&DrawProp, 0, 16, (uint8_t *)string1, CENTER_MODE);
529 lcd_DisplayStringAt(&DrawProp, 0, 40, (uint8_t *)string2, CENTER_MODE);
530 lcd_DisplayStringAt(&DrawProp, 0, 64, (uint8_t *)"TOPPERS BASE PLATFORM(RV)", CENTER_MODE);
531
532 DrawProp.TextColor = ST7789_GREEN;
533 lcd_DisplayStringAt(&DrawProp, 0, 88, (uint8_t *)"TOPPERS/ASP Kernel", CENTER_MODE);
534 DrawProp.TextColor = ST7789_RED;
535 lcd_DisplayStringAt(&DrawProp, 0, 112, (uint8_t *)"RISC-V/64 K210", CENTER_MODE);
536 lcd_drawBitmap(hlcd, hlcd->_width/2-30, (hlcd->_height/3)*2, (uint8_t *)topamelogo);
537 dly_tsk(5000);
538
539 DrawProp.BackColor = ST7789_BLACK;
540 DrawProp.TextColor = ST7789_WHITE;
541 grapics_test(hlcd);
542
543 DrawProp.TextColor = ST7789_BLACK;
544 DrawProp.BackColor = ST7789_WHITE;
545 lcd_fillScreen(&DrawProp);
546 lcd_fillRect(hlcd, 0, 0, hlcd->_width, hlcd->_height/3, ST7789_BLUE);
547 DrawProp.TextColor = ST7789_WHITE;
548 DrawProp.BackColor = ST7789_BLUE;
549 DrawProp.pFont = &Font16;
550 lcd_DisplayStringAt(&DrawProp, 0, 16, (uint8_t *)"TOPPERS BASE PLATFORM TEST", CENTER_MODE);
551
552 DrawProp.TextColor = ST7789_BLACK;
553 DrawProp.BackColor = ST7789_WHITE;
554 DrawProp.pFont = &Font8;
555 lcd_DisplayStringAt(&DrawProp, 0, 100, (uint8_t *)"Helle World !", CENTER_MODE);
556 DrawProp.pFont = &Font12;
557 lcd_DisplayStringAt(&DrawProp, 0, 120, (uint8_t *)"Helle World !", CENTER_MODE);
558 DrawProp.pFont = &Font16;
559 lcd_DisplayStringAt(&DrawProp, 0, 140, (uint8_t *)"Helle World !", CENTER_MODE);
560
561 DrawProp.TextColor = ST7789_RED;
562 for(i = 20 ; i < 80 ; i++){
563 lcd_DrawCircle(&DrawProp, hlcd->_width/2, hlcd->_height/2+30, i);
564 if(i == 25)
565 i += 10;
566 }
567 for(i = 0 ; i < 30 ; i++){
568 rtc_get_time(&time);
569 set_time(time_string, &time);
570 lcd_DisplayStringAt(&DrawProp, 0, 160, time_string, CENTER_MODE);
571 dly_tsk(1000);
572 }
573
574 if((ercd = ov2640_activate(hcmr, true)) != E_OK){
575 syslog_2(LOG_NOTICE, "ov2640 activate error result(%d) id(%d) ##", ercd, ov2640_id(hcmr));
576 continue;
577 }
578
579 for(i = 0 ; i < 2000 ; i++){
580 if((i % 100) == 0)
581 syslog_1(LOG_NOTICE, "camera count(%d)", i);
582 ercd = ov2640_snapshot(hcmr);
583 if(ercd == E_OK){
584 lcd_drawPicture(hlcd, 0, 0, hcmr->_width, hcmr->_height, (uint16_t *)hcmr->_dataBuffer);
585 }
586 }
587 ov2640_activate(hcmr, false);
588 }
589 syslog_0(LOG_NOTICE, "## STOP ##");
590 slp_tsk();
591 syslog(LOG_NOTICE, "Sample program ends.");
592 SVC_PERROR(ext_ker());
593 assert(0);
594}
Note: See TracBrowser for help on using the repository browser.