00001
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050 #ifndef _USB_HOST_ENUM_H_
00051 #define _USB_HOST_ENUM_H_
00052
00053
00054
00055
00056 #include "conf_usb.h"
00057
00058 #if USB_HOST_FEATURE == DISABLED
00059 #error usb_host_enum.h is #included although USB_HOST_FEATURE is disabled
00060 #endif
00061
00062
00063 #include "compiler.h"
00064 #include "usb_drv.h"
00065 #include "usb_task.h"
00066
00067
00070
00071
00072
00073
00074
00075
00076
00078 typedef struct
00079 {
00080 U8 bmRequestType;
00081 U8 bRequest;
00082 U16 wValue;
00083 U16 wIndex;
00084 U16 wLength;
00085 Bool incomplete_read;
00086 } S_usb_setup_data;
00087
00089 typedef struct
00090 {
00091 U8 interface_nb;
00092 U8 altset_nb;
00093 U8 nb_ep;
00094 U8 uclass;
00095 U8 subclass;
00096 U8 protocol;
00097 U8 ep_pipe[MAX_EP_PER_INTERFACE];
00098 } S_interface;
00099
00100 #define CONTROL_GOOD 0x00
00101 #define CONTROL_DATA_TOGGLE 0x01
00102 #define CONTROL_DATA_PID 0x02
00103 #define CONTROL_PID 0x04
00104 #define CONTROL_TIMEOUT 0x08
00105 #define CONTROL_CRC16 0x10
00106 #define CONTROL_STALL 0x20
00107 #define CONTROL_NO_DEVICE 0x40
00108
00110 #define OFFSET_DESCRIPTOR_LENGTH 0
00111 #define OFFSET_FIELD_DESCRIPTOR_TYPE 1
00112
00114 #define OFFSET_FIELD_MAXPACKETSIZE 7
00115 #define OFFSET_FIELD_VID 8
00116 #define OFFSET_FIELD_PID 10
00117 #define OFFSET_FIELD_NB_CONFIGURATION 17
00118
00120 #define OFFSET_FIELD_TOTAL_LENGTH 2
00121 #define OFFSET_FIELD_NB_INTERFACE 4
00122 #define OFFSET_FIELD_CONFIGURATION_NB 5
00123 #define OFFSET_FIELD_BMATTRIBUTES 7
00124 #define REMOTE_WAKEUP_BIT 5
00125 #define REMOTE_WAKEUP_MASK (1 << REMOTE_WAKEUP_BIT)
00126 #define SELF_POWERED_BIT 6
00127 #define SELF_POWERED_MASK (1 << SELF_POWERED_BIT)
00128 #define OFFSET_FIELD_MAXPOWER 8
00129
00131 #define OFFSET_FIELD_INTERFACE_NB 2
00132 #define OFFSET_FIELD_ALT 3
00133 #define OFFSET_FIELD_NB_OF_EP 4
00134 #define OFFSET_FIELD_CLASS 5
00135 #define OFFSET_FIELD_SUB_CLASS 6
00136 #define OFFSET_FIELD_PROTOCOL 7
00137
00139 #define OFFSET_FIELD_EP_ADDR 2
00140 #define OFFSET_FIELD_EP_TYPE 3
00141 #define OFFSET_FIELD_EP_SIZE 4
00142 #define OFFSET_FIELD_EP_INTERVAL 6
00143
00147 #define host_clear_endpoint_feature(ep) \
00148 (\
00149 usb_request.bmRequestType = 0x02,\
00150 usb_request.bRequest = CLEAR_FEATURE,\
00151 usb_request.wValue = FEATURE_ENDPOINT_HALT << 8,\
00152 usb_request.wIndex = (ep),\
00153 usb_request.wLength = 0,\
00154 usb_request.incomplete_read = FALSE,\
00155 host_transfer_control(data_stage)\
00156 )
00157
00160 #define host_get_configuration() \
00161 (\
00162 usb_request.bmRequestType = 0x80,\
00163 usb_request.bRequest = GET_CONFIGURATION,\
00164 usb_request.wValue = 0,\
00165 usb_request.wIndex = 0,\
00166 usb_request.wLength = 1,\
00167 usb_request.incomplete_read = FALSE,\
00168 host_transfer_control(data_stage)\
00169 )
00170
00174 #define host_set_configuration(cfg_nb) \
00175 (\
00176 usb_request.bmRequestType = 0x00,\
00177 usb_request.bRequest = SET_CONFIGURATION,\
00178 usb_request.wValue = (cfg_nb),\
00179 usb_request.wIndex = 0,\
00180 usb_request.wLength = 0,\
00181 usb_request.incomplete_read = FALSE,\
00182 host_transfer_control(data_stage)\
00183 )
00184
00189 #define host_set_interface(interface_nb, alt_setting) \
00190 (\
00191 usb_request.bmRequestType = 0x01,\
00192 usb_request.bRequest = SET_INTERFACE,\
00193 usb_request.wValue = (alt_setting),\
00194 usb_request.wIndex = (interface_nb),\
00195 usb_request.wLength = 0,\
00196 usb_request.incomplete_read = FALSE,\
00197 host_transfer_control(data_stage)\
00198 )
00199
00204 #define host_get_device_descriptor_incomplete() \
00205 (\
00206 usb_request.bmRequestType = 0x80,\
00207 usb_request.bRequest = GET_DESCRIPTOR,\
00208 usb_request.wValue = DEVICE_DESCRIPTOR << 8,\
00209 usb_request.wIndex = 0,\
00210 usb_request.wLength = 64,\
00211 usb_request.incomplete_read = TRUE,\
00212 host_transfer_control(data_stage)\
00213 )
00214
00218 #define host_get_device_descriptor() \
00219 (\
00220 usb_request.bmRequestType = 0x80,\
00221 usb_request.bRequest = GET_DESCRIPTOR,\
00222 usb_request.wValue = DEVICE_DESCRIPTOR << 8,\
00223 usb_request.wIndex = 0,\
00224 usb_request.wLength = 18,\
00225 usb_request.incomplete_read = FALSE,\
00226 host_transfer_control(data_stage)\
00227 )
00228
00233 #define host_get_configuration_descriptor(cfg_ix) \
00234 (\
00235 usb_request.bmRequestType = 0x80,\
00236 usb_request.bRequest = GET_DESCRIPTOR,\
00237 usb_request.wValue = CONFIGURATION_DESCRIPTOR << 8 | (cfg_ix),\
00238 usb_request.wIndex = 0,\
00239 usb_request.wLength = SIZEOF_DATA_STAGE,\
00240 usb_request.incomplete_read = FALSE,\
00241 host_transfer_control(data_stage)\
00242 )
00243
00247 #define host_set_address(addr) \
00248 (\
00249 usb_request.bmRequestType = 0x00,\
00250 usb_request.bRequest = SET_ADDRESS,\
00251 usb_request.wValue = (addr),\
00252 usb_request.wIndex = 0,\
00253 usb_request.wLength = 0,\
00254 usb_request.incomplete_read = FALSE,\
00255 host_transfer_control(data_stage)\
00256 )
00257
00260 #define host_set_feature_remote_wakeup() \
00261 (\
00262 usb_request.bmRequestType = 0x00,\
00263 usb_request.bRequest = SET_FEATURE,\
00264 usb_request.wValue = 1,\
00265 usb_request.wIndex = 1,\
00266 usb_request.wLength = 0,\
00267 usb_request.incomplete_read = FALSE,\
00268 host_transfer_control(data_stage)\
00269 )
00270
00273 #define host_ms_get_max_lun() \
00274 (\
00275 usb_request.bmRequestType = 0xA1,\
00276 usb_request.bRequest = MS_GET_MAX_LUN,\
00277 usb_request.wValue = 0,\
00278 usb_request.wIndex = 0,\
00279 usb_request.wLength = 1,\
00280 usb_request.incomplete_read = FALSE,\
00281 host_transfer_control(data_stage)\
00282 )
00283
00286 #define Get_VID() (device_VID)
00287
00290 #define Get_PID() (device_PID)
00291
00294 #define Is_device_supports_remote_wakeup() (Tst_bits(bmattributes, REMOTE_WAKEUP_MASK))
00295
00298 #define Is_device_self_powered() (Tst_bits(bmattributes, SELF_POWERED_MASK))
00299
00302 #define Get_maxpower() (maxpower)
00303
00306 #define Get_nb_supported_interface() (nb_interface_supported)
00307
00311 #define Get_interface_number(s_interface) (interface_supported[(s_interface)].interface_nb)
00312
00316 #define Get_altset_nb(s_interface) (interface_supported[(s_interface)].altset_nb)
00317
00321 #define Get_class(s_interface) (interface_supported[(s_interface)].uclass)
00322
00326 #define Get_subclass(s_interface) (interface_supported[(s_interface)].subclass)
00327
00331 #define Get_protocol(s_interface) (interface_supported[(s_interface)].protocol)
00332
00336 #define Get_nb_ep(s_interface) (interface_supported[(s_interface)].nb_ep)
00337
00342 #define Get_ep_pipe(s_interface, n_ep) (interface_supported[(s_interface)].ep_pipe[(n_ep)])
00343
00348 #define Get_ep_nbr(s_interface, n_ep) (Host_get_pipe_endpoint_number(Get_ep_pipe(s_interface, n_ep)))
00349
00354 #define Get_ep_type(s_interface, n_ep) (Host_get_pipe_type(Get_ep_pipe(s_interface, n_ep)))
00355
00360 #define Is_ep_in(s_interface, n_ep) (Host_get_pipe_token(Get_ep_pipe(s_interface, n_ep)) == TOKEN_IN)
00361
00365 #define Get_pipe_token(ep_addr) ((Get_desc_ep_dir(ep_addr)) ? TOKEN_IN : TOKEN_OUT)
00366
00367 extern Bool host_check_VID_PID(void);
00368 extern Bool host_check_class(void);
00369 extern Status_t host_transfer_control(void *data_pointer);
00370
00371 extern volatile U16 device_VID;
00372 extern volatile U16 device_PID;
00373 extern volatile U8 bmattributes;
00374 extern volatile U8 maxpower;
00375 extern volatile U8 nb_interface_supported;
00376 extern volatile S_interface interface_supported[MAX_INTERFACE_SUPPORTED];
00377
00378
00380
00381
00382 #endif // _USB_HOST_ENUM_H_