#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, *framelist;
- } uhci;
- struct {
- struct ohci_regs *regs;
- void *control_ed;
- } ohci;
- };
};
-#define USB_TYPE_UHCI 1
-#define USB_TYPE_OHCI 2
-
-extern struct usb_s USBControllers[];
-
-struct usb_pipe {
- u32 endp;
+// 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;
};
-#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);
+// 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
/****************************************************************
#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