incubator-nuttx/drivers/usbdev/composite_desc.c

232 lines
7.5 KiB
C

/****************************************************************************
* drivers/usbdev/composite_desc.c
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <nuttx/usb/usb.h>
#include <nuttx/usb/usbdev.h>
#include "composite.h"
#ifdef CONFIG_USBDEV_COMPOSITE
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* Configuration ************************************************************/
/* Packet sizes */
#ifndef CONFIG_COMPOSITE_EP0MAXPACKET
# define CONFIG_COMPOSITE_EP0MAXPACKET 64
#endif
/* Vendor and product IDs and strings */
#ifndef CONFIG_COMPOSITE_VENDORID
# warning "CONFIG_COMPOSITE_VENDORID not defined"
# define CONFIG_COMPOSITE_VENDORID 0x03eb
#endif
#ifndef CONFIG_COMPOSITE_PRODUCTID
# warning "CONFIG_COMPOSITE_PRODUCTID not defined"
# define CONFIG_COMPOSITE_PRODUCTID 0x2022
#endif
#ifndef CONFIG_COMPOSITE_VERSIONNO
# define CONFIG_COMPOSITE_VERSIONNO (0x0101)
#endif
#ifndef CONFIG_COMPOSITE_VENDORSTR
# warning "No Vendor string specified"
# define CONFIG_COMPOSITE_VENDORSTR "NuttX"
#endif
#ifndef CONFIG_COMPOSITE_PRODUCTSTR
# warning "No Product string specified"
# define CONFIG_COMPOSITE_PRODUCTSTR "Composite Device"
#endif
#undef CONFIG_COMPOSITE_SERIALSTR
#define CONFIG_COMPOSITE_SERIALSTR "0101"
#undef CONFIG_COMPOSITE_CONFIGSTR
#define CONFIG_COMPOSITE_CONFIGSTR "Composite"
#ifdef CONFIG_USBDEV_SELFPOWERED
# define COMPOSITE_SELFPOWERED USB_CONFIG_ATTR_SELFPOWER
#else
# define COMPOSITE_SELFPOWERED (0)
#endif
#ifdef CONFIG_USBDEV_REMOTEWAKEUP
# define COMPOSITE_REMOTEWAKEUP USB_CONFIG_ATTR_WAKEUP
#else
# define COMPOSITE_REMOTEWAKEUP (0)
#endif
/* Descriptors **************************************************************/
/* String language */
#define COMPOSITE_STR_LANGUAGE (0x0409) /* en-us */
/****************************************************************************
* Private Data
****************************************************************************/
/* Device Descriptor */
static const struct usb_devdesc_s g_devdesc =
{
USB_SIZEOF_DEVDESC, /* len */
USB_DESC_TYPE_DEVICE, /* type */
{ /* usb */
LSBYTE(0x0200),
MSBYTE(0x0200)
},
#ifdef CONFIG_COMPOSITE_IAD
USB_CLASS_MISC, /* classid */
2, /* subclass */
1, /* protocol */
#else
USB_CLASS_PER_INTERFACE, /* classid */
0, /* subclass */
0, /* protocol */
#endif
CONFIG_COMPOSITE_EP0MAXPACKET, /* maxpacketsize */
{
LSBYTE(CONFIG_COMPOSITE_VENDORID), /* vendor */
MSBYTE(CONFIG_COMPOSITE_VENDORID)
},
{
LSBYTE(CONFIG_COMPOSITE_PRODUCTID), /* product */
MSBYTE(CONFIG_COMPOSITE_PRODUCTID)
},
{
LSBYTE(CONFIG_COMPOSITE_VERSIONNO), /* device */
MSBYTE(CONFIG_COMPOSITE_VERSIONNO)
},
COMPOSITE_MANUFACTURERSTRID, /* imfgr */
COMPOSITE_PRODUCTSTRID, /* iproduct */
COMPOSITE_SERIALSTRID, /* serno */
COMPOSITE_NCONFIGS /* nconfigs */
};
static const struct usbdev_strdesc_s g_strdesc[] =
{
{COMPOSITE_MANUFACTURERSTRID, CONFIG_COMPOSITE_VENDORSTR},
{COMPOSITE_PRODUCTSTRID, CONFIG_COMPOSITE_PRODUCTSTR},
#ifdef CONFIG_COMPOSITE_SERIALSTR
{COMPOSITE_SERIALSTRID, CONFIG_COMPOSITE_SERIALSTR},
#else
{COMPOSITE_SERIALSTRID, ""},
#endif
{COMPOSITE_CONFIGSTRID, CONFIG_COMPOSITE_CONFIGSTR},
{}
};
static const struct usbdev_strdescs_s g_strdescs =
{
.language = COMPOSITE_STR_LANGUAGE,
.strdesc = g_strdesc,
};
static const struct usb_cfgdesc_s g_cfgdesc =
{
.len = USB_SIZEOF_CFGDESC, /* Descriptor length */
.type = USB_DESC_TYPE_CONFIG, /* Descriptor type */
.cfgvalue = COMPOSITE_CONFIGID, /* Configuration value */
.icfg = COMPOSITE_CONFIGSTRID, /* Configuration */
.attr = USB_CONFIG_ATTR_ONE |
COMPOSITE_SELFPOWERED |
COMPOSITE_REMOTEWAKEUP, /* Attributes */
.mxpower = (CONFIG_USBDEV_MAXPOWER + 1) / 2 /* Max power (mA/2) */
};
#ifdef CONFIG_USBDEV_DUALSPEED
static const struct usb_qualdesc_s g_qualdesc =
{
USB_SIZEOF_QUALDESC, /* len */
USB_DESC_TYPE_DEVICEQUALIFIER, /* type */
{ /* usb */
LSBYTE(0x0200),
MSBYTE(0x0200)
},
# ifdef CONFIG_COMPOSITE_IAD
USB_CLASS_MISC, /* classid */
2, /* subclass */
1, /* protocol */
# else
USB_CLASS_VENDOR_SPEC, /* classid */
0, /* subclass */
0, /* protocol */
# endif
CONFIG_COMPOSITE_EP0MAXPACKET, /* mxpacketsize */
COMPOSITE_NCONFIGS, /* nconfigs */
0, /* reserved */
};
#endif
static const struct usbdev_devdescs_s g_composite_devdescs =
{
&g_cfgdesc,
&g_strdescs,
&g_devdesc,
#ifdef CONFIG_USBDEV_DUALSPEED
&g_qualdesc,
#endif
};
/****************************************************************************
* Public Data
****************************************************************************/
const char g_compvendorstr[] = CONFIG_COMPOSITE_VENDORSTR;
const char g_compproductstr[] = CONFIG_COMPOSITE_PRODUCTSTR;
#ifndef CONFIG_COMPOSITE_BOARD_SERIALSTR
const char g_compserialstr[] = CONFIG_COMPOSITE_SERIALSTR;
#endif
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: composite_getdevdescs
*
* Description:
* Return a pointer to the device descriptor
*
****************************************************************************/
FAR const struct usbdev_devdescs_s *composite_getdevdescs(void)
{
return &g_composite_devdescs;
}
#endif /* CONFIG_USBDEV_COMPOSITE */