📄 r8a66597.h
字号:
#define PBUSY 0x0020 /* b5: pipe busy */#define PINGE 0x0010 /* b4: ping enable */#define CCPL 0x0004 /* b2: Enable control transfer complete */#define PID 0x0003 /* b1-0: Response PID */#define PID_STALL11 0x0003 /* STALL */#define PID_STALL 0x0002 /* STALL */#define PID_BUF 0x0001 /* BUF */#define PID_NAK 0x0000 /* NAK *//* Pipe Window Select Register */#define PIPENM 0x0007 /* b2-0: Pipe select *//* Pipe Configuration Register */#define R8A66597_TYP 0xC000 /* b15-14: Transfer type */#define R8A66597_ISO 0xC000 /* Isochronous */#define R8A66597_INT 0x8000 /* Interrupt */#define R8A66597_BULK 0x4000 /* Bulk */#define R8A66597_BFRE 0x0400 /* b10: Buffer ready interrupt mode select */#define R8A66597_DBLB 0x0200 /* b9: Double buffer mode select */#define R8A66597_CNTMD 0x0100 /* b8: Continuous transfer mode select */#define R8A66597_SHTNAK 0x0080 /* b7: Transfer end NAK */#define R8A66597_DIR 0x0010 /* b4: Transfer direction select */#define R8A66597_EPNUM 0x000F /* b3-0: Eendpoint number select *//* Pipe Buffer Configuration Register */#define BUFSIZE 0x7C00 /* b14-10: Pipe buffer size */#define BUFNMB 0x007F /* b6-0: Pipe buffer number */#define PIPE0BUF 256#define PIPExBUF 64/* Pipe Maxpacket Size Register */#define MXPS 0x07FF /* b10-0: Maxpacket size *//* Pipe Cycle Configuration Register */#define IFIS 0x1000 /* b12: Isochronous in-buffer flush mode select */#define IITV 0x0007 /* b2-0: Isochronous interval *//* Pipex Control Register */#define BSTS 0x8000 /* b15: Buffer status */#define INBUFM 0x4000 /* b14: IN buffer monitor (Only for PIPE1 to 5) */#define CSCLR 0x2000 /* b13: complete-split status clear */#define CSSTS 0x1000 /* b12: complete-split status */#define ATREPM 0x0400 /* b10: Auto repeat mode */#define ACLRM 0x0200 /* b9: Out buffer auto clear mode */#define SQCLR 0x0100 /* b8: Sequence toggle bit clear */#define SQSET 0x0080 /* b7: Sequence toggle bit set */#define SQMON 0x0040 /* b6: Sequence toggle bit monitor */#define PBUSY 0x0020 /* b5: pipe busy */#define PID 0x0003 /* b1-0: Response PID *//* PIPExTRE */#define TRENB 0x0200 /* b9: Transaction counter enable */#define TRCLR 0x0100 /* b8: Transaction counter clear *//* PIPExTRN */#define TRNCNT 0xFFFF /* b15-0: Transaction counter *//* DEVADDx */#define UPPHUB 0x7800#define HUBPORT 0x0700#define USBSPD 0x00C0#define RTPORT 0x0001#define R8A66597_MAX_NUM_PIPE 10#define R8A66597_BUF_BSIZE 8#define R8A66597_MAX_DEVICE 10#if defined(CONFIG_SUPERH_ON_CHIP_R8A66597)#define R8A66597_MAX_ROOT_HUB 1#else#define R8A66597_MAX_ROOT_HUB 2#endif#define R8A66597_MAX_SAMPLING 5#define R8A66597_RH_POLL_TIME 10#define BULK_IN_PIPENUM 3#define BULK_IN_BUFNUM 8#define BULK_OUT_PIPENUM 4#define BULK_OUT_BUFNUM 40#define check_bulk_or_isoc(pipenum) ((pipenum >= 1 && pipenum <= 5))#define check_interrupt(pipenum) ((pipenum >= 6 && pipenum <= 9))#define make_devsel(addr) (addr << 12)struct r8a66597 { unsigned long reg; unsigned short pipe_config; /* bit field */ unsigned short port_status; unsigned short port_change; u16 speed; /* HSMODE or FSMODE or LSMODE */ unsigned char rh_devnum;};static inline u16 r8a66597_read(struct r8a66597 *r8a66597, unsigned long offset){ return inw(r8a66597->reg + offset);}static inline void r8a66597_read_fifo(struct r8a66597 *r8a66597, unsigned long offset, void *buf, int len){ int i;#if defined(CONFIG_SUPERH_ON_CHIP_R8A66597) unsigned long fifoaddr = r8a66597->reg + offset; unsigned long count; unsigned long *p = buf; count = len / 4; for (i = 0; i < count; i++) inl(p[i], r8a66597->reg + offset); if (len & 0x00000003) { unsigned long tmp = inl(fifoaddr); memcpy((unsigned char *)buf + count * 4, &tmp, len & 0x03); }#else unsigned short *p = buf; len = (len + 1) / 2; for (i = 0; i < len; i++) p[i] = inw(r8a66597->reg + offset);#endif}static inline void r8a66597_write(struct r8a66597 *r8a66597, u16 val, unsigned long offset){ outw(val, r8a66597->reg + offset);}static inline void r8a66597_write_fifo(struct r8a66597 *r8a66597, unsigned long offset, void *buf, int len){ int i; unsigned long fifoaddr = r8a66597->reg + offset;#if defined(CONFIG_SUPERH_ON_CHIP_R8A66597) unsigned long count; unsigned char *pb; unsigned long *p = buf; count = len / 4; for (i = 0; i < count; i++) outl(p[i], fifoaddr); if (len & 0x00000003) { pb = (unsigned char *)buf + count * 4; for (i = 0; i < (len & 0x00000003); i++) { if (r8a66597_read(r8a66597, CFIFOSEL) & BIGEND) outb(pb[i], fifoaddr + i); else outb(pb[i], fifoaddr + 3 - i); } }#else int odd = len & 0x0001; unsigned short *p = buf; len = len / 2; for (i = 0; i < len; i++) outw(p[i], fifoaddr); if (odd) { unsigned char *pb = (unsigned char *)(buf + len); outb(*pb, fifoaddr); }#endif}static inline void r8a66597_mdfy(struct r8a66597 *r8a66597, u16 val, u16 pat, unsigned long offset){ u16 tmp; tmp = r8a66597_read(r8a66597, offset); tmp = tmp & (~pat); tmp = tmp | val; r8a66597_write(r8a66597, tmp, offset);}#define r8a66597_bclr(r8a66597, val, offset) \ r8a66597_mdfy(r8a66597, 0, val, offset)#define r8a66597_bset(r8a66597, val, offset) \ r8a66597_mdfy(r8a66597, val, 0, offset)static inline unsigned long get_syscfg_reg(int port){ return port == 0 ? SYSCFG0 : SYSCFG1;}static inline unsigned long get_syssts_reg(int port){ return port == 0 ? SYSSTS0 : SYSSTS1;}static inline unsigned long get_dvstctr_reg(int port){ return port == 0 ? DVSTCTR0 : DVSTCTR1;}static inline unsigned long get_dmacfg_reg(int port){ return port == 0 ? DMA0CFG : DMA1CFG;}static inline unsigned long get_intenb_reg(int port){ return port == 0 ? INTENB1 : INTENB2;}static inline unsigned long get_intsts_reg(int port){ return port == 0 ? INTSTS1 : INTSTS2;}static inline u16 get_rh_usb_speed(struct r8a66597 *r8a66597, int port){ unsigned long dvstctr_reg = get_dvstctr_reg(port); return r8a66597_read(r8a66597, dvstctr_reg) & RHST;}static inline void r8a66597_port_power(struct r8a66597 *r8a66597, int port, int power){ unsigned long dvstctr_reg = get_dvstctr_reg(port); if (power) r8a66597_bset(r8a66597, VBOUT, dvstctr_reg); else r8a66597_bclr(r8a66597, VBOUT, dvstctr_reg);}#define get_pipectr_addr(pipenum) (PIPE1CTR + (pipenum - 1) * 2)#define get_pipetre_addr(pipenum) (PIPE1TRE + (pipenum - 1) * 4)#define get_pipetrn_addr(pipenum) (PIPE1TRN + (pipenum - 1) * 4)#define get_devadd_addr(address) (DEVADD0 + address * 2)/* USB HUB CONSTANTS (not OHCI-specific; see hub.h, based on usb_ohci.h) *//* destination of request */#define RH_INTERFACE 0x01#define RH_ENDPOINT 0x02#define RH_OTHER 0x03#define RH_CLASS 0x20#define RH_VENDOR 0x40/* Requests: bRequest << 8 | bmRequestType */#define RH_GET_STATUS 0x0080#define RH_CLEAR_FEATURE 0x0100#define RH_SET_FEATURE 0x0300#define RH_SET_ADDRESS 0x0500#define RH_GET_DESCRIPTOR 0x0680#define RH_SET_DESCRIPTOR 0x0700#define RH_GET_CONFIGURATION 0x0880#define RH_SET_CONFIGURATION 0x0900#define RH_GET_STATE 0x0280#define RH_GET_INTERFACE 0x0A80#define RH_SET_INTERFACE 0x0B00#define RH_SYNC_FRAME 0x0C80/* Our Vendor Specific Request */#define RH_SET_EP 0x2000/* Hub port features */#define RH_PORT_CONNECTION 0x00#define RH_PORT_ENABLE 0x01#define RH_PORT_SUSPEND 0x02#define RH_PORT_OVER_CURRENT 0x03#define RH_PORT_RESET 0x04#define RH_PORT_POWER 0x08#define RH_PORT_LOW_SPEED 0x09#define RH_C_PORT_CONNECTION 0x10#define RH_C_PORT_ENABLE 0x11#define RH_C_PORT_SUSPEND 0x12#define RH_C_PORT_OVER_CURRENT 0x13#define RH_C_PORT_RESET 0x14/* Hub features */#define RH_C_HUB_LOCAL_POWER 0x00#define RH_C_HUB_OVER_CURRENT 0x01#define RH_DEVICE_REMOTE_WAKEUP 0x00#define RH_ENDPOINT_STALL 0x01#define RH_ACK 0x01#define RH_REQ_ERR -1#define RH_NACK 0x00/* OHCI ROOT HUB REGISTER MASKS *//* roothub.portstatus [i] bits */#define RH_PS_CCS 0x00000001 /* current connect status */#define RH_PS_PES 0x00000002 /* port enable status*/#define RH_PS_PSS 0x00000004 /* port suspend status */#define RH_PS_POCI 0x00000008 /* port over current indicator */#define RH_PS_PRS 0x00000010 /* port reset status */#define RH_PS_PPS 0x00000100 /* port power status */#define RH_PS_LSDA 0x00000200 /* low speed device attached */#define RH_PS_CSC 0x00010000 /* connect status change */#define RH_PS_PESC 0x00020000 /* port enable status change */#define RH_PS_PSSC 0x00040000 /* port suspend status change */#define RH_PS_OCIC 0x00080000 /* over current indicator change */#define RH_PS_PRSC 0x00100000 /* port reset status change *//* roothub.status bits */#define RH_HS_LPS 0x00000001 /* local power status */#define RH_HS_OCI 0x00000002 /* over current indicator */#define RH_HS_DRWE 0x00008000 /* device remote wakeup enable */#define RH_HS_LPSC 0x00010000 /* local power status change */#define RH_HS_OCIC 0x00020000 /* over current indicator change */#define RH_HS_CRWE 0x80000000 /* clear remote wakeup enable *//* roothub.b masks */#define RH_B_DR 0x0000ffff /* device removable flags */#define RH_B_PPCM 0xffff0000 /* port power control mask *//* roothub.a masks */#define RH_A_NDP (0xff << 0) /* number of downstream ports */#define RH_A_PSM (1 << 8) /* power switching mode */#define RH_A_NPS (1 << 9) /* no power switching */#define RH_A_DT (1 << 10) /* device type (mbz) */#define RH_A_OCPM (1 << 11) /* over current protection mode */#define RH_A_NOCP (1 << 12) /* no over current protection */#define RH_A_POTPGT (0xff << 24) /* power on to power good time */#endif /* __R8A66597_H__ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -