Home | History | Annotate | Download | only in include
      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 
     19 #pragma once
     20 
     21 #include <stdint.h>
     22 
     23 /*******************
     24  * SCO Codec Types
     25  *******************/
     26 typedef enum {
     27   SCO_CODEC_NONE = 0x0000,
     28   SCO_CODEC_CVSD = 0x0001,
     29   SCO_CODEC_MSBC = 0x0002,
     30 } sco_codec_t;
     31 
     32 typedef enum {
     33   ESCO_CODEC_CVSD = 0,
     34   ESCO_CODEC_MSBC_T1,
     35   ESCO_CODEC_MSBC_T2,
     36 } esco_codec_t;
     37 
     38 #define ESCO_NUM_CODECS 3
     39 
     40 // Coding Formats (BT 4.1 or later Assigned numbers)
     41 #define ESCO_CODING_FORMAT_ULAW ((uint8_t)0x00)     /* u-Law log    */
     42 #define ESCO_CODING_FORMAT_ALAW ((uint8_t)0x01)     /* A-Law log    */
     43 #define ESCO_CODING_FORMAT_CVSD ((uint8_t)0x02)     /* CVSD         */
     44 #define ESCO_CODING_FORMAT_TRANSPNT ((uint8_t)0x03) /* Transparent  */
     45 #define ESCO_CODING_FORMAT_LINEAR ((uint8_t)0x04)   /* Linear PCM   */
     46 #define ESCO_CODING_FORMAT_MSBC ((uint8_t)0x05)     /* MSBC PCM   */
     47 #define ESCO_CODING_FORMAT_VS ((uint8_t)0xFF)       /* Specifies VSC used */
     48 typedef uint8_t esco_coding_format_t;
     49 
     50 // PCM Data Formats (BT 4.1 or later Assigned numbers)
     51 #define ESCO_PCM_DATA_FORMAT_NA \
     52   ((uint8_t)0x00) /* N/A to coding format in use */
     53 #define ESCO_PCM_DATA_FORMAT_1_COMP ((uint8_t)0x01) /* 1's complement   */
     54 #define ESCO_PCM_DATA_FORMAT_2_COMP ((uint8_t)0x02) /* 2's complement   */
     55 #define ESCO_PCM_DATA_FORMAT_SIGN ((uint8_t)0x03)   /* Sign-magnitude   */
     56 #define ESCO_PCM_DATA_FORMAT_UNSIGN ((uint8_t)0x04) /* Unsigned         */
     57 typedef uint8_t esco_pcm_data_format_t;
     58 
     59 // SCO Data Path
     60 #define ESCO_DATA_PATH_PCM 1                /* 0x01-0xFE (PCM Chan) */
     61 #define ESCO_DATA_PATH_HCI ((uint8_t)0x00)  /* HCI-0, 0x01-0xFE (PCM Chan) */
     62 #define ESCO_DATA_PATH_TEST ((uint8_t)0xFF) /* 0xFF-Audio Test */
     63 typedef uint8_t esco_data_path_t;
     64 
     65 // eSCO constants
     66 #define TXRX_64KBITS_RATE 0x00001f40  /* 64 kbits/sec data rate */
     67 #define TXRX_128KBITS_RATE 0x00003E80 /* 128 kbits/sec data rate */
     68 typedef uint32_t esco_txrx_bandwidth_t;
     69 
     70 #define INPUT_OUTPUT_64K_RATE 0x00003E80  /* 16000 Bytes/sec over transport */
     71 #define INPUT_OUTPUT_128K_RATE 0x00007D00 /* 32000 Bytes/sec over transport */
     72 typedef uint32_t esco_io_bandwidth_t;
     73 
     74 // Retransmission effort
     75 #define ESCO_RETRANSMISSION_OFF 0
     76 #define ESCO_RETRANSMISSION_POWER 1
     77 #define ESCO_RETRANSMISSION_QUALITY 2
     78 #define ESCO_RETRANSMISSION_DONTCARE 0xff
     79 typedef uint8_t esco_retransmission_effort_t;
     80 
     81 // Definitions for eSCO packet type masks (BT1.2 and BT2.0 definitions)
     82 #define ESCO_PKT_TYPES_MASK_HV1 0x0001
     83 #define ESCO_PKT_TYPES_MASK_HV2 0x0002
     84 #define ESCO_PKT_TYPES_MASK_HV3 0x0004
     85 #define ESCO_PKT_TYPES_MASK_EV3 0x0008
     86 #define ESCO_PKT_TYPES_MASK_EV4 0x0010
     87 #define ESCO_PKT_TYPES_MASK_EV5 0x0020
     88 #define ESCO_PKT_TYPES_MASK_NO_2_EV3 0x0040
     89 #define ESCO_PKT_TYPES_MASK_NO_3_EV3 0x0080
     90 #define ESCO_PKT_TYPES_MASK_NO_2_EV5 0x0100
     91 #define ESCO_PKT_TYPES_MASK_NO_3_EV5 0x0200
     92 typedef uint16_t esco_packet_types_t;
     93 
     94 // type definition
     95 typedef struct {
     96   esco_coding_format_t coding_format; /* Coding Format*/
     97   uint16_t company_id; /* Company ID from BT SIG Assigned Numbers */
     98   uint16_t vendor_specific_codec_id; /* Vendor Specific Codec ID */
     99 } esco_coding_id_format_t;
    100 
    101 // Enhanced setup/accept synchronous connection See BT 4.1 or later HCI spec for
    102 // details
    103 typedef struct {
    104   esco_txrx_bandwidth_t
    105       transmit_bandwidth; /* Transmit Bandwidth (in octets/second) */
    106   esco_txrx_bandwidth_t receive_bandwidth; /* RX BW (# of octets/second) */
    107   esco_coding_id_format_t transmit_coding_format; /* TX coding format */
    108   esco_coding_id_format_t receive_coding_format;  /* RX coding format */
    109   uint16_t transmit_codec_frame_size; /* TX CODEC frame size (OTA frame size) */
    110   uint16_t receive_codec_frame_size;  /* RX CODEC frame size (OTA frame size) */
    111   esco_io_bandwidth_t input_bandwidth; /* Input BW (nominal rate octets/sec) */
    112   esco_io_bandwidth_t
    113       output_bandwidth; /* Output BW (nominal rate octets/sec) */
    114   esco_coding_id_format_t input_coding_format;  /* Input coding format */
    115   esco_coding_id_format_t output_coding_format; /* Output coding format */
    116   uint16_t input_coded_data_size;  /* Input coded data size (in bits) */
    117   uint16_t output_coded_data_size; /* Output coded data size (in bits) */
    118   esco_pcm_data_format_t
    119       input_pcm_data_format; /* Input PCM data format (see hcidefs.h) */
    120   esco_pcm_data_format_t
    121       output_pcm_data_format; /* Output PCM data format (see hcidefs.h) */
    122   uint8_t input_pcm_payload_msb_position;  /* Input PCM sample payload MSB
    123                                               position */
    124   uint8_t output_pcm_payload_msb_position; /* Output PCM sample payload MSB
    125                                               position */
    126   esco_data_path_t input_data_path;   /* 0x00 - HCI, or 0x01-0xFE for VS) */
    127   esco_data_path_t output_data_path;  /* 0x00 - HCI, or 0x01-0xFE for VS) */
    128   uint8_t input_transport_unit_size;  /* Input transport unit size */
    129   uint8_t output_transport_unit_size; /* Output transport unit size */
    130   uint16_t max_latency_ms;          /* Maximum latency (0x4-0xFFFE in msecs) */
    131   esco_packet_types_t packet_types; /* Packet Types */
    132   esco_retransmission_effort_t
    133       retransmission_effort; /* 0x00-0x02, 0xFF don't care */
    134 } enh_esco_params_t;
    135 
    136 // Get the enhanced eSCO configuration parameters for the provided |codec|
    137 enh_esco_params_t esco_parameters_for_codec(esco_codec_t codec);
    138