|
4 | 4 | namespace plasma {
|
5 | 5 |
|
6 | 6 | APA102::APA102(uint num_leds, PIO pio, uint sm, uint pin_dat, uint pin_clk, uint freq, RGB* buffer) : buffer(buffer), num_leds(num_leds), pio(pio), sm(sm) {
|
| 7 | + // NOTE: This sets the gpio_base for *the entire PIO* not just this state machine |
| 8 | + uint range_max = std::max(pin_dat, pin_clk); |
| 9 | + uint range_min = std::min(pin_dat, pin_clk); |
| 10 | + |
| 11 | + // Both pins in 16-48 range |
| 12 | + if(range_max >= 32 && range_min >= 16) { |
| 13 | + pio_set_gpio_base(pio, 16); |
| 14 | + // Both pins in 0-31 range |
| 15 | + } else if(range_max <= 31) { |
| 16 | + pio_set_gpio_base(pio, 0); |
| 17 | + // Pins in different ranges: invalid combo! |
| 18 | + } else { |
| 19 | + // TODO: Need some means to notify the caller |
| 20 | + pio_set_gpio_base(pio, 0); |
| 21 | + } |
| 22 | + |
7 | 23 | pio_program_offset = pio_add_program(pio, &apa102_program);
|
8 | 24 |
|
9 |
| - pio_sm_set_pins_with_mask(pio, sm, 0, (1u << pin_clk) | (1u << pin_dat)); |
10 |
| - pio_sm_set_pindirs_with_mask(pio, sm, ~0u, (1u << pin_clk) | (1u << pin_dat)); |
| 25 | + pio_sm_set_pins_with_mask(pio, sm, 0, (1u << (pin_clk - pio_get_gpio_base(pio))) | (1u << (pin_dat - pio_get_gpio_base(pio)))); |
| 26 | + pio_sm_set_pindirs_with_mask(pio, sm, ~0u, (1u << (pin_clk - pio_get_gpio_base(pio))) | (1u << (pin_dat - pio_get_gpio_base(pio)))); |
11 | 27 | pio_gpio_init(pio, pin_clk);
|
12 | 28 | pio_gpio_init(pio, pin_dat);
|
13 | 29 |
|
|
0 commit comments