X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fusb.h;h=8b2af405d917916319eaee35bf5c066d1ce50cbb;hb=refs%2Fheads%2Fcoreboot;hp=e8d74553403a4f5731a6b78732e29a52dc67706a;hpb=114592f000d5bc89b7d149e320a31ab209e20b41;p=seabios.git diff --git a/src/usb.h b/src/usb.h index e8d7455..8b2af40 100644 --- a/src/usb.h +++ b/src/usb.h @@ -2,62 +2,75 @@ #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 { - u16 bdf; - u16 iobase; + struct usb_pipe *defaultpipe; + struct mutex_s resetlock; + struct pci_device *pci; + int busid; + u8 type; u8 maxaddr; - void *qh; }; -extern struct usb_s USBControllers[]; - -#define USB_MAXADDR 127 +// 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; +}; -// usb.c -void usb_setup(); -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); -void *alloc_intr_pipe(u32 endp, int period); -int usb_poll_intr(void *pipe, void *data); +// 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 -/**************************************************************** - * endpoint definition - ****************************************************************/ +#define USB_FULLSPEED 0 +#define USB_LOWSPEED 1 +#define USB_HIGHSPEED 2 -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); -} +#define USB_MAXADDR 127 /**************************************************************** * usb structs and flags ****************************************************************/ +// 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 + +#define USB_TIME_SETADDR_RECOVERY 2 + #define USB_PID_OUT 0xe1 #define USB_PID_IN 0x69 #define USB_PID_SETUP 0x2d @@ -178,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