Mercurial > hg > beaglert
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 |