mirror of
https://github.com/pascallanger/DIY-Multiprotocol-TX-Module.git
synced 2025-12-15 20:33:16 +00:00
Initial check-in for STM32 board
This commit is contained in:
63
BootLoaders/Boards/stm32/system/libmaple/usb/README
Normal file
63
BootLoaders/Boards/stm32/system/libmaple/usb/README
Normal file
@@ -0,0 +1,63 @@
|
||||
The USB submodule of libmaple is a separate piece of the codebase for
|
||||
reasons that are largely historical.
|
||||
|
||||
Current Status:
|
||||
|
||||
There's only support for the USB device peripheral found on
|
||||
STM32F103s.
|
||||
|
||||
We rely on the low level core library provided by ST to implement
|
||||
the USB transfer protocol for control endpoint transfers.
|
||||
|
||||
The virtual com port (which is exposed via
|
||||
<libmaple/usb_cdcacm.h>) serves two important purposes.
|
||||
|
||||
1) It allows serial data transfers between user sketches an a
|
||||
host computer.
|
||||
|
||||
2) It allows the host PC to issue a system reset into the DFU
|
||||
bootloader with the DTR + RTS + "1EAF" sequence (see
|
||||
leaflabs.com/docs/bootloader.html for more information on
|
||||
this).
|
||||
|
||||
After reset, Maple will run the DFU bootloader for a few seconds,
|
||||
during which the user can begin a DFU upload operation (uploads
|
||||
application binary into RAM/FLASH). Thus, without this virtual com
|
||||
port, it would be necessary to find an alternative means to reset
|
||||
the chip in order to enable the bootloader.
|
||||
|
||||
If you would like to develop your own USB application for whatever
|
||||
reason (e.g. to use faster isochronous enpoints for streaming
|
||||
audio, or implement the USB HID or Mass Storage specs), then
|
||||
ensure that you leave some hook for resetting Maple remotely in
|
||||
order to spin up the DFU bootloader. Please make sure to get
|
||||
yourself a unique vendor/product ID pair for your application, as
|
||||
some operating systems will assign a host-side driver based on
|
||||
these tags.
|
||||
|
||||
It would be possible to build a compound USB device, that
|
||||
implements endpoints for both the virtual COM port as well as some
|
||||
other components (mass storage etc.). However, this turns out to
|
||||
be a burden from the host driver side, as Windows and *nix handle
|
||||
compound USB devices quite differently.
|
||||
|
||||
Be mindful that enabling the USB peripheral isn't "free." The
|
||||
device must respond to periodic bus activity (every few
|
||||
milliseconds) by servicing an ISR. Therefore, the USB application
|
||||
should be disabled inside of timing critical applications.
|
||||
|
||||
In order to disconnect the device from the host, a USB_DISC pin is
|
||||
asserted (e.g. on Maple, this is PC12). Alternatively, the NVIC
|
||||
can be directly configured to disable the USB LP/HP IRQ's.
|
||||
|
||||
The files inside of usb_lib were provided by ST and are subject to
|
||||
their own license, all other files were written by the LeafLabs
|
||||
team and fall under the MIT license.
|
||||
|
||||
TODO:
|
||||
|
||||
- Generic USB driver core with series-provided backends, like
|
||||
libopencm3 has.
|
||||
- Strip out ST code.
|
||||
- Integration with a high level USB library (like LUFA/MyUSB) to
|
||||
allow users to write custom USB applications.
|
||||
45
BootLoaders/Boards/stm32/system/libmaple/usb/rules.mk
Normal file
45
BootLoaders/Boards/stm32/system/libmaple/usb/rules.mk
Normal file
@@ -0,0 +1,45 @@
|
||||
# Standard things
|
||||
sp := $(sp).x
|
||||
dirstack_$(sp) := $(d)
|
||||
d := $(dir)
|
||||
BUILDDIRS += $(BUILD_PATH)/$(d)
|
||||
|
||||
# Local flags
|
||||
CFLAGS_$(d) = -I$(d) -I$(d)/$(MCU_SERIES) -I$(d)/usb_lib $(LIBMAPLE_INCLUDES) $(LIBMAPLE_PRIVATE_INCLUDES) -Wall
|
||||
|
||||
# Add usblib and series subdirectory to BUILDDIRS.
|
||||
BUILDDIRS += $(BUILD_PATH)/$(d)/$(MCU_SERIES)
|
||||
BUILDDIRS += $(BUILD_PATH)/$(d)/usb_lib
|
||||
|
||||
# Local rules and targets
|
||||
sSRCS_$(d) :=
|
||||
cSRCS_$(d) :=
|
||||
# We currently only have F1 performance line support. Sigh.
|
||||
ifeq ($(MCU_SERIES), stm32f1)
|
||||
ifeq ($(MCU_F1_LINE), performance)
|
||||
cSRCS_$(d) += $(MCU_SERIES)/usb.c
|
||||
cSRCS_$(d) += $(MCU_SERIES)/usb_reg_map.c
|
||||
cSRCS_$(d) += $(MCU_SERIES)/usb_cdcacm.c
|
||||
cSRCS_$(d) += usb_lib/usb_core.c
|
||||
cSRCS_$(d) += usb_lib/usb_init.c
|
||||
cSRCS_$(d) += usb_lib/usb_mem.c
|
||||
cSRCS_$(d) += usb_lib/usb_regs.c
|
||||
endif
|
||||
endif
|
||||
|
||||
sFILES_$(d) := $(sSRCS_$(d):%=$(d)/%)
|
||||
cFILES_$(d) := $(cSRCS_$(d):%=$(d)/%)
|
||||
|
||||
OBJS_$(d) := $(sFILES_$(d):%.S=$(BUILD_PATH)/%.o) \
|
||||
$(cFILES_$(d):%.c=$(BUILD_PATH)/%.o)
|
||||
DEPS_$(d) := $(OBJS_$(d):%.o=%.d)
|
||||
|
||||
$(OBJS_$(d)): TGT_CFLAGS := $(CFLAGS_$(d))
|
||||
$(OBJS_$(d)): TGT_ASFLAGS :=
|
||||
|
||||
TGT_BIN += $(OBJS_$(d))
|
||||
|
||||
# Standard things
|
||||
-include $(DEPS_$(d))
|
||||
d := $(dirstack_$(sp))
|
||||
sp := $(basename $(sp))
|
||||
@@ -0,0 +1,55 @@
|
||||
/******************************************************************************
|
||||
* The MIT License
|
||||
*
|
||||
* Copyright (c) 2011 LeafLabs LLC.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef _USB_LIB_GLOBALS_H_
|
||||
#define _USB_LIB_GLOBALS_H_
|
||||
|
||||
/* usb_lib headers */
|
||||
#include "usb_type.h"
|
||||
#include "usb_core.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern USER_STANDARD_REQUESTS User_Standard_Requests;
|
||||
extern USER_STANDARD_REQUESTS *pUser_Standard_Requests;
|
||||
|
||||
extern DEVICE_PROP Device_Property;
|
||||
extern DEVICE_PROP *pProperty;
|
||||
|
||||
extern DEVICE_INFO Device_Info;
|
||||
extern DEVICE_INFO *pInformation;
|
||||
|
||||
extern DEVICE Device_Table;
|
||||
extern u16 SaveRState;
|
||||
extern u16 SaveTState;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,617 @@
|
||||
/******************************************************************************
|
||||
* The MIT License
|
||||
*
|
||||
* Copyright (c) 2011 LeafLabs, LLC.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*****************************************************************************/
|
||||
|
||||
#include <libmaple/libmaple_types.h>
|
||||
#include <libmaple/util.h>
|
||||
|
||||
#ifndef _USB_REG_MAP_H_
|
||||
#define _USB_REG_MAP_H_
|
||||
|
||||
/* TODO:
|
||||
* - Pick one of "endp", "ep" "endpt"
|
||||
*/
|
||||
|
||||
/*
|
||||
* Register map and base pointer
|
||||
*/
|
||||
|
||||
#define USB_NR_EP_REGS 8
|
||||
|
||||
/** USB register map type */
|
||||
typedef struct usb_reg_map {
|
||||
__io uint32 EP[USB_NR_EP_REGS]; /**< Endpoint registers */
|
||||
const uint32 RESERVED[8]; /**< Reserved */
|
||||
__io uint32 CNTR; /**< Control register */
|
||||
__io uint32 ISTR; /**< Interrupt status register */
|
||||
__io uint32 FNR; /**< Frame number register */
|
||||
__io uint32 DADDR; /**< Device address */
|
||||
__io uint32 BTABLE; /**< @brief Buffer table address
|
||||
*
|
||||
* Address offset within the USB
|
||||
* packet memory area which points
|
||||
* to the base of the buffer
|
||||
* descriptor table. Must be
|
||||
* aligned to an 8 byte boundary.
|
||||
*/
|
||||
} usb_reg_map;
|
||||
|
||||
/** USB register map base pointer */
|
||||
#define USB_BASE ((struct usb_reg_map*)0x40005C00)
|
||||
|
||||
/*
|
||||
* Register bit definitions
|
||||
*/
|
||||
|
||||
/* Endpoint registers (USB_EPnR) */
|
||||
|
||||
#define USB_EP_CTR_RX_BIT 15
|
||||
#define USB_EP_DTOG_RX_BIT 14
|
||||
#define USB_EP_SETUP_BIT 11
|
||||
#define USB_EP_EP_KIND_BIT 8
|
||||
#define USB_EP_CTR_TX_BIT 7
|
||||
#define USB_EP_DTOG_TX_BIT 6
|
||||
|
||||
#define USB_EP_CTR_RX BIT(USB_EP_CTR_RX_BIT)
|
||||
#define USB_EP_DTOG_RX BIT(USB_EP_DTOG_RX_BIT)
|
||||
#define USB_EP_STAT_RX (0x3 << 12)
|
||||
#define USB_EP_STAT_RX_DISABLED (0x0 << 12)
|
||||
#define USB_EP_STAT_RX_STALL (0x1 << 12)
|
||||
#define USB_EP_STAT_RX_NAK (0x2 << 12)
|
||||
#define USB_EP_STAT_RX_VALID (0x3 << 12)
|
||||
#define USB_EP_SETUP BIT(USB_EP_SETUP_BIT)
|
||||
#define USB_EP_EP_TYPE (0x3 << 9)
|
||||
#define USB_EP_EP_TYPE_BULK (0x0 << 9)
|
||||
#define USB_EP_EP_TYPE_CONTROL (0x1 << 9)
|
||||
#define USB_EP_EP_TYPE_ISO (0x2 << 9)
|
||||
#define USB_EP_EP_TYPE_INTERRUPT (0x3 << 9)
|
||||
#define USB_EP_EP_KIND BIT(USB_EP_EP_KIND_BIT)
|
||||
#define USB_EP_EP_KIND_DBL_BUF (0x1 << USB_EP_EP_KIND_BIT)
|
||||
#define USB_EP_CTR_TX BIT(USB_EP_CTR_TX_BIT)
|
||||
#define USB_EP_DTOG_TX BIT(USB_EP_DTOG_TX_BIT)
|
||||
#define USB_EP_STAT_TX (0x3 << 4)
|
||||
#define USB_EP_STAT_TX_DISABLED (0x0 << 4)
|
||||
#define USB_EP_STAT_TX_STALL (0x1 << 4)
|
||||
#define USB_EP_STAT_TX_NAK (0x2 << 4)
|
||||
#define USB_EP_STAT_TX_VALID (0x3 << 4)
|
||||
#define USB_EP_EA 0xF
|
||||
|
||||
/* Control register (USB_CNTR) */
|
||||
|
||||
#define USB_CNTR_CTRM_BIT 15
|
||||
#define USB_CNTR_PMAOVERM_BIT 14
|
||||
#define USB_CNTR_ERRM_BIT 13
|
||||
#define USB_CNTR_WKUPM_BIT 12
|
||||
#define USB_CNTR_SUSPM_BIT 11
|
||||
#define USB_CNTR_RESETM_BIT 10
|
||||
#define USB_CNTR_SOFM_BIT 9
|
||||
#define USB_CNTR_ESOFM_BIT 8
|
||||
#define USB_CNTR_RESUME_BIT 4
|
||||
#define USB_CNTR_FSUSP_BIT 3
|
||||
#define USB_CNTR_LP_MODE_BIT 2
|
||||
#define USB_CNTR_PDWN_BIT 1
|
||||
#define USB_CNTR_FRES_BIT 0
|
||||
|
||||
#define USB_CNTR_CTRM BIT(USB_CNTR_CTRM_BIT)
|
||||
#define USB_CNTR_PMAOVERM BIT(USB_CNTR_PMAOVERM_BIT)
|
||||
#define USB_CNTR_ERRM BIT(USB_CNTR_ERRM_BIT)
|
||||
#define USB_CNTR_WKUPM BIT(USB_CNTR_WKUPM_BIT)
|
||||
#define USB_CNTR_SUSPM BIT(USB_CNTR_SUSPM_BIT)
|
||||
#define USB_CNTR_RESETM BIT(USB_CNTR_RESETM_BIT)
|
||||
#define USB_CNTR_SOFM BIT(USB_CNTR_SOFM_BIT)
|
||||
#define USB_CNTR_ESOFM BIT(USB_CNTR_ESOFM_BIT)
|
||||
#define USB_CNTR_RESUME BIT(USB_CNTR_RESUME_BIT)
|
||||
#define USB_CNTR_FSUSP BIT(USB_CNTR_FSUSP_BIT)
|
||||
#define USB_CNTR_LP_MODE BIT(USB_CNTR_LP_MODE_BIT)
|
||||
#define USB_CNTR_PDWN BIT(USB_CNTR_PDWN_BIT)
|
||||
#define USB_CNTR_FRES BIT(USB_CNTR_FRES_BIT)
|
||||
|
||||
/* Interrupt status register (USB_ISTR) */
|
||||
|
||||
#define USB_ISTR_CTR_BIT 15
|
||||
#define USB_ISTR_PMAOVR_BIT 14
|
||||
#define USB_ISTR_ERR_BIT 13
|
||||
#define USB_ISTR_WKUP_BIT 12
|
||||
#define USB_ISTR_SUSP_BIT 11
|
||||
#define USB_ISTR_RESET_BIT 10
|
||||
#define USB_ISTR_SOF_BIT 9
|
||||
#define USB_ISTR_ESOF_BIT 8
|
||||
#define USB_ISTR_DIR_BIT 4
|
||||
|
||||
#define USB_ISTR_CTR BIT(USB_ISTR_CTR_BIT)
|
||||
#define USB_ISTR_PMAOVR BIT(USB_ISTR_PMAOVR_BIT)
|
||||
#define USB_ISTR_ERR BIT(USB_ISTR_ERR_BIT)
|
||||
#define USB_ISTR_WKUP BIT(USB_ISTR_WKUP_BIT)
|
||||
#define USB_ISTR_SUSP BIT(USB_ISTR_SUSP_BIT)
|
||||
#define USB_ISTR_RESET BIT(USB_ISTR_RESET_BIT)
|
||||
#define USB_ISTR_SOF BIT(USB_ISTR_SOF_BIT)
|
||||
#define USB_ISTR_ESOF BIT(USB_ISTR_ESOF_BIT)
|
||||
#define USB_ISTR_DIR BIT(USB_ISTR_DIR_BIT)
|
||||
#define USB_ISTR_EP_ID 0xF
|
||||
|
||||
/* Frame number register (USB_FNR) */
|
||||
|
||||
#define USB_FNR_RXDP_BIT 15
|
||||
#define USB_FNR_RXDM_BIT 14
|
||||
#define USB_FNR_LCK_BIT 13
|
||||
|
||||
#define USB_FNR_RXDP BIT(USB_FNR_RXDP_BIT)
|
||||
#define USB_FNR_RXDM BIT(USB_FNR_RXDM_BIT)
|
||||
#define USB_FNR_LCK BIT(USB_FNR_LCK_BIT)
|
||||
#define USB_FNR_LSOF (0x3 << 11)
|
||||
#define USB_FNR_FN 0x7FF
|
||||
|
||||
/* Device address (USB_DADDR) */
|
||||
|
||||
#define USB_DADDR_EF_BIT 7
|
||||
#define USB_DADDR_ADD6_BIT 6
|
||||
#define USB_DADDR_ADD5_BIT 5
|
||||
#define USB_DADDR_ADD4_BIT 4
|
||||
#define USB_DADDR_ADD3_BIT 3
|
||||
#define USB_DADDR_ADD2_BIT 2
|
||||
#define USB_DADDR_ADD1_BIT 1
|
||||
#define USB_DADDR_ADD0_BIT 0
|
||||
|
||||
#define USB_DADDR_EF BIT(USB_DADDR_EF_BIT)
|
||||
#define USB_DADDR_ADD6 BIT(USB_DADDR_ADD6_BIT)
|
||||
#define USB_DADDR_ADD5 BIT(USB_DADDR_ADD5_BIT)
|
||||
#define USB_DADDR_ADD4 BIT(USB_DADDR_ADD4_BIT)
|
||||
#define USB_DADDR_ADD3 BIT(USB_DADDR_ADD3_BIT)
|
||||
#define USB_DADDR_ADD2 BIT(USB_DADDR_ADD2_BIT)
|
||||
#define USB_DADDR_ADD1 BIT(USB_DADDR_ADD1_BIT)
|
||||
#define USB_DADDR_ADD0 BIT(USB_DADDR_ADD0_BIT)
|
||||
|
||||
/* Buffer table address (USB_BTABLE) */
|
||||
|
||||
#define USB_BTABLE_BTABLE (0x1FFF << 3)
|
||||
|
||||
/*
|
||||
* Register convenience routines
|
||||
*/
|
||||
|
||||
#define __EP_CTR_NOP (USB_EP_CTR_RX | USB_EP_CTR_TX)
|
||||
#define __EP_NONTOGGLE (USB_EP_CTR_RX | USB_EP_SETUP | \
|
||||
USB_EP_EP_TYPE | USB_EP_EP_KIND | \
|
||||
USB_EP_CTR_TX | USB_EP_EA)
|
||||
|
||||
static inline void usb_clear_ctr_rx(uint8 ep) {
|
||||
uint32 epr = USB_BASE->EP[ep];
|
||||
USB_BASE->EP[ep] = epr & ~USB_EP_CTR_RX & __EP_NONTOGGLE;
|
||||
}
|
||||
|
||||
static inline void usb_clear_ctr_tx(uint8 ep) {
|
||||
uint32 epr = USB_BASE->EP[ep];
|
||||
USB_BASE->EP[ep] = epr & ~USB_EP_CTR_TX & __EP_NONTOGGLE;
|
||||
}
|
||||
|
||||
static inline uint32 usb_get_ep_dtog_tx(uint8 ep) {
|
||||
uint32 epr = USB_BASE->EP[ep];
|
||||
return epr & USB_EP_DTOG_TX;
|
||||
}
|
||||
|
||||
static inline uint32 usb_get_ep_dtog_rx(uint8 ep) {
|
||||
uint32 epr = USB_BASE->EP[ep];
|
||||
return epr & USB_EP_DTOG_RX;
|
||||
}
|
||||
|
||||
static inline uint32 usb_get_ep_tx_sw_buf(uint8 ep) {
|
||||
return usb_get_ep_dtog_rx(ep);
|
||||
}
|
||||
|
||||
static inline uint32 usb_get_ep_rx_sw_buf(uint8 ep) {
|
||||
return usb_get_ep_dtog_tx(ep);
|
||||
}
|
||||
|
||||
static inline void usb_toggle_ep_dtog_tx(uint8 ep) {
|
||||
uint32 epr = USB_BASE->EP[ep];
|
||||
epr &= __EP_NONTOGGLE;
|
||||
epr |= USB_EP_DTOG_TX;
|
||||
USB_BASE->EP[ep] = epr;
|
||||
}
|
||||
|
||||
static inline void usb_toggle_ep_dtog_rx(uint8 ep) {
|
||||
uint32 epr = USB_BASE->EP[ep];
|
||||
epr &= __EP_NONTOGGLE;
|
||||
epr |= USB_EP_DTOG_RX;
|
||||
USB_BASE->EP[ep] = epr;
|
||||
}
|
||||
|
||||
static inline void usb_clear_ep_dtog_tx(uint8 ep) {
|
||||
if (usb_get_ep_dtog_tx(ep) != 0) {
|
||||
usb_toggle_ep_dtog_tx(ep);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void usb_clear_ep_dtog_rx(uint8 ep) {
|
||||
if (usb_get_ep_dtog_rx(ep) != 0) {
|
||||
usb_toggle_ep_dtog_rx(ep);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void usb_set_ep_dtog_tx(uint8 ep) {
|
||||
if (usb_get_ep_dtog_tx(ep) == 0) {
|
||||
usb_toggle_ep_dtog_tx(ep);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void usb_set_ep_dtog_rx(uint8 ep) {
|
||||
if (usb_get_ep_dtog_rx(ep) == 0) {
|
||||
usb_toggle_ep_dtog_rx(ep);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void usb_toggle_ep_rx_sw_buf(uint8 ep) {
|
||||
usb_toggle_ep_dtog_tx(ep);
|
||||
}
|
||||
|
||||
static inline void usb_toggle_ep_tx_sw_buf(uint8 ep) {
|
||||
usb_toggle_ep_dtog_rx(ep);
|
||||
}
|
||||
|
||||
static inline void usb_clear_ep_rx_sw_buf(uint8 ep) {
|
||||
usb_clear_ep_dtog_tx(ep);
|
||||
}
|
||||
|
||||
static inline void usb_clear_ep_tx_sw_buf(uint8 ep) {
|
||||
usb_clear_ep_dtog_rx(ep);
|
||||
}
|
||||
|
||||
static inline void usb_set_ep_rx_sw_buf(uint8 ep) {
|
||||
usb_set_ep_dtog_tx(ep);
|
||||
}
|
||||
|
||||
static inline void usb_set_ep_tx_sw_buf(uint8 ep) {
|
||||
usb_set_ep_dtog_rx(ep);
|
||||
}
|
||||
|
||||
static inline void usb_set_ep_rx_stat(uint8 ep, uint32 status) {
|
||||
uint32 epr = USB_BASE->EP[ep];
|
||||
epr &= ~(USB_EP_STAT_TX | USB_EP_DTOG_RX | USB_EP_DTOG_TX);
|
||||
epr |= __EP_CTR_NOP;
|
||||
epr ^= status;
|
||||
USB_BASE->EP[ep] = epr;
|
||||
}
|
||||
|
||||
static inline void usb_set_ep_tx_stat(uint8 ep, uint32 status) {
|
||||
uint32 epr = USB_BASE->EP[ep];
|
||||
epr &= ~(USB_EP_STAT_RX | USB_EP_DTOG_RX | USB_EP_DTOG_TX);
|
||||
epr |= __EP_CTR_NOP;
|
||||
epr ^= status;
|
||||
USB_BASE->EP[ep] = epr;
|
||||
}
|
||||
|
||||
static inline void usb_set_ep_type(uint8 ep, uint32 type) {
|
||||
uint32 epr = USB_BASE->EP[ep];
|
||||
epr &= ~USB_EP_EP_TYPE & __EP_NONTOGGLE;
|
||||
epr |= type;
|
||||
USB_BASE->EP[ep] = epr;
|
||||
}
|
||||
|
||||
static inline void usb_set_ep_kind(uint8 ep, uint32 kind) {
|
||||
uint32 epr = USB_BASE->EP[ep];
|
||||
epr &= ~USB_EP_EP_KIND & __EP_NONTOGGLE;
|
||||
epr |= kind;
|
||||
USB_BASE->EP[ep] = epr;
|
||||
}
|
||||
|
||||
static inline uint32 usb_get_ep_type(uint8 ep) {
|
||||
uint32 epr = USB_BASE->EP[ep];
|
||||
return epr & USB_EP_EP_TYPE;
|
||||
}
|
||||
|
||||
static inline uint32 usb_get_ep_kind(uint8 ep) {
|
||||
uint32 epr = USB_BASE->EP[ep];
|
||||
return epr & USB_EP_EP_TYPE;
|
||||
}
|
||||
|
||||
|
||||
static inline void usb_clear_status_out(uint8 ep) {
|
||||
usb_set_ep_kind(ep, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Packet memory area (PMA) base pointer
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief USB packet memory area (PMA) base pointer.
|
||||
*
|
||||
* The USB PMA is SRAM shared between USB and CAN. The USB peripheral
|
||||
* accesses this memory directly via the packet buffer interface. */
|
||||
#define USB_PMA_BASE ((__io void*)0x40006000)
|
||||
|
||||
/*
|
||||
* PMA conveniences
|
||||
*/
|
||||
/*
|
||||
void usb_copy_to_pma(const uint8 *buf, uint16 len, uint16 pma_offset);
|
||||
void usb_copy_from_pma(uint8 *buf, uint16 len, uint16 pma_offset);
|
||||
*/
|
||||
static inline uint32 * usb_pma_ptr(uint32 offset) {
|
||||
return (uint32*)(USB_PMA_BASE + 2 * offset);
|
||||
}
|
||||
|
||||
/*
|
||||
* BTABLE
|
||||
*/
|
||||
|
||||
/* (Forward-declared) BTABLE entry.
|
||||
*
|
||||
* The BTABLE can be viewed as an array of usb_btable_ent values;
|
||||
* these vary in structure according to the configuration of the
|
||||
* endpoint.
|
||||
*/
|
||||
union usb_btable_ent;
|
||||
|
||||
/* Bidirectional endpoint BTABLE entry */
|
||||
typedef struct usb_btable_bidi {
|
||||
__io uint16 addr_tx; const uint16 PAD1;
|
||||
__io uint16 count_tx; const uint16 PAD2;
|
||||
__io uint16 addr_rx; const uint16 PAD3;
|
||||
__io uint16 count_rx; const uint16 PAD4;
|
||||
} usb_btable_bidi;
|
||||
|
||||
/* Unidirectional receive-only endpoint BTABLE entry */
|
||||
typedef struct usb_btable_uni_rx {
|
||||
__io uint16 empty1; const uint16 PAD1;
|
||||
__io uint16 empty2; const uint16 PAD2;
|
||||
__io uint16 addr_rx; const uint16 PAD3;
|
||||
__io uint16 count_rx; const uint16 PAD4;
|
||||
} usb_btable_uni_rx;
|
||||
|
||||
/* Unidirectional transmit-only endpoint BTABLE entry */
|
||||
typedef struct usb_btable_uni_tx {
|
||||
__io uint16 addr_tx; const uint16 PAD1;
|
||||
__io uint16 count_tx; const uint16 PAD2;
|
||||
__io uint16 empty1; const uint16 PAD3;
|
||||
__io uint16 empty2; const uint16 PAD4;
|
||||
} usb_btable_uni_tx;
|
||||
|
||||
/* Double-buffered transmission endpoint BTABLE entry */
|
||||
typedef struct usb_btable_dbl_tx {
|
||||
__io uint16 addr_tx0; const uint16 PAD1;
|
||||
__io uint16 count_tx0; const uint16 PAD2;
|
||||
__io uint16 addr_tx1; const uint16 PAD3;
|
||||
__io uint16 count_tx1; const uint16 PAD4;
|
||||
} usb_btable_dbl_tx;
|
||||
|
||||
/* Double-buffered reception endpoint BTABLE entry */
|
||||
typedef struct usb_btable_dbl_rx {
|
||||
__io uint16 addr_rx0; const uint16 PAD1;
|
||||
__io uint16 count_rx0; const uint16 PAD2;
|
||||
__io uint16 addr_rx1; const uint16 PAD3;
|
||||
__io uint16 count_rx1; const uint16 PAD4;
|
||||
} usb_btable_dbl_rx;
|
||||
|
||||
/* TODO isochronous endpoint entries */
|
||||
|
||||
/* Definition for above forward-declared BTABLE entry. */
|
||||
typedef union usb_btable_ent {
|
||||
usb_btable_bidi bidi;
|
||||
usb_btable_uni_rx u_rx;
|
||||
usb_btable_uni_tx u_tx;
|
||||
usb_btable_dbl_tx d_tx;
|
||||
usb_btable_dbl_rx d_rx;
|
||||
} usb_btable_ent;
|
||||
|
||||
/*
|
||||
* BTABLE conveniences
|
||||
*/
|
||||
|
||||
/* TODO (?) Convert usages of the many (and lengthily-named)
|
||||
* accessors/mutators below to just manipulating usb_btable_entry
|
||||
* values. */
|
||||
|
||||
static inline uint32* usb_btable_ptr(uint32 offset) {
|
||||
return (uint32*)usb_pma_ptr(USB_BASE->BTABLE + offset);
|
||||
}
|
||||
|
||||
/* TX address */
|
||||
|
||||
static inline uint32* usb_ep_tx_addr_ptr(uint8 ep) {
|
||||
return usb_btable_ptr(ep * 8);
|
||||
}
|
||||
|
||||
static inline uint16 usb_get_ep_tx_addr(uint8 ep) {
|
||||
return (uint16)*usb_ep_tx_addr_ptr(ep);
|
||||
}
|
||||
|
||||
static inline void usb_set_ep_tx_addr(uint8 ep, uint16 addr) {
|
||||
volatile uint32 *tx_addr = usb_ep_tx_addr_ptr(ep);
|
||||
*tx_addr = addr & ~0x1;
|
||||
}
|
||||
|
||||
/* RX address */
|
||||
|
||||
static inline uint32* usb_ep_rx_addr_ptr(uint8 ep) {
|
||||
return usb_btable_ptr(ep * 8 + 4);
|
||||
}
|
||||
|
||||
static inline uint16 usb_get_ep_rx_addr(uint8 ep) {
|
||||
return (uint16)*usb_ep_rx_addr_ptr(ep);
|
||||
}
|
||||
|
||||
static inline void usb_set_ep_rx_addr(uint8 ep, uint16 addr) {
|
||||
volatile uint32 *rx_addr = usb_ep_rx_addr_ptr(ep);
|
||||
*rx_addr = addr & ~0x1;
|
||||
}
|
||||
|
||||
/* TX count (doesn't cover double-buffered and isochronous in) */
|
||||
|
||||
static inline uint32* usb_ep_tx_count_ptr(uint8 ep) {
|
||||
return usb_btable_ptr(ep * 8 + 2);
|
||||
}
|
||||
|
||||
static inline uint16 usb_get_ep_tx_count(uint8 ep) {
|
||||
/* FIXME: this is broken somehow; calling it seems to
|
||||
* confuse/crash the chip. */
|
||||
return (uint16)(*usb_ep_tx_count_ptr(ep) & 0x3FF);
|
||||
}
|
||||
|
||||
static inline void usb_set_ep_tx_count(uint8 ep, uint16 count) {
|
||||
volatile uint32 *txc = usb_ep_tx_count_ptr(ep);
|
||||
*txc = count;
|
||||
}
|
||||
|
||||
/* RX count */
|
||||
|
||||
static inline uint32* usb_ep_rx_count_ptr(uint8 ep) {
|
||||
return usb_btable_ptr(ep * 8 + 6);
|
||||
}
|
||||
|
||||
static inline uint16 usb_get_ep_rx_count(uint8 ep) {
|
||||
return (uint16)*usb_ep_rx_count_ptr(ep) & 0x3FF;
|
||||
}
|
||||
|
||||
void usb_set_ep_rx_count(uint8 ep, uint16 count);
|
||||
|
||||
/* double buffer definitions */
|
||||
static inline uint32* usb_get_ep_tx_buf0_addr_ptr(uint8 ep) {
|
||||
return usb_ep_tx_addr_ptr(ep);
|
||||
}
|
||||
|
||||
static inline uint16 usb_get_ep_tx_buf0_addr(uint8 ep) {
|
||||
return usb_get_ep_tx_addr(ep);
|
||||
}
|
||||
|
||||
static inline void usb_set_ep_tx_buf0_addr(uint8 ep, uint16 addr) {
|
||||
usb_set_ep_tx_addr(ep, addr);
|
||||
}
|
||||
|
||||
static inline uint32* usb_get_ep_tx_buf1_addr_ptr(uint8 ep) {
|
||||
return usb_ep_rx_addr_ptr(ep);
|
||||
}
|
||||
|
||||
static inline uint16 usb_get_ep_tx_buf1_addr(uint8 ep) {
|
||||
return usb_get_ep_rx_addr(ep);
|
||||
}
|
||||
|
||||
static inline void usb_set_ep_tx_buf1_addr(uint8 ep, uint16 addr) {
|
||||
usb_set_ep_rx_addr(ep, addr);
|
||||
}
|
||||
|
||||
static inline uint32* usb_ep_tx_buf0_count_ptr(uint8 ep) {
|
||||
return usb_ep_tx_count_ptr(ep);
|
||||
}
|
||||
|
||||
static inline uint16 usb_get_ep_tx_buf0_count(uint8 ep) {
|
||||
return usb_get_ep_tx_count(ep);
|
||||
}
|
||||
|
||||
static inline void usb_set_ep_tx_buf0_count(uint8 ep, uint16 count) {
|
||||
usb_set_ep_tx_count(ep, count);
|
||||
}
|
||||
|
||||
static inline uint32* usb_ep_tx_buf1_count_ptr(uint8 ep) {
|
||||
return usb_ep_rx_count_ptr(ep);
|
||||
}
|
||||
|
||||
static inline uint16 usb_get_ep_tx_buf1_count(uint8 ep) {
|
||||
return usb_get_ep_rx_count(ep);
|
||||
}
|
||||
|
||||
static inline void usb_set_ep_tx_buf1_count(uint8 ep, uint16 count) {
|
||||
usb_set_ep_rx_count(ep, count);
|
||||
}
|
||||
static inline uint32* usb_get_ep_rx_buf0_addr_ptr(uint8 ep) {
|
||||
return usb_ep_tx_addr_ptr(ep);
|
||||
}
|
||||
|
||||
static inline uint16 usb_get_ep_rx_buf0_addr(uint8 ep) {
|
||||
return usb_get_ep_tx_addr(ep);
|
||||
}
|
||||
|
||||
static inline void usb_set_ep_rx_buf0_addr(uint8 ep, uint16 addr) {
|
||||
usb_set_ep_tx_addr(ep, addr);
|
||||
}
|
||||
|
||||
static inline uint32* usb_get_ep_rx_buf1_addr_ptr(uint8 ep) {
|
||||
return usb_ep_rx_addr_ptr(ep);
|
||||
}
|
||||
|
||||
static inline uint16 usb_get_ep_rx_buf1_addr(uint8 ep) {
|
||||
return usb_get_ep_rx_addr(ep);
|
||||
}
|
||||
|
||||
static inline void usb_set_ep_rx_buf1_addr(uint8 ep, uint16 addr) {
|
||||
usb_set_ep_rx_addr(ep, addr);
|
||||
}
|
||||
|
||||
static inline uint32* usb_ep_rx_buf0_count_ptr(uint8 ep) {
|
||||
return usb_ep_tx_count_ptr(ep);
|
||||
}
|
||||
|
||||
static inline uint16 usb_get_ep_rx_buf0_count(uint8 ep) {
|
||||
return usb_get_ep_tx_count(ep);
|
||||
}
|
||||
|
||||
//void usb_set_ep_rx_buf0_count(uint8 ep, uint16 count);
|
||||
|
||||
static inline uint32* usb_ep_rx_buf1_count_ptr(uint8 ep) {
|
||||
return usb_ep_rx_count_ptr(ep);
|
||||
}
|
||||
|
||||
static inline uint16 usb_get_ep_rx_buf1_count(uint8 ep) {
|
||||
return usb_get_ep_rx_count(ep);
|
||||
}
|
||||
|
||||
static inline void usb_set_ep_rx_buf1_count(uint8 ep, uint16 count) {
|
||||
usb_set_ep_rx_count(ep, count);
|
||||
}
|
||||
|
||||
/*
|
||||
* Misc. types
|
||||
*/
|
||||
|
||||
typedef enum usb_ep {
|
||||
USB_EP0,
|
||||
USB_EP1,
|
||||
USB_EP2,
|
||||
USB_EP3,
|
||||
USB_EP4,
|
||||
USB_EP5,
|
||||
USB_EP6,
|
||||
USB_EP7,
|
||||
} usb_ep;
|
||||
|
||||
typedef enum usb_ep_type {
|
||||
USB_EP_T_CTL = USB_EP_EP_TYPE_CONTROL,
|
||||
USB_EP_T_BULK = USB_EP_EP_TYPE_BULK,
|
||||
USB_EP_T_INT = USB_EP_EP_TYPE_INTERRUPT,
|
||||
USB_EP_T_ISO = USB_EP_EP_TYPE_ISO
|
||||
} usb_ep_type;
|
||||
|
||||
typedef enum usb_ep_stat {
|
||||
USB_EP_ST_RX_DIS = USB_EP_STAT_RX_DISABLED,
|
||||
USB_EP_ST_RX_STL = USB_EP_STAT_RX_STALL,
|
||||
USB_EP_ST_RX_NAK = USB_EP_STAT_RX_NAK,
|
||||
USB_EP_ST_RX_VAL = USB_EP_STAT_RX_VALID,
|
||||
USB_EP_ST_TX_DIS = USB_EP_STAT_TX_DISABLED,
|
||||
USB_EP_ST_TX_STL = USB_EP_STAT_TX_STALL,
|
||||
USB_EP_ST_TX_NAK = USB_EP_STAT_TX_NAK,
|
||||
USB_EP_ST_TX_VAL = USB_EP_STAT_TX_VALID
|
||||
} usb_ep_stat;
|
||||
|
||||
#endif
|
||||
254
BootLoaders/Boards/stm32/system/libmaple/usb/usb_lib/usb_core.h
Normal file
254
BootLoaders/Boards/stm32/system/libmaple/usb/usb_lib/usb_core.h
Normal file
@@ -0,0 +1,254 @@
|
||||
/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
|
||||
* File Name : usb_core.h
|
||||
* Author : MCD Application Team
|
||||
* Version : V2.2.1
|
||||
* Date : 09/22/2008
|
||||
* Description : Standard protocol processing functions prototypes
|
||||
********************************************************************************
|
||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
|
||||
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
|
||||
* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
|
||||
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||
*******************************************************************************/
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
#ifndef __USB_CORE_H
|
||||
#define __USB_CORE_H
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
/* Exported types ------------------------------------------------------------*/
|
||||
typedef enum _CONTROL_STATE
|
||||
{
|
||||
WAIT_SETUP, /* 0 */
|
||||
SETTING_UP, /* 1 */
|
||||
IN_DATA, /* 2 */
|
||||
OUT_DATA, /* 3 */
|
||||
LAST_IN_DATA, /* 4 */
|
||||
LAST_OUT_DATA, /* 5 */
|
||||
WAIT_STATUS_IN, /* 7 */
|
||||
WAIT_STATUS_OUT, /* 8 */
|
||||
STALLED, /* 9 */
|
||||
PAUSE /* 10 */
|
||||
} CONTROL_STATE; /* The state machine states of a control pipe */
|
||||
|
||||
typedef struct OneDescriptor
|
||||
{
|
||||
u8 *Descriptor;
|
||||
u16 Descriptor_Size;
|
||||
}
|
||||
ONE_DESCRIPTOR, *PONE_DESCRIPTOR;
|
||||
/* All the request process routines return a value of this type
|
||||
If the return value is not SUCCESS or NOT_READY,
|
||||
the software will STALL the correspond endpoint */
|
||||
typedef enum _RESULT
|
||||
{
|
||||
USB_SUCCESS = 0, /* Process sucessfully */
|
||||
USB_ERROR,
|
||||
USB_UNSUPPORT,
|
||||
USB_NOT_READY /* The process has not been finished, endpoint will be
|
||||
NAK to further rquest */
|
||||
} RESULT;
|
||||
|
||||
|
||||
/*-*-*-*-*-*-*-*-*-*-* Definitions for endpoint level -*-*-*-*-*-*-*-*-*-*-*-*/
|
||||
typedef struct _ENDPOINT_INFO
|
||||
{
|
||||
/* When send data out of the device,
|
||||
CopyData() is used to get data buffer 'Length' bytes data
|
||||
if Length is 0,
|
||||
CopyData() returns the total length of the data
|
||||
if the request is not supported, returns 0
|
||||
(NEW Feature )
|
||||
if CopyData() returns -1, the calling routine should not proceed
|
||||
further and will resume the SETUP process by the class device
|
||||
if Length is not 0,
|
||||
CopyData() returns a pointer to indicate the data location
|
||||
Usb_wLength is the data remain to be sent,
|
||||
Usb_wOffset is the Offset of original data
|
||||
When receive data from the host,
|
||||
CopyData() is used to get user data buffer which is capable
|
||||
of Length bytes data to copy data from the endpoint buffer.
|
||||
if Length is 0,
|
||||
CopyData() returns the available data length,
|
||||
if Length is not 0,
|
||||
CopyData() returns user buffer address
|
||||
Usb_rLength is the data remain to be received,
|
||||
Usb_rPointer is the Offset of data buffer
|
||||
*/
|
||||
u16 Usb_wLength;
|
||||
u16 Usb_wOffset;
|
||||
u16 PacketSize;
|
||||
u8 *(*CopyData)(u16 Length);
|
||||
}ENDPOINT_INFO;
|
||||
|
||||
/*-*-*-*-*-*-*-*-*-*-*-* Definitions for device level -*-*-*-*-*-*-*-*-*-*-*-*/
|
||||
|
||||
typedef struct _DEVICE
|
||||
{
|
||||
u8 Total_Endpoint; /* Number of endpoints that are used */
|
||||
u8 Total_Configuration;/* Number of configuration available */
|
||||
}
|
||||
DEVICE;
|
||||
|
||||
typedef union
|
||||
{
|
||||
u16 w;
|
||||
struct BW
|
||||
{
|
||||
/* Little Endian */
|
||||
u8 bb0;
|
||||
u8 bb1;
|
||||
}
|
||||
bw;
|
||||
} u16_u8;
|
||||
|
||||
typedef struct _DEVICE_INFO
|
||||
{
|
||||
u8 USBbmRequestType; /* bmRequestType */
|
||||
u8 USBbRequest; /* bRequest */
|
||||
u16_u8 USBwValues; /* wValue */
|
||||
u16_u8 USBwIndexs; /* wIndex */
|
||||
u16_u8 USBwLengths; /* wLength */
|
||||
|
||||
u8 ControlState; /* of type CONTROL_STATE */
|
||||
u8 Current_Feature;
|
||||
u8 Current_Configuration; /* Selected configuration */
|
||||
u8 Current_Interface; /* Selected interface of current configuration */
|
||||
u8 Current_AlternateSetting;/* Selected Alternate Setting of current
|
||||
interface*/
|
||||
|
||||
ENDPOINT_INFO Ctrl_Info;
|
||||
}DEVICE_INFO;
|
||||
|
||||
typedef struct _DEVICE_PROP
|
||||
{
|
||||
void (*Init)(void); /* Initialize the device */
|
||||
void (*Reset)(void); /* Reset routine of this device */
|
||||
|
||||
/* Device dependent process after the status stage */
|
||||
void (*Process_Status_IN)(void);
|
||||
void (*Process_Status_OUT)(void);
|
||||
|
||||
/* Procedure of process on setup stage of a class specified request with data stage */
|
||||
/* All class specified requests with data stage are processed in Class_Data_Setup
|
||||
Class_Data_Setup()
|
||||
responses to check all special requests and fills ENDPOINT_INFO
|
||||
according to the request
|
||||
If IN tokens are expected, then wLength & wOffset will be filled
|
||||
with the total transferring bytes and the starting position
|
||||
If OUT tokens are expected, then rLength & rOffset will be filled
|
||||
with the total expected bytes and the starting position in the buffer
|
||||
|
||||
If the request is valid, Class_Data_Setup returns SUCCESS, else UNSUPPORT
|
||||
|
||||
CAUTION:
|
||||
Since GET_CONFIGURATION & GET_INTERFACE are highly related to
|
||||
the individual classes, they will be checked and processed here.
|
||||
*/
|
||||
RESULT (*Class_Data_Setup)(u8 RequestNo);
|
||||
|
||||
/* Procedure of process on setup stage of a class specified request without data stage */
|
||||
/* All class specified requests without data stage are processed in Class_NoData_Setup
|
||||
Class_NoData_Setup
|
||||
responses to check all special requests and perform the request
|
||||
|
||||
CAUTION:
|
||||
Since SET_CONFIGURATION & SET_INTERFACE are highly related to
|
||||
the individual classes, they will be checked and processed here.
|
||||
*/
|
||||
RESULT (*Class_NoData_Setup)(u8 RequestNo);
|
||||
|
||||
/*Class_Get_Interface_Setting
|
||||
This function is used by the file usb_core.c to test if the selected Interface
|
||||
and Alternate Setting (u8 Interface, u8 AlternateSetting) are supported by
|
||||
the application.
|
||||
This function is writing by user. It should return "SUCCESS" if the Interface
|
||||
and Alternate Setting are supported by the application or "UNSUPPORT" if they
|
||||
are not supported. */
|
||||
|
||||
RESULT (*Class_Get_Interface_Setting)(u8 Interface, u8 AlternateSetting);
|
||||
|
||||
u8* (*GetDeviceDescriptor)(u16 Length);
|
||||
u8* (*GetConfigDescriptor)(u16 Length);
|
||||
u8* (*GetStringDescriptor)(u16 Length);
|
||||
|
||||
u8* RxEP_buffer;
|
||||
u8 MaxPacketSize;
|
||||
|
||||
}DEVICE_PROP;
|
||||
|
||||
typedef struct _USER_STANDARD_REQUESTS
|
||||
{
|
||||
void (*User_GetConfiguration)(void); /* Get Configuration */
|
||||
void (*User_SetConfiguration)(void); /* Set Configuration */
|
||||
void (*User_GetInterface)(void); /* Get Interface */
|
||||
void (*User_SetInterface)(void); /* Set Interface */
|
||||
void (*User_GetStatus)(void); /* Get Status */
|
||||
void (*User_ClearFeature)(void); /* Clear Feature */
|
||||
void (*User_SetEndPointFeature)(void); /* Set Endpoint Feature */
|
||||
void (*User_SetDeviceFeature)(void); /* Set Device Feature */
|
||||
void (*User_SetDeviceAddress)(void); /* Set Device Address */
|
||||
}
|
||||
USER_STANDARD_REQUESTS;
|
||||
|
||||
/* Exported constants --------------------------------------------------------*/
|
||||
#define Type_Recipient (pInformation->USBbmRequestType & (REQUEST_TYPE | RECIPIENT))
|
||||
|
||||
#define Usb_rLength Usb_wLength
|
||||
#define Usb_rOffset Usb_wOffset
|
||||
|
||||
#define USBwValue USBwValues.w
|
||||
#define USBwValue0 USBwValues.bw.bb0
|
||||
#define USBwValue1 USBwValues.bw.bb1
|
||||
#define USBwIndex USBwIndexs.w
|
||||
#define USBwIndex0 USBwIndexs.bw.bb0
|
||||
#define USBwIndex1 USBwIndexs.bw.bb1
|
||||
#define USBwLength USBwLengths.w
|
||||
#define USBwLength0 USBwLengths.bw.bb0
|
||||
#define USBwLength1 USBwLengths.bw.bb1
|
||||
#define StatusInfo0 StatusInfo.bw.bb0
|
||||
#define StatusInfo1 StatusInfo.bw.bb1
|
||||
|
||||
/* Exported macro ------------------------------------------------------------*/
|
||||
/* Exported functions ------------------------------------------------------- */
|
||||
u8 Setup0_Process(void);
|
||||
u8 Post0_Process(void);
|
||||
u8 Out0_Process(void);
|
||||
u8 In0_Process(void);
|
||||
|
||||
RESULT Standard_SetEndPointFeature(void);
|
||||
RESULT Standard_SetDeviceFeature(void);
|
||||
|
||||
u8 *Standard_GetConfiguration(u16 Length);
|
||||
RESULT Standard_SetConfiguration(void);
|
||||
u8 *Standard_GetInterface(u16 Length);
|
||||
RESULT Standard_SetInterface(void);
|
||||
u8 *Standard_GetDescriptorData(u16 Length, PONE_DESCRIPTOR pDesc);
|
||||
|
||||
u8 *Standard_GetStatus(u16 Length);
|
||||
RESULT Standard_ClearFeature(void);
|
||||
void SetDeviceAddress(u8);
|
||||
void NOP_Process(void);
|
||||
|
||||
extern DEVICE_PROP Device_Property;
|
||||
extern USER_STANDARD_REQUESTS User_Standard_Requests;
|
||||
extern DEVICE Device_Table;
|
||||
extern DEVICE_INFO Device_Info;
|
||||
|
||||
/* cells saving status during interrupt servicing */
|
||||
extern u16 SaveRState;
|
||||
extern u16 SaveTState;
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __USB_CORE_H */
|
||||
|
||||
/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
|
||||
@@ -0,0 +1,88 @@
|
||||
/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
|
||||
* File Name : usb_def.h
|
||||
* Author : MCD Application Team
|
||||
* Version : V2.2.1
|
||||
* Date : 09/22/2008
|
||||
* Description : Definitions related to USB Core
|
||||
********************************************************************************
|
||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
|
||||
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
|
||||
* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
|
||||
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||
*******************************************************************************/
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
#ifndef __USB_DEF_H
|
||||
#define __USB_DEF_H
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
/* Exported types ------------------------------------------------------------*/
|
||||
typedef enum _RECIPIENT_TYPE
|
||||
{
|
||||
DEVICE_RECIPIENT, /* Recipient device */
|
||||
INTERFACE_RECIPIENT, /* Recipient interface */
|
||||
ENDPOINT_RECIPIENT, /* Recipient endpoint */
|
||||
OTHER_RECIPIENT
|
||||
} RECIPIENT_TYPE;
|
||||
|
||||
|
||||
typedef enum _STANDARD_REQUESTS
|
||||
{
|
||||
GET_STATUS = 0,
|
||||
CLEAR_FEATURE,
|
||||
RESERVED1,
|
||||
SET_FEATURE,
|
||||
RESERVED2,
|
||||
SET_ADDRESS,
|
||||
GET_DESCRIPTOR,
|
||||
SET_DESCRIPTOR,
|
||||
GET_CONFIGURATION,
|
||||
SET_CONFIGURATION,
|
||||
GET_INTERFACE,
|
||||
SET_INTERFACE,
|
||||
TOTAL_sREQUEST, /* Total number of Standard request */
|
||||
SYNCH_FRAME = 12
|
||||
} STANDARD_REQUESTS;
|
||||
|
||||
/* Definition of "USBwValue" */
|
||||
typedef enum _DESCRIPTOR_TYPE
|
||||
{
|
||||
DEVICE_DESCRIPTOR = 1,
|
||||
CONFIG_DESCRIPTOR,
|
||||
STRING_DESCRIPTOR,
|
||||
INTERFACE_DESCRIPTOR,
|
||||
ENDPOINT_DESCRIPTOR
|
||||
} DESCRIPTOR_TYPE;
|
||||
|
||||
/* Feature selector of a SET_FEATURE or CLEAR_FEATURE */
|
||||
typedef enum _FEATURE_SELECTOR
|
||||
{
|
||||
ENDPOINT_STALL,
|
||||
DEVICE_REMOTE_WAKEUP
|
||||
} FEATURE_SELECTOR;
|
||||
|
||||
/* Exported constants --------------------------------------------------------*/
|
||||
/* Definition of "USBbmRequestType" */
|
||||
#define REQUEST_TYPE 0x60 /* Mask to get request type */
|
||||
#define STANDARD_REQUEST 0x00 /* Standard request */
|
||||
#define CLASS_REQUEST 0x20 /* Class request */
|
||||
#define VENDOR_REQUEST 0x40 /* Vendor request */
|
||||
|
||||
#define RECIPIENT 0x1F /* Mask to get recipient */
|
||||
|
||||
/* Exported macro ------------------------------------------------------------*/
|
||||
/* Exported functions ------------------------------------------------------- */
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __USB_DEF_H */
|
||||
|
||||
/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
|
||||
@@ -0,0 +1,57 @@
|
||||
/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
|
||||
* File Name : usb_init.h
|
||||
* Author : MCD Application Team
|
||||
* Version : V2.2.1
|
||||
* Date : 09/22/2008
|
||||
* Description : Initialization routines & global variables
|
||||
********************************************************************************
|
||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
|
||||
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
|
||||
* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
|
||||
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||
*******************************************************************************/
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
#ifndef __USB_INIT_H
|
||||
#define __USB_INIT_H
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
/* Exported types ------------------------------------------------------------*/
|
||||
/* Exported constants --------------------------------------------------------*/
|
||||
/* Exported macro ------------------------------------------------------------*/
|
||||
/* Exported functions ------------------------------------------------------- */
|
||||
void USB_Init(void);
|
||||
|
||||
/* External variables --------------------------------------------------------*/
|
||||
/* The number of current endpoint, it will be used to specify an endpoint */
|
||||
extern u8 EPindex;
|
||||
/* The number of current device, it is an index to the Device_Table */
|
||||
/*extern u8 Device_no; */
|
||||
/* Points to the DEVICE_INFO structure of current device */
|
||||
/* The purpose of this register is to speed up the execution */
|
||||
extern DEVICE_INFO* pInformation;
|
||||
/* Points to the DEVICE_PROP structure of current device */
|
||||
/* The purpose of this register is to speed up the execution */
|
||||
extern DEVICE_PROP* pProperty;
|
||||
/* Temporary save the state of Rx & Tx status. */
|
||||
/* Whenever the Rx or Tx state is changed, its value is saved */
|
||||
/* in this variable first and will be set to the EPRB or EPRA */
|
||||
/* at the end of interrupt process */
|
||||
extern USER_STANDARD_REQUESTS *pUser_Standard_Requests;
|
||||
|
||||
extern u16 SaveState ;
|
||||
extern u16 wInterrupt_Mask;
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __USB_INIT_H */
|
||||
|
||||
/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
|
||||
@@ -0,0 +1,36 @@
|
||||
/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
|
||||
* File Name : usb_lib.h
|
||||
* Author : MCD Application Team
|
||||
* Version : V2.2.1
|
||||
* Date : 09/22/2008
|
||||
* Description : USB library include files
|
||||
********************************************************************************
|
||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
|
||||
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
|
||||
* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
|
||||
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||
*******************************************************************************/
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
#ifndef __USB_LIB_H
|
||||
#define __USB_LIB_H
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "usb_type.h"
|
||||
#include "usb_regs.h"
|
||||
#include "usb_def.h"
|
||||
#include "usb_core.h"
|
||||
#include "usb_init.h"
|
||||
#include "usb_mem.h"
|
||||
|
||||
/* Exported types ------------------------------------------------------------*/
|
||||
/* Exported constants --------------------------------------------------------*/
|
||||
/* Exported macro ------------------------------------------------------------*/
|
||||
/* Exported functions ------------------------------------------------------- */
|
||||
/* External variables --------------------------------------------------------*/
|
||||
|
||||
#endif /* __USB_LIB_H */
|
||||
|
||||
/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
|
||||
@@ -0,0 +1,40 @@
|
||||
/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
|
||||
* File Name : usb_mem.h
|
||||
* Author : MCD Application Team
|
||||
* Version : V2.2.1
|
||||
* Date : 09/22/2008
|
||||
* Description : Utility prototypes functions for memory/PMA transfers
|
||||
********************************************************************************
|
||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
|
||||
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
|
||||
* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
|
||||
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||
*******************************************************************************/
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
#ifndef __USB_MEM_H
|
||||
#define __USB_MEM_H
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
/* Exported types ------------------------------------------------------------*/
|
||||
/* Exported constants --------------------------------------------------------*/
|
||||
/* Exported macro ------------------------------------------------------------*/
|
||||
/* Exported functions ------------------------------------------------------- */
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
void UserToPMABufferCopy(const u8 *pbUsrBuf, u16 wPMABufAddr, u16 wNBytes);
|
||||
void PMAToUserBufferCopy(u8 *pbUsrBuf, u16 wPMABufAddr, u16 wNBytes);
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
/* External variables --------------------------------------------------------*/
|
||||
|
||||
#endif /*__USB_MEM_H*/
|
||||
|
||||
/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
|
||||
627
BootLoaders/Boards/stm32/system/libmaple/usb/usb_lib/usb_regs.h
Normal file
627
BootLoaders/Boards/stm32/system/libmaple/usb/usb_lib/usb_regs.h
Normal file
@@ -0,0 +1,627 @@
|
||||
/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
|
||||
* File Name : usb_regs.h
|
||||
* Author : MCD Application Team
|
||||
* Version : V2.2.1
|
||||
* Date : 09/22/2008
|
||||
* Description : Interface prototype functions to USB cell registers
|
||||
********************************************************************************
|
||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
|
||||
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
|
||||
* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
|
||||
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||
*******************************************************************************/
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
#ifndef __USB_REGS_H
|
||||
#define __USB_REGS_H
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
/* Exported types ------------------------------------------------------------*/
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef enum _EP_DBUF_DIR
|
||||
{
|
||||
/* double buffered endpoint direction */
|
||||
EP_DBUF_ERR,
|
||||
EP_DBUF_OUT,
|
||||
EP_DBUF_IN
|
||||
}EP_DBUF_DIR;
|
||||
|
||||
/* endpoint buffer number */
|
||||
enum EP_BUF_NUM
|
||||
{
|
||||
EP_NOBUF,
|
||||
EP_BUF0,
|
||||
EP_BUF1
|
||||
};
|
||||
|
||||
/* Exported constants --------------------------------------------------------*/
|
||||
#define RegBase (0x40005C00L) /* USB_IP Peripheral Registers base address */
|
||||
#define PMAAddr (0x40006000L) /* USB_IP Packet Memory Area base address */
|
||||
|
||||
/******************************************************************************/
|
||||
/* General registers */
|
||||
/******************************************************************************/
|
||||
|
||||
/* Control register */
|
||||
#define CNTR ((volatile unsigned *)(RegBase + 0x40))
|
||||
/* Interrupt status register */
|
||||
#define ISTR ((volatile unsigned *)(RegBase + 0x44))
|
||||
/* Frame number register */
|
||||
#define FNR ((volatile unsigned *)(RegBase + 0x48))
|
||||
/* Device address register */
|
||||
#define DADDR ((volatile unsigned *)(RegBase + 0x4C))
|
||||
/* Buffer Table address register */
|
||||
#define BTABLE ((volatile unsigned *)(RegBase + 0x50))
|
||||
/******************************************************************************/
|
||||
/* Endpoint registers */
|
||||
/******************************************************************************/
|
||||
#define EP0REG ((volatile unsigned *)(RegBase)) /* endpoint 0 register address */
|
||||
|
||||
/* endpoints enumeration */
|
||||
#define ENDP0 ((u8)0)
|
||||
#define ENDP1 ((u8)1)
|
||||
#define ENDP2 ((u8)2)
|
||||
#define ENDP3 ((u8)3)
|
||||
#define ENDP4 ((u8)4)
|
||||
#define ENDP5 ((u8)5)
|
||||
#define ENDP6 ((u8)6)
|
||||
#define ENDP7 ((u8)7)
|
||||
/******************************************************************************/
|
||||
/* ISTR interrupt events */
|
||||
/******************************************************************************/
|
||||
#define ISTR_CTR (0x8000) /* Correct TRansfer (clear-only bit) */
|
||||
#define ISTR_DOVR (0x4000) /* DMA OVeR/underrun (clear-only bit) */
|
||||
#define ISTR_ERR (0x2000) /* ERRor (clear-only bit) */
|
||||
#define ISTR_WKUP (0x1000) /* WaKe UP (clear-only bit) */
|
||||
#define ISTR_SUSP (0x0800) /* SUSPend (clear-only bit) */
|
||||
#define ISTR_RESET (0x0400) /* RESET (clear-only bit) */
|
||||
#define ISTR_SOF (0x0200) /* Start Of Frame (clear-only bit) */
|
||||
#define ISTR_ESOF (0x0100) /* Expected Start Of Frame (clear-only bit) */
|
||||
|
||||
|
||||
#define ISTR_DIR (0x0010) /* DIRection of transaction (read-only bit) */
|
||||
#define ISTR_EP_ID (0x000F) /* EndPoint IDentifier (read-only bit) */
|
||||
|
||||
#define CLR_CTR (~ISTR_CTR) /* clear Correct TRansfer bit */
|
||||
#define CLR_DOVR (~ISTR_DOVR) /* clear DMA OVeR/underrun bit*/
|
||||
#define CLR_ERR (~ISTR_ERR) /* clear ERRor bit */
|
||||
#define CLR_WKUP (~ISTR_WKUP) /* clear WaKe UP bit */
|
||||
#define CLR_SUSP (~ISTR_SUSP) /* clear SUSPend bit */
|
||||
#define CLR_RESET (~ISTR_RESET) /* clear RESET bit */
|
||||
#define CLR_SOF (~ISTR_SOF) /* clear Start Of Frame bit */
|
||||
#define CLR_ESOF (~ISTR_ESOF) /* clear Expected Start Of Frame bit */
|
||||
|
||||
/******************************************************************************/
|
||||
/* CNTR control register bits definitions */
|
||||
/******************************************************************************/
|
||||
#define CNTR_CTRM (0x8000) /* Correct TRansfer Mask */
|
||||
#define CNTR_DOVRM (0x4000) /* DMA OVeR/underrun Mask */
|
||||
#define CNTR_ERRM (0x2000) /* ERRor Mask */
|
||||
#define CNTR_WKUPM (0x1000) /* WaKe UP Mask */
|
||||
#define CNTR_SUSPM (0x0800) /* SUSPend Mask */
|
||||
#define CNTR_RESETM (0x0400) /* RESET Mask */
|
||||
#define CNTR_SOFM (0x0200) /* Start Of Frame Mask */
|
||||
#define CNTR_ESOFM (0x0100) /* Expected Start Of Frame Mask */
|
||||
|
||||
|
||||
#define CNTR_RESUME (0x0010) /* RESUME request */
|
||||
#define CNTR_FSUSP (0x0008) /* Force SUSPend */
|
||||
#define CNTR_LPMODE (0x0004) /* Low-power MODE */
|
||||
#define CNTR_PDWN (0x0002) /* Power DoWN */
|
||||
#define CNTR_FRES (0x0001) /* Force USB RESet */
|
||||
|
||||
/******************************************************************************/
|
||||
/* FNR Frame Number Register bit definitions */
|
||||
/******************************************************************************/
|
||||
#define FNR_RXDP (0x8000) /* status of D+ data line */
|
||||
#define FNR_RXDM (0x4000) /* status of D- data line */
|
||||
#define FNR_LCK (0x2000) /* LoCKed */
|
||||
#define FNR_LSOF (0x1800) /* Lost SOF */
|
||||
#define FNR_FN (0x07FF) /* Frame Number */
|
||||
/******************************************************************************/
|
||||
/* DADDR Device ADDRess bit definitions */
|
||||
/******************************************************************************/
|
||||
#define DADDR_EF (0x80)
|
||||
#define DADDR_ADD (0x7F)
|
||||
/******************************************************************************/
|
||||
/* Endpoint register */
|
||||
/******************************************************************************/
|
||||
/* bit positions */
|
||||
#define EP_CTR_RX (0x8000) /* EndPoint Correct TRansfer RX */
|
||||
#define EP_DTOG_RX (0x4000) /* EndPoint Data TOGGLE RX */
|
||||
#define EPRX_STAT (0x3000) /* EndPoint RX STATus bit field */
|
||||
#define EP_SETUP (0x0800) /* EndPoint SETUP */
|
||||
#define EP_T_FIELD (0x0600) /* EndPoint TYPE */
|
||||
#define EP_KIND (0x0100) /* EndPoint KIND */
|
||||
#define EP_CTR_TX (0x0080) /* EndPoint Correct TRansfer TX */
|
||||
#define EP_DTOG_TX (0x0040) /* EndPoint Data TOGGLE TX */
|
||||
#define EPTX_STAT (0x0030) /* EndPoint TX STATus bit field */
|
||||
#define EPADDR_FIELD (0x000F) /* EndPoint ADDRess FIELD */
|
||||
|
||||
/* EndPoint REGister MASK (no toggle fields) */
|
||||
#define EPREG_MASK (EP_CTR_RX|EP_SETUP|EP_T_FIELD|EP_KIND|EP_CTR_TX|EPADDR_FIELD)
|
||||
|
||||
/* EP_TYPE[1:0] EndPoint TYPE */
|
||||
#define EP_TYPE_MASK (0x0600) /* EndPoint TYPE Mask */
|
||||
#define EP_BULK (0x0000) /* EndPoint BULK */
|
||||
#define EP_CONTROL (0x0200) /* EndPoint CONTROL */
|
||||
#define EP_ISOCHRONOUS (0x0400) /* EndPoint ISOCHRONOUS */
|
||||
#define EP_INTERRUPT (0x0600) /* EndPoint INTERRUPT */
|
||||
#define EP_T_MASK (~EP_T_FIELD & EPREG_MASK)
|
||||
|
||||
|
||||
/* EP_KIND EndPoint KIND */
|
||||
#define EPKIND_MASK (~EP_KIND & EPREG_MASK)
|
||||
|
||||
/* STAT_TX[1:0] STATus for TX transfer */
|
||||
#define EP_TX_DIS (0x0000) /* EndPoint TX DISabled */
|
||||
#define EP_TX_STALL (0x0010) /* EndPoint TX STALLed */
|
||||
#define EP_TX_NAK (0x0020) /* EndPoint TX NAKed */
|
||||
#define EP_TX_VALID (0x0030) /* EndPoint TX VALID */
|
||||
#define EPTX_DTOG1 (0x0010) /* EndPoint TX Data TOGgle bit1 */
|
||||
#define EPTX_DTOG2 (0x0020) /* EndPoint TX Data TOGgle bit2 */
|
||||
#define EPTX_DTOGMASK (EPTX_STAT|EPREG_MASK)
|
||||
|
||||
/* STAT_RX[1:0] STATus for RX transfer */
|
||||
#define EP_RX_DIS (0x0000) /* EndPoint RX DISabled */
|
||||
#define EP_RX_STALL (0x1000) /* EndPoint RX STALLed */
|
||||
#define EP_RX_NAK (0x2000) /* EndPoint RX NAKed */
|
||||
#define EP_RX_VALID (0x3000) /* EndPoint RX VALID */
|
||||
#define EPRX_DTOG1 (0x1000) /* EndPoint RX Data TOGgle bit1 */
|
||||
#define EPRX_DTOG2 (0x2000) /* EndPoint RX Data TOGgle bit1 */
|
||||
#define EPRX_DTOGMASK (EPRX_STAT|EPREG_MASK)
|
||||
/* Exported macro ------------------------------------------------------------*/
|
||||
/* SetCNTR */
|
||||
#define _SetCNTR(wRegValue) (*CNTR = (u16)wRegValue)
|
||||
|
||||
/* SetISTR */
|
||||
#define _SetISTR(wRegValue) (*ISTR = (u16)wRegValue)
|
||||
|
||||
/* SetDADDR */
|
||||
#define _SetDADDR(wRegValue) (*DADDR = (u16)wRegValue)
|
||||
|
||||
/* SetBTABLE */
|
||||
#define _SetBTABLE(wRegValue)(*BTABLE = (u16)(wRegValue & 0xFFF8))
|
||||
|
||||
/* GetCNTR */
|
||||
#define _GetCNTR() ((u16) *CNTR)
|
||||
|
||||
/* GetISTR */
|
||||
#define _GetISTR() ((u16) *ISTR)
|
||||
|
||||
/* GetFNR */
|
||||
#define _GetFNR() ((u16) *FNR)
|
||||
|
||||
/* GetDADDR */
|
||||
#define _GetDADDR() ((u16) *DADDR)
|
||||
|
||||
/* GetBTABLE */
|
||||
#define _GetBTABLE() ((u16) *BTABLE)
|
||||
|
||||
/* SetENDPOINT */
|
||||
#define _SetENDPOINT(bEpNum,wRegValue) (*(EP0REG + bEpNum)= \
|
||||
(u16)wRegValue)
|
||||
|
||||
/* GetENDPOINT */
|
||||
#define _GetENDPOINT(bEpNum) ((u16)(*(EP0REG + bEpNum)))
|
||||
|
||||
/*******************************************************************************
|
||||
* Macro Name : SetEPType
|
||||
* Description : sets the type in the endpoint register(bits EP_TYPE[1:0])
|
||||
* Input : bEpNum: Endpoint Number.
|
||||
* wType
|
||||
* Output : None.
|
||||
* Return : None.
|
||||
*******************************************************************************/
|
||||
#define _SetEPType(bEpNum,wType) (_SetENDPOINT(bEpNum,\
|
||||
((_GetENDPOINT(bEpNum) & EP_T_MASK) | wType)))
|
||||
|
||||
/*******************************************************************************
|
||||
* Macro Name : GetEPType
|
||||
* Description : gets the type in the endpoint register(bits EP_TYPE[1:0])
|
||||
* Input : bEpNum: Endpoint Number.
|
||||
* Output : None.
|
||||
* Return : Endpoint Type
|
||||
*******************************************************************************/
|
||||
#define _GetEPType(bEpNum) (_GetENDPOINT(bEpNum) & EP_T_FIELD)
|
||||
|
||||
/*******************************************************************************
|
||||
* Macro Name : SetEPTxStatus
|
||||
* Description : sets the status for tx transfer (bits STAT_TX[1:0]).
|
||||
* Input : bEpNum: Endpoint Number.
|
||||
* wState: new state
|
||||
* Output : None.
|
||||
* Return : None.
|
||||
*******************************************************************************/
|
||||
#define _SetEPTxStatus(bEpNum,wState) {\
|
||||
register u16 _wRegVal; \
|
||||
_wRegVal = _GetENDPOINT(bEpNum) & EPTX_DTOGMASK;\
|
||||
/* toggle first bit ? */ \
|
||||
if((EPTX_DTOG1 & wState)!= 0) \
|
||||
_wRegVal ^= EPTX_DTOG1; \
|
||||
/* toggle second bit ? */ \
|
||||
if((EPTX_DTOG2 & wState)!= 0) \
|
||||
_wRegVal ^= EPTX_DTOG2; \
|
||||
_SetENDPOINT(bEpNum, _wRegVal); \
|
||||
} /* _SetEPTxStatus */
|
||||
|
||||
/*******************************************************************************
|
||||
* Macro Name : SetEPRxStatus
|
||||
* Description : sets the status for rx transfer (bits STAT_TX[1:0])
|
||||
* Input : bEpNum: Endpoint Number.
|
||||
* wState: new state.
|
||||
* Output : None.
|
||||
* Return : None.
|
||||
*******************************************************************************/
|
||||
#define _SetEPRxStatus(bEpNum,wState) {\
|
||||
register u16 _wRegVal; \
|
||||
\
|
||||
_wRegVal = _GetENDPOINT(bEpNum) & EPRX_DTOGMASK;\
|
||||
/* toggle first bit ? */ \
|
||||
if((EPRX_DTOG1 & wState)!= 0) \
|
||||
_wRegVal ^= EPRX_DTOG1; \
|
||||
/* toggle second bit ? */ \
|
||||
if((EPRX_DTOG2 & wState)!= 0) \
|
||||
_wRegVal ^= EPRX_DTOG2; \
|
||||
_SetENDPOINT(bEpNum, _wRegVal); \
|
||||
} /* _SetEPRxStatus */
|
||||
/*******************************************************************************
|
||||
* Macro Name : GetEPTxStatus / GetEPRxStatus
|
||||
* Description : gets the status for tx/rx transfer (bits STAT_TX[1:0]
|
||||
* /STAT_RX[1:0])
|
||||
* Input : bEpNum: Endpoint Number.
|
||||
* Output : None.
|
||||
* Return : status .
|
||||
*******************************************************************************/
|
||||
#define _GetEPTxStatus(bEpNum) ((u16)_GetENDPOINT(bEpNum) & EPTX_STAT)
|
||||
|
||||
#define _GetEPRxStatus(bEpNum) ((u16)_GetENDPOINT(bEpNum) & EPRX_STAT)
|
||||
|
||||
/*******************************************************************************
|
||||
* Macro Name : SetEPTxValid / SetEPRxValid
|
||||
* Description : sets directly the VALID tx/rx-status into the enpoint register
|
||||
* Input : bEpNum: Endpoint Number.
|
||||
* Output : None.
|
||||
* Return : None.
|
||||
*******************************************************************************/
|
||||
#define _SetEPTxValid(bEpNum) (_SetEPTxStatus(bEpNum, EP_TX_VALID))
|
||||
|
||||
#define _SetEPRxValid(bEpNum) (_SetEPRxStatus(bEpNum, EP_RX_VALID))
|
||||
|
||||
/*******************************************************************************
|
||||
* Macro Name : GetTxStallStatus / GetRxStallStatus.
|
||||
* Description : checks stall condition in an endpoint.
|
||||
* Input : bEpNum: Endpoint Number.
|
||||
* Output : None.
|
||||
* Return : TRUE = endpoint in stall condition.
|
||||
*******************************************************************************/
|
||||
#define _GetTxStallStatus(bEpNum) (_GetEPTxStatus(bEpNum) \
|
||||
== EP_TX_STALL)
|
||||
#define _GetRxStallStatus(bEpNum) (_GetEPRxStatus(bEpNum) \
|
||||
== EP_RX_STALL)
|
||||
|
||||
/*******************************************************************************
|
||||
* Macro Name : SetEP_KIND / ClearEP_KIND.
|
||||
* Description : set & clear EP_KIND bit.
|
||||
* Input : bEpNum: Endpoint Number.
|
||||
* Output : None.
|
||||
* Return : None.
|
||||
*******************************************************************************/
|
||||
#define _SetEP_KIND(bEpNum) (_SetENDPOINT(bEpNum, \
|
||||
(_GetENDPOINT(bEpNum) | EP_KIND) & EPREG_MASK))
|
||||
#define _ClearEP_KIND(bEpNum) (_SetENDPOINT(bEpNum, \
|
||||
(_GetENDPOINT(bEpNum) & EPKIND_MASK)))
|
||||
|
||||
/*******************************************************************************
|
||||
* Macro Name : Set_Status_Out / Clear_Status_Out.
|
||||
* Description : Sets/clears directly STATUS_OUT bit in the endpoint register.
|
||||
* Input : bEpNum: Endpoint Number.
|
||||
* Output : None.
|
||||
* Return : None.
|
||||
*******************************************************************************/
|
||||
#define _Set_Status_Out(bEpNum) _SetEP_KIND(bEpNum)
|
||||
#define _Clear_Status_Out(bEpNum) _ClearEP_KIND(bEpNum)
|
||||
|
||||
/*******************************************************************************
|
||||
* Macro Name : SetEPDoubleBuff / ClearEPDoubleBuff.
|
||||
* Description : Sets/clears directly EP_KIND bit in the endpoint register.
|
||||
* Input : bEpNum: Endpoint Number.
|
||||
* Output : None.
|
||||
* Return : None.
|
||||
*******************************************************************************/
|
||||
#define _SetEPDoubleBuff(bEpNum) _SetEP_KIND(bEpNum)
|
||||
#define _ClearEPDoubleBuff(bEpNum) _ClearEP_KIND(bEpNum)
|
||||
|
||||
/*******************************************************************************
|
||||
* Macro Name : ClearEP_CTR_RX / ClearEP_CTR_TX.
|
||||
* Description : Clears bit CTR_RX / CTR_TX in the endpoint register.
|
||||
* Input : bEpNum: Endpoint Number.
|
||||
* Output : None.
|
||||
* Return : None.
|
||||
*******************************************************************************/
|
||||
#define _ClearEP_CTR_RX(bEpNum) (_SetENDPOINT(bEpNum,\
|
||||
_GetENDPOINT(bEpNum) & 0x7FFF & EPREG_MASK))
|
||||
#define _ClearEP_CTR_TX(bEpNum) (_SetENDPOINT(bEpNum,\
|
||||
_GetENDPOINT(bEpNum) & 0xFF7F & EPREG_MASK))
|
||||
|
||||
/*******************************************************************************
|
||||
* Macro Name : ToggleDTOG_RX / ToggleDTOG_TX .
|
||||
* Description : Toggles DTOG_RX / DTOG_TX bit in the endpoint register.
|
||||
* Input : bEpNum: Endpoint Number.
|
||||
* Output : None.
|
||||
* Return : None.
|
||||
*******************************************************************************/
|
||||
#define _ToggleDTOG_RX(bEpNum) (_SetENDPOINT(bEpNum, \
|
||||
EP_DTOG_RX | (_GetENDPOINT(bEpNum) & EPREG_MASK)))
|
||||
#define _ToggleDTOG_TX(bEpNum) (_SetENDPOINT(bEpNum, \
|
||||
EP_DTOG_TX | (_GetENDPOINT(bEpNum) & EPREG_MASK)))
|
||||
|
||||
/*******************************************************************************
|
||||
* Macro Name : ClearDTOG_RX / ClearDTOG_TX.
|
||||
* Description : Clears DTOG_RX / DTOG_TX bit in the endpoint register.
|
||||
* Input : bEpNum: Endpoint Number.
|
||||
* Output : None.
|
||||
* Return : None.
|
||||
*******************************************************************************/
|
||||
#define _ClearDTOG_RX(bEpNum) if((_GetENDPOINT(bEpNum) & EP_DTOG_RX) != 0)\
|
||||
_ToggleDTOG_RX(bEpNum)
|
||||
#define _ClearDTOG_TX(bEpNum) if((_GetENDPOINT(bEpNum) & EP_DTOG_TX) != 0)\
|
||||
_ToggleDTOG_TX(bEpNum)
|
||||
/*******************************************************************************
|
||||
* Macro Name : SetEPAddress.
|
||||
* Description : Sets address in an endpoint register.
|
||||
* Input : bEpNum: Endpoint Number.
|
||||
* bAddr: Address.
|
||||
* Output : None.
|
||||
* Return : None.
|
||||
*******************************************************************************/
|
||||
#define _SetEPAddress(bEpNum,bAddr) _SetENDPOINT(bEpNum,\
|
||||
(_GetENDPOINT(bEpNum) & EPREG_MASK) | bAddr)
|
||||
|
||||
/*******************************************************************************
|
||||
* Macro Name : GetEPAddress.
|
||||
* Description : Gets address in an endpoint register.
|
||||
* Input : bEpNum: Endpoint Number.
|
||||
* Output : None.
|
||||
* Return : None.
|
||||
*******************************************************************************/
|
||||
#define _GetEPAddress(bEpNum) ((u8)(_GetENDPOINT(bEpNum) & EPADDR_FIELD))
|
||||
|
||||
#define _pEPTxAddr(bEpNum) ((u32 *)((_GetBTABLE()+bEpNum*8 )*2 + PMAAddr))
|
||||
#define _pEPTxCount(bEpNum) ((u32 *)((_GetBTABLE()+bEpNum*8+2)*2 + PMAAddr))
|
||||
#define _pEPRxAddr(bEpNum) ((u32 *)((_GetBTABLE()+bEpNum*8+4)*2 + PMAAddr))
|
||||
#define _pEPRxCount(bEpNum) ((u32 *)((_GetBTABLE()+bEpNum*8+6)*2 + PMAAddr))
|
||||
|
||||
/*******************************************************************************
|
||||
* Macro Name : SetEPTxAddr / SetEPRxAddr.
|
||||
* Description : sets address of the tx/rx buffer.
|
||||
* Input : bEpNum: Endpoint Number.
|
||||
* wAddr: address to be set (must be word aligned).
|
||||
* Output : None.
|
||||
* Return : None.
|
||||
*******************************************************************************/
|
||||
#define _SetEPTxAddr(bEpNum,wAddr) (*_pEPTxAddr(bEpNum) = ((wAddr >> 1) << 1))
|
||||
#define _SetEPRxAddr(bEpNum,wAddr) (*_pEPRxAddr(bEpNum) = ((wAddr >> 1) << 1))
|
||||
|
||||
/*******************************************************************************
|
||||
* Macro Name : GetEPTxAddr / GetEPRxAddr.
|
||||
* Description : Gets address of the tx/rx buffer.
|
||||
* Input : bEpNum: Endpoint Number.
|
||||
* Output : None.
|
||||
* Return : address of the buffer.
|
||||
*******************************************************************************/
|
||||
#define _GetEPTxAddr(bEpNum) ((u16)*_pEPTxAddr(bEpNum))
|
||||
#define _GetEPRxAddr(bEpNum) ((u16)*_pEPRxAddr(bEpNum))
|
||||
|
||||
/*******************************************************************************
|
||||
* Macro Name : SetEPCountRxReg.
|
||||
* Description : Sets counter of rx buffer with no. of blocks.
|
||||
* Input : pdwReg: pointer to counter.
|
||||
* wCount: Counter.
|
||||
* Output : None.
|
||||
* Return : None.
|
||||
*******************************************************************************/
|
||||
#define _BlocksOf32(dwReg,wCount,wNBlocks) {\
|
||||
wNBlocks = wCount >> 5;\
|
||||
if((wCount & 0x1f) == 0)\
|
||||
wNBlocks--;\
|
||||
*pdwReg = (u32)((wNBlocks << 10) | 0x8000);\
|
||||
}/* _BlocksOf32 */
|
||||
|
||||
#define _BlocksOf2(dwReg,wCount,wNBlocks) {\
|
||||
wNBlocks = wCount >> 1;\
|
||||
if((wCount & 0x1) != 0)\
|
||||
wNBlocks++;\
|
||||
*pdwReg = (u32)(wNBlocks << 10);\
|
||||
}/* _BlocksOf2 */
|
||||
|
||||
#define _SetEPCountRxReg(dwReg,wCount) {\
|
||||
u16 wNBlocks;\
|
||||
if(wCount > 62){_BlocksOf32(dwReg,wCount,wNBlocks);}\
|
||||
else {_BlocksOf2(dwReg,wCount,wNBlocks);}\
|
||||
}/* _SetEPCountRxReg */
|
||||
|
||||
|
||||
|
||||
#define _SetEPRxDblBuf0Count(bEpNum,wCount) {\
|
||||
u32 *pdwReg = _pEPTxCount(bEpNum); \
|
||||
_SetEPCountRxReg(pdwReg, wCount);\
|
||||
}
|
||||
/*******************************************************************************
|
||||
* Macro Name : SetEPTxCount / SetEPRxCount.
|
||||
* Description : sets counter for the tx/rx buffer.
|
||||
* Input : bEpNum: endpoint number.
|
||||
* wCount: Counter value.
|
||||
* Output : None.
|
||||
* Return : None.
|
||||
*******************************************************************************/
|
||||
#define _SetEPTxCount(bEpNum,wCount) (*_pEPTxCount(bEpNum) = wCount)
|
||||
#define _SetEPRxCount(bEpNum,wCount) {\
|
||||
u32 *pdwReg = _pEPRxCount(bEpNum); \
|
||||
_SetEPCountRxReg(pdwReg, wCount);\
|
||||
}
|
||||
/*******************************************************************************
|
||||
* Macro Name : GetEPTxCount / GetEPRxCount.
|
||||
* Description : gets counter of the tx buffer.
|
||||
* Input : bEpNum: endpoint number.
|
||||
* Output : None.
|
||||
* Return : Counter value.
|
||||
*******************************************************************************/
|
||||
#define _GetEPTxCount(bEpNum)((u16)(*_pEPTxCount(bEpNum)) & 0x3ff)
|
||||
#define _GetEPRxCount(bEpNum)((u16)(*_pEPRxCount(bEpNum)) & 0x3ff)
|
||||
|
||||
/*******************************************************************************
|
||||
* Macro Name : SetEPDblBuf0Addr / SetEPDblBuf1Addr.
|
||||
* Description : Sets buffer 0/1 address in a double buffer endpoint.
|
||||
* Input : bEpNum: endpoint number.
|
||||
* : wBuf0Addr: buffer 0 address.
|
||||
* Output : None.
|
||||
* Return : None.
|
||||
*******************************************************************************/
|
||||
#define _SetEPDblBuf0Addr(bEpNum,wBuf0Addr) {_SetEPTxAddr(bEpNum, wBuf0Addr);}
|
||||
#define _SetEPDblBuf1Addr(bEpNum,wBuf1Addr) {_SetEPRxAddr(bEpNum, wBuf1Addr);}
|
||||
|
||||
/*******************************************************************************
|
||||
* Macro Name : SetEPDblBuffAddr.
|
||||
* Description : Sets addresses in a double buffer endpoint.
|
||||
* Input : bEpNum: endpoint number.
|
||||
* : wBuf0Addr: buffer 0 address.
|
||||
* : wBuf1Addr = buffer 1 address.
|
||||
* Output : None.
|
||||
* Return : None.
|
||||
*******************************************************************************/
|
||||
#define _SetEPDblBuffAddr(bEpNum,wBuf0Addr,wBuf1Addr) { \
|
||||
_SetEPDblBuf0Addr(bEpNum, wBuf0Addr);\
|
||||
_SetEPDblBuf1Addr(bEpNum, wBuf1Addr);\
|
||||
} /* _SetEPDblBuffAddr */
|
||||
|
||||
/*******************************************************************************
|
||||
* Macro Name : GetEPDblBuf0Addr / GetEPDblBuf1Addr.
|
||||
* Description : Gets buffer 0/1 address of a double buffer endpoint.
|
||||
* Input : bEpNum: endpoint number.
|
||||
* Output : None.
|
||||
* Return : None.
|
||||
*******************************************************************************/
|
||||
#define _GetEPDblBuf0Addr(bEpNum) (_GetEPTxAddr(bEpNum))
|
||||
#define _GetEPDblBuf1Addr(bEpNum) (_GetEPRxAddr(bEpNum))
|
||||
|
||||
/*******************************************************************************
|
||||
* Macro Name : SetEPDblBuffCount / SetEPDblBuf0Count / SetEPDblBuf1Count.
|
||||
* Description : Gets buffer 0/1 address of a double buffer endpoint.
|
||||
* Input : bEpNum: endpoint number.
|
||||
* : bDir: endpoint dir EP_DBUF_OUT = OUT
|
||||
* EP_DBUF_IN = IN
|
||||
* : wCount: Counter value
|
||||
* Output : None.
|
||||
* Return : None.
|
||||
*******************************************************************************/
|
||||
#define _SetEPDblBuf0Count(bEpNum, bDir, wCount) { \
|
||||
if(bDir == EP_DBUF_OUT)\
|
||||
/* OUT endpoint */ \
|
||||
{_SetEPRxDblBuf0Count(bEpNum,wCount);} \
|
||||
else if(bDir == EP_DBUF_IN)\
|
||||
/* IN endpoint */ \
|
||||
*_pEPTxCount(bEpNum) = (u32)wCount; \
|
||||
} /* SetEPDblBuf0Count*/
|
||||
|
||||
#define _SetEPDblBuf1Count(bEpNum, bDir, wCount) { \
|
||||
if(bDir == EP_DBUF_OUT)\
|
||||
/* OUT endpoint */ \
|
||||
{_SetEPRxCount(bEpNum,wCount);}\
|
||||
else if(bDir == EP_DBUF_IN)\
|
||||
/* IN endpoint */\
|
||||
*_pEPRxCount(bEpNum) = (u32)wCount; \
|
||||
} /* SetEPDblBuf1Count */
|
||||
|
||||
#define _SetEPDblBuffCount(bEpNum, bDir, wCount) {\
|
||||
_SetEPDblBuf0Count(bEpNum, bDir, wCount); \
|
||||
_SetEPDblBuf1Count(bEpNum, bDir, wCount); \
|
||||
} /* _SetEPDblBuffCount */
|
||||
|
||||
/*******************************************************************************
|
||||
* Macro Name : GetEPDblBuf0Count / GetEPDblBuf1Count.
|
||||
* Description : Gets buffer 0/1 rx/tx counter for double buffering.
|
||||
* Input : bEpNum: endpoint number.
|
||||
* Output : None.
|
||||
* Return : None.
|
||||
*******************************************************************************/
|
||||
#define _GetEPDblBuf0Count(bEpNum) (_GetEPTxCount(bEpNum))
|
||||
#define _GetEPDblBuf1Count(bEpNum) (_GetEPRxCount(bEpNum))
|
||||
|
||||
|
||||
/* External variables --------------------------------------------------------*/
|
||||
extern volatile u16 wIstr; /* ISTR register last read value */
|
||||
|
||||
/* Exported functions ------------------------------------------------------- */
|
||||
void SetCNTR(u16 /*wRegValue*/);
|
||||
void SetISTR(u16 /*wRegValue*/);
|
||||
void SetDADDR(u16 /*wRegValue*/);
|
||||
void SetBTABLE(u16 /*wRegValue*/);
|
||||
u16 GetCNTR(void);
|
||||
u16 GetISTR(void);
|
||||
u16 GetFNR(void);
|
||||
u16 GetDADDR(void);
|
||||
u16 GetBTABLE(void);
|
||||
void SetENDPOINT(u8 /*bEpNum*/, u16 /*wRegValue*/);
|
||||
u16 GetENDPOINT(u8 /*bEpNum*/);
|
||||
void SetEPType(u8 /*bEpNum*/, u16 /*wType*/);
|
||||
u16 GetEPType(u8 /*bEpNum*/);
|
||||
void SetEPTxStatus(u8 /*bEpNum*/, u16 /*wState*/);
|
||||
void SetEPRxStatus(u8 /*bEpNum*/, u16 /*wState*/);
|
||||
void SetDouBleBuffEPStall(u8 /*bEpNum*/, u8 bDir);
|
||||
u16 GetEPTxStatus(u8 /*bEpNum*/);
|
||||
u16 GetEPRxStatus(u8 /*bEpNum*/);
|
||||
void SetEPTxValid(u8 /*bEpNum*/);
|
||||
void SetEPRxValid(u8 /*bEpNum*/);
|
||||
u16 GetTxStallStatus(u8 /*bEpNum*/);
|
||||
u16 GetRxStallStatus(u8 /*bEpNum*/);
|
||||
void SetEP_KIND(u8 /*bEpNum*/);
|
||||
void ClearEP_KIND(u8 /*bEpNum*/);
|
||||
void Set_Status_Out(u8 /*bEpNum*/);
|
||||
void Clear_Status_Out(u8 /*bEpNum*/);
|
||||
void SetEPDoubleBuff(u8 /*bEpNum*/);
|
||||
void ClearEPDoubleBuff(u8 /*bEpNum*/);
|
||||
void ClearEP_CTR_RX(u8 /*bEpNum*/);
|
||||
void ClearEP_CTR_TX(u8 /*bEpNum*/);
|
||||
void ToggleDTOG_RX(u8 /*bEpNum*/);
|
||||
void ToggleDTOG_TX(u8 /*bEpNum*/);
|
||||
void ClearDTOG_RX(u8 /*bEpNum*/);
|
||||
void ClearDTOG_TX(u8 /*bEpNum*/);
|
||||
void SetEPAddress(u8 /*bEpNum*/, u8 /*bAddr*/);
|
||||
u8 GetEPAddress(u8 /*bEpNum*/);
|
||||
void SetEPTxAddr(u8 /*bEpNum*/, u16 /*wAddr*/);
|
||||
void SetEPRxAddr(u8 /*bEpNum*/, u16 /*wAddr*/);
|
||||
u16 GetEPTxAddr(u8 /*bEpNum*/);
|
||||
u16 GetEPRxAddr(u8 /*bEpNum*/);
|
||||
void SetEPCountRxReg(u32 * /*pdwReg*/, u16 /*wCount*/);
|
||||
void SetEPTxCount(u8 /*bEpNum*/, u16 /*wCount*/);
|
||||
void SetEPRxCount(u8 /*bEpNum*/, u16 /*wCount*/);
|
||||
u16 GetEPTxCount(u8 /*bEpNum*/);
|
||||
u16 GetEPRxCount(u8 /*bEpNum*/);
|
||||
void SetEPDblBuf0Addr(u8 /*bEpNum*/, u16 /*wBuf0Addr*/);
|
||||
void SetEPDblBuf1Addr(u8 /*bEpNum*/, u16 /*wBuf1Addr*/);
|
||||
void SetEPDblBuffAddr(u8 /*bEpNum*/, u16 /*wBuf0Addr*/, u16 /*wBuf1Addr*/);
|
||||
u16 GetEPDblBuf0Addr(u8 /*bEpNum*/);
|
||||
u16 GetEPDblBuf1Addr(u8 /*bEpNum*/);
|
||||
void SetEPDblBuffCount(u8 /*bEpNum*/, u8 /*bDir*/, u16 /*wCount*/);
|
||||
void SetEPDblBuf0Count(u8 /*bEpNum*/, u8 /*bDir*/, u16 /*wCount*/);
|
||||
void SetEPDblBuf1Count(u8 /*bEpNum*/, u8 /*bDir*/, u16 /*wCount*/);
|
||||
u16 GetEPDblBuf0Count(u8 /*bEpNum*/);
|
||||
u16 GetEPDblBuf1Count(u8 /*bEpNum*/);
|
||||
EP_DBUF_DIR GetEPDblBufDir(u8 /*bEpNum*/);
|
||||
void FreeUserBuffer(u8 bEpNum/*bEpNum*/, u8 bDir);
|
||||
u16 ToWord(u8, u8);
|
||||
u16 ByteSwap(u16);
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __USB_REGS_H */
|
||||
|
||||
/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
|
||||
@@ -0,0 +1,77 @@
|
||||
/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
|
||||
* File Name : usb_type.h
|
||||
* Author : MCD Application Team
|
||||
* Version : V2.2.1
|
||||
* Date : 09/22/2008
|
||||
* Description : Type definitions used by the USB Library
|
||||
********************************************************************************
|
||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
|
||||
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
|
||||
* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
|
||||
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||
*******************************************************************************/
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
#ifndef __USB_TYPE_H
|
||||
#define __USB_TYPE_H
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Exported types ------------------------------------------------------------*/
|
||||
/* Exported constants --------------------------------------------------------*/
|
||||
#ifndef NULL
|
||||
#define NULL ((void *)0)
|
||||
#endif
|
||||
|
||||
typedef signed long s32;
|
||||
typedef signed short s16;
|
||||
typedef signed char s8;
|
||||
|
||||
typedef volatile signed long vs32;
|
||||
typedef volatile signed short vs16;
|
||||
typedef volatile signed char vs8;
|
||||
|
||||
typedef unsigned long u32;
|
||||
typedef unsigned short u16;
|
||||
typedef unsigned char u8;
|
||||
|
||||
typedef unsigned long const uc32; /* Read Only */
|
||||
typedef unsigned short const uc16; /* Read Only */
|
||||
typedef unsigned char const uc8; /* Read Only */
|
||||
|
||||
typedef volatile unsigned long vu32;
|
||||
typedef volatile unsigned short vu16;
|
||||
typedef volatile unsigned char vu8;
|
||||
|
||||
typedef volatile unsigned long const vuc32; /* Read Only */
|
||||
typedef volatile unsigned short const vuc16; /* Read Only */
|
||||
typedef volatile unsigned char const vuc8; /* Read Only */
|
||||
|
||||
|
||||
typedef enum
|
||||
{
|
||||
FALSE = 0, TRUE = !FALSE
|
||||
}
|
||||
USB_Bool;
|
||||
|
||||
typedef enum { RESET = 0, SET = !RESET } FlagStatus, ITStatus;
|
||||
|
||||
typedef enum { DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
|
||||
|
||||
typedef enum { ERROR = 0, SUCCESS = !ERROR} ErrorStatus;
|
||||
|
||||
/* Exported macro ------------------------------------------------------------*/
|
||||
/* Exported functions ------------------------------------------------------- */
|
||||
/* External variables --------------------------------------------------------*/
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __USB_TYPE_H */
|
||||
|
||||
/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
|
||||
Reference in New Issue
Block a user