andrewm@0
|
1 /*
|
andrewm@0
|
2 * PRU.h
|
andrewm@0
|
3 *
|
andrewm@0
|
4 * Created on: May 27, 2014
|
andrewm@0
|
5 * Author: andrewm
|
andrewm@0
|
6 */
|
andrewm@0
|
7
|
andrewm@0
|
8 #ifndef PRU_H_
|
andrewm@0
|
9 #define PRU_H_
|
andrewm@0
|
10
|
andrewm@0
|
11 #include <stdint.h>
|
giuliomoro@41
|
12 #include "../include/RTAudio.h" // to schedule lower prio parallel process
|
giuliomoro@41
|
13 #include "../include/intervals.h"
|
andrewm@0
|
14 class PRU
|
andrewm@0
|
15 {
|
andrewm@0
|
16 private:
|
andrewm@0
|
17 static const unsigned int kPruGPIODACSyncPin;
|
andrewm@0
|
18 static const unsigned int kPruGPIOADCSyncPin;
|
andrewm@0
|
19 static const unsigned int kPruGPIOTestPin;
|
andrewm@0
|
20 static const unsigned int kPruGPIOTestPin2;
|
andrewm@0
|
21 static const unsigned int kPruGPIOTestPin3;
|
andrewm@0
|
22
|
andrewm@0
|
23 public:
|
andrewm@0
|
24 // Constructor
|
andrewm@0
|
25 PRU();
|
andrewm@0
|
26
|
andrewm@0
|
27 // Destructor
|
andrewm@0
|
28 ~PRU();
|
andrewm@0
|
29
|
andrewm@0
|
30 // Prepare the GPIO pins needed for the PRU
|
giuliomoro@19
|
31 int prepareGPIO(int use_spi, int use_digital, int include_test_pin, int include_led);
|
andrewm@0
|
32
|
andrewm@0
|
33 // Clean up the GPIO at the end
|
andrewm@0
|
34 void cleanupGPIO();
|
andrewm@0
|
35
|
andrewm@0
|
36 // Initialise and open the PRU
|
andrewm@12
|
37 int initialise(int pru_num, int frames_per_buffer, int spi_channels,
|
andrewm@12
|
38 bool xenomai_test_pin = false);
|
andrewm@0
|
39
|
andrewm@15
|
40 // Run the code image in pru_rtaudio_bin.h
|
giuliomoro@16
|
41 int start(char * const filename);
|
andrewm@0
|
42
|
andrewm@0
|
43 // Loop: read and write data from the PRU
|
andrewm@0
|
44 void loop();
|
andrewm@0
|
45
|
andrewm@0
|
46 // Wait for an interrupt from the PRU indicate it is finished
|
andrewm@0
|
47 void waitForFinish();
|
andrewm@0
|
48
|
andrewm@0
|
49 // Turn off the PRU when done
|
andrewm@0
|
50 void disable();
|
andrewm@0
|
51
|
andrewm@0
|
52 // For debugging:
|
andrewm@0
|
53 void setGPIOTestPin();
|
andrewm@0
|
54 void clearGPIOTestPin();
|
giuliomoro@41
|
55 Interval renderTimer;
|
giuliomoro@41
|
56 Interval sleepTimer;
|
giuliomoro@41
|
57 AuxiliaryTask printIntervalsTask;
|
andrewm@0
|
58
|
andrewm@0
|
59 private:
|
andrewm@0
|
60 int pru_number; // Which PRU we use
|
andrewm@0
|
61 bool running; // Whether the PRU is running
|
andrewm@0
|
62 bool spi_enabled; // Whether SPI ADC and DAC are used
|
giuliomoro@19
|
63 bool digital_enabled; // Whether digital is used
|
andrewm@0
|
64 bool gpio_enabled; // Whether GPIO has been prepared
|
andrewm@0
|
65 bool led_enabled; // Whether a user LED is enabled
|
andrewm@0
|
66 bool gpio_test_pin_enabled; // Whether the test pin was also enabled
|
andrewm@12
|
67 int spi_num_channels; // How many channels to use for SPI ADC/DAC
|
andrewm@0
|
68
|
andrewm@0
|
69 volatile uint32_t *pru_buffer_comm;
|
andrewm@0
|
70 uint16_t *pru_buffer_spi_dac;
|
andrewm@0
|
71 uint16_t *pru_buffer_spi_adc;
|
giuliomoro@19
|
72 uint32_t *pru_buffer_digital;
|
andrewm@0
|
73 int16_t *pru_buffer_audio_dac;
|
andrewm@0
|
74 int16_t *pru_buffer_audio_adc;
|
andrewm@0
|
75 unsigned int spi_buffer_frames;
|
giuliomoro@19
|
76 unsigned int digital_buffer_frames;
|
andrewm@0
|
77 unsigned int audio_buffer_frames;
|
andrewm@0
|
78
|
andrewm@0
|
79 int xenomai_gpio_fd; // File descriptor for /dev/mem for fast GPIO
|
andrewm@0
|
80 uint32_t *xenomai_gpio; // Pointer to GPIO registers
|
giuliomoro@41
|
81
|
andrewm@0
|
82 };
|
andrewm@0
|
83
|
andrewm@0
|
84
|
andrewm@0
|
85 #endif /* PRU_H_ */
|