diff options
author | laforge <laforge@6dc7ffe9-61d6-0310-9af1-9938baff3ed1> | 2006-09-22 21:41:22 +0000 |
---|---|---|
committer | laforge <laforge@6dc7ffe9-61d6-0310-9af1-9938baff3ed1> | 2006-09-22 21:41:22 +0000 |
commit | 706ffa9f3b986eff193377142459fbfde2362036 (patch) | |
tree | fbdb2d853265bf783db3a9eceebdded08efd297e /firmware/src/os/usb_benchmark.c | |
parent | 1c2b1d22016957bebe0a49c9069b85815f7cf936 (diff) |
- move large rctx definitions to req_ctx.h
- add more fine-grained debugging macros in pcd_enumarate.c
- resolve race conditions between main-loop ep_refill and irq-triggered
ep_refill by adding one irq-[b]locking variant
- consolidate endpoint reset code into reset_ep()
- add code to handle correct transmission and reception of usb transfers
larger than endpoint size
- use new jump address (0x104000) in DFU Cstartup.S
- move main_usb to pcd subdirectory
- fix include/compile.h make dependencies
- make usb benchmark code use new large req_ctx
git-svn-id: https://svn.openpcd.org:2342/trunk@219 6dc7ffe9-61d6-0310-9af1-9938baff3ed1
Diffstat (limited to 'firmware/src/os/usb_benchmark.c')
-rw-r--r-- | firmware/src/os/usb_benchmark.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/firmware/src/os/usb_benchmark.c b/firmware/src/os/usb_benchmark.c index bfc6b37..967efbb 100644 --- a/firmware/src/os/usb_benchmark.c +++ b/firmware/src/os/usb_benchmark.c @@ -21,6 +21,7 @@ #include <string.h> #include <lib_AT91SAM7.h> #include <os/led.h> +#include <os/dbgu.h> #include <os/pcd_enumerate.h> #include <os/usb_handler.h> #include <os/req_ctx.h> @@ -49,18 +50,30 @@ static void usbtest_tx_transfer(unsigned int num_pkts) static int usbtest_rx(struct req_ctx *rctx) { struct openpcd_hdr *poh = (struct openpcd_hdr *) rctx->data; + struct req_ctx *rctx_new; int i; switch (poh->cmd) { case OPENPCD_CMD_USBTEST_IN: + DEBUGP("USBTEST_IN "); /* test bulk in pipe */ - for (i = 0; i < poh->reg; i++) { - usbtest_tx_transfer(poh->val); - led_toggle(2); + if (poh->val > RCTX_SIZE_LARGE/AT91C_EP_OUT_SIZE) + poh->val = RCTX_SIZE_LARGE/AT91C_EP_OUT_SIZE; + rctx_new = req_ctx_find_get(1, RCTX_STATE_FREE, + RCTX_STATE_MAIN_PROCESSING); + if (!rctx_new) { + DEBUGP("NO RCTX "); + return USB_ERR(0); } + + rctx_new->tot_len = poh->val * AT91C_EP_OUT_SIZE; + req_ctx_set_state(rctx_new, RCTX_STATE_UDP_EP2_PENDING); + led_toggle(2); break; case OPENPCD_CMD_USBTEST_OUT: + DEBUGP("USBTEST_IN "); /* test bulk out pipe */ + return USB_ERR(USB_ERR_CMD_NOT_IMPL); break; } |