//! This function is called by the standard USB read request function when //! the USB request is not supported. This function returns true when the //! request is processed. This function returns false if the request is not //! supported. In this case, a STALL handshake will be automatically //! sent by the standard USB read request function. //! bool usb_user_read_request(U8 type, U8 request) { U8 wValue_msb; U8 wValue_lsb; // Read wValue wValue_lsb = Usb_read_endpoint_data(EP_CONTROL, 8); wValue_msb = Usb_read_endpoint_data(EP_CONTROL, 8); /* U8 descriptor_type; Usb_read_endpoint_data(EP_CONTROL, 8); // string_type descriptor_type = Usb_read_endpoint_data(EP_CONTROL, 8); */ //** Specific request from Class HID if( 0x81 == type ) // USB_SETUP_GET_STAND_INTERFACE { switch( request ) { case GET_DESCRIPTOR: switch( wValue_msb ) // Descriptor ID { #if (USB_HIGH_SPEED_SUPPORT==false) case HID_DESCRIPTOR: hid_get_descriptor( sizeof(usb_conf_desc_fs.hid) , (const U8*)&usb_conf_desc_fs.hid); return true; #else case HID_DESCRIPTOR: if( Is_usb_full_speed_mode() ) { hid_get_descriptor( sizeof(usb_conf_desc_fs.hid) , (const U8*)&usb_conf_desc_fs.hid); }else{ hid_get_descriptor( sizeof(usb_conf_desc_hs.hid_mouse) , (const U8*)&usb_conf_desc_hs.hid); } return true; #endif case HID_REPORT_DESCRIPTOR: hid_get_descriptor( sizeof(usb_hid_report_descriptor) , usb_hid_report_descriptor); return true; case HID_PHYSICAL_DESCRIPTOR: // TODO break; } break; } } if( 0x21 == type ) // USB_SETUP_SET_CLASS_INTER { switch( request ) { case HID_SET_REPORT: // The MSB wValue field specifies the Report Type // The LSB wValue field specifies the Report ID switch (wValue_msb) { case HID_REPORT_INPUT: // TODO break; case HID_REPORT_OUTPUT: Usb_ack_setup_received_free(); while (!Is_usb_control_out_received()); Usb_ack_control_out_received_free(); Usb_ack_control_in_ready_send(); while (!Is_usb_control_in_ready()); return true; case HID_REPORT_FEATURE: usb_hid_set_report_feature(); return true; break; } break; case HID_SET_IDLE: usb_hid_set_idle(wValue_lsb, wValue_msb); return true; case HID_SET_PROTOCOL: // TODO break; } } if( 0xA1 == type ) // USB_SETUP_GET_CLASS_INTER { switch( request ) { case HID_GET_REPORT: // TODO break; case HID_GET_IDLE: usb_hid_get_idle(wValue_lsb); return true; case HID_GET_PROTOCOL: // TODO break; } } return false; // No supported request }
//! @breif This function checks the specific request and if known then processes it //! //! @param type corresponding at bmRequestType (see USB specification) //! @param request corresponding at bRequest (see USB specification) //! //! @return TRUE, when the request is processed //! @return FALSE, if the request is'nt know (STALL handshake is managed by the main standard request function). //! Bool usb_user_read_request(U8 type, U8 request) { U8 wValue_msb; U8 wValue_lsb; // Read wValue wValue_lsb = Usb_read_byte(); wValue_msb = Usb_read_byte(); //** Specific request from Class HID if( USB_SETUP_GET_STAND_INTERFACE == type ) { switch( request ) { case SETUP_GET_DESCRIPTOR: switch( wValue_msb ) // Descriptor ID { case DESCRIPTOR_HID: hid_get_hid_descriptor(); return TRUE; break; case DESCRIPTOR_REPORT: hid_get_report_descriptor(); return TRUE; case DESCRIPTOR_PHYSICAL: // TODO break; } break; } } if( USB_SETUP_SET_CLASS_INTER == type ) { switch( request ) { case SETUP_HID_SET_REPORT: // The MSB wValue field specifies the Report Type // The LSB wValue field specifies the Report ID switch (wValue_msb) { case REPORT_TYPE_INPUT: // TODO break; case REPORT_TYPE_OUTPUT: usb_hid_set_report_ouput(); return TRUE; break; case REPORT_TYPE_FEATURE: usb_hid_set_report_feature(); return TRUE; break; } break; case SETUP_HID_SET_IDLE: usb_hid_set_idle(wValue_lsb,wValue_msb); return TRUE; case SETUP_HID_SET_PROTOCOL: // TODO break; } } if( USB_SETUP_GET_CLASS_INTER == type ) { switch( request ) { case SETUP_HID_GET_REPORT: // TODO break; case SETUP_HID_GET_IDLE: usb_hid_get_idle(wValue_lsb); return TRUE; case SETUP_HID_GET_PROTOCOL: // TODO break; } } return FALSE; // No supported request }