blob: 0b1636ef9de688e0bdfa95ea1cd547409361ec8f [file] [log] [blame]
/**
* \file
*
* \brief USB Device Personal Healthcare Device Class (PHDC)
* interface 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 _UDI_PHDC_H_
#define _UDI_PHDC_H_
#include "conf_usb.h"
#include "usb_protocol.h"
#include "usb_protocol_phdc.h"
#include "udd.h"
#include "udc_desc.h"
#include "udi.h"
//* Check if preample feature is supported (don't change it)
#define UDI_PHDC_PREAMBLE_FEATURE FALSE // No preample message by default
#if (0!=(UDI_PHDC_QOS_OUT&(UDI_PHDC_QOS_OUT-1)))
// There are many QOS for OUT then enable preample feature
#undef UDI_PHDC_PREAMBLE_FEATURE
#define UDI_PHDC_PREAMBLE_FEATURE TRUE
#endif
#if (0!=(UDI_PHDC_QOS_IN&(UDI_PHDC_QOS_IN-1)))
// There are many QOS for IN then enable preample feature
#undef UDI_PHDC_PREAMBLE_FEATURE
#define UDI_PHDC_PREAMBLE_FEATURE TRUE
#endif
// Check QOS value
#if (0!=(UDI_PHDC_QOS_OUT&USB_PHDC_QOS_LOW_GOOD))
#error The QOS Low Good is not authorized on OUT transfer
#endif
#ifdef __cplusplus
extern "C" {
#endif
/**
* \ingroup udi_group
* \defgroup udi_phdc_group UDI for Personal Healthcare Device Class
*
* @{
*/
/**
* \name Interface Descriptor
*
* The following structures provide the interface descriptor.
* It must be implemented in USB configuration descriptor.
*/
//@{
COMPILER_PACK_SET(1);
//! Just for compile size but not used and removed by compiler
static le16_t tmp_wDevSpecializations[] = UDI_PHDC_SPECIALIZATION;
//! Function specialization descriptor for interface descriptors
typedef struct {
usb_phdc_fnctext_desc_t header;
le16_t wDevSpecializations[sizeof(tmp_wDevSpecializations) / 2];
} udi_phdc_fnctext_desc_t;
#ifdef UDI_PHDC_METADATA_DESC_BULK_IN
//! Just for compile size but not used and removed by compiler
static uint8_t tmp_bulk_in[] = UDI_PHDC_METADATA_DESC_BULK_IN;
//! Metadata descriptor of bulk IN for interface descriptors
typedef struct {
usb_phdc_meta_data_desc_t header;
uint8_t bOpaqueData[sizeof(tmp_bulk_in)];
} udi_phdc_metadata_desc_bulkin_t;
#endif
#ifdef UDI_PHDC_METADATA_DESC_BULK_OUT
//! Just for compile size but not used and removed by compiler
static uint8_t tmp_bulk_out[] = UDI_PHDC_METADATA_DESC_BULK_OUT;
//! Metadata descriptor of bulk OUT for interface descriptors
typedef struct {
usb_phdc_meta_data_desc_t header;
uint8_t bOpaqueData[sizeof(tmp_bulk_out)];
} udi_phdc_metadata_desc_bulkout_t;
#endif
#ifdef UDI_PHDC_METADATA_DESC_INT_IN
//! Just for compile size but not used and removed by compiler
static uint8_t tmp_int_in[] = UDI_PHDC_METADATA_DESC_INT_IN;
//! Metadata descriptor of interrupt IN for interface descriptors
typedef struct {
usb_phdc_meta_data_desc_t header;
uint8_t bOpaqueData[sizeof(tmp_int_in)];
} udi_phdc_metadata_desc_intin_t;
#endif
//! Interface descriptor struture for PHDC
typedef struct {
usb_iface_desc_t iface;
usb_phdc_classfnct_desc_t classfnct;
#if (UDI_PHDC_DATAMSG_FORMAT==USB_PHDC_DATAMSG_FORMAT_11073_2060)
udi_phdc_fnctext_desc_t fnctext;
#endif
usb_ep_desc_t ep_bulk_in;
usb_phdc_qos_desc_t qos_bulk_in;
#ifdef UDI_PHDC_METADATA_DESC_BULK_IN
udi_phdc_metadata_desc_bulkin_t metadata_bulk_in;
#endif
usb_ep_desc_t ep_bulk_out;
usb_phdc_qos_desc_t qos_bulk_out;
#ifdef UDI_PHDC_METADATA_DESC_BULK_OUT
udi_phdc_metadata_desc_bulkout_t metadata_bulk_out;
#endif
#if ((UDI_PHDC_QOS_IN&USB_PHDC_QOS_LOW_GOOD)==USB_PHDC_QOS_LOW_GOOD)
usb_ep_desc_t ep_int_in;
usb_phdc_qos_desc_t qos_int_in;
# ifdef UDI_PHDC_METADATA_DESC_INT_IN
udi_phdc_metadata_desc_intin_t metadata_int_in;
# endif
#endif
} udi_phdc_desc_t;
COMPILER_PACK_RESET();
//! By default no string associated to this interface
#ifndef UDI_PHDC_STRING_ID
#define UDI_PHDC_STRING_ID 0
#endif
//! Compute the number of endpoints used by the interface
#if ((UDI_PHDC_QOS_IN&USB_PHDC_QOS_LOW_GOOD)==USB_PHDC_QOS_LOW_GOOD)
#define UDI_PHDC_NUM_ENDPOINT 3 // Bulk IN, bulk OUT, Interrupt IN
#else
#define UDI_PHDC_NUM_ENDPOINT 2 // Bulk IN, bulk OUT
#endif
//! Value to enable/disable in descriptor the feature metadata preample
#if (UDI_PHDC_PREAMBLE_FEATURE == TRUE)
#define UDI_PHDC_BMCAPABILITY USB_PHDC_CAPABILITY_METADATAMSG_PREAMBLE
#else
#define UDI_PHDC_BMCAPABILITY 0
#endif
//! Extension descriptor for optional format 11073 2060
#if (UDI_PHDC_DATAMSG_FORMAT==USB_PHDC_DATAMSG_FORMAT_11073_2060)
#define UDI_PHDC_FNCTEXT \
.fnctext.header.bLength = sizeof(udi_phdc_fnctext_desc_t), \
.fnctext.header.bDescriptorType = USB_DT_PHDC_11073PHD_FUNCTION, \
.fnctext.header.bReserved = 0, \
.fnctext.header.bNumDevSpecs = sizeof(tmp_wDevSpecializations)/2, \
.fnctext.wDevSpecializations = UDI_PHDC_SPECIALIZATION
#else
#define UDI_PHDC_FNCTEXT
#endif
//! Optional metadata descriptor for endpoint bulk IN
#ifdef UDI_PHDC_METADATA_DESC_BULK_IN
#define UDI_PHDC_METADATA_BULKIN \
.metadata_bulk_in.header.bLength = \
sizeof(udi_phdc_metadata_desc_bulkin_t),\
.metadata_bulk_in.header.bDescriptorType = USB_DT_PHDC_METADATA,\
.metadata_bulk_in.bOpaqueData = UDI_PHDC_METADATA_DESC_BULK_IN
#else
#define UDI_PHDC_METADATA_BULKIN
#endif
//! Optional metadata descriptor for endpoint bulk OUT
#ifdef UDI_PHDC_METADATA_DESC_BULK_OUT
#define UDI_PHDC_METADATA_BULKOUT \
.metadata_bulk_out.header.bLength = \
sizeof(udi_phdc_metadata_desc_bulkout_t),\
.metadata_bulk_out.header.bDescriptorType = USB_DT_PHDC_METADATA,\
.metadata_bulk_in.bOpaqueData = UDI_PHDC_METADATA_DESC_BULK_OUT
#else
#define UDI_PHDC_METADATA_BULKOUT
#endif
//! Optional metadata descriptor for endpoint interrupt IN
#ifdef UDI_PHDC_METADATA_DESC_INT_IN
#define UDI_PHDC_METADATA_INTIN \
.metadata_int_in.header.bLength = \
sizeof(udi_phdc_metadata_desc_intin_t),\
.metadata_int_in.header.bDescriptorType = USB_DT_PHDC_METADATA,\
.metadata_int_in.bOpaqueData = UDI_PHDC_METADATA_DESC_INT_IN
#else
#define UDI_PHDC_METADATA_INTIN
#endif
//! Declaration of endpoint interrupt IN in case of QOS low good
#if ((UDI_PHDC_QOS_IN&USB_PHDC_QOS_LOW_GOOD)==USB_PHDC_QOS_LOW_GOOD)
#define UDI_PHDC_EP_INTIN \
.ep_int_in.bLength = sizeof(usb_ep_desc_t),\
.ep_int_in.bDescriptorType = USB_DT_ENDPOINT,\
.ep_int_in.bEndpointAddress = UDI_PHDC_EP_INTERRUPT_IN,\
.ep_int_in.bmAttributes = USB_EP_TYPE_INTERRUPT,\
.ep_int_in.wMaxPacketSize = UDI_PHDC_EP_SIZE_INT_IN,\
.ep_int_in.bInterval = 20,\
.qos_int_in.bLength = sizeof(usb_phdc_qos_desc_t),\
.qos_int_in.bDescriptorType = USB_DT_PHDC_QOS,\
.qos_int_in.bQoSEncodingVersion = USB_PHDC_QOS_ENCODING_VERSION_1,\
.qos_int_in.bmLatencyReliability = USB_PHDC_QOS_LOW_GOOD,\
UDI_PHDC_METADATA_INTIN
#else
#define UDI_PHDC_EP_INTIN
#endif
//! Content of PHDC interface descriptor for all speeds
#define UDI_PHDC_DESC {\
.iface.bLength = sizeof(usb_iface_desc_t),\
.iface.bDescriptorType = USB_DT_INTERFACE,\
.iface.bInterfaceNumber = UDI_PHDC_IFACE_NUMBER,\
.iface.bAlternateSetting = 0,\
.iface.bNumEndpoints = UDI_PHDC_NUM_ENDPOINT,\
.iface.bInterfaceClass = PHDC_CLASS,\
.iface.bInterfaceSubClass = PHDC_SUB_CLASS,\
.iface.bInterfaceProtocol = PHDC_PROTOCOL,\
.iface.iInterface = UDI_PHDC_STRING_ID,\
.classfnct.bLength = sizeof(usb_phdc_classfnct_desc_t),\
.classfnct.bDescriptorType = USB_DT_PHDC_CLASSFUNCTION,\
.classfnct.bPHDCDataCode = UDI_PHDC_DATAMSG_FORMAT,\
.classfnct.bmCapability = UDI_PHDC_BMCAPABILITY,\
UDI_PHDC_FNCTEXT,\
.ep_bulk_in.bLength = sizeof(usb_ep_desc_t),\
.ep_bulk_in.bDescriptorType = USB_DT_ENDPOINT,\
.ep_bulk_in.bEndpointAddress = UDI_PHDC_EP_BULK_IN,\
.ep_bulk_in.bmAttributes = USB_EP_TYPE_BULK,\
.ep_bulk_in.wMaxPacketSize = UDI_PHDC_EP_SIZE_BULK_IN,\
.ep_bulk_in.bInterval = 0,\
.qos_bulk_in.bLength = sizeof(usb_phdc_qos_desc_t),\
.qos_bulk_in.bDescriptorType = USB_DT_PHDC_QOS,\
.qos_bulk_in.bQoSEncodingVersion = USB_PHDC_QOS_ENCODING_VERSION_1,\
.qos_bulk_in.bmLatencyReliability = \
UDI_PHDC_QOS_IN&(~USB_PHDC_QOS_LOW_GOOD),\
UDI_PHDC_METADATA_BULKIN,\
.ep_bulk_out.bLength = sizeof(usb_ep_desc_t),\
.ep_bulk_out.bDescriptorType = USB_DT_ENDPOINT,\
.ep_bulk_out.bEndpointAddress = UDI_PHDC_EP_BULK_OUT,\
.ep_bulk_out.bmAttributes = USB_EP_TYPE_BULK,\
.ep_bulk_out.wMaxPacketSize = UDI_PHDC_EP_SIZE_BULK_OUT,\
.ep_bulk_out.bInterval = 0,\
.qos_bulk_out.bLength = sizeof(usb_phdc_qos_desc_t),\
.qos_bulk_out.bDescriptorType = USB_DT_PHDC_QOS,\
.qos_bulk_out.bQoSEncodingVersion = USB_PHDC_QOS_ENCODING_VERSION_1,\
.qos_bulk_out.bmLatencyReliability = UDI_PHDC_QOS_OUT,\
UDI_PHDC_METADATA_BULKOUT,\
UDI_PHDC_EP_INTIN,\
}
//@}
//! Global struture which contains standard UDI API for UDC
extern UDC_DESC_STORAGE udi_api_t udi_api_phdc;
/**
* \name Interface for application
*
* These routines are used by memory to transfer his data
* to/from USB PHDC endpoints.
*/
//@{
//! Structure used in argument for routines
//! udi_phdc_senddata and udi_phdc_waitdata
typedef struct {
uint8_t qos;
uint8_t *opaquedata;
uint8_t opaque_size;
uint8_t *metadata;
uint16_t metadata_size;
} udi_phdc_metadata_t;
/**
* \brief Send metadata to USB host
*
* \param metadata Information about metadata to send
* \param callback Function to call at the end of transfer.
*
* \return \c 1 if function was successfully done, otherwise \c 0.
*/
bool udi_phdc_senddata(udi_phdc_metadata_t * metadata,
void (*callback) (uint16_t));
/**
* \brief Wait metadata from USB host
*
* \param metadata Information about expected metadata
* \param callback Function to call at the end of transfer.
*
* \return \c 1 if function was successfully done, otherwise \c 0.
*/
bool udi_phdc_waitdata(udi_phdc_metadata_t * metadata,
void (*callback) (uint16_t));
//! @}
//! @}
#ifdef __cplusplus
}
#endif
#endif // _UDI_PHDC_H_