Contiki 2.6

usb_descriptors.c

Go to the documentation of this file.
00001 /* This file has been prepared for Doxygen automatic documentation generation.*/
00002 /*! \file usb_descriptors.c *****************************************************
00003  *
00004  * \brief
00005  *      This file contains the usb parameters that uniquely identify the
00006  *      application through descriptor tables.
00007  *
00008  * \addtogroup usbstick
00009  *
00010  * \author
00011  *      Atmel Corporation: http://www.atmel.com \n
00012  *      Support email: avr@atmel.com
00013  * \author
00014  *      Colin O'Flynn <coflynn@newae.com>
00015  *
00016  ******************************************************************************/
00017 /* Copyright (c) 2008  ATMEL Corporation
00018    All rights reserved.
00019 
00020    Redistribution and use in source and binary forms, with or without
00021    modification, are permitted provided that the following conditions are met:
00022 
00023    * Redistributions of source code must retain the above copyright
00024      notice, this list of conditions and the following disclaimer.
00025    * Redistributions in binary form must reproduce the above copyright
00026      notice, this list of conditions and the following disclaimer in
00027      the documentation and/or other materials provided with the
00028      distribution.
00029    * Neither the name of the copyright holders nor the names of
00030      contributors may be used to endorse or promote products derived
00031      from this software without specific prior written permission.
00032 
00033   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00034   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00035   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00036   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00037   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00038   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00039   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00040   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00041   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00042   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00043   POSSIBILITY OF SUCH DAMAGE.
00044 */
00045 
00046 /**
00047   \addtogroup usbconf
00048   @{
00049   */
00050 
00051 //_____ I N C L U D E S ____________________________________________________
00052 
00053 #include "config.h"
00054 
00055 #include "usb_drv.h"
00056 #include "usb_descriptors.h"
00057 #include "usb_specific_request.h"
00058 #include "rndis/rndis_task.h"
00059 
00060 
00061 //_____ M A C R O S ________________________________________________________
00062 
00063 
00064 #define USB_ETH_NET_FUNC_DESC(MACAddrString,etherStat,maxSegmentSize,nMCFilters,nPowerFilters) \
00065  { sizeof(S_usb_ethernet_networking_functional_descriptor)      \
00066  , 0x24, 0x0F   \
00067 , MACAddrString \
00068 , etherStat     \
00069 , Usb_write_word_enum_struc(maxSegmentSize)     \
00070 , Usb_write_word_enum_struc(nMCFilters) \
00071 , nPowerFilters \
00072 }
00073 
00074 
00075 
00076 #define USB_CONFIG_DESC(totalsize,interfaceCount,value,stringIndex,attr,power) \
00077  { sizeof(S_usb_configuration_descriptor)       \
00078  , CONFIGURATION_DESCRIPTOR     \
00079  , Usb_write_word_enum_struc(totalsize) \
00080  , interfaceCount       \
00081  , value        \
00082  , stringIndex  \
00083  , attr \
00084  , power        \
00085  }
00086 
00087 #define USB_ENDPOINT(nb,attr,maxpktsize,interval) \
00088 { sizeof(S_usb_endpoint_descriptor) \
00089  , ENDPOINT_DESCRIPTOR \
00090  , nb \
00091  , attr \
00092  , Usb_write_word_enum_struc(maxpktsize) \
00093  , interval \
00094  }
00095 
00096 #define USB_IAD(firstinterface,interfacecount,funcClass,funcSubClass,funcProto,stringIndex) \
00097   { \
00098     sizeof(S_usb_interface_association_descriptor), \
00099     DSC_TYPE_IAD, \
00100     firstinterface,   \
00101     interfacecount,   \
00102     funcClass,        \
00103     funcSubClass,     \
00104     funcProto,        \
00105         stringIndex                     \
00106   }
00107 
00108 #define USB_INTERFACEDESC(nb,altsetting,endpointCount,interfaceClass,interfaceSubClass,interfaceProto,stringIndex) \
00109  { sizeof(S_usb_interface_descriptor)   \
00110  , INTERFACE_DESCRIPTOR \
00111  , nb   \
00112  , altsetting   \
00113  , endpointCount        \
00114  , interfaceClass       \
00115  , interfaceSubClass    \
00116  , interfaceProto       \
00117  , stringIndex  \
00118  }
00119 
00120 
00121 #define FUNC_DESC_HEADER \
00122 0x05, /* bFunctionLength, Descriptor size in bytes*/ \
00123 0x24, /* bDescriptorType, CS_INTERFACE */ \
00124 0x00, /* bDescriptorSubtype, Header Functional Descriptor */ \
00125 0x10,0x01 /* bcdCDC, CDC specification release number in BCD format (1,1) */ 
00126 
00127 #define FUNC_DESC_CALL_MANAGEMENT(caps,dataInterface) \
00128 0x05, /* bFunctionLength, Descriptor size in bytes */ \
00129 0x24, /* bDescriptorType, CS_INTERFACE */ \
00130 0x01, /* bDescriptorSubtype, Call Management Functional Descriptor */ \
00131 caps, /* bmCapabilities */ \
00132 dataInterface /* bDataInterface, Interface used for call management */ 
00133 
00134 /* Abstract Control Management Functional Descriptor */
00135 #define FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT(caps) \
00136 0x04, /* bFunctionLength, Descriptor size in bytes */ \
00137 0x24, /* bDescriptorType, CS_INTERFACE */ \
00138 0x02, /* bDescriptorSubtype, Call Management Functional Descriptor */ \
00139 caps /* bmCapabilities */
00140 
00141 /* Union Functional Descriptor */ \
00142 #define FUNC_DESC_UNION(masterInterface,slaveInterface) \
00143 0x05, /* bFunctionLength, Descriptor size in bytes */ \
00144 0x24, /* bDescriptorType, CS_INTERFACE */ \
00145 0x06, /* bDescriptorSubtype, Union Functional Descriptor */ \
00146 masterInterface, /* bMasterInterface, The controlling interface for the union (bInterfaceNumber of a Communication or Data Class interface in this configuration) */ \
00147 slaveInterface /* bSlaveInterface0, The controlled interace in the union (bInterfaceNumber of an interface in this configuration) */ \
00148 
00149 #define RNDIS_INTERFACES        \
00150 USB_INTERFACEDESC(      \
00151         INTERFACE0_NB,  \
00152         ALTERNATE0,     \
00153         NB_ENDPOINT0,   \
00154         INTERFACE0_CLASS,       \
00155         INTERFACE0_SUB_CLASS,   \
00156         INTERFACE0_PROTOCOL,    \
00157         USB_STRING_INTERFACE_RNDIS      \
00158 ),      \
00159         {       \
00160                 FUNC_DESC_HEADER, \
00161                 FUNC_DESC_CALL_MANAGEMENT(0x00/*caps*/,0x00/*dataInterface*/), \
00162                 FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT(0x00), \
00163                 FUNC_DESC_UNION(0x00,0x01), \
00164         }, \
00165         USB_ENDPOINT(ENDPOINT_NB_1,EP_ATTRIBUTES_1,EP_SIZE_1,EP_INTERVAL_1), \
00166 \
00167 USB_INTERFACEDESC(      \
00168         INTERFACE1_NB,  \
00169         ALTERNATE1,     \
00170         NB_ENDPOINT1,   \
00171         INTERFACE1_CLASS,       \
00172         INTERFACE1_SUB_CLASS,   \
00173         INTERFACE1_PROTOCOL,    \
00174         USB_STRING_NONE \
00175 ),      \
00176         USB_ENDPOINT(ENDPOINT_NB_2,EP_ATTRIBUTES_2,EP_SIZE_2,EP_INTERVAL_2), \
00177         USB_ENDPOINT(ENDPOINT_NB_3,EP_ATTRIBUTES_3,EP_SIZE_3,EP_INTERVAL_3)
00178 
00179 #define CDC_SERIAL_INTERFACES \
00180 USB_INTERFACEDESC(      \
00181         INTERFACE2_NB,  \
00182         ALTERNATE2,     \
00183         NB_ENDPOINT2,   \
00184         INTERFACE2_CLASS,       \
00185         INTERFACE2_SUB_CLASS,   \
00186         INTERFACE2_PROTOCOL,    \
00187         USB_STRING_INTERFACE_SERIAL     \
00188 ),      \
00189 {       \
00190                 FUNC_DESC_HEADER, \
00191                 FUNC_DESC_CALL_MANAGEMENT(0x03/*caps*/,0x03/*dataInterface*/), \
00192                 FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT(0x02), \
00193                 FUNC_DESC_UNION(0x02,0x03), \
00194 },      \
00195 USB_ENDPOINT(ENDPOINT_NB_4,EP_ATTRIBUTES_4,EP_SIZE_4,EP_INTERVAL_4),    \
00196 USB_INTERFACEDESC(      \
00197         INTERFACE3_NB,  \
00198         ALTERNATE3,     \
00199         NB_ENDPOINT3,   \
00200         INTERFACE3_CLASS,       \
00201         INTERFACE3_SUB_CLASS,   \
00202         INTERFACE3_PROTOCOL,    \
00203         USB_STRING_NONE \
00204 ),      \
00205 USB_ENDPOINT(ENDPOINT_NB_5,EP_ATTRIBUTES_5,EP_SIZE_5,EP_INTERVAL_5),    \
00206 USB_ENDPOINT(ENDPOINT_NB_6,EP_ATTRIBUTES_6,EP_SIZE_6,EP_INTERVAL_6)
00207 
00208 #define CDC_EEM_INTERFACES      \
00209 USB_INTERFACEDESC(      \
00210         EEM_INTERFACE0_NB,      \
00211         EEM_ALTERNATE0, \
00212         EEM_NB_ENDPOINT0,       \
00213         EEM_INTERFACE0_CLASS,   \
00214         EEM_INTERFACE0_SUB_CLASS,       \
00215         EEM_INTERFACE0_PROTOCOL,        \
00216         USB_STRING_INTERFACE_EEM        \
00217 ),      \
00218         USB_ENDPOINT(ENDPOINT_NB_1,EP_ATTRIBUTES_1,EP_SIZE_1,EP_INTERVAL_1), \
00219         USB_ENDPOINT(ENDPOINT_NB_2,EP_ATTRIBUTES_2,EP_SIZE_2,EP_INTERVAL_2)
00220 
00221 
00222 
00223 
00224 #if CDC_ECM_USES_INTERRUPT_ENDPOINT
00225 #define CDC_ECM_CONTROL_ENDPOINT_COUNT  1
00226 #define CDC_ECM_CONTROL_ENDPOINT        USB_ENDPOINT(ENDPOINT_NB_1,EP_ATTRIBUTES_1,EP_SIZE_1,EP_INTERVAL_1),
00227 #else
00228 #define CDC_ECM_CONTROL_ENDPOINT_COUNT  0
00229 #define CDC_ECM_CONTROL_ENDPOINT
00230 #endif
00231 
00232 
00233 #define CDC_ECM_INTERFACES      \
00234 USB_INTERFACEDESC(      \
00235         ECM_INTERFACE0_NB,      \
00236         ECM_ALTERNATE0, \
00237         CDC_ECM_CONTROL_ENDPOINT_COUNT, \
00238         ECM_INTERFACE0_CLASS,   \
00239         ECM_INTERFACE0_SUB_CLASS,       \
00240         ECM_INTERFACE0_PROTOCOL,        \
00241         USB_STRING_INTERFACE_ECM        \
00242 ),      \
00243 {       \
00244                 FUNC_DESC_HEADER, \
00245                 FUNC_DESC_UNION(0x00,0x01), \
00246 },      \
00247         USB_ETH_NET_FUNC_DESC(  \
00248                 USB_STRING_MAC_ADDRESS, \
00249                 0,      /* Support no stats for now */ \
00250                 USB_ETH_MTU, /* maxSegmentSize */ \
00251                 0, /* nMCFilters*/      \
00252                 0 /*nPowerFilters*/     \
00253         ), \
00254         CDC_ECM_CONTROL_ENDPOINT \
00255 USB_INTERFACEDESC(      \
00256         ECM_INTERFACE0_NB+1,    \
00257         0,      \
00258         2,      \
00259         10,     \
00260         0,      \
00261         0,      \
00262         USB_STRING_NONE \
00263 ),      \
00264         USB_ENDPOINT(ENDPOINT_NB_2,EP_ATTRIBUTES_2,EP_SIZE_2,EP_INTERVAL_2), \
00265         USB_ENDPOINT(ENDPOINT_NB_3,EP_ATTRIBUTES_3,EP_SIZE_3,EP_INTERVAL_3)
00266 
00267 /*
00268 USB_INTERFACEDESC(      \
00269         ECM_INTERFACE0_NB+1,    \
00270         0,      \
00271         0,      \
00272         10,     \
00273         0,      \
00274         0,      \
00275         USB_STRING_NONE \
00276 ),      \
00277 */
00278 
00279 
00280 
00281 //_____ D E F I N I T I O N ________________________________________________
00282 
00283 /************* COMPOSITE DEVICE DESCRIPTORS (using IAD) **********/
00284 //TODO:Serial port enumeration will prevent falling through to the
00285 //supported network on Mac or Windows. Linux will take either.
00286 //Once Windows loads the RNDIS driver it will use it on a subsequent
00287 //Mac enumeration, and the device will fail to start.
00288 //This doesn't seem to hurt anything but beware, system corruption is
00289 //a possibility.
00290 #if USB_CONF_MACINTOSH
00291 /* Prefer CDC-ECM network enumeration (Macintosh, linux) */
00292 FLASH uint8_t usb_dev_config_order[] = {
00293         USB_CONFIG_RNDIS, //windows gets networking only (if not here gets serial only)
00294 #if USB_CONF_SERIAL
00295         USB_CONFIG_ECM_DEBUG, //mac, linux get networking and serial port
00296 #endif
00297         USB_CONFIG_ECM,
00298 #if USB_CONF_SERIAL
00299         USB_CONFIG_RNDIS_DEBUG,
00300 #endif
00301 //      USB_CONFIG_RNDIS,
00302         USB_CONFIG_EEM,
00303 #if USB_CONF_STORAGE
00304         USB_CONFIG_MS,
00305 #endif
00306 };
00307 #else
00308 /* Prefer RNDIS network enumeration (Windows, linux) */
00309 FLASH uint8_t usb_dev_config_order[] = {
00310 
00311 //      USB_CONFIG_ECM, //windows doesnt like this here, will not go on to RNDIS
00312 #if USB_CONF_SERIAL
00313         USB_CONFIG_RNDIS_DEBUG,
00314 #else
00315         USB_CONFIG_RNDIS,
00316 #endif
00317 #if 0 //XP may have a problem with these extra configurations
00318         USB_CONFIG_RNDIS,
00319 #if USB_CONF_SERIAL
00320         USB_CONFIG_ECM_DEBUG,
00321 #endif
00322         USB_CONFIG_ECM,
00323         USB_CONFIG_EEM,
00324 #if USB_CONF_STORAGE
00325         USB_CONFIG_MS,
00326 #endif
00327 #endif
00328 };
00329 #endif /* USB_CONF_MACINTOSH */
00330 
00331 // usb_user_device_descriptor
00332 FLASH S_usb_device_descriptor usb_dev_desc_composite =
00333 {
00334   sizeof(usb_dev_desc_composite)
00335 , DEVICE_DESCRIPTOR
00336 , Usb_write_word_enum_struc(USB_SPECIFICATION)
00337 , COMPOSITE_DEVICE_CLASS
00338 , COMPOSITE_DEVICE_SUB_CLASS
00339 , COMPOSITE_DEVICE_PROTOCOL
00340 , EP_CONTROL_LENGTH
00341 , Usb_write_word_enum_struc(VENDOR_ID)
00342 , Usb_write_word_enum_struc(COMPOSITE_PRODUCT_ID)
00343 , Usb_write_word_enum_struc(RELEASE_NUMBER)
00344 , USB_STRING_MAN
00345 , USB_STRING_PRODUCT
00346 , USB_STRING_SERIAL
00347 , (sizeof(usb_dev_config_order)/sizeof(*usb_dev_config_order)) //sizeof(*) is sizeof first element
00348 };
00349 
00350 
00351 // usb_user_configuration_descriptor FS
00352 FLASH S_usb_user_configuration_descriptor_composite usb_conf_desc_composite = {
00353         USB_CONFIG_DESC(
00354                 sizeof(usb_conf_desc_composite),
00355                 COMPOSITE_NB_INTERFACE,
00356                 USB_CONFIG_RNDIS_DEBUG,
00357                 USB_STRING_CONFIG_COMPOSITE,
00358                 CONF_ATTRIBUTES,
00359                 MAX_POWER
00360         ),
00361 
00362         USB_IAD(
00363                 0x00,   // First interface
00364                 0x02,   // Interface count
00365                 0x02,   // Function Class
00366                 0x02,   // Function Subclass
00367                 0xFF,   // Function Protocol
00368                 USB_STRING_INTERFACE_RNDIS
00369         ),RNDIS_INTERFACES,
00370 
00371         USB_IAD(
00372                 0x02,   // First interface
00373                 0x02,   // Interface count
00374                 0x02,   // Function Class
00375                 0x02,   // Function Subclass
00376                 0x01,   // Function Protocol
00377                 USB_STRING_INTERFACE_SERIAL
00378         ),CDC_SERIAL_INTERFACES
00379 };
00380 
00381 /****************** NETWORK-ONLY DEVICE DESCRIPTORS **************************/
00382 
00383 /*
00384 FLASH S_usb_device_descriptor usb_dev_desc_network =
00385 {
00386   sizeof(usb_dev_desc_network)
00387 , DEVICE_DESCRIPTOR
00388 , Usb_write_word_enum_struc(USB_SPECIFICATION)
00389 , NETWORK_DEVICE_CLASS
00390 , NETWORK_DEVICE_SUB_CLASS
00391 , NETWORK_DEVICE_PROTOCOL
00392 , EP_CONTROL_LENGTH
00393 , Usb_write_word_enum_struc(VENDOR_ID)
00394 , Usb_write_word_enum_struc(NETWORK_PRODUCT_ID)
00395 , Usb_write_word_enum_struc(RELEASE_NUMBER)
00396 , USB_STRING_MAN
00397 , USB_STRING_PRODUCT
00398 , USB_STRING_SERIAL
00399 , NB_CONFIGURATION
00400 };
00401 */
00402 
00403 // usb_user_configuration_descriptor FS
00404 FLASH S_usb_user_configuration_descriptor_network usb_conf_desc_network = {
00405         USB_CONFIG_DESC(
00406                 sizeof(usb_conf_desc_network),
00407                 NETWORK_NB_INTERFACE,
00408                 CONF_NB,        // value
00409                 USB_STRING_CONFIG_RNDIS,
00410                 CONF_ATTRIBUTES,
00411                 MAX_POWER
00412         ),
00413         RNDIS_INTERFACES
00414 };
00415 
00416 
00417 
00418 /************* EEM-ONLY ***************/
00419 
00420 // usb_user_device_descriptor
00421 /*
00422 FLASH S_usb_device_descriptor usb_dev_desc_eem =
00423 {
00424   sizeof(usb_dev_desc_composite)
00425 , DEVICE_DESCRIPTOR
00426 , Usb_write_word_enum_struc(USB_SPECIFICATION)
00427 , EEM_DEVICE_CLASS
00428 , EEM_DEVICE_SUB_CLASS
00429 , EEM_DEVICE_PROTOCOL
00430 , EP_CONTROL_LENGTH
00431 , Usb_write_word_enum_struc(VENDOR_ID)
00432 , Usb_write_word_enum_struc(COMPOSITE_PRODUCT_ID)
00433 , Usb_write_word_enum_struc(RELEASE_NUMBER)
00434 , USB_STRING_MAN
00435 , USB_STRING_PRODUCT
00436 , USB_STRING_SERIAL
00437 , NB_CONFIGURATION
00438 };
00439 */
00440 
00441 
00442 // usb_user_configuration_descriptor FS
00443 FLASH S_usb_user_configuration_descriptor_eem usb_conf_desc_eem = {
00444         USB_CONFIG_DESC(
00445                 sizeof(usb_conf_desc_eem),
00446                 EEM_NB_INTERFACE,
00447                 USB_CONFIG_EEM, // value
00448                 USB_STRING_CONFIG_EEM,
00449                 CONF_ATTRIBUTES,
00450                 MAX_POWER
00451         ),
00452         CDC_EEM_INTERFACES
00453 };
00454 
00455 
00456 FLASH S_usb_user_configuration_descriptor_ecm usb_conf_desc_ecm = {
00457         USB_CONFIG_DESC(
00458                 sizeof(usb_conf_desc_ecm),
00459                 2,      // Interface Count
00460                 USB_CONFIG_ECM, // value
00461                 USB_STRING_CONFIG_ECM,
00462                 CONF_ATTRIBUTES,
00463                 MAX_POWER
00464         ),
00465         CDC_ECM_INTERFACES
00466 };
00467 
00468 FLASH S_usb_user_configuration_descriptor_ecm_debug usb_conf_desc_ecm_debug = {
00469         USB_CONFIG_DESC(
00470                 sizeof(usb_conf_desc_ecm_debug),
00471                 4,      // Interface Count
00472                 USB_CONFIG_ECM_DEBUG,   // value
00473                 USB_STRING_CONFIG_ECM_DEBUG,
00474                 CONF_ATTRIBUTES,
00475                 MAX_POWER
00476         ),
00477 
00478         USB_IAD(
00479                 0x00,   // First interface
00480                 0x02,   // Interface count
00481                 0x02,   // Function Class
00482                 0x06,   // Function Subclass
00483                 0x00,   // Function Protocol
00484                 USB_STRING_INTERFACE_ECM
00485         ),CDC_ECM_INTERFACES,
00486 
00487         USB_IAD(
00488                 0x02,   // First interface
00489                 0x02,   // Interface count
00490                 0x02,   // Function Class
00491                 0x02,   // Function Subclass
00492                 0x01,   // Function Protocol
00493                 USB_STRING_INTERFACE_SERIAL
00494         ),CDC_SERIAL_INTERFACES
00495 
00496 
00497         
00498 };
00499 
00500 
00501 
00502 /****************** MASS-STORAGE DEVICE DESCRIPTORS **************************/
00503 
00504 /*
00505 FLASH S_usb_device_descriptor usb_dev_desc_mass =
00506 {
00507   sizeof(usb_dev_desc_mass)
00508 , DEVICE_DESCRIPTOR
00509 , Usb_write_word_enum_struc(USB_SPECIFICATION)
00510 , MASS_DEVICE_CLASS
00511 , MASS_DEVICE_SUB_CLASS
00512 , MASS_DEVICE_PROTOCOL
00513 , EP_CONTROL_LENGTH
00514 , Usb_write_word_enum_struc(VENDOR_ID)
00515 , Usb_write_word_enum_struc(MASS_PRODUCT_ID)
00516 , Usb_write_word_enum_struc(RELEASE_NUMBER)
00517 , USB_STRING_MAN
00518 , USB_STRING_PRODUCT
00519 , USB_STRING_SERIAL
00520 , NB_CONFIGURATION
00521 };
00522 */
00523 #if USB_CONF_STORAGE
00524 
00525 // usb_user_configuration_descriptor FS
00526 FLASH S_usb_user_configuration_descriptor_mass usb_conf_desc_mass = {
00527  { sizeof(S_usb_configuration_descriptor)
00528  , CONFIGURATION_DESCRIPTOR
00529  , Usb_write_word_enum_struc(sizeof(S_usb_user_configuration_descriptor_mass))
00530  , MASS_NB_INTERFACE
00531  , CONF_NB
00532  , USB_STRING_CONFIG_MS
00533  , CONF_ATTRIBUTES
00534  , MAX_POWER
00535  },//9
00536 
00537   /// Mass storage
00538  { sizeof(S_usb_interface_descriptor)
00539  , INTERFACE_DESCRIPTOR
00540  , MS_INTERFACE_NB
00541  , MS_ALTERNATE
00542  , MS_NB_ENDPOINT
00543  , MS_INTERFACE_CLASS
00544  , MS_INTERFACE_SUB_CLASS
00545  , MS_INTERFACE_PROTOCOL
00546  , USB_STRING_INTERFACE_MS
00547  } //9
00548 ,
00549 { sizeof(S_usb_endpoint_descriptor)
00550  , ENDPOINT_DESCRIPTOR
00551  , MS_ENDPOINT_NB_1
00552  , MS_EP_ATTRIBUTES_1
00553  , Usb_write_word_enum_struc(MS_EP_SIZE_1)
00554  , MS_EP_INTERVAL_1
00555  } //7
00556  ,
00557  { sizeof(S_usb_endpoint_descriptor)
00558  , ENDPOINT_DESCRIPTOR
00559  , MS_ENDPOINT_NB_2
00560  , MS_EP_ATTRIBUTES_2
00561  , Usb_write_word_enum_struc(MS_EP_SIZE_2)
00562  , MS_EP_INTERVAL_2
00563  }
00564 };
00565 
00566 #endif
00567 
00568 /************* COMMON *****************/
00569 
00570 
00571 
00572                                       // usb_user_language_id
00573 
00574 FLASH S_usb_language_id usb_user_language_id = {
00575   sizeof(usb_user_language_id)
00576 , STRING_DESCRIPTOR
00577 , Usb_write_word_enum_struc(LANGUAGE_ID)
00578 };
00579 
00580 
00581 
00582 
00583 
00584 PGM_VOID_P Usb_get_dev_desc_pointer(void)
00585 {
00586 #if 1
00587         return &(usb_dev_desc_composite.bLength);
00588 #else  //these are all the same length
00589         if (usb_mode == rndis_only)
00590                 return &(usb_dev_desc_network.bLength);
00591 
00592         if (usb_mode == rndis_debug)
00593                 return &(usb_dev_desc_composite.bLength);
00594 
00595         if (usb_mode == eem)
00596                 return &(usb_dev_desc_eem.bLength);
00597 
00598         return &(usb_dev_desc_mass.bLength);
00599 #endif
00600 }
00601 
00602 
00603 U8 Usb_get_dev_desc_length(void)
00604 {
00605 #if 1 
00606         return sizeof(usb_dev_desc_composite);
00607 #else  //these are all the same size
00608         if (usb_mode == rndis_only)
00609                 return sizeof(usb_dev_desc_network);
00610 
00611         if (usb_mode == rndis_debug)
00612                 return sizeof(usb_dev_desc_composite);
00613 
00614         if (usb_mode == eem)
00615                 return sizeof(usb_dev_desc_eem);
00616 
00617         return sizeof(usb_dev_desc_mass);
00618 #endif
00619 }
00620 
00621 
00622 PGM_VOID_P  Usb_get_conf_desc_pointer(U8 index)
00623 {
00624         
00625         switch(pgm_read_byte_near(&usb_dev_config_order[index])) {
00626                 case USB_CONFIG_ECM:
00627                         return &(usb_conf_desc_ecm.cfg.bLength);
00628                 case USB_CONFIG_ECM_DEBUG:
00629                         return &(usb_conf_desc_ecm_debug.cfg.bLength);
00630                 case USB_CONFIG_RNDIS_DEBUG:
00631                         return &(usb_conf_desc_composite.cfg.bLength);
00632                 case USB_CONFIG_RNDIS:
00633                         return &(usb_conf_desc_network.cfg.bLength);
00634                 case USB_CONFIG_EEM:
00635                         return &(usb_conf_desc_eem.cfg.bLength);                
00636 #if USB_CONF_STORAGE
00637                 case USB_CONFIG_MS:
00638                         return &(usb_conf_desc_mass.cfg.bLength);
00639 #endif
00640                 default:
00641                         return 0;
00642         }
00643 }
00644 
00645 
00646 U8  Usb_get_conf_desc_length(U8 index)
00647 {
00648         switch(pgm_read_byte_near(&usb_dev_config_order[index])) {
00649                 case USB_CONFIG_ECM:
00650                         return sizeof(usb_conf_desc_ecm);
00651                 case USB_CONFIG_ECM_DEBUG:
00652                         return sizeof(usb_conf_desc_ecm_debug);
00653                 case USB_CONFIG_RNDIS_DEBUG:
00654                         return sizeof(usb_conf_desc_composite);
00655                 case USB_CONFIG_RNDIS:
00656                         return sizeof (usb_conf_desc_network);
00657                 case USB_CONFIG_EEM:
00658                         return sizeof(usb_conf_desc_eem);
00659 #if USB_CONF_STORAGE
00660                 case USB_CONFIG_MS:
00661                         return sizeof(usb_conf_desc_mass);
00662 #endif
00663                 default:
00664                         return 0;
00665         }
00666 }
00667 
00668 /** @} */