OpenModem/bertos/cpu/cortex-m3/drv/usb_stm32.h

234 lines
5.7 KiB
C

/**
* \file
* <!--
* This file is part of BeRTOS.
*
* Bertos is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* As a special exception, you may use this file as part of a free software
* library without restriction. Specifically, if other files instantiate
* templates or use macros or inline functions from this file, or you compile
* this file and link it with other files to produce an executable, this
* file does not by itself cause the resulting executable to be covered by
* the GNU General Public License. This exception does not however
* invalidate any other reasons why the executable file might be covered by
* the GNU General Public License.
*
* Copyright 2010 Develer S.r.l. (http://www.develer.com/)
*
* -->
*
* \author Andrea Righi <arighi@develer.com>
*
* \brief STM32: USB full-speed device driver
*
* Low-level USB device driver for the STM32 architecture.
*/
#ifndef USB_STM32_H
#define USB_STM32_H
#include <cfg/compiler.h>
#include <drv/usb.h>
#include <drv/usb_endpoint.h>
#define USB_BASE_ADDR 0x40005C00
#define USB_DM_PIN (1 << 11)
#define USB_DP_PIN (1 << 12)
#define USB_DISC_PIN (1 << 11)
#define USB_EP0_MAX_SIZE CONFIG_EP0_MAX_SIZE
#define USB_XFER_MAX_SIZE 64
#define EP_MAX_SLOTS USB_EP_MAX
#define EP_MAX_NUM (EP_MAX_SLOTS << 1)
/* USB packet memory organization */
#define USB_PACKET_MEMORY_BASE 0x40006000
#define USB_PACKET_MEMORY_SIZE 512
/* Offset of the buffer descriptor table inside the packet memory */
#define USB_BDT_OFFSET \
((USB_PACKET_MEMORY_SIZE - (sizeof(stm32_UsbBd) * EP_MAX_NUM)) & ~7)
#define USB_MEM_ADDR(offset) \
(USB_PACKET_MEMORY_BASE + ((offset << 1) & ~3) + (offset & 1))
#define EP_DTB_READ(slot, offset) \
(*((uint16_t *)(USB_MEM_ADDR((USB_BDT_OFFSET + \
(slot) * sizeof(stm32_UsbBd) + \
(offset))))))
#define EP_DTB_WRITE(slot, offset, data) (EP_DTB_READ(slot, offset) = data)
#define ADDR_TX_OFFSET offsetof(stm32_UsbBd, AddrTx)
#define COUNT_TX_OFFSET offsetof(stm32_UsbBd, CountTx)
#define ADDR_RX_OFFSET offsetof(stm32_UsbBd, AddrRx)
#define COUNT_RX_OFFSET offsetof(stm32_UsbBd, CountRx)
#define USB_CTRL_RW_MASK 0x070F
#define USB_CTRL_CLEAR_ONLY_MASK 0x8080
#define USB_CTRL_TOGGLE_MASK 0x7070
/* CNTR register flags */
#define bmCTRM 0x8000
#define bmPMAOVRM 0x4000
#define bmERRM 0x2000
#define bmWKUPM 0x1000
#define bmSUSPM 0x0800
#define bmRESETM 0x0400
#define bmSOFM 0x0200
#define bmESOFM 0x0100
#define bmRESUME 0x0010
#define bmFSUSP 0x0008
#define bmLPMODE 0x0004
#define bmPDWN 0x0002
#define bmFRES 0x0001
/* USB error codes */
enum stm32_usb_error
{
USB_OK = 0,
USB_INTR_ERROR,
USB_INVAL_ERROR,
USB_NODEV_ERROR,
USB_MEMORY_FULL,
USB_BUF_OVERFLOW,
USB_EP_STALLED,
USB_FATAL_ERROR,
};
/* STM32 USB endpoint types */
enum stm32_UsbEpype
{
EP_BULK = 0,
EP_CTRL,
EP_ISO,
EP_INTERRUPT,
EP_TYPE_MAX
};
/* STM32 USB interrupt status register bits */
typedef union
{
uint32_t status;
struct {
uint8_t EP_ID : 4;
uint8_t DIR : 1;
uint8_t : 2;
uint8_t SZDPR : 1;
uint8_t ESOF : 1;
uint8_t SOF : 1;
uint8_t RESET : 1;
uint8_t SUSP : 1;
uint8_t WKUP : 1;
uint8_t ERR : 1;
uint8_t PMAOVR : 1;
uint8_t CTR : 1;
};
} PACKED stm32_usb_irq_status_t;
/* Endpoint state */
typedef enum
{
EP_DISABLED = 0,
EP_STALL,
EP_NAK,
EP_VALID
} stm32_UsbEpState;
/* STM32 USB supported endpoints */
typedef enum stm32_UsbEP
{
CTRL_ENP_OUT = 0, CTRL_ENP_IN,
ENP1_OUT, ENP1_IN,
ENP2_OUT, ENP2_IN,
ENP3_OUT, ENP3_IN,
ENP4_OUT, ENP4_IN,
ENP5_OUT, ENP5_IN,
ENP6_OUT, ENP6_IN,
ENP7_OUT, ENP7_IN,
ENP8_OUT, ENP8_IN,
ENP9_OUT, ENP9_IN,
ENP10_OUT, ENP10_IN,
ENP11_OUT, ENP11_IN,
ENP12_OUT, ENP12_IN,
ENP13_OUT, ENP13_IN,
ENP14_OUT, ENP14_IN,
ENP15_OUT, ENP15_IN,
EP_MAX_HW_NUM
} stm32_UsbEP;
/* STM32 USB packet memory slot */
typedef struct stm32_UsbMemSlot
{
stm32_UsbEP ep_addr;
uint16_t Start;
uint16_t Size;
struct stm32_UsbMemSlot *next;
} stm32_UsbMemSlot;
/* STM32 USB buffer descriptor (packet memory) */
typedef struct stm32_UsbBd
{
uint16_t AddrTx;
uint16_t CountTx;
uint16_t AddrRx;
uint16_t CountRx;
} PACKED stm32_UsbBd;
/* STM32 USB endpoint I/O status */
typedef enum stm32_UsbIoStatus
{
NOT_READY = 0,
NO_SERVICED,
BEGIN_SERVICED,
COMPLETE,
BUFFER_UNDERRUN,
BUFFER_OVERRUN,
SETUP_OVERWRITE,
STALLED,
} stm32_UsbIoStatus;
/* STM32 USB hardware endpoint descriptor */
typedef struct stm32_UsbEp
{
reg32_t *hw;
uint8_t type;
void (*complete)(int);
ssize_t max_size;
ssize_t offset;
ssize_t size;
stm32_UsbIoStatus status;
union
{
uint8_t *read_buffer;
const uint8_t *write_buffer;
};
int32_t avail_data;
uint8_t flags;
} stm32_UsbEp;
/* STM32 USB hardware endpoint flags */
#define STM32_USB_EP_AVAIL_DATA BV(0)
#define STM32_USB_EP_ZERO_PACKET BV(1)
#define STM32_USB_EP_ZERO_POSSIBLE BV(2)
#endif /* USB_STM32_H */