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