X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fusb.h;h=8b2af405d917916319eaee35bf5c066d1ce50cbb;hb=refs%2Fheads%2Fcoreboot;hp=cc71c31a5de5a366c9dc23a245150b1105ffa094;hpb=1ca05b0f393c0201c0e8efe87831edddb6a53532;p=seabios.git diff --git a/src/usb.h b/src/usb.h index cc71c31..8b2af40 100644 --- a/src/usb.h +++ b/src/usb.h @@ -2,78 +2,74 @@ #ifndef __USB_H #define __USB_H -// Local information for a usb controller. +#include "util.h" // struct mutex_s + +// Information on a USB end point. +struct usb_pipe { + struct usb_s *cntl; + u64 path; + u8 type; + u8 ep; + u8 devaddr; + u8 speed; + u16 maxpacket; + u8 tt_devaddr; + u8 tt_port; +}; + +// Common information for usb controllers. struct usb_s { + struct usb_pipe *defaultpipe; + struct mutex_s resetlock; + struct pci_device *pci; + int busid; u8 type; u8 maxaddr; - u16 bdf; - - union { - struct { - u16 iobase; - void *qh; - } uhci; - struct { - struct ohci_regs *regs; - void *control_ed; - } ohci; - }; +}; + +// Information for enumerating USB hubs +struct usbhub_s { + struct usbhub_op_s *op; + struct usb_pipe *pipe; + struct usb_s *cntl; + struct mutex_s lock; + u32 powerwait; + u32 port; + u32 threads; + u32 portcount; + u32 devcount; +}; + +// Hub callback (32bit) info +struct usbhub_op_s { + int (*detect)(struct usbhub_s *hub, u32 port); + int (*reset)(struct usbhub_s *hub, u32 port); + void (*disconnect)(struct usbhub_s *hub, u32 port); }; #define USB_TYPE_UHCI 1 #define USB_TYPE_OHCI 2 +#define USB_TYPE_EHCI 3 -extern struct usb_s USBControllers[]; - -struct usb_pipe { - u32 endp; -}; +#define USB_FULLSPEED 0 +#define USB_LOWSPEED 1 +#define USB_HIGHSPEED 2 #define USB_MAXADDR 127 -// usb.c -void usb_setup(void); -int configure_usb_device(struct usb_s *cntl, int lowspeed); -struct usb_ctrlrequest; -int send_default_control(u32 endp, const struct usb_ctrlrequest *req - , void *data); -struct usb_pipe *alloc_intr_pipe(u32 endp, int period); -int usb_poll_intr(struct usb_pipe *pipe, void *data); - /**************************************************************** - * endpoint definition + * usb structs and flags ****************************************************************/ -static inline u32 -mkendp(struct usb_s *cntl, u8 devaddr, u8 ep, u8 lowspeed, u8 maxsize) -{ - u8 bus = cntl-USBControllers; - u8 size = __ffs(maxsize); - return (size<<25) | (lowspeed<<24) | (bus<<16) | (devaddr<<8) | ep; -} - -static inline u8 endp2ep(u32 endp) { - return endp; -} -static inline u8 endp2devaddr(u32 endp) { - return endp>>8; -} -static inline struct usb_s *endp2cntl(u32 endp) { - u8 bus = endp>>16; - return &USBControllers[bus]; -} -static inline u8 endp2speed(u32 endp) { - return (endp>>24) & 1; -} -static inline u8 endp2maxsize(u32 endp) { - return 1 << (endp>>25); -} +// USB mandated timings (in ms) +#define USB_TIME_SIGATT 100 +#define USB_TIME_ATTDB 100 +#define USB_TIME_DRST 10 +#define USB_TIME_DRSTR 50 +#define USB_TIME_RSTRCY 10 - -/**************************************************************** - * usb structs and flags - ****************************************************************/ +#define USB_TIME_SETADDR_RECOVERY 2 #define USB_PID_OUT 0xe1 #define USB_PID_IN 0x69 @@ -195,4 +191,26 @@ struct usb_endpoint_descriptor { #define USB_ENDPOINT_XFER_INT 3 #define USB_ENDPOINT_MAX_ADJUSTABLE 0x80 + +/**************************************************************** + * function defs + ****************************************************************/ + +// usb.c +void usb_setup(void); +void usb_enumerate(struct usbhub_s *hub); +int send_default_control(struct usb_pipe *pipe, const struct usb_ctrlrequest *req + , void *data); +int usb_send_bulk(struct usb_pipe *pipe, int dir, void *data, int datasize); +void free_pipe(struct usb_pipe *pipe); +struct usb_pipe *alloc_bulk_pipe(struct usb_pipe *pipe + , struct usb_endpoint_descriptor *epdesc); +struct usb_pipe *alloc_intr_pipe(struct usb_pipe *pipe + , struct usb_endpoint_descriptor *epdesc); +int usb_poll_intr(struct usb_pipe *pipe, void *data); +struct usb_endpoint_descriptor *findEndPointDesc( + struct usb_interface_descriptor *iface, int imax, int type, int dir); +u32 mkendpFromDesc(struct usb_pipe *pipe + , struct usb_endpoint_descriptor *epdesc); + #endif // usb.h