00001
00017
00018
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 #include "conf_usb.h"
00051
00052
00053 #if USB_DEVICE_FEATURE == ENABLED
00054
00055 #include "usb_drv.h"
00056 #include "usb_descriptors.h"
00057 #include "usb_standard_request.h"
00058 #include "usb_specific_request.h"
00059 #include "ctrl_access.h"
00060
00061
00062
00063
00064
00065
00066
00067 volatile Bool ms_multiple_drive;
00068
00069
00070
00071
00072 extern const void *pbuffer;
00073 extern U16 data_to_transfer;
00074
00075
00076
00077
00081 void usb_user_endpoint_init(U8 conf_nb)
00082 {
00083 ms_multiple_drive = FALSE;
00084
00085 #if (USB_HIGH_SPEED_SUPPORT==ENABLED)
00086 if( !Is_usb_full_speed_mode() )
00087 {
00088 (void)Usb_configure_endpoint(EP_MS_IN,
00089 EP_ATTRIBUTES_1,
00090 DIRECTION_IN,
00091 EP_SIZE_1_HS,
00092 DOUBLE_BANK);
00093
00094 (void)Usb_configure_endpoint(EP_MS_OUT,
00095 EP_ATTRIBUTES_2,
00096 DIRECTION_OUT,
00097 EP_SIZE_2_HS,
00098 DOUBLE_BANK);
00099 return;
00100 }
00101 #endif
00102 (void)Usb_configure_endpoint(EP_MS_IN,
00103 EP_ATTRIBUTES_1,
00104 DIRECTION_IN,
00105 EP_SIZE_1_FS,
00106 DOUBLE_BANK);
00107
00108 (void)Usb_configure_endpoint(EP_MS_OUT,
00109 EP_ATTRIBUTES_2,
00110 DIRECTION_OUT,
00111 EP_SIZE_2_FS,
00112 DOUBLE_BANK);
00113 }
00114
00115
00122 Bool usb_user_read_request(U8 type, U8 request)
00123 {
00124 U16 wInterface;
00125 U8 wValue_msb;
00126 U8 wValue_lsb;
00127
00128 wValue_lsb = Usb_read_endpoint_data(EP_CONTROL, 8);
00129 wValue_msb = Usb_read_endpoint_data(EP_CONTROL, 8);
00130
00131
00132 if( USB_SETUP_SET_CLASS_INTER == type )
00133 {
00134 switch( request )
00135 {
00136 case MASS_STORAGE_RESET:
00137
00138
00139 if( (0!=wValue_lsb) || (0!=wValue_msb) )
00140 break;
00141 wInterface=Usb_read_endpoint_data(EP_CONTROL, 16);
00142 if( INTERFACE_NB != wInterface )
00143 break;
00144 Usb_ack_setup_received_free();
00145 Usb_ack_control_in_ready_send();
00146 return TRUE;
00147 }
00148 }
00149 if( USB_SETUP_GET_CLASS_INTER == type )
00150 {
00151 switch( request )
00152 {
00153 case GET_MAX_LUN:
00154
00155
00156 if( (0!=wValue_lsb) || (0!=wValue_msb) )
00157 break;
00158 wInterface=Usb_read_endpoint_data(EP_CONTROL, 16);
00159 if( INTERFACE_NB != wInterface )
00160 break;
00161 Usb_ack_setup_received_free();
00162 Usb_reset_endpoint_fifo_access(EP_CONTROL);
00163 Usb_write_endpoint_data(EP_CONTROL, 8, get_nb_lun() - 1);
00164 Usb_ack_control_in_ready_send();
00165 while (!Is_usb_control_in_ready());
00166
00167 while(!Is_usb_control_out_received());
00168 Usb_ack_control_out_received_free();
00169
00170 ms_multiple_drive = TRUE;
00171 return TRUE;
00172 }
00173 }
00174
00175 return FALSE;
00176 }
00177
00178
00182 Bool usb_user_get_descriptor(U8 type, U8 string)
00183 {
00184 pbuffer = NULL;
00185
00186 switch (type)
00187 {
00188 case STRING_DESCRIPTOR:
00189 switch (string)
00190 {
00191 case LANG_ID:
00192 data_to_transfer = sizeof(usb_user_language_id);
00193 pbuffer = &usb_user_language_id;
00194 break;
00195
00196 case MAN_INDEX:
00197 data_to_transfer = sizeof(usb_user_manufacturer_string_descriptor);
00198 pbuffer = &usb_user_manufacturer_string_descriptor;
00199 break;
00200
00201 case PROD_INDEX:
00202 data_to_transfer = sizeof(usb_user_product_string_descriptor);
00203 pbuffer = &usb_user_product_string_descriptor;
00204 break;
00205
00206 case SN_INDEX:
00207 data_to_transfer = sizeof(usb_user_serial_number);
00208 pbuffer = &usb_user_serial_number;
00209 break;
00210
00211 default:
00212 break;
00213 }
00214 break;
00215
00216 default:
00217 break;
00218 }
00219
00220 return pbuffer != NULL;
00221 }
00222
00223
00224 #endif // USB_DEVICE_FEATURE == ENABLED