1/******************************************************************************
2 *
3 *  Copyright 2015 Broadcom Corporation
4 *
5 *  Licensed under the Apache License, Version 2.0 (the "License");
6 *  you may not use this file except in compliance with the License.
7 *  You may obtain a copy of the License at:
8 *
9 *  http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 *
17 ******************************************************************************/
18#ifndef BT_VENDOR_ESCO_PARAMETER_H
19#define BT_VENDOR_ESCO_PARAMETER_H
20
21#include <stdint.h>
22/*******************
23 * SCO Codec Types
24 *******************/
25typedef enum {
26    SCO_CODEC_NONE = 0x0000,
27    SCO_CODEC_CVSD = 0x0001,
28    SCO_CODEC_MSBC = 0x0002,
29} sco_codec_t;
30
31typedef enum {
32    ESCO_CODEC_CVSD = 0,
33    ESCO_CODEC_MSBC_T1,
34    ESCO_CODEC_MSBC_T2,
35} esco_codec_t;
36
37#define ESCO_NUM_CODECS 3
38
39// Coding Formats (BT 4.1 or later Assigned numbers)
40#define ESCO_CODING_FORMAT_ULAW ((uint8_t)0x00)     /* u-Law log    */
41#define ESCO_CODING_FORMAT_ALAW ((uint8_t)0x01)     /* A-Law log    */
42#define ESCO_CODING_FORMAT_CVSD ((uint8_t)0x02)     /* CVSD         */
43#define ESCO_CODING_FORMAT_TRANSPNT ((uint8_t)0x03) /* Transparent  */
44#define ESCO_CODING_FORMAT_LINEAR ((uint8_t)0x04)   /* Linear PCM   */
45#define ESCO_CODING_FORMAT_MSBC ((uint8_t)0x05)     /* MSBC PCM   */
46#define ESCO_CODING_FORMAT_VS ((uint8_t)0xFF)       /* Specifies VSC used */
47
48// PCM Data Formats (BT 4.1 or later Assigned numbers)
49#define ESCO_PCM_DATA_FORMAT_NA ((uint8_t)0x00)                                   /* N/A to coding format in use */
50#define ESCO_PCM_DATA_FORMAT_1_COMP ((uint8_t)0x01) /* 1's complement   */
51#define ESCO_PCM_DATA_FORMAT_2_COMP ((uint8_t)0x02) /* 2's complement   */
52#define ESCO_PCM_DATA_FORMAT_SIGN ((uint8_t)0x03)   /* Sign-magnitude   */
53#define ESCO_PCM_DATA_FORMAT_UNSIGN ((uint8_t)0x04) /* Unsigned         */
54
55// SCO Data Path
56#define ESCO_DATA_PATH_PCM 1                /* 0x01-0xFE (PCM Chan) */
57#define ESCO_DATA_PATH_HCI ((uint8_t)0x00)  /* HCI-0, 0x01-0xFE (PCM Chan) */
58#define ESCO_DATA_PATH_TEST ((uint8_t)0xFF) /* 0xFF-Audio Test */
59
60// eSCO constants
61#define TXRX_64KBITS_RATE 0x00001f40  /* 64 kbits/sec data rate */
62#define TXRX_128KBITS_RATE 0x00003E80 /* 128 kbits/sec data rate */
63
64#define INPUT_OUTPUT_64K_RATE 0x00003E80  /* 16000 Bytes/sec over transport */
65#define INPUT_OUTPUT_128K_RATE 0x00007D00 /* 32000 Bytes/sec over transport */
66
67// Retransmission effort
68#define ESCO_RETRANSMISSION_OFF 0
69#define ESCO_RETRANSMISSION_POWER 1
70#define ESCO_RETRANSMISSION_QUALITY 2
71#define ESCO_RETRANSMISSION_DONTCARE 0xff
72
73// Definitions for eSCO packet type masks (BT1.2 and BT2.0 definitions)
74#define ESCO_PKT_TYPES_MASK_HV1 0x0001
75#define ESCO_PKT_TYPES_MASK_HV2 0x0002
76#define ESCO_PKT_TYPES_MASK_HV3 0x0004
77#define ESCO_PKT_TYPES_MASK_EV3 0x0008
78#define ESCO_PKT_TYPES_MASK_EV4 0x0010
79#define ESCO_PKT_TYPES_MASK_EV5 0x0020
80#define ESCO_PKT_TYPES_MASK_NO_2_EV3 0x0040
81#define ESCO_PKT_TYPES_MASK_NO_3_EV3 0x0080
82#define ESCO_PKT_TYPES_MASK_NO_2_EV5 0x0100
83#define ESCO_PKT_TYPES_MASK_NO_3_EV5 0x0200
84
85// type definition
86typedef struct {
87    uint8_t coding_format;             /* Coding Format */
88    uint16_t company_id;               /* Company ID from BT SIG Assigned Numbers */
89    uint16_t vendor_specific_codec_id; /* Vendor Specific Codec ID */
90} esco_coding_id_format_t;
91
92// Enhanced setup/accept synchronous connection See BT 4.1 or later HCI spec for
93// details
94typedef struct {
95    uint32_t transmit_bandwidth;                    /* Transmit Bandwidth (in octets/second) */
96    uint32_t receive_bandwidth;                     /* RX BW (# of octets/second) */
97    esco_coding_id_format_t transmit_coding_format; /* TX coding format */
98    esco_coding_id_format_t receive_coding_format;  /* RX coding format */
99    uint16_t transmit_codec_frame_size;             /* TX CODEC frame size (OTA frame size) */
100    uint16_t receive_codec_frame_size;              /* RX CODEC frame size (OTA frame size) */
101    uint32_t input_bandwidth;                       /* Input BW (nominal rate octets/sec) */
102    uint32_t output_bandwidth;                      /* Output BW (nominal rate octets/sec) */
103    esco_coding_id_format_t input_coding_format;    /* Input coding format */
104    esco_coding_id_format_t output_coding_format;   /* Output coding format */
105    uint16_t input_coded_data_size;                 /* Input coded data size (in bits) */
106    uint16_t output_coded_data_size;                /* Output coded data size (in bits) */
107    uint8_t input_pcm_data_format;                  /* Input PCM data format (see hcidefs.h) */
108    uint8_t output_pcm_data_format;                 /* Output PCM data format (see hcidefs.h) */
109    uint8_t input_pcm_payload_msb_position;         /* Input PCM sample payload MSB position */
110    uint8_t output_pcm_payload_msb_position;        /* Output PCM sample payload MSB position */
111    uint8_t input_data_path;                        /* 0x00 - HCI, or 0x01-0xFE for VS) */
112    uint8_t output_data_path;                       /* 0x00 - HCI, or 0x01-0xFE for VS) */
113    uint8_t input_transport_unit_size;              /* Input transport unit size */
114    uint8_t output_transport_unit_size;             /* Output transport unit size */
115    uint16_t max_latency_ms;                        /* Maximum latency (0x4-0xFFFE in msecs) */
116    uint16_t packet_types;                          /* Packet Types */
117    uint8_t retransmission_effort;                  /* 0x00-0x02, 0xFF don't care */
118} enh_esco_params_t;
119
120// Get the enhanced eSCO configuration parameters for the provided |codec|
121enh_esco_params_t esco_parameters_for_codec(esco_codec_t codec);
122#endif