336 lines
12 KiB
C
336 lines
12 KiB
C
|
/***************************************************************************
|
||
|
* __________ __ ___.
|
||
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||
|
* \/ \/ \/ \/ \/
|
||
|
* $Id: $
|
||
|
*
|
||
|
* Copyright (C) 2021 by Tomasz Moń
|
||
|
* Ported from Sansa Connect TNETV105 UDC Linux driver
|
||
|
* Copyright (c) 2005 Zermatt Systems, Inc.
|
||
|
* Written by: Ben Bostwick
|
||
|
*
|
||
|
* This program 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||
|
* KIND, either express or implied.
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
#ifndef TNETV105_USB_DRV_H
|
||
|
#define TNETV105_USB_DRV_H
|
||
|
|
||
|
#include <stdint.h>
|
||
|
|
||
|
#define DM320_AHB_PADDR 0x00060000
|
||
|
#define DM320_VLYNQ_PADDR 0x70000000
|
||
|
|
||
|
/* TNETV105 Memory Map */
|
||
|
#define VLYNQ_BASE (0x70000000)
|
||
|
|
||
|
#define TNETV_BASE (VLYNQ_BASE)
|
||
|
#define TNETV_V2USB_BASE (TNETV_BASE + 0x00000200)
|
||
|
#define TNETV_WDOG_BASE (TNETV_BASE + 0x00000280)
|
||
|
#define TNETV_USB_HOST_BASE (TNETV_BASE + 0x00010000)
|
||
|
#define TNETV_USB_DEVICE_BASE (TNETV_BASE + 0x00020000)
|
||
|
|
||
|
#define TNETV_V2USB_REG(x) (TNETV_V2USB_BASE + (x))
|
||
|
|
||
|
#define TNETV_V2USB_RESET (TNETV_V2USB_REG(0x00))
|
||
|
#define TNETV_V2USB_CLK_PERF (TNETV_V2USB_REG(0x04))
|
||
|
#define TNETV_V2USB_CLK_MODE (TNETV_V2USB_REG(0x08))
|
||
|
#define TNETV_V2USB_CLK_CFG (TNETV_V2USB_REG(0x0C))
|
||
|
#define TNETV_V2USB_CLK_WKUP (TNETV_V2USB_REG(0x10))
|
||
|
#define TNETV_V2USB_CLK_PWR (TNETV_V2USB_REG(0x14))
|
||
|
|
||
|
#define TNETV_V2USB_PID_VID (TNETV_V2USB_REG(0x28))
|
||
|
|
||
|
#define TNETV_V2USB_GPIO_DOUT (TNETV_V2USB_REG(0x40))
|
||
|
#define TNETV_V2USB_GPIO_DIN (TNETV_V2USB_REG(0x44))
|
||
|
#define TNETV_V2USB_GPIO_DIR (TNETV_V2USB_REG(0x48))
|
||
|
#define TNETV_V2USB_GPIO_FS (TNETV_V2USB_REG(0x4C))
|
||
|
#define TNETV_V2USB_GPIO_INTF (TNETV_V2USB_REG(0x50))
|
||
|
#define TNETV_V2USB_GPIO_EOI (TNETV_V2USB_REG(0x54))
|
||
|
|
||
|
#define TNETV_USB_DEVICE_REG(x) (TNETV_USB_DEVICE_BASE + (x))
|
||
|
|
||
|
#define TNETV_USB_REV (TNETV_USB_DEVICE_REG(0x00))
|
||
|
#define TNETV_USB_TX_CTL (TNETV_USB_DEVICE_REG(0x04))
|
||
|
#define TNETV_USB_TX_TEARDOWN (TNETV_USB_DEVICE_REG(0x08))
|
||
|
#define TNETV_USB_RX_CTL (TNETV_USB_DEVICE_REG(0x14))
|
||
|
#define TNETV_USB_RX_TEARDOWN (TNETV_USB_DEVICE_REG(0x18))
|
||
|
#define TNETV_USB_TX_ENDIAN_CTL (TNETV_USB_DEVICE_REG(0x40))
|
||
|
#define TNETV_USB_RX_ENDIAN_CTL (TNETV_USB_DEVICE_REG(0x44))
|
||
|
|
||
|
#define TNETV_USB_RX_FREE_BUF_CNT(ch) (TNETV_USB_DEVICE_REG(0x140 + ((ch) * 4)))
|
||
|
|
||
|
#define TNETV_USB_TX_INT_STATUS (TNETV_USB_DEVICE_REG(0x170))
|
||
|
#define TNETV_USB_TX_INT_EN (TNETV_USB_DEVICE_REG(0x178))
|
||
|
#define TNETV_USB_TX_INT_DIS (TNETV_USB_DEVICE_REG(0x17C))
|
||
|
#define TNETV_USB_VBUS_INT (TNETV_USB_DEVICE_REG(0x180))
|
||
|
#define TNETV_USB_VBUS_EOI (TNETV_USB_DEVICE_REG(0x184))
|
||
|
#define TNETV_USB_RX_INT_STATUS (TNETV_USB_DEVICE_REG(0x190))
|
||
|
#define TNETV_USB_RX_INT_EN (TNETV_USB_DEVICE_REG(0x198))
|
||
|
#define TNETV_USB_RX_INT_DIS (TNETV_USB_DEVICE_REG(0x19C))
|
||
|
|
||
|
#define TNETV_USB_RESET_CMPL (TNETV_USB_DEVICE_REG(0x1A0))
|
||
|
#define TNETV_CPPI_STATE (TNETV_USB_DEVICE_REG(0x1A4))
|
||
|
|
||
|
#define TNETV_USB_STATUS (TNETV_USB_DEVICE_REG(0x200))
|
||
|
#define TNETV_USB_CTRL (TNETV_USB_DEVICE_REG(0x204))
|
||
|
#define TNETV_USB_IF_STATUS (TNETV_USB_DEVICE_REG(0x210))
|
||
|
#define TNETV_USB_IF_ERR (TNETV_USB_DEVICE_REG(0x214))
|
||
|
#define TNETV_USB_IF_SM (TNETV_USB_DEVICE_REG(0x218))
|
||
|
|
||
|
#define TNETV_USB_EP0_CFG (TNETV_USB_DEVICE_REG(0x220))
|
||
|
#define TNETV_USB_EP0_CNT (TNETV_USB_DEVICE_REG(0x224))
|
||
|
|
||
|
#define TNETV_USB_EPx_CFG(x) (TNETV_USB_DEVICE_REG(0x220 + (0x10 * (x))))
|
||
|
#define TNETV_USB_EPx_IN_CNT(x) (TNETV_USB_DEVICE_REG(0x224 + (0x10 * (x))))
|
||
|
#define TNETV_USB_EPx_OUT_CNT(x) (TNETV_USB_DEVICE_REG(0x228 + (0x10 * (x))))
|
||
|
#define TNETV_USB_EPx_ADR(x) (TNETV_USB_DEVICE_REG(0x22C + (0x10 * (x))))
|
||
|
|
||
|
/* USB CPPI Config registers (0x300 - 0x30C) */
|
||
|
#define TNETV_USB_RNDIS_MODE (TNETV_USB_DEVICE_REG(0x300))
|
||
|
#define TNETV_USB_CELL_DMA_EN (TNETV_USB_DEVICE_REG(0x30C))
|
||
|
|
||
|
#define TNETV_USB_RAW_INT (TNETV_USB_DEVICE_REG(0x310))
|
||
|
#define TNETV_USB_RAW_EOI (TNETV_USB_DEVICE_REG(0x314))
|
||
|
|
||
|
/* USB DMA setup RAM (0x800 - 0x8FF) */
|
||
|
#define TNETV_DMA_BASE (TNETV_USB_DEVICE_BASE + 0x800)
|
||
|
#define TNETV_DMA_TX_STATE(ch, wd) ((uint32_t *) ((TNETV_DMA_BASE) + ((ch) * 0x40) + ((wd) * 4)))
|
||
|
#define TNETV_DMA_TX_CMPL(ch) ((TNETV_DMA_BASE) + ((ch) * 0x40) + 0x1C)
|
||
|
|
||
|
#define TNETV_CPPI_TX_WORD_HDP 0
|
||
|
|
||
|
#define TNETV_DMA_RX_STATE(ch, wd) ((uint32_t *) ((TNETV_DMA_BASE) + ((ch) * 0x40) + 0x20 + ((wd) * 4)))
|
||
|
#define TNETV_DMA_RX_CMPL(ch) ((TNETV_DMA_BASE) + ((ch) * 0x40) + 0x3C)
|
||
|
|
||
|
#define TNETV_CPPI_RX_WORD_HDP 1
|
||
|
|
||
|
#define TNETV_DMA_NUM_CHANNELS 3
|
||
|
|
||
|
#define TNETV_DMA_TX_NUM_WORDS 6
|
||
|
#define TNETV_DMA_RX_NUM_WORDS 7
|
||
|
|
||
|
|
||
|
/* USB Buffer RAM (0x1000 - 0x1A00) */
|
||
|
#define TNETV_EP_DATA_ADDR(x) ((uint32_t *) ((TNETV_USB_DEVICE_BASE) + 0x1000 + (x)))
|
||
|
|
||
|
#define TNETV_EP_DATA_SIZE (0xA00)
|
||
|
|
||
|
#define TNETV_V2USB_RESET_DEV (1 << 0)
|
||
|
|
||
|
#define TNETV_USB_CELL_DMA_EN_RX (1 << 0)
|
||
|
#define TNETV_USB_CELL_DMA_EN_TX (1 << 1)
|
||
|
|
||
|
#define TNETV_V2USB_CLK_WKUP_VBUS (1 << 12)
|
||
|
|
||
|
#define DM320_VLYNQ_INTPND_PHY ((DM320_AHB_PADDR) + 0x0314)
|
||
|
|
||
|
|
||
|
/* macro to convert from a linux pointer to a physical address
|
||
|
* to be sent over the VLYNQ bus. The dm320 vlynq rx registers are
|
||
|
* set up so the base address is the physical address of RAM
|
||
|
*/
|
||
|
#define __dma_to_vlynq_phys(addr) ((((uint32_t) (addr)) - 0x01000000))
|
||
|
#define __vlynq_phys_to_dma(addr) ((((uint32_t) (addr)) + 0x01000000))
|
||
|
|
||
|
//----------------------------------------------------------------------
|
||
|
|
||
|
#define USB_FULL_SPEED_MAXPACKET 64
|
||
|
#define USB_HIGH_SPEED_MAXPACKET 512
|
||
|
|
||
|
/* WORD offsets into the data memory */
|
||
|
#define EP0_MAX_PACKET_SIZE 64 /* Control ep - 64 bytes */
|
||
|
#define EP1_MAX_PACKET_SIZE 512 /* Bulk ep - 512 bytes */
|
||
|
#define EP2_MAX_PACKET_SIZE 512 /* Bulk ep - 512 bytes */
|
||
|
#define EP3_MAX_PACKET_SIZE 64 /* Int ep - 64 bytes */
|
||
|
#define EP4_MAX_PACKET_SIZE 64 /* Int ep - 64 bytes */
|
||
|
|
||
|
/* BEN TODO: fix this crap */
|
||
|
#define EP0_OUTPKT_ADDRESS 0
|
||
|
#define EP0_INPKT_ADDRESS (EP0_MAX_PACKET_SIZE)
|
||
|
#define EP1_XBUFFER_ADDRESS (EP0_MAX_PACKET_SIZE << 1)
|
||
|
#define EP1_YBUFFER_ADDRESS (EP1_XBUFFER_ADDRESS + EP1_MAX_PACKET_SIZE)
|
||
|
#define EP2_XBUFFER_ADDRESS (EP1_XBUFFER_ADDRESS + (EP1_MAX_PACKET_SIZE << 1))
|
||
|
#define EP2_YBUFFER_ADDRESS (EP2_XBUFFER_ADDRESS + EP2_MAX_PACKET_SIZE)
|
||
|
#define EP3_XBUFFER_ADDRESS (EP2_XBUFFER_ADDRESS + (EP2_MAX_PACKET_SIZE << 1))
|
||
|
#define EP3_YBUFFER_ADDRESS (EP3_XBUFFER_ADDRESS + EP3_MAX_PACKET_SIZE)
|
||
|
#define EP4_XBUFFER_ADDRESS (EP3_XBUFFER_ADDRESS + (EP3_MAX_PACKET_SIZE << 1))
|
||
|
#define EP4_YBUFFER_ADDRESS (EP4_XBUFFER_ADDRESS + EP4_MAX_PACKET_SIZE)
|
||
|
#define EP5_XBUFFER_ADDRESS (EP4_XBUFFER_ADDRESS + (EP4_MAX_PACKET_SIZE << 1))
|
||
|
#define EP5_YBUFFER_ADDRESS (EP5_XBUFFER_ADDRESS + EP1_MAX_PACKET_SIZE)
|
||
|
#define EP6_XBUFFER_ADDRESS (EP5_XBUFFER_ADDRESS + (EP1_MAX_PACKET_SIZE << 1))
|
||
|
#define EP6_YBUFFER_ADDRESS (EP6_XBUFFER_ADDRESS + EP2_MAX_PACKET_SIZE)
|
||
|
#define EP7_XBUFFER_ADDRESS (EP6_XBUFFER_ADDRESS + (EP2_MAX_PACKET_SIZE << 1))
|
||
|
#define EP7_YBUFFER_ADDRESS (EP7_XBUFFER_ADDRESS + EP3_MAX_PACKET_SIZE)
|
||
|
#define EP8_XBUFFER_ADDRESS (EP7_XBUFFER_ADDRESS + (EP3_MAX_PACKET_SIZE << 1))
|
||
|
#define EP8_YBUFFER_ADDRESS (EP8_XBUFFER_ADDRESS + EP4_MAX_PACKET_SIZE)
|
||
|
|
||
|
#define SETUP_PKT_DATA_SIZE 8
|
||
|
|
||
|
#define EP0_BUF_SIZE_8 0
|
||
|
#define EP0_BUF_SIZE_16 1
|
||
|
#define EP0_BUF_SIZE_32 2
|
||
|
#define EP0_BUF_SIZE_64 3
|
||
|
|
||
|
/* USB Status register */
|
||
|
typedef struct {
|
||
|
uint32_t rsvd1 : 5;
|
||
|
uint32_t ep0_out_ack : 1;
|
||
|
uint32_t rsvd2 : 1;
|
||
|
uint32_t ep0_in_ack : 1;
|
||
|
uint32_t rsvd3 : 16;
|
||
|
uint32_t setup_ow : 1;
|
||
|
uint32_t setup : 1;
|
||
|
uint32_t vbus : 1;
|
||
|
uint32_t resume : 1;
|
||
|
uint32_t suspend : 1;
|
||
|
uint32_t reset : 1;
|
||
|
uint32_t sof : 1;
|
||
|
uint32_t any_int : 1;
|
||
|
} UsbStatusStruct;
|
||
|
|
||
|
typedef union {
|
||
|
uint32_t val;
|
||
|
UsbStatusStruct f;
|
||
|
} UsbStatusType;
|
||
|
|
||
|
/* USB Function control register */
|
||
|
typedef struct {
|
||
|
uint32_t dir : 1;
|
||
|
uint32_t hs_test_mode : 3;
|
||
|
uint32_t rsvd1 : 1;
|
||
|
uint32_t wkup_en : 1;
|
||
|
uint32_t low_pwr_en : 1;
|
||
|
uint32_t connect : 1;
|
||
|
uint32_t rsvd2 : 4;
|
||
|
uint32_t ep0_in_int_en : 1;
|
||
|
uint32_t ep0_out_int_en : 1;
|
||
|
uint32_t err_cnt_en : 2;
|
||
|
uint32_t func_addr : 7;
|
||
|
uint32_t speed : 1;
|
||
|
uint32_t setupow_int_en : 1;
|
||
|
uint32_t setup_int_en : 1;
|
||
|
uint32_t vbus_int_en : 1;
|
||
|
uint32_t resume_int_en : 1;
|
||
|
uint32_t suspend_int_en : 1;
|
||
|
uint32_t reset_int_en : 1;
|
||
|
uint32_t sof_int_en : 1;
|
||
|
uint32_t rsvd3 : 1;
|
||
|
} UsbCtrlStruct;
|
||
|
|
||
|
typedef union {
|
||
|
uint32_t val;
|
||
|
UsbCtrlStruct f;
|
||
|
} UsbCtrlType;
|
||
|
|
||
|
/* Endpoint 0 Control Register */
|
||
|
typedef struct {
|
||
|
uint32_t buf_size : 2;
|
||
|
uint32_t in_int_en : 1;
|
||
|
uint32_t in_stall : 1;
|
||
|
uint32_t dbl_buf : 1;
|
||
|
uint32_t in_toggle : 1;
|
||
|
uint32_t in_nak_int_en : 1;
|
||
|
uint32_t in_en : 1;
|
||
|
uint32_t res3 : 10;
|
||
|
uint32_t out_int_en : 1;
|
||
|
uint32_t out_stall : 1;
|
||
|
uint32_t res4 : 1;
|
||
|
uint32_t out_toggle : 1;
|
||
|
uint32_t out_nak_int_en : 1;
|
||
|
uint32_t out_en : 1;
|
||
|
uint32_t res6 : 8;
|
||
|
} UsbEp0CtrlStruct;
|
||
|
|
||
|
typedef union {
|
||
|
uint32_t val;
|
||
|
UsbEp0CtrlStruct f;
|
||
|
} UsbEp0CtrlType;
|
||
|
|
||
|
/* Endpoint 0 current packet size register */
|
||
|
typedef struct {
|
||
|
uint32_t in_xbuf_cnt : 7;
|
||
|
uint32_t in_xbuf_nak : 1;
|
||
|
uint32_t in_ybuf_cnt : 7;
|
||
|
uint32_t in_ybuf_nak : 1;
|
||
|
uint32_t out_xbuf_cnt : 7;
|
||
|
uint32_t out_xbuf_nak : 1;
|
||
|
uint32_t out_ybuf_cnt : 7;
|
||
|
uint32_t out_ybuf_nak : 1;
|
||
|
} UsbEp0ByteCntStruct;
|
||
|
|
||
|
typedef union {
|
||
|
uint32_t val;
|
||
|
UsbEp0ByteCntStruct f;
|
||
|
} UsbEp0ByteCntType;
|
||
|
|
||
|
/* Endpoint n Configuration and Control register */
|
||
|
typedef struct {
|
||
|
uint32_t res1 : 1;
|
||
|
uint32_t in_toggle_rst : 1;
|
||
|
uint32_t in_ack_int : 1;
|
||
|
uint32_t in_stall : 1;
|
||
|
uint32_t in_dbl_buf : 1;
|
||
|
uint32_t in_toggle : 1;
|
||
|
uint32_t in_nak_int : 1;
|
||
|
uint32_t in_en : 1;
|
||
|
uint32_t res2 : 1;
|
||
|
uint32_t out_toggle_rst : 1;
|
||
|
uint32_t out_ack_int : 1;
|
||
|
uint32_t out_stall : 1;
|
||
|
uint32_t out_dbl_buf : 1;
|
||
|
uint32_t out_toggle : 1;
|
||
|
uint32_t out_nak_int : 1;
|
||
|
uint32_t out_en : 1;
|
||
|
uint32_t in_buf_size : 8;
|
||
|
uint32_t out_buf_size : 8;
|
||
|
} UsbEpCfgCtrlStruct;
|
||
|
|
||
|
typedef union {
|
||
|
uint32_t val;
|
||
|
UsbEpCfgCtrlStruct f;
|
||
|
} UsbEpCfgCtrlType;
|
||
|
|
||
|
/* Endpoint n XY Buffer Start Address register */
|
||
|
typedef struct {
|
||
|
uint8_t xBuffStartAddrIn;
|
||
|
uint8_t yBuffStartAddrIn;
|
||
|
uint8_t xBuffStartAddrOut;
|
||
|
uint8_t yBuffStartAddrOut;
|
||
|
} UsbEpStartAddrStruct;
|
||
|
|
||
|
typedef union {
|
||
|
uint32_t val;
|
||
|
UsbEpStartAddrStruct f;
|
||
|
} UsbEpStartAddrType;
|
||
|
|
||
|
/* Endpoint n Packet Control register */
|
||
|
typedef struct {
|
||
|
uint32_t xBufPacketCount : 11;
|
||
|
uint32_t res1 : 4;
|
||
|
uint32_t xbuf_nak : 1;
|
||
|
uint32_t yBufPacketCount : 11;
|
||
|
uint32_t res2 : 4;
|
||
|
uint32_t ybuf_nak : 1;
|
||
|
} UsbEpByteCntStruct;
|
||
|
|
||
|
typedef union {
|
||
|
uint32_t val;
|
||
|
UsbEpByteCntStruct f;
|
||
|
} UsbEpByteCntType;
|
||
|
|
||
|
#define tnetv_usb_reg_read(x) (*((volatile uint32_t *) (x)))
|
||
|
#define tnetv_usb_reg_write(x, val) (*((volatile uint32_t *) (x)) = (uint32_t) (val))
|
||
|
|
||
|
|
||
|
#endif
|