/*****************************************************************************
 * Copyright (c) 2013 IBM Corporation
 * All rights reserved.
 * This program and the accompanying materials
 * are made available under the terms of the BSD License
 * which accompanies this distribution, and is available at
 * http://www.opensource.org/licenses/bsd-license.php
 *
 * Contributors:
 *     IBM Corporation - initial implementation
 *****************************************************************************/

#ifndef __USB_CORE_H
#define __USB_CORE_H

#include <stdio.h>
#include <stdbool.h>
#include "helpers.h"
#include "usb.h"
#include "tools.h"

enum usb_hcd_type {
	USB_OHCI = 1,
	USB_EHCI = 2,
	USB_XHCI = 3,
};

struct usb_hcd_dev;

struct usb_hcd_dev {
	void *base;
	long type;
	long num;
	struct usb_hcd_ops *ops;
	void *priv; /* hcd owned structure */
	long nextaddr; /* address for devices */
};

struct usb_pipe;

/*******************************************/
/* Standard Endpoint Descriptor            */
/*******************************************/
/* bmAttributes */
#define USB_EP_TYPE_MASK          0x03
#define USB_EP_TYPE_CONTROL       0
#define USB_EP_TYPE_ISOC          1
#define USB_EP_TYPE_BULK          2
#define USB_EP_TYPE_INTR          3

struct usb_ep_descr {
	uint8_t		bLength;		/* size of descriptor */
	uint8_t		bDescriptorType;	/* Type = 5 */
	uint8_t		bEndpointAddress;
	uint8_t		bmAttributes;
	uint16_t	wMaxPacketSize;
	uint8_t		bInterval;
} __attribute__((packed));

#define	DEV_HID_KEYB            0x030101	/* class=HIB,	protocol=Keyboard */
#define	DEV_HID_MOUSE           0x030102	/* class=HIB,	protocol=Mouse */
#define	DEV_HUB                 0x090000	/* class=HUB, subclass, protocol */
#define	DEV_MASS_RBC            0x080150	/* MassStorage, RBC, Bulk */
#define	DEV_CDROM_ATAPI         0x080250	/* MassStorage, SFF-8020i , Bulk */
#define	DEV_MASS_FLOPPY         0x080450	/* MassStorage, UFI, Bulk */
#define	DEV_MASS_ATAPI          0x080550	/* MassStorage, SFF-8070i , Bulk */
#define	DEV_MASS_SCSI           0x080650	/* MassStorage, SCSI, Bulk */

enum USB_SPEED_TYPE {
	USB_LOW_SPEED = 0,
	USB_FULL_SPEED = 1,
	USB_HIGH_SPEED = 2,
};

/* Max number of endpoints supported in a device */
#define USB_DEV_EP_MAX 4
#define USB_TIMEOUT    5000 /* 5 sec usb timeout */

struct usb_dev {
	struct usb_dev     *next;
	struct usb_hcd_dev *hcidev;
	struct usb_pipe    *intr;
	struct usb_pipe    *control;
	struct usb_pipe    *bulk_in;
	struct usb_pipe    *bulk_out;
	struct usb_ep_descr ep[USB_DEV_EP_MAX];
	uint32_t ep_cnt;
	uint32_t class;
	uint32_t speed;
	uint32_t addr;
	uint32_t mps0;
	uint32_t port;
	uint16_t intf_num;
};

#define DEVICE_KEYBOARD    1
#define DEVICE_MOUSE       2
#define DEVICE_DISK        3
#define DEVICE_HUB         4

/* Structure in sync with FORTH code */
struct slof_usb_dev {
	void     *udev;
	uint32_t port;
	uint32_t addr;
	uint32_t hcitype;
	uint32_t num;
	uint32_t devtype;
} __attribute__((packed));

enum USB_PIPE_DIR {
	USB_PIPE_OUT = 0,
	USB_PIPE_IN,
};

struct usb_pipe {
	struct usb_dev *dev;
	struct usb_pipe *next;
	uint32_t type;
	uint32_t speed;
	uint32_t dir;
	uint16_t epno;
	uint16_t mps;
} __attribute__((packed));

#define	REQ_GET_STATUS		     0	/* see Table 9-4 */
#define	REQ_CLEAR_FEATURE	     1
#define	REQ_GET_STATE		     2	/* HUB specific */
#define	REQ_SET_FEATURE		     3
#define	REQ_SET_ADDRESS		     5
#define	REQ_GET_DESCRIPTOR	     6
#define	REQ_SET_DESCRIPTOR	     7
#define	REQ_GET_CONFIGURATION	     8
#define	REQ_SET_CONFIGURATION	     9
#define	REQ_GET_INTERFACE	     10
#define	REQ_SET_INTERFACE	     11
#define	REQ_SYNCH_FRAME              12

#define REQT_REC_DEVICE              0
#define REQT_REC_INTERFACE           1
#define REQT_REC_EP                  2
#define REQT_REC_OTHER               3
#define REQT_TYPE_STANDARD           (0 << 5)
#define REQT_TYPE_CLASS              (1 << 5)
#define REQT_TYPE_VENDOR             (2 << 5)
#define REQT_TYPE_RSRVD              (3 << 5)
#define REQT_DIR_OUT                 (0 << 7) /* host -> device */
#define REQT_DIR_IN                  (1 << 7) /* device -> host */

#define	DESCR_TYPE_DEVICE		1	/* see Table 9-5 */
#define	DESCR_TYPE_CONFIGURATION	2
#define	DESCR_TYPE_STRING		3
#define	DESCR_TYPE_INTERFACE		4
#define	DESCR_TYPE_ENDPOINT		5
#define	DESCR_TYPE_HUB			0x29	/* Class Descriptor HUB */
#define DESCR_TYPE_HID			0x21	/* Class Descriptor HID */
#define DESCR_TYPE_REPORT		0x22	/* Class Descriptor HID */
#define DESCR_TYPE_PHYSICAL		0x23	/* Class Descriptor HID */

