source: azure_iot_hub_riscv/trunk/app_iothub_client/src/kpu_main.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: 17.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#include <kernel.h>
44#include <stdlib.h>
45#include <t_syslog.h>
46#include <t_stdlib.h>
47#include <target_syssvc.h>
48#include "syssvc/serial.h"
49#include "syssvc/syslog.h"
50#include "device.h"
51#include "pinmode.h"
52#include "sipeed_st7789.h"
53#include "sipeed_ov2640.h"
54#include "storagedevice.h"
55#ifdef SDEV_SENSE_ONETIME
56#include "spi_driver.h"
57#include "sddiskio.h"
58#else
59#include "rom_file.h"
60#endif
61#include "kernel_cfg.h"
62#include "kpu_main.h"
63#include "kpu.h"
64#include "region_layer.h"
65
66extern void ai_dma_done_isr(DMA_Handle_t *dma);
67
68/*
69* サービスコールのエラーのログ出力
70*/
71Inline void
72svc_perror(const char *file, int_t line, const char *expr, ER ercd)
73{
74 if (ercd < 0) {
75 t_perror(LOG_ERROR, file, line, expr, ercd);
76 }
77}
78
79#define SVC_PERROR(expr) svc_perror(__FILE__, __LINE__, #expr, (expr))
80
81#define SWAP_32(x) ((x >> 24) | (x >> 8 & 0xff00) | (x << 8 & 0xff0000) | (x << 24))
82
83#ifndef SPI1DMATX_SEM
84#define SPI1DMATX_SEM 0
85#endif
86
87#define CLASS_NUMBER 20
88
89LCD_Handler_t LcdHandle;
90LCD_DrawProp_t DrawProp;
91DVP_Handle_t DvpHandle;
92OV2640_t CameraHandle;
93
94uint8_t sTxBuffer[16];
95
96static uint8_t time_string[12];
97
98static void
99set_value(uint8_t *buf, int value)
100{
101 buf[1] = (value % 10) + '0';
102 buf[0] = (value / 10) + '0';
103}
104
105static void
106set_time(uint8_t *buf, struct tm2 *tm)
107{
108 buf[8] = 0;
109 set_value(&buf[6], tm->tm_sec);
110 buf[5] = ':';
111 set_value(&buf[3], tm->tm_min);
112 buf[2] = ':';
113 set_value(&buf[0], tm->tm_hour);
114}
115
116/*
117* ダイレクトデジタルピン設定
118*/
119void
120pinMode(uint8_t Pin, uint8_t dwMode){
121 int gpionum = gpio_get_gpiohno(Pin, false);
122 GPIO_Init_t init = {0};
123
124 syslog_2(LOG_NOTICE, "## pinMode Pin(%d) gpionum(%d) ##", Pin, gpionum);
125 if(gpionum >= 0){
126 uint8_t function = FUNC_GPIOHS0 + gpionum;
127 fpioa_set_function(Pin, function);
128 switch(dwMode){
129 case INPUT:
130 init.mode = GPIO_MODE_INPUT;
131 init.pull = GPIO_NOPULL;
132 break;
133 case INPUT_PULLDOWN:
134 init.mode = GPIO_MODE_INPUT;
135 init.pull = GPIO_PULLDOWN;
136 break;
137 case INPUT_PULLUP:
138 init.mode = GPIO_MODE_INPUT;
139 init.pull = GPIO_PULLUP;
140 break;
141 case OUTPUT:
142 default:
143 init.mode = GPIO_MODE_OUTPUT;
144 init.pull = GPIO_PULLDOWN;
145 break;
146 }
147 gpio_setup(TADR_GPIOHS_BASE, &init, (uint8_t)gpionum);
148 }
149 return ;
150}
151
152void digitalWrite(uint8_t Pin, int dwVal);
153
154#if (CLASS_NUMBER > 1)
155typedef struct
156{
157 char *str;
158 uint16_t color;
159 uint16_t height;
160 uint16_t width;
161} class_lable_t;
162
163class_lable_t class_lable[CLASS_NUMBER] =
164{
165 {"aeroplane", ST7789_GREEN},
166 {"bicycle", ST7789_GREEN},
167 {"bird", ST7789_GREEN},
168 {"boat", ST7789_GREEN},
169 {"bottle", 0xF81F},
170 {"bus", ST7789_GREEN},
171 {"car", ST7789_GREEN},
172 {"cat", ST7789_GREEN},
173 {"chair", 0xFD20},
174 {"cow", ST7789_GREEN},
175 {"diningtable", ST7789_GREEN},
176 {"dog", ST7789_GREEN},
177 {"horse", ST7789_GREEN},
178 {"motorbike", ST7789_GREEN},
179 {"person", 0xF800},
180 {"pottedplant", ST7789_GREEN},
181 {"sheep", ST7789_GREEN},
182 {"sofa", ST7789_GREEN},
183 {"train", ST7789_GREEN},
184 {"tvmonitor", 0xF9B6}
185};
186
187static uint32_t lable_string_draw_ram[115 * 16 * 8 / 2];
188#endif
189extern uint8_t model_data[];
190kpu_model_context_t g_task;
191static region_layer_t detect_rl;
192
193volatile uint8_t g_ai_done_flag;
194
195void ai_done(void *ctx)
196{
197 g_ai_done_flag = 2;
198}
199
200#define ANCHOR_NUM 5
201float g_anchor[ANCHOR_NUM * 2] = {1.08, 1.19, 3.42, 4.41, 6.63, 11.38, 9.42, 5.11, 16.62, 10.52};
202
203static void drawboxes(uint32_t x1, uint32_t y1, uint32_t x2, uint32_t y2, uint32_t class, float prob)
204{
205 if (x1 >= 320)
206 x1 = 319;
207 if (x2 >= 320)
208 x2 = 319;
209 if (y1 >= 240)
210 y1 = 239;
211 if (y2 >= 240)
212 y2 = 239;
213
214#if (CLASS_NUMBER > 1)
215 DrawProp.TextColor = class_lable[class].color;
216 lcd_drawRect(&DrawProp, x1, y1, x2-x1, y2-y1);
217 DrawProp.TextColor = ST7789_WHITE;
218 DrawProp.BackColor = class_lable[class].color;
219 DrawProp.pFont = &Font12;
220 lcd_DisplayStringAt(&DrawProp, x1 + 1, y1 + 1, class_lable[class].str, LEFT_MODE);
221#else
222 lcd_drawRect(&DrawProp, x1, y1, x2, y2, 2, ST7789_RED);
223#endif
224}
225
226/*
227* メインタスク
228*/
229void kpu_task(intptr_t exinf)
230{
231 SPI_Init_t Init;
232 SPI_Handle_t *hspi;
233 LCD_Handler_t *hlcd;
234 OV2640_t *hcmr;
235 DVP_Handle_t *hdvp;
236 uint16_t *lcd_buffer;
237 ER_UINT ercd;
238 uint32_t i, count;
239 struct tm2 time;
240 unsigned long atmp;
241#ifdef SDEV_SENSE_ONETIME
242 StorageDevice_t *psdev;
243 SDCARD_Handler_t *hsd = NULL;
244#else
245 uint32_t esize, fsize, headlen;
246 uint8_t *addr;
247#endif
248
249 SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)));
250 syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (int_t) exinf);
251
252 pinMode(LED_PIN, OUTPUT);
253
254 select_spi0_dvp_mode(1);
255
256#ifdef SDEV_SENSE_ONETIME
257 pinMode(SPI_SS_PIN, OUTPUT);
258 digitalWrite(SPI_SS_PIN, HIGH);
259#else /* USE ROMFILE */
260 rom_file_init();
261 esize = 1*1024*1024;
262 addr = (uint8_t *)romfont;
263 while(esize > 4){
264 fsize = (addr[0] << 24) | (addr[1] << 16) | (addr[2] << 8) | addr[3];
265 if((fsize & 3) != 0 || fsize < 16 || fsize > esize)
266 break;
267 for(i = 0 ; i < 28 ; i++){
268 if(addr[i+4] == 0)
269 break;
270 }
271 if(i >= 28)
272 break;
273 if(i < 12)
274 headlen = 16;
275 else
276 headlen = 32;
277 if(create_rom_file((const char *)(addr+4), (uintptr_t)(addr+headlen), fsize-headlen) < 0)
278 break;
279 addr += fsize;
280 esize -= fsize;
281 }
282#endif
283
284 hcmr = &CameraHandle;
285 hcmr->frameSize = FRAMESIZE_QVGA;
286 hcmr->pixFormat = PIXFORMAT_RGB565;
287 ov2640_getResolition(hcmr, FRAMESIZE_QVGA);
288 hcmr->_resetPoliraty = ACTIVE_HIGH;
289 hcmr->_pwdnPoliraty = ACTIVE_HIGH;
290 hcmr->_slaveAddr = 0x00;
291 hcmr->_dataBuffer = NULL;
292 hcmr->_aiBuffer = NULL;
293
294 // just support RGB565 and YUV442 on k210
295
296 // Initialize the camera bus, 8bit reg
297 hdvp = &DvpHandle;
298 hcmr->hdvp = hdvp;
299 hdvp->Init.Freq = 24000000;
300 hdvp->Init.Width = hcmr->_width;
301 hdvp->Init.Height = hcmr->_height;
302 hdvp->Init.Format = DVP_FORMAT_RGB;
303 hdvp->Init.BurstMode = DVP_BURST_ENABLE;
304 hdvp->Init.AutoMode = DVP_AUTOMODE_DISABLE;
305 hdvp->Init.GMMlen = 4;
306
307 hdvp->Init.num_sccb_reg = 8;
308 hdvp->Init.CMosPClkPin = 47;
309 hdvp->Init.CMosXClkPin = 46;
310 hdvp->Init.CMosHRefPin = 45;
311 hdvp->Init.CMosPwDnPin = 44;
312 hdvp->Init.CMosVSyncPin = 43;
313 hdvp->Init.CMosRstPin = 42;
314 hdvp->Init.SccbSClkPin = 41;
315 hdvp->Init.SccbSdaPin = 40;
316 hdvp->Init.IntNo = INTNO_DVP;
317 syslog_1(LOG_NOTICE, "## DvpHandle[%08x] ##", &DvpHandle);
318
319 syslog_3(LOG_NOTICE, "## hcmr->_width(%d) hcmr->_height(%d) size[%08x] ##", hcmr->_width, hcmr->_height, (hcmr->_width * hcmr->_height * 2));
320 atmp = (unsigned long)malloc(hcmr->_width * hcmr->_height * 2 + 64); //RGB565
321 hcmr->_dataBuffer = (uint32_t *)((atmp + 63) & ~63);
322 if(hcmr->_dataBuffer == NULL){
323 hcmr->_width = 0;
324 hcmr->_height = 0;
325 syslog_0(LOG_ERROR, "Can't allocate _dataBuffer !");
326 slp_tsk();
327 }
328 atmp = (unsigned long)malloc(hcmr->_width * hcmr->_height * 3 + 128); //RGB888
329 hcmr->_aiBuffer = (uint32_t *)((atmp + 127) & ~127);
330 if(hcmr->_aiBuffer == NULL){
331 hcmr->_width = 0;
332 hcmr->_height = 0;
333 free(hcmr->_dataBuffer);
334 hcmr->_dataBuffer = NULL;
335 syslog_0(LOG_ERROR, "Can't allocate _aiBuffer !");
336 slp_tsk();
337 }
338 syslog_2(LOG_NOTICE, "## hcmr->_dataBuffer[%08x] hcmr->_aiBuffer[%08x] ##", hcmr->_dataBuffer, hcmr->_aiBuffer);
339 atmp = (unsigned long)hcmr->_aiBuffer - IOMEM;
340 hdvp->Init.RedAddr = (uint32_t)atmp;
341 atmp = (unsigned long)hcmr->_aiBuffer + hcmr->_width * hcmr->_height - IOMEM;
342 hdvp->Init.GreenAddr = (uint32_t)atmp;
343 atmp = (unsigned long)hcmr->_aiBuffer + hcmr->_width * hcmr->_height * 2 - IOMEM;
344 hdvp->Init.BlueAddr = (uint32_t)atmp;
345 atmp = (unsigned long)hcmr->_dataBuffer - IOMEM;
346 hdvp->Init.RGBAddr = (uint32_t)atmp;
347 dvp_init(hdvp);
348
349 if(ov2640_sensor_ov_detect(hcmr) == E_OK){
350 syslog_0(LOG_NOTICE, "find ov sensor !");
351 }
352 else if(ov2640_sensro_gc_detect(hcmr) == E_OK){
353 syslog_0(LOG_NOTICE, "find gc3028 !");
354 }
355 if(ov2640_reset(hcmr) != E_OK){
356 syslog_0(LOG_ERROR, "ov2640 reset error !");
357 slp_tsk();
358 }
359 if(ov2640_set_pixformat(hcmr) != E_OK){
360 syslog_0(LOG_ERROR, "set pixformat error !");
361 slp_tsk();
362 }
363 if(ov2640_set_framesize(hcmr) != E_OK){
364 syslog_0(LOG_ERROR, "set frame size error !");
365 slp_tsk();
366 }
367 if(ov2640_setInvert(hcmr, false) != E_OK){
368 syslog_0(LOG_ERROR, "set invert error !");
369 slp_tsk();
370 }
371 syslog_1(LOG_NOTICE, "OV2640 id(%d)", ov2640_id(hcmr));
372
373 Init.WorkMode = SPI_WORK_MODE_0;
374 Init.FrameFormat = SPI_FF_OCTAL;
375 Init.DataSize = 8;
376 Init.Prescaler = 15000000;
377 Init.SignBit = 0;
378 Init.InstLength = 8;
379 Init.AddrLength = 0;
380 Init.WaitCycles = 0;
381 Init.IATransMode = SPI_AITM_AS_FRAME_FORMAT;
382 Init.SclkPin = SIPEED_ST7789_SCLK_PIN;
383 Init.MosiPin = -1;
384 Init.MisoPin = -1;
385 Init.SsPin = SIPEED_ST7789_SS_PIN;
386 Init.SsNo = SIPEED_ST7789_SS;
387 Init.TxDMAChannel = SIPEED_DMA_CH;
388 Init.RxDMAChannel = -1;
389 Init.semid = SPI1TRN_SEM;
390 Init.semlock = SPI1LOCK_SEM;
391 Init.semdmaid = SPI1DMATX_SEM;
392 hspi = spi_init(SPI_PORTID, &Init);
393 if(hspi == NULL){
394 syslog_0(LOG_ERROR, "SPI INIT ERROR");
395 slp_tsk();
396 }
397
398 hlcd = &LcdHandle;
399 hlcd->hspi = hspi;
400// hlcd->spi_lock= SPI1LOCK_SEM;
401 hlcd->dir = DIR_YX_LRUD;
402 hlcd->dcx_pin = SIPEED_ST7789_DCX_PIN;
403 hlcd->rst_pin = SIPEED_ST7789_RST_PIN;
404 hlcd->cs_sel = SIPEED_ST7789_SS;
405 hlcd->rst_no = SIPEED_ST7789_RST_GPIONUM;
406 hlcd->dcx_no = SIPEED_ST7789_DCX_GPIONUM;
407 DrawProp.hlcd = hlcd;
408 lcd_init(hlcd);
409 syslog_2(LOG_NOTICE, "width(%d) height(%d)", hlcd->_width, hlcd->_height);
410 count = hcmr->_width * hcmr->_height;
411 lcd_buffer = (uint16_t *)malloc(count * 2);
412 if(lcd_buffer == NULL){
413 syslog_0(LOG_ERROR, "no lcd buffer !");
414 slp_tsk();
415 }
416 DrawProp.BackColor = ST7789_WHITE;
417 DrawProp.TextColor = ST7789_BLACK;
418 lcd_fillScreen(&DrawProp);
419
420#ifdef SDEV_SENSE_ONETIME
421 Init.WorkMode = SPI_WORK_MODE_0;
422 Init.FrameFormat = SPI_FF_STANDARD;
423 Init.DataSize = 8;
424 Init.Prescaler = 5000000;
425 Init.SignBit = 0;
426 Init.InstLength = 0;
427 Init.AddrLength = 0;
428 Init.WaitCycles = 0;
429 Init.IATransMode = SPI_AITM_STANDARD;
430 Init.SclkPin = SPI_SCK_PIN;
431 Init.MosiPin = SPI_MOSI_PIN;
432 Init.MisoPin = SPI_MISO_PIN;
433 Init.SsPin = -1;
434 Init.SsNo = -1;
435 Init.TxDMAChannel = -1;
436 Init.RxDMAChannel = SPI_DMA1_CH;
437 Init.semid = SPI2TRN_SEM;
438 Init.semlock = SPI2LOCK_SEM;
439 Init.semdmaid = SPI2DMATX_SEM;
440 hspi = spi_init(SPICARD_PORTID, &Init);
441 if(hspi == NULL){
442 syslog_0(LOG_ERROR, "SPI-CARD INIT ERROR");
443 slp_tsk();
444 }
445 sdcard_setspi2(SPISDCARD_PORTID, hspi, SPI_SS_PIN);
446
447 /*
448 * SD-CARD SPI通信設定
449 */
450 for(i = 0 ; i < 10 ; i++)
451 sTxBuffer[i] = 0xff;
452 if((ercd = spi_core_transmit(hspi, -1, (uint8_t*)sTxBuffer, 10)) != E_OK){
453 /* Transfer error in transmission process */
454 syslog_1(LOG_NOTICE, "## call Error_Handler(2)(%d) ##", ercd);
455 }
456#if SPI_WAIT_TIME == 0
457 if((ercd = spi_wait(hspi, 100)) != E_OK){
458 syslog_0(LOG_NOTICE, "## call Error_Handler(3) ##");
459 }
460#endif
461 dly_tsk(100);
462 SDMSence_task(0);
463 psdev = SDMGetStorageDevice(SDCARD_DEVNO);
464 hsd = (SDCARD_Handler_t *)psdev->_sdev_local[1];
465 if(hsd == NULL)
466 syslog_0(LOG_ERROR, "SD-CARD INITAIL ERROR !");
467#endif
468 extern DMA_Handle_t g_ai_hdma;
469 g_ai_hdma.chnum = AI_DMA_CH;
470 g_ai_hdma.xfercallback = ai_dma_done_isr;
471 g_ai_hdma.errorcallback = NULL;
472 g_ai_hdma.Init.Request = DMA_SELECT_AI_RX_REQ; /* DMA選択 */
473 g_ai_hdma.Init.Direction = DMA_PERIPH_TO_MEMORY; /* DMA転送方向 */
474 g_ai_hdma.Init.SrcMultBlock = DMAC_MULTBLOCK_CONT; /* ソースマルチブロックタイプ */
475 g_ai_hdma.Init.DrcMultBlock = DMAC_MULTBLOCK_CONT; /* デスティネーションマルチブロックタイプ */
476 g_ai_hdma.Init.SrcHandShake = DMAC_HS_HARDWARE; /* ソースハンドシェイク */
477 g_ai_hdma.Init.DrcHandShake = DMAC_HS_SOFTWARE; /* デスティネーションハンドシェイク */
478 g_ai_hdma.Init.SrcHwhsPol = DMAC_HWHS_POLARITY_LOW; /* ソースハードウェアハンドシェイク極性 */
479 g_ai_hdma.Init.DrcHwhsPol = DMAC_HWHS_POLARITY_LOW; /* デスティネーションハードウェアハンドシェイク極性 */
480 g_ai_hdma.Init.Priority = 4; /* 優先度 */
481 g_ai_hdma.Init.SrcMaster = DMAC_MASTER1; /* ソースマスター設定 */
482 g_ai_hdma.Init.DstMaster = DMAC_MASTER2; /* デスティネーションマスター設定 */
483 g_ai_hdma.Init.SrcInc = DMAC_ADDR_NOCHANGE; /* ソースインクリメント設定 */
484 g_ai_hdma.Init.DstInc = DMAC_ADDR_INCREMENT; /* デスティネーションインクリメント設定 */
485 g_ai_hdma.Init.SrcTransWidth = DMAC_TRANS_WIDTH_32; /* ソース転送幅 */
486 g_ai_hdma.Init.DstTransWidth = DMAC_TRANS_WIDTH_32; /* デスティネーション転送幅 */
487 g_ai_hdma.Init.SrcBurstSize = DMAC_MSIZE_4; /* ソースバーストサイズ */
488 g_ai_hdma.Init.DstBurstSize = DMAC_MSIZE_4; /* デスティネーションバーストサイズ */
489 g_ai_hdma.Init.IocBlkTrans = 0; /* IOCブロック転送 */
490 g_ai_hdma.localdata = (void *)&g_task;
491 if ((ercd = dma_init(&g_ai_hdma)) != E_OK) {
492 syslog_0(LOG_ERROR, "AI-DMA INITAIL ERROR !");
493 }
494
495 if (kpu_load_kmodel(&g_task, model_data) != 0) {
496 syslog_0(LOG_ERROR, "kmodel init error");
497 slp_tsk();
498 }
499
500 detect_rl.anchor_number = ANCHOR_NUM;
501 detect_rl.anchor = g_anchor;
502 detect_rl.threshold = 0.7;
503 detect_rl.nms_value = 0.3;
504 region_layer_init(&detect_rl, 10, 7, 125, 320, 240);
505
506 bool_t camok = true;
507 if((ercd = ov2640_activate(hcmr, true)) != E_OK){
508 syslog_2(LOG_NOTICE, "ov2640 activate error result(%d) id(%d) ##", ercd, ov2640_id(hcmr));
509 camok = false;
510 }
511
512 int tmo = 0;
513 g_ai_done_flag = 0;
514 while (camok) {
515 if (g_ai_done_flag == 0) {
516 ercd = ov2640_snapshot(hcmr);
517 if (ercd != E_OK) {
518 camok = false;
519 continue;
520 }
521 g_ai_done_flag = 1;
522
523 /* start to calculate */
524 atmp = (unsigned long)hcmr->_aiBuffer - IOMEM;
525 kpu_run_kmodel(&g_task, (const uint8_t *)atmp, AI_DMA_CH, ai_done, NULL);
526
527 uint32_t *p = (uint32_t *)hcmr->_dataBuffer;
528 uint32_t *q = (uint32_t *)lcd_buffer;
529 uint32_t *e = (uint32_t *)&lcd_buffer[count];
530 for (; q < e ; p++, q++){
531 *q = SWAP_32(*p);
532 }
533 }
534
535 if (g_ai_done_flag == 1) {
536 tmo++;
537 if (tmo >= 10) {
538 tmo = 0;
539 g_ai_done_flag = 0;
540 }
541 else {
542 dly_tsk(1);
543 }
544 continue;
545 }
546 else if (g_ai_done_flag == 2) {
547 g_ai_done_flag = 0;
548 float *output;
549 size_t output_size;
550 kpu_get_output(&g_task, 0, &output, &output_size);
551 detect_rl.input = output;
552
553 /* start region layer */
554 region_layer_run(&detect_rl, NULL);
555 }
556
557 lcd_drawPicture(hlcd, 0, 0, hcmr->_width, hcmr->_height, lcd_buffer);
558
559 /* draw boxs */
560 region_layer_draw_boxes(&detect_rl, drawboxes);
561 }
562 ov2640_activate(hcmr, false);
563
564 syslog_0(LOG_NOTICE, "## STOP ##");
565 slp_tsk();
566 syslog(LOG_NOTICE, "Sample program ends.");
567 SVC_PERROR(ext_ker());
568 assert(0);
569}
Note: See TracBrowser for help on using the repository browser.