1 /** @file
2  *  @brief Internal APIs for Bluetooth Handsfree profile handling.
3  */
4 
5 /*
6  * Copyright (c) 2015-2016 Intel Corporation
7  *
8  * SPDX-License-Identifier: Apache-2.0
9  */
10 
11 #include "hfp_internal.h"
12 
13 #if defined(CONFIG_BT_HFP_HF_CLI)
14 #define BT_HFP_HF_FEATURE_CLI_ENABLE BT_HFP_HF_FEATURE_CLI
15 #define BT_HFP_HF_SDP_FEATURE_CLI_ENABLE BT_HFP_HF_SDP_FEATURE_CLI
16 #else
17 #define BT_HFP_HF_FEATURE_CLI_ENABLE 0
18 #define BT_HFP_HF_SDP_FEATURE_CLI_ENABLE 0
19 #endif /* CONFIG_BT_HFP_HF_CLI */
20 
21 #if defined(CONFIG_BT_HFP_HF_VOLUME)
22 #define BT_HFP_HF_FEATURE_VOLUME_ENABLE BT_HFP_HF_FEATURE_VOLUME
23 #define BT_HFP_HF_SDP_FEATURE_VOLUME_ENABLE BT_HFP_HF_SDP_FEATURE_VOLUME
24 #else
25 #define BT_HFP_HF_FEATURE_VOLUME_ENABLE 0
26 #define BT_HFP_HF_SDP_FEATURE_VOLUME_ENABLE 0
27 #endif /* CONFIG_BT_HFP_HF_VOLUME */
28 
29 #if defined(CONFIG_BT_HFP_HF_CODEC_NEG)
30 #define BT_HFP_HF_CODEC_NEG_ENABLE BT_HFP_HF_FEATURE_CODEC_NEG
31 #else
32 #define BT_HFP_HF_CODEC_NEG_ENABLE 0
33 #endif /* CONFIG_BT_HFP_HF_CODEC_NEG */
34 
35 #if defined(CONFIG_BT_HFP_HF_ECNR)
36 #define BT_HFP_HF_FEATURE_ECNR_ENABLE BT_HFP_HF_FEATURE_ECNR
37 #define BT_HFP_HF_SDP_FEATURE_ECNR_ENABLE BT_HFP_HF_SDP_FEATURE_ECNR
38 #else
39 #define BT_HFP_HF_FEATURE_ECNR_ENABLE 0
40 #define BT_HFP_HF_SDP_FEATURE_ECNR_ENABLE 0
41 #endif /* CONFIG_BT_HFP_HF_CODEC_NEG */
42 
43 #if defined(CONFIG_BT_HFP_HF_3WAY_CALL)
44 #define BT_HFP_HF_FEATURE_3WAY_CALL_ENABLE BT_HFP_HF_FEATURE_3WAY_CALL
45 #define BT_HFP_HF_SDP_FEATURE_3WAY_CALL_ENABLE BT_HFP_HF_SDP_FEATURE_3WAY_CALL
46 #else
47 #define BT_HFP_HF_FEATURE_3WAY_CALL_ENABLE 0
48 #define BT_HFP_HF_SDP_FEATURE_3WAY_CALL_ENABLE 0
49 #endif /* CONFIG_BT_HFP_HF_3WAY_CALL */
50 
51 #if defined(CONFIG_BT_HFP_HF_ECS)
52 #define BT_HFP_HF_FEATURE_ECS_ENABLE BT_HFP_HF_FEATURE_ECS
53 #else
54 #define BT_HFP_HF_FEATURE_ECS_ENABLE 0
55 #endif /* CONFIG_BT_HFP_HF_ECS */
56 
57 #if defined(CONFIG_BT_HFP_HF_ECC)
58 #define BT_HFP_HF_FEATURE_ECC_ENABLE BT_HFP_HF_FEATURE_ECC
59 #else
60 #define BT_HFP_HF_FEATURE_ECC_ENABLE 0
61 #endif /* CONFIG_BT_HFP_HF_ECC */
62 
63 #if defined(CONFIG_BT_HFP_HF_VOICE_RECG)
64 #define BT_HFP_HF_FEATURE_VOICE_RECG_ENABLE BT_HFP_HF_FEATURE_VOICE_RECG
65 #define BT_HFP_HF_SDP_FEATURE_VOICE_RECG_ENABLE BT_HFP_HF_SDP_FEATURE_VOICE_RECG
66 #else
67 #define BT_HFP_HF_FEATURE_VOICE_RECG_ENABLE 0
68 #define BT_HFP_HF_SDP_FEATURE_VOICE_RECG_ENABLE 0
69 #endif /* CONFIG_BT_HFP_HF_VOICE_RECG */
70 
71 #if defined(CONFIG_BT_HFP_HF_ENH_VOICE_RECG)
72 #define BT_HFP_HF_FEATURE_ENH_VOICE_RECG_ENABLE BT_HFP_HF_FEATURE_ENH_VOICE_RECG
73 #define BT_HFP_HF_SDP_FEATURE_ENH_VOICE_RECG_ENABLE BT_HFP_HF_SDP_FEATURE_ENH_VOICE_RECG
74 #else
75 #define BT_HFP_HF_FEATURE_ENH_VOICE_RECG_ENABLE 0
76 #define BT_HFP_HF_SDP_FEATURE_ENH_VOICE_RECG_ENABLE 0
77 #endif /* CONFIG_BT_HFP_HF_ENH_VOICE_RECG */
78 
79 #if defined(CONFIG_BT_HFP_HF_VOICE_RECG_TEXT)
80 #define BT_HFP_HF_FEATURE_VOICE_RECG_TEXT_ENABLE BT_HFP_HF_FEATURE_VOICE_RECG_TEXT
81 #define BT_HFP_HF_SDP_FEATURE_VOICE_RECG_TEXT_ENABLE BT_HFP_HF_SDP_FEATURE_VOICE_RECG_TEXT
82 #else
83 #define BT_HFP_HF_FEATURE_VOICE_RECG_TEXT_ENABLE 0
84 #define BT_HFP_HF_SDP_FEATURE_VOICE_RECG_TEXT_ENABLE 0
85 #endif /* CONFIG_BT_HFP_HF_VOICE_RECG_TEXT */
86 
87 #if defined(CONFIG_BT_HFP_HF_HF_INDICATORS)
88 #define BT_HFP_HF_FEATURE_HF_IND_ENABLE BT_HFP_HF_FEATURE_HF_IND
89 #else
90 #define BT_HFP_HF_FEATURE_HF_IND_ENABLE 0
91 #endif /* CONFIG_BT_HFP_HF_HF_INDICATORS */
92 
93 /* HFP HF Supported features */
94 #define BT_HFP_HF_SUPPORTED_FEATURES (\
95 	BT_HFP_HF_FEATURE_CLI_ENABLE | \
96 	BT_HFP_HF_SDP_FEATURE_VOLUME_ENABLE |\
97 	BT_HFP_HF_CODEC_NEG_ENABLE | \
98 	BT_HFP_HF_FEATURE_ECNR_ENABLE | \
99 	BT_HFP_HF_FEATURE_3WAY_CALL_ENABLE | \
100 	BT_HFP_HF_FEATURE_ECS_ENABLE | \
101 	BT_HFP_HF_FEATURE_ECC_ENABLE | \
102 	BT_HFP_HF_FEATURE_VOICE_RECG_ENABLE | \
103 	BT_HFP_HF_FEATURE_ENH_VOICE_RECG_ENABLE | \
104 	BT_HFP_HF_FEATURE_VOICE_RECG_TEXT_ENABLE | \
105 	BT_HFP_HF_FEATURE_HF_IND_ENABLE)
106 
107 /* HFP HF Supported features in SDP */
108 #define BT_HFP_HF_SDP_SUPPORTED_FEATURES (\
109 	BT_HFP_HF_SDP_FEATURE_CLI_ENABLE | \
110 	BT_HFP_HF_SDP_FEATURE_VOLUME_ENABLE | \
111 	BT_HFP_HF_SDP_FEATURE_ECNR_ENABLE | \
112 	BT_HFP_HF_SDP_FEATURE_3WAY_CALL_ENABLE | \
113 	BT_HFP_HF_SDP_FEATURE_VOICE_RECG_ENABLE | \
114 	BT_HFP_HF_SDP_FEATURE_ENH_VOICE_RECG_ENABLE | \
115 	BT_HFP_HF_SDP_FEATURE_VOICE_RECG_TEXT_ENABLE)
116 
117 #define BT_HFP_HF_CODEC_CVSD_MASK BIT(BT_HFP_HF_CODEC_CVSD)
118 
119 #if defined(CONFIG_BT_HFP_HF_CODEC_MSBC)
120 #define BT_HFP_HF_CODEC_MSBC_ENABLE BIT(BT_HFP_HF_CODEC_MSBC)
121 #else
122 #define BT_HFP_HF_CODEC_MSBC_ENABLE 0
123 #endif /* CONFIG_BT_HFP_HF_CODEC_MSBC */
124 
125 #if defined(CONFIG_BT_HFP_HF_CODEC_LC3_SWB)
126 #define BT_HFP_HF_CODEC_LC3_SWB_ENABLE BIT(BT_HFP_HF_CODEC_LC3_SWB)
127 #else
128 #define BT_HFP_HF_CODEC_LC3_SWB_ENABLE 0
129 #endif /* CONFIG_BT_HFP_HF_CODEC_LC3_SWB */
130 
131 /* HFP HF Supported Codec IDs*/
132 #define BT_HFP_HF_SUPPORTED_CODEC_IDS \
133 	BT_HFP_HF_CODEC_CVSD_MASK | \
134 	BT_HFP_HF_CODEC_MSBC_ENABLE | \
135 	BT_HFP_HF_CODEC_LC3_SWB_ENABLE
136 
137 /* bt_hfp_hf flags: the flags defined here represent hfp hf parameters */
138 enum {
139 	BT_HFP_HF_FLAG_CONNECTED,     /* HFP HF SLC Established */
140 	BT_HFP_HF_FLAG_TX_ONGOING,    /* HFP HF TX is ongoing */
141 	BT_HFP_HF_FLAG_RX_ONGOING,    /* HFP HF RX is ongoing */
142 	BT_HFP_HF_FLAG_CODEC_CONN,    /* HFP HF codec connection setup */
143 	BT_HFP_HF_FLAG_CLCC_PENDING,  /* HFP HF CLCC is pending */
144 	BT_HFP_HF_FLAG_VRE_ACTIVATE,  /* VRE is activated */
145 	BT_HFP_HF_FLAG_BINP,          /* +BINP result code is received */
146 	/* Total number of flags - must be at the end of the enum */
147 	BT_HFP_HF_NUM_FLAGS,
148 };
149 
150 /* bt_hfp_hf_call flags: the flags defined here represent hfp hf call parameters */
151 enum {
152 	BT_HFP_HF_CALL_IN_USING,      /* Object is in using */
153 	BT_HFP_HF_CALL_CLCC,          /* CLCC report received */
154 	BT_HFP_HF_CALL_INCOMING,      /* Incoming call */
155 	BT_HFP_HF_CALL_INCOMING_HELD, /* Incoming call held */
156 	BT_HFP_HF_CALL_OUTGOING_3WAY, /* Outgoing 3 way call */
157 	BT_HFP_HF_CALL_INCOMING_3WAY, /* Incoming 3 way call */
158 
159 	/* Total number of flags - must be at the end of the enum */
160 	BT_HFP_HF_CALL_NUM_FLAGS,
161 };
162 
163 /* bt_hfp_hf_call state: the flags defined here represent hfp hf call state parameters */
164 enum {
165 	/* Call state flags */
166 	BT_HFP_HF_CALL_STATE_TERMINATE, /* Call terminate */
167 	BT_HFP_HF_CALL_STATE_OUTGOING,  /* Call outgoing */
168 	BT_HFP_HF_CALL_STATE_INCOMING,  /* Call incoming */
169 	BT_HFP_HF_CALL_STATE_ALERTING,  /* Call alerting */
170 	BT_HFP_HF_CALL_STATE_WAITING,   /* Call waiting */
171 	BT_HFP_HF_CALL_STATE_ACTIVE,    /* Call active */
172 	BT_HFP_HF_CALL_STATE_HELD,      /* Call held */
173 
174 	/* Total number of flags - must be at the end of the enum */
175 	BT_HFP_HF_CALL_STATE_NUM_FLAGS,
176 };
177 
178 struct bt_hfp_hf_call {
179 	struct bt_hfp_hf *hf;
180 	uint8_t index;
181 
182 	ATOMIC_DEFINE(flags, BT_HFP_HF_CALL_NUM_FLAGS);
183 	ATOMIC_DEFINE(state, BT_HFP_HF_CALL_STATE_NUM_FLAGS);
184 };
185 
186 struct bt_hfp_hf {
187 	struct bt_rfcomm_dlc rfcomm_dlc;
188 	/* ACL connection handle */
189 	struct bt_conn *acl;
190 	/* AT command sending queue */
191 	at_finish_cb_t backup_finish;
192 	struct k_fifo tx_pending;
193 	/* SCO Channel */
194 	struct bt_sco_chan chan;
195 	char hf_buffer[HF_MAX_BUF_LEN];
196 	struct at_client at;
197 	uint32_t hf_features;
198 	uint32_t ag_features;
199 	uint8_t hf_codec_ids;
200 	uint8_t vgm;
201 	uint8_t vgs;
202 	int8_t ind_table[HF_MAX_AG_INDICATORS];
203 
204 	uint32_t hf_ind;
205 	uint32_t ag_ind;
206 	uint32_t ind_enable;
207 
208 	/* AT command initialization indicator */
209 	uint8_t cmd_init_seq;
210 
211 	/* The features supported by AT+CHLD */
212 	uint32_t chld_features;
213 
214 	/* Worker for pending TX */
215 	struct k_work work;
216 
217 	struct k_work_delayable deferred_work;
218 
219 	/* calls */
220 	struct bt_hfp_hf_call calls[CONFIG_BT_HFP_HF_MAX_CALLS];
221 
222 	ATOMIC_DEFINE(flags, BT_HFP_HF_NUM_FLAGS);
223 };
224