mirror of
https://github.com/zephyrproject-rtos/zephyr
synced 2025-08-16 14:06:01 +00:00
Now that device_api attribute is unmodified at runtime, as well as all the other attributes, it is possible to switch all device driver instance to be constant. A coccinelle rule is used for this: @r_const_dev_1 disable optional_qualifier @ @@ -struct device * +const struct device * @r_const_dev_2 disable optional_qualifier @ @@ -struct device * const +const struct device * Fixes #27399 Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
287 lines
9.2 KiB
C
287 lines
9.2 KiB
C
/*
|
|
* USB audio class core header
|
|
*
|
|
* Copyright (c) 2020 Nordic Semiconductor ASA
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/**
|
|
* @file
|
|
* @brief USB Audio Device Class public header
|
|
*
|
|
* Header follows below documentation:
|
|
* - USB Device Class Definition for Audio Devices (audio10.pdf)
|
|
*
|
|
* Additional documentation considered a part of USB Audio v1.0:
|
|
* - USB Device Class Definition for Audio Data Formats (frmts10.pdf)
|
|
* - USB Device Class Definition for Terminal Types (termt10.pdf)
|
|
*/
|
|
|
|
#ifndef ZEPHYR_INCLUDE_USB_CLASS_AUDIO_H_
|
|
#define ZEPHYR_INCLUDE_USB_CLASS_AUDIO_H_
|
|
|
|
#include <usb/usb_common.h>
|
|
#include <device.h>
|
|
#include <net/buf.h>
|
|
#include <sys/util.h>
|
|
|
|
/** Audio Interface Subclass Codes
|
|
* Refer to Table A-2 from audio10.pdf
|
|
*/
|
|
enum usb_audio_int_subclass_codes {
|
|
USB_AUDIO_SUBCLASS_UNDEFINED = 0x00,
|
|
USB_AUDIO_AUDIOCONTROL = 0x01,
|
|
USB_AUDIO_AUDIOSTREAMING = 0x02,
|
|
USB_AUDIO_MIDISTREAMING = 0x03
|
|
};
|
|
|
|
/** Audio Class-Specific AC Interface Descriptor Subtypes
|
|
* Refer to Table A-5 from audio10.pdf
|
|
*/
|
|
enum usb_audio_cs_ac_int_desc_subtypes {
|
|
USB_AUDIO_AC_DESCRIPTOR_UNDEFINED = 0x00,
|
|
USB_AUDIO_HEADER = 0x01,
|
|
USB_AUDIO_INPUT_TERMINAL = 0x02,
|
|
USB_AUDIO_OUTPUT_TERMINAL = 0x03,
|
|
USB_AUDIO_MIXER_UNIT = 0x04,
|
|
USB_AUDIO_SELECTOR_UNIT = 0x05,
|
|
USB_AUDIO_FEATURE_UNIT = 0x06,
|
|
USB_AUDIO_PROCESSING_UNIT = 0x07,
|
|
USB_AUDIO_EXTENSION_UNIT = 0x08
|
|
};
|
|
|
|
/** Audio Class-Specific AS Interface Descriptor Subtypes
|
|
* Refer to Table A-6 from audio10.pdf
|
|
*/
|
|
enum usb_audio_cs_as_int_desc_subtypes {
|
|
USB_AUDIO_AS_DESCRIPTOR_UNDEFINED = 0x00,
|
|
USB_AUDIO_AS_GENERAL = 0x01,
|
|
USB_AUDIO_FORMAT_TYPE = 0x02,
|
|
USB_AUDIO_FORMAT_SPECIFIC = 0x03
|
|
};
|
|
|
|
/** Audio Class-Specific Request Codes
|
|
* Refer to Table A-9 from audio10.pdf
|
|
*/
|
|
enum usb_audio_cs_req_codes {
|
|
USB_AUDIO_REQUEST_CODE_UNDEFINED = 0x00,
|
|
USB_AUDIO_SET_CUR = 0x01,
|
|
USB_AUDIO_GET_CUR = 0x81,
|
|
USB_AUDIO_SET_MIN = 0x02,
|
|
USB_AUDIO_GET_MIN = 0x82,
|
|
USB_AUDIO_SET_MAX = 0x03,
|
|
USB_AUDIO_GET_MAX = 0x83,
|
|
USB_AUDIO_SET_RES = 0x04,
|
|
USB_AUDIO_GET_RES = 0x84,
|
|
USB_AUDIO_SET_MEM = 0x05,
|
|
USB_AUDIO_GET_MEM = 0x85,
|
|
USB_AUDIO_GET_STAT = 0xFF
|
|
};
|
|
|
|
/** Feature Unit Control Selectors
|
|
* Refer to Table A-11 from audio10.pdf
|
|
*/
|
|
enum usb_audio_fucs {
|
|
USB_AUDIO_FU_CONTROL_UNDEFINED = 0x00,
|
|
USB_AUDIO_FU_MUTE_CONTROL = 0x01,
|
|
USB_AUDIO_FU_VOLUME_CONTROL = 0x02,
|
|
USB_AUDIO_FU_BASS_CONTROL = 0x03,
|
|
USB_AUDIO_FU_MID_CONTROL = 0x04,
|
|
USB_AUDIO_FU_TREBLE_CONTROL = 0x05,
|
|
USB_AUDIO_FU_GRAPHIC_EQUALIZER_CONTROL = 0x06,
|
|
USB_AUDIO_FU_AUTOMATIC_GAIN_CONTROL = 0x07,
|
|
USB_AUDIO_FU_DELAY_CONTROL = 0x08,
|
|
USB_AUDIO_FU_BASS_BOOST_CONTROL = 0x09,
|
|
USB_AUDIO_FU_LOUDNESS_CONTROL = 0x0A
|
|
};
|
|
|
|
/** USB Terminal Types
|
|
* Refer to Table 2-1 - Table 2-4 from termt10.pdf
|
|
*/
|
|
enum usb_audio_terminal_types {
|
|
/* USB Terminal Types */
|
|
USB_AUDIO_USB_UNDEFINED = 0x0100,
|
|
USB_AUDIO_USB_STREAMING = 0x0101,
|
|
USB_AUDIO_USB_VENDOR_SPEC = 0x01FF,
|
|
|
|
/* Input Terminal Types */
|
|
USB_AUDIO_IN_UNDEFINED = 0x0200,
|
|
USB_AUDIO_IN_MICROPHONE = 0x0201,
|
|
USB_AUDIO_IN_DESKTOP_MIC = 0x0202,
|
|
USB_AUDIO_IN_PERSONAL_MIC = 0x0203,
|
|
USB_AUDIO_IN_OM_DIR_MIC = 0x0204,
|
|
USB_AUDIO_IN_MIC_ARRAY = 0x0205,
|
|
USB_AUDIO_IN_PROC_MIC_ARRAY = 0x0205,
|
|
|
|
/* Output Terminal Types */
|
|
USB_AUDIO_OUT_UNDEFINED = 0x0300,
|
|
USB_AUDIO_OUT_SPEAKER = 0x0301,
|
|
USB_AUDIO_OUT_HEADPHONES = 0x0302,
|
|
USB_AUDIO_OUT_HEAD_AUDIO = 0x0303,
|
|
USB_AUDIO_OUT_DESKTOP_SPEAKER = 0x0304,
|
|
USB_AUDIO_OUT_ROOM_SPEAKER = 0x0305,
|
|
USB_AUDIO_OUT_COMM_SPEAKER = 0x0306,
|
|
USB_AUDIO_OUT_LOW_FREQ_SPEAKER = 0x0307,
|
|
|
|
/* Bi-directional Terminal Types */
|
|
USB_AUDIO_IO_UNDEFINED = 0x0400,
|
|
USB_AUDIO_IO_HANDSET = 0x0401,
|
|
USB_AUDIO_IO_HEADSET = 0x0402,
|
|
USB_AUDIO_IO_SPEAKERPHONE_ECHO_NONE = 0x0403,
|
|
USB_AUDIO_IO_SPEAKERPHONE_ECHO_SUP = 0x0404,
|
|
USB_AUDIO_IO_SPEAKERPHONE_ECHO_CAN = 0x0405,
|
|
};
|
|
|
|
enum usb_audio_direction {
|
|
USB_AUDIO_IN = 0x00,
|
|
USB_AUDIO_OUT = 0x01
|
|
};
|
|
|
|
/**
|
|
* @brief Feature Unit event structure.
|
|
*
|
|
* The event structure is used by feature_update_cb in order to inform the App
|
|
* whenever the Host has modified one of the device features.
|
|
*
|
|
* @param dir The device direction that has been changed. Applicable for
|
|
* Headset device only.
|
|
* @param cs Control selector, feature that has been changed.
|
|
* @param channel Device channel that has been changed. If 0xFF, then
|
|
* all channels have been changed.
|
|
* @param val_len Length of the val field.
|
|
* @param val Value of the feature that has been set.
|
|
*/
|
|
struct usb_audio_fu_evt {
|
|
enum usb_audio_direction dir;
|
|
enum usb_audio_fucs cs;
|
|
uint8_t channel;
|
|
uint8_t val_len;
|
|
const void *val;
|
|
};
|
|
|
|
/**
|
|
* @brief Callback type used to inform the app that data were requested
|
|
* from the device and may be send to the Host.
|
|
* For sending the data usb_audio_send() API function should be used.
|
|
*
|
|
* @note User may not use this callback and may try to send in 1ms task
|
|
* instead. Sending every 1ms may be unsuccessful and may return -EAGAIN
|
|
* if Host did not required data.
|
|
*
|
|
* @param dev The device for which data were requested by the Host.
|
|
*/
|
|
typedef void (*usb_audio_data_request_cb_t)(const struct device *dev);
|
|
|
|
/**
|
|
* @brief Callback type used to inform the app that data were successfully
|
|
* send/received.
|
|
*
|
|
* @param dev The device for which the callback was called.
|
|
* @param buffer Pointer to the net_buf data chunk that was successfully
|
|
* send/received. If the application uses data_written_cb and/or
|
|
* data_received_cb callbacks it is responsible for freeing the
|
|
* buffer by itself.
|
|
* @param size Amount of data that were successfully send/received.
|
|
*/
|
|
typedef void (*usb_audio_data_completion_cb_t)(const struct device *dev,
|
|
struct net_buf *buffer,
|
|
size_t size);
|
|
|
|
/**
|
|
* @brief Callback type used to inform the app that Host has changed
|
|
* one of the features configured for the device.
|
|
* Applicable for all devices.
|
|
*
|
|
* @warning Host may not use all of configured features.
|
|
*
|
|
* @param evt Pointer to an event to be parsed by the App.
|
|
* Pointer sturct is temporary and is valid only during the
|
|
* execution of this callback.
|
|
*/
|
|
typedef void (*usb_audio_feature_updated_cb_t)(const struct device *dev,
|
|
const struct usb_audio_fu_evt *evt);
|
|
|
|
/**
|
|
* @brief Audio callbacks used to interact with audio devices by user App.
|
|
*
|
|
* usb_audio_ops structure contains all relevant callbacks to interact with
|
|
* USB Audio devices. Each of this callbacks is optional and may be left NULL.
|
|
* This will not break the stack but could make USB Audio device useless.
|
|
* Depending on the device some of those callbacks are necessary to make USB
|
|
* device work as expected sending/receiving data. For more information refer
|
|
* to callback documentation above.
|
|
*/
|
|
struct usb_audio_ops {
|
|
/* Callback called when data could be send */
|
|
usb_audio_data_request_cb_t data_request_cb;
|
|
|
|
/* Callback called when data were successfully written with sending
|
|
* capable device. Applicable for headset and microphone. Unused for
|
|
* headphones.
|
|
*/
|
|
usb_audio_data_completion_cb_t data_written_cb;
|
|
|
|
/* Callback called when data were successfully received by receive
|
|
* capable device. Applicable for headset and headphones. Unused for
|
|
* microphone.
|
|
*/
|
|
usb_audio_data_completion_cb_t data_received_cb;
|
|
|
|
/* Callback called when features were modified by the Host */
|
|
usb_audio_feature_updated_cb_t feature_update_cb;
|
|
};
|
|
|
|
/** @brief Get the frame size that is accepted by the Host.
|
|
*
|
|
* This function returns the frame size for Input Devices that is expected
|
|
* by the Host. Returned value rely on Input Device configuration:
|
|
* - number of channels
|
|
* - sampling frequency
|
|
* - sample resolution
|
|
* Device configuration is done via DT overlay.
|
|
*
|
|
* @param dev The Input device that is asked for frame size.
|
|
*
|
|
* @warning Do not use with OUT only devices (Headphones).
|
|
* For OUT only devices this function shall return 0.
|
|
*/
|
|
size_t usb_audio_get_in_frame_size(const struct device *dev);
|
|
|
|
/**
|
|
* @brief Register the USB Audio device and make it useable.
|
|
* This must be called in order to make the device work
|
|
* and respond to all relevant requests.
|
|
*
|
|
* @param dev USB Audio device
|
|
* @param ops USB audio callback structure. Callback are used to
|
|
* inform the user about what is happening
|
|
*/
|
|
void usb_audio_register(const struct device *dev,
|
|
const struct usb_audio_ops *ops);
|
|
|
|
/**
|
|
* @brief Send data using USB Audio device
|
|
*
|
|
* @param dev USB Audio device which will send the data
|
|
* over its ISO IN endpoint
|
|
* @param buffer Pointer to the buffer that should be send. User is
|
|
* responsible for managing the buffer for Input devices. In case
|
|
* of sending error user must decide if the buffer should be
|
|
* dropped or retransmitted.
|
|
* Afther the buffer was sent successfully it is passed to the
|
|
* data_written_cb callback if the application uses one or
|
|
* automatically freed otherwse.
|
|
* User must provide proper net_buf chunk especially when
|
|
* it comes to its size. This information can be obtained
|
|
* using usb_audio_get_in_frame_size() API function.
|
|
*
|
|
* @param len Length of the data to be send
|
|
*
|
|
* @return 0 on success, negative error on fail
|
|
*/
|
|
int usb_audio_send(const struct device *dev, struct net_buf *buffer,
|
|
size_t len);
|
|
|
|
#endif /* ZEPHYR_INCLUDE_USB_CLASS_AUDIO_H_ */
|