Base code for dtplug : Core, drivers, lib and some external drivers.
[dtplug] / include / drivers / usbcore.h
1 /****************************************************************************
2  *   drivers/usbcore.h
3  *
4  * Copyright 2012 Nathael Pajani <nathael.pajani@ed3l.fr>
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  *
19  *************************************************************************** */
21 /*
22  * USB driver for the DTPlug.
23  *
24  * This driver enables the DTPlug to be seen as a serial port when connected to a
25  * computer. It has the minimal number of endpoints defined, and does not use
26  * DMA.
27  */
29 #ifndef DRIVERS_USBCORE_H
30 #define DRIVERS_USBCORE_H
32 #include <stdint.h>
35 /***************************************************************************** */
36 /*   USB core exported functions                                               */
37 /***************************************************************************** */
39 /* Setup all USB pins according to their function for the DTPlug */
40 void set_usb_pins(void);
42 /* Setup USB
43  *  calls usb_clk_on to configure PLL1 and turn on USB Clock
44  *  enable the clocks to the USB block and AHB master
45  *  and set_usb_pins to setup USB pins
46  */
47 void usb_on(void);
49 /* Reset USB sub-system */
50 void usb_reset(uint32_t usb_ctrl_endpoint_max_pkt_size);
52 /* Start USB sub-system
53  *  usb_on() MUST have been called, or the USB subsystem is not powered and PLL is not set
54  *  usb_start() calls usb_reset() (among others).
55  */
56 void usb_start(uint32_t usb_ctrl_endpoint_max_pkt_size);
58 /* This will activate the Good link (UP_LED signal) indicator */
59 void usb_dev_set_configured(void);
61 /* USB soft connect
62  * Connect / disconnect can be done by software by setting the CON Bit
63  *   using the SIE Set Device Status command
64  */
65 void usb_connect(void);
67 /* Set device address */
68 void usb_set_address(uint8_t addr);
71 /* Read data from an endpoint
72  * ep_num is the logical endpoint number
73  * buf is a data buffer big enougth for this endpoint's max packet size, and MUST be word
74  *    aligned
75  * isochronous can be set for isochronous endpoints to skip the clear buffer.
76  */
77 uint32_t usb_ep_read(uint8_t ep_num, char* buf, uint8_t isochronous);
79 /* Write data to an endpoint
80  * ep_num is the logical endpoint number
81  */
82 uint32_t usb_ep_write(uint8_t ep_num, char* buf, uint32_t length);
85 /* Activate and configure an endpoint
86  *    ep_num is the logical endpoint number
87  *    dir is either USB_DIR_IN or USB_DIR_OUT
88  */
89 void usb_endpoint_realize(uint32_t ep_num, uint32_t max_packet_size, int dir);
91 /* Deactivate an endpoint, see usb_endpoint_realize() for comments */
92 void usb_endpoint_remove(uint32_t ep_num, int dir);
94 /* Reset USB endpoint / Enable USB endpoint / Un-Stall USB endpoint
95  * ep_num is logical endpoint number
96  */
97 void usb_endpoint_reset(uint32_t ep_num, int dir);
98 #define usb_endpoint_enable usb_endpoint_reset
99 #define usb_endpoint_unstall usb_endpoint_reset
101 /* Disable USB endpoint
102  * ep_num is logical endpoint number
103  */
104 void usb_endpoint_disable(uint32_t ep_num, int dir);
106 /* Stall USB endpoint
107  * ep_num is logical endpoint number
108  */
109 void usb_endpoint_stall(uint32_t ep_num, int dir);
111 /* Return 1 when USB endpoint is halted */
112 uint8_t usb_endpoint_halted(uint32_t ep_num, int dir);
115 #endif /* DRIVERS_USBCORE_H */