1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
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 ****************************************************************************/
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
);
39 void usb_benchmark_init(void)
46 void usb_benchmark_control_request(struct usb_ctrlrequest
* req
)
49 //usb_max_pkt_size = sizeof _input_buffer;
50 usb_max_pkt_size
= 64;
52 switch (req
->bRequest
) {
55 current_length
= req
->wValue
* req
->wIndex
;
56 logf("bench: read %d", current_length
);
57 todo
= MIN(usb_max_pkt_size
, current_length
);
59 usb_drv_reset_endpoint(EP_TX
, true);
60 usb_drv_send(EP_TX
, &input_buffer
, todo
);
61 current_length
-= todo
;
66 current_length
= req
->wValue
* req
->wIndex
;
67 logf("bench: write %d", current_length
);
69 usb_drv_reset_endpoint(EP_RX
, false);
70 usb_drv_recv(EP_RX
, &input_buffer
, sizeof _input_buffer
);
75 void usb_benchmark_transfer_complete(int endpoint
, bool in
)
79 /* see what remains to transfer */
80 if (current_length
== 0) {
83 return; /* we're done */
89 int todo
= MIN(usb_max_pkt_size
, current_length
);
90 if (endpoint
== EP_RX
) {
91 logf("unexpected ep_rx");
95 logf("bench: %d more tx", current_length
);
96 usb_drv_send(EP_TX
, &input_buffer
, todo
);
97 current_length
-= todo
;
103 if (endpoint
== EP_TX
) {
104 logf("unexpected ep_tx");
108 /* re-prime endpoint */
109 usb_drv_recv(EP_RX
, &input_buffer
, sizeof _input_buffer
);
119 static void ack_control(struct usb_ctrlrequest
* req
)
121 if (req
->bRequestType
& 0x80)
122 usb_drv_recv(EP_CONTROL
, NULL
, 0);
124 usb_drv_send(EP_CONTROL
, NULL
, 0);