/** * @file usb_dc.h * @brief * * Copyright (c) 2022 sakumisu * * 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. * */ #ifndef _USB_DC_H #define _USB_DC_H #include #ifdef __cplusplus extern "C" { #endif /** * @brief USB Endpoint Configuration. * * Structure containing the USB endpoint configuration. */ struct usbd_endpoint_cfg { /** The number associated with the EP in the device * configuration structure * IN EP = 0x80 | \ * OUT EP = 0x00 | \ */ uint8_t ep_addr; /** Endpoint Transfer Type. * May be Bulk, Interrupt, Control or Isochronous */ uint8_t ep_type; /** Endpoint max packet size */ uint16_t ep_mps; }; /** * @brief USB Device Core Layer API * @defgroup _usb_device_core_api USB Device Core API * @{ */ /** * @brief init device controller registers. * @return 0 on success, negative errno code on fail. */ int usb_dc_init(void); /** * @brief deinit device controller registers. * @return 0 on success, negative errno code on fail. */ int usb_dc_deinit(void); /** * @brief Attach USB for device connection * * Function to attach USB for device connection. Upon success, the USB PLL * is enabled, and the USB device is now capable of transmitting and receiving * on the USB bus and of generating interrupts. * * @return 0 on success, negative errno code on fail. */ int usb_dc_attach(void); /** * @brief Detach the USB device * * Function to detach the USB device. Upon success, the USB hardware PLL * is powered down and USB communication is disabled. * * @return 0 on success, negative errno code on fail. */ int usb_dc_detach(void); /** * @brief Set USB device address * * @param[in] addr Device address * * @return 0 on success, negative errno code on fail. */ int usbd_set_address(const uint8_t addr); /** * @brief configure and enable endpoint. * * This function sets endpoint configuration according to one specified in USB. * endpoint descriptor and then enables it for data transfers. * * @param [in] ep_desc Endpoint descriptor byte array. * * @return true if successfully configured and enabled. */ int usbd_ep_open(const struct usbd_endpoint_cfg *ep_cfg); /** * @brief Disable the selected endpoint * * Function to disable the selected endpoint. Upon success interrupts are * disabled for the corresponding endpoint and the endpoint is no longer able * for transmitting/receiving data. * * @param[in] ep Endpoint address corresponding to the one * listed in the device configuration table * * @return 0 on success, negative errno code on fail. */ int usbd_ep_close(const uint8_t ep); /** * @brief Set stall condition for the selected endpoint * * @param[in] ep Endpoint address corresponding to the one * listed in the device configuration table * * @return 0 on success, negative errno code on fail. */ int usbd_ep_set_stall(const uint8_t ep); /** * @brief Clear stall condition for the selected endpoint * * @param[in] ep Endpoint address corresponding to the one * listed in the device configuration table * * @return 0 on success, negative errno code on fail. */ int usbd_ep_clear_stall(const uint8_t ep); /** * @brief Check if the selected endpoint is stalled * * @param[in] ep Endpoint address corresponding to the one * listed in the device configuration table * @param[out] stalled Endpoint stall status * * @return 0 on success, negative errno code on fail. */ int usbd_ep_is_stalled(const uint8_t ep, uint8_t *stalled); /** * @brief Write data to the specified endpoint with poll mode. * * This function is called to write data to the specified endpoint. The * supplied usbd_endpoint_callback function will be called when data is transmitted * out. * * @param[in] ep Endpoint address corresponding to the one * listed in the device configuration table * @param[in] data Pointer to data to write * @param[in] data_len Length of the data requested to write. This may * be zero for a zero length status packet. * @param[out] ret_bytes Bytes scheduled for transmission. This value * may be NULL if the application expects all * bytes to be written * * @return 0 on success, negative errno code on fail. */ int usbd_ep_write(const uint8_t ep, const uint8_t *data, uint32_t data_len, uint32_t *ret_bytes); /** * @brief Read data from the specified endpoint * * This function is called by the endpoint handler function, after an OUT * interrupt has been received for that EP. The application must only call this * function through the supplied usbd_ep_callback function. This function clears * the ENDPOINT NAK when max_data_len is 0, if all data in the endpoint FIFO has been read, * so as to accept more data from host. * * @param[in] ep Endpoint address corresponding to the one * listed in the device configuration table * @param[in] data Pointer to data buffer to write to * @param[in] max_data_len Max length of data to read * @param[out] read_bytes Number of bytes read. If data is NULL and * max_data_len is 0 the number of bytes * available for read should be returned. * * @return 0 on success, negative errno code on fail. */ int usbd_ep_read(const uint8_t ep, uint8_t *data, uint32_t max_data_len, uint32_t *read_bytes); /** * @brief Write data to the specified endpoint with async mode. * * @param[in] ep Endpoint address corresponding to the one * listed in the device configuration table * @param[in] data Pointer to data to write * @param[in] data_len Length of the data requested to write. This may * be zero for a zero length status packet. * * @return 0 on success, negative errno code on fail. */ int usbd_ep_write_async(const uint8_t ep, const uint8_t *data, uint32_t data_len); /** * @brief Read data from the specified endpoint with async mode. * * @param[in] ep Endpoint address corresponding to the one * listed in the device configuration table * @param[in] data Pointer to data buffer to write to * @param[in] data_len Max length of data to read * * @return 0 on success, negative errno code on fail. */ int usbd_ep_read_async(const uint8_t ep, uint8_t *data, uint32_t data_len); /** * @} */ #ifdef __cplusplus } #endif #endif