| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- /*
- * The MIT License (MIT)
- *
- * Copyright (c) 2019 Ha Thach (tinyusb.org)
- *
- * 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.
- */
- /** \ingroup group_usbd
- * \defgroup group_dcd Device Controller Driver (DCD)
- * @{ */
- #ifndef _TUSB_DCD_H_
- #define _TUSB_DCD_H_
- #include "common/tusb_common.h"
- #ifdef __cplusplus
- extern "C" {
- #endif
- typedef enum
- {
- DCD_EVENT_INVALID = 0,
- DCD_EVENT_BUS_RESET,
- DCD_EVENT_UNPLUGGED,
- DCD_EVENT_SOF,
- DCD_EVENT_SUSPEND, // TODO LPM Sleep L1 support
- DCD_EVENT_RESUME,
- DCD_EVENT_SETUP_RECEIVED,
- DCD_EVENT_XFER_COMPLETE,
- // Not an DCD event, just a convenient way to defer ISR function
- USBD_EVENT_FUNC_CALL,
- DCD_EVENT_COUNT
- } dcd_eventid_t;
- typedef struct TU_ATTR_ALIGNED(4)
- {
- uint8_t rhport;
- uint8_t event_id;
- union {
- // USBD_EVT_SETUP_RECEIVED
- tusb_control_request_t setup_received;
- // USBD_EVT_XFER_COMPLETE
- struct {
- uint8_t ep_addr;
- uint8_t result;
- uint32_t len;
- }xfer_complete;
- // USBD_EVENT_FUNC_CALL
- struct {
- void (*func) (void*);
- void* param;
- }func_call;
- };
- } dcd_event_t;
- //TU_VERIFY_STATIC(sizeof(dcd_event_t) <= 12, "size is not correct");
- /*------------------------------------------------------------------*/
- /* Device API
- *------------------------------------------------------------------*/
- // Initialize controller to device mode
- void dcd_init (uint8_t rhport);
- // Enable device interrupt
- void dcd_int_enable (uint8_t rhport);
- // Disable device interrupt
- void dcd_int_disable(uint8_t rhport);
- // Receive Set Address request, mcu port must also include status IN response
- void dcd_set_address(uint8_t rhport, uint8_t dev_addr);
- // Receive Set Configure request
- void dcd_set_config (uint8_t rhport, uint8_t config_num);
- // Wake up host
- void dcd_remote_wakeup(uint8_t rhport);
- //--------------------------------------------------------------------+
- // Endpoint API
- //--------------------------------------------------------------------+
- // Configure endpoint's registers according to descriptor
- bool dcd_edpt_open (uint8_t rhport, tusb_desc_endpoint_t const * p_endpoint_desc);
- // Submit a transfer, When complete dcd_event_xfer_complete() is invoked to notify the stack
- bool dcd_edpt_xfer (uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes);
- // Stall endpoint
- void dcd_edpt_stall (uint8_t rhport, uint8_t ep_addr);
- // clear stall, data toggle is also reset to DATA0
- void dcd_edpt_clear_stall (uint8_t rhport, uint8_t ep_addr);
- //--------------------------------------------------------------------+
- // Event API (Implemented by device stack)
- //--------------------------------------------------------------------+
- // Called by DCD to notify device stack
- extern void dcd_event_handler(dcd_event_t const * event, bool in_isr);
- // helper to send bus signal event
- extern void dcd_event_bus_signal (uint8_t rhport, dcd_eventid_t eid, bool in_isr);
- // helper to send setup received
- extern void dcd_event_setup_received(uint8_t rhport, uint8_t const * setup, bool in_isr);
- // helper to send transfer complete event
- extern void dcd_event_xfer_complete (uint8_t rhport, uint8_t ep_addr, uint32_t xferred_bytes, uint8_t result, bool in_isr);
- #ifdef __cplusplus
- }
- #endif
- #endif /* _TUSB_DCD_H_ */
- /// @}
|