comparison pru_rtaudio.p @ 346:c6a15a8dee02 prerelease

Remapped analog output channels to match 01234567 order on cape. Note: this will change the behaviour of all these existing examples using analog out, notably d-box and cape_test.
author andrewm
date Tue, 07 Jun 2016 18:37:11 +0100
parents bfe2e929304b
children
comparison
equal deleted inserted replaced
345:0e1e0dfe24c5 346:c6a15a8dee02
83 #define COMM_USE_SPI 36 // Whether or not to use SPI ADC and DAC 83 #define COMM_USE_SPI 36 // Whether or not to use SPI ADC and DAC
84 #define COMM_NUM_CHANNELS 40 // Low 2 bits indicate 8 [0x3], 4 [0x1] or 2 [0x0] channels 84 #define COMM_NUM_CHANNELS 40 // Low 2 bits indicate 8 [0x3], 4 [0x1] or 2 [0x0] channels
85 #define COMM_USE_DIGITAL 44 // Whether or not to use DIGITAL 85 #define COMM_USE_DIGITAL 44 // Whether or not to use DIGITAL
86 #define COMM_PRU_NUMBER 48 // Which PRU this code is running on 86 #define COMM_PRU_NUMBER 48 // Which PRU this code is running on
87 #define COMM_MUX_CONFIG 52 // Whether to use the mux capelet, and how many channels 87 #define COMM_MUX_CONFIG 52 // Whether to use the mux capelet, and how many channels
88 88 #define COMM_MUX_END_CHANNEL 56 // Which mux channel the last buffer ended on
89
89 // General constants for McASP peripherals (used for audio codec) 90 // General constants for McASP peripherals (used for audio codec)
90 #define MCASP0_BASE 0x48038000 91 #define MCASP0_BASE 0x48038000
91 #define MCASP1_BASE 0x4803C000 92 #define MCASP1_BASE 0x4803C000
92 93
93 #define MCASP_PWRIDLESYSCONFIG 0x04 94 #define MCASP_PWRIDLESYSCONFIG 0x04
189 #define FLAG_BIT_USE_DIGITAL 3 190 #define FLAG_BIT_USE_DIGITAL 3
190 191
191 #define FLAG_BIT_MUX_CONFIG0 8 // Mux capelet configuration: 192 #define FLAG_BIT_MUX_CONFIG0 8 // Mux capelet configuration:
192 #define FLAG_BIT_MUX_CONFIG1 9 // 00 = off, 01 = 2 ch., 10 = 4 ch., 11 = 8 ch. 193 #define FLAG_BIT_MUX_CONFIG1 9 // 00 = off, 01 = 2 ch., 10 = 4 ch., 11 = 8 ch.
193 #define FLAG_MASK_MUX_CONFIG 0x0300 194 #define FLAG_MASK_MUX_CONFIG 0x0300
194 195
195 #define FLAG_BIT_MUX_STATE0 10 // Current state of the mux channels
196 #define FLAG_BIT_MUX_STATE1 11
197 #define FLAG_BIT_MUX_STATE2 12
198 #define FLAG_MASK_MUX_STATE 0x1C00
199
200 // Registers used throughout 196 // Registers used throughout
201 197
202 // r1, r2, r3 are used for temporary storage 198 // r1, r2, r3 are used for temporary storage
203 #define MEM_DIGITAL_BASE 0x11000 //Base address for DIGITAL : Shared RAM + 0x400 199 #define MEM_DIGITAL_BASE 0x11000 //Base address for DIGITAL : Shared RAM + 0x400
204 #define MEM_DIGITAL_BUFFER1_OFFSET 0x400 //Start pointer to DIGITAL_BUFFER1, which is 256 words after. 200 #define MEM_DIGITAL_BUFFER1_OFFSET 0x400 //Start pointer to DIGITAL_BUFFER1, which is 256 words after.
443 DAC_WAIT_FOR_FINISH 439 DAC_WAIT_FOR_FINISH
444 DAC_CS_UNASSERT 440 DAC_CS_UNASSERT
445 DAC_DISCARD_RX 441 DAC_DISCARD_RX
446 .endm 442 .endm
447 443
444 // Transform channel order on DAC
445 // (in) 01234567 --> (out) 64201357
446 // This is to make the pin order on the Bela cape
447 // make sense
448 .macro DAC_CHANNEL_REORDER
449 .mparam out, in
450 QBBS DAC_CHANNEL_REORDER_HIGH, in, 2
451 // Input channels 0,1,2,3 --> 6,4,2,0
452 // out = (3 - in) << 1
453 XOR out, in, 0x03
454 LSL out, out, 1
455 QBA DAC_CHANNEL_REORDER_DONE
456 DAC_CHANNEL_REORDER_HIGH:
457 // Input channels 4,5,6,7 --> 1,3,5,7
458 // out = ((in & 0x03) << 1) + 1
459 AND out, in, 0x03
460 LSL out, out, 1
461 ADD out, out, 1
462 DAC_CHANNEL_REORDER_DONE:
463 .endm
464
448 // Bring CS line low to write to ADC 465 // Bring CS line low to write to ADC
449 .macro ADC_CS_ASSERT 466 .macro ADC_CS_ASSERT
450 MOV r27, ADC_CS_PIN 467 MOV r27, ADC_CS_PIN
451 MOV r28, ADC_GPIO + GPIO_CLEARDATAOUT 468 MOV r28, ADC_GPIO + GPIO_CLEARDATAOUT
452 SBBO r27, r28, 0, 4 469 SBBO r27, r28, 0, 4
986 MOV r2, 0xFFFF 1003 MOV r2, 0xFFFF
987 AND r7, reg_dac_data, r2 1004 AND r7, reg_dac_data, r2
988 LSL r7, r7, AD5668_DATA_OFFSET 1005 LSL r7, r7, AD5668_DATA_OFFSET
989 MOV r8, (0x03 << AD5668_COMMAND_OFFSET) 1006 MOV r8, (0x03 << AD5668_COMMAND_OFFSET)
990 OR r7, r7, r8 1007 OR r7, r7, r8
991 LSL r8, r1, AD5668_ADDRESS_OFFSET 1008 DAC_CHANNEL_REORDER r8, r1
1009 LSL r8, r8, AD5668_ADDRESS_OFFSET
992 OR r7, r7, r8 1010 OR r7, r7, r8
993 DAC_WRITE r7 1011 DAC_WRITE r7
994 1012
995 // Read ADC channels: result is always 2 commands behind 1013 // Read ADC channels: result is always 2 commands behind
996 // Start by reading channel 2 (result is channel 0) and go 1014 // Start by reading channel 2 (result is channel 0) and go
1014 // DAC: transmit high word (second in little endian) 1032 // DAC: transmit high word (second in little endian)
1015 LSR r7, reg_dac_data, 16 1033 LSR r7, reg_dac_data, 16
1016 LSL r7, r7, AD5668_DATA_OFFSET 1034 LSL r7, r7, AD5668_DATA_OFFSET
1017 MOV r8, (0x03 << AD5668_COMMAND_OFFSET) 1035 MOV r8, (0x03 << AD5668_COMMAND_OFFSET)
1018 OR r7, r7, r8 1036 OR r7, r7, r8
1019 LSL r8, r1, AD5668_ADDRESS_OFFSET 1037 DAC_CHANNEL_REORDER r8, r1
1038 LSL r8, r8, AD5668_ADDRESS_OFFSET
1020 OR r7, r7, r8 1039 OR r7, r7, r8
1021 DAC_WRITE r7 1040 DAC_WRITE r7
1022 1041
1023 // Read ADC channels: result is always 2 commands behind 1042 // Read ADC channels: result is always 2 commands behind
1024 // Start by reading channel 2 (result is channel 0) and go 1043 // Start by reading channel 2 (result is channel 0) and go
1081 MOV r2, reg_mcasp_buf0 1100 MOV r2, reg_mcasp_buf0
1082 MOV reg_mcasp_buf0, reg_mcasp_buf1 1101 MOV reg_mcasp_buf0, reg_mcasp_buf1
1083 MOV reg_mcasp_buf1, r2 1102 MOV reg_mcasp_buf1, r2
1084 XOR reg_flags, reg_flags, (1 << FLAG_BIT_BUFFER1) //flip the buffer flag 1103 XOR reg_flags, reg_flags, (1 << FLAG_BIT_BUFFER1) //flip the buffer flag
1085 1104
1105 // If multiplexer capelet is enabled, save which channel we got to
1106 // Muxes 0-3 change at a different time than muxes 4-7 but the first
1107 // of these is sufficient to capture where we are
1108 MOV r2, FLAG_MASK_MUX_CONFIG
1109 AND r2, reg_flags, r2
1110 QBEQ MUX_CHANNEL_SAVE_DONE, r2, 0
1111 AND r2, reg_pru1_mux_pins, 0x03
1112 SBBO r2, reg_comm_addr, COMM_MUX_END_CHANNEL, 4
1113 MUX_CHANNEL_SAVE_DONE:
1114
1086 // Notify ARM of buffer swap 1115 // Notify ARM of buffer swap
1087 AND r2, reg_flags, (1 << FLAG_BIT_BUFFER1) // Mask out every but low bit 1116 AND r2, reg_flags, (1 << FLAG_BIT_BUFFER1) // Mask out every but low bit
1088 SBBO r2, reg_comm_addr, COMM_CURRENT_BUFFER, 4 1117 SBBO r2, reg_comm_addr, COMM_CURRENT_BUFFER, 4
1089 MOV R31.b0, PRU1_ARM_INTERRUPT + 16 // Interrupt to host loop 1118 MOV R31.b0, PRU1_ARM_INTERRUPT + 16 // Interrupt to host loop
1090 1119