@@ -22,7 +22,7 @@ namespace pimoroni {
2222
2323 class ST7789 : public DisplayDriver {
2424 spi_inst_t *spi = PIMORONI_SPI_DEFAULT_INSTANCE;
25-
25+
2626 public:
2727 bool round;
2828
@@ -41,8 +41,14 @@ namespace pimoroni {
4141 uint vsync = PIN_UNUSED; // only available on some products
4242 uint parallel_sm;
4343 PIO parallel_pio;
44- uint parallel_offset;
44+ int parallel_offset;
4545 uint st_dma;
46+
47+ // Pixel double
48+ uint parallel_pd_sm;
49+ int parallel_pd_offset;
50+ uint pd_st_dma;
51+
4652 bool display_on = false ;
4753 bool display_sleep = false ;
4854
@@ -67,8 +73,18 @@ namespace pimoroni {
6773
6874 parallel_pio = pio1;
6975 pio_set_gpio_base (parallel_pio, d0 + 8 >= 32 ? 16 : 0 );
76+
7077 parallel_sm = pio_claim_unused_sm (parallel_pio, true );
7178 parallel_offset = pio_add_program (parallel_pio, &st7789_parallel_program);
79+ if (parallel_offset == -1 ) {
80+ panic (" Could not add parallel PIO program." );
81+ }
82+
83+ parallel_pd_sm = pio_claim_unused_sm (parallel_pio, true );
84+ parallel_pd_offset = pio_add_program (parallel_pio, &st7789_parallel_pd_program);
85+ if (parallel_offset == -1 ) {
86+ panic (" Could not add parallel pixel-doubling PIO program." );
87+ }
7288
7389 // gpio_init(wr_sck);
7490 // gpio_set_dir(wr_sck, GPIO_OUT);
@@ -88,19 +104,33 @@ namespace pimoroni {
88104 pio_sm_set_consecutive_pindirs (parallel_pio, parallel_sm, d0, 8 , true );
89105 pio_sm_set_consecutive_pindirs (parallel_pio, parallel_sm, wr_sck, 1 , true );
90106
91- pio_sm_config c = st7789_parallel_program_get_default_config (parallel_offset);
107+ // Is this needed?
108+ pio_sm_set_consecutive_pindirs (parallel_pio, parallel_pd_sm, d0, 8 , true );
109+ pio_sm_set_consecutive_pindirs (parallel_pio, parallel_pd_sm, wr_sck, 1 , true );
110+
111+ pio_sm_config pd_c = st7789_parallel_pd_program_get_default_config (parallel_pd_offset);
112+ sm_config_set_out_pins (&pd_c, d0, 8 );
113+ sm_config_set_sideset_pins (&pd_c, wr_sck);
114+ sm_config_set_fifo_join (&pd_c, PIO_FIFO_JOIN_TX);
115+ sm_config_set_out_shift (&pd_c, false , false , 16 );
92116
117+ pio_sm_config c = st7789_parallel_program_get_default_config (parallel_offset);
93118 sm_config_set_out_pins (&c, d0, 8 );
94119 sm_config_set_sideset_pins (&c, wr_sck);
95120 sm_config_set_fifo_join (&c, PIO_FIFO_JOIN_TX);
96121 sm_config_set_out_shift (&c, false , true , 8 );
97-
122+
98123 // Determine clock divider
99124 constexpr uint32_t max_pio_clk = 32 * MHZ;
100125 const uint32_t sys_clk_hz = clock_get_hz (clk_sys);
101126 const uint32_t clk_div = (sys_clk_hz + max_pio_clk - 1 ) / max_pio_clk;
127+
128+ sm_config_set_clkdiv (&pd_c, clk_div);
102129 sm_config_set_clkdiv (&c, clk_div);
103-
130+
131+ pio_sm_init (parallel_pio, parallel_pd_sm, parallel_pd_offset, &pd_c);
132+ pio_sm_set_enabled (parallel_pio, parallel_pd_sm, true );
133+
104134 pio_sm_init (parallel_pio, parallel_sm, parallel_offset, &c);
105135 pio_sm_set_enabled (parallel_pio, parallel_sm, true );
106136
@@ -111,7 +141,14 @@ namespace pimoroni {
111141 channel_config_set_bswap (&config, false );
112142 channel_config_set_dreq (&config, pio_get_dreq (parallel_pio, parallel_sm, true ));
113143 dma_channel_configure (st_dma, &config, ¶llel_pio->txf [parallel_sm], NULL , 0 , false );
114-
144+
145+ pd_st_dma = dma_claim_unused_channel (true );
146+ dma_channel_config pd_config = dma_channel_get_default_config (pd_st_dma);
147+ channel_config_set_transfer_data_size (&pd_config, DMA_SIZE_16);
148+ channel_config_set_bswap (&pd_config, true );
149+ channel_config_set_dreq (&pd_config, pio_get_dreq (parallel_pio, parallel_pd_sm, true ));
150+ dma_channel_configure (pd_st_dma, &pd_config, ¶llel_pio->txf [parallel_pd_sm], NULL , 0 , false );
151+
115152 gpio_put (rd_sck, 1 );
116153
117154 common_init ();
@@ -135,7 +172,7 @@ namespace pimoroni {
135172 channel_config_set_bswap (&config, false );
136173 channel_config_set_dreq (&config, spi_get_dreq (spi, true ));
137174 dma_channel_configure (st_dma, &config, &spi_get_hw (spi)->dr , NULL , 0 , false );
138-
175+
139176 common_init ();
140177 }
141178
@@ -148,6 +185,7 @@ namespace pimoroni {
148185 void configure_display (Rotation rotate);
149186 void write_blocking_dma (const uint8_t *src, size_t len);
150187 void write_blocking_parallel (const uint8_t *src, size_t len);
188+ void write_blocking_parallel_pixel_doubled (const uint8_t *src, size_t len);
151189 void command (uint8_t command, size_t len = 0 , const char *data = NULL );
152190 };
153191
0 commit comments