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 "usb_dfu.h"
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070 extern const void *pbuffer;
00071 extern U16 data_to_transfer;
00072
00073
00074
00075
00079 void usb_user_endpoint_init(U8 conf_nb)
00080 {
00081 }
00082
00083
00090 Bool usb_user_read_request(U8 type, U8 request)
00091 {
00092 if ((type & 0x7F) == 0x21)
00093 {
00094 switch (request)
00095 {
00096 case DFU_DETACH:
00097 break;
00098
00099 case DFU_DNLOAD:
00100 return usb_dfu_dnload();
00101
00102 case DFU_UPLOAD:
00103 return usb_dfu_upload();
00104
00105 case DFU_GETSTATUS:
00106 Usb_ack_setup_received_free();
00107 Usb_reset_endpoint_fifo_access(EP_CONTROL);
00108 Usb_write_endpoint_data(EP_CONTROL, 8, usb_dfu_status);
00109 Usb_write_endpoint_data(EP_CONTROL, 8, 0);
00110 Usb_write_endpoint_data(EP_CONTROL, 8, 0);
00111 Usb_write_endpoint_data(EP_CONTROL, 8, 0);
00112 Usb_write_endpoint_data(EP_CONTROL, 8, usb_dfu_state);
00113 Usb_write_endpoint_data(EP_CONTROL, 8, 0);
00114 Usb_ack_control_in_ready_send();
00115 while (!Is_usb_control_out_received());
00116 Usb_ack_control_out_received_free();
00117 return TRUE;
00118
00119 case DFU_GETSTATE:
00120 Usb_ack_setup_received_free();
00121 Usb_reset_endpoint_fifo_access(EP_CONTROL);
00122 Usb_write_endpoint_data(EP_CONTROL, 8, usb_dfu_state);
00123 Usb_ack_control_in_ready_send();
00124 while (!Is_usb_control_out_received());
00125 Usb_ack_control_out_received_free();
00126 return TRUE;
00127
00128 case DFU_CLRSTATUS:
00129 case DFU_ABORT:
00130 Usb_ack_setup_received_free();
00131 usb_dfu_status = STATUS_OK;
00132 usb_dfu_state = STATE_dfuIDLE;
00133 Usb_ack_control_in_ready_send();
00134 while (!Is_usb_control_in_ready());
00135 return TRUE;
00136 }
00137 }
00138
00139 usb_dfu_status = STATUS_errSTALLEDPKT;
00140 usb_dfu_state = STATE_dfuERROR;
00141 return FALSE;
00142 }
00143
00144
00148 Bool usb_user_get_descriptor(U8 type, U8 string)
00149 {
00150 pbuffer = NULL;
00151
00152 switch (type)
00153 {
00154 case STRING_DESCRIPTOR:
00155 switch (string)
00156 {
00157 case LANG_ID:
00158 data_to_transfer = sizeof(usb_user_language_id);
00159 pbuffer = &usb_user_language_id;
00160 break;
00161
00162 case MAN_INDEX:
00163 data_to_transfer = sizeof(usb_user_manufacturer_string_descriptor);
00164 pbuffer = &usb_user_manufacturer_string_descriptor;
00165 break;
00166
00167 case PROD_INDEX:
00168 data_to_transfer = sizeof(usb_user_product_string_descriptor);
00169 pbuffer = &usb_user_product_string_descriptor;
00170 break;
00171
00172 #if defined(SN_INDEX)
00173 #if SN_INDEX != 0
00174 case SN_INDEX:
00175 data_to_transfer = sizeof(usb_user_serial_number);
00176 pbuffer = &usb_user_serial_number;
00177 break;
00178 #endif
00179 #endif
00180
00181 default:
00182 break;
00183 }
00184 break;
00185
00186 default:
00187 break;
00188 }
00189
00190 return pbuffer != NULL;
00191 }
00192
00193
00194 #endif // USB_DEVICE_FEATURE == ENABLED