00001 #ifndef USB_H
00002
00003 #define USB_H
00004
00005 #include <stdint.h>
00006 #include <stdbool.h>
00007 #include <kernel/list.h>
00008
00009 #define USB_HOST_ERR_NONE 0
00010 #define USB_HOST_ERR_BITSTUFF 1
00011 #define USB_HOST_ERR_TIMEOUT 2
00012 #define USB_HOST_ERR_NAK 3
00013 #define USB_HOST_ERR_BABBLE 4
00014 #define USB_HOST_ERR_BUFFER 5
00015 #define USB_HOST_ERR_STALL 6
00016 #define USB_HOST_ERR_NODEV 7
00017
00018 #define make_usb_pid(x) ((x) | ((~(x)) << 4))
00019
00020
00021 #define USB_PID_OUT make_usb_pid(1)
00022 #define USB_PID_IN make_usb_pid(9)
00023 #define USB_PID_SOF make_usb_pid(5)
00024 #define USB_PID_SETUP make_usb_pid(13)
00025
00026 #define USB_PID_DATA0 make_usb_pid(3)
00027 #define USB_PID_DATA1 make_usb_pid(11)
00028 #define USB_PID_DATA2 make_usb_pid(7)
00029 #define USB_PID_MDATA make_usb_pid(15)
00030
00031 #define USB_PID_ACK make_usb_pid(2)
00032 #define USB_PID_NAK make_usb_pid(10)
00033 #define USB_PID_STALL make_usb_pid(14)
00034 #define USB_PID_NYET make_usb_pid(6)
00035
00036 #define USB_PID_PRE make_usb_pid(12)
00037 #define USB_PID_ERR make_usb_pid(12)
00038 #define USB_PID_SPLIT make_usb_pid(8)
00039 #define USB_PID_PING make_usb_pid(4)
00040
00041
00042 #define REQ_STD_GET_STATUS 0
00043 #define REQ_STD_CLR_FEAT 1
00044 #define REQ_STD_SET_FEAT 3
00045 #define REQ_STD_SET_ADDRESS 5
00046 #define REQ_STD_GET_DESC 6
00047 #define REQ_STD_SET_DESC 7
00048 #define REQ_STD_GET_CONFIG 8
00049 #define REQ_STD_SET_CONFIG 9
00050 #define REQ_STD_GET_IFACE 10
00051 #define REQ_STD_SET_IFACE 11
00052 #define REQ_STD_SYNCH_FRAME 12
00053
00054
00055 #define USB_TOKEN_SETUP 0x00
00056 #define USB_TOKEN_IN 0x80
00057 #define USB_TOKEN_OUT 0x90
00058
00059 struct class;
00060 struct host;
00061 typedef void *host_info;
00062 typedef void *host_eop_info;
00063 typedef void *host_dev_info;
00064 typedef void *class_info;
00065
00066
00067 struct usb_iface
00068 {
00069 int iface_num;
00070 int class_id, subclass_id;
00071 int proto;
00072
00073 struct usb_dev *dev;
00074
00075 struct class *class;
00076 class_info c_info;
00077
00078 struct list_elem class_peers;
00079 struct list endpoints;
00080
00081 struct list_elem peers;
00082 };
00083
00084 #define USB_SPEED_1 0
00085 #define USB_SPEED_1_1 1
00086 #define USB_SPEED_2 2
00087
00088 struct usb_host
00089 {
00090 const char *name;
00091 int (*detect_change) (host_info);
00092 int (*tx_pkt) (host_eop_info, int pid, void *pkt,
00093 int min_sz, int max_sz, int *in_sz, bool wait);
00094
00095 host_eop_info (*create_eop)(host_dev_info, int eop, int maxpkt);
00096 void (*remove_eop)(host_eop_info);
00097
00098 host_dev_info (*create_dev_channel) (host_info, int dev_addr, int ver);
00099 void (*modify_dev_channel) (host_dev_info, int dev_addr, int ver);
00100 void (*remove_dev_channel) (host_dev_info);
00101
00102 void (*set_toggle) (host_eop_info, int toggle);
00103 };
00104
00105 struct usb_dev;
00106 struct usb_class
00107 {
00108 const int class_id;
00109 const char *name;
00110
00111
00112
00113 void *(*attached) (struct usb_iface *);
00114
00115
00116 void (*detached) (class_info info);
00117 };
00118
00119 #define USB_VERSION_1_0 0x100
00120 #define USB_VERSION_1_1 0x110
00121 #define USB_VERSION_2 0x200
00122
00123 #define USB_EOP_ATTR_CTL 0
00124 #define USB_EOP_ATTR_ISO 1
00125 #define USB_EOP_ATTR_BULK 2
00126 #define USB_EOP_ATTR_INT 3
00127 struct usb_endpoint
00128 {
00129 int eop;
00130 int attr;
00131 int direction;
00132 int max_pkt;
00133 int interval;
00134 struct usb_iface *iface;
00135 host_eop_info h_eop;
00136 struct list_elem peers;
00137 };
00138
00139 struct usb_dev
00140 {
00141 uint8_t addr;
00142 int usb_version;
00143 int class_id, subclass_id;
00144 uint16_t product_id, vendor_id, device_id;
00145 int interface;
00146 int max_pkt_len;
00147 int int_period;
00148 char *manufacturer;
00149 char *product;
00150 int pwr;
00151 bool ignore_device;
00152 struct list interfaces;
00153
00154 struct list_elem host_peers;
00155 struct list_elem sys_peers;
00156
00157 struct usb_iface default_iface;
00158 struct usb_endpoint cfg_eop;
00159
00160 host_dev_info h_dev;
00161 host_eop_info h_cfg_eop;
00162 struct host *host;
00163 };
00164
00165
00166 #define USB_SETUP_TYPE_STD 0
00167 #define USB_SETUP_TYPE_CLASS 1
00168 #define USB_SETUP_TYPE_VENDOR 2
00169
00170 #define USB_SETUP_RECIP_DEV 0
00171 #define USB_SETUP_RECIP_IFACE 1
00172 #define USB_SETUP_RECIP_ENDPT 2
00173 #define USB_SETUP_RECIP_OTHER 3
00174
00175 #pragma pack(1)
00176 struct usb_setup_pkt
00177 {
00178 uint8_t recipient:5;
00179 uint8_t type:2;
00180 uint8_t direction:1;
00181 uint8_t request;
00182 uint16_t value;
00183 uint16_t index;
00184 uint16_t length;
00185 };
00186 #pragma pack()
00187
00188 void usb_init (void);
00189 void usb_storage_init (void);
00190
00191 void usb_register_host (struct usb_host *, host_info info);
00192 int usb_unregister_host (struct usb_host *, host_info info);
00193 int usb_register_class (struct usb_class *);
00194 int usb_unregister_class (struct usb_class *);
00195
00196 int usb_dev_bulk (struct usb_endpoint *eop, void *buf, int sz, int *tx);
00197 int usb_dev_setup (struct usb_endpoint *eop, bool in,
00198 struct usb_setup_pkt *s, void *buf, int sz);
00199 int usb_dev_wait_int (struct usb_dev *);
00200
00201 #endif