//! usb_get_status. //! //! This function manages the GET STATUS request. The device, interface or //! endpoint status is returned. //! //! @warning Code:xx bytes (function code length) //! //! @param none //! //! @return none //! void usb_get_status(void) { U8 wIndex; U8 dummy; dummy = Usb_read_byte(); //!< dummy read dummy = Usb_read_byte(); //!< dummy read wIndex = Usb_read_byte(); switch(bmRequestType) { case REQUEST_DEVICE_STATUS: Usb_ack_receive_setup(); Usb_write_byte(DEVICE_STATUS); break; case REQUEST_INTERFACE_STATUS: Usb_ack_receive_setup(); Usb_write_byte(INTERFACE_STATUS); break; case REQUEST_ENDPOINT_STATUS: Usb_ack_receive_setup(); wIndex = wIndex & MSK_EP_DIR; Usb_write_byte(endpoint_status[wIndex]); break; default: Usb_enable_stall_handshake(); Usb_ack_receive_setup(); return; } Usb_write_byte(0x00); Usb_send_control_in(); while( !Is_usb_receive_out() ); Usb_ack_receive_out(); }
//! @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) { U16 wInterface; U8 wValue_msb; U8 wValue_lsb; // Read wValue wValue_lsb = Usb_read_byte(); wValue_msb = Usb_read_byte(); //** Specific request from Class MassStorage if( USB_SETUP_SET_CLASS_INTER == type ) { switch( request ) { case SETUP_MASS_STORAGE_RESET: // wValue must be 0 // wIndex = Interface if( (0!=wValue_lsb) || (0!=wValue_msb) ) break; LSB(wInterface)=Usb_read_byte(); MSB(wInterface)=Usb_read_byte(); if( INTERFACE_NB != wInterface ) break; Usb_ack_receive_setup(); Usb_send_control_in(); while(!Is_usb_in_ready()); return TRUE; break; } } if( USB_SETUP_GET_CLASS_INTER == type ) { switch( request ) { case SETUP_MASS_STORAGE_GET_MAX_LUN: // wValue must be 0 // wIndex = Interface if( (0!=wValue_lsb) || (0!=wValue_msb) ) break; LSB(wInterface)=Usb_read_byte(); MSB(wInterface)=Usb_read_byte(); if( INTERFACE_NB != wInterface ) break; Usb_ack_receive_setup(); Usb_write_byte( (get_nb_lun()-1) ); Usb_send_control_in(); while(!Is_usb_in_ready()); while( !Is_usb_receive_out() ); Usb_ack_receive_out(); ms_multiple_drive = 1; return TRUE; break; } } return FALSE; // No supported request }
//! @brief This function manages hit set report request. //! void usb_hid_set_report_ouput (void) { Usb_ack_receive_setup(); Usb_send_control_in(); while(!Is_usb_receive_out()); Usb_ack_receive_out(); Usb_send_control_in(); }
//! usb_get_configuration. //! //! This function manages the GET CONFIGURATION request. The current //! configuration number is returned. //! //! @warning Code:xx bytes (function code length) //! //! @param none //! //! @return none //! void usb_get_configuration(void) { Usb_ack_receive_setup(); Usb_write_byte(usb_configuration_nb); Usb_ack_in_ready(); while( !Is_usb_receive_out() ); Usb_ack_receive_out(); }
uint8_t my_uart_usb_num_to_read(void){ uint8_t num=0; if(!Is_device_enumerated()) return 0; Usb_select_endpoint(RX_EP); if (Is_usb_receive_out()){ num = Usb_byte_counter(); if (num == 0) Usb_ack_receive_out(); } return num; }
//! cdc_set_line_coding. //! //! @brief This function manages reception of line coding parameters (baudrate...). //! void cdc_set_line_coding (void) { Usb_ack_receive_setup(); while (!(Is_usb_receive_out())); LSB0(line_coding.dwDTERate) = Usb_read_byte(); LSB1(line_coding.dwDTERate) = Usb_read_byte(); LSB2(line_coding.dwDTERate) = Usb_read_byte(); LSB3(line_coding.dwDTERate) = Usb_read_byte(); line_coding.bCharFormat = Usb_read_byte(); line_coding.bParityType = Usb_read_byte(); line_coding.bDataBits = Usb_read_byte(); Usb_ack_receive_out(); Usb_send_control_in(); // send a ZLP for STATUS phase while(!(Is_usb_read_control_enabled())); }
/** * @brief This function checks if a character has been received on the USB bus. * * @return bit (true if a byte is ready to be read) */ bit uart_usb_test_hit(void) { if (!rx_counter) { // Preserve the currently selected endpoint uint8_t uenum = Usb_get_selected_endpoint(); Usb_select_endpoint(VCP_RX_EP); if (Is_usb_receive_out()) { rx_counter = Usb_byte_counter(); if (!rx_counter) Usb_ack_receive_out(); } // Restore previously selected endpoint UENUM = uenum; } return (rx_counter!=0); }
//! cdc_get_line_coding. //! //! @brief This function manages reception of line coding parameters (baudrate...). //! void cdc_get_line_coding(void) { Usb_ack_receive_setup(); Usb_write_byte(LSB0(line_coding.dwDTERate)); Usb_write_byte(LSB1(line_coding.dwDTERate)); Usb_write_byte(LSB2(line_coding.dwDTERate)); Usb_write_byte(LSB3(line_coding.dwDTERate)); Usb_write_byte(line_coding.bCharFormat); Usb_write_byte(line_coding.bParityType); Usb_write_byte(line_coding.bDataBits); Usb_send_control_in(); while(!(Is_usb_read_control_enabled())); //Usb_clear_tx_complete(); while(!Is_usb_receive_out()); Usb_ack_receive_out(); }
void usb_hid_set_report_feature(void) { Usb_ack_receive_setup(); Usb_send_control_in(); while(!Is_usb_receive_out()); if(Usb_read_byte()==0x55) if(Usb_read_byte()==0xAA) if(Usb_read_byte()==0x55) if(Usb_read_byte()==0xAA) { jump_bootloader=1; } Usb_ack_receive_out(); Usb_send_control_in(); while(!Is_usb_in_ready()); }
/** * @brief This function checks if a character has been received on the USB bus. * * @return bit (true if a byte is ready to be read) */ bit uart_usb_test_hit(void) { if(!Is_device_enumerated()) return FALSE; if (!rx_counter) { Usb_select_endpoint(RX_EP); if (Is_usb_receive_out()) { rx_counter = Usb_byte_counter(); if (!rx_counter) { Usb_ack_receive_out(); } } } return (rx_counter!=0); }
//! @brief This function manages hid get idle request. //! //! @param Report ID 0 the idle rate applies to all input reports, else only applies to the Report ID //! void usb_hid_get_idle (U8 u8_report_id) { U16 wLength; U16 wInterface; // Get interface number to put in idle mode LSB(wInterface)= Usb_read_byte(); MSB(wInterface)= Usb_read_byte(); LSB(wLength) = Usb_read_byte(); MSB(wLength) = Usb_read_byte(); Usb_ack_receive_setup(); if( wLength != 0 ) { Usb_write_byte(g_u8_report_rate); Usb_send_control_in(); } while(!Is_usb_receive_out()); Usb_ack_receive_out(); }
//! @brief Get data report from Host //! void hid_report_out(void) { Usb_select_endpoint(EP_HID_OUT); if(Is_usb_receive_out()) { //Message Definition //Section //Instruction //Flags //Flags //datalength //Retrieve message parts unsigned char section, instruction, dataLength, flagH, flagL, i; section = Usb_read_byte(); instruction = Usb_read_byte(); flagL = Usb_read_byte(); flagH = Usb_read_byte(); dataLength = Usb_read_byte(); for(i = 0; i < HID_OUT_DATAPACKET_LENGTH; i++) //copy datapacket to global buffer hid_OUT_dataPkt[i] = Usb_read_byte(); //handle message sectionCall(section, instruction, &hid_OUT_dataPkt[0], dataLength); //ack message Usb_ack_receive_out(); } // //** Check if we received DFU mode command from host // if(jump_bootloader) // { // U32 volatile tempo; // Leds_off(); // Usb_detach(); // Detach actual generic HID application // for(tempo=0;tempo<70000;tempo++); // Wait some time before // start_boot(); // Jumping to booltoader // } }
void my_usb_ep2_int_action(void){ Usb_select_endpoint(RX_EP); if(Is_usb_receive_out() && Is_usb_receive_out_interrupt_enabled()){ my_uart_usb_read_from_endpoint(); } }
//! usb_get_descriptor. //! //! This function manages the GET DESCRIPTOR request. The device descriptor, //! the configuration descriptor and the device qualifier are supported. All //! other descriptors must be supported by the usb_user_get_descriptor //! function. //! Only 1 configuration is supported. //! //! @warning Code:xx bytes (function code length) //! //! @param none //! //! @return none //! void usb_get_descriptor(void) { U16 wLength ; U8 descriptor_type ; U8 string_type ; U8 dummy; U8 nb_byte; zlp = FALSE; /* no zero length packet */ string_type = Usb_read_byte(); /* read LSB of wValue */ descriptor_type = Usb_read_byte(); /* read MSB of wValue */ switch (descriptor_type) { case DEVICE_DESCRIPTOR: data_to_transfer = Usb_get_dev_desc_length(); //!< sizeof (usb_user_device_descriptor); pbuffer = Usb_get_dev_desc_pointer(); break; case CONFIGURATION_DESCRIPTOR: data_to_transfer = Usb_get_conf_desc_length(); //!< sizeof (usb_user_configuration_descriptor); pbuffer = Usb_get_conf_desc_pointer(); break; default: if( usb_user_get_descriptor(descriptor_type, string_type)==FALSE ) { Usb_enable_stall_handshake(); Usb_ack_receive_setup(); return; } break; } dummy = Usb_read_byte(); //!< don't care of wIndex field dummy = Usb_read_byte(); LSB(wLength) = Usb_read_byte(); //!< read wLength MSB(wLength) = Usb_read_byte(); Usb_ack_receive_setup() ; //!< clear the receive setup flag if (wLength > data_to_transfer) { if ((data_to_transfer % EP_CONTROL_LENGTH) == 0) { zlp = TRUE; } else { zlp = FALSE; } //!< no need of zero length packet } else { data_to_transfer = (U8)wLength; //!< send only requested number of data } while((data_to_transfer != 0) && (!Is_usb_receive_out())) { while(!Is_usb_read_control_enabled()); nb_byte=0; while(data_to_transfer != 0) //!< Send data until necessary { if(nb_byte++==EP_CONTROL_LENGTH) //!< Check endpoint 0 size { break; } #ifndef AVRGCC Usb_write_byte(*pbuffer++); #else // AVRGCC does not support point to PGM space #warning with avrgcc assumes devices descriptors are stored in the lower 64Kbytes of on-chip flash memory Usb_write_byte(pgm_read_byte_near((unsigned int)pbuffer++)); #endif data_to_transfer --; } Usb_send_control_in(); } if(Is_usb_receive_out()) { Usb_ack_receive_out(); return; } //!< abort from Host if(zlp == TRUE) { while(!Is_usb_read_control_enabled()); Usb_send_control_in(); } while(!Is_usb_receive_out()); Usb_ack_receive_out(); }
//! usb_get_descriptor. //! //! This function manages the GET DESCRIPTOR request. The device descriptor, //! the configuration descriptor and the device qualifier are supported. All //! other descriptors must be supported by the usb_user_get_descriptor //! function. //! Only 1 configuration is supported. //! //! @warning Code:xx bytes (function code length) //! void usb_get_descriptor(void) { U8 LSBwLength, MSBwLength; U8 descriptor_type ; U8 string_type ; U8 dummy; U8 byteswereread; zlp = FALSE; /* no zero length packet */ string_type = Usb_read_byte(); /* read LSB of wValue */ descriptor_type = Usb_read_byte(); /* read MSB of wValue */ byteswereread = 0; switch (descriptor_type) { case DEVICE_DESCRIPTOR: data_to_transfer = Usb_get_dev_desc_length(); //!< sizeof (usb_user_device_descriptor); pbuffer = Usb_get_dev_desc_pointer(); break; case CONFIGURATION_DESCRIPTOR: data_to_transfer = Usb_get_conf_desc_length(string_type); //!< sizeof (usb_user_configuration_descriptor); pbuffer = Usb_get_conf_desc_pointer(string_type); break; #if 1 case STRING_DESCRIPTOR: if(string_type!=LANG_ID) { usb_get_string_descriptor(string_type); return; } #endif default: dummy = Usb_read_byte(); dummy = Usb_read_byte(); LSBwLength = Usb_read_byte(); MSBwLength = Usb_read_byte(); byteswereread=1; if( usb_user_get_descriptor(descriptor_type, string_type)==FALSE ) { Usb_enable_stall_handshake(); //TODO:is this necessary, Win7 flaky without? Usb_ack_receive_setup(); return; } break; } if (byteswereread==0) { dummy = Usb_read_byte(); //!< don't care of wIndex field dummy = Usb_read_byte(); LSBwLength = Usb_read_byte(); //!< read wLength MSBwLength = Usb_read_byte(); } Usb_ack_receive_setup() ; //!< clear the receive setup flag if ((LSBwLength > data_to_transfer) || (MSBwLength)) { if ((data_to_transfer % EP_CONTROL_LENGTH) == 0) { zlp = TRUE; } else { zlp = FALSE; } //!< no need of zero length packet LSBwLength = data_to_transfer; MSBwLength = 0x00; } else { data_to_transfer = LSBwLength; //!< send only requested number of data } while((data_to_transfer != 0) && (!Is_usb_receive_out())) { U8 nb_byte = 0; if(usb_endpoint_wait_for_read_control_enabled()!=0) { Usb_enable_stall_handshake(); break; } //! Send data until necessary while(data_to_transfer != 0) { // if(Is_usb_write_enabled()) //!< Check endpoint 0 size if(nb_byte++==EP_CONTROL_LENGTH) //!< Check endpoint 0 size break; Usb_write_byte(pgm_read_byte_near((unsigned int)pbuffer++)); data_to_transfer --; } Usb_send_control_in(); } if(Is_usb_receive_out()) { //! abort from Host Usb_ack_receive_out(); return; } if(zlp == TRUE) { if(usb_endpoint_wait_for_read_control_enabled()!=0) { Usb_enable_stall_handshake(); return; } Usb_send_control_in(); } usb_endpoint_wait_for_receive_out(); Usb_ack_receive_out(); }
void usb_get_string_descriptor(U8 string_type) { U16 requested_length; U8 dummy; PGM_P user_str; user_str = usb_user_get_string(string_type); if(!user_str) { usb_get_string_descriptor_sram(string_type); return; } dummy = Usb_read_byte(); //!< don't care of wIndex field dummy = Usb_read_byte(); requested_length = Usb_read_byte(); //!< read wLength requested_length |= Usb_read_byte()<<8; const U8 actual_descriptor_size = 2+strlen_P(user_str)*2; if (requested_length > actual_descriptor_size) { zlp = ((actual_descriptor_size % EP_CONTROL_LENGTH) == 0); requested_length = actual_descriptor_size; } Usb_ack_receive_setup() ; //!< clear the receive setup flag if(usb_endpoint_wait_for_read_control_enabled()!=0) { Usb_enable_stall_handshake(); return; } U8 nb_byte = 0; // Output the length if(requested_length) { Usb_write_byte(actual_descriptor_size); requested_length--; nb_byte++; } // Output the type if(requested_length) { Usb_write_byte(STRING_DESCRIPTOR); requested_length--; nb_byte++; } if(!requested_length) { Usb_send_control_in(); } while((requested_length != 0) && (!Is_usb_receive_out())) { if(usb_endpoint_wait_for_read_control_enabled()!=0) { Usb_enable_stall_handshake(); break; } while(requested_length != 0) //!< Send data until necessary { if(nb_byte==EP_CONTROL_LENGTH) { //!< Check endpoint 0 size nb_byte=0; break; } Usb_write_byte(pgm_read_byte_near((unsigned int)user_str++)); requested_length--; nb_byte++; if(requested_length) { Usb_write_byte(0); requested_length--; nb_byte++; } } Usb_send_control_in(); } //bail: if(Is_usb_receive_out()) { //! abort from Host Usb_ack_receive_out(); return; } if(zlp == TRUE) { if(usb_endpoint_wait_for_read_control_enabled()!=0) { Usb_enable_stall_handshake(); return; } Usb_send_control_in(); } usb_endpoint_wait_for_receive_out(); Usb_ack_receive_out(); }
//! @brief This function manages hit get repport request. //! void hid_get_report_descriptor(void) { U16 wLength; U8 nb_byte; bit zlp = FALSE; U16 wInterface; LSB(wInterface)=Usb_read_byte(); MSB(wInterface)=Usb_read_byte(); data_to_transfer = sizeof(usb_hid_report_descriptor); pbuffer = &(usb_hid_report_descriptor.report[0]); LSB(wLength) = Usb_read_byte(); MSB(wLength) = Usb_read_byte(); Usb_ack_receive_setup(); if (wLength > data_to_transfer) { if ((data_to_transfer % EP_CONTROL_LENGTH) == 0) { zlp = TRUE; } else { zlp = FALSE; } } else { data_to_transfer = (U8)wLength; // send only requested number of data } while((data_to_transfer != 0) && (!Is_usb_receive_out())) { while(!Is_usb_read_control_enabled()); nb_byte=0; while(data_to_transfer != 0) // Send data until necessary { if(nb_byte++==EP_CONTROL_LENGTH) // Check endpoint 0 size { break; } #ifndef __GNUC__ Usb_write_byte(*pbuffer++); #else // AVRGCC does not support point to PGM space Usb_write_byte(pgm_read_byte_near((unsigned int)pbuffer++)); #endif data_to_transfer --; } Usb_send_control_in(); } if(Is_usb_receive_out()) { // abort from Host Usb_ack_receive_out(); return; } if(zlp == TRUE) { while(!Is_usb_read_control_enabled()); Usb_send_control_in(); } while(!Is_usb_receive_out()); Usb_ack_receive_out(); }
//! @brief This function manages hid get hid descriptor request. //! void hid_get_hid_descriptor(void) { U16 wLength; U8 nb_byte; bit zlp=FALSE; U16 wInterface; LSB(wInterface)=Usb_read_byte(); MSB(wInterface)=Usb_read_byte(); data_to_transfer = sizeof(usb_conf_desc.hid_mouse); pbuffer = &(usb_conf_desc.hid_mouse.bLength); LSB(wLength) = Usb_read_byte(); MSB(wLength) = Usb_read_byte(); Usb_ack_receive_setup(); if (wLength > data_to_transfer) { if ((data_to_transfer % EP_CONTROL_LENGTH) == 0) { zlp = TRUE; } else { zlp = FALSE; } // no need of zero length packet } else { data_to_transfer = (U8)wLength; // send only requested number of data } while((data_to_transfer != 0) && (!Is_usb_receive_out())) { while(!Is_usb_read_control_enabled()); nb_byte=0; while(data_to_transfer != 0) // Send data until necessary { if(nb_byte++==EP_CONTROL_LENGTH) // Check endpoint 0 size { break; } #ifndef __GNUC__ Usb_write_byte(*pbuffer++); #else // AVRGCC does not support point to PGM space //warning with AVRGCC assumes devices descriptors are stored in the lower 64Kbytes of on-chip flash memory Usb_write_byte(pgm_read_byte_near((unsigned int)pbuffer++)); #endif data_to_transfer --; } Usb_send_control_in(); } if(Is_usb_receive_out()) { // abort from Host Usb_ack_receive_out(); return; } if(zlp == TRUE) { while(!Is_usb_read_control_enabled()); Usb_send_control_in(); } while(!Is_usb_receive_out()); Usb_ack_receive_out(); }
bool USB::hasData() { Usb_select_endpoint(EP_TEMP_OUT); return Is_usb_receive_out(); }