Xmega Application Note


usb_specific_request.c

Go to the documentation of this file.
00001 /* This file has been prepared for Doxygen automatic documentation generation.*/
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 /* External dependencies. */
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 /* Include this if serial number should be fixed and not given by OS. */
00129 /*                  case SN_INDEX:
00130                         data_to_transfer = sizeof (usb_user_serial_number);
00131                         pbuffer = &(usb_user_serial_number.bLength);
00132                         break;
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         /* Send a ZLP for STATUS phase */
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 }
@DOC_TITLE@
Generated on Mon Jan 18 09:26:08 2010 for AVR1907 Xplain USB Gateway by doxygen 1.5.5