Skip to content

Commit cfc212b

Browse files
nickovsdpgeorge
authored andcommitted
rp2/rp2_dma: Introduce a new rp2.DMA class for control over DMA xfers.
This commit implements fairly complete support for the DMA controller in the rp2 series of microcontrollers. It provides a class for accessing the DMA channels through a high-level, Pythonic interface, and functions for setting and manipulating the DMA channel configurations. Creating an instance of the rp2.DMA class claims one of the processor's DMA channels. A sensible, per-channel default value for the ctrl register can be fetched from the DMA.pack_ctrl() function, and the components of this register can be set via keyword arguments to pack_ctrl(). The read, write, count and ctrl attributes of the DMA class provide read/write access to the respective registers of the DMA controller. The config() method allows any or all of these values to be set simultaneously and adds a trigger keyword argument to allow the setup to immediately be triggered. The read and write attributes (or keywords in config()) accept either actual addresses or any object that supports the buffer interface. The active() method provides read/write control of the channel's activity, allowing the user to start and stop the channel and test if it is running. Standard MicroPython interrupt handlers are supported through the irq() method and the channel can be released either by deleting it and allowing it to be garbage-collected or with the explicit close() method. Direct, unfettered access to the DMA controllers registers is provided through a proxy memoryview() object returned by the DMA.registers attribute that maps directly onto the memory-mapped registers. This is necessary for more fine-grained control and is helpful for allowing chaining of DMA channels. As a simple example, using DMA to do a fast memory copy just needs: src = bytearray(32*1024) dest = bytearray(32*1024) dma = rp2.DMA() dma.config(read=src, write=dest, count=len(src) // 4, ctrl=dma.pack_ctrl(), trigger=True) # Wait for completion while dma.active(): pass This API aims to strike a balance between simplicity and comprehensiveness. Signed-off-by: Nicko van Someren <[email protected]> Signed-off-by: Damien George <[email protected]>
1 parent e4d3ab3 commit cfc212b

File tree

5 files changed

+478
-0
lines changed

5 files changed

+478
-0
lines changed

ports/rp2/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ set(MICROPY_SOURCE_PORT
132132
pendsv.c
133133
rp2_flash.c
134134
rp2_pio.c
135+
rp2_dma.c
135136
uart.c
136137
usbd.c
137138
msc_disk.c
@@ -156,6 +157,7 @@ set(MICROPY_SOURCE_QSTR
156157
${MICROPY_PORT_DIR}/modos.c
157158
${MICROPY_PORT_DIR}/rp2_flash.c
158159
${MICROPY_PORT_DIR}/rp2_pio.c
160+
${MICROPY_PORT_DIR}/rp2_dma.c
159161
${CMAKE_BINARY_DIR}/pins_${MICROPY_BOARD}.c
160162
)
161163

ports/rp2/main.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ int main(int argc, char **argv) {
159159
readline_init0();
160160
machine_pin_init();
161161
rp2_pio_init();
162+
rp2_dma_init();
162163
machine_i2s_init0();
163164

164165
#if MICROPY_PY_BLUETOOTH
@@ -207,6 +208,7 @@ int main(int argc, char **argv) {
207208
#if MICROPY_PY_NETWORK
208209
mod_network_deinit();
209210
#endif
211+
rp2_dma_deinit();
210212
rp2_pio_deinit();
211213
#if MICROPY_PY_BLUETOOTH
212214
mp_bluetooth_deinit();

ports/rp2/modrp2.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ STATIC const mp_rom_map_elem_t rp2_module_globals_table[] = {
8888
{ MP_ROM_QSTR(MP_QSTR_Flash), MP_ROM_PTR(&rp2_flash_type) },
8989
{ MP_ROM_QSTR(MP_QSTR_PIO), MP_ROM_PTR(&rp2_pio_type) },
9090
{ MP_ROM_QSTR(MP_QSTR_StateMachine), MP_ROM_PTR(&rp2_state_machine_type) },
91+
{ MP_ROM_QSTR(MP_QSTR_DMA), MP_ROM_PTR(&rp2_dma_type) },
9192
{ MP_ROM_QSTR(MP_QSTR_bootsel_button), MP_ROM_PTR(&rp2_bootsel_button_obj) },
9293

9394
#if MICROPY_PY_NETWORK_CYW43

ports/rp2/modrp2.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,12 @@
3131
extern const mp_obj_type_t rp2_flash_type;
3232
extern const mp_obj_type_t rp2_pio_type;
3333
extern const mp_obj_type_t rp2_state_machine_type;
34+
extern const mp_obj_type_t rp2_dma_type;
3435

3536
void rp2_pio_init(void);
3637
void rp2_pio_deinit(void);
3738

39+
void rp2_dma_init(void);
40+
void rp2_dma_deinit(void);
41+
3842
#endif // MICROPY_INCLUDED_RP2_MODRP2_H

0 commit comments

Comments
 (0)