11/* DreamShell ##version##
22
33 dreameye.c - dreameye driver addons
4- Copyright (C) 2015, 2023 SWAT
4+ Copyright (C) 2015, 2023, 2024 SWAT
55
66*/
77
2424#define JANGGU_FMT_YUYV422 ((0 << 1) | (0 << 6))
2525#define JANGGU_FMT_UNK24BPP ((1 << 1) | (1 << 6))
2626#define JANGGU_FMT_UNK32BPP ((1 << 1) | (0 << 6))
27- #define JANGGU_FMT_UNK7 (( 1 << 7) )
27+ #define JANGGU_FMT_UNK7 (1 << 7)
2828
2929// #define MAPLE_SPEED_2MBPS 0x0000
3030#define MAPLE_SPEED_1MBPS 0x0100
@@ -155,49 +155,6 @@ static dreameye_register_t ic_regs[85] = {
155155};
156156
157157
158- void hexDump (char * desc , void * addr , int len ) {
159- int i ;
160- unsigned char buff [17 ];
161- unsigned char * pc = (unsigned char * )addr ;
162-
163- // Output description if given.
164- if (desc != NULL )
165- dbglog (DBG_DEBUG , "%s:\n" , desc );
166-
167- // Process every byte in the data.
168- for (i = 0 ; i < len ; i ++ ) {
169- // Multiple of 16 means new line (with line offset).
170-
171- if ((i % 16 ) == 0 ) {
172- // Just don't print ASCII for the zeroth line.
173- if (i != 0 )
174- dbglog (DBG_DEBUG , " %s\n" , buff );
175-
176- // Output the offset.
177- dbglog (DBG_DEBUG , " %04x " , i );
178- }
179-
180- // Now the hex code for the specific character.
181- dbglog (DBG_DEBUG , " %02x" , pc [i ]);
182-
183- // And store a printable ASCII character for later.
184- if ((pc [i ] < 0x20 ) || (pc [i ] > 0x7e ))
185- buff [i % 16 ] = '.' ;
186- else
187- buff [i % 16 ] = pc [i ];
188- buff [(i % 16 ) + 1 ] = '\0' ;
189- }
190-
191- // Pad out last line if not exactly 16 characters.
192- while ((i % 16 ) != 0 ) {
193- dbglog (DBG_DEBUG , " " );
194- i ++ ;
195- }
196-
197- // And print the final ASCII bit.
198- dbglog (DBG_DEBUG , " %s\n" , buff );
199- }
200-
201158static void yuv420de_to_nv21 (uint8_t * dest , const uint8_t * src , int width , int height ) {
202159 int w , h ;
203160
@@ -304,8 +261,6 @@ static void dreameye_get_video_frame_cb(maple_frame_t *frame) {
304261 respbuf32 = (uint32_t * )resp -> data ;
305262 respbuf8 = (uint8_t * )resp -> data ;
306263
307- // hexDump("resp", resp->data, resp->data_len * 4);
308-
309264 if (resp -> response != MAPLE_RESPONSE_DATATRF ) {
310265 first_state -> img_transferring = -1 ;
311266 return ;
@@ -366,17 +321,18 @@ static void dreameye_get_video_frame_cb(maple_frame_t *frame) {
366321 first_state -> img_transferring = -1 ;
367322 } else {
368323 first_state -> img_transferring = 0 ;
324+ first_state -> last_request = timer_ns_gettime64 ();
325+ /* FIXME: Better framebuffers sync */
326+ if (first_state -> width >= 320 ) {
327+ timer_spin_sleep (10 );
328+ }
329+ else {
330+ timer_spin_sleep (2 );
331+ }
369332 }
370333 return ;
371334 }
372335
373- /* FIXME: Very stupid things right here, but it's sync frames */
374- if (first_state -> width == 320 )
375- timer_spin_sleep (1 );
376- else
377- timer_spin_sleep (2 );
378- /* End of FIXME */
379-
380336 if (-- first_state -> img_transferring == 1 ) {
381337 dreameye_get_video_frame_part (frame -> dev );
382338 }
@@ -411,19 +367,18 @@ static int dreameye_send_get_video_frame(maple_device_t *dev, dreameye_state_ext
411367 return MAPLE_EOK ;
412368}
413369
414- int dreameye_get_video_frame (maple_device_t * dev , uint8_t fb_num , uint8_t * * data ,
415- int * img_sz ) {
416- dreameye_state_ext_t * de ;
370+ int dreameye_req_video_frame (maple_device_t * dev ) {
417371
418372 assert (dev != NULL );
419373 assert (dev -> unit == 1 );
420374
375+ dreameye_state_ext_t * de ;
421376 de = (dreameye_state_ext_t * )dev -> status ;
422377 first_state = de ;
423378
424379 de -> img_transferring = 1 ;
425380 de -> img_size = 0 ;
426- de -> img_number = fb_num ;
381+ de -> img_number ^= 1 ;
427382
428383 if (de -> compressed ) {
429384 de -> transfer_count = de -> frame_size / JANGGU_FRAME_DATA_SIZE_COMPRESSED ;
@@ -439,7 +394,30 @@ int dreameye_get_video_frame(maple_device_t *dev, uint8_t fb_num, uint8_t **data
439394 goto fail ;
440395 }
441396
442- dreameye_get_video_frame_part (dev );
397+ if (dreameye_get_video_frame_part (dev ) != MAPLE_EOK ) {
398+ goto fail ;
399+ }
400+
401+ return MAPLE_EOK ;
402+
403+ fail :
404+ first_state = NULL ;
405+ de -> img_transferring = 0 ;
406+ de -> img_buf = NULL ;
407+ de -> img_size = 0 ;
408+ de -> transfer_count = 0 ;
409+
410+ return MAPLE_EFAIL ;
411+ }
412+
413+ int dreameye_get_video_frame (maple_device_t * dev , uint8_t * * data , int * img_sz ) {
414+
415+ dreameye_state_ext_t * de ;
416+ de = (dreameye_state_ext_t * )dev -> status ;
417+
418+ if (!de -> img_transferring ) {
419+ dreameye_req_video_frame (dev );
420+ }
443421
444422 while (de -> img_transferring > 0 ) {
445423 thd_pass ();
@@ -462,7 +440,6 @@ int dreameye_get_video_frame(maple_device_t *dev, uint8_t fb_num, uint8_t **data
462440 free (de -> img_buf );
463441 }
464442
465- fail :
466443 * data = NULL ;
467444 * img_sz = 0 ;
468445 first_state = NULL ;
@@ -508,11 +485,9 @@ static void dreameye_get_param_cb(maple_frame_t *frame) {
508485 assert ((resp -> data_len ) == 3 );
509486 assert (respbuf8 [4 ] == 0xD0 );
510487 assert (respbuf8 [5 ] == 0x00 );
511- // assert(respbuf8[8] == DREAMEYE_GETCOND_***);
512488
513489 /* Update the data in the status. */
514490 de = (dreameye_state_ext_t * )frame -> dev -> status ;
515- // hexDump("getparam", respbuf8, 12);
516491 de -> value = respbuf8 [10 ] | respbuf8 [11 ] << 8 ;
517492 }
518493
@@ -586,8 +561,6 @@ static void dreameye_queue_param_cb(maple_frame_t *frame) {
586561 dbglog (DBG_ERROR , "%s: bad response: %d\n" , __func__ , resp -> response );
587562 return ;
588563 }
589-
590- // hexDump("setparam", respbuf8, 12);
591564}
592565
593566int dreameye_queue_param (maple_device_t * dev , uint8_t param , uint8_t arg , uint16_t value ) {
@@ -725,6 +698,8 @@ static int dreameye_set_format(maple_device_t **devs, int isp_mode, int format)
725698
726699 de -> format = format ;
727700 de -> compressed = (pix_fmt & JANGGU_FMT_UNCOMPRESSED ) ? 0 : 1 ;
701+ de -> img_number = 1 ;
702+ de -> last_request = 0 ;
728703
729704 /* Set ISP operation mode */
730705 dreameye_set_param (devs [0 ], DREAMEYE_COND_REG_ISP , ISP_OP_MODE , isp_mode );
0 commit comments