text: /**
   * \file
   *
   * \brief USB Personal Healthcare Device Class (PHDC) protocol definitions.
   *
   * Copyright (C) 2009 Atmel Corporation. All rights reserved.
   *
   * \page License
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions are met:
   *
   * 1. Redistributions of source code must retain the above copyright notice,
   * this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright notice,
   * this list of conditions and the following disclaimer in the documentation
   * and/or other materials provided with the distribution.
   *
   * 3. The name of Atmel may not be used to endorse or promote products derived
   * from this software without specific prior written permission.
   *
   * 4. This software may only be redistributed and used in connection with an
   * Atmel AVR product.
   *
   * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
   * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
   * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
   * DAMAGE.
   */
  
  #ifndef _USB_PROTOCOL_PHDC_H_
  #define _USB_PROTOCOL_PHDC_H_
  
  
  /**
   * \ingroup usb_protocol_group
   * \defgroup usb_phdc_protocol USB Personal Healthcare Device Class (PHDC)
   * protocol definitions
   *
   * @{
   */
  
  /**
   * \name Possible Class value
   */
  //@{
  #define  PHDC_CLASS         0x0F
  //@}
  
  /**
   * \name Possible SubClass value
   */
  //@{
  #define  PHDC_SUB_CLASS     0x00
  //@}
  
  /**
   * \name Possible protocol value
   * \note Only the BULK protocol should be used in new designs.
   */
  //@{
  #define  PHDC_PROTOCOL      0x00
  //@}
  
  
  /**
   * \brief Standard USB PHDC interface feature flags
   *
   * \note valid for SetFeature and ClearFeature requests.
   */
  enum usb_phdc_feature {
  	USB_PHDC_FEATURE_METADATA = 0x01,
  };
  
  /**
   * \brief PHDC USB descriptor types
   */
  enum usb_descriptor_type_phdc {
  	USB_DT_PHDC_CLASSFUNCTION = 0x20,
  	USB_DT_PHDC_QOS = 0x21,
  	USB_DT_PHDC_METADATA = 0x22,
  	USB_DT_PHDC_11073PHD_FUNCTION = 0x30,
  };
  
  /**
   * \brief PHDC Data/Messaging format code
   */
  enum usb_phdc_data_msg_format_code {
  	USB_PHDC_DATAMSG_FORMAT_VENDOR = 0x01,
  	//! refer to the section ISO/IEEE AA073-20601 protocol for further information
  	USB_PHDC_DATAMSG_FORMAT_11073_20601 = 0x02,
  };
  
  /**
   * \brief PHDC interface capability
   */
  enum usb_phdc_capability {
  	//! If Meta_Data Message Preamble is implemented
  	USB_PHDC_CAPABILITY_METADATAMSG_PREAMBLE = (1 << 0),
  };
  
  /**
   * \brief QoS Encoding Version
   */
  enum usb_phdc_qos_encoding_version {
  	USB_PHDC_QOS_ENCODING_VERSION_1 = 0x01,
  };
  
  //! \name latency/reliability bin for the QoS data
  //! @{
  #define  USB_PHDC_QOS_VERYHIGH_BEST  (1<<5)
  #define  USB_PHDC_QOS_HIGH_BEST      (1<<4)
  #define  USB_PHDC_QOS_MEDIUM_BEST    (1<<3)
  #define  USB_PHDC_QOS_MEDIUM_BETTER  (1<<2)
  #define  USB_PHDC_QOS_MEDIUM_GOOD    (1<<1)
  #define  USB_PHDC_QOS_LOW_GOOD       (1<<0)
  //! @}
  
  //! String use by meta-data message to verify it
  #define METADATA_MESSAGE_SIG 	\
  			{'P','h','d','c','Q','o','S','S','i','g','n','a','t','u','r','e'}
  
  COMPILER_PACK_SET(1);
  
  //! PHDC Class Function Descriptor
  typedef struct {
  	uint8_t bLength;	//!< Size of this descriptor in bytes
  	uint8_t bDescriptorType;	//!< PHDC descriptor type
  	uint8_t bPHDCDataCode;	//!< Data/Messaging format code
  	uint8_t bmCapability;	//!< Features available in the interface
  } usb_phdc_classfnct_desc_t;
  
  //! PHDC Function Extension Descriptor
  //! Note: The wDevSpecializations fields must follow this struct
  typedef struct {
  	uint8_t bLength;	//!< Size of this descriptor in bytes
  	uint8_t bDescriptorType;	//!< PHDC descriptor type
  	uint8_t bReserved;	//!< Reserved for future use, must be zero
  	uint8_t bNumDevSpecs;	//!< Number of wDevSpecializations below 
  } usb_phdc_fnctext_desc_t;
  
  //! PHDC Function Extension Descriptor with single specification
  typedef struct {
  	uint8_t bLength;	//!< Size of this descriptor in bytes
  	uint8_t bDescriptorType;	//!< PHDC descriptor type
  	uint8_t bReserved;	//!< Reserved for future use, must be zero
  	uint8_t bNumDevSpecs;	//!< Number of wDevSpecializations below 
  	le16_t wDevSpecializations;	//!< list that defines the device specialization
  } usb_phdc_fnctext_singlespec_desc_t;
  
  //! PHDC QoS Descriptor
  typedef struct {
  	uint8_t bLength;	//!< Size of this descriptor in bytes
  	uint8_t bDescriptorType;	//!< PHDC descriptor type
  	uint8_t bQoSEncodingVersion;	//!< 01h = version 1 QoS information encoding  
  	uint8_t bmLatencyReliability;	//!< If bQoSEncodingVersion = 01h, 
  	//!< then this bitmap refers to the latency/reliability bin for the QoS data
  } usb_phdc_qos_desc_t;
  
  //! PHDC Meta-Data Descriptor
  //! Note: The optional meta-data field (0 to 253B) can follow this struct
  typedef struct {
  	uint8_t bLength;	//!< Size of this descriptor in bytes
  	uint8_t bDescriptorType;	//!< PHDC descriptor type
  } usb_phdc_meta_data_desc_t;
  
  typedef struct {
  	usb_phdc_meta_data_desc_t header;
  	uint8_t bOpaqueData[1];	//!< Opaque meta-data (size=1)
  } usb_phdc_meta_data_1_desc_t;
  
  //! PHDC Meta-Data Message
  //! Note: The optional meta-data field (0 to EPx_size-21) can follow this struct
  typedef struct {
  	uint8_t aSignature[16];	//!< Constant used to give preamble verifiability.
  	uint8_t bNumTransfers;	//!< Count of following transfers
  	uint8_t bQoSEncodingVersion;	//!< 01h = version 1 QoS information encoding  
  	uint8_t bmLatencyReliability;	//!< If bQoSEncodingVersion = 01h, 
  	//!< then this bitmap refers to the latency/reliability bin for the QoS data
  	uint8_t bOpaqueDataSize;	//!< Size, in bytes, of opaque QoS data or meta-data
  	//!< if bQoSEncodingVersion = 01h
  } usb_phdc_metadata_msg_t;
  
  typedef struct {
  	usb_phdc_metadata_msg_t header;
  	uint8_t bOpaqueData[1];	//!< Opaque meta-data (size=1)
  } usb_phdc_metadata_msg_1_t;
  
  COMPILER_PACK_RESET();
  
  //@}
  
  #endif // _USB_PROTOCOL_PHDC_H_
  