altos: Cannot scan for flash chips until the OS is running.
[fw/altos] / src / ao_audio.c
1 /*
2  * Copyright © 2010 Keith Packard <keithp@keithp.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; version 2 of the License.
7  *
8  * This program is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11  * General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License along
14  * with this program; if not, write to the Free Software Foundation, Inc.,
15  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
16  */
17
18 #include "ao.h"
19
20 __xdata uint8_t ao_audio_dma;
21 __xdata uint8_t ao_audio_dma_done;
22 __xdata uint8_t ao_audio_mutex;
23
24 __code uint8_t ao_audio_sound[] = {
25          125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 126, 125, 125, 123, 123, 123,
26          125, 125, 123, 123, 123, 125, 125, 123, 123, 125, 125, 125, 125, 125, 126, 126,
27          128, 126, 126, 126, 126, 126, 126, 128, 128, 128, 128, 128, 128, 130, 130, 130,
28          130, 131, 131, 131, 130, 130, 130, 128, 130, 128, 128, 128, 128, 128, 130, 130,
29          130, 130, 131, 131, 130, 130, 128, 128, 130, 131, 130, 130, 130, 131, 133, 131,
30          128, 128, 128, 131, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 128,
31          130, 128, 126, 126, 126, 128, 128, 126, 128, 130, 128, 126, 126, 128, 128, 126,
32          125, 125, 128, 128, 128, 128, 125, 128, 130, 130, 130, 128, 128, 126, 128, 126,
33          126, 126, 125, 126, 128, 126, 126, 125, 125, 128, 130, 128, 123, 122, 123, 128,
34          126, 123, 125, 126, 128, 128, 125, 123, 122, 123, 125, 125, 125, 125, 125, 126,
35          126, 125, 123, 125, 128, 128, 126, 126, 125, 123, 123, 125, 126, 125, 125, 126,
36          126, 126, 128, 128, 126, 126, 128, 130, 128, 128, 126, 126, 128, 126, 126, 126,
37          126, 128, 130, 130, 128, 126, 125, 126, 130, 130, 128, 125, 126, 128, 130, 128,
38          126, 125, 126, 130, 133, 131, 128, 126, 130, 131, 131, 128, 128, 130, 133, 133,
39          133, 130, 130, 133, 134, 134, 133, 130, 131, 131, 131, 131, 130, 128, 128, 128,
40          130, 128, 125, 125, 126, 130, 128, 125, 125, 126, 126, 126, 126, 125, 126, 125,
41          130, 130, 128, 126, 126, 128, 128, 126, 126, 128, 126, 126, 128, 128, 130, 128,
42          126, 128, 128, 131, 130, 130, 128, 128, 128, 125, 126, 126, 125, 125, 125, 125,
43          125, 125, 126, 126, 126, 126, 125, 123, 123, 123, 125, 123, 123, 125, 125, 125,
44          125, 125, 126, 126, 125, 123, 123, 126, 126, 128, 128, 128, 128, 128, 128, 128,
45          131, 126, 126, 128, 130, 128, 128, 126, 126, 126, 126, 126, 126, 126, 126, 128,
46          126, 126, 126, 126, 125, 125, 123, 125, 125, 125, 125, 125, 125, 125, 125, 126,
47          126, 126, 126, 126, 126, 126, 126, 128, 128, 126, 126, 128, 130, 130, 131, 133,
48          133, 131, 130, 130, 128, 128, 126, 128, 128, 128, 128, 130, 130, 131, 130, 131,
49          131, 128, 131, 128, 130, 130, 130, 130, 130, 130, 131, 133, 133, 131, 131, 130,
50          130, 131, 133, 131, 130, 130, 131, 134, 133, 130, 128, 126, 128, 130, 131, 131,
51          128, 126, 128, 130, 128, 126, 125, 125, 125, 125, 126, 126, 126, 125, 125, 126,
52          126, 125, 126, 126, 125, 125, 123, 125, 125, 125, 123, 123, 123, 123, 123, 123,
53          123, 123, 123, 123, 125, 125, 126, 126, 125, 123, 123, 125, 125, 123, 123, 122,
54          122, 122, 123, 126, 126, 125, 126, 126, 128, 126, 125, 126, 125, 126, 125, 126,
55          126, 126, 128, 128, 126, 125, 125, 125, 126, 126, 130, 130, 130, 128, 128, 130,
56          130, 126, 126, 125, 123, 123, 123, 125, 123, 122, 122, 120, 122, 125, 125, 125,
57          123, 125, 126, 128, 128, 126, 128, 125, 126, 128, 130, 131, 130, 131, 131, 133,
58          133, 130, 130, 131, 131, 131, 131, 133, 133, 134, 133, 133, 133, 131, 131, 130,
59          131, 131, 131, 130, 128, 130, 130, 131, 131, 133, 131, 133, 131, 133, 133, 133,
60          134, 134, 136, 134, 134, 134, 134, 133, 133, 133, 133, 131, 128, 128, 125, 120,
61          119, 116, 112, 111, 108, 106, 106, 108, 109, 109, 109, 108, 106, 106, 106, 109,
62          111, 114, 116, 120, 123, 125, 128, 131, 133, 136, 139, 139, 140, 139, 139, 137,
63          137, 139, 140, 139, 137, 140, 142, 144, 145, 144, 142, 142, 142, 142, 142, 140,
64          139, 139, 137, 137, 137, 136, 136, 136, 134, 133, 130, 128, 126, 125, 123, 120,
65          116, 112, 108, 103,  98,  95,  91,  86,  83,  80,  77,  70,  66,  61,  61,  67,
66           78,  95, 105, 117, 123, 130, 140, 145, 151, 161, 164, 161, 161, 159, 156, 156,
67          156, 159, 161, 158, 159, 162, 162, 165, 169, 167, 165, 159, 153, 148, 142, 136,
68          131, 125, 122, 120, 120, 122, 126, 130, 133, 137, 140, 144, 144, 140, 137, 130,
69          125, 123, 119, 116, 114, 108, 101,  94,  89,  87,  86,  81,  75,  70,  64,  61,
70           66,  83, 101, 126, 144, 153, 173, 184, 172, 162, 162, 151, 140, 134, 130, 128,
71          123, 119, 126, 133, 134, 144, 151, 153, 158, 159, 162, 164, 158, 151, 145, 133,
72          116, 105,  98,  95,  92,  95, 105, 109, 114, 122, 131, 142, 151, 155, 158, 159,
73          156, 151, 150, 145, 139, 136, 137, 140, 142, 145, 151, 159, 162, 165, 165, 161,
74          153, 139, 126, 114,  97,  81,  67,  55,  42,  31,  23,  19,  20,  25,  34,  50,
75           66,  86, 117, 147, 169, 186, 184, 176, 172, 159, 153, 151, 147, 144, 137, 131,
76          130, 128, 126, 136, 147, 158, 161, 159, 158, 156, 156, 156, 156, 151, 139, 128,
77          119, 109, 108, 111, 112, 119, 125, 125, 130, 133, 134, 142, 145, 147, 148, 144,
78          139, 134, 130, 123, 122, 119, 112, 105,  95,  89,  81,  77,  69,  55,  45,  44,
79           55,  86, 128, 164, 189, 189, 170, 158, 147, 137, 148, 158, 159, 156, 140, 123,
80          117, 116, 126, 145, 156, 159, 151, 137, 133, 136, 147, 161, 164, 156, 139, 117,
81          101,  94,  94, 105, 116, 122, 123, 120, 119, 123, 131, 147, 162, 169, 169, 158,
82          145, 136, 133, 137, 145, 144, 139, 131, 123, 123, 126, 134, 139, 136, 125, 114,
83          101,  91,  81,  70,  61,  47,  30,  14,   0,   8,  44,  86, 126, 158, 161, 155,
84          151, 144, 151, 172, 187, 198, 195, 175, 156, 140, 130, 137, 150, 158, 156, 140,
85          123, 114, 116, 131, 147, 156, 162, 151, 136, 122, 114, 120, 131, 137, 145, 142,
86          130, 122, 116, 119, 133, 144, 151, 147, 133, 120, 112, 117, 130, 142, 148, 145,
87          134, 120, 112, 108, 108, 108, 105,  91,  72,  50,  33,  27,  33,  56,  89, 119,
88          144, 156, 145, 139, 140, 139, 150, 165, 173, 178, 172, 158, 148, 140, 139, 147,
89          155, 158, 156, 147, 139, 136, 136, 145, 153, 158, 153, 140, 130, 116, 108, 112,
90          125, 134, 142, 140, 136, 133, 128, 133, 144, 153, 161, 162, 155, 145, 134, 133,
91          137, 139, 139, 134, 123, 112, 105, 101, 105, 105, 105, 100,  89,  72,  58,  44,
92           34,  34,  42,  58,  84, 111, 128, 134, 131, 131, 134, 131, 140, 155, 162, 172,
93          172, 165, 159, 148, 145, 150, 150, 150, 148, 140, 133, 125, 120, 125, 131, 133,
94          136, 130, 125, 117, 112, 117, 126, 133, 139, 142, 140, 137, 134, 136, 140, 147,
95          147, 148, 140, 133, 126, 126, 131, 134, 139, 140, 137, 133, 125, 119, 116, 111,
96          108, 101,  91,  75,  58,  41,  30,  28,  39,  66, 101, 131, 147, 145, 142, 140,
97          136, 142, 159, 172, 179, 181, 172, 162, 148, 139, 140, 147, 150, 153, 148, 139,
98          131, 125, 128, 136, 144, 150, 151, 144, 133, 122, 117, 123, 134, 142, 147, 147,
99          144, 136, 130, 134, 144, 155, 162, 162, 155, 145, 137, 137, 140, 144, 147, 145,
100          136, 123, 114, 106, 103, 100,  98,  94,  84,  66,  48,  31,  23,  30,  48,  84,
101          123, 150, 158, 151, 147, 142, 133, 142, 158, 167, 173, 172, 159, 145, 131, 123,
102          130, 136, 140, 145, 139, 126, 120, 117, 123, 133, 139, 145, 144, 131, 120, 111,
103          108, 117, 130, 142, 145, 144, 136, 130, 126, 133, 148, 158, 161, 158, 144, 133,
104          126, 126, 133, 140, 144, 142, 131, 122, 114, 109, 108, 105,  98,  91,  75,  56,
105           39,  25,  20,  28,  52,  87, 126, 155, 165, 161, 156, 151, 142, 147, 161, 167,
106          172, 169, 156, 142, 128, 122, 126, 136, 144, 148, 145, 136, 130, 131, 137, 144,
107          151, 156, 156, 139, 123, 114, 108, 116, 128, 139, 148, 147, 137, 134, 133, 139,
108          156, 165, 169, 165, 151, 136, 128, 125, 131, 139, 140, 137, 130, 122, 116, 109,
109          105, 101,  97,  86,  70,  50,  31,  19,  17,  33,  67, 114, 158, 186, 184, 173,
110          164, 144, 136, 148, 159, 165, 169, 156, 139, 123, 109, 114, 126, 139, 151, 153,
111          145, 134, 133, 137, 147, 151, 155, 155, 144, 120,  98,  95,  94, 106, 126, 139,
112          145, 142, 133, 134, 139, 148, 167, 175, 169, 155, 134, 119, 112, 114, 126, 137,
113          140, 137, 131, 126, 123, 122, 119, 116, 108,  91,  69,  44,  22,  11,  13,  27,
114           56,  98, 137, 170, 179, 169, 167, 161, 145, 151, 159, 158, 159, 153, 139, 131,
115          120, 116, 128, 137, 145, 156, 156, 148, 148, 148, 153, 155, 151, 148, 142, 130,
116          105,  95,  98, 105, 120, 136, 145, 150, 145, 142, 148, 156, 165, 175, 173, 159,
117          139, 123, 114, 112, 119, 131, 144, 144, 140, 137, 133, 126, 122, 117, 109,  97,
118           73,  50,  28,  13,   9,  20,  45,  91, 134, 173, 190, 179, 172, 169, 155, 147,
119          159, 159, 156, 155, 134, 119, 112, 108, 119, 134, 145, 155, 159, 150, 147, 151,
120          151, 158, 158, 150, 137, 122, 100,  89,  87,  95, 112, 131, 140, 144, 144, 139,
121          140, 150, 162, 173, 172, 161, 140, 120, 109, 111, 117, 128, 139, 145, 145, 142,
122          139, 136, 131, 126, 114,  98,  80,  58,  38,  20,  11,  11,  16,  33,  70, 109,
123          148, 184, 189, 183, 184, 165, 144, 148, 148, 142, 145, 131, 116, 112, 106, 106,
124          125, 140, 151, 167, 164, 153, 155, 155, 155, 156, 150, 137, 125, 101,  86,  89,
125           87,  95, 125, 140, 144, 150, 148, 145, 155, 164, 172, 176, 165, 148, 133, 117,
126          112, 122, 131, 142, 151, 155, 153, 151, 147, 142, 139, 126, 108,  91,  70,  48,
127           28,  17,  13,  17,  25,  47,  86, 126, 170, 198, 198, 194, 187, 164, 145, 147,
128          140, 136, 137, 123, 111, 111, 106, 114, 134, 150, 164, 173, 169, 161, 161, 156,
129          153, 150, 140, 130, 112,  87,  69,  72,  86,  98, 112, 137, 151, 153, 148, 150,
130          161, 170, 170, 173, 165, 142, 125, 116, 111, 117, 130, 140, 147, 151, 151, 153,
131          153, 145, 139, 130, 109,  86,  67,  48,  31,  22,  14,  11,  17,  28,  56,  95,
132          139, 184, 204, 197, 195, 181, 148, 139, 137, 134, 136, 134, 120, 112, 109, 105,
133          119, 137, 153, 170, 175, 161, 151, 148, 139, 137, 137, 131, 122, 105,  80,  66,
134           69,  86, 111, 125, 145, 164, 162, 155, 156, 164, 169, 169, 164, 156, 142, 122,
135          114, 117, 126, 139, 155, 162, 162, 165, 161, 150, 140, 130, 120, 109,  89,  67,
136           52,  36,  22,  14,  14,  22,  39,  70, 108, 153, 194, 208, 200, 198, 181, 151,
137          144, 144, 140, 147, 144, 130, 125, 117, 112, 126, 144, 158, 172, 175, 159, 153,
138          150, 142, 142, 142, 134, 123, 109,  84,  72,  72,  78, 100, 126, 142, 153, 164,
139          167, 162, 162, 165, 165, 161, 150, 137, 125, 116, 114, 122, 136, 150, 161, 165,
140          164, 162, 155, 147, 139, 128, 116, 100,  81,  61,  45,  28,  16,  11,   5,   9,
141           25,  55,  91, 137, 186, 206, 204, 204, 192, 164, 148, 147, 142, 145, 145, 133,
142          125, 117, 106, 108, 122, 134, 148, 158, 151, 148, 147, 139, 137, 140, 139, 133,
143          123, 105,  87,  80,  77,  86, 100, 120, 137, 150, 161, 167, 170, 169, 167, 165,
144          158, 147, 137, 133, 130, 133, 139, 145, 155, 159, 164, 165, 167, 161, 151, 140,
145          126, 114, 101,  84,  67,  53,  38,  22,   9,   2,   2,  17,  41,  80, 125, 172,
146          208, 215, 209, 204, 187, 165, 159, 158, 153, 153, 144, 130, 120, 111, 103, 111,
147          126, 139, 151, 155, 148, 148, 148, 147, 150, 153, 148, 142, 130, 108,  94,  86,
148           81,  86,  97, 111, 125, 134, 144, 161, 169, 169, 169, 169, 162, 151, 140, 136,
149          140, 140, 145, 153, 159, 164, 169, 167, 162, 161, 150, 137, 126, 114,  98,  80,
150           62,  44,  30,  17,   6,   0,   2,   9,  27,  58, 100, 144, 190, 212, 211, 206,
151          195, 167, 147, 144, 137, 137, 139, 128, 119, 109,  95,  92, 103, 116, 131, 148,
152          151, 153, 156, 150, 147, 148, 147, 142, 137, 120, 101,  87,  77,  72,  77,  89,
153          100, 109, 123, 134, 151, 169, 175, 179, 181, 175, 159, 150, 144, 142, 145, 153,
154          161, 167, 172, 169, 164, 161, 156, 150, 142, 134, 123, 111,  94,  75,  59,  45,
155           36,  28,  22,  20,  20,  27,  47,  80, 117, 159, 198, 214, 211, 208, 189, 162,
156          150, 144, 139, 148, 150, 144, 136, 123, 106, 101, 106, 117, 137, 151, 159, 164,
157          162, 150, 140, 134, 131, 130, 128, 120, 109, 100,  86,  81,  81,  87, 100, 111,
158          117, 130, 150, 162, 165, 173, 179, 181, 175, 165, 159, 156, 151, 148, 155, 162,
159          169, 172, 170, 165, 161, 153, 140, 130, 122, 112, 100,  84,  70,  56,  45,  31,
160           22,  19,  16,  17,  27,  44,  70, 105, 139, 175, 198, 203, 200, 192, 169, 151,
161          142, 137, 144, 153, 155, 148, 139, 119, 106, 103, 103, 120, 134, 144, 148, 148,
162          140, 130, 122, 117, 120, 123, 123, 119, 112, 101,  91,  84,  84,  87,  92,  98,
163          105, 114, 134, 158, 169, 181, 190, 189, 183, 173, 165, 162, 165, 164, 170, 178,
164          179, 173, 165, 158, 150, 147, 140, 133, 126, 119, 108,  95,  83,  72,  64,  55,
165           44,  34,  25,  22,  20,  28,  48,  75, 106, 140, 178, 197, 200, 204, 195, 181,
166          169, 164, 161, 165, 169, 162, 158, 144, 122, 106,  97,  98, 108, 120, 128, 140,
167          147, 142, 136, 130, 125, 126, 126, 126, 126, 123, 111, 100,  89,  83,  81,  83,
168           91, 101, 114, 125, 148, 170, 179, 187, 194, 192, 187, 179, 170, 169, 170, 169,
169          172, 175, 173, 167, 159, 151, 145, 142, 133, 125, 122, 114, 105,  92,  81,  67,
170           56,  45,  33,  28,  22,  19,  19,  27,  41,  64,  97, 126, 164, 195, 204, 208,
171          208, 192, 169, 159, 150, 150, 156, 151, 147, 140, 125, 106,  97,  91,  94, 108,
172          119, 131, 142, 144, 137, 131, 123, 116, 112, 112, 112, 114, 112, 106, 100,  94,
173           92,  91,  95, 106, 122, 136, 147, 155, 162, 169, 172, 178, 187, 195, 200, 200,
174          198, 190, 183, 175, 167, 164, 162, 161, 158, 156, 151, 142, 130, 116, 105,  94,
175           86,  81,  75,  73,  69,  64,  56,  48,  42,  36,  36,  42,  53,  70,  94, 117,
176          140, 167, 183, 187, 189, 187, 175, 164, 158, 153, 151, 153, 150, 148, 145, 133,
177          122, 111, 105, 101, 105, 109, 116, 122, 123, 120, 116, 109, 108, 105, 103, 105,
178          108, 109, 111, 111, 111, 114, 114, 116, 123, 131, 139, 148, 161, 172, 181, 189,
179          194, 197, 195, 189, 183, 178, 172, 167, 165, 164, 165, 164, 161, 158, 155, 148,
180          139, 131, 122, 112, 103,  92,  83,  70,  61,  53,  48,  45,  44,  42,  39,  39,
181           41,  44,  53,  66,  87, 111, 133, 156, 178, 183, 181, 178, 164, 148, 142, 136,
182          136, 144, 147, 147, 150, 142, 126, 119, 105,  97, 100, 100, 103, 111, 116, 114,
183          112, 108, 100, 101, 103, 106, 116, 125, 134, 140, 147, 147, 142, 140, 140, 142,
184          147, 150, 156, 162, 165, 164, 164, 167, 172, 179, 187, 197, 201, 203, 200, 190,
185          181, 170, 161, 156, 156, 155, 151, 145, 134, 120, 105,  89,  78,  70,  67,  67,
186           72,  75,  75,  73,  67,  61,  52,  48,  45,  52,  58,  70,  87, 103, 120, 134,
187          148, 155, 155, 159, 156, 148, 148, 147, 147, 151, 153, 151, 150, 144, 130, 120,
188          111, 103, 101, 103, 106, 111, 117, 119, 117, 117, 114, 112, 111, 114, 119, 125,
189          133, 137, 140, 144, 144, 140, 137, 139, 140, 147, 156, 162, 170, 175, 175, 175,
190          176, 178, 181, 187, 192, 194, 192, 187, 178, 170, 158, 150, 142, 139, 137, 134,
191          130, 122, 111, 100,  87,  77,  69,  62,  62,  61,  62,  61,  58,  52,  44,  38,
192           30,  27,  30,  39,  53,  72,  94, 114, 134, 151, 156, 158, 161, 156, 151, 151,
193          153, 156, 162, 164, 164, 162, 153, 139, 128, 117, 109, 108, 108, 111, 120, 123,
194          123, 123, 122, 117, 112, 112, 114, 122, 131, 140, 147, 153, 156, 155, 151, 148,
195          145, 147, 150, 159, 172, 179, 183, 190, 192, 189, 186, 184, 186, 187, 189, 190,
196          192, 187, 181, 172, 162, 153, 144, 136, 128, 122, 116, 106,  95,  84,  72,  59,
197           52,  42,  36,  36,  33,  34,  33,  34,  31,  30,  30,  33,  42,  56,  73,  95,
198          119, 139, 156, 167, 172, 172, 167, 159, 158, 155, 158, 164, 167, 170, 169, 164,
199          150, 142, 128, 116, 112, 109, 109, 114, 117, 119, 119, 116, 111, 106, 105, 103,
200          108, 117, 130, 140, 153, 161, 165, 167, 164, 161, 158, 159, 162, 167, 176, 181,
201          184, 187, 187, 186, 181, 178, 175, 176, 176, 176, 176, 173, 169, 159, 150, 139,
202          128, 119, 109, 101,  92,  83,  75,  66,  55,  45,  38,  31,  28,  28,  28,  31,
203           33,  34,  38,  41,  44,  50,  62,  73,  92, 112, 131, 153, 170, 179, 186, 186,
204          178, 172, 167, 164, 165, 170, 173, 176, 175, 167, 156, 142, 128, 116, 108, 105,
205          105, 111, 117, 122, 125, 123, 120, 119, 116, 116, 120, 128, 140, 155, 167, 176,
206          181, 181, 176, 172, 167, 164, 165, 170, 176, 183, 189, 192, 190, 187, 179, 173,
207          169, 165, 162, 162, 161, 159, 156, 148, 140, 128, 116, 101,  89,  80,  72,  66,
208           61,  56,  50,  45,  39,  31,  25,  23,  22,  23,  27,  33,  38,  45,  53,  61,
209           72,  86, 103, 120, 140, 159, 172, 183, 187, 183, 176, 170, 162, 159, 161, 161,
210          162, 167, 165, 161, 151, 137, 125, 114, 105, 100, 101, 106, 112, 120, 125, 125,
211          123, 120, 117, 117, 120, 128, 139, 153, 165, 175, 184, 184, 183, 179, 173, 169,
212          169, 172, 176, 183, 187, 189, 187, 184, 178, 169, 161, 155, 150, 148, 147, 147,
213          145, 144, 136, 125, 112,  97,  84,  72,  62,  56,  55,  52,  48,  47,  42,  38,
214           33,  30,  28,  28,  31,  34,  44,  53,  64,  75,  87, 101, 116, 130, 145, 158,
215          169, 178, 184, 186, 186, 184, 181, 181, 179, 176, 178, 176, 175, 167, 159, 148,
216          136, 126, 116, 109, 106, 106, 108, 112, 114, 117, 117, 119, 119, 123, 128, 134,
217          144, 155, 167, 175, 181, 184, 187, 186, 183, 181, 178, 176, 176, 178, 178, 178,
218          178, 175, 170, 165, 158, 150, 145, 140, 136, 134, 131, 128, 122, 114, 103,  91,
219           78,  67,  58,  50,  44,  39,  36,  34,  33,  30,  27,  25,  25,  23,  27,  30,
220           36,  45,  58,  72,  84, 101, 119, 136, 151, 164, 175, 184, 187, 189, 189, 187,
221          187, 186, 187, 184, 184, 181, 175, 167, 156, 142, 131, 120, 112, 106, 103, 101,
222          103, 106, 108, 109, 111, 111, 114, 117, 122, 131, 140, 153, 165, 176, 184, 190,
223          194, 194, 192, 189, 184, 183, 181, 179, 178, 178, 178, 175, 172, 165, 159, 151,
224          147, 137, 133, 130, 125, 122, 117, 111, 101,  92,  81,  70,  62,  55,  47,  42,
225           39,  39,  38,  39,  39,  39,  41,  41,  42,  45,  48,  56,  64,  73,  84,  98,
226          112, 126, 142, 156, 169, 179, 187, 190, 192, 192, 192, 192, 194, 195, 195, 195,
227          190, 186, 176, 164, 151, 139, 128, 117, 109, 105, 101, 101, 101, 103, 106, 106,
228          108, 108, 111, 114, 122, 131, 139, 151, 162, 173, 181, 187, 189, 189, 189, 187,
229          186, 184, 181, 179, 176, 175, 172, 169, 162, 156, 148, 140, 131, 122, 114, 106,
230          100,  95,  89,  83,  77,  70,  66,  59,  53,  48,  45,  44,  44,  45,  45,  50,
231           53,  58,  59,  64,  67,  72,  75,  80,  84,  91,  98, 106, 116, 126, 137, 147,
232          156, 162, 170, 172, 176, 178, 181, 183, 183, 186, 186, 187, 187, 184, 181, 176,
233          170, 162, 153, 145, 137, 130, 125, 120, 119, 117, 117, 117, 117, 117, 116, 117,
234          117, 122, 126, 131, 137, 142, 150, 155, 159, 164, 169, 172, 173, 173, 173, 173,
235          173, 170, 169, 164, 159, 155, 151, 147, 140, 134, 128, 120, 111, 103,  97,  91,
236           86,  81,  78,  75,  72,  69,  67,  64,  64,  62,  62,  66,  69,  72,  77,  83,
237           89,  94,  98, 101, 105, 108, 109, 111, 112, 116, 120, 123, 128, 130, 134, 137,
238          140, 144, 145, 147, 147, 148, 148, 148, 148, 150, 153, 155, 155, 155, 155, 155,
239          155, 153, 151, 150, 150, 150, 151, 151, 151, 150, 150, 148, 147, 145, 144, 142,
240          140, 139, 137, 134, 133, 131, 130, 128, 126, 126, 126, 126, 125, 125, 123, 123,
241          123, 123, 123, 122, 122, 123, 123, 123, 123, 122, 122, 122, 122, 120, 119, 119,
242          119, 117, 116, 114, 114, 112, 111, 109, 108, 106, 105, 105, 105, 103, 103, 101,
243          101, 101, 103, 103, 103, 105, 106, 109, 111, 112, 116, 119, 122, 125, 125, 128,
244          131, 133, 134, 137, 140, 144, 145, 147, 150, 151, 155, 155, 158, 159, 159, 161,
245          161, 161, 162, 161, 159, 159, 158, 156, 153, 151, 150, 148, 145, 142, 139, 136,
246          133, 130, 128, 126, 123, 122, 119, 117, 116, 114, 112, 112, 112, 112, 109, 111,
247          111, 111, 111, 112, 112, 114, 116, 117, 119, 119, 122, 123, 125, 125, 126, 126,
248          126, 128, 128, 128, 128, 126, 126, 125, 123, 122, 120, 119, 117, 116, 114, 114,
249          111, 112, 109, 109, 112, 111, 111, 111, 111, 112, 116, 116, 117, 117, 117, 119,
250          119, 120, 122, 123, 126, 128, 130, 131, 133, 136, 137, 137, 140, 140, 142, 144,
251          145, 147, 148, 148, 150, 150, 150, 150, 148, 148, 147, 145, 144, 140, 140, 139,
252          137, 136, 134, 131, 130, 126, 125, 122, 120, 120, 117, 117, 116, 116, 117, 117,
253          117, 117, 119, 122, 122, 123, 126, 126, 128, 128, 130, 131, 131, 131, 131, 131,
254          131, 131, 131, 131, 131, 131, 131, 130, 130, 128, 128, 126, 126, 125, 123, 123,
255          122, 122, 119, 119, 119, 117, 117, 117, 117, 116, 116, 116, 117, 117, 117, 119,
256          119, 119, 120, 122, 123, 125, 126, 128, 130, 131, 133, 134, 136, 137, 137, 140,
257          140, 142, 142, 142, 142, 144, 140, 140, 142, 140, 140, 139, 139, 137, 136, 134,
258          133, 131, 130, 128, 126, 125, 125, 122, 120, 119, 119, 117, 116, 116, 117, 119,
259          120, 120, 120, 122, 122, 125, 125, 125, 126, 128, 128, 128, 128, 128, 130, 131,
260          131, 130, 130, 128, 130, 130, 128, 128, 126, 126, 126, 123, 122, 120, 119, 119,
261          117, 117, 117, 117, 117, 117, 116, 116, 114, 116, 117, 117, 119, 119, 120, 120,
262          122, 123, 125, 125, 126, 126, 128, 128, 130, 131, 131, 133, 134, 136, 136, 137,
263          137, 139, 137, 139, 140, 140, 140, 140, 139, 139, 137, 137, 136, 136, 136, 136,
264          134, 133, 133, 133, 133, 131, 131, 130, 130, 130, 130, 128, 128, 128, 128, 128,
265          128, 128, 128, 128, 130, 130, 128, 130, 128, 131, 131, 131, 131, 130, 131, 131,
266          131, 131, 131, 131, 131, 131, 130, 128, 126, 125, 125, 122, 122, 122, 120, 120,
267          117, 117, 116, 116, 117, 116, 116, 117, 117, 117, 117, 117, 117, 119, 119, 119,
268          120, 120, 120, 122, 122, 122, 123, 123, 126, 126, 128, 130, 130, 130, 131, 133,
269          133, 133, 133, 133, 133, 133, 131, 131, 131, 133, 133, 133, 133, 131, 131, 130,
270          131, 130, 130, 130, 130, 128, 128, 126, 126, 126, 126, 126, 126, 126, 126, 128,
271          126, 126, 126, 128, 128, 128, 128, 128, 130, 130, 128, 128, 128, 130, 130, 128,
272          128, 128, 128, 126, 126, 125, 125, 125, 126, 126, 126, 125, 125, 123, 125, 125,
273          125, 123, 123, 125, 123, 123, 122, 122, 123, 125, 125, 125, 125, 126, 128, 128,
274          130, 128, 131, 133, 131, 134, 133, 134, 136, 134, 134, 134, 134, 134, 134, 136,
275          133, 133, 133, 133, 133, 133, 133, 133, 131, 131, 131, 130, 130, 130, 131, 131,
276          131, 131, 131, 130, 128, 128, 126, 126, 126, 125, 125, 125, 125, 125, 125, 125,
277          125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 123, 123, 122, 123, 122, 122,
278          120, 122, 120, 120, 122, 122, 120, 122, 122, 122, 122, 122, 122, 122, 122, 123,
279          123, 123, 123, 125, 125, 125, 125, 126, 126, 126, 126, 126, 128, 128, 128, 130,
280 };
281
282 #define nop()   _asm nop _endasm;
283
284 static void
285 ao_audio_delay(uint8_t n) {
286         while (--n != 0)
287                 nop();
288 }
289
290 void
291 ao_audio_send(__xdata uint8_t *samples, uint16_t nsamples) __reentrant
292 {
293         ao_mutex_get(&ao_audio_mutex);
294
295 #if AUDIO_STANDBY_ON_P2_4
296         /*
297          * Turn on the audio amp
298          */
299         P2_4 = 1;
300 #endif
301         /*
302          * Turn on timer 4. Free running from 0 to 0xff, with P2_0
303          * 'on' interval controlled by the value in T4CC0. Run this
304          * timer as fast as possible, resulting in a frequency of
305          * 24e6/256 or 93750Hz.
306          */
307         T4CCTL0 = TxCCTLy_CMP_SET_UP_CLEAR_DOWN | TxCCTLy_CMP_MODE_ENABLE;
308         T4CC0 = 0x7f;
309         T4CCTL1 = 0;
310         T4CTL = TxCTL_DIV_1|TxCTL_START|TxCTL_CLR|TxCTL_MODE_FREE;
311         P2SEL = (P2SEL & ~P2SEL_SELP2_0_MASK) | P2SEL_SELP2_0_PERIPHERAL;
312
313         /*
314          * Turn on timer 3 to clock data to the PWM output. This
315          * runs at 24e6/(17 * 128) or 11029Hz, almost exactly the
316          * desired 11025Hz. Each cycle of the counter, a DMA transfer
317          * reads a sample and writes to the T4CC0 register, which
318          * controls the pulse width of the final audio signal
319          */
320         T3CCTL0 = TxCCTLy_CMP_SET_UP_CLEAR_DOWN|TxCCTLy_CMP_MODE_ENABLE;
321         T3CC0 = 17;
322         T3CTL = TxCTL_DIV_128|TxCTL_START|TxCTL_CLR|TxCTL_MODE_MODULO;
323         while (nsamples) {
324                 uint16_t        this_samples;
325
326                 /* Sigh. The DMA engine has only 13 bits of length */
327                 if ((this_samples = nsamples) > 0x1fff)
328                         this_samples = 0x1fff;
329                 /*
330                  * Set up DMA to write samples to T4CC0, triggered by T3 CH0
331                  */
332                 ao_dma_set_transfer(ao_audio_dma,
333                                     samples,
334                                     &T4CC0XADDR,
335                                     this_samples,
336                                     DMA_CFG0_WORDSIZE_8 |
337                                     DMA_CFG0_TMODE_SINGLE |
338                                     DMA_CFG0_TRIGGER_T3_CH0,
339                                     DMA_CFG1_SRCINC_1 |
340                                     DMA_CFG1_DESTINC_0 |
341                                     DMA_CFG1_PRIORITY_HIGH);
342                 samples += this_samples;
343                 nsamples -= this_samples;
344                 ao_dma_start(ao_audio_dma);
345
346                 __critical while (!ao_audio_dma_done)
347                                    ao_sleep(&ao_audio_dma_done);
348         }
349
350         /* Turn the timers back off */
351         T3CTL = 0;
352         T4CTL = 0;
353
354         /* And pull the GPIO to ground */
355         P2_0 = 0;
356         P2SEL = (P2SEL & ~P2SEL_SELP2_0_MASK) | P2SEL_SELP2_0_GPIO;
357
358 #if AUDIO_STANDBY_ON_P2_4
359         /*
360          * Turn off the audio amp
361          */
362         P2_4 = 1;
363 #endif
364         ao_mutex_put(&ao_audio_mutex);
365 }
366
367 void
368 ao_audio_test(void)
369 {
370         ao_audio_send(CODE_TO_XDATA(ao_audio_sound), sizeof (ao_audio_sound));
371 }
372
373 __code struct ao_cmds ao_audio_cmds[] = {
374         { 'A', ao_audio_test, "A                                  Audio system test" },
375         { 0,   ao_audio_test, NULL },
376 };
377
378 void
379 ao_audio_init(void)
380 {
381         /* The audio amplifier is connected to P2_0, which can
382          * be hooked to timer 4 using configuration alternative 2
383          */
384         P2_0 = 0;
385         P2SEL = (P2SEL & ~P2SEL_SELP2_0_MASK) | P2SEL_SELP2_0_GPIO;
386         PERCFG = (PERCFG & ~PERCFG_T4CFG_ALT_MASK) | PERCFG_T4CFG_ALT_2;
387
388 #if AUDIO_STANDBY_ON_P2_4
389         P2_4 = 1;
390         P2SEL &= ~P2SEL_SELP2_4_PERIPHERAL;
391         P2DIR |= (1 << 4);
392 #endif
393
394         /* Timer 3 is used to clock the DMA transfers from the audio data buffer
395          * to the timer 4
396          */
397         ao_audio_dma = ao_dma_alloc(&ao_audio_dma_done);
398         ao_cmd_register(&ao_audio_cmds[0]);
399 }