| #ifndef __USB_XHCI_H |
| #define __USB_XHCI_H |
| |
| struct usbdevice_s; |
| struct usb_endpoint_descriptor; |
| struct usb_pipe; |
| |
| // -------------------------------------------------------------- |
| |
| // usb-xhci.c |
| void xhci_setup(void); |
| struct usb_pipe *xhci_realloc_pipe(struct usbdevice_s *usbdev |
| , struct usb_pipe *upipe |
| , struct usb_endpoint_descriptor *epdesc); |
| int xhci_send_pipe(struct usb_pipe *p, int dir, const void *cmd |
| , void *data, int datasize); |
| int xhci_poll_intr(struct usb_pipe *p, void *data); |
| |
| // -------------------------------------------------------------- |
| // register interface |
| |
| // capabilities |
| struct xhci_caps { |
| u8 caplength; |
| u8 reserved_01; |
| u16 hciversion; |
| u32 hcsparams1; |
| u32 hcsparams2; |
| u32 hcsparams3; |
| u32 hccparams; |
| u32 dboff; |
| u32 rtsoff; |
| } PACKED; |
| |
| // extended capabilities |
| struct xhci_xcap { |
| u32 cap; |
| u32 data[]; |
| } PACKED; |
| |
| // operational registers |
| struct xhci_op { |
| u32 usbcmd; |
| u32 usbsts; |
| u32 pagesize; |
| u32 reserved_01[2]; |
| u32 dnctl; |
| u32 crcr_low; |
| u32 crcr_high; |
| u32 reserved_02[4]; |
| u32 dcbaap_low; |
| u32 dcbaap_high; |
| u32 config; |
| } PACKED; |
| |
| // port registers |
| struct xhci_pr { |
| u32 portsc; |
| u32 portpmsc; |
| u32 portli; |
| u32 reserved_01; |
| } PACKED; |
| |
| // doorbell registers |
| struct xhci_db { |
| u32 doorbell; |
| } PACKED; |
| |
| // runtime registers |
| struct xhci_rts { |
| u32 mfindex; |
| } PACKED; |
| |
| // interrupter registers |
| struct xhci_ir { |
| u32 iman; |
| u32 imod; |
| u32 erstsz; |
| u32 reserved_01; |
| u32 erstba_low; |
| u32 erstba_high; |
| u32 erdp_low; |
| u32 erdp_high; |
| } PACKED; |
| |
| // -------------------------------------------------------------- |
| // memory data structs |
| |
| // slot context |
| struct xhci_slotctx { |
| u32 ctx[4]; |
| u32 reserved_01[4]; |
| } PACKED; |
| |
| // endpoint context |
| struct xhci_epctx { |
| u32 ctx[2]; |
| u32 deq_low; |
| u32 deq_high; |
| u32 length; |
| u32 reserved_01[3]; |
| } PACKED; |
| |
| // device context array element |
| struct xhci_devlist { |
| u32 ptr_low; |
| u32 ptr_high; |
| } PACKED; |
| |
| // input context |
| struct xhci_inctx { |
| u32 del; |
| u32 add; |
| u32 reserved_01[6]; |
| } PACKED; |
| |
| // transfer block (ring element) |
| struct xhci_trb { |
| u32 ptr_low; |
| u32 ptr_high; |
| u32 status; |
| u32 control; |
| } PACKED; |
| |
| // event ring segment |
| struct xhci_er_seg { |
| u32 ptr_low; |
| u32 ptr_high; |
| u32 size; |
| u32 reserved_01; |
| } PACKED; |
| |
| #endif // usb-xhci.h |