]> git.gag.com Git - fw/altos/blob - src/avr/ao_usb_avr.c
altosui: Split out UI-specific preferences
[fw/altos] / src / avr / ao_usb_avr.c
1 /*
2  * Copyright © 2011 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 #include "ao_usb.h"
20
21 #define USB_DEBUG 0
22
23 #if USB_DEBUG
24 #define debug(format, args...)  printf(format, ## args)
25 #else
26 #define debug(format, args...)
27 #endif
28
29 struct ao_task __xdata ao_usb_task;
30
31 struct ao_usb_setup {
32         uint8_t         dir_type_recip;
33         uint8_t         request;
34         uint16_t        value;
35         uint16_t        index;
36         uint16_t        length;
37 } __xdata ao_usb_setup;
38
39 static __xdata uint8_t  ao_usb_ep0_state;
40 static const uint8_t * __xdata ao_usb_ep0_in_data;
41 static __xdata uint8_t  ao_usb_ep0_in_len;
42 static __xdata uint8_t  ao_usb_ep0_in_pending;
43 static __xdata uint8_t  ao_usb_addr_pending;
44 static __xdata uint8_t  ao_usb_ep0_in_buf[2];
45 static __xdata uint8_t  ao_usb_ep0_out_len;
46 static __xdata uint8_t *__xdata ao_usb_ep0_out_data;
47
48 static __xdata uint8_t  ao_usb_in_flushed;
49 static __xdata uint8_t  ao_usb_running;
50 static __xdata uint8_t  ao_usb_configuration;
51 static __xdata uint8_t  ueienx_0;
52
53 void
54 ao_usb_set_address(uint8_t address)
55 {
56         UDADDR = (0 << ADDEN) | address;
57         ao_usb_addr_pending = 1;
58 }
59
60 #define EP_SIZE(s)      ((s) == 64 ? 0x30 :     \
61                         ((s) == 32 ? 0x20 :     \
62                         ((s) == 16 ? 0x10 :     \
63                                      0x00)))
64
65 static void
66 ao_usb_dump_ep(uint8_t ep)
67 {
68         UENUM = ep;
69         debug ("EP %d: UECONX %02x UECFG0X %02x UECFG1X %02x UEIENX %02x UESTA0X %02x UESTA1X %02X\n",
70                 ep, UECONX, UECFG0X, UECFG1X, UEIENX, UESTA0X, UESTA1X);
71 }
72
73 static void
74 ao_usb_set_ep0(void)
75 {
76         debug ("set_ep0\n");
77         /* Set the CONTROL max packet size, single buffered */
78         UENUM = 0;
79         UECONX = (1 << EPEN);                                   /* Enable */
80
81         UECFG0X = ((0 << EPTYPE0) |                             /* Control */
82                    (0 << EPDIR));                               /* Out (ish) */
83
84         UECFG1X = (EP_SIZE(AO_USB_CONTROL_SIZE) |               /* Size */
85                    (0 << EPBK0) |                               /* Single bank */
86                    (1 << ALLOC));
87
88         ueienx_0 = ((1 << RXSTPE) |                             /* Enable SETUP interrupt */
89                     (1 << RXOUTE));                             /* Enable OUT interrupt */
90
91 //      ao_usb_dump_ep(0);
92         ao_usb_addr_pending = 0;
93 }
94
95 static void
96 ao_usb_set_configuration(void)
97 {
98         /* Set the IN max packet size, double buffered */
99         UENUM = AO_USB_IN_EP;
100         UECONX = (1 << EPEN);                                   /* Enable */
101
102         UECFG0X = ((2 << EPTYPE0) |                             /* Bulk */
103                    (1 << EPDIR));                               /* In */
104
105         UECFG1X = (EP_SIZE(AO_USB_IN_SIZE) |                    /* Size */
106                    (1 << EPBK0) |                               /* Double bank */
107                    (1 << ALLOC));                               /* Allocate */
108
109 #if 0
110         UEIENX = ((1 << TXINE));                                /* Enable IN complete interrupt */
111 #endif
112
113         ao_usb_dump_ep(AO_USB_IN_EP);
114
115         /* Set the OUT max packet size, double buffered */
116         UENUM = AO_USB_OUT_EP;
117         UECONX |= (1 << EPEN);                                  /* Enable */
118
119         UECFG0X = ((2 << EPTYPE0) |                             /* Bulk */
120                    (0 << EPDIR));                               /* Out */
121
122         UECFG1X = (EP_SIZE(AO_USB_OUT_SIZE) |                   /* Size */
123                    (1 << EPBK0) |                               /* Double bank */
124                    (1 << ALLOC));                               /* Allocate */
125
126         UEIENX = ((1 << RXOUTE));                               /* Enable OUT complete interrupt */
127
128         ao_usb_dump_ep(AO_USB_OUT_EP);
129         ao_usb_running = 1;
130 }
131
132 ISR(USB_GEN_vect)
133 {
134         ao_wakeup(&ao_usb_task);
135 }
136
137
138 __xdata static struct ao_usb_line_coding ao_usb_line_coding = {115200, 0, 0, 8};
139
140 /* Walk through the list of descriptors and find a match
141  */
142 static void
143 ao_usb_get_descriptor(uint16_t value)
144 {
145         const uint8_t           *__xdata descriptor;
146         __xdata uint8_t         type = value >> 8;
147         __xdata uint8_t         index = value;
148
149         descriptor = ao_usb_descriptors;
150         while (descriptor[0] != 0) {
151                 if (descriptor[1] == type && index-- == 0) {
152                         if (type == AO_USB_DESC_CONFIGURATION)
153                                 ao_usb_ep0_in_len = descriptor[2];
154                         else
155                                 ao_usb_ep0_in_len = descriptor[0];
156                         ao_usb_ep0_in_data = descriptor;
157                         break;
158                 }
159                 descriptor += descriptor[0];
160         }
161 }
162
163 static void
164 ao_usb_ep0_set_in_pending(uint8_t in_pending)
165 {
166         ao_usb_ep0_in_pending = in_pending;
167
168         if (in_pending)
169                 ueienx_0 = ((1 << RXSTPE) | (1 << RXOUTE) | (1 << TXINE));      /* Enable IN interrupt */
170 }
171
172 /* Send an IN data packet */
173 static void
174 ao_usb_ep0_flush(void)
175 {
176         __xdata uint8_t this_len;
177
178         cli();
179         UENUM = 0;
180         if (!(UEINTX & (1 << TXINI))) {
181                 debug("EP0 not accepting IN data\n");
182                 ao_usb_ep0_set_in_pending(1);
183         } else {
184                 this_len = ao_usb_ep0_in_len;
185                 if (this_len > AO_USB_CONTROL_SIZE)
186                         this_len = AO_USB_CONTROL_SIZE;
187
188                 ao_usb_ep0_in_len -= this_len;
189
190                 /* Set IN interrupt enable */
191                 if (ao_usb_ep0_in_len == 0 && this_len != AO_USB_CONTROL_SIZE)
192                         ao_usb_ep0_set_in_pending(0);
193                 else
194                         ao_usb_ep0_set_in_pending(1);
195
196                 debug ("Flush EP0 len %d:", this_len);
197                 while (this_len--) {
198                         uint8_t c = *ao_usb_ep0_in_data++;
199                         debug(" %02x", c);
200                         UEDATX = c;
201                 }
202                 debug ("\n");
203
204                 /* Clear the TXINI bit to send the packet */
205                 UEINTX &= ~(1 << TXINI);
206         }
207         sei();
208 }
209
210 /* Read data from the ep0 OUT fifo */
211 static void
212 ao_usb_ep0_fill(uint8_t len, uint8_t ack)
213 {
214         if (len > ao_usb_ep0_out_len)
215                 len = ao_usb_ep0_out_len;
216         ao_usb_ep0_out_len -= len;
217
218 //      debug ("EP0 UEINTX %02x UEBCLX %d UEBCHX %d\n",
219 //              UEINTX, UEBCLX, UEBCHX);
220         /* Pull all of the data out of the packet */
221         debug ("Fill EP0 len %d:", len);
222         UENUM = 0;
223         while (len--) {
224                 uint8_t c = UEDATX;
225                 *ao_usb_ep0_out_data++ = c;
226                 debug (" %02x", c);
227         }
228         debug ("\n");
229
230         /* ACK the packet */
231         UEINTX &= ~ack;
232 }
233
234 void
235 ao_usb_ep0_queue_byte(uint8_t a)
236 {
237         ao_usb_ep0_in_buf[ao_usb_ep0_in_len++] = a;
238 }
239
240 static void
241 ao_usb_ep0_setup(void)
242 {
243         /* Pull the setup packet out of the fifo */
244         ao_usb_ep0_out_data = (__xdata uint8_t *) &ao_usb_setup;
245         ao_usb_ep0_out_len = 8;
246         ao_usb_ep0_fill(8, (1 << RXSTPI) | (1 << RXOUTI) | (1 << TXINI));
247         if (ao_usb_ep0_out_len != 0) {
248                 debug ("invalid setup packet length\n");
249                 return;
250         }
251
252         /* Figure out how to ACK the setup packet */
253         if (ao_usb_setup.dir_type_recip & AO_USB_DIR_IN) {
254                 if (ao_usb_setup.length)
255                         ao_usb_ep0_state = AO_USB_EP0_DATA_IN;
256                 else
257                         ao_usb_ep0_state = AO_USB_EP0_IDLE;
258         } else {
259                 if (ao_usb_setup.length)
260                         ao_usb_ep0_state = AO_USB_EP0_DATA_OUT;
261                 else
262                         ao_usb_ep0_state = AO_USB_EP0_IDLE;
263         }
264 /*
265         UENUM = 0;
266         if (ao_usb_ep0_state == AO_USB_EP0_IDLE)
267                 USBCS0 = USBCS0_CLR_OUTPKT_RDY | USBCS0_DATA_END;
268         else
269                 USBCS0 = USBCS0_CLR_OUTPKT_RDY;
270 */
271
272         ao_usb_ep0_in_data = ao_usb_ep0_in_buf;
273         ao_usb_ep0_in_len = 0;
274         switch(ao_usb_setup.dir_type_recip & AO_USB_SETUP_TYPE_MASK) {
275         case AO_USB_TYPE_STANDARD:
276                 debug ("Standard setup packet\n");
277                 switch(ao_usb_setup.dir_type_recip & AO_USB_SETUP_RECIP_MASK) {
278                 case AO_USB_RECIP_DEVICE:
279                         debug ("Device setup packet\n");
280                         switch(ao_usb_setup.request) {
281                         case AO_USB_REQ_GET_STATUS:
282                                 debug ("get status\n");
283                                 ao_usb_ep0_queue_byte(0);
284                                 ao_usb_ep0_queue_byte(0);
285                                 break;
286                         case AO_USB_REQ_SET_ADDRESS:
287                                 debug ("set address %d\n", ao_usb_setup.value);
288                                 ao_usb_set_address(ao_usb_setup.value);
289                                 break;
290                         case AO_USB_REQ_GET_DESCRIPTOR:
291                                 debug ("get descriptor %d\n", ao_usb_setup.value);
292                                 ao_usb_get_descriptor(ao_usb_setup.value);
293                                 break;
294                         case AO_USB_REQ_GET_CONFIGURATION:
295                                 debug ("get configuration %d\n", ao_usb_configuration);
296                                 ao_usb_ep0_queue_byte(ao_usb_configuration);
297                                 break;
298                         case AO_USB_REQ_SET_CONFIGURATION:
299                                 ao_usb_configuration = ao_usb_setup.value;
300                                 debug ("set configuration %d\n", ao_usb_configuration);
301                                 ao_usb_set_configuration();
302                                 break;
303                         }
304                         break;
305                 case AO_USB_RECIP_INTERFACE:
306                         debug ("Interface setup packet\n");
307                         switch(ao_usb_setup.request) {
308                         case AO_USB_REQ_GET_STATUS:
309                                 ao_usb_ep0_queue_byte(0);
310                                 ao_usb_ep0_queue_byte(0);
311                                 break;
312                         case AO_USB_REQ_GET_INTERFACE:
313                                 ao_usb_ep0_queue_byte(0);
314                                 break;
315                         case AO_USB_REQ_SET_INTERFACE:
316                                 break;
317                         }
318                         break;
319                 case AO_USB_RECIP_ENDPOINT:
320                         debug ("Endpoint setup packet\n");
321                         switch(ao_usb_setup.request) {
322                         case AO_USB_REQ_GET_STATUS:
323                                 ao_usb_ep0_queue_byte(0);
324                                 ao_usb_ep0_queue_byte(0);
325                                 break;
326                         }
327                         break;
328                 }
329                 break;
330         case AO_USB_TYPE_CLASS:
331                 debug ("Class setup packet\n");
332                 switch (ao_usb_setup.request) {
333                 case AO_USB_SET_LINE_CODING:
334                         debug ("set line coding\n");
335                         ao_usb_ep0_out_len = 7;
336                         ao_usb_ep0_out_data = (__xdata uint8_t *) &ao_usb_line_coding;
337                         break;
338                 case AO_USB_GET_LINE_CODING:
339                         debug ("get line coding\n");
340                         ao_usb_ep0_in_len = 7;
341                         ao_usb_ep0_in_data = (uint8_t *) &ao_usb_line_coding;
342                         break;
343                 case AO_USB_SET_CONTROL_LINE_STATE:
344                         break;
345                 }
346                 break;
347         }
348         if (ao_usb_ep0_state != AO_USB_EP0_DATA_OUT) {
349                 if (ao_usb_setup.length < ao_usb_ep0_in_len)
350                         ao_usb_ep0_in_len = ao_usb_setup.length;
351                 debug ("Start ep0 in delivery %d\n", ao_usb_ep0_in_len);
352                 ao_usb_ep0_set_in_pending(1);
353         }
354 }
355
356 /* End point 0 receives all of the control messages. */
357 static void
358 ao_usb_ep0(void)
359 {
360         uint8_t intx, udint;
361
362         debug ("usb task started\n");
363         ao_usb_ep0_state = AO_USB_EP0_IDLE;
364         for (;;) {
365                 cli();
366                 for (;;) {
367                         udint = UDINT;
368                         UDINT = 0;
369 //                      debug ("UDINT %02x\n", udint);
370                         if (udint & (1 << EORSTI)) {
371                                 ao_usb_configuration = 0;
372                                 ao_usb_set_ep0();
373                         }
374                         UENUM = 0;
375                         intx = UEINTX;
376 //                      debug ("UEINTX %02x\n", intx);
377                         if (intx & ((1 << RXSTPI) | (1 << RXOUTI)))
378                                 break;
379                         if ((intx & (1 << TXINI))) {
380                                 if (ao_usb_ep0_in_pending)
381                                         break;
382                                 else
383                                 {
384                                         if (ao_usb_addr_pending) {
385                                                 UDADDR |= (1 << ADDEN);
386                                                 ao_usb_addr_pending = 0;
387                                         }
388                                         ueienx_0 = ((1 << RXSTPE) | (1 << RXOUTE));     /* Disable IN interrupt */
389                                 }
390                         }
391 //                      debug ("usb task sleeping...\n");
392                         UENUM = 0;
393                         UEIENX = ueienx_0;
394                         ao_sleep(&ao_usb_task);
395                 }
396                 sei();
397 //              debug ("UEINTX for ep0 is %02x\n", intx);
398                 if (intx & (1 << RXSTPI)) {
399                         ao_usb_ep0_setup();
400                 }
401                 if (intx & (1 << RXOUTI)) {
402                         ao_usb_ep0_fill(UEBCLX, (1 << RXOUTI));
403                         ao_usb_ep0_set_in_pending(1);
404                 }
405                 if (intx & (1 << TXINI) && ao_usb_ep0_in_pending) {
406                         debug ("continue sending ep0 IN data\n");
407                         ao_usb_ep0_flush();
408                 }
409         }
410 }
411
412 /* Wait for a free IN buffer */
413 static void
414 ao_usb_in_wait(void)
415 {
416         for (;;) {
417                 /* Check if the current buffer is writable */
418                 UENUM = AO_USB_IN_EP;
419                 if (UEINTX & (1 << RWAL))
420                         break;
421
422                 cli();
423                 /* Wait for an IN buffer to be ready */
424                 for (;;) {
425                         UENUM = AO_USB_IN_EP;
426                         if ((UEINTX & (1 << TXINI)))
427                                 break;
428                         UEIENX = (1 << TXINE);
429                         ao_sleep(&ao_usb_in_flushed);
430                 }
431                 /* Ack the interrupt */
432                 UEINTX &= ~(1 << TXINI);
433                 sei();
434         }
435 }
436
437 /* Queue the current IN buffer for transmission */
438 static void
439 ao_usb_in_send(void)
440 {
441         UENUM = AO_USB_IN_EP;
442         UEINTX &= ~(1 << FIFOCON);
443 }
444
445 void
446 ao_usb_flush(void) __critical
447 {
448         if (!ao_usb_running)
449                 return;
450
451         /* Anytime we've sent a character since
452          * the last time we flushed, we'll need
453          * to send a packet -- the only other time
454          * we would send a packet is when that
455          * packet was full, in which case we now
456          * want to send an empty packet
457          */
458         if (!ao_usb_in_flushed) {
459                 ao_usb_in_flushed = 1;
460                 ao_usb_in_wait();
461                 ao_usb_in_send();
462         }
463 }
464
465 void
466 ao_usb_putchar(char c) __critical __reentrant
467 {
468         if (!ao_usb_running)
469                 return;
470
471         ao_usb_in_wait();
472
473         /* Queue a byte */
474         UENUM = AO_USB_IN_EP;
475         UEDATX = c;
476
477         /* Send the packet when full */
478         if ((UEINTX & (1 << RWAL)) == 0)
479                 ao_usb_in_send();
480         ao_usb_in_flushed = 0;
481 }
482
483 static char
484 _ao_usb_pollchar(void)
485 {
486         char c;
487         uint8_t intx;
488
489         if (!ao_usb_running)
490                 return AO_READ_AGAIN;
491
492         for (;;) {
493                 UENUM = AO_USB_OUT_EP;
494                 intx = UEINTX;
495                 debug("usb_pollchar UEINTX %02d\n", intx);
496                 if (intx & (1 << RWAL))
497                         break;
498
499                 if (intx & (1 << FIFOCON)) {
500                         /* Ack the last packet */
501                         UEINTX = (uint8_t) ~(1 << FIFOCON);
502                 }
503
504                 /* Check to see if a packet has arrived */
505                 if ((intx & (1 << RXOUTI)) == 0) {
506                         UENUM = AO_USB_OUT_EP;
507                         UEIENX = (1 << RXOUTE);
508                         return AO_READ_AGAIN;
509                 }
510
511                 /* Ack the interrupt */
512                 UEINTX = ~(1 << RXOUTI);
513         }
514
515         /* Pull a character out of the fifo */
516         c = UEDATX;
517         return c;
518 }
519
520 char
521 ao_usb_pollchar(void)
522 {
523         char    c;
524         cli();
525         c = _ao_usb_pollchar();
526         sei();
527         return c;
528 }
529
530 char
531 ao_usb_getchar(void) __critical
532 {
533         char    c;
534
535         cli();
536         while ((c = _ao_usb_pollchar()) == AO_READ_AGAIN)
537                 ao_sleep(&ao_stdin_ready);
538         sei();
539         return c;
540 }
541
542 uint16_t        control_count;
543 uint16_t        in_count;
544 uint16_t        out_count;
545
546 /* Endpoint interrupt */
547 ISR(USB_COM_vect)
548 {
549         uint8_t old_num = UENUM;
550         uint8_t i = UEINT;
551
552 #ifdef AO_LED_RED
553         ao_led_toggle(AO_LED_RED);
554 #endif
555         UEINT = 0;
556         if (i & (1 << 0)) {
557                 UENUM = 0;
558                 UEIENX = 0;
559                 ao_wakeup(&ao_usb_task);
560                 ++control_count;
561         }
562         if (i & (1 << AO_USB_IN_EP)) {
563                 UENUM = AO_USB_IN_EP;
564                 UEIENX = 0;
565                 ao_wakeup(&ao_usb_in_flushed);
566                 in_count++;
567         }
568         if (i & (1 << AO_USB_OUT_EP)) {
569                 UENUM = AO_USB_OUT_EP;
570                 UEIENX = 0;
571                 ao_wakeup(&ao_stdin_ready);
572                 ++out_count;
573         }
574         UENUM = old_num;
575 }
576
577 #if AVR_VCC_5V
578 #define AO_PAD_REGULATOR_INIT   (1 << UVREGE)   /* Turn on pad regulator */
579 #endif
580 #if AVR_VCC_3V3
581 /* TeleScience V0.1 has a hardware bug -- UVcc is hooked up, but UCap is not
582  * Make this work by running power through UVcc to the USB system
583  */
584 #define AO_PAD_REGULATOR_INIT   (1 << UVREGE)   /* Turn off pad regulator */
585 #endif
586
587 #if AVR_CLOCK == 16000000UL
588 #define AO_USB_PLL_INPUT_PRESCALER      (1 << PINDIV)   /* Divide 16MHz clock by 2 */
589 #endif
590 #if AVR_CLOCK == 8000000UL
591 #define AO_USB_PLL_INPUT_PRESCALER      0               /* Don't divide clock */
592 #endif
593
594 void
595 ao_usb_disable(void)
596 {
597         /* Unplug from the bus */
598         UDCON = (1 << DETACH);
599
600         /* Disable the interface */
601         USBCON = 0;
602
603         /* Disable the PLL */
604         PLLCSR = 0;
605
606         /* Turn off the pad regulator */
607         UHWCON = 0;
608 }
609
610 #define AO_USB_CON ((1 << USBE) |       /* USB enable */ \
611                     (0 << RSTCPU) |     /* do not reset CPU */  \
612                     (0 << LSM) |        /* Full speed mode */   \
613                     (0 << RMWKUP))      /* no remote wake-up */ \
614
615 void
616 ao_usb_enable(void)
617 {
618         /* Configure pad regulator */
619         UHWCON = AO_PAD_REGULATOR_INIT;
620
621         /* Enable USB device, but freeze the clocks until initialized */
622         USBCON = AO_USB_CON | (1 <<FRZCLK);
623
624         /* Enable PLL with appropriate divider */
625         PLLCSR = AO_USB_PLL_INPUT_PRESCALER | (1 << PLLE);
626
627         /* Wait for PLL to lock */
628         loop_until_bit_is_set(PLLCSR, (1 << PLOCK));
629
630         /* Enable USB, enable the VBUS pad */
631         USBCON = AO_USB_CON | (1 << OTGPADE);
632
633         /* Enable global interrupts */
634         UDIEN = (1 << EORSTE);          /* End of reset interrupt */
635
636         ao_usb_configuration = 0;
637
638         debug ("ao_usb_enable\n");
639
640         debug ("UHWCON %02x USBCON %02x PLLCSR %02x UDIEN %02x\n",
641                UHWCON, USBCON, PLLCSR, UDIEN);
642         UDCON = (0 << DETACH);  /* Clear the DETACH bit to plug into the bus */
643 }
644
645 #if USB_DEBUG
646 struct ao_task __xdata ao_usb_echo_task;
647
648 static void
649 ao_usb_echo(void)
650 {
651         char    c;
652
653         for (;;) {
654                 c = ao_usb_getchar();
655                 ao_usb_putchar(c);
656                 ao_usb_flush();
657         }
658 }
659 #endif
660
661 static void
662 ao_usb_irq(void)
663 {
664         printf ("control: %d out: %d in: %d\n",
665                 control_count, out_count, in_count);
666 }
667
668 __code struct ao_cmds ao_usb_cmds[] = {
669         { ao_usb_irq, "i\0Show USB interrupt counts" },
670         { 0, NULL }
671 };
672
673 void
674 ao_usb_init(void)
675 {
676         ao_usb_enable();
677
678         debug ("ao_usb_init\n");
679         ao_add_task(&ao_usb_task, ao_usb_ep0, "usb");
680 #if USB_DEBUG
681         ao_add_task(&ao_usb_echo_task, ao_usb_echo, "usb echo");
682 #endif
683         ao_cmd_register(&ao_usb_cmds[0]);
684         ao_add_stdio(ao_usb_pollchar, ao_usb_putchar, ao_usb_flush);
685 }