2019-03-20 16:11:42 +07:00
|
|
|
/*
|
|
|
|
* The MIT License (MIT)
|
|
|
|
*
|
2019-05-14 11:48:05 +07:00
|
|
|
* Copyright (c) 2019 Ha Thach (tinyusb.org)
|
2019-03-20 16:11:42 +07:00
|
|
|
*
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
|
|
* in the Software without restriction, including without limitation the rights
|
|
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
|
|
* furnished to do so, subject to the following conditions:
|
|
|
|
*
|
|
|
|
* The above copyright notice and this permission notice shall be included in
|
|
|
|
* all copies or substantial portions of the Software.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
|
* THE SOFTWARE.
|
|
|
|
*
|
|
|
|
* This file is part of the TinyUSB stack.
|
|
|
|
*/
|
2014-03-12 14:43:58 +07:00
|
|
|
|
2014-03-25 13:11:22 +07:00
|
|
|
/** \ingroup group_usbd
|
2014-03-16 22:20:33 +07:00
|
|
|
* @{ */
|
2014-03-12 14:43:58 +07:00
|
|
|
|
|
|
|
#ifndef _TUSB_USBD_H_
|
|
|
|
#define _TUSB_USBD_H_
|
|
|
|
|
2014-03-18 18:07:48 +07:00
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2019-03-29 16:37:08 +07:00
|
|
|
#include "common/tusb_common.h"
|
2019-06-10 18:46:00 +07:00
|
|
|
#include "dcd.h"
|
2014-03-12 14:43:58 +07:00
|
|
|
|
2018-04-16 13:46:28 +07:00
|
|
|
//--------------------------------------------------------------------+
|
2019-03-29 17:42:10 +07:00
|
|
|
// Application API
|
2018-04-16 13:46:28 +07:00
|
|
|
//--------------------------------------------------------------------+
|
2019-03-30 14:47:11 +07:00
|
|
|
|
|
|
|
// Task function should be called in main/rtos loop
|
2018-12-13 14:51:37 +07:00
|
|
|
void tud_task (void);
|
2018-03-11 19:37:21 +07:00
|
|
|
|
2019-03-30 14:47:11 +07:00
|
|
|
// Check if device is connected and configured
|
|
|
|
bool tud_mounted(void);
|
|
|
|
|
2019-03-30 23:01:23 +07:00
|
|
|
// Check if device is suspended
|
|
|
|
bool tud_suspended(void);
|
|
|
|
|
|
|
|
// Check if device is ready to transfer
|
|
|
|
static inline bool tud_ready(void)
|
|
|
|
{
|
|
|
|
return tud_mounted() && !tud_suspended();
|
|
|
|
}
|
|
|
|
|
2019-03-30 14:47:11 +07:00
|
|
|
// Remote wake up host, only if suspended and enabled by host
|
|
|
|
bool tud_remote_wakeup(void);
|
|
|
|
|
2018-04-16 13:46:28 +07:00
|
|
|
//--------------------------------------------------------------------+
|
2019-03-29 17:42:10 +07:00
|
|
|
// Application Callbacks (WEAK is optional)
|
2018-04-16 13:46:28 +07:00
|
|
|
//--------------------------------------------------------------------+
|
2018-08-24 18:35:46 +07:00
|
|
|
|
2019-05-12 15:38:15 +07:00
|
|
|
// Invoked when received GET DEVICE DESCRIPTOR request
|
2019-05-12 14:09:35 +07:00
|
|
|
// Application return pointer to descriptor
|
|
|
|
uint8_t const * tud_descriptor_device_cb(void);
|
|
|
|
|
2019-05-12 15:38:15 +07:00
|
|
|
// Invoked when received GET CONFIGURATION DESCRIPTOR request
|
|
|
|
// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete
|
2019-05-12 19:55:15 +07:00
|
|
|
uint8_t const * tud_descriptor_configuration_cb(uint8_t index);
|
2019-05-12 14:09:35 +07:00
|
|
|
|
2019-05-12 15:38:15 +07:00
|
|
|
// Invoked when received GET STRING DESCRIPTOR request
|
|
|
|
// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete
|
|
|
|
uint16_t const* tud_descriptor_string_cb(uint8_t index);
|
2019-05-11 16:31:08 +07:00
|
|
|
|
2019-03-30 15:03:35 +07:00
|
|
|
// Invoked when device is mounted (configured)
|
2019-06-06 10:39:37 +07:00
|
|
|
TU_ATTR_WEAK void tud_mount_cb(void);
|
2018-08-24 18:35:46 +07:00
|
|
|
|
2019-03-30 15:03:35 +07:00
|
|
|
// Invoked when device is unmounted
|
2019-06-06 10:39:37 +07:00
|
|
|
TU_ATTR_WEAK void tud_umount_cb(void);
|
2018-03-01 23:43:03 +07:00
|
|
|
|
2019-03-30 23:01:23 +07:00
|
|
|
// Invoked when usb bus is suspended
|
|
|
|
// Within 7ms, device must draw an average of current less than 2.5 mA from bus
|
2019-06-06 10:39:37 +07:00
|
|
|
TU_ATTR_WEAK void tud_suspend_cb(bool remote_wakeup_en);
|
2019-03-29 16:23:00 +07:00
|
|
|
|
2019-03-30 15:03:35 +07:00
|
|
|
// Invoked when usb bus is resumed
|
2019-06-06 10:39:37 +07:00
|
|
|
TU_ATTR_WEAK void tud_resume_cb(void);
|
2014-03-12 14:43:58 +07:00
|
|
|
|
2019-04-18 22:31:35 +07:00
|
|
|
//--------------------------------------------------------------------+
|
|
|
|
// Interface Descriptor Template
|
|
|
|
//--------------------------------------------------------------------+
|
|
|
|
|
2019-04-19 13:16:06 +07:00
|
|
|
#define TUD_CONFIG_DESC_LEN (9)
|
|
|
|
|
2019-05-14 12:54:29 +07:00
|
|
|
// Interface count, string index, total length, attribute, power in mA
|
2019-04-18 22:31:35 +07:00
|
|
|
#define TUD_CONFIG_DESCRIPTOR(_itfcount, _stridx, _total_len, _attribute, _power_ma) \
|
|
|
|
9, TUSB_DESC_CONFIGURATION, U16_TO_U8S_LE(_total_len), _itfcount, 1, _stridx, TU_BIT(7) | _attribute, (_power_ma)/2
|
|
|
|
|
2019-04-19 13:16:06 +07:00
|
|
|
//------------- CDC -------------//
|
|
|
|
|
|
|
|
// Length of template descriptor: 66 bytes
|
|
|
|
#define TUD_CDC_DESC_LEN (8+9+5+5+4+5+7+9+7+7)
|
|
|
|
|
|
|
|
// CDC Descriptor Template
|
2019-05-02 14:30:49 +07:00
|
|
|
// Interface number, string index, EP notification address and size, EP data address (out, in) and size.
|
2019-04-19 13:16:06 +07:00
|
|
|
#define TUD_CDC_DESCRIPTOR(_itfnum, _stridx, _ep_notif, _ep_notif_size, _epout, _epin, _epsize) \
|
|
|
|
/* Interface Associate */\
|
|
|
|
8, TUSB_DESC_INTERFACE_ASSOCIATION, _itfnum, 2, TUSB_CLASS_CDC, CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL, CDC_COMM_PROTOCOL_ATCOMMAND, 0,\
|
|
|
|
/* CDC Control Interface */\
|
|
|
|
9, TUSB_DESC_INTERFACE, _itfnum, 0, 1, TUSB_CLASS_CDC, CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL, CDC_COMM_PROTOCOL_ATCOMMAND, _stridx,\
|
|
|
|
/* CDC Header */\
|
|
|
|
5, TUSB_DESC_CLASS_SPECIFIC, CDC_FUNC_DESC_HEADER, U16_TO_U8S_LE(0x0120),\
|
|
|
|
/* CDC Call */\
|
|
|
|
5, TUSB_DESC_CLASS_SPECIFIC, CDC_FUNC_DESC_CALL_MANAGEMENT, 0, (_itfnum) + 1,\
|
|
|
|
/* CDC ACM: support line request */\
|
|
|
|
4, TUSB_DESC_CLASS_SPECIFIC, CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT, 2,\
|
|
|
|
/* CDC Union */\
|
|
|
|
5, TUSB_DESC_CLASS_SPECIFIC, CDC_FUNC_DESC_UNION, _itfnum, (_itfnum) + 1,\
|
|
|
|
/* Endpoint Notification */\
|
|
|
|
7, TUSB_DESC_ENDPOINT, _ep_notif, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_ep_notif_size), 16,\
|
|
|
|
/* CDC Data Interface */\
|
|
|
|
9, TUSB_DESC_INTERFACE, (_itfnum)+1, 0, 2, TUSB_CLASS_CDC_DATA, 0, 0, 0,\
|
|
|
|
/* Endpoint Out */\
|
|
|
|
7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0,\
|
|
|
|
/* Endpoint In */\
|
|
|
|
7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0
|
|
|
|
|
|
|
|
//------------- MSC -------------//
|
|
|
|
|
|
|
|
// Length of template descriptor: 23 bytes
|
|
|
|
#define TUD_MSC_DESC_LEN (9 + 7 + 7)
|
|
|
|
|
|
|
|
// Interface number, string index, EP Out & EP In address, EP size
|
|
|
|
#define TUD_MSC_DESCRIPTOR(_itfnum, _stridx, _epout, _epin, _epsize) \
|
|
|
|
/* Interface */\
|
|
|
|
9, TUSB_DESC_INTERFACE, _itfnum, 0, 2, TUSB_CLASS_MSC, MSC_SUBCLASS_SCSI, MSC_PROTOCOL_BOT, _stridx,\
|
|
|
|
/* Endpoint Out */\
|
|
|
|
7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0,\
|
|
|
|
/* Endpoint In */\
|
|
|
|
7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0
|
|
|
|
|
|
|
|
//------------- HID -------------//
|
|
|
|
|
|
|
|
// Length of template descriptor: 25 bytes
|
|
|
|
#define TUD_HID_DESC_LEN (9 + 9 + 7)
|
|
|
|
|
2019-05-02 14:30:49 +07:00
|
|
|
// HID Input only descriptor
|
2019-04-19 13:16:06 +07:00
|
|
|
// Interface number, string index, protocol, report descriptor len, EP In address, size & polling interval
|
|
|
|
#define TUD_HID_DESCRIPTOR(_itfnum, _stridx, _boot_protocol, _report_desc_len, _epin, _epsize, _ep_interval) \
|
|
|
|
/* Interface */\
|
|
|
|
9, TUSB_DESC_INTERFACE, _itfnum, 0, 1, TUSB_CLASS_HID, (_boot_protocol) ? HID_SUBCLASS_BOOT : 0, _boot_protocol, _stridx,\
|
|
|
|
/* HID descriptor */\
|
|
|
|
9, HID_DESC_TYPE_HID, U16_TO_U8S_LE(0x0111), 0, 1, HID_DESC_TYPE_REPORT, U16_TO_U8S_LE(_report_desc_len),\
|
2019-05-02 14:30:49 +07:00
|
|
|
/* Endpoint In */\
|
2019-04-19 13:16:06 +07:00
|
|
|
7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_epsize), _ep_interval
|
|
|
|
|
2019-05-02 14:30:49 +07:00
|
|
|
// Length of template descriptor: 32 bytes
|
|
|
|
#define TUD_HID_INOUT_DESC_LEN (9 + 9 + 7 + 7)
|
|
|
|
|
|
|
|
// HID Input & Output descriptor
|
|
|
|
// Interface number, string index, protocol, report descriptor len, EP In & Out address, size & polling interval
|
|
|
|
#define TUD_HID_INOUT_DESCRIPTOR(_itfnum, _stridx, _boot_protocol, _report_desc_len, _epin, _epout, _epsize, _ep_interval) \
|
|
|
|
/* Interface */\
|
|
|
|
9, TUSB_DESC_INTERFACE, _itfnum, 0, 2, TUSB_CLASS_HID, (_boot_protocol) ? HID_SUBCLASS_BOOT : 0, _boot_protocol, _stridx,\
|
|
|
|
/* HID descriptor */\
|
|
|
|
9, HID_DESC_TYPE_HID, U16_TO_U8S_LE(0x0111), 0, 1, HID_DESC_TYPE_REPORT, U16_TO_U8S_LE(_report_desc_len),\
|
|
|
|
/* Endpoint In */\
|
|
|
|
7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_epsize), _ep_interval,\
|
|
|
|
/* Endpoint Out */\
|
|
|
|
7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_epsize), _ep_interval
|
|
|
|
|
2014-03-12 14:43:58 +07:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif /* _TUSB_USBD_H_ */
|
|
|
|
|
|
|
|
/** @} */
|