struct usb_dev_req {
	uint8_t		bmRequestType;		/* direction, recipient */
	uint8_t		bRequest;		/* see spec: Table 9-3 */
	uint16_t	wValue;
	uint16_t	wIndex;
	uint16_t	wLength;		/* number of bytes to transfer */
} __attribute__((packed));

/* Standard Device Descriptor (18 Bytes)   */
/*******************************************/
struct usb_dev_descr {
	uint8_t		bLength;
	uint8_t		bDescriptorType;
	uint16_t	bcdUSB;
	uint8_t		bDeviceClass;
	uint8_t		bDeviceSubClass;
	uint8_t		bDeviceProtocol;
	uint8_t		bMaxPacketSize0;
	uint16_t	idVendor;
	uint16_t	idProduct;
	uint16_t	bcdDevice;
	uint8_t		iManufacturer;
	uint8_t		iProduct;
	uint8_t		iSerialNumber;
	uint8_t		bNumConfigurations;
} __attribute__((packed));

/*******************************************/
/* Standard Configuration Descriptor       */
/*******************************************/
struct usb_dev_config_descr {
	uint8_t		bLength;		/* size of descriptor */
	uint8_t		bDescriptorType;	/* Type = 2 */
	uint16_t	wTotalLength;		/* total returned data */
	uint8_t		bNumInterfaces;		/* interfaces supported by this config */
	uint8_t		bConfigurationValue;	/* Configuration-ID for SetConfiguration */
	uint8_t		iConfiguration;		/* index of string descriptor */
	uint8_t		bmAttributes;		/* configuration characteristics */
	uint8_t		bMaxPower;		/* in 2mA units */
} __attribute__((packed));

/*******************************************/
/* Standard Interface Descriptor */
/*******************************************/
struct usb_dev_intf_descr {
	uint8_t		bLength;		/* size of descriptor */
	uint8_t		bDescriptorType;	/* Type = 4 */
	uint8_t		bInterfaceNumber;
	uint8_t		bAlternateSetting;
	uint8_t		bNumEndpoints;
	uint8_t		bInterfaceClass;
	uint8_t		bInterfaceSubClass;
	uint8_t		bInterfaceProtocol;	/* protocol code */
	uint8_t		iInterface;		/* index to string descriptor */
} __attribute__((packed));

/*******************************************/
/* HUB-Class Descriptor                    */
/*******************************************/
struct usb_dev_hub_descr {
	uint8_t		bLength;		/* size of complete descriptor */
	uint8_t		bDescriptorType;	/* type = 0x29 for HUB */
	uint8_t		bNbrPorts;		/* number of downstream ports */
	uint8_t		wHubCharacteristics;	/* mode bits	7..0 */
	uint8_t		reserved;		/* mode bits 15..8 */
	uint8_t		bPwrOn2PwrGood;		/* in 2ms units */
	uint8_t		bHubContrCurrent;	/* current requirement in mA */
	uint8_t		DeviceTable;	        /* length depends on number of ports */
} __attribute__((packed));

/*******************************************/
/* HID-Class Descriptor                    */
/*******************************************/
struct usb_dev_hid_descr {
	uint8_t		bLength;		/* size of this descriptor */
	uint8_t		bDescriptorType;	/* type = 0x21 for HID     */
	uint16_t	bcdHID;			/* Sample: 0x0102 for 2.01  */
	uint8_t		bCountryCode;		/* Hardware target country */
	uint8_t		bNumDescriptors;	/* Number of HID class descr. */
	uint8_t		bReportType;		/* Report Descriptor Type */
	uint16_t	wReportLength;		/* Total Length of Report Descr. */
} __attribute__((packed));

struct usb_hcd_ops {
	const char *name;
	void (*init)(struct usb_hcd_dev *);
	void (*exit)(struct usb_hcd_dev *);
	void (*detect)(void);
	void (*disconnect)(void);
	int  (*send_ctrl)(struct usb_pipe *pipe, struct usb_dev_req *req, void *data);
	struct usb_pipe* (*get_pipe)(struct usb_dev *dev, struct usb_ep_descr *ep,
				char *buf, size_t len);
	int  (*transfer_bulk)(struct usb_pipe *pipe, void *td, void *td_phys, void *data, int size);
	void (*put_pipe)(struct usb_pipe *);
	int (*poll_intr)(struct usb_pipe *, uint8_t *);
	struct usb_hcd_ops *next;
	unsigned int usb_type;
};

extern void usb_hcd_register(struct usb_hcd_ops *ops);
extern struct usb_pipe *usb_get_pipe(struct usb_dev *dev, struct usb_ep_descr *ep,
				char *buf, size_t len);
extern void usb_put_pipe(struct usb_pipe *pipe);
extern int usb_poll_intr(struct usb_pipe *pipe, uint8_t *buf);
extern int usb_send_ctrl(struct usb_pipe *pipe, struct usb_dev_req *req, void *data);
extern struct usb_dev *usb_devpool_get(void);
extern void usb_devpool_put(struct usb_dev *);
extern int setup_new_device(struct usb_dev *dev, unsigned int port);
extern int slof_usb_handle(struct usb_dev *dev);
extern int usb_dev_populate_pipe(struct usb_dev *dev, struct usb_ep_descr *ep,
				void *buf, size_t len);
extern int usb_hid_kbd_init(struct usb_dev *dev);
extern int usb_hid_kbd_exit(struct usb_dev *dev);

#endif
