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 #if ((USB_DEVICE_SN_USE==ENABLE) && (USE_DEVICE_SN_UNIQUE==ENABLE))
00057 #include "lib_mcu/flash/flash_drv.h"
00058 #endif
00059
00060
00061
00062 #ifdef __GNUC__
00063 extern PGM_VOID_P pbuffer;
00064 #else
00065 extern U8 code *pbuffer;
00066 #endif
00067 extern U8 data_to_transfer;
00068 extern code S_usb_hid_report_descriptor_kbd usb_hid_report_descriptor_kbd;
00069
00070 U8 g_u8_report_rate=0;
00071
00072
00073
00074 void hid_get_report_descriptor(void);
00075 void usb_hid_set_report_ouput(void);
00076 void usb_hid_set_idle (U8 u8_report_id, U8 u8_duration );
00077 void usb_hid_get_idle (U8 u8_report_id);
00078 void hid_get_hid_descriptor(void);
00079
00080
00089 Bool usb_user_read_request(U8 type, U8 request)
00090 {
00091 U8 wValue_msb;
00092 U8 wValue_lsb;
00093
00094
00095 wValue_lsb = Usb_read_byte();
00096 wValue_msb = Usb_read_byte();
00097
00098
00099 if( USB_SETUP_GET_STAND_INTERFACE == type )
00100 {
00101 switch( request )
00102 {
00103 case SETUP_GET_DESCRIPTOR:
00104 switch( wValue_msb )
00105 {
00106 case DESCRIPTOR_HID:
00107 hid_get_hid_descriptor();
00108 return TRUE;
00109 break;
00110
00111 case DESCRIPTOR_REPORT:
00112 hid_get_report_descriptor();
00113 return TRUE;
00114
00115 case DESCRIPTOR_PHYSICAL:
00116
00117 break;
00118 }
00119 break;
00120 }
00121 }
00122 if( USB_SETUP_SET_CLASS_INTER == type )
00123 {
00124 switch( request )
00125 {
00126 case SETUP_HID_SET_REPORT:
00127
00128
00129 switch (wValue_msb)
00130 {
00131 case REPORT_TYPE_INPUT:
00132
00133 break;
00134
00135 case REPORT_TYPE_OUTPUT:
00136 usb_hid_set_report_ouput();
00137 return TRUE;
00138 break;
00139
00140 case REPORT_TYPE_FEATURE:
00141 break;
00142 }
00143 break;
00144
00145 case SETUP_HID_SET_IDLE:
00146 usb_hid_set_idle(wValue_lsb,wValue_msb);
00147 return TRUE;
00148
00149 case SETUP_HID_SET_PROTOCOL:
00150
00151 break;
00152 }
00153 }
00154 if( USB_SETUP_GET_CLASS_INTER == type )
00155 {
00156 switch( request )
00157 {
00158 case SETUP_HID_GET_REPORT:
00159
00160 break;
00161 case SETUP_HID_GET_IDLE:
00162 usb_hid_get_idle(wValue_lsb);
00163 return TRUE;
00164 case SETUP_HID_GET_PROTOCOL:
00165
00166 break;
00167 }
00168 }
00169 return FALSE;
00170 }
00171
00172
00177 void usb_user_endpoint_init(U8 conf_nb)
00178 {
00179 usb_configure_endpoint( EP_KBD_IN, \
00180 TYPE_INTERRUPT,\
00181 DIRECTION_IN, \
00182 SIZE_8, \
00183 ONE_BANK, \
00184 NYET_ENABLED);
00185 }
00186
00187
00194 U8 usb_user_interface_get( U16 wInterface )
00195 {
00196 return 0;
00197 }
00198
00199
00205 void usb_user_interface_reset(U16 wInterface, U8 alternate_setting)
00206 {
00207
00208 if( INTERFACE_NB_KBD == wInterface )
00209 {
00210
00211 Usb_select_endpoint(EP_KBD_IN);
00212 Usb_disable_stall_handshake();
00213 Usb_reset_endpoint(EP_KBD_IN);
00214 Usb_reset_data_toggle();
00215 }
00216 }
00217
00218
00226 Bool usb_user_get_descriptor(U8 type, U8 string)
00227 {
00228 switch(type)
00229 {
00230 case DESCRIPTOR_STRING:
00231 switch (string)
00232 {
00233 case LANG_ID:
00234 data_to_transfer = sizeof (usb_user_language_id);
00235 pbuffer = &(usb_user_language_id.bLength);
00236 return TRUE;
00237 break;
00238
00239 case MAN_INDEX:
00240 data_to_transfer = sizeof (usb_user_manufacturer_string_descriptor);
00241 pbuffer = &(usb_user_manufacturer_string_descriptor.bLength);
00242 return TRUE;
00243 break;
00244
00245 case PROD_INDEX:
00246 data_to_transfer = sizeof (usb_user_product_string_descriptor);
00247 pbuffer = &(usb_user_product_string_descriptor.bLength);
00248 return TRUE;
00249 break;
00250
00251 #if (USB_DEVICE_SN_USE==ENABLE)
00252 case SN_INDEX:
00253 data_to_transfer = sizeof (usb_user_serial_number);
00254 pbuffer = &(usb_user_serial_number.bLength);
00255 #if (USE_DEVICE_SN_UNIQUE==ENABLE)
00256 f_get_serial_string=TRUE;
00257 data_to_transfer += (SN_LENGTH*4);
00258 #endif
00259 return TRUE;
00260 break;
00261 #endif
00262 }
00263 break;
00264 }
00265 return FALSE;
00266 }
00267
00268
00271 void hid_get_report_descriptor(void)
00272 {
00273 U16 wLength;
00274 U8 nb_byte;
00275 bit zlp = FALSE;
00276 U16 wInterface;
00277
00278 LSB(wInterface)=Usb_read_byte();
00279 MSB(wInterface)=Usb_read_byte();
00280
00281 data_to_transfer = sizeof(usb_hid_report_descriptor_kbd);
00282 pbuffer = &(usb_hid_report_descriptor_kbd.report[0]);
00283
00284 LSB(wLength) = Usb_read_byte();
00285 MSB(wLength) = Usb_read_byte();
00286 Usb_ack_receive_setup();
00287
00288 if (wLength > data_to_transfer)
00289 {
00290 if ((data_to_transfer % EP_CONTROL_LENGTH) == 0) { zlp = TRUE; }
00291 else { zlp = FALSE; }
00292 }
00293 else
00294 {
00295 data_to_transfer = (U8)wLength;
00296 }
00297
00298 while((data_to_transfer != 0) && (!Is_usb_receive_out()))
00299 {
00300 while(!Is_usb_read_control_enabled());
00301
00302 nb_byte=0;
00303 while(data_to_transfer != 0)
00304 {
00305 if(nb_byte++==EP_CONTROL_LENGTH)
00306 {
00307 break;
00308 }
00309 #ifndef __GNUC__
00310 Usb_write_byte(*pbuffer++);
00311 #else // AVRGCC does not support point to PGM space
00312
00313 Usb_write_byte(pgm_read_byte_near((unsigned int)pbuffer++));
00314 #endif
00315 data_to_transfer --;
00316 }
00317 Usb_send_control_in();
00318 }
00319
00320 if(Is_usb_receive_out())
00321 {
00322
00323 Usb_ack_receive_out();
00324 return;
00325 }
00326 if(zlp == TRUE)
00327 {
00328 while(!Is_usb_read_control_enabled());
00329 Usb_send_control_in();
00330 }
00331
00332 while(!Is_usb_receive_out());
00333 Usb_ack_receive_out();
00334 }
00335
00336
00339 void usb_hid_set_report_ouput (void)
00340 {
00341 Usb_ack_receive_setup();
00342 Usb_send_control_in();
00343
00344 while(!Is_usb_receive_out());
00345 Usb_ack_receive_out();
00346 Usb_send_control_in();
00347 }
00348
00349
00355 void usb_hid_set_idle (U8 u8_report_id, U8 u8_duration )
00356 {
00357 U16 wInterface;
00358
00359
00360 LSB(wInterface)=Usb_read_byte();
00361 MSB(wInterface)=Usb_read_byte();
00362 Usb_ack_receive_setup();
00363
00364 g_u8_report_rate = u8_duration;
00365
00366 Usb_send_control_in();
00367 while(!Is_usb_in_ready());
00368 }
00369
00370
00375 void usb_hid_get_idle (U8 u8_report_id)
00376 {
00377 U16 wLength;
00378 U16 wInterface;
00379
00380
00381 LSB(wInterface)= Usb_read_byte();
00382 MSB(wInterface)= Usb_read_byte();
00383 LSB(wLength) = Usb_read_byte();
00384 MSB(wLength) = Usb_read_byte();
00385 Usb_ack_receive_setup();
00386
00387 if( wLength != 0 )
00388 {
00389 Usb_write_byte(g_u8_report_rate);
00390 Usb_send_control_in();
00391 }
00392
00393 while(!Is_usb_receive_out());
00394 Usb_ack_receive_out();
00395 }
00396
00397
00400 void hid_get_hid_descriptor(void)
00401 {
00402 U16 wLength;
00403 U8 nb_byte;
00404 bit zlp=FALSE;
00405 U16 wInterface;
00406
00407 LSB(wInterface)=Usb_read_byte();
00408 MSB(wInterface)=Usb_read_byte();
00409
00410 data_to_transfer = sizeof(usb_conf_desc.hid_kbd);
00411 pbuffer = &(usb_conf_desc.hid_kbd.bLength);
00412
00413 LSB(wLength) = Usb_read_byte();
00414 MSB(wLength) = Usb_read_byte();
00415 Usb_ack_receive_setup();
00416
00417 if (wLength > data_to_transfer)
00418 {
00419 if ((data_to_transfer % EP_CONTROL_LENGTH) == 0) { zlp = TRUE; }
00420 else { zlp = FALSE; }
00421 }
00422 else
00423 {
00424 data_to_transfer = (U8)wLength;
00425 }
00426
00427 while((data_to_transfer != 0) && (!Is_usb_receive_out()))
00428 {
00429 while(!Is_usb_read_control_enabled());
00430
00431 nb_byte=0;
00432 while(data_to_transfer != 0)
00433 {
00434 if(nb_byte++==EP_CONTROL_LENGTH)
00435 {
00436 break;
00437 }
00438 #ifndef __GNUC__
00439 Usb_write_byte(*pbuffer++);
00440 #else // AVRGCC does not support point to PGM space
00441
00442 Usb_write_byte(pgm_read_byte_near((unsigned int)pbuffer++));
00443 #endif
00444 data_to_transfer --;
00445 }
00446 Usb_send_control_in();
00447 }
00448
00449 if(Is_usb_receive_out())
00450 {
00451
00452 Usb_ack_receive_out();
00453 return;
00454 }
00455 if(zlp == TRUE)
00456 {
00457 while(!Is_usb_read_control_enabled());
00458 Usb_send_control_in();
00459 }
00460
00461 while(!Is_usb_receive_out());
00462 Usb_ack_receive_out();
00463 }
00464