blob: 477f8465266fa39bd1563bad65fb9394380b3284 [file] [log] [blame]
/*
* Copyright (c) 2023-2024 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file
* @brief USB Audio Class 2 device public header
*
* This header describes only class API interaction with application.
* The audio device itself is modelled with devicetree zephyr,uac2 compatible.
*
* This API is currently considered experimental.
*/
#ifndef ZEPHYR_INCLUDE_USB_CLASS_USBD_UAC2_H_
#define ZEPHYR_INCLUDE_USB_CLASS_USBD_UAC2_H_
#include <zephyr/device.h>
#define UAC2_ENTITY_ID(node) \
({ \
BUILD_ASSERT(DT_NODE_HAS_COMPAT(DT_PARENT(node), zephyr_uac2)); \
UTIL_INC(DT_NODE_CHILD_IDX(node)); \
})
/**
* @brief USB Audio 2 application event handlers
*/
struct uac2_ops {
/**
* @brief Start of Frame callback
*
* Notifies application about SOF event on the bus.
*
* @param dev USB Audio 2 device
* @param user_data Opaque user data pointer
*/
void (*sof_cb)(const struct device *dev, void *user_data);
/**
* @brief Terminal update callback
*
* Notifies application that host has enabled or disabled a terminal.
*
* @param dev USB Audio 2 device
* @param terminal Terminal ID linked to AudioStreaming interface
* @param enabled True if host enabled terminal, False otherwise
* @param microframes True if USB connection speed uses microframes
* @param user_data Opaque user data pointer
*/
void (*terminal_update_cb)(const struct device *dev, uint8_t terminal,
bool enabled, bool microframes,
void *user_data);
/**
* @brief Get receive buffer address
*
* USB stack calls this function to obtain receive buffer address for
* AudioStreaming interface. The buffer is owned by USB stack until
* @ref data_recv_cb callback is called. The buffer must be sufficiently
* aligned for use by UDC driver.
*
* @param dev USB Audio 2 device
* @param terminal Input Terminal ID linked to AudioStreaming interface
* @param size Maximum number of bytes USB stack will write to buffer.
* @param user_data Opaque user data pointer
*/
void *(*get_recv_buf)(const struct device *dev, uint8_t terminal,
uint16_t size, void *user_data);
/**
* @brief Data received
*
* This function releases buffer obtained in @ref get_recv_buf after USB
* has written data to the buffer and/or no longer needs it.
*
* @param dev USB Audio 2 device
* @param terminal Input Terminal ID linked to AudioStreaming interface
* @param buf Buffer previously obtained via @ref get_recv_buf
* @param size Number of bytes written to buffer
* @param user_data Opaque user data pointer
*/
void (*data_recv_cb)(const struct device *dev, uint8_t terminal,
void *buf, uint16_t size, void *user_data);
/**
* @brief Transmit buffer release callback
*
* This function releases buffer provided in @ref usbd_uac2_send when
* the class no longer needs it.
*
* @param dev USB Audio 2 device
* @param terminal Output Terminal ID linked to AudioStreaming interface
* @param buf Buffer previously provided via @ref usbd_uac2_send
* @param user_data Opaque user data pointer
*/
void (*buf_release_cb)(const struct device *dev, uint8_t terminal,
void *buf, void *user_data);
/**
* @brief Get Explicit Feedback value
*
* Explicit feedback value format depends terminal connection speed.
* If device is High-Speed capable, it must use Q16.16 format if and
* only if the @ref terminal_update_cb was called with microframes
* parameter set to true. On Full-Speed only devices, or if High-Speed
* capable device is operating at Full-Speed (microframes was false),
* the format is Q10.14 stored on 24 least significant bits (i.e. 8 most
* significant bits are ignored).
*
* @param dev USB Audio 2 device
* @param terminal Input Terminal ID whose feedback should be returned
* @param user_data Opaque user data pointer
*/
uint32_t (*feedback_cb)(const struct device *dev, uint8_t terminal,
void *user_data);
};
/**
* @brief Register USB Audio 2 application callbacks.
*
* @param dev USB Audio 2 device instance
* @param ops USB Audio 2 callback structure
* @param user_data Opaque user data to pass to ops callbacks
*/
void usbd_uac2_set_ops(const struct device *dev,
const struct uac2_ops *ops, void *user_data);
/**
* @brief Send audio data to output terminal
*
* @param dev USB Audio 2 device
* @param terminal Output Terminal ID linked to AudioStreaming interface
* @param data Buffer containing outgoing data
* @param size Number of bytes to send
*
* @return 0 on success, negative value on error
*/
int usbd_uac2_send(const struct device *dev, uint8_t terminal,
void *data, uint16_t size);
#endif /* ZEPHYR_INCLUDE_USB_CLASS_USBD_UAC2_H_ */