00001
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 #ifdef __GNUC__
00049 #include <avr32/io.h>
00050 #elif __ICCAVR32__
00051 #include <avr32/ioap7000.h>
00052 #else
00053 #error No known compiler used
00054 #endif
00055
00056 #include "dac.h"
00057 #include "settings.h"
00058 #include "sinus.h"
00059
00060 typedef unsigned char avr32_piomap_t[][2];
00061 static int pio_enable_module(avr32_piomap_t piomap, unsigned int size);
00062
00067 int main(void)
00068 {
00069 int pi = 0;
00070 int retval = 0;
00071 int playing = 0;
00072 unsigned long debounce = 0;
00073 volatile avr32_pio_t *piob = &AVR32_PIOB;
00074 avr32_piomap_t abdac_piomap = {
00075 {AVR32_ABDAC_DATA_0_PIN, AVR32_ABDAC_DATA_0_FUNCTION},
00076 {AVR32_ABDAC_DATA_1_PIN, AVR32_ABDAC_DATA_1_FUNCTION},
00077 {AVR32_ABDAC_DATAN_0_PIN, AVR32_ABDAC_DATAN_0_FUNCTION},
00078 {AVR32_ABDAC_DATAN_1_PIN, AVR32_ABDAC_DATAN_1_FUNCTION},
00079 };
00080
00081
00082 retval = pio_enable_module(abdac_piomap, 4);
00083 if (retval) {
00084 goto out;
00085 }
00086
00087
00088 piob->per = 0x000001ff;
00089 piob->oer = 0x000000ff;
00090 piob->codr = 0x000000ff;
00091
00092 abdac_set_dac_hz(&AVR32_ABDAC, BUSHZ, BUSHZ/256);
00093
00094 for (;;) {
00095
00096 if (!(piob->pdsr & AVR32_PIO_P8_MASK) && !debounce) {
00097 if (playing) {
00098 playing = 0;
00099 piob->codr = AVR32_PIO_P0_MASK;
00100 debounce = GPIO_DEBOUNCE;
00101 abdac_disable(&AVR32_ABDAC);
00102 } else {
00103 playing = 1;
00104 piob->sodr = AVR32_PIO_P0_MASK;
00105 abdac_enable(&AVR32_ABDAC);
00106 debounce = GPIO_DEBOUNCE / 50;
00107 }
00108 }
00109
00110 if (playing) {
00111 retval = abdac_sink(&AVR32_ABDAC,
00112 sin_table(pi), sin_table(pi));
00113 if (retval) {
00114 goto out;
00115 }
00116
00117 ++pi;
00118 }
00119
00120 if (debounce) {
00121 --debounce;
00122 }
00123 }
00124
00125 out:
00126 return retval;
00127 }
00128
00138 static int pio_enable_module(avr32_piomap_t piomap, unsigned int size)
00139 {
00140 int i;
00141 volatile struct avr32_pio_t *pio;
00142
00143
00144 switch ((**piomap) / 32) {
00145 case 0:
00146 pio = &AVR32_PIOA;
00147 break;
00148 case 1:
00149 pio = &AVR32_PIOB;
00150 break;
00151 case 2:
00152 pio = &AVR32_PIOC;
00153 break;
00154 case 3:
00155 pio = &AVR32_PIOD;
00156 break;
00157 case 4:
00158 pio = &AVR32_PIOE;
00159 break;
00160 default:
00161 return -EINVAL;
00162 }
00163
00164 for (i = 0; i < size; i++) {
00165 pio->pdr |= (1 << ((**piomap) % 32));
00166 pio->pudr |= (1 << ((**piomap) % 32));
00167
00168 switch (*(*piomap + 1)) {
00169 case 0:
00170 pio->asr |= (1 << ((**piomap) % 32));
00171 break;
00172 case 1:
00173 pio->bsr |= (1 << ((**piomap) % 32));
00174 break;
00175 default:
00176 return -EINVAL;
00177 }
00178 ++piomap;
00179 }
00180
00181 return 0;
00182 }