grml...
[seabios.git] / src / usb.h
index 5a6fc0f788fd09374944c65293e9ec3af1439c8f..8b2af405d917916319eaee35bf5c066d1ce50cbb 100644 (file)
--- a/src/usb.h
+++ b/src/usb.h
@@ -4,84 +4,59 @@
 
 #include "util.h" // struct mutex_s
 
+// Information on a USB end point.
 struct usb_pipe {
-    u32 endp;
+    struct usb_s *cntl;
+    u64 path;
+    u8 type;
+    u8 ep;
+    u8 devaddr;
+    u8 speed;
+    u16 maxpacket;
+    u8 tt_devaddr;
+    u8 tt_port;
 };
 
-// Local information for a usb controller.
+// Common information for usb controllers.
 struct usb_s {
-    u8 type;
-    u8 maxaddr;
-    u16 bdf;
     struct usb_pipe *defaultpipe;
     struct mutex_s resetlock;
+    struct pci_device *pci;
+    int busid;
+    u8 type;
+    u8 maxaddr;
+};
 
-    union {
-        struct {
-            u16 iobase;
-            void *control_qh, *bulk_qh, *framelist;
-        } uhci;
-        struct {
-            struct ohci_regs *regs;
-        } 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[];
+#define USB_FULLSPEED 0
+#define USB_LOWSPEED  1
+#define USB_HIGHSPEED 2
 
 #define USB_MAXADDR 127
 
-// usb.c
-void usb_setup(void);
-struct usb_pipe *usb_set_address(struct usb_s *cntl, int lowspeed);
-int configure_usb_device(struct usb_pipe *pipe);
-struct usb_ctrlrequest;
-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(u32 endp);
-struct usb_pipe *alloc_intr_pipe(u32 endp, int period);
-int usb_poll_intr(struct usb_pipe *pipe, void *data);
-struct usb_interface_descriptor;
-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);
-
-
-/****************************************************************
- * endpoint definition
- ****************************************************************/
-
-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 structs and flags
@@ -216,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