4 * This file is part of BeRTOS.
6 * Bertos 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.
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.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 * As a special exception, you may use this file as part of a free software
21 * library without restriction. Specifically, if other files instantiate
22 * templates or use macros or inline functions from this file, or you compile
23 * this file and link it with other files to produce an executable, this
24 * file does not by itself cause the resulting executable to be covered by
25 * the GNU General Public License. This exception does not however
26 * invalidate any other reasons why the executable file might be covered by
27 * the GNU General Public License.
29 * Copyright 2010 Develer S.r.l. (http://www.develer.com/)
33 * \author Andrea Righi <arighi@develer.com>
35 * \brief STM32: USB full-speed device driver
37 * Low-level USB device driver for the STM32 architecture.
43 #include <cfg/compiler.h>
46 #define USB_BASE_ADDR 0x40005C00
48 #define USB_DM_PIN (1 << 11)
49 #define USB_DP_PIN (1 << 12)
50 #define USB_DISC_PIN (1 << 11)
52 #define USB_EP0_MAX_SIZE 8
53 #define USB_RX_MAX_SIZE 64
54 #define USB_TX_MAX_SIZE 64
56 /* USB packet memory organization */
57 #define USB_PACKET_MEMORY_BASE 0x40006000
58 #define USB_PACKET_MEMORY_SIZE 512
60 /* Offset of the buffer descriptor table inside the packet memory */
61 #define USB_BDT_OFFSET \
62 ((USB_PACKET_MEMORY_SIZE - (sizeof(stm32_usb_bd_t) * ENP_MAX_NUMB)) & ~7)
64 #define addr2usbmem(Offset) \
65 (USB_PACKET_MEMORY_BASE + ((Offset << 1) & ~3) + (Offset & 1))
67 #define ReadEpDTB(Slot, Offset) \
68 (*((uint16_t *)(addr2usbmem((USB_BDT_OFFSET + \
69 (Slot) * sizeof(stm32_usb_bd_t) + \
72 #define WriteEpDTB(Slot, Offset, Data) (ReadEpDTB(Slot, Offset) = Data)
74 #define AddrTxOffset 0
75 #define CountTxOffset 2
76 #define AddrRxOffset 4
77 #define CountRxOffset 6
79 #define ReadEpDTB_AddrRx(Slot) ReadEpDTB(Slot,AddrRxOffset)
80 #define ReadEpDTB_CountRx(Slot) ReadEpDTB(Slot,CountRxOffset)
81 #define ReadEpDTB_AddrTx(Slot) ReadEpDTB(Slot,AddrTxOffset)
82 #define ReadEpDTB_CountTx(Slot) ReadEpDTB(Slot,CountTxOffset)
84 #define WriteEpDTB_AddrRx(Slot,Data) WriteEpDTB(Slot,AddrRxOffset,Data)
85 #define WriteEpDTB_CountRx(Slot,Data) WriteEpDTB(Slot,CountRxOffset,Data)
86 #define WriteEpDTB_AddrTx(Slot,Data) WriteEpDTB(Slot,AddrTxOffset,Data)
87 #define WriteEpDTB_CountTx(Slot,Data) WriteEpDTB(Slot,CountTxOffset,Data)
89 #define USB_CTRL_RW_MASK 0x070F
90 #define USB_CTRL_CLEAR_ONLY_MASK 0x8080
91 #define USB_CTRL_TOGGLE_MASK 0x7070
93 /* CNTR register flags */
95 #define bmPMAOVRM 0x4000
97 #define bmWKUPM 0x1000
98 #define bmSUSPM 0x0800
99 #define bmRESETM 0x0400
100 #define bmSOFM 0x0200
101 #define bmESOFM 0x0100
103 #define bmRESUME 0x0010
104 #define bmFSUSP 0x0008
105 #define bmLPMODE 0x0004
106 #define bmPDWN 0x0002
107 #define bmFRES 0x0001
109 /* USB error codes */
122 /* STM32 USB endpoint types */
123 enum stm32_usb_ep_type
133 /* STM32 USB interrupt status register bits */
151 } PACKED stm32_usb_irq_status_t;
162 /* STM32 USB supported endpoints */
165 CTRL_ENP_OUT = 0, CTRL_ENP_IN,
183 } stm32_usb_endpoint_t;
185 /* STM32 USB packet memory slot */
186 typedef struct pack_mem_slot_t
188 stm32_usb_endpoint_t ep_addr;
191 struct pack_mem_slot_t *next;
194 /* STM32 USB buffer descriptor (packet memory) */
201 } PACKED stm32_usb_bd_t;
203 /* STM32 USB endpoint I/O status */
214 } stm32_usb_io_status_t;
216 /* STM32 USB hardware endpoint descriptor */
221 void (*complete)(int);
225 stm32_usb_io_status_t status;
228 uint8_t *read_buffer;
229 const uint8_t *write_buffer;
235 /* STM32 USB hardware endpoint flags */
236 #define STM32_USB_EP_AVAIL_DATA BV(0)
237 #define STM32_USB_EP_ZERO_PACKET BV(1)
238 #define STM32_USB_EP_ZERO_POSSIBLE BV(2)
240 #endif /* USB_STM32_H */