gint/include/gint/mpu/usb.h

392 lines
11 KiB
C

//---
// gint:intc:usb - USB 2.0 Interface
//---
#ifndef GINT_MPU_USB
#define GINT_MPU_USB
#ifdef __cplusplus
extern "C" {
#endif
#include <gint/defs/types.h>
typedef struct
{
word_union(TRE,
uint16_t :6;
uint16_t TRENB :1; /* Transaction Counter Enable */
uint16_t TRCLR :1; /* Transaction Counter Clear */
uint16_t :8;
);
word_union(TRN,
uint16_t TRCNT :16; /* Transaction Counter */
);
} sh7305_usb_pipetr;
typedef volatile struct
{
/* System Configuration Control Register */
word_union(SYSCFG,
uint16_t :5;
uint16_t SCKE :1; /* USB Module Clock Enabled */
uint16_t :2;
uint16_t HSE :1; /* High Speed Enable */
uint16_t DCFM :1; /* Controller Function Select */
uint16_t DRPD :1; /* D+/D- Line Resistor Control */
uint16_t DPRPU :1; /* D+ Line Resistor Control */
uint16_t :3;
uint16_t USBE :1; /* USB Module Enable */
);
/* CPU Bus Wait Setting Register */
word_union(BUSWAIT,
uint16_t :8;
uint16_t _1 :1; /* Unknown role; can be set */
uint16_t :1;
uint16_t _2 :1; /* Unknown role; can be set */
uint16_t :1;
uint16_t BWAIT :4; /* Bus Wait */
);
/* System Configuration Status Register */
const word_union(SYSSTS,
uint16_t :14;
uint16_t LNST :2; /* Line Status */
);
pad(2);
/* Device State Control Register */
word_union(DVSTCTR,
uint16_t _1 :1; /* Unknown role; can be set */
uint16_t :2;
uint16_t _2 :4; /* Unknown role; can be set */
uint16_t WKUP :1; /* Wakeup Output */
uint16_t RWUPE :1; /* Wakeup Detection Enable */
uint16_t USBRT :1; /* USB Reset Output */
uint16_t RESUME :1; /* Resume Output */
uint16_t UACT :1; /* USB Bus Enable */
uint16_t :1;
uint16_t RHST :3; /* Reset Handshake */
);
pad(2);
/* Test Mode Register */
word_union(TESTMODE,
uint16_t :12;
uint16_t UTST :4; /* Test Mode */
);
pad(6);
/* FIFO Port Registers */
uint32_t CFIFO; /* DCP FIFO port */
uint32_t D0FIFO; /* Data 0 FIFO port */
uint32_t D1FIFO; /* Data 1 FIFO port */
/* FIFO Port Select and Control Registers */
word_union(CFIFOSEL,
uint16_t RCNT :1; /* Read Count Mode */
uint16_t REW :1; /* Pointer Buffer Rewind */
uint16_t :2;
uint16_t MBW :2; /* Access Bits Width */
uint16_t :1;
uint16_t BIGEND :1; /* Endiant Control */
uint16_t :2;
uint16_t ISEL :1; /* Access Direction When DCP is used */
uint16_t :1;
uint16_t CURPIPE:4; /* Port Access Pipe Specification */
);
word_union(CFIFOCTR,
uint16_t BVAL :1; /* Buffer Memory Valid Flags */
uint16_t BCLR :1; /* CPU Buffer Clear */
uint16_t FRDY :1; /* FIFO Port Ready */
uint16_t :1;
uint16_t DTLN :12; /* Receive Data Length */
);
pad(4);
word_union(D0FIFOSEL,
uint16_t RCNT :1; /* Read Count Mode */
uint16_t REW :1; /* Pointer Buffer Rewind */
uint16_t DCLRM :1; /* Auto Buffer Clear Mode */
uint16_t DREQE :1; /* DMA Transfert Request Enable */
uint16_t MBW :2; /* Access Bits Width */
uint16_t :1;
uint16_t BIGEND :1; /* Endian Control */
uint16_t _1 :1; /* Unknown role; can be set */
uint16_t :3;
uint16_t CURPIPE:4; /* Port Access Pipe Specification */
);
word_union(D0FIFOCTR,
uint16_t BVAL :1; /* Buffer Memory Valid Flags */
uint16_t BCLR :1; /* CPU Buffer Clear */
uint16_t FRDY :1; /* FIFO Port Ready */
uint16_t :1;
uint16_t DTLN :12; /* Receive Data Length */
);
word_union(D1FIFOSEL,
uint16_t RCNT :1; /* Read Count Mode */
uint16_t REW :1; /* Pointer Buffer Rewind */
uint16_t DCLRM :1; /* Auto Buffer Clear Mode */
uint16_t DREQE :1; /* DMA Transfert Request Enable */
uint16_t MBW :2; /* Access Bits Width */
uint16_t :1;
uint16_t BIGEND :1; /* Endian Control */
uint16_t _1 :1; /* Unknown role; can be set */
uint16_t :3;
uint16_t CURPIPE:4; /* Port Access Pipe Specification */
);
word_union(D1FIFOCTR,
uint16_t BVAL :1; /* Buffer Memory Valid Flags */
uint16_t BCLR :1; /* CPU Buffer Clear */
uint16_t FRDY :1; /* FIFO Port Ready */
uint16_t :1;
uint16_t DTLN :12; /* Receive Data Length */
);
/* Interrupts Enable Registers */
word_union(INTENB0,
uint16_t VBSE :1; /* VBUS */
uint16_t RSME :1; /* Resume */
uint16_t SOFE :1; /* Frame Number Update */
uint16_t DVSE :1; /* Device State Transition */
uint16_t CTRE :1; /* Control Transfer Stage Transition */
uint16_t BEMPE :1; /* Buffer Empty */
uint16_t NRDYE :1; /* Buffer Not Ready */
uint16_t BRDYE :1; /* Buffer Ready */
uint16_t :8;
);
word_union(INTENB1,
uint16_t _1 :1; /* Unknown role; can be set */
uint16_t BCHGE :1; /* Bus Change */
uint16_t :1;
uint16_t DTCHE :1; /* Disconnection Detection */
uint16_t ATTCHE :1; /* Connection Detection */
uint16_t :4;
uint16_t EOFERRE:1; /* EOF Error Detection */
uint16_t SIGNE :1; /* Setup Transaction Error */
uint16_t SACKE :1; /* Setup Transaction Normal Response */
uint16_t :4;
);
pad(2);
/* BRDY Interrupt Enable Register */
uint16_t BRDYENB;
/* NRDY Interrupt Enable Register */
uint16_t NRDYENB;
/* BEMP Interrupt Enable Register */
uint16_t BEMPENB;
/* SOF Control Register */
word_union(SOFCFG,
uint16_t :7;
uint16_t TRNENSEL :1; /* Transaction-Enabled Time Select */
uint16_t :1;
uint16_t BRDYM :1; /* BRDY Status Clear Timing */
uint16_t enable :1; /* SHOULD BE SET TO 1 MANUALLY */
uint16_t :1;
uint16_t _1 :1; /* Unknown role; can be set */
uint16_t _2 :1; /* Unknown role; can be set */
uint16_t :2;
);
pad(2);
/* Interrupt Status Registers */
word_union(INTSTS0,
uint16_t VBINT :1; /* VBUS */
uint16_t RESM :1; /* Resume */
uint16_t SOFR :1; /* Frame Number Refresh */
uint16_t DVST :1; /* Device State Transition */
uint16_t CTRT :1; /* Control Transfer Stage Transition */
uint16_t BEMP :1; /* Buffer Empty */
uint16_t NRDY :1; /* Buffer Not Ready */
uint16_t BRDY :1; /* Buffer Ready */
uint16_t VBSTS :1; /* VBUS Input Status */
uint16_t DVSQ :3; /* Device state */
uint16_t VALID :1; /* USB Request Reception */
uint16_t CTSQ :3; /* Control Transfer Stage */
);
word_union(INTSTS1,
uint16_t _1 :1; /* Unknown role */
uint16_t BCHG :1; /* Bus Change */
uint16_t :1;
uint16_t DTCH :1; /* Disconnection Detection */
uint16_t ATTCH :1; /* Connection Detection */
uint16_t :4;
uint16_t EOFERR :1; /* EOF Error Detection */
uint16_t SIGN :1; /* Setup Transaction Error */
uint16_t SACK :1; /* Setup Transaction Normal Response */
uint16_t :4;
);
pad(2);
/* BRDY Interrupt Status Register */
uint16_t BRDYSTS;
/* NRDY Interrupt Status Register */
uint16_t NRDYSTS;
/* BEMP Interrupt Status Register */
uint16_t BEMPSTS;
/* Frame Number Registers */
word_union(FRMNUM,
uint16_t OVRN :1; /* Overrun/Underrun Detection Status */
uint16_t CRCE :1; /* Receive Data Error */
uint16_t const :3;
uint16_t FRNM :11; /* Frame Number */
);
word_union(UFRMNUM,
uint16_t :13;
uint16_t UFRNM :3; /* uFrame */
);
/* USB Address Register */
word_union(USBADDR,
uint16_t :9;
uint16_t const USBADDR :7; /* USB Address */
);
pad(2);
/* USB Request Type Register */
word_union(USBREQ,
uint16_t BREQUEST :8; /* USB request data value */
uint16_t BMREQUEST :8; /* USB request type value */
);
/* USB Request Value Register */
word_union(USBVAL,
uint16_t WVALUE :16; /* USB request wValue value */
);
/* USB Request Index Register */
word_union(USBINDX,
uint16_t WINDEX :16; /* USB USB request wIndex value */
);
/* USB Request Length Register */
word_union(USBLENG,
uint16_t WLENGTH :16; /* USB USB request wLength value */
);
/* DCP Configuration Register */
word_union(DCPCFG,
uint16_t :7;
uint16_t _1 :1; /* Unknown role; can be set */
uint16_t _2 :1; /* Unknown role; can be set */
uint16_t :2;
uint16_t DIR :1; /* Transfer Direction */
uint16_t :4;
);
/* DCP Maximum Packet Size Register */
word_union(DCPMAXP,
uint16_t DEVSEL :4; /* Device Select */
uint16_t :5;
uint16_t MXPS :7; /* Maximum Packet Size */
);
/* DCP Control Register */
word_union(DCPCTR,
uint16_t BSTS :1; /* Buffer Status */
uint16_t SUREQ :1; /* SETUP Token Transmission */
uint16_t CSCLR :1; /* C-SPLIT Status Clear */
uint16_t CSSTS :1; /* C-SPLIT Status */
uint16_t SUREQCLR :1; /* SUREQ Bit Clear */
uint16_t :2;
uint16_t SQCLR :1; /* Toggle Bit Clear */
uint16_t SQSET :1; /* Toggle Bit Set */
uint16_t SQMON :1; /* Sequence Toggle Bit Monitor */
uint16_t PBUSY :1; /* Pipe Busy */
uint16_t PINGE :1; /* PING Token Issue Enable */
uint16_t :1;
uint16_t CCPL :1; /* Control Transfer End Enable */
uint16_t PID :2; /* Response PID */
);
pad(2);
/* Pipe Window Select Register */
word_union(PIPESEL,
uint16_t :12;
uint16_t PIPESEL :4; /* Pipe Window Select */
);
pad(2);
/* Pipe Configuration Register */
word_union(PIPECFG,
uint16_t TYPE :2; /* Transfer Type */
uint16_t :3;
uint16_t BFRE :1; /* BRDY Interrupt Operation Specification */
uint16_t DBLB :1; /* Double Buffer Mode */
uint16_t CNTMD :1; /* Continuous Transfer Mode */
uint16_t SHTNAK :1; /* Pipe Disabled at End of Transfer */
uint16_t :2;
uint16_t DIR :1; /* Transfer Direction */
uint16_t EPNUM :4; /* Endpoint Number */
);
/* Pipe Buffer Setting Register */
word_union(PIPEBUF,
uint16_t :1;
uint16_t BUFSIZE:5; /* Buffer Size */
uint16_t :2;
uint16_t BUFNMB :8; /* Buffer Number */
);
/* Pipe Maximum Packet Size Register */
word_union(PIPEMAXP,
uint16_t DEVSEL :4; /* Device Select */
uint16_t :1;
uint16_t MXPS :11; /* Maximum Packet Size */
);
/* Pipe Timing Control Register */
word_union(PIPEPERI,
uint16_t :3;
uint16_t IFIS :1; /* Isochronous IN Buffer Flush */
uint16_t :9;
uint16_t IITV :3; /* Interval Error Detection Interval */
);
/* PIPEn Control Registers */
word_union(PIPECTR[9],
uint16_t BSTS :1; /* Buffer Status */
uint16_t INBUFM :1; /* IN Buffer Monitor (PIPE1..5) */
uint16_t CSCLR :1; /* C-SPLIT Status Clear Bit */
uint16_t CSSTS :1; /* CSSTS Status Bit */
uint16_t :1;
uint16_t ATREPM :1; /* Auto Response Mode (PIPE1..5) */
uint16_t ACLRM :1; /* Auto Buffer Clear Mode */
uint16_t SQCLR :1; /* Toggle Bit Clear */
uint16_t SQSET :1; /* Toggle Bit Set */
uint16_t SQMON :1; /* Toggle Bit Confirmation */
uint16_t PBUSY :1; /* Pipe Busy */
uint16_t :3;
uint16_t PID :2; /* Response PID */
);
pad(14);
/* Transaction Counter Registers (PIPE1..PIPE5 only) */
sh7305_usb_pipetr PIPETR[5];
pad(0x1e);
uint16_t REG_C2;
pad(12);
word_union(DEVADD[11],
uint16_t :1;
uint16_t UPPHUB :4; /* Address of target's hub */
uint16_t HUBPORT:3; /* Hub port where target connects */
uint16_t USBSPD :2; /* Transfer speed / Target present */
uint16_t :6;
);
} GPACKED(4) sh7305_usb_t;
typedef volatile word_union(sh7305_usb_uponcr_t,
uint16_t :5;
uint16_t UPON :2; /* USB Power ON */
uint16_t :9;
);
#define SH7305_USB (*(sh7305_usb_t *)0xa4d80000)
#define SH7305_USB_UPONCR (*(sh7305_usb_uponcr_t *)0xa40501d4)
#ifdef __cplusplus
}
#endif
#endif /* GINT_MPU_USB */