00001
00050 #include "config.h"
00051 #include "conf_usb.h"
00052 #include "usb_drv.h"
00053 #include "usb_descriptors.h"
00054 #include "usb_standard_request.h"
00055 #include "usb_specific_request.h"
00056 #include "sw_usart.h"
00057
00058
00059 extern uint8_t code *pbuffer;
00060 extern uint8_t data_to_transfer;
00061 extern S_line_coding line_coding;
00062
00063
00072 bool usb_user_read_request(uint8_t type, uint8_t request)
00073 {
00074 bool status = true;
00075 uint8_t descriptor_type ;
00076 uint8_t string_type ;
00077
00078 string_type = Usb_read_byte();
00079 descriptor_type = Usb_read_byte();
00080 switch(request)
00081 {
00082 case GET_LINE_CODING:
00083 cdc_get_line_coding();
00084 break;
00085 case SET_LINE_CODING:
00086 cdc_set_line_coding();
00087 break;
00088 case SET_CONTROL_LINE_STATE:
00089 cdc_set_control_line_state();
00090 break;
00091 default:
00092 status = false;
00093 break;
00094 }
00095 return status;
00096 }
00097
00098
00107 bool usb_user_get_descriptor(uint8_t type, uint8_t string)
00108 {
00109 bool status = true;
00110 switch(type)
00111 {
00112 case STRING_DESCRIPTOR:
00113 switch (string)
00114 {
00115 case LANG_INDEX:
00116 data_to_transfer = sizeof (usb_user_language_id);
00117 pbuffer = &(usb_user_language_id.bLength);
00118 break;
00119 case MAN_INDEX:
00120 data_to_transfer = sizeof (usb_user_manufacturer_string_descriptor);
00121 pbuffer = &(usb_user_manufacturer_string_descriptor.bLength);
00122 break;
00123 case PROD_INDEX:
00124 data_to_transfer = sizeof (usb_user_product_string_descriptor);
00125 pbuffer = &(usb_user_product_string_descriptor.bLength);
00126 break;
00127
00128
00129
00130
00131
00132
00133 case IF0_INDEX:
00134 data_to_transfer = sizeof (usb_if0_descriptor);
00135 pbuffer = &(usb_if0_descriptor.bLength);
00136 break;
00137 default:
00138 status = false;
00139 break;
00140 }
00141 break;
00142 default:
00143 status = false;
00144 break;
00145 }
00146
00147 return status;
00148 }
00149
00154 void usb_user_endpoint_init(uint8_t conf_nb)
00155 {
00156 usb_configure_endpoint(INT_EP, \
00157 TYPE_INTERRUPT, \
00158 DIRECTION_IN, \
00159 SIZE_32, \
00160 ONE_BANK, \
00161 NYET_ENABLED);
00162
00163 usb_configure_endpoint(TX_EP, \
00164 TYPE_BULK, \
00165 DIRECTION_IN, \
00166 SIZE_32, \
00167 ONE_BANK, \
00168 NYET_ENABLED);
00169
00170 usb_configure_endpoint(RX_EP, \
00171 TYPE_BULK, \
00172 DIRECTION_OUT, \
00173 SIZE_32, \
00174 TWO_BANKS, \
00175 NYET_ENABLED);
00176
00177 Usb_reset_endpoint(INT_EP);
00178 Usb_reset_endpoint(TX_EP);
00179 Usb_reset_endpoint(RX_EP);
00180 }
00181
00184 void cdc_get_line_coding(void)
00185 {
00186 Usb_ack_receive_setup();
00187 Usb_write_byte(LSB0(line_coding.dwDTERate));
00188 Usb_write_byte(LSB1(line_coding.dwDTERate));
00189 Usb_write_byte(LSB2(line_coding.dwDTERate));
00190 Usb_write_byte(LSB3(line_coding.dwDTERate));
00191 Usb_write_byte(line_coding.bCharFormat);
00192 Usb_write_byte(line_coding.bParityType);
00193 Usb_write_byte(line_coding.bDataBits);
00194
00195 Usb_send_control_in();
00196 while(!(Is_usb_read_control_enabled()));
00197
00198 while(!Is_usb_receive_out());
00199 Usb_ack_receive_out();
00200 }
00201
00202
00205 void cdc_set_line_coding (void)
00206 {
00207 Usb_ack_receive_setup();
00208 while (!(Is_usb_receive_out()));
00209
00210 LSB0(line_coding.dwDTERate) = Usb_read_byte();
00211 LSB1(line_coding.dwDTERate) = Usb_read_byte();
00212 LSB2(line_coding.dwDTERate) = Usb_read_byte();
00213 LSB3(line_coding.dwDTERate) = Usb_read_byte();
00214
00215 line_coding.bCharFormat = Usb_read_byte();
00216 line_coding.bParityType = Usb_read_byte();
00217 line_coding.bDataBits = Usb_read_byte();
00218 Usb_ack_receive_out();
00219
00220
00221 Usb_send_control_in();
00222 while(!(Is_usb_read_control_enabled()));
00223 SW_USART_Set_Baudrate(line_coding.dwDTERate);
00224 }
00225
00226
00229 void cdc_set_control_line_state (void)
00230 {
00231 Usb_ack_receive_setup();
00232 Usb_send_control_in();
00233 while(!(Is_usb_read_control_enabled()));
00234
00235 }