19
19
// DP and DM can be any pins, but they must be consequitive and in that order
20
20
#define DP_INDEX 10
21
21
#define DM_INDEX 11
22
+ #define START_INDEX 12
22
23
23
24
HAL_GPIO_PIN (DP , 0 , 10 , pio0_10 )
24
25
HAL_GPIO_PIN (DM , 0 , 11 , pio0_11 )
26
+ HAL_GPIO_PIN (START , 0 , 12 , pio1_12 ) // Internal trigger from PIO1 to PIO0
25
27
HAL_GPIO_PIN (TRIGGER , 0 , 18 , sio_18 )
26
28
27
29
/*- Constants ---------------------------------------------------------------*/
@@ -171,7 +173,10 @@ static uint8_t crc5_usb(uint8_t *data, int size)
171
173
static void handle_folding (int pid , uint32_t error )
172
174
{
173
175
if (error )
176
+ {
174
177
g_buffer_info .errors ++ ;
178
+ set_error (true);
179
+ }
175
180
176
181
if (pid == Pid_Sof )
177
182
{
@@ -424,21 +429,23 @@ static bool wait_for_trigger(void)
424
429
//-----------------------------------------------------------------------------
425
430
static void capture_buffer (void )
426
431
{
427
- volatile uint32_t * instr = (volatile uint32_t * )& PIO0 -> INSTR_MEM0 ;
432
+ volatile uint32_t * PIO0_INSTR_MEM = (volatile uint32_t * )& PIO0 -> INSTR_MEM0 ;
433
+ volatile uint32_t * PIO1_INSTR_MEM = (volatile uint32_t * )& PIO1 -> INSTR_MEM0 ;
428
434
int index , packet ;
429
435
430
436
HAL_GPIO_DP_init ();
431
437
HAL_GPIO_DM_init ();
438
+ HAL_GPIO_START_init ();
432
439
433
- RESETS_SET -> RESET = RESETS_RESET_pio0_Msk ;
434
- RESETS_CLR -> RESET = RESETS_RESET_pio0_Msk ;
435
- while (0 == RESETS -> RESET_DONE_b .pio0 );
440
+ RESETS_SET -> RESET = RESETS_RESET_pio0_Msk | RESETS_RESET_pio1_Msk ;
441
+ RESETS_CLR -> RESET = RESETS_RESET_pio0_Msk | RESETS_RESET_pio1_Msk ;
442
+ while (0 == RESETS -> RESET_DONE_b .pio0 && 0 == RESETS -> RESET_DONE_b . pio1 );
436
443
437
444
g_buffer_info .fs = (g_capture_speed == CaptureSpeed_Full );
438
445
g_buffer_info .trigger = (g_capture_trigger == CaptureTrigger_Enabled );
439
446
g_buffer_info .limit = capture_limit_value ();
440
447
441
- static const uint16_t ops [] =
448
+ static const uint16_t pio0_ops [] =
442
449
{
443
450
// idle:
444
451
/* 0 */ OP_MOV | MOV_DST_X | MOV_SRC_NULL | MOV_OP_INVERT , // Reset the bit counter
@@ -484,32 +491,82 @@ static void capture_buffer(void)
484
491
/* 28 */ OP_JMP | JMP_COND_X_NZ_PD | JMP_ADDR (25 /*poll_loop*/ ),
485
492
/* 29 */ OP_MOV | MOV_DST_ISR | MOV_SRC_NULL | MOV_OP_INVERT ,
486
493
/* 30 */ OP_PUSH ,
487
- /* 31 */ OP_JMP | JMP_ADDR (0 /*idle*/ ),
494
+ // Wrap to 0 from here
495
+
496
+ // Entry point, wait for a START signal from the PIO1
497
+ /* 31 */ OP_WAIT | WAIT_POL_1 | WAIT_SRC_PIN | WAIT_INDEX (2 ),
498
+ };
499
+
500
+ static const uint16_t pio1_ops [] =
501
+ {
502
+ /* 0 */ OP_NOP | OP_DELAY (31 ), // Wait for the PIO0 to start
503
+ /* 1 */ OP_NOP | OP_DELAY (31 ),
504
+ /* 2 */ OP_NOP | OP_DELAY (31 ),
505
+ /* 3 */ OP_NOP | OP_DELAY (31 ),
506
+
507
+ // wait_se0:
508
+ /* 4 */ OP_MOV | MOV_DST_OSR | MOV_SRC_PINS | MOV_OP_BIT_REV ,
509
+ /* 5 */ OP_OUT | OUT_DST_Y | OUT_CNT (2 ),
510
+ /* 6 */ OP_JMP | JMP_COND_Y_NZ_PD | JMP_ADDR (4 /*wait_se0*/ ),
511
+
512
+ /* 7 */ OP_MOV | MOV_DST_OSR | MOV_SRC_PINS | MOV_OP_BIT_REV ,
513
+ /* 8 */ OP_OUT | OUT_DST_Y | OUT_CNT (2 ),
514
+ /* 9 */ OP_JMP | JMP_COND_Y_NZ_PD | JMP_ADDR (4 /*wait_se0*/ ),
515
+
516
+ /* 10 */ OP_MOV | MOV_DST_OSR | MOV_SRC_PINS | MOV_OP_BIT_REV ,
517
+ /* 11 */ OP_OUT | OUT_DST_Y | OUT_CNT (2 ),
518
+ /* 12 */ OP_JMP | JMP_COND_Y_NZ_PD | JMP_ADDR (4 /*wait_se0*/ ),
519
+
520
+ /* 13 */ OP_MOV | MOV_DST_OSR | MOV_SRC_PINS | MOV_OP_BIT_REV ,
521
+ /* 14 */ OP_OUT | OUT_DST_Y | OUT_CNT (2 ),
522
+ /* 15 */ OP_JMP | JMP_COND_Y_NZ_PD | JMP_ADDR (4 /*wait_se0*/ ),
523
+
524
+ /* 16 */ OP_SET | SET_DST_PINS | SET_DATA (1 ), // Set the START output
525
+ /* 17 */ OP_JMP | JMP_ADDR (17 /*self*/ ), // Infinite loop
488
526
};
489
527
528
+ // PIO0 init
490
529
PIO0 -> SM0_CLKDIV = ((g_buffer_info .fs ? 1 : 8 ) << PIO0_SM0_CLKDIV_INT_Pos );
491
530
492
- for (int i = 0 ; i < (int )(sizeof (ops )/sizeof (uint16_t )); i ++ )
493
- instr [i ] = ops [i ];
531
+ for (int i = 0 ; i < (int )(sizeof (pio0_ops )/sizeof (uint16_t )); i ++ )
532
+ PIO0_INSTR_MEM [i ] = pio0_ops [i ];
494
533
495
534
if (!g_buffer_info .fs )
496
535
{
497
- instr [1 ] = OP_WAIT | WAIT_POL_1 | WAIT_SRC_PIN | WAIT_INDEX (1 );
498
- instr [2 ] = OP_WAIT | WAIT_POL_0 | WAIT_SRC_PIN | WAIT_INDEX (1 );
536
+ PIO0_INSTR_MEM [1 ] = OP_WAIT | WAIT_POL_1 | WAIT_SRC_PIN | WAIT_INDEX (1 );
537
+ PIO0_INSTR_MEM [2 ] = OP_WAIT | WAIT_POL_0 | WAIT_SRC_PIN | WAIT_INDEX (1 );
499
538
}
500
539
501
- PIO0 -> SM0_EXECCTRL = ((g_buffer_info .fs ? DM_INDEX : DP_INDEX ) << PIO0_SM0_EXECCTRL_JMP_PIN_Pos ) | ( 31 << PIO0_SM0_EXECCTRL_WRAP_TOP_Pos ) |
502
- (0 << PIO0_SM0_EXECCTRL_WRAP_BOTTOM_Pos );
540
+ PIO0 -> SM0_EXECCTRL = ((g_buffer_info .fs ? DM_INDEX : DP_INDEX ) << PIO0_SM0_EXECCTRL_JMP_PIN_Pos ) |
541
+ (30 << PIO0_SM0_EXECCTRL_WRAP_TOP_Pos ) | ( 0 << PIO0_SM0_EXECCTRL_WRAP_BOTTOM_Pos );
503
542
504
543
PIO0 -> SM0_SHIFTCTRL = PIO0_SM0_SHIFTCTRL_FJOIN_RX_Msk | PIO0_SM0_SHIFTCTRL_AUTOPUSH_Msk |
505
544
(31 << PIO0_SM0_SHIFTCTRL_PUSH_THRESH_Pos );
506
545
507
546
PIO0 -> SM0_PINCTRL = (DP_INDEX << PIO0_SM0_PINCTRL_IN_BASE_Pos );
508
547
548
+ PIO0 -> SM0_INSTR = OP_JMP | JMP_ADDR (31 );
549
+
550
+ // PIO1 init
551
+ PIO1 -> SM0_CLKDIV = ((g_buffer_info .fs ? 1 : 8 ) << PIO0_SM0_CLKDIV_INT_Pos );
552
+
553
+ for (int i = 0 ; i < (int )(sizeof (pio1_ops )/sizeof (uint16_t )); i ++ )
554
+ PIO1_INSTR_MEM [i ] = pio1_ops [i ];
555
+
556
+ PIO1 -> SM0_EXECCTRL = (31 << PIO0_SM0_EXECCTRL_WRAP_TOP_Pos ) | (0 << PIO0_SM0_EXECCTRL_WRAP_BOTTOM_Pos );
557
+ PIO1 -> SM0_SHIFTCTRL = 0 ;
558
+ PIO1 -> SM0_PINCTRL = (DP_INDEX << PIO0_SM0_PINCTRL_IN_BASE_Pos ) |
559
+ (START_INDEX << PIO0_SM0_PINCTRL_SET_BASE_Pos ) | (1 << PIO0_SM0_PINCTRL_SET_COUNT_Pos );
560
+
561
+ PIO1 -> SM0_INSTR = OP_SET | SET_DST_PINDIRS | SET_DATA (1 ); // Clear the START output
562
+ PIO1 -> SM0_INSTR = OP_SET | SET_DST_PINS | SET_DATA (0 );
563
+
509
564
index = 2 ;
510
565
packet = 0 ;
511
566
g_buffer_info .count = 0 ;
512
567
568
+ set_error (false);
569
+
513
570
if (!wait_for_trigger ())
514
571
{
515
572
display_puts ("Capture stopped\r\n" );
@@ -518,6 +575,7 @@ static void capture_buffer(void)
518
575
519
576
display_puts ("Capture started\r\n" );
520
577
578
+ PIO1_SET -> CTRL = (1 << (PIO0_CTRL_SM_ENABLE_Pos + 0 ));
521
579
PIO0_SET -> CTRL = (1 << (PIO0_CTRL_SM_ENABLE_Pos + 0 ));
522
580
523
581
while (1 )
0 commit comments