| /**************************************************************************** |
| * drivers/virtio/virtio-snd.h |
| * |
| * 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 __DRIVERS_VIRTIO_VIRTIO_SOUND_H |
| #define __DRIVERS_VIRTIO_VIRTIO_SOUND_H |
| |
| /**************************************************************************** |
| * Included Files |
| ****************************************************************************/ |
| |
| #include <nuttx/config.h> |
| #include <stdint.h> |
| |
| #ifdef CONFIG_DRIVERS_VIRTIO_SOUND |
| |
| /**************************************************************************** |
| * Pre-processor Definitions |
| ****************************************************************************/ |
| |
| #define VIRTIO_SND_CHMAP_MAX_SIZE 18 |
| |
| enum |
| { |
| /* Device virtqueue indexes */ |
| |
| VIRTIO_SND_VQ_CONTROL = 0, |
| VIRTIO_SND_VQ_EVENT, |
| VIRTIO_SND_VQ_TX, |
| VIRTIO_SND_VQ_RX, |
| |
| /* Of device virtqueues */ |
| |
| VIRTIO_SND_VQ_MAX |
| }; |
| |
| /* Supported dataflow directions */ |
| |
| enum |
| { |
| VIRTIO_SND_D_OUTPUT = 0, |
| VIRTIO_SND_D_INPUT |
| }; |
| |
| enum |
| { |
| /* Jack control request types */ |
| |
| VIRTIO_SND_R_JACK_INFO = 1, |
| VIRTIO_SND_R_JACK_REMAP, |
| |
| /* Pcm control request types */ |
| |
| VIRTIO_SND_R_PCM_INFO = 0x0100, |
| VIRTIO_SND_R_PCM_SET_PARAMS, |
| VIRTIO_SND_R_PCM_PREPARE, |
| VIRTIO_SND_R_PCM_RELEASE, |
| VIRTIO_SND_R_PCM_START, |
| VIRTIO_SND_R_PCM_STOP, |
| |
| /* Channel map control request types */ |
| |
| VIRTIO_SND_R_CHMAP_INFO = 0x0200, |
| |
| /* Jack event types */ |
| |
| VIRTIO_SND_EVT_JACK_CONNECTED = 0x1000, |
| VIRTIO_SND_EVT_JACK_DISCONNECTED, |
| |
| /* Pcm event types */ |
| |
| VIRTIO_SND_EVT_PCM_PERIOD_ELAPSED = 0x1100, |
| VIRTIO_SND_EVT_PCM_XRUN, |
| |
| /* Common status codes */ |
| |
| VIRTIO_SND_S_OK = 0x8000, |
| VIRTIO_SND_S_BAD_MSG, |
| VIRTIO_SND_S_NOT_SUPP, |
| VIRTIO_SND_S_IO_ERR |
| }; |
| |
| /* Virtio snd configuration */ |
| |
| struct virtio_snd_config |
| { |
| uint32_t jacks; |
| uint32_t streams; |
| uint32_t chmaps; |
| }; |
| |
| /* Common header */ |
| |
| struct virtio_snd_hdr |
| { |
| uint32_t code; |
| }; |
| |
| /* Event notification */ |
| |
| struct virtio_snd_event |
| { |
| struct virtio_snd_hdr hdr; |
| uint32_t data; |
| }; |
| |
| /* Common control request to query an item information */ |
| |
| struct virtio_snd_query_info |
| { |
| struct virtio_snd_hdr hdr; |
| uint32_t start_id; |
| uint32_t count; |
| uint32_t size; |
| }; |
| |
| /* Common item information header */ |
| |
| struct virtio_snd_info |
| { |
| uint32_t hda_fn_nid; |
| }; |
| |
| /* Jack control messages */ |
| |
| struct virtio_snd_jack_hdr |
| { |
| struct virtio_snd_hdr hdr; |
| uint32_t jack_id; |
| }; |
| |
| /* Supported jack features */ |
| |
| enum |
| { |
| VIRTIO_SND_JACK_F_REMAP = 0 |
| }; |
| |
| /* Query jack info,device->driver */ |
| |
| struct virtio_snd_jack_info |
| { |
| struct virtio_snd_info hdr; |
| uint32_t features; |
| uint32_t hda_reg_defconf; |
| uint32_t hda_reg_caps; |
| uint8_t connected; |
| uint8_t padding[7]; |
| }; |
| |
| /* Jack remapping control request */ |
| |
| struct virtio_snd_jack_remap |
| { |
| struct virtio_snd_jack_hdr hdr; |
| uint32_t association; |
| uint32_t sequence; |
| }; |
| |
| /* Pcm control messages */ |
| |
| struct virtio_snd_pcm_hdr |
| { |
| struct virtio_snd_hdr hdr; |
| uint32_t stream_id; |
| }; |
| |
| /* Supported PCM stream features */ |
| |
| enum |
| { |
| VIRTIO_SND_PCM_F_SHMEM_HOST = 0, |
| VIRTIO_SND_PCM_F_SHMEM_GUEST, |
| VIRTIO_SND_PCM_F_MSG_POLLING, |
| VIRTIO_SND_PCM_F_EVT_SHMEM_PERIODS, |
| VIRTIO_SND_PCM_F_EVT_XRUNS |
| }; |
| |
| /* Supported PCM sample formats */ |
| |
| enum |
| { |
| VIRTIO_SND_PCM_FMT_IMA_ADPCM = 0, /* 4 / 4 bits */ |
| VIRTIO_SND_PCM_FMT_MU_LAW, /* 8 / 8 bits */ |
| VIRTIO_SND_PCM_FMT_A_LAW, /* 8 / 8 bits */ |
| VIRTIO_SND_PCM_FMT_S8, /* 8 / 8 bits */ |
| VIRTIO_SND_PCM_FMT_U8, /* 8 / 8 bits */ |
| VIRTIO_SND_PCM_FMT_S16, /* 16 / 16 bits */ |
| VIRTIO_SND_PCM_FMT_U16, /* 16 / 16 bits */ |
| VIRTIO_SND_PCM_FMT_S18_3, /* 18 / 24 bits */ |
| VIRTIO_SND_PCM_FMT_U18_3, /* 18 / 24 bits */ |
| VIRTIO_SND_PCM_FMT_S20_3, /* 20 / 24 bits */ |
| VIRTIO_SND_PCM_FMT_U20_3, /* 20 / 24 bits */ |
| VIRTIO_SND_PCM_FMT_S24_3, /* 24 / 24 bits */ |
| VIRTIO_SND_PCM_FMT_U24_3, /* 24 / 24 bits */ |
| VIRTIO_SND_PCM_FMT_S20, /* 20 / 32 bits */ |
| VIRTIO_SND_PCM_FMT_U20, /* 20 / 32 bits */ |
| VIRTIO_SND_PCM_FMT_S24, /* 24 / 32 bits */ |
| VIRTIO_SND_PCM_FMT_U24, /* 24 / 32 bits */ |
| VIRTIO_SND_PCM_FMT_S32, /* 32 / 32 bits */ |
| VIRTIO_SND_PCM_FMT_U32, /* 32 / 32 bits */ |
| VIRTIO_SND_PCM_FMT_FLOAT, /* 32 / 32 bits */ |
| VIRTIO_SND_PCM_FMT_FLOAT64, /* 64 / 64 bits */ |
| VIRTIO_SND_PCM_FMT_DSD_U8, /* 8 / 8 bits */ |
| VIRTIO_SND_PCM_FMT_DSD_U16, /* 16 / 16 bits */ |
| VIRTIO_SND_PCM_FMT_DSD_U32, /* 32 / 32 bits */ |
| VIRTIO_SND_PCM_FMT_IEC958_SUBFRAME /* 32 / 32 bits */ |
| }; |
| |
| /* Supported PCM frame rates */ |
| |
| enum |
| { |
| VIRTIO_SND_PCM_RATE_5512 = 0, |
| VIRTIO_SND_PCM_RATE_8000, |
| VIRTIO_SND_PCM_RATE_11025, |
| VIRTIO_SND_PCM_RATE_16000, |
| VIRTIO_SND_PCM_RATE_22050, |
| VIRTIO_SND_PCM_RATE_32000, |
| VIRTIO_SND_PCM_RATE_44100, |
| VIRTIO_SND_PCM_RATE_48000, |
| VIRTIO_SND_PCM_RATE_64000, |
| VIRTIO_SND_PCM_RATE_88200, |
| VIRTIO_SND_PCM_RATE_96000, |
| VIRTIO_SND_PCM_RATE_176400, |
| VIRTIO_SND_PCM_RATE_192000, |
| VIRTIO_SND_PCM_RATE_384000 |
| }; |
| |
| /* Query pcm info,device->driver */ |
| |
| struct virtio_snd_pcm_info |
| { |
| struct virtio_snd_info hdr; |
| uint32_t features; |
| uint64_t formats; |
| uint64_t rates; |
| uint8_t direction; |
| uint8_t channels_min; |
| uint8_t channels_max; |
| uint8_t padding[5]; |
| }; |
| |
| /* Set pcm stream format */ |
| |
| struct virtio_snd_pcm_set_params |
| { |
| struct virtio_snd_pcm_hdr hdr; |
| uint32_t buffer_bytes; |
| uint32_t period_bytes; |
| uint32_t features; |
| uint8_t channels; |
| uint8_t format; |
| uint8_t rate; |
| uint8_t padding; |
| }; |
| |
| /* I/O request header */ |
| |
| struct virtio_snd_pcm_xfer |
| { |
| uint32_t stream_id; |
| }; |
| |
| /* I/O request status */ |
| |
| struct virtio_snd_pcm_status |
| { |
| uint32_t status; |
| uint32_t latency_bytes; |
| }; |
| |
| /* Standard channel position definition */ |
| |
| enum |
| { |
| VIRTIO_SND_CHMAP_NONE = 0, /* Undefined */ |
| VIRTIO_SND_CHMAP_NA, /* Silent */ |
| VIRTIO_SND_CHMAP_MONO, /* Mono stream */ |
| VIRTIO_SND_CHMAP_FL, /* Front left */ |
| VIRTIO_SND_CHMAP_FR, /* Front right */ |
| VIRTIO_SND_CHMAP_RL, /* Rear left */ |
| VIRTIO_SND_CHMAP_RR, /* Rear right */ |
| VIRTIO_SND_CHMAP_FC, /* Front center */ |
| VIRTIO_SND_CHMAP_LFE, /* Low frequency (LFE) */ |
| VIRTIO_SND_CHMAP_SL, /* Side left */ |
| VIRTIO_SND_CHMAP_SR, /* Side right */ |
| VIRTIO_SND_CHMAP_RC, /* Rear center */ |
| VIRTIO_SND_CHMAP_FLC, /* Front left center */ |
| VIRTIO_SND_CHMAP_FRC, /* Front right center */ |
| VIRTIO_SND_CHMAP_RLC, /* Rear left center */ |
| VIRTIO_SND_CHMAP_RRC, /* Rear right center */ |
| VIRTIO_SND_CHMAP_FLW, /* Front left wide */ |
| VIRTIO_SND_CHMAP_FRW, /* Front right wide */ |
| VIRTIO_SND_CHMAP_FLH, /* Front left high */ |
| VIRTIO_SND_CHMAP_FCH, /* Front center high */ |
| VIRTIO_SND_CHMAP_FRH, /* Front right high */ |
| VIRTIO_SND_CHMAP_TC, /* Top center */ |
| VIRTIO_SND_CHMAP_TFL, /* Top front left */ |
| VIRTIO_SND_CHMAP_TFR, /* Top front right */ |
| VIRTIO_SND_CHMAP_TFC, /* Top front center */ |
| VIRTIO_SND_CHMAP_TRL, /* Top rear left */ |
| VIRTIO_SND_CHMAP_TRR, /* Top rear right */ |
| VIRTIO_SND_CHMAP_TRC, /* Top rear center */ |
| VIRTIO_SND_CHMAP_TFLC, /* Top front left center */ |
| VIRTIO_SND_CHMAP_TFRC, /* Top front right center */ |
| VIRTIO_SND_CHMAP_TSL, /* Top side left */ |
| VIRTIO_SND_CHMAP_TSR, /* Top side right */ |
| VIRTIO_SND_CHMAP_LLFE, /* Left LFE */ |
| VIRTIO_SND_CHMAP_RLFE, /* Right LFE */ |
| VIRTIO_SND_CHMAP_BC, /* Bottom center */ |
| VIRTIO_SND_CHMAP_BLC, /* Bottom left center */ |
| VIRTIO_SND_CHMAP_BRC /* Bottom right center */ |
| }; |
| |
| /* Query channel map info,device->driver */ |
| |
| struct virtio_snd_chmap_info |
| { |
| struct virtio_snd_info hdr; |
| uint8_t direction; |
| uint8_t channels; |
| uint8_t positions[VIRTIO_SND_CHMAP_MAX_SIZE]; |
| }; |
| |
| /**************************************************************************** |
| * Public Data |
| ****************************************************************************/ |
| |
| #ifdef __cplusplus |
| #define EXTERN extern "C" |
| extern "C" |
| { |
| #else |
| #define EXTERN extern |
| #endif |
| |
| int virtio_register_snd_driver(void); |
| |
| #undef EXTERN |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* CONFIG_DRIVERS_VIRTIO_SOUND */ |
| #endif /* __DRIVERS_VIRTIO_VIRTIO_SOUND_H */ |