Bela
Real-time, ultra-low-latency audio and sensor processing system for BeagleBone Black
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups
PruArmCommon.h
1 #ifndef PRU_ARM_COMMON_H
2 #define PRU_ARM_COMMON_H
3 
4 // this file is included by both core/Pru.cpp and pru/pru_rtaudio*.p
5 #define BOARD_FLAGS_BELA_MINI 0
6 #define BOARD_FLAGS_CTAG_FACE 1
7 #define BOARD_FLAGS_CTAG_BEAST 2
8 #define BOARD_FLAGS_BELA_GENERIC_TDM 3
9 
10 #define PRU_SYSTEM_EVENT_RTDM 20
11 #define PRU_SYS_EV_MCASP_RX_INTR 54 // mcasp_r_intr_pend
12 #define PRU_SYS_EV_MCASP_TX_INTR 55 // mcasp_x_intr_pend
13 
14 // error codes sent from the PRU
15 #define ARM_ERROR_TIMEOUT 1
16 #define ARM_ERROR_XUNDRUN 2
17 #define ARM_ERROR_XSYNCERR 3
18 #define ARM_ERROR_XCKFAIL 4
19 #define ARM_ERROR_XDMAERR 5
20 #define ARM_ERROR_INVALID_INIT 6
21 
22 // Offsets within CPU <-> PRU communication memory (4 byte slots)
23 #define COMM_SHOULD_STOP 0 // Set to be nonzero when loop should stop
24 #define COMM_CURRENT_BUFFER 4 // Which buffer we are on
25 #define COMM_BUFFER_MCASP_FRAMES 8 // How many frames per buffer for audio
26 #define COMM_SHOULD_SYNC 12 // Whether to synchronise to an external clock
27 #define COMM_SYNC_ADDRESS 16 // Which memory address to find the GPIO on
28 #define COMM_SYNC_PIN_MASK 20 // Which pin to read for the sync
29 #define COMM_LED_ADDRESS 24 // Which memory address to find the status LED on
30 #define COMM_LED_PIN_MASK 28 // Which pin to write to change LED
31 #define COMM_FRAME_COUNT 32 // How many frames have elapse since beginning
32 #define COMM_USE_SPI 36 // Whether or not to use SPI ADC and DAC
33 #define COMM_SPI_NUM_CHANNELS 40 // Low 2 bits indicate 8 [0x3], 4 [0x1] or 2 [0x0] channels
34 #define COMM_USE_DIGITAL 44 // Whether or not to use DIGITAL
35 #define COMM_PRU_NUMBER 48 // Which PRU this code is running on
36 #define COMM_MUX_CONFIG 52 // Whether to use the mux capelet, and how many channels
37 #define COMM_MUX_END_CHANNEL 56 // Which mux channel the last buffer ended on
38 #define COMM_BUFFER_SPI_FRAMES 60 // How many frames per buffer for analog i/o
39 #define COMM_BOARD_FLAGS 64 // Flags for the board we are on (BOARD_FLAGS_... are defined in include/PruArmCommon.h)
40 #define COMM_ERROR_OCCURRED 68 // Signals the ARM CPU that an error happened
41 #define COMM_ACTIVE_CHANNELS 72 // How many TDM slots contain useful data
42 // the order of the following registers has to strictly follow the order of the
43 // members of McaspRegisters
44 #define COMM_MCASP_START 76
45 #define COMM_MCASP_CONF_PDIR (COMM_MCASP_START+0)
46 #define COMM_MCASP_CONF_RMASK (COMM_MCASP_START+4)
47 #define COMM_MCASP_CONF_RFMT (COMM_MCASP_START+8)
48 #define COMM_MCASP_CONF_AFSRCTL (COMM_MCASP_START+12)
49 #define COMM_MCASP_CONF_ACLKRCTL (COMM_MCASP_START+16)
50 #define COMM_MCASP_CONF_AHCLKRCTL (COMM_MCASP_START+20)
51 #define COMM_MCASP_CONF_RTDM (COMM_MCASP_START+24)
52 #define COMM_MCASP_CONF_XMASK (COMM_MCASP_START+28)
53 #define COMM_MCASP_CONF_XFMT (COMM_MCASP_START+32)
54 #define COMM_MCASP_CONF_AFSXCTL (COMM_MCASP_START+36)
55 #define COMM_MCASP_CONF_ACLKXCTL (COMM_MCASP_START+40)
56 #define COMM_MCASP_CONF_AHCLKXCTL (COMM_MCASP_START+44)
57 #define COMM_MCASP_CONF_XTDM (COMM_MCASP_START+48)
58 #define COMM_MCASP_CONF_SRCTLN (COMM_MCASP_START+52) // 4 bytes, one for each of SRCTL[0]...SRCTL[3]
59 #define COMM_MCASP_CONF_WFIFOCTL (COMM_MCASP_START+56)
60 #define COMM_MCASP_CONF_RFIFOCTL (COMM_MCASP_START+60)
61 #define COMM_MCASP_OUT_CHANNELS (COMM_MCASP_START+64)
62 #define COMM_MCASP_OUT_SERIALIZERS_DISABLED_SUBSLOTS (COMM_MCASP_START+68) // 4 bytes, bitmask for 32 subslots: when it's high, send dummy data for this subslot
63 
64 // ARM accesses these memory locations as uint32_t
65 // to avoid duplication and mistakes, we use macros to generate the values for ARM
66 // pasm is stupid and doesn't know about __TIME__, so this gives us a clue that
67 // we are using clang/gcc and we can use some more advanced preprocessor
68 // directives in here to generate some C code
69 #ifdef __TIME__
70 #define ENUM(NAME) PRU_ ## NAME = (NAME/4),
71 typedef enum {
72 ENUM(COMM_SHOULD_STOP)
73 ENUM(COMM_CURRENT_BUFFER)
74 ENUM(COMM_BUFFER_MCASP_FRAMES)
75 ENUM(COMM_SHOULD_SYNC)
76 ENUM(COMM_SYNC_ADDRESS)
77 ENUM(COMM_SYNC_PIN_MASK)
78 ENUM(COMM_LED_ADDRESS)
79 ENUM(COMM_LED_PIN_MASK)
80 ENUM(COMM_FRAME_COUNT)
81 ENUM(COMM_USE_SPI)
82 ENUM(COMM_SPI_NUM_CHANNELS)
83 ENUM(COMM_USE_DIGITAL)
84 ENUM(COMM_PRU_NUMBER)
85 ENUM(COMM_MUX_CONFIG)
86 ENUM(COMM_MUX_END_CHANNEL)
87 ENUM(COMM_BUFFER_SPI_FRAMES)
88 ENUM(COMM_BOARD_FLAGS)
89 ENUM(COMM_ERROR_OCCURRED)
90 ENUM(COMM_ACTIVE_CHANNELS)
91 ENUM(COMM_MCASP_CONF_PDIR)
92 } PruCommonFlags;
93 #endif // __TIME__
94 
95 #endif /* PRU_ARM_COMMON_H */