annotate modulator.c @ 3:b10097c3383d

DMA test data repeatedly into PIO FIFO
author Daniel O'Connor <darius@dons.net.au>
date Mon, 29 Mar 2021 18:05:05 +1030
parents 0d653f60dec8
children 2db42eaba3c8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
1 /******************************************************************
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
2 *******************************************************************
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
3 **
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
4 ** This is proprietary unpublished source code, property
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
5 ** of Genesis Software. Use or disclosure without prior
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
6 ** agreement is expressly prohibited.
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
7 **
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
8 ** Copyright (c) 2021 Genesis Software, all rights reserved.
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
9 **
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
10 *******************************************************************
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
11 ******************************************************************/
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
12
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
13 /*
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
14 ** MODULATOR.C
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
15 **
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
16 ** Create modulation shape
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
17 **
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
18 */
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
19
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
20 #include "pico/stdlib.h"
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
21 #include "hardware/clocks.h"
3
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
22 #include "hardware/dma.h"
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
23 #include "hardware/irq.h"
0
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
24 #include "hardware/pio.h"
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
25
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
26 #include "dac.pio.h"
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
27
2
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
28 #if 0
0
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
29 extern void* shaped_trap_dat_size;
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
30 extern void* shaped_trap_dat_start;
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
31
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
32 extern void* sgauss_dat_size;
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
33 extern void* sgauss_dat_start;
2
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
34 #endif
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
35
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
36 uint8_t shaped_trap_dat_start[] = { 0, 1, 2, 4, 8, 16, 32, 64, 128, 0, 0, 0, 0, 0, 0, 0 };
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
37 //uint8_t shaped_trap_dat_start[] = { 0, 1, 2, 3, 1, 2, 0, 3, 1, 1, 2, 3, 0, 1, 2, 3 };
3
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
38 #define SHAPED_TRAP_DAT_BITS 4
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
39 _Static_assert((1 << SHAPED_TRAP_DAT_BITS) == sizeof(shaped_trap_dat_start));
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
40
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
41 static int dma_chan;
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
42
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
43 void
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
44 dma_handler(void) {
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
45 // Clear the interrupt request.
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
46 dma_hw->ints0 = 1u << dma_chan;
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
47 // Give the channel a new wave table entry to read from, and re-trigger it
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
48 dma_channel_set_read_addr(dma_chan, shaped_trap_dat_start, true);
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
49 }
0
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
50
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
51 int
3
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
52 main(void) {
0
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
53 int i;
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
54 const uint LED_PIN = PICO_DEFAULT_LED_PIN;
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
55
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
56 stdio_init_all();
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
57
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
58 gpio_init(LED_PIN);
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
59 gpio_set_dir(LED_PIN, GPIO_OUT);
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
60
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
61 // Load the clocked_input program, and configure a free state machine
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
62 // to run the program.
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
63 PIO pio = pio0;
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
64 uint offset = pio_add_program(pio, &dac_program);
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
65 uint sm = pio_claim_unused_sm(pio, true);
2
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
66 // XXX: I would prefer starting at GPIO16 but in that case the top 2
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
67 // bits don't seem to work
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
68 dac_program_init(pio, sm, offset, 14);
0
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
69
3
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
70 // Configure a channel to write the same word (32 bits) repeatedly to PIO0
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
71 // SM0's TX FIFO, paced by the data request signal from that peripheral.
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
72 dma_chan = dma_claim_unused_channel(true);
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
73 dma_channel_config dmac = dma_channel_get_default_config(dma_chan);
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
74 channel_config_set_transfer_data_size(&dmac, DMA_SIZE_32);
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
75 channel_config_set_read_increment(&dmac, true);
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
76 channel_config_set_ring(&dmac, false, SHAPED_TRAP_DAT_BITS);
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
77 channel_config_set_dreq(&dmac, DREQ_PIO0_TX0);
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
78
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
79 dma_channel_configure(
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
80 dma_chan,
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
81 &dmac,
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
82 &pio0_hw->txf[0], // Write address (only need to set this once)
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
83 NULL, // Don't provide a read address yet
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
84 100, // Write this many times then interrupt
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
85 false // Don't start yet
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
86 );
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
87
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
88 // Tell the DMA to raise IRQ line 0 when the channel finishes a block
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
89 dma_channel_set_irq0_enabled(dma_chan, true);
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
90
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
91 // Configure the processor to run dma_handler() when DMA IRQ 0 is asserted
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
92 irq_set_exclusive_handler(DMA_IRQ_0, dma_handler);
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
93 irq_set_enabled(DMA_IRQ_0, true);
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
94
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
95 // Manually call the handler once, to trigger the first transfer
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
96 dma_handler();
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
97
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
98 // Everything else from this point is interrupt-driven. The processor has
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
99 // time to sit and think about its early retirement -- maybe open a bakery?
0
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
100 while (true) {
3
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
101 #if 0
2
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
102 for (int i = 0; i < sizeof(shaped_trap_dat_start) / 4; i++) {
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
103 pio_sm_put_blocking(pio, sm, ((uint32_t *)shaped_trap_dat_start)[i]);
0
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
104 }
3
b10097c3383d DMA test data repeatedly into PIO FIFO
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
105 #endif
2
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
106 #if 0
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
107 gpio_put(LED_PIN, 1);
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
108 sleep_ms(100);
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
109 gpio_put(LED_PIN, 0);
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
110 #endif
0
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
111 }
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
112 }