//! 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())); }
//! 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(); }
//! cdc_set_control_line_state. //! //! @brief This function manages the SET_CONTROL_LINE_LINE_STATE CDC request. //! //! Note: Can manage hardware flow control here... //! void cdc_set_control_line_state (void) { Usb_ack_receive_setup(); Usb_send_control_in(); while(!(Is_usb_read_control_enabled())); }
//! 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(); }
//! @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(); }
//! @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(); }
//! 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. //! Bool usb_get_descriptor(void) { Bool zlp; U16 wLength; U8 descriptor_type ; U8 string_type; U8 dummy; U8 nb_byte; U8 byte_to_send; #if (USE_DEVICE_SN_UNIQUE==ENABLE) U16 sn_index=0; U8 initial_data_to_transfer; #endif 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 DESCRIPTOR_DEVICE: data_to_transfer = Usb_get_dev_desc_length(); //!< sizeof (usb_user_device_descriptor); pbuffer = Usb_get_dev_desc_pointer(); break; case DESCRIPTOR_CONFIGURATION: 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)) return FALSE; // Unknow descriptor then stall request 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 } Usb_ack_nak_out(); byte_to_send=0; #if (USE_DEVICE_SN_UNIQUE==ENABLE) initial_data_to_transfer = data_to_transfer; #endif while((data_to_transfer != 0) && (!Is_usb_nak_out_sent())) { while(!Is_usb_read_control_enabled()) { if (Is_usb_nak_out_sent()) break; // don't clear the flag now, it will be cleared after } nb_byte=0; while(data_to_transfer != 0) //!< Send data until necessary { if(nb_byte++==EP_CONTROL_LENGTH) //!< Check endpoint 0 size break; #if (USE_DEVICE_SN_UNIQUE==ENABLE) if(f_get_serial_string && (data_to_transfer < (initial_data_to_transfer-1))) //if we are sending the signature characters (third byte and more...) { //(The first two bytes are the length and the descriptor) switch (byte_to_send) { case 0: Usb_write_byte(bin_to_ascii((Flash_read_sn(sn_index)>>4) & 0x0F)); //sends the fist part (MSB) of the signature hex number, converted in ascii break; case 1: Usb_write_byte(0); //then, sends a null character (Usb_unicode) break; case 2: Usb_write_byte(bin_to_ascii(Flash_read_sn(sn_index) & 0x0F)); //sends the second part (LSB) of the signature hex number, converted in ascii break; case 3: Usb_write_byte(0); //then, sends a null character (Usb_unicode) sn_index++; //increments the signature address pointer. break; } byte_to_send = (byte_to_send+1)%4; } else { Usb_write_PGM_byte(pbuffer++); //Write a flash byte to USB } #else Usb_write_PGM_byte(pbuffer++); #endif data_to_transfer --; //decrements the number of bytes to transmit. } if (Is_usb_nak_out_sent()) break; else Usb_send_control_in(); }