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

Last change on this file since 453 was 453, 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: 18.1 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 uint16_t *lcd_buffer;
278 ER_UINT ercd;
279 uint32_t i, count;
280 struct tm2 time;
281 unsigned long atmp;
282#ifdef SDEV_SENSE_ONETIME
283 StorageDevice_t *psdev;
284 SDCARD_Handler_t *hsd = NULL;
285#else
286 uint32_t esize, fsize, headlen;
287 uint8_t *addr;
288#endif
289
290 SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)));
291 syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (int_t) exinf);
292
293 /*
294 * シリアルポートの初期化
295 *
296 * システムログタスクと同じシリアルポートを使う場合など,シリアル
297 * ポートがオープン済みの場合にはここでE_OBJエラーになるが,支障は
298 * ない.
299 */
300 ercd = serial_opn_por(TASK_PORTID);
301 if (ercd < 0 && MERCD(ercd) != E_OBJ) {
302 syslog(LOG_ERROR, "%s (%d) reported by `serial_opn_por'.",
303 itron_strerror(ercd), SERCD(ercd));
304 }
305 SVC_PERROR(serial_ctl_por(TASK_PORTID,
306 (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV)));
307
308 pinMode(LED_PIN, OUTPUT);
309 SVC_PERROR(sta_cyc(CYCHDR1));
310
311 select_spi0_dvp_mode(1);
312
313#ifdef SDEV_SENSE_ONETIME
314 pinMode(SPI_SS_PIN, OUTPUT);
315 digitalWrite(SPI_SS_PIN, HIGH);
316#else /* USE ROMFILE */
317 rom_file_init();
318 esize = 1*1024*1024;
319 addr = (uint8_t *)romfont;
320 while(esize > 4){
321 fsize = (addr[0] << 24) | (addr[1] << 16) | (addr[2] << 8) | addr[3];
322 if((fsize & 3) != 0 || fsize < 16 || fsize > esize)
323 break;
324 for(i = 0 ; i < 28 ; i++){
325 if(addr[i+4] == 0)
326 break;
327 }
328 if(i >= 28)
329 break;
330 if(i < 12)
331 headlen = 16;
332 else
333 headlen = 32;
334 if(create_rom_file((const char *)(addr+4), (uintptr_t)(addr+headlen), fsize-headlen) < 0)
335 break;
336 addr += fsize;
337 esize -= fsize;
338 }
339#endif
340
341 hcmr = &CameraHandle;
342 hcmr->frameSize = FRAMESIZE_QVGA;
343 hcmr->pixFormat = PIXFORMAT_RGB565;
344 ov2640_getResolition(hcmr, FRAMESIZE_QVGA);
345 hcmr->_resetPoliraty = ACTIVE_HIGH;
346 hcmr->_pwdnPoliraty = ACTIVE_HIGH;
347 hcmr->_slaveAddr = 0x00;
348 hcmr->_dataBuffer = NULL;
349 hcmr->_aiBuffer = NULL;
350
351 // just support RGB565 and YUV442 on k210
352
353 // Initialize the camera bus, 8bit reg
354 hdvp = &DvpHandle;
355 hcmr->hdvp = hdvp;
356 hdvp->Init.Freq = 24000000;
357 hdvp->Init.Width = hcmr->_width;
358 hdvp->Init.Height = hcmr->_height;
359 hdvp->Init.Format = DVP_FORMAT_RGB;
360 hdvp->Init.BurstMode = DVP_BURST_ENABLE;
361 hdvp->Init.AutoMode = DVP_AUTOMODE_DISABLE;
362 hdvp->Init.GMMlen = 4;
363
364 hdvp->Init.num_sccb_reg = 8;
365 hdvp->Init.CMosPClkPin = 47;
366 hdvp->Init.CMosXClkPin = 46;
367 hdvp->Init.CMosHRefPin = 45;
368 hdvp->Init.CMosPwDnPin = 44;
369 hdvp->Init.CMosVSyncPin = 43;
370 hdvp->Init.CMosRstPin = 42;
371 hdvp->Init.SccbSClkPin = 41;
372 hdvp->Init.SccbSdaPin = 40;
373 hdvp->Init.IntNo = INTNO_DVP;
374 syslog_1(LOG_NOTICE, "## DvpHandle[%08x] ##", &DvpHandle);
375
376 syslog_3(LOG_NOTICE, "## hcmr->_width(%d) hcmr->_height(%d) size[%08x] ##", hcmr->_width, hcmr->_height, (hcmr->_width * hcmr->_height * 2));
377 atmp = (unsigned long)malloc(hcmr->_width * hcmr->_height * 2 + 64); //RGB565
378 hcmr->_dataBuffer = (uint32_t *)((atmp + 63) & ~63);
379 if(hcmr->_dataBuffer == NULL){
380 hcmr->_width = 0;
381 hcmr->_height = 0;
382 syslog_0(LOG_ERROR, "Can't allocate _dataBuffer !");
383 slp_tsk();
384 }
385 atmp = (unsigned long)malloc(hcmr->_width * hcmr->_height * 3 + 128); //RGB888
386 hcmr->_aiBuffer = (uint32_t *)((atmp + 127) & ~127);
387 if(hcmr->_aiBuffer == NULL){
388 hcmr->_width = 0;
389 hcmr->_height = 0;
390 free(hcmr->_dataBuffer);
391 hcmr->_dataBuffer = NULL;
392 syslog_0(LOG_ERROR, "Can't allocate _aiBuffer !");
393 slp_tsk();
394 }
395 syslog_2(LOG_NOTICE, "## hcmr->_dataBuffer[%08x] hcmr->_aiBuffer[%08x] ##", hcmr->_dataBuffer, hcmr->_aiBuffer);
396 atmp = (unsigned long)hcmr->_aiBuffer - IOMEM;
397 hdvp->Init.RedAddr = (uint32_t)atmp;
398 atmp = (unsigned long)hcmr->_aiBuffer + hcmr->_width * hcmr->_height - IOMEM;
399 hdvp->Init.GreenAddr = (uint32_t)atmp;
400 atmp = (unsigned long)hcmr->_aiBuffer + hcmr->_width * hcmr->_height * 2 - IOMEM;
401 hdvp->Init.BlueAddr = (uint32_t)atmp;
402 atmp = (unsigned long)hcmr->_dataBuffer - IOMEM;
403 hdvp->Init.RGBAddr = (uint32_t)atmp;
404 dvp_init(hdvp);
405
406 if(ov2640_sensor_ov_detect(hcmr) == E_OK){
407 syslog_0(LOG_NOTICE, "find ov sensor !");
408 }
409 else if(ov2640_sensro_gc_detect(hcmr) == E_OK){
410 syslog_0(LOG_NOTICE, "find gc3028 !");
411 }
412 if(ov2640_reset(hcmr) != E_OK){
413 syslog_0(LOG_ERROR, "ov2640 reset error !");
414 slp_tsk();
415 }
416 if(ov2640_set_pixformat(hcmr) != E_OK){
417 syslog_0(LOG_ERROR, "set pixformat error !");
418 slp_tsk();
419 }
420 if(ov2640_set_framesize(hcmr) != E_OK){
421 syslog_0(LOG_ERROR, "set frame size error !");
422 slp_tsk();
423 }
424 if(ov2640_setInvert(hcmr, false) != E_OK){
425 syslog_0(LOG_ERROR, "set invert error !");
426 slp_tsk();
427 }
428 syslog_1(LOG_NOTICE, "OV2640 id(%d)", ov2640_id(hcmr));
429
430 Init.WorkMode = SPI_WORK_MODE_0;
431 Init.FrameFormat = SPI_FF_OCTAL;
432 Init.DataSize = 8;
433 Init.Prescaler = 15000000;
434 Init.SignBit = 0;
435 Init.InstLength = 8;
436 Init.AddrLength = 0;
437 Init.WaitCycles = 0;
438 Init.IATransMode = SPI_AITM_AS_FRAME_FORMAT;
439 Init.SclkPin = SIPEED_ST7789_SCLK_PIN;
440 Init.MosiPin = -1;
441 Init.MisoPin = -1;
442 Init.SsPin = SIPEED_ST7789_SS_PIN;
443 Init.SsNo = SIPEED_ST7789_SS;
444 Init.TxDMAChannel = SIPEED_DMA_CH;
445 Init.RxDMAChannel = -1;
446 Init.semid = SPI1TRN_SEM;
447 Init.semlock = SPI1LOCK_SEM;
448 Init.semdmaid = SPI1DMATX_SEM;
449 hspi = spi_init(SPI_PORTID, &Init);
450 if(hspi == NULL){
451 syslog_0(LOG_ERROR, "SPI INIT ERROR");
452 slp_tsk();
453 }
454
455 hlcd = &LcdHandle;
456 hlcd->hspi = hspi;
457// hlcd->spi_lock= SPI1LOCK_SEM;
458 hlcd->dir = DIR_YX_LRUD;
459 hlcd->dcx_pin = SIPEED_ST7789_DCX_PIN;
460 hlcd->rst_pin = SIPEED_ST7789_RST_PIN;
461 hlcd->cs_sel = SIPEED_ST7789_SS;
462 hlcd->rst_no = SIPEED_ST7789_RST_GPIONUM;
463 hlcd->dcx_no = SIPEED_ST7789_DCX_GPIONUM;
464 DrawProp.hlcd = hlcd;
465 lcd_init(hlcd);
466 syslog_2(LOG_NOTICE, "width(%d) height(%d)", hlcd->_width, hlcd->_height);
467 count = hcmr->_width * hcmr->_height;
468 lcd_buffer = (uint16_t *)malloc(count * 2);
469 if(lcd_buffer == NULL){
470 syslog_0(LOG_ERROR, "no lcd buffer !");
471 slp_tsk();
472 }
473 DrawProp.BackColor = ST7789_WHITE;
474 DrawProp.TextColor = ST7789_BLACK;
475 lcd_fillScreen(&DrawProp);
476
477#ifdef SDEV_SENSE_ONETIME
478 Init.WorkMode = SPI_WORK_MODE_0;
479 Init.FrameFormat = SPI_FF_STANDARD;
480 Init.DataSize = 8;
481 Init.Prescaler = 5000000;
482 Init.SignBit = 0;
483 Init.InstLength = 0;
484 Init.AddrLength = 0;
485 Init.WaitCycles = 0;
486 Init.IATransMode = SPI_AITM_STANDARD;
487 Init.SclkPin = SPI_SCK_PIN;
488 Init.MosiPin = SPI_MOSI_PIN;
489 Init.MisoPin = SPI_MISO_PIN;
490 Init.SsPin = -1;
491 Init.SsNo = -1;
492 Init.TxDMAChannel = -1;
493 Init.RxDMAChannel = SPI_DMA1_CH;
494 Init.semid = SPI2TRN_SEM;
495 Init.semlock = SPI2LOCK_SEM;
496 Init.semdmaid = SPI2DMATX_SEM;
497 hspi = spi_init(SPICARD_PORTID, &Init);
498 if(hspi == NULL){
499 syslog_0(LOG_ERROR, "SPI-CARD INIT ERROR");
500 slp_tsk();
501 }
502 sdcard_setspi2(SPISDCARD_PORTID, hspi, SPI_SS_PIN);
503
504 /*
505 * SD-CARD SPI通信設定
506 */
507 for(i = 0 ; i < 10 ; i++)
508 sTxBuffer[i] = 0xff;
509 if((ercd = spi_core_transmit(hspi, -1, (uint8_t*)sTxBuffer, 10)) != E_OK){
510 /* Transfer error in transmission process */
511 syslog_1(LOG_NOTICE, "## call Error_Handler(2)(%d) ##", ercd);
512 }
513#if SPI_WAIT_TIME == 0
514 if((ercd = spi_wait(hspi, 100)) != E_OK){
515 syslog_0(LOG_NOTICE, "## call Error_Handler(3) ##");
516 }
517#endif
518 dly_tsk(100);
519 SDMSence_task(0);
520 psdev = SDMGetStorageDevice(SDCARD_DEVNO);
521 hsd = (SDCARD_Handler_t *)psdev->_sdev_local[1];
522 if(hsd == NULL)
523 syslog_0(LOG_ERROR, "SD-CARD INITAIL ERROR !");
524#endif
525
526 for(;;){
527 DrawProp.BackColor = ST7789_WHITE;
528 DrawProp.TextColor = ST7789_BLACK;
529 lcd_fillScreen(&DrawProp);
530 lcd_fillRect(hlcd, 0, 0, hlcd->_width, (hlcd->_height/3)*2-20, ST7789_BLUE);
531 DrawProp.TextColor = ST7789_WHITE;
532 DrawProp.BackColor = ST7789_BLUE;
533 DrawProp.pFont = &Font16;
534 lcd_DisplayStringAt(&DrawProp, 0, 16, (uint8_t *)string1, CENTER_MODE);
535 lcd_DisplayStringAt(&DrawProp, 0, 40, (uint8_t *)string2, CENTER_MODE);
536 lcd_DisplayStringAt(&DrawProp, 0, 64, (uint8_t *)"TOPPERS BASE PLATFORM(RV)", CENTER_MODE);
537
538 DrawProp.TextColor = ST7789_GREEN;
539 lcd_DisplayStringAt(&DrawProp, 0, 88, (uint8_t *)"TOPPERS/ASP Kernel", CENTER_MODE);
540 DrawProp.TextColor = ST7789_RED;
541 lcd_DisplayStringAt(&DrawProp, 0, 112, (uint8_t *)"RISC-V/64 K210", CENTER_MODE);
542 lcd_drawBitmap(hlcd, hlcd->_width/2-30, (hlcd->_height/3)*2, (uint8_t *)topamelogo);
543 dly_tsk(5000);
544
545 DrawProp.BackColor = ST7789_BLACK;
546 DrawProp.TextColor = ST7789_WHITE;
547 grapics_test(hlcd);
548
549 DrawProp.TextColor = ST7789_BLACK;
550 DrawProp.BackColor = ST7789_WHITE;
551 lcd_fillScreen(&DrawProp);
552 lcd_fillRect(hlcd, 0, 0, hlcd->_width, hlcd->_height/3, ST7789_BLUE);
553 DrawProp.TextColor = ST7789_WHITE;
554 DrawProp.BackColor = ST7789_BLUE;
555 DrawProp.pFont = &Font16;
556 lcd_DisplayStringAt(&DrawProp, 0, 16, (uint8_t *)"TOPPERS BASE PLATFORM TEST", CENTER_MODE);
557
558 DrawProp.TextColor = ST7789_BLACK;
559 DrawProp.BackColor = ST7789_WHITE;
560 DrawProp.pFont = &Font8;
561 lcd_DisplayStringAt(&DrawProp, 0, 100, (uint8_t *)"Helle World !", CENTER_MODE);
562 DrawProp.pFont = &Font12;
563 lcd_DisplayStringAt(&DrawProp, 0, 120, (uint8_t *)"Helle World !", CENTER_MODE);
564 DrawProp.pFont = &Font16;
565 lcd_DisplayStringAt(&DrawProp, 0, 140, (uint8_t *)"Helle World !", CENTER_MODE);
566
567 DrawProp.TextColor = ST7789_RED;
568 for(i = 20 ; i < 80 ; i++){
569 lcd_DrawCircle(&DrawProp, hlcd->_width/2, hlcd->_height/2+30, i);
570 if(i == 25)
571 i += 10;
572 }
573 for(i = 0 ; i < 30 ; i++){
574 rtc_get_time(&time);
575 set_time(time_string, &time);
576 lcd_DisplayStringAt(&DrawProp, 0, 160, time_string, CENTER_MODE);
577 dly_tsk(1000);
578 }
579
580 if((ercd = ov2640_activate(hcmr, true)) != E_OK){
581 syslog_2(LOG_NOTICE, "ov2640 activate error result(%d) id(%d) ##", ercd, ov2640_id(hcmr));
582 continue;
583 }
584
585 for(i = 0 ; i < 2000 ; i++){
586 if((i % 100) == 0)
587 syslog_1(LOG_NOTICE, "camera count(%d)", i);
588 ercd = ov2640_snapshot(hcmr);
589 if(ercd == E_OK){
590 uint32_t *p = (uint32_t *)hcmr->_dataBuffer;
591 uint32_t *q = (uint32_t *)lcd_buffer;
592 uint32_t *e = (uint32_t *)&lcd_buffer[count];
593 for (; q < e ; p++, q++){
594 *q = SWAP_32(*p);
595 }
596 lcd_drawPicture(hlcd, 0, 0, hcmr->_width, hcmr->_height, lcd_buffer);
597 }
598 }
599 ov2640_activate(hcmr, false);
600 }
601 syslog_0(LOG_NOTICE, "## STOP ##");
602 slp_tsk();
603 syslog(LOG_NOTICE, "Sample program ends.");
604 SVC_PERROR(ext_ker());
605 assert(0);
606}
Note: See TracBrowser for help on using the repository browser.