#include <cfg/compiler.h>
#include <drv/usb.h>
+#include <drv/usb_endpoint.h>
#define USB_BASE_ADDR 0x40005C00
#define USB_DISC_PIN (1 << 11)
#define USB_EP0_MAX_SIZE 8
-#define USB_RX_MAX_SIZE 64
-#define USB_TX_MAX_SIZE 64
+#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
/* Offset of the buffer descriptor table inside the packet memory */
#define USB_BDT_OFFSET \
- ((USB_PACKET_MEMORY_SIZE - (sizeof(stm32_usb_bd_t) * ENP_MAX_NUMB)) & ~7)
-
-#define addr2usbmem(Offset) \
- (USB_PACKET_MEMORY_BASE + ((Offset << 1) & ~3) + (Offset & 1))
-
-#define ReadEpDTB(Slot, Offset) \
- (*((uint16_t *)(addr2usbmem((USB_BDT_OFFSET + \
- (Slot) * sizeof(stm32_usb_bd_t) + \
- (Offset))))))
+ ((USB_PACKET_MEMORY_SIZE - (sizeof(stm32_UsbBd) * EP_MAX_HW_NUM)) & ~7)
-#define WriteEpDTB(Slot, Offset, Data) (ReadEpDTB(Slot, Offset) = Data)
+#define USB_MEM_ADDR(offset) \
+ (USB_PACKET_MEMORY_BASE + ((offset << 1) & ~3) + (offset & 1))
-#define AddrTxOffset 0
-#define CountTxOffset 2
-#define AddrRxOffset 4
-#define CountRxOffset 6
+#define EP_DTB_READ(slot, offset) \
+ (*((uint16_t *)(USB_MEM_ADDR((USB_BDT_OFFSET + \
+ (slot) * sizeof(stm32_UsbBd) + \
+ (offset))))))
-#define ReadEpDTB_AddrRx(Slot) ReadEpDTB(Slot,AddrRxOffset)
-#define ReadEpDTB_CountRx(Slot) ReadEpDTB(Slot,CountRxOffset)
-#define ReadEpDTB_AddrTx(Slot) ReadEpDTB(Slot,AddrTxOffset)
-#define ReadEpDTB_CountTx(Slot) ReadEpDTB(Slot,CountTxOffset)
+#define EP_DTB_WRITE(slot, offset, data) (EP_DTB_READ(slot, offset) = data)
-#define WriteEpDTB_AddrRx(Slot,Data) WriteEpDTB(Slot,AddrRxOffset,Data)
-#define WriteEpDTB_CountRx(Slot,Data) WriteEpDTB(Slot,CountRxOffset,Data)
-#define WriteEpDTB_AddrTx(Slot,Data) WriteEpDTB(Slot,AddrTxOffset,Data)
-#define WriteEpDTB_CountTx(Slot,Data) WriteEpDTB(Slot,CountTxOffset,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
};
/* STM32 USB endpoint types */
-enum stm32_usb_ep_type
+enum stm32_UsbEpype
{
EP_BULK = 0,
EP_CTRL,
EP_STALL,
EP_NAK,
EP_VALID
-} ep_state_t;
+} stm32_UsbEpState;
/* STM32 USB supported endpoints */
-typedef enum
+typedef enum stm32_UsbEP
{
CTRL_ENP_OUT = 0, CTRL_ENP_IN,
ENP1_OUT, ENP1_IN,
ENP14_OUT, ENP14_IN,
ENP15_OUT, ENP15_IN,
- ENP_MAX_NUMB
-} stm32_usb_endpoint_t;
+ EP_MAX_HW_NUM
+} stm32_UsbEP;
/* STM32 USB packet memory slot */
-typedef struct pack_mem_slot_t
+typedef struct stm32_UsbMemSlot
{
- stm32_usb_endpoint_t ep_addr;
+ stm32_UsbEP ep_addr;
uint16_t Start;
uint16_t Size;
- struct pack_mem_slot_t *next;
-} pack_mem_slot_t;
+ struct stm32_UsbMemSlot *next;
+} stm32_UsbMemSlot;
/* STM32 USB buffer descriptor (packet memory) */
-typedef struct
+typedef struct stm32_UsbBd
{
uint16_t AddrTx;
uint16_t CountTx;
uint16_t AddrRx;
uint16_t CountRx;
-} PACKED stm32_usb_bd_t;
+} PACKED stm32_UsbBd;
/* STM32 USB endpoint I/O status */
-typedef enum
+typedef enum stm32_UsbIoStatus
{
NOT_READY = 0,
NO_SERVICED,
BUFFER_OVERRUN,
SETUP_OVERWRITE,
STALLED,
-} stm32_usb_io_status_t;
+} stm32_UsbIoStatus;
/* STM32 USB hardware endpoint descriptor */
-typedef struct
+typedef struct stm32_UsbEp
{
reg32_t *hw;
uint8_t type;
ssize_t max_size;
ssize_t offset;
ssize_t size;
- stm32_usb_io_status_t status;
+ stm32_UsbIoStatus status;
union
{
uint8_t *read_buffer;
};
int32_t avail_data;
uint8_t flags;
-} stm32_usb_ep_t;
+} stm32_UsbEp;
/* STM32 USB hardware endpoint flags */
#define STM32_USB_EP_AVAIL_DATA BV(0)