|
1 | 1 | from .st7789 import ST7789 |
2 | 2 | from machine import Pin |
3 | 3 | import rp2 |
| 4 | +# import time |
4 | 5 |
|
5 | 6 | # Derived from: |
6 | 7 | # https://github.com/raspberrypi/pico-examples/tree/master/pio/st7789_lcd |
@@ -67,11 +68,24 @@ def __init__( |
67 | 68 | # so we need to save them again to restore later when _write() is called |
68 | 69 | self.txMode, self.txAlt = self.savePinModeAlt(self.tx) |
69 | 70 | self.clkMode, self.clkAlt = self.savePinModeAlt(self.clk) |
70 | | - |
| 71 | + |
71 | 72 | # Now restore the original mode and alt of the pins |
72 | 73 | self.tx.init(mode=txMode, alt=txAlt) |
73 | 74 | self.clk.init(mode=clkMode, alt=clkAlt) |
74 | | - |
| 75 | + |
| 76 | + # Set up DMA to transfer to the PIO state machine |
| 77 | + self.dma = rp2.DMA() |
| 78 | + req_num = ((self.sm_id // 4) << 3) + (self.sm_id % 4) |
| 79 | + dma_ctrl = self.dma.pack_ctrl( |
| 80 | + size = 0, # 0 = 8-bit, 1 = 16-bit, 2 = 32-bit |
| 81 | + inc_write = False, |
| 82 | + treq_sel = req_num |
| 83 | + ) |
| 84 | + self.dma.config( |
| 85 | + write = self.sm, |
| 86 | + ctrl = dma_ctrl |
| 87 | + ) |
| 88 | + |
75 | 89 | # Call the parent class constructor |
76 | 90 | super().__init__(width, height, rotation, color_order, reverse_bytes_in_word) |
77 | 91 |
|
@@ -109,9 +123,16 @@ def _pio_write(self, data): |
109 | 123 | """Write data to the display using PIO.""" |
110 | 124 | # Start the state machine |
111 | 125 | self.sm.active(1) |
112 | | - |
113 | | - # Write data to the state machine |
114 | | - self.sm.put(data, 24) |
| 126 | + |
| 127 | + # Configure DMA to read from the buffer and write to the state machine |
| 128 | + self.dma.read = data |
| 129 | + count = len(data) if isinstance(data, (bytes, bytearray)) else data.size |
| 130 | + self.dma.count = count |
| 131 | + |
| 132 | + # Start the DMA transfer and wait for it to finish |
| 133 | + self.dma.active(True) |
| 134 | + while self.dma.active(): |
| 135 | + pass |
115 | 136 |
|
116 | 137 | # Stop the state machine |
117 | 138 | self.sm.active(0) |
|
0 commit comments