New USB stack
[kugel-rb.git] / firmware / usbstack / usb_benchmark.c
bloba6e0e2d3e77bab8c8b326059a404f50a7f893c10
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id: $
10 * Copyright (C) 2007 by Björn Stenberg
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
19 #include "system.h"
20 #include "usb_core.h"
21 #include "usb_drv.h"
22 //#define LOGF_ENABLE
23 #include "logf.h"
25 static int current_length;
27 static unsigned char _input_buffer[16384];
28 static unsigned char* input_buffer = USB_IRAM_ORIGIN + 1024;
30 static void ack_control(struct usb_ctrlrequest* req);
32 static enum {
33 IDLE,
34 SENDING,
35 RECEIVING
36 } state = IDLE;
39 void usb_benchmark_init(void)
41 int i;
42 for (i=0; i<128; i++)
43 input_buffer[i] = i;
46 void usb_benchmark_control_request(struct usb_ctrlrequest* req)
48 int todo;
49 //usb_max_pkt_size = sizeof _input_buffer;
50 usb_max_pkt_size = 64;
52 switch (req->bRequest) {
53 case 1: /* read */
54 ack_control(req);
55 current_length = req->wValue * req->wIndex;
56 logf("bench: read %d", current_length);
57 todo = MIN(usb_max_pkt_size, current_length);
58 state = SENDING;
59 usb_drv_reset_endpoint(EP_TX, true);
60 usb_drv_send(EP_TX, &input_buffer, todo);
61 current_length -= todo;
62 break;
64 case 2: /* write */
65 ack_control(req);
66 current_length = req->wValue * req->wIndex;
67 logf("bench: write %d", current_length);
68 state = RECEIVING;
69 usb_drv_reset_endpoint(EP_RX, false);
70 usb_drv_recv(EP_RX, &input_buffer, sizeof _input_buffer);
71 break;
75 void usb_benchmark_transfer_complete(int endpoint, bool in)
77 (void)in;
79 /* see what remains to transfer */
80 if (current_length == 0) {
81 logf("we're done");
82 state = IDLE;
83 return; /* we're done */
86 switch (state)
88 case SENDING: {
89 int todo = MIN(usb_max_pkt_size, current_length);
90 if (endpoint == EP_RX) {
91 logf("unexpected ep_rx");
92 break;
95 logf("bench: %d more tx", current_length);
96 usb_drv_send(EP_TX, &input_buffer, todo);
97 current_length -= todo;
98 input_buffer[0]++;
99 break;
102 case RECEIVING:
103 if (endpoint == EP_TX) {
104 logf("unexpected ep_tx");
105 break;
108 /* re-prime endpoint */
109 usb_drv_recv(EP_RX, &input_buffer, sizeof _input_buffer);
110 input_buffer[0]++;
111 break;
113 default:
114 break;
119 static void ack_control(struct usb_ctrlrequest* req)
121 if (req->bRequestType & 0x80)
122 usb_drv_recv(EP_CONTROL, NULL, 0);
123 else
124 usb_drv_send(EP_CONTROL, NULL, 0);