comparison src/aci2/aci/ati_src_bt.c @ 3:93999a60b835

src/aci2, src/condat2: import of g23m/condat source pieces from TCS211
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 26 Sep 2016 00:29:36 +0000
parents
children
comparison
equal deleted inserted replaced
2:c41a534f33c6 3:93999a60b835
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : BLUETOOTH
4 | Modul : ATI_SRC_BT_C
5 +-----------------------------------------------------------------------------
6 | Copyright 2002 Texas Instruments Berlin, AG
7 | All rights reserved.
8 |
9 | This file is confidential and a trade secret of Texas
10 | Instruments Berlin, AG
11 | The receipt of or possession of this file does not convey
12 | any rights to reproduce or disclose its contents or to
13 | manufacture, use, or sell anything it may describe, in
14 | whole, or in part, without the specific written consent of
15 | Texas Instruments Berlin, AG.
16 +-----------------------------------------------------------------------------
17 | Purpose : .
18 +-----------------------------------------------------------------------------
19 */
20
21 #ifndef ATI_SRC_BT_C
22 #define ATI_SRC_BT_C
23 #endif
24
25 #include "aci_all.h"
26
27 /*==== INCLUDES ===================================================*/
28 #include "aci_cmh.h"
29 #include "ati_cmd.h"
30 #include "aci_cmd.h"
31
32 #include "aci_lst.h"
33 #include "dti.h"
34 #include "dti_conn_mng.h"
35 #include "psa_uart.h"
36 #include "ati_io.h"
37 #include "cmh_uart.h"
38 #include "aci_io.h"
39 #include "aci_mem.h"
40
41 #if defined (BT_ADAPTER)
42 #include "bti_aci.h"
43 #include "bti_int.h"
44 #endif
45
46
47 #include "ati_src_bt.h"
48
49 /*==== CONSTANTS ==================================================*/
50 /*#ifdef GPRS
51 #define MAX_LARGE_BUFFER_LEN (600)
52 #define MAX_BUFFER_COUNT (15)
53 #else
54 #define MAX_LARGE_BUFFER_LEN (400)
55 #ifdef FAX_AND_DATA
56 #define MAX_BUFFER_COUNT (27)
57 #else
58 #define MAX_BUFFER_COUNT (7)
59 #endif
60 #endif
61 */
62 /*==== TYPES ======================================================*/
63
64 /*==== EXPORT =====================================================*/
65
66 /*==== VARIABLES ==================================================*/
67
68 /*==== FUNCTIONS ==================================================*/
69
70 T_BTI_AT_RING_TYPE get_bti_ring_type(T_ACI_CRING_TYP t);
71 T_BTI_AT_DCE_SIGNAL get_bti_ring_state(T_IO_DCD_STAT s);
72 T_BTI_AT_DCE_SIGNAL get_bti_dcd_state(T_IO_DCD_STAT s);
73
74 /*
75 +--------------------------------------------------------------------+
76 | PROJECT : BLUETOOTH 8445 MODULE : ACI_URT |
77 | STATE : code ROUTINE : io_openPort |
78 +--------------------------------------------------------------------+
79
80 PURPOSE: opens an external port
81
82 */
83 GLOBAL T_BTI_ACK io_openPort (T_BTI_PORT_NB port)
84 {
85 TRACE_EVENT("io_openPort()");
86
87 if ((port >= MAX_PORTS) || (port < 0)) /* if requested port number is higher than available ports (including 0) -> fail*/
88 return BTI_NAK;
89
90 if (bti_port_table[port].aci_src_id != 0) /* port already used */
91 return BTI_NAK;
92
93 bti_port_table[port].aci_src_id = ati_init(ATI_SRC_TYPE_BLUETOOTH, bt_src_result_cb, bt_src_line_state_cb);
94
95 TRACE_EVENT_P2("port %d aci_src_id %d", port, bti_port_table[port].aci_src_id);
96
97 if (bti_port_table[port].aci_src_id == 0) /* failed to get aci src id */
98 return BTI_NAK;
99
100 dti_mng_new (bti_port_table[port].aci_src_id, bti_port_table[port].aci_src_id,
101 bt_src_dti_cb, TRUE, DTI_MNG_DEVICE_TYPE_BT, DTI_MNG_DATA_TYPE_CMD);
102
103 bti_port_table[port].dti_data_ind_BTI = NULL;
104 bti_port_table[port].data_offset = 0;
105 bti_port_table[port].data_left = 0;
106 bti_port_table[port].bti_gsm_port_info.optimal_gsm_max_packet_size = 0;
107 bti_port_table[port].bti_bt_port_info.optimal_bt_max_packet_size = 0;
108 bti_port_table[port].atqueue = NULL;
109 bti_port_table[port].large_at_output = FALSE;
110 bti_port_table[port].at_flow_on = TRUE;
111
112 return BTI_ACK;
113 }
114
115 /*
116 +--------------------------------------------------------------------+
117 | PROJECT : BLUETOOTH 8445 MODULE : ACI_URT |
118 | STATE : code ROUTINE : io_closePort |
119 +--------------------------------------------------------------------+
120
121 PURPOSE: closes an external port
122
123 */
124 GLOBAL void io_closePort (T_BTI_PORT_NB port)
125 {
126 TRACE_EVENT("io_closePort()");
127 ati_finit(bti_port_table[port].aci_src_id);
128
129 bti_port_table[port].aci_src_id = 0;
130 bti_port_table[port].dti_data_ind_BTI = NULL;
131 bti_port_table[port].data_offset = 0;
132 bti_port_table[port].data_left = 0;
133 bti_port_table[port].bti_gsm_port_info.optimal_gsm_max_packet_size = 0;
134 bti_port_table[port].bti_bt_port_info.optimal_bt_max_packet_size = 0;
135 bti_port_table[port].atqueue = NULL;
136 bti_port_table[port].large_at_output = FALSE;
137 bti_port_table[port].at_flow_on = TRUE;
138 }
139
140
141
142 /*
143 +--------------------------------------------------------------------+
144 | PROJECT : BLUETOOTH 8445 MODULE : ACI_URT |
145 | STATE : code ROUTINE : get_bti_ring_type |
146 +--------------------------------------------------------------------+
147
148 PURPOSE: converting ACI type to BTI type
149 */
150 T_BTI_AT_RING_TYPE get_bti_ring_type(T_ACI_CRING_TYP t)
151 {
152 switch (t)
153 {
154 case CRING_TYP_NotPresent:
155 return BTI_AT_RING_NotPresent;
156 case CRING_TYP_Async:
157 return BTI_AT_RING_Async;
158 case CRING_TYP_Sync:
159 return BTI_AT_RING_Sync;
160 case CRING_TYP_RelAsync:
161 return BTI_AT_RING_RelAsync;
162 case CRING_TYP_RelSync:
163 return BTI_AT_RING_RelSync;
164 case CRING_TYP_Fax:
165 return BTI_AT_RING_Fax;
166 case CRING_TYP_Voice:
167 return BTI_AT_RING_Voice;
168 case CRING_TYP_AuxVoice:
169 return BTI_AT_RING_AuxVoice;
170 #ifdef GPRS
171 case CRING_TYP_GPRS:
172 return BTI_AT_RING_GPRS;
173 #endif /* GPRS */
174
175 }
176 return BTI_AT_RING_NotPresent;
177 }
178
179 /*
180 +--------------------------------------------------------------------+
181 | PROJECT : BLUETOOTH 8445 MODULE : ACI_URT |
182 | STATE : code ROUTINE : get_bti_ring_state |
183 +--------------------------------------------------------------------+
184
185 PURPOSE: converting ACI type to BTI type
186 */
187 T_BTI_AT_DCE_SIGNAL get_bti_ring_state(T_IO_RING_STAT s)
188 {
189 switch (s)
190 {
191 case IO_RING_OFF:
192 TRACE_EVENT ("V.24 RING OFF");
193 return BTI_AT_RING_OFF;
194
195 case IO_RING_ON:
196 TRACE_EVENT ("V.24 RING ON");
197 return BTI_AT_RING_ON;
198 }
199 }
200
201 /*
202 +--------------------------------------------------------------------+
203 | PROJECT : BLUETOOTH 8445 MODULE : ACI_URT |
204 | STATE : code ROUTINE : get_bti_dcd_state |
205 +--------------------------------------------------------------------+
206
207 PURPOSE: converting ACI type to BTI type
208 */
209 T_BTI_AT_DCE_SIGNAL get_bti_dcd_state(T_IO_DCD_STAT s)
210 {
211 switch (s)
212 {
213 case IO_DCD_OFF:
214 TRACE_EVENT ("V.24 DCD OFF");
215 return BTI_AT_DCD_OFF;
216
217 case IO_DCD_ON:
218 TRACE_EVENT ("V.24 DCD ON");
219 return BTI_AT_DCD_ON;
220 }
221 }
222
223 /*
224 +--------------------------------------------------------------------+
225 | PROJECT : BLUETOOTH 8445 MODULE : ACI_URT |
226 | STATE : code ROUTINE : ati_src_bt_proc_cmd|
227 +--------------------------------------------------------------------+
228
229 PURPOSE:
230
231 */
232
233 GLOBAL BOOL ati_src_bt_proc_cmd (T_ACI_CMD_REQ_BT *cmd)
234 {
235 TRACE_FUNCTION ("ati_src_bt_proc_cmd ()");
236 return (ati_execute (cmd->src_id, cmd->cmd_seq, cmd->cmd_len));
237 }
238
239 /*
240 +-------------------------------------------------------------------+
241 | PROJECT : BLUETOOTH 8445 MODULE : PSA_UART |
242 | ROUTINE : bt_src_connect |
243 +-------------------------------------------------------------------+
244
245 PURPOSE :
246
247 */
248 GLOBAL T_ACI_RETURN bt_src_connect (UBYTE srcId, T_DTI_ENTITY_ID unit)
249 {
250 T_BTI_PORT_NB port_nb;
251
252 TRACE_EVENT("bt_src_connect()");
253
254 port_nb = get_port_by_srcID(srcId);
255
256 TRACE_EVENT_P3("port %d src_id %d unit %d", port_nb, bti_port_table[port_nb].aci_src_id, unit);
257
258 dti_entity_connected(srcId, CONNECTED, UNIT_BLUETOOTH);
259
260 return AT_CMPL;
261 }
262
263 /*
264 +-------------------------------------------------------------------+
265 | PROJECT : BLUETOOTH 8445 MODULE : PSA_UART |
266 | ROUTINE : bt_src_disconnect |
267 +-------------------------------------------------------------------+
268
269 PURPOSE :
270
271 */
272 GLOBAL T_ACI_RETURN bt_src_disconnect (UBYTE srcId)
273 {
274 T_BTI_PORT_NB port_nb;
275
276 port_nb = get_port_by_srcID(srcId);
277
278 return AT_CMPL;
279 }
280
281 /*
282 +-------------------------------------------------------------------+
283 | PROJECT : BLUETOOTH 8445 MODULE : PSA_UART |
284 | ROUTINE : bt_enqueue_command |
285 +-------------------------------------------------------------------+
286
287 PURPOSE :
288
289 */
290 GLOBAL void bt_enqueue_command(T_BTI_PORT_NB port_nb, UBYTE *output, USHORT output_len, UBYTE type)
291 {
292 T_ATI_BT_OUTPUT *cur_cmd;
293 T_ATI_BT_OUTPUT *queue_end;
294 int len;
295
296 TRACE_EVENT_P2("bt_enqueue_command() %d %s",type, output);
297
298 len = output_len + sizeof(T_ATI_BT_OUTPUT);
299 ACI_MALLOC(cur_cmd, len);
300
301 cur_cmd->output_len = output_len;
302 cur_cmd->output_type = type;
303 cur_cmd->next = NULL;
304 memcpy (cur_cmd->output, output, output_len);
305 cur_cmd->output[output_len] = 0;
306
307 if (bti_port_table[port_nb].atqueue == NULL) /* Queue is empty */
308 {
309 bti_port_table[port_nb].atqueue = cur_cmd;
310 }
311 else /* There are already pending commands */
312 {
313 queue_end = bti_port_table[port_nb].atqueue;
314 len = 1; /* just for debugging */
315
316 #ifdef _SIMULATION_
317 // TRACE_EVENT_P1("content: %s", queue_end->output); /* just for debugging */
318 #endif
319
320 while (queue_end->next != NULL) /* search end of queue */
321 {
322 queue_end = queue_end->next;
323 len++; /* just for debugging */
324 #ifdef _SIMULATION_
325 // TRACE_EVENT_P1("content: %s", queue_end->output); /* just for debugging */
326 #endif
327 }
328 TRACE_EVENT_P1("elements in queue: %d", len); /* just for debugging */
329 queue_end->next = cur_cmd;
330 }
331 return;
332 }
333
334
335 /*
336 +-------------------------------------------------------------------+
337 | PROJECT : BLUETOOTH 8445 MODULE : PSA_UART |
338 | ROUTINE : bt_set_output_type |
339 +-------------------------------------------------------------------+
340
341 PURPOSE :
342
343 */
344 GLOBAL UBYTE bt_set_output_type(T_ATI_OUTPUT_TYPE t)
345 {
346 if (IS_CONFIRM_OUTPUT(t))
347 return ATI_BT_CONFIRM_COMMAND;
348 if (IS_NORMAL_OUTPUT(t))
349 return ATI_BT_NORMAL_COMMAND;
350 if (IS_INDICATION_OUTPUT(t))
351 return ATI_BT_INDICATION_COMMAND;
352
353 TRACE_EVENT("ATI_BT unexpected output type");
354 }
355
356 /*==== CALLBACKS ==================================================*/
357
358 /*
359 +--------------------------------------------------------------------+
360 | PROJECT : BLUETOOTH 8445 MODULE : ACI_URT |
361 | STATE : code ROUTINE : bt_src_result_cb |
362 +--------------------------------------------------------------------+
363
364 PURPOSE:
365
366 */
367 GLOBAL void bt_src_result_cb (UBYTE src_id,
368 T_ATI_OUTPUT_TYPE output_type,
369 UBYTE *output,
370 USHORT output_len)
371 {
372 ULONG port_nb;
373
374 port_nb = get_port_by_srcID(src_id);
375
376 TRACE_EVENT_P1("bt_src_result_cb() pt: %d", port_nb);
377
378 /* just for test purposes */
379 TRACE_EVENT((char*)output);
380
381 /* first check, if we are allowed to send */
382 if (bti_port_table[port_nb].at_flow_on == FALSE)
383 {
384 TRACE_EVENT("bt_src_result_cb() commands pending");
385 bt_enqueue_command(port_nb, output, output_len, bt_set_output_type(output_type));
386 return;
387 }
388
389 /* kk 010808
390 * according to RIE NORMAL_OUTPUT and CONFIRM_OUTPUT is mutual exclusive
391 * but this is not the case in the current implementation
392 * addionally INDICATION_OUTPUT is never set
393 * temporary solution is to check for CONFIRM first then exit if applicable
394 * else check for NORMAL_OUTPUT and assume that this is also INDICATION
395 * NEEDS FIX from RIE
396 */
397 if (IS_CONFIRM_OUTPUT(output_type))
398 {
399 TRACE_EVENT("bt_src_result_cb() confirm sent");
400 btiaci_at_cmd_res(port_nb, (char *)output);
401 return;
402 }
403
404 /* kk 010808
405 * according to RIE NORMAL_OUTPUT and CONFIRM_OUTPUT is mutual exclusive
406 * but this is not the case in the current implementation
407 * addionally INDICATION_OUTPUT is never set
408 * temporary solution is to check for CONFIRM first then exit if applicable
409 * else check for NORMAL_OUTPUT and assume that this is also INDICATION
410 * NEEDS FIX from RIE
411 */
412 if (IS_NORMAL_OUTPUT(output_type) OR IS_INDICATION_OUTPUT(output_type) OR IS_ECHO_OUTPUT(output_type))
413 {
414 TRACE_EVENT("bt_src_result_cb() indication/normal sent");
415 bti_port_table[port_nb].at_flow_on = FALSE;
416 btiaci_at_cmd_req(port_nb, (char *)output);
417 return;
418 }
419
420 TRACE_EVENT("bt_src_result_cb() SOMETHING IS WRONG HERE");
421 }
422
423 /*
424 +--------------------------------------------------------------------+
425 | PROJECT : BLUETOOTH 8445 MODULE : ACI_URT |
426 | STATE : code ROUTINE : bt_src_line_state_cb
427 +--------------------------------------------------------------------+
428
429 PURPOSE:
430
431 */
432 GLOBAL void bt_src_line_state_cb (UBYTE src_id,
433 T_ATI_LINE_STATE_TYPE line_state_type,
434 ULONG line_state_param)
435 {
436
437 T_BTI_AT_RING_TYPE bt1, bt2;
438 T_BTI_AT_DCE_SIGNAL signal;
439 T_BTI_PORT_NB port_nb;
440
441 T_IO_RING_PARAMS *ring;
442 T_IO_DCD_STAT *dcd;
443
444 port_nb = get_port_by_srcID(src_id);
445
446 TRACE_EVENT_P1("bt_src_line_state_cb() pt: %d", port_nb);
447
448 switch (line_state_type)
449 {
450 case ATI_LINE_STATE_RNG:
451 TRACE_EVENT("line state RING");
452
453 ring = (T_IO_RING_PARAMS *)line_state_param;
454
455 bt1 = get_bti_ring_type(ring->b_cap_1);
456 bt2 = get_bti_ring_type(ring->b_cap_2);
457 signal = get_bti_ring_state(ring->ring_stat);
458
459 btiaci_at_signal_change_req(port_nb, signal, bt1, bt2);
460 break;
461
462 case ATI_LINE_STATE_DCD:
463 TRACE_EVENT("line state DCD");
464
465 dcd = (T_IO_DCD_STAT *)line_state_param;
466 signal = get_bti_dcd_state(*dcd);
467 btiaci_at_signal_change_req(port_nb, signal, BTI_AT_RING_NotPresent, BTI_AT_RING_NotPresent);
468 break;
469
470 case ATI_LINE_STATE_OUTPUT_TYPE:
471 /*src_infos->run_cmd = TRUE;*/
472 /*src_infos->first_output = TRUE;*/
473
474 if( line_state_param EQ ATI_OUTPUT_TYPE_LARGE )
475 {
476 TRACE_EVENT("large output following");
477 bti_port_table[port_nb].large_at_output = TRUE;
478 }
479 else
480 {
481 TRACE_EVENT("normal output following");
482 bti_port_table[port_nb].large_at_output = FALSE;
483 }
484 break;
485
486 default:
487 TRACE_EVENT("line state NO TYPE");
488 break;
489 }
490 }
491
492
493
494 /*
495 +-------------------------------------------------------------------+
496 | PROJECT : BLUETOOTH 8445 MODULE : PSA_UART |
497 | ROUTINE : bt_src_dti_cb |
498 +-------------------------------------------------------------------+
499
500 PURPOSE : callback for dti manager.
501
502 */
503
504 GLOBAL BOOL bt_src_dti_cb( UBYTE srcId, T_DTI_MNG_CB_TYPE result_type )
505 {
506 TRACE_FUNCTION("bt_src_dti_cb()");
507
508 switch(result_type)
509 {
510 case(CB_TYPE_CONNECTED):
511 TRACE_EVENT_P1("srcID %d connected", srcId);
512 break;
513
514 case(CB_TYPE_TMP_RECONNECTED):
515 TRACE_EVENT_P1("srcID %d reconnected", srcId);
516 break;
517
518 case(CB_TYPE_NEW_CONNECTED):
519 TRACE_EVENT_P1("srcID %d new connected", srcId);
520 break;
521
522 case(CB_TYPE_TMP_DISCONNECTING):
523 TRACE_EVENT_P1("srcID %d disconnecting", srcId);
524 break;
525
526 case(CB_TYPE_TMP_DISCONNECTED):
527 TRACE_EVENT_P1("srcID %d disconnected", srcId);
528 break;
529
530 case(CB_TYPE_ERROR):
531 TRACE_EVENT_P1("srcID %d ERROR", srcId);
532
533 /* connection failed */
534 //kk srcInfos->LineState = LINE_TMP_DISCONNECTED;
535 //k dti_mng_owner_connect(srcId, UNIT_UART);
536 break;
537
538 default:
539 break;
540 }
541
542 return TRUE;
543 }
544