00001
00016
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 "config.h"
00051 #include "conf_usb.h"
00052 #include "lib_mcu/usb/usb_drv.h"
00053 #include "usb_descriptors.h"
00054 #include "modules/usb/device_chap9/usb_standard_request.h"
00055 #include "usb_specific_request.h"
00056 #include "modules/control_access/ctrl_access.h"
00057 #if ((USB_DEVICE_SN_USE==ENABLE) && (USE_DEVICE_SN_UNIQUE==ENABLE))
00058 #include "lib_mcu/flash/flash_drv.h"
00059 #endif
00060
00061
00062
00063 bit ms_multiple_drive;
00064
00065 #ifdef __GNUC__
00066 extern PGM_VOID_P pbuffer;
00067 #else
00068 extern U8 code *pbuffer;
00069 #endif
00070 extern U8 data_to_transfer;
00071
00072
00073
00074
00083 Bool usb_user_read_request(U8 type, U8 request)
00084 {
00085 U16 wInterface;
00086 U8 wValue_msb;
00087 U8 wValue_lsb;
00088
00089
00090 wValue_lsb = Usb_read_byte();
00091 wValue_msb = Usb_read_byte();
00092
00093
00094 if( USB_SETUP_SET_CLASS_INTER == type )
00095 {
00096 switch( request )
00097 {
00098 case SETUP_MASS_STORAGE_RESET:
00099
00100
00101 if( (0!=wValue_lsb) || (0!=wValue_msb) )
00102 break;
00103 LSB(wInterface)=Usb_read_byte();
00104 MSB(wInterface)=Usb_read_byte();
00105 if( INTERFACE_NB != wInterface )
00106 break;
00107 Usb_ack_receive_setup();
00108 Usb_send_control_in();
00109 while(!Is_usb_in_ready());
00110 return TRUE;
00111 break;
00112 }
00113 }
00114 if( USB_SETUP_GET_CLASS_INTER == type )
00115 {
00116 switch( request )
00117 {
00118 case SETUP_MASS_STORAGE_GET_MAX_LUN:
00119
00120
00121 if( (0!=wValue_lsb) || (0!=wValue_msb) )
00122 break;
00123 LSB(wInterface)=Usb_read_byte();
00124 MSB(wInterface)=Usb_read_byte();
00125 if( INTERFACE_NB != wInterface )
00126 break;
00127 Usb_ack_receive_setup();
00128 Usb_write_byte( (get_nb_lun()-1) );
00129 Usb_send_control_in();
00130 while(!Is_usb_in_ready());
00131 while( !Is_usb_receive_out() );
00132 Usb_ack_receive_out();
00133 ms_multiple_drive = 1;
00134 return TRUE;
00135 break;
00136 }
00137 }
00138
00139 return FALSE;
00140 }
00141
00142
00147 void usb_user_endpoint_init(U8 conf_nb)
00148 {
00149 usb_configure_endpoint(EP_MS_IN, \
00150 TYPE_BULK, \
00151 DIRECTION_IN, \
00152 SIZE_64, \
00153 TWO_BANKS, \
00154 NYET_ENABLED);
00155 usb_configure_endpoint(EP_MS_OUT, \
00156 TYPE_BULK, \
00157 DIRECTION_OUT, \
00158 SIZE_64, \
00159 TWO_BANKS, \
00160 NYET_ENABLED);
00161 }
00162
00163
00170 U8 usb_user_interface_get( U16 wInterface )
00171 {
00172 return 0;
00173 }
00174
00175
00181 void usb_user_interface_reset(U16 wInterface, U8 alternate_setting)
00182 {
00183
00184 if( INTERFACE_NB == wInterface )
00185 {
00186
00187 Usb_select_endpoint(EP_MS_IN);
00188 Usb_disable_stall_handshake();
00189 Usb_reset_endpoint(EP_MS_IN);
00190 Usb_reset_data_toggle();
00191 Usb_select_endpoint(EP_MS_OUT);
00192 Usb_disable_stall_handshake();
00193 Usb_reset_endpoint(EP_MS_OUT);
00194 Usb_reset_data_toggle();
00195 }
00196 }
00197
00198
00206 Bool usb_user_get_descriptor(U8 type, U8 string)
00207 {
00208 switch(type)
00209 {
00210 case DESCRIPTOR_STRING:
00211 switch (string)
00212 {
00213 case LANG_ID:
00214 data_to_transfer = sizeof (usb_user_language_id);
00215 pbuffer = &(usb_user_language_id.bLength);
00216 return TRUE;
00217 break;
00218
00219 case MAN_INDEX:
00220 data_to_transfer = sizeof (usb_user_manufacturer_string_descriptor);
00221 pbuffer = &(usb_user_manufacturer_string_descriptor.bLength);
00222 return TRUE;
00223 break;
00224
00225 case PROD_INDEX:
00226 data_to_transfer = sizeof (usb_user_product_string_descriptor);
00227 pbuffer = &(usb_user_product_string_descriptor.bLength);
00228 return TRUE;
00229 break;
00230
00231 #if (USB_DEVICE_SN_USE==ENABLE)
00232 case SN_INDEX:
00233 data_to_transfer = sizeof (usb_user_serial_number);
00234 pbuffer = &(usb_user_serial_number.bLength);
00235 #if (USE_DEVICE_SN_UNIQUE==ENABLE)
00236 f_get_serial_string=TRUE;
00237 data_to_transfer += (SN_LENGTH*4);
00238 #endif
00239 return TRUE;
00240 break;
00241 #endif
00242 }
00243 break;
00244 }
00245 return FALSE;
00246 }
00247