1 /*
2 * Copyright (c) 2015 Brian Swetland
3 *
4 * Use of this source code is governed by a MIT-style
5 * license that can be found in the LICENSE file or at
6 * https://opensource.org/licenses/MIT
7 */
8
9
10 #include <app.h>
11 #include <lk/debug.h>
12 #include <string.h>
13 #include <stdlib.h>
14 #include <printf.h>
15 #include <dev/udc.h>
16
17 udc_request_t *txreq;
18 udc_request_t *rxreq;
19 udc_endpoint_t *txept;
20 udc_endpoint_t *rxept;
21
22 static char rxbuf[4096];
23
rx_complete(udc_request_t * req,unsigned actual,int status)24 static void rx_complete(udc_request_t *req, unsigned actual, int status) {
25 //printf("rx done %d %d\n", actual, status);
26 if (status == 0) {
27 udc_request_queue(rxept, rxreq);
28 }
29 }
30
tx_complete(udc_request_t * req,unsigned actual,int status)31 static void tx_complete(udc_request_t *req, unsigned actual, int status) {
32 //printf("tx done %d %d\n", actual, status);
33 if (status == 0) {
34 udc_request_queue(txept, txreq);
35 }
36 }
37
udctest_notify(udc_gadget_t * gadget,unsigned event)38 static void udctest_notify(udc_gadget_t *gadget, unsigned event) {
39 printf("event %d\n", event);
40 if (event == UDC_EVENT_ONLINE) {
41 udc_request_queue(rxept, rxreq);
42 udc_request_queue(txept, txreq);
43 }
44 }
45
46 static udc_device_t udctest_device = {
47 .vendor_id = 0x18d1,
48 .product_id = 0xdb01,
49 .version_id = 0x0100,
50 .manufacturer = "Frobozz Magic USB Device Company",
51 .product = "Frobozzco USB Device",
52 .serialno = "00000005",
53 };
54
55 static udc_endpoint_t *udctest_endpoints[2];
56
57 static udc_gadget_t udctest_gadget = {
58 .notify = udctest_notify,
59 .ifc_class = 0xFF,
60 .ifc_subclass = 0x42,
61 .ifc_protocol = 0x01,
62 .ifc_endpoints = 2,
63 .ifc_string = "string",
64 .ept = udctest_endpoints,
65 };
66
udctest_init(const struct app_descriptor * app)67 static void udctest_init(const struct app_descriptor *app) {
68 printf("usbtest_init()\n");
69 udc_init(&udctest_device);
70 udctest_endpoints[0] = txept = udc_endpoint_alloc(UDC_BULK_IN, 512);
71 udctest_endpoints[1] = rxept = udc_endpoint_alloc(UDC_BULK_OUT, 512);
72 txreq = udc_request_alloc();
73 rxreq = udc_request_alloc();
74 rxreq->buffer = rxbuf;
75 rxreq->length = sizeof(rxbuf);
76 rxreq->complete = rx_complete;
77 txreq->buffer = rxbuf;
78 txreq->length = sizeof(rxbuf);
79 txreq->complete = tx_complete;
80 udc_register_gadget(&udctest_gadget);
81 }
82
udctest_entry(const struct app_descriptor * app,void * args)83 static void udctest_entry(const struct app_descriptor *app, void *args) {
84 printf("udctest_entry()\n");
85 udc_start();
86 }
87
88 APP_START(usbtest)
89 .init = udctest_init,
90 .entry = udctest_entry,
91 APP_END
92
93
94