Bela
Real-time, ultra-low-latency audio and sensor processing system for BeagleBone Black
Loading...
Searching...
No Matches
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),
71typedef enum {
72ENUM(COMM_SHOULD_STOP)
73ENUM(COMM_CURRENT_BUFFER)
74ENUM(COMM_BUFFER_MCASP_FRAMES)
75ENUM(COMM_SHOULD_SYNC)
76ENUM(COMM_SYNC_ADDRESS)
77ENUM(COMM_SYNC_PIN_MASK)
78ENUM(COMM_LED_ADDRESS)
79ENUM(COMM_LED_PIN_MASK)
80ENUM(COMM_FRAME_COUNT)
81ENUM(COMM_USE_SPI)
82ENUM(COMM_SPI_NUM_CHANNELS)
83ENUM(COMM_USE_DIGITAL)
84ENUM(COMM_PRU_NUMBER)
85ENUM(COMM_MUX_CONFIG)
86ENUM(COMM_MUX_END_CHANNEL)
87ENUM(COMM_BUFFER_SPI_FRAMES)
88ENUM(COMM_BOARD_FLAGS)
89ENUM(COMM_ERROR_OCCURRED)
90ENUM(COMM_ACTIVE_CHANNELS)
91ENUM(COMM_MCASP_CONF_PDIR)
92} PruCommonFlags;
93#endif // __TIME__
94
95#endif /* PRU_ARM_COMMON_H */