Fix PIO code origins handling
This commit is contained in:
		
							parent
							
								
									3410740b4a
								
							
						
					
					
						commit
						5868a1ade9
					
				
					 1 changed files with 20 additions and 15 deletions
				
			
		
							
								
								
									
										35
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								src/main.c
									
									
									
									
									
								
							|  | @ -91,6 +91,11 @@ static size_t iq_queue_pos = 0; | ||||||
| 
 | 
 | ||||||
| static uint32_t rnd = 0; | static uint32_t rnd = 0; | ||||||
| 
 | 
 | ||||||
|  | static int origin_lo = -1; | ||||||
|  | static int origin_rx = -1; | ||||||
|  | static int origin_fb = -1; | ||||||
|  | static int origin_ad = 0; | ||||||
|  | 
 | ||||||
| inline static __unused uint32_t rnd_next() | inline static __unused uint32_t rnd_next() | ||||||
| { | { | ||||||
| 	rnd = rnd * 0x41c64e6d + 12345; | 	rnd = rnd * 0x41c64e6d + 12345; | ||||||
|  | @ -120,23 +125,23 @@ static void init_lo() | ||||||
| 	pio_program_t prog = { | 	pio_program_t prog = { | ||||||
| 		.instructions = insn, | 		.instructions = insn, | ||||||
| 		.length = sizeof(insn) / sizeof(*insn), | 		.length = sizeof(insn) / sizeof(*insn), | ||||||
| 		.origin = -1, | 		.origin = origin_lo, | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
| 	pio_sm_restart(PIO, LO_SM); | 	pio_sm_restart(PIO, LO_SM); | ||||||
| 	pio_sm_clear_fifos(PIO, LO_SM); | 	pio_sm_clear_fifos(PIO, LO_SM); | ||||||
| 
 | 
 | ||||||
| 	if (pio_can_add_program(PIO, &prog)) | 	if (pio_can_add_program(PIO, &prog)) | ||||||
| 		prog.origin = pio_add_program(PIO, &prog); | 		origin_lo = pio_add_program(PIO, &prog); | ||||||
| 
 | 
 | ||||||
| 	pio_sm_config pc = pio_get_default_sm_config(); | 	pio_sm_config pc = pio_get_default_sm_config(); | ||||||
| 	sm_config_set_out_pins(&pc, LO_PIN, 1); | 	sm_config_set_out_pins(&pc, LO_PIN, 1); | ||||||
| 	sm_config_set_set_pins(&pc, LO_PIN, 1); | 	sm_config_set_set_pins(&pc, LO_PIN, 1); | ||||||
| 	sm_config_set_wrap(&pc, prog.origin, prog.origin + prog.length - 1); | 	sm_config_set_wrap(&pc, origin_lo, origin_lo + prog.length - 1); | ||||||
| 	sm_config_set_clkdiv_int_frac(&pc, 1, 0); | 	sm_config_set_clkdiv_int_frac(&pc, 1, 0); | ||||||
| 	sm_config_set_fifo_join(&pc, PIO_FIFO_JOIN_TX); | 	sm_config_set_fifo_join(&pc, PIO_FIFO_JOIN_TX); | ||||||
| 	sm_config_set_out_shift(&pc, false, true, 32); | 	sm_config_set_out_shift(&pc, false, true, 32); | ||||||
| 	pio_sm_init(PIO, LO_SM, prog.origin, &pc); | 	pio_sm_init(PIO, LO_SM, origin_lo, &pc); | ||||||
| 
 | 
 | ||||||
| 	pio_sm_set_consecutive_pindirs(PIO, LO_SM, LO_PIN, 1, GPIO_IN); | 	pio_sm_set_consecutive_pindirs(PIO, LO_SM, LO_PIN, 1, GPIO_IN); | ||||||
| 	pio_sm_exec_wait_blocking(PIO, LO_SM, pio_encode_set(pio_pins, 0)); | 	pio_sm_exec_wait_blocking(PIO, LO_SM, pio_encode_set(pio_pins, 0)); | ||||||
|  | @ -163,14 +168,14 @@ static void init_fb() | ||||||
| 	pio_program_t prog = { | 	pio_program_t prog = { | ||||||
| 		.instructions = insn, | 		.instructions = insn, | ||||||
| 		.length = sizeof(insn) / sizeof(*insn), | 		.length = sizeof(insn) / sizeof(*insn), | ||||||
| 		.origin = -1, | 		.origin = origin_fb, | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
| 	pio_sm_restart(PIO, FB_SM); | 	pio_sm_restart(PIO, FB_SM); | ||||||
| 	pio_sm_clear_fifos(PIO, FB_SM); | 	pio_sm_clear_fifos(PIO, FB_SM); | ||||||
| 
 | 
 | ||||||
| 	if (pio_can_add_program(PIO, &prog)) | 	if (pio_can_add_program(PIO, &prog)) | ||||||
| 		prog.origin = pio_add_program(PIO, &prog); | 		origin_fb = pio_add_program(PIO, &prog); | ||||||
| 
 | 
 | ||||||
| 	pio_sm_config pc = pio_get_default_sm_config(); | 	pio_sm_config pc = pio_get_default_sm_config(); | ||||||
| 	sm_config_set_sideset(&pc, 1, false, true); | 	sm_config_set_sideset(&pc, 1, false, true); | ||||||
|  | @ -178,9 +183,9 @@ static void init_fb() | ||||||
| 	sm_config_set_out_pins(&pc, FB_PIN, 1); | 	sm_config_set_out_pins(&pc, FB_PIN, 1); | ||||||
| 	sm_config_set_set_pins(&pc, FB_PIN, 1); | 	sm_config_set_set_pins(&pc, FB_PIN, 1); | ||||||
| 	sm_config_set_sideset_pins(&pc, FB_PIN); | 	sm_config_set_sideset_pins(&pc, FB_PIN); | ||||||
| 	sm_config_set_wrap(&pc, prog.origin, prog.origin + prog.length - 1); | 	sm_config_set_wrap(&pc, origin_fb, origin_fb + prog.length - 1); | ||||||
| 	sm_config_set_clkdiv_int_frac(&pc, 1, 0); | 	sm_config_set_clkdiv_int_frac(&pc, 1, 0); | ||||||
| 	pio_sm_init(PIO, FB_SM, prog.origin, &pc); | 	pio_sm_init(PIO, FB_SM, origin_fb, &pc); | ||||||
| 
 | 
 | ||||||
| 	pio_sm_set_consecutive_pindirs(PIO, FB_SM, FB_PIN, 1, GPIO_OUT); | 	pio_sm_set_consecutive_pindirs(PIO, FB_SM, FB_PIN, 1, GPIO_OUT); | ||||||
| } | } | ||||||
|  | @ -197,22 +202,22 @@ static void init_rx() | ||||||
| 	pio_program_t prog = { | 	pio_program_t prog = { | ||||||
| 		.instructions = insn, | 		.instructions = insn, | ||||||
| 		.length = sizeof(insn) / sizeof(*insn), | 		.length = sizeof(insn) / sizeof(*insn), | ||||||
| 		.origin = -1, | 		.origin = origin_rx, | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
| 	pio_sm_restart(PIO, RX_SM); | 	pio_sm_restart(PIO, RX_SM); | ||||||
| 	pio_sm_clear_fifos(PIO, RX_SM); | 	pio_sm_clear_fifos(PIO, RX_SM); | ||||||
| 
 | 
 | ||||||
| 	if (pio_can_add_program(PIO, &prog)) | 	if (pio_can_add_program(PIO, &prog)) | ||||||
| 		prog.origin = pio_add_program(PIO, &prog); | 		origin_rx = pio_add_program(PIO, &prog); | ||||||
| 
 | 
 | ||||||
| 	pio_sm_config pc = pio_get_default_sm_config(); | 	pio_sm_config pc = pio_get_default_sm_config(); | ||||||
| 	sm_config_set_in_pins(&pc, RX_PIN); | 	sm_config_set_in_pins(&pc, RX_PIN); | ||||||
| 	sm_config_set_wrap(&pc, prog.origin, prog.origin + prog.length - 1); | 	sm_config_set_wrap(&pc, origin_rx, origin_rx + prog.length - 1); | ||||||
| 	sm_config_set_clkdiv_int_frac(&pc, 1, 0); | 	sm_config_set_clkdiv_int_frac(&pc, 1, 0); | ||||||
| 	sm_config_set_fifo_join(&pc, PIO_FIFO_JOIN_RX); | 	sm_config_set_fifo_join(&pc, PIO_FIFO_JOIN_RX); | ||||||
| 	sm_config_set_in_shift(&pc, false, true, 32); | 	sm_config_set_in_shift(&pc, false, true, 32); | ||||||
| 	pio_sm_init(PIO, RX_SM, prog.origin, &pc); | 	pio_sm_init(PIO, RX_SM, origin_rx, &pc); | ||||||
| 
 | 
 | ||||||
| 	pio_sm_set_consecutive_pindirs(PIO, RX_SM, RX_PIN, 1, GPIO_IN); | 	pio_sm_set_consecutive_pindirs(PIO, RX_SM, RX_PIN, 1, GPIO_IN); | ||||||
| } | } | ||||||
|  | @ -253,7 +258,7 @@ static void init_ad() | ||||||
| 	pio_program_t prog = { | 	pio_program_t prog = { | ||||||
| 		.instructions = insn, | 		.instructions = insn, | ||||||
| 		.length = sizeof(insn) / sizeof(*insn), | 		.length = sizeof(insn) / sizeof(*insn), | ||||||
| 		.origin = 0, | 		.origin = origin_ad, | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
| 	pio_sm_restart(PIO, AD_SM); | 	pio_sm_restart(PIO, AD_SM); | ||||||
|  | @ -263,11 +268,11 @@ static void init_ad() | ||||||
| 		pio_add_program(PIO, &prog); | 		pio_add_program(PIO, &prog); | ||||||
| 
 | 
 | ||||||
| 	pio_sm_config pc = pio_get_default_sm_config(); | 	pio_sm_config pc = pio_get_default_sm_config(); | ||||||
| 	sm_config_set_wrap(&pc, prog.origin, prog.origin + 15); | 	sm_config_set_wrap(&pc, origin_ad, origin_ad + 15); | ||||||
| 	sm_config_set_clkdiv_int_frac(&pc, 1, 0); | 	sm_config_set_clkdiv_int_frac(&pc, 1, 0); | ||||||
| 	sm_config_set_in_shift(&pc, false, true, 32); | 	sm_config_set_in_shift(&pc, false, true, 32); | ||||||
| 	sm_config_set_out_shift(&pc, false, true, 32); | 	sm_config_set_out_shift(&pc, false, true, 32); | ||||||
| 	pio_sm_init(PIO, AD_SM, prog.origin, &pc); | 	pio_sm_init(PIO, AD_SM, origin_ad, &pc); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #define STEP_BASE ((UINT_MAX + 1.0) / CLK_SYS_HZ) | #define STEP_BASE ((UINT_MAX + 1.0) / CLK_SYS_HZ) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue