comparison src/cs/services/atp/atp_gsm_bt_api.c @ 0:4e78acac3d88

src/{condat,cs,gpf,nucleus}: import from Selenite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 16 Oct 2020 06:23:26 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4e78acac3d88
1 /*******************************************************************************
2 *
3 * File Name : atp_gsm_bt_api.c
4 *
5 * This file handles all the interface between GSM AT command handler or Data handler
6 * and the BT protocol stack. It has 2 main functions:
7 * - get the events coming from Bluetooth ATP in direction of GSM, analyse them and
8 * call the proper function of atp_gsm_gsm_api.c
9 * - offer function to GSM so that GSM can use services of the BT PS
10 *
11 *
12 * Version number : 0.1 Date : 10-Jully-2000
13 *
14 * History : 0.1 - Created by E. Baissus
15 *
16 * Author : Eric Baissus : e-baissus@ti.com
17 *
18 * (C) Copyright 2000 by Texas Instruments Incorporated
19 *****************************************************************************/
20
21 #include "rv/rv_general.h"
22 #include "rvf/rvf_api.h"
23 #include "atp/atp_api.h"
24 #include "atp/atp_config.h"
25 #include "atp/atp_messages.h"
26 #include "atp/atp_gsm_bt_api.h"
27 #include "atp/atp_gsm_gsm_api.h"
28 #include "atp/atp_config.h"
29 #include "atp/bti_at.h"
30 #include "atp/atp_i.h"
31 #include "rvm/rvm_use_id_list.h"
32
33 #include <string.h>
34
35 /* Internal definitions */
36
37
38
39 typedef enum
40 {
41 ATP_ACTIVE , // Data exchange in the BT/GSM adapter is on going
42 ATP_NOT_ACTIVE // Data exchange in the BT/GSM adapter is not on going
43 } T_ATP_DATA_ACTIVITY;
44
45 typedef enum
46 {
47 CMD_PENDING, // GSM should be processing a command from BT
48 CMD_NOT_PENDING // GSM can handle a new command issued by BT
49 } T_ATP_GSM_CMD_STATUS;
50
51 typedef struct
52 {
53 UINT32 gsm_tx_data_left; // Number of data left to transmit to ATP
54 T_ATP_DATA_ACTIVITY atp_tx_data_activity; // Indicates if data exchange is on going from BT to GSM
55 T_ATP_GSM_CMD_STATUS cmd_status;
56 UINT32 bt_max_payload;
57 UINT16 tx_head_size;
58 UINT16 tx_trail_size;
59 } T_ATP_GSM_PORT_STRUCT;
60
61
62 /* Definition used only in this file */
63 typedef enum
64 {
65 ATP_GSM_OPEN_PORT_PENDING, // The adaptor is processing an open port
66 ATP_GSM_OPEN_PORT_NOT_PENDING // The adaptor is not processing an open port
67 } T_ATP_GSM_OPEN_PORT_PENDING;
68
69
70
71
72 /* Local variable */
73 static T_ATP_SW_ENTITY_ID atp_gsm_sw_id; /* Any entity needs to register to ATP and then get an id This id will be identify GSM for ATP */
74 static T_ATP_PORT_NB initiator_port_nb; /* Port number used by the SWE requesting a new port to GSM */
75 static T_ATP_SW_ENTITY_ID initiator_id; /* Initiator ID of the SWE requesting to open a port with GSM */
76 static T_ATP_GSM_OPEN_PORT_PENDING open_port_pending; /* Value can be : PORT_PENDING or PORT_NOT_PENDING
77 A port is said to be in PORT_PENDING when a new port
78 has been requested but this new port is not yet created
79 Only one port at a time can be in PORT_PENDING state
80 If open_port_pending is in PORT_PENDING state, then no
81 new port request is processed
82 */
83 static UINT8 current_nb_port; // Indicate number of port actually activated
84 static T_ATP_GSM_PORT_STRUCT * port_array[ATP_MAX_NB_OF_PORT_SUPPORTED_BY_GSM];
85 static UINT32 temp_bt_max_payload; // USed to store BT MFS before the port is actually open
86
87 /* Function definition */
88 static T_RV_RET atp_gsm_init_port(T_ATP_GSM_PORT_STRUCT * port_p);
89 static T_RV_RET atp_gsm_init_if(void);
90 static T_RV_RET atp_gsm_get_new_port_nb(UINT8 * port_nb);
91
92
93
94
95
96 /******************************************************************************
97 * Function name: atp_gsm_bt_event_handle
98 *
99 * Description : Main function used to split the events coming from ATP
100 * and call proper function of GSM side (see atp_gsm_gsm_api.c)
101 *
102 *
103 * Parameters : * ATP message
104 *
105 * Return : No return
106 *
107 *
108 * History : 0.1 (10-Jully-2000)
109 *
110 ******************************************************************************/
111 void atp_gsm_bt_event_handle(void * message_p)
112 {
113
114 T_RV_RET error = RV_OK;
115 T_BTI_PORT_NB port_nb = 0xFF;
116
117
118
119 switch(((T_ATP_MESSAGE *) message_p)->msg_id)
120 {
121 case ATP_OPEN_PORT_IND :
122 {
123 T_BTI_BT_PORT_INFO bt_port_info;
124 rvf_send_trace("ATP/GSM : Received a ATP_OPEN_PORT_IND from ATP ",50,
125 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
126
127 // Store initiator parameters
128 initiator_port_nb=(( T_ATP_OPEN_PORT_IND *) message_p)->initiator_port_nb;
129 initiator_id = (( T_ATP_OPEN_PORT_IND *) message_p)->initiator_id;
130
131 if ((open_port_pending == ATP_GSM_OPEN_PORT_PENDING) || (atp_gsm_get_new_port_nb(&port_nb)!= RV_OK))
132 {
133 // A port opening is pending : refuse to open a new port
134 T_ATP_PORT_INFO dummy_port_info;
135 T_ATP_NO_COPY_INFO dummy_no_copy_info;
136
137 rvf_send_trace("ATP/GSM : Failed to open a port : port opening was pending or max number of port has been reached",97,
138 NULL_PARAM,RV_TRACE_LEVEL_WARNING,ATP_USE_ID);
139
140 /* Initialise to avoid warning */
141 memset(&dummy_port_info,0,sizeof(dummy_port_info));
142 memset(&dummy_no_copy_info,0,sizeof(dummy_no_copy_info));
143
144 // Send a negative response to ATP
145 atp_open_port_rsp((( T_ATP_OPEN_PORT_IND *) message_p)->initiator_id,initiator_port_nb,atp_gsm_sw_id,0,
146 dummy_port_info,dummy_no_copy_info,NULL,OPEN_PORT_NOK);
147 rvf_free_buf( (( T_ATP_OPEN_PORT_IND *) message_p)->custom_info_p );
148 error=RV_NOT_SUPPORTED;
149 }
150
151 // Send open port indication to GSM
152 /////////////// Need to update data packet size
153 bt_port_info.optimal_bt_max_packet_size = ((T_ATP_CUSTOM_TO_GSM_INFO *) (( T_ATP_OPEN_PORT_IND *) message_p)->custom_info_p)->bt_max_payload; // DO NOT CARE ...
154 temp_bt_max_payload = bt_port_info.optimal_bt_max_packet_size; // Store temporaly the MFS
155 open_port_pending=ATP_GSM_OPEN_PORT_PENDING; // Now , an open port is pending
156 bti_at_open_port_ind(port_nb,bt_port_info);
157 rvf_free_buf( (( T_ATP_OPEN_PORT_IND *) message_p)->custom_info_p );
158 break;
159 };
160
161
162 case ATP_PORT_CLOSED :
163 { // A close_port has been issue on BT side
164 rvf_send_trace("ATP/GSM : Received a ATP_PORT_CLOSED from ATP ",50,
165 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
166
167 // Send close port indication to GSM
168 bti_at_close_port_ind((T_BTI_PORT_NB) ((T_ATP_PORT_CLOSED *) message_p)->port_nb);
169 break;
170 };
171
172
173 case ATP_TXT_CMD_RDY :
174 { // A command in text format has been issued by BT side
175 rvf_send_trace("ATP/GSM : Received a ATP_TXT_CMD_RDY from ATP",45,
176 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
177
178 if (((T_ATP_TXT_CMD_RDY *) message_p)->cmd_type == CMD_ABORT)
179 {
180 rvf_send_trace("ATP/GSM : An abort command is requested by ATP ",47,
181 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
182 port_array[((T_ATP_TXT_CMD_RDY *)message_p)->port_nb]->cmd_status = CMD_NOT_PENDING;
183 bti_at_abort_ind((T_BTI_PORT_NB) ((T_ATP_TXT_CMD_RDY *) message_p)->port_nb);
184 }
185 else
186 {
187 rvf_send_trace( ((T_ATP_TXT_CMD_RDY *) message_p)->txt_cmd_p,
188 (UINT8) strlen(((T_ATP_TXT_CMD_RDY *) message_p)->txt_cmd_p),
189 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
190 port_array[((T_ATP_TXT_CMD_RDY *)message_p)->port_nb]->cmd_status = CMD_PENDING;
191 bti_at_cmd_ind((T_BTI_PORT_NB) ((T_ATP_TXT_CMD_RDY *) message_p)->port_nb,
192 (char *) ((T_ATP_TXT_CMD_RDY *) message_p)->txt_cmd_p);
193 }
194
195 atp_free_buffer(((T_ATP_TXT_CMD_RDY *) message_p)->txt_cmd_p);
196 break;
197 };
198
199 case ATP_CMD_RDY :
200 { // A command in binary format has been issued by BT side
201 // This command is ignored since binary format not supported by GSM
202 rvf_send_trace("ATP/GSM : Ignored a ATP_CMD_RDY from ATP",40,
203 NULL_PARAM,RV_TRACE_LEVEL_WARNING, ATP_USE_ID);
204
205 atp_free_buffer(((T_ATP_CMD_RDY *) message_p)->cmd_info_p);
206
207 break;
208 };
209
210
211 case ATP_NO_COPY_DATA_RDY :
212 { // BT side issued a no copy format buffer to GSM
213 // This command is ignored and warning is raised
214 rvf_send_trace("ATP/GSM : Ignored a ATP_NO_COPY_DATA_RDY from ATP ",50,
215 NULL_PARAM,RV_TRACE_LEVEL_WARNING, ATP_USE_ID);
216
217 atp_free_buffer(((T_ATP_NO_COPY_DATA_RDY *) message_p)->atp_buffer_p);
218
219 break;
220 };
221
222
223
224 case ATP_DATA_RDY :
225 { // BT side has sent data to GSM
226 rvf_send_trace("ATP/GSM : Received a ATP_DATA_RDY from ATP . Nb of data = ",58,
227 (UINT32) ((T_ATP_DATA_RDY *)message_p)->nb_bytes,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
228
229 /* If GSM is not currently handling data exchange, call bti_data_rdy */
230 if (port_array[((T_ATP_DATA_RDY *)message_p)->port_nb]->atp_tx_data_activity == ATP_NOT_ACTIVE)
231 {
232 port_array[((T_ATP_DATA_RDY *)message_p)->port_nb]->atp_tx_data_activity =
233 ATP_ACTIVE;
234
235 rvf_send_trace("ATP/GSM : bti_data_ready_ind has been called by BT . Nb_Bytes = ",65,
236 (UINT32) ((T_ATP_DATA_RDY *)message_p)->nb_bytes ,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
237
238 bti_data_ready_ind((T_BTI_PORT_NB) ((T_ATP_DATA_RDY *)message_p)->port_nb,
239 (unsigned long) ((T_ATP_DATA_RDY *)message_p)->nb_bytes);
240
241 }
242 else
243 {
244 UINT8 * dummy_data_buffer = NULL;
245 UINT32 data_left,data_read;
246
247 ATP_SEND_TRACE("ATP/GSM : Wait before sending data to GSM since GSM is already fetching data",
248 RV_TRACE_LEVEL_DEBUG_LOW);
249
250 atp_get_data(atp_gsm_sw_id,((T_ATP_DATA_RDY *)message_p)->port_nb,(UINT8 *) dummy_data_buffer,
251 (UINT32) 0,&data_read,&data_left);
252
253 rvf_send_trace("ATP/GSM : Total number of data to fetch for GSM = ",51,
254 (UINT32) data_left,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
255 }
256
257 break;
258 };
259
260
261
262 case ATP_PORT_MODE_CHANGED :
263 { // BT side has issue a port mode changed (Data or Command)
264 rvf_send_trace("ATP/GSM : Received a ATP_PORT_MODE_CHANGED from ATP",51,
265 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
266
267 if( ((T_ATP_PORT_MODE_CHANGED *) message_p)->mode == ATP_PORT_DATA_MODE)
268 {
269 ATP_SEND_TRACE("ATP/GSM: switch to data mode",RV_TRACE_LEVEL_DEBUG_LOW);
270 ATP_SEND_TRACE("ATP/GSM: BT calls bti_data_ready_cnf in order to accept data from GSM",RV_TRACE_LEVEL_DEBUG_LOW);
271 bti_data_ready_cnf((T_BTI_PORT_NB) ((T_ATP_PORT_MODE_CHANGED *) message_p)->port_nb);
272 }
273 else
274 {
275 ATP_SEND_TRACE("ATP/GSM: port has been switched to command mode by BT",RV_TRACE_LEVEL_DEBUG_LOW);
276 }
277
278 break;
279 };
280
281
282 case ATP_SIGNAL_CHANGED :
283 { // BT side has issued a signal change
284 rvf_send_trace("ATP/GSM : Received a ATP_SIGNAL_CHANGED from ATP",48,
285 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
286
287 if ( ( (((T_ATP_SIGNAL_CHANGED *) message_p)->mask) & ATP_TX_FLOW_UNMASK) != 0)
288 {
289 // change on TX flow
290 if( ( (((T_ATP_SIGNAL_CHANGED *) message_p)->mask) &
291 (((T_ATP_SIGNAL_CHANGED *) message_p)->signal) ) == ATP_TX_FLOW_OFF)
292 {
293 // BT side has switch TX GSM flow to OFF
294 rvf_send_trace("ATP/GSM : ATP requested TX GSM Flow to be OFF",45,
295 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
296 }
297 else
298 {
299 // BT side has switch TX GSM flow to ON
300 rvf_send_trace("ATP/GSM : ATP requested TX GSM Flow to be ON",44,
301 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
302
303 if (port_array[((T_ATP_SIGNAL_CHANGED *) message_p)->port_nb]->gsm_tx_data_left != 0)
304 {
305 // Retry to send data to ATP
306 bti_data_ready_req( (T_BTI_PORT_NB) ((T_ATP_SIGNAL_CHANGED *) message_p)->port_nb,
307 port_array[((T_ATP_SIGNAL_CHANGED *) message_p)->port_nb]->gsm_tx_data_left);
308 }
309 }
310 break;
311 }
312
313 //////////////////////////////////////
314 // Otherwise, ignore the signal change
315 /////////////////////TO BE UPDATED !!! /////////////////
316 rvf_send_trace("ATP/GSM : Signal change has been ignored ",41,
317 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
318
319 break;
320 };
321
322
323 default:
324 {
325 rvf_send_trace("ATP/GSM : Unknown message received from ATP by ATP_GSM => ignored ",66,
326 NULL_PARAM,RV_TRACE_LEVEL_WARNING,ATP_USE_ID);
327 break;
328 };
329 }
330
331 /* Release ATP message buffer */
332 atp_free_message(message_p);
333
334 }
335
336
337
338
339 /******************************************************************************
340 * Function name: bti_at_init_req
341 *
342 * Description : This function is called by GSM to initialise GSM with ATP
343 *
344 *
345 * Parameters : None
346 *
347 * Return : BTI_AT_OK or BTI_AT_INTERNAL_ERR
348 *
349 * History : 0.1 (10-Jully-2000)
350 * : 0.2 (02-Jan-2001)
351 ******************************************************************************/
352 void bti_at_init_req(void)
353 {
354 T_ATP_ENTITY_MODE mode;
355 T_ATP_SW_ENTITY_NAME name;
356 T_ATP_CALLBACK return_path;
357
358 ATP_SEND_TRACE("ATP/GSM : bti_at_init_req has been called by GSM . ",
359 RV_TRACE_LEVEL_DEBUG_LOW);
360
361 /* Static variable initialisation */
362 atp_gsm_init_if();
363
364 /* Register GSM to ATP */
365 strcpy((char *) name,ATP_GSM_NAME);
366 return_path.callback_func = atp_gsm_bt_event_handle;
367 return_path.addr_id = RVF_INVALID_ADDR_ID;
368
369 mode.cmd_mode=TXT_MODE;
370 mode.cp_mode=COPY_ON;
371 mode.cmd_support_mode=CMD_SUPPORT_ON;
372
373 if(atp_reg(name,return_path,mode,&atp_gsm_sw_id)!=RV_OK)
374 {
375 rvf_send_trace("ATP_GSM: GSM entity registration failed ",39, NULL_PARAM ,
376 RV_TRACE_LEVEL_WARNING,ATP_USE_ID);
377 bti_at_init_cnf(BTI_NAK); // Failed registration
378 }
379 else
380 {
381 ATP_SEND_TRACE ("ATP/GSM: GSM entity registration succeeded ",RV_TRACE_LEVEL_DEBUG_LOW);
382 bti_at_init_cnf(BTI_ACK); // Succeeded registration
383 }
384 }
385
386
387
388
389 /******************************************************************************
390 * Function name: bti_at_deinit_ind
391 *
392 * Description : This function is called by GSM (?) to de-initialise GSM from ATP
393 *
394 *
395 * Parameters : None
396 *
397 * Return : BTI_AT_OK or BTI_AT_NOT_SUPPORTED
398 *
399 *
400 * History : 0.1 (10-Jully-2000)
401 *
402 ******************************************************************************/
403 void bti_at_deinit_req(void)
404 {
405 ATP_SEND_TRACE ("ATP_GSM: bti_at_deinit_req has been called by GSM ",RV_TRACE_LEVEL_DEBUG_LOW);
406 atp_dereg(atp_gsm_sw_id);
407 }
408
409
410
411 /******************************************************************************
412 * Function name: bti_at_deinit_res
413 *
414 * Description : This function is called by GSM to de-initialise GSM from ATP
415 *
416 *
417 * Parameters : None
418 *
419 * Return : BTI_AT_OK or BTI_AT_NOT_SUPPORTED
420 *
421 *
422 * History : 0.1 (10-Jully-2000)
423 *
424 ******************************************************************************/
425 void bti_at_deinit_res(void)
426 {
427 // DUMMY FUNCTION
428 }
429
430
431
432 /******************************************************************************
433 * Function name: bti_at_open_port_res
434 *
435 * Description : This function is called by GSM to accept or refuse
436 * an open port request issued by BT side
437 *
438 *
439 *
440 *
441 * History : 0.1 (10-Jully-2000)
442 * : 0.2 (02-Jan-2001)
443 ******************************************************************************/
444 void bti_at_open_port_res(T_BTI_PORT_NB gsm_port_nb,
445 T_BTI_GSM_PORT_INFO gsm_port_info,
446 T_BTI_ACK ack)
447 {
448
449 T_ATP_PORT_INFO port_info ;
450 T_ATP_NO_COPY_INFO no_copy_info ;
451 T_RV_RET return_status;
452 T_ATP_CUSTOM_FROM_GSM_INFO * custom_gsm_info_p;
453 T_ATP_OTHER_PORT_END_INFO other_end_info;
454
455 rvf_send_trace("ATP/GSM : bti_at_open_port_res has been called by GSM . Flag = ",43,
456 (UINT32) ack,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
457 rvf_send_trace("ATP/GSM : gsm_port_nb = ",24,
458 (UINT32) gsm_port_nb,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
459 rvf_send_trace("ATP/GSM : GSM indication for MFS = ",35,
460 (UINT32) gsm_port_info.optimal_gsm_max_packet_size,
461 RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
462
463 /* Get information on the other end port */
464 if (atp_get_info_on_port_end(initiator_id,(T_ATP_PORT_NB) initiator_port_nb,
465 &other_end_info) != RV_OK)
466 {
467 ATP_SEND_TRACE("ATP : Failed to get information on other end port ",
468 RV_TRACE_LEVEL_WARNING);
469 no_copy_info.tx_head_size = 0;
470 no_copy_info.tx_trail_size = 0;
471 }
472 else
473 {
474 no_copy_info.tx_head_size = other_end_info.no_copy_info.rx_head_size;
475 no_copy_info.tx_trail_size = other_end_info.no_copy_info.rx_trail_size;
476 }
477
478
479 /* Initialise port information */
480 no_copy_info.rx_head_mode = RX_HEADER_OFF; // COPY ON mode in RX
481 no_copy_info.tx_head_mode = TX_HEADER_OFF; // COPY OFF mode in TX for optimization
482
483
484 // no_copy_info.tx_head_mode = TX_HEADER_ON; // COPY OFF mode in TX for optimization
485 ////////// SHOULD BE REMOVED IN CASE GSM SEND DATA WITH HEADER AND TRAILER BIT //////
486 no_copy_info.tx_head_size = 0;
487 no_copy_info.tx_trail_size = 0;
488
489 no_copy_info.rx_mb = RVF_INVALID_MB_ID;
490 no_copy_info.tx_mb = RVF_INVALID_MB_ID;
491 no_copy_info.packet_mode = NORMAL_PACKET; /* No L2CAP packet... */
492
493 port_info.dce_mask[0]=0x0000; // Do not care, GSM is not in DCE_ON mode
494 port_info.ring_type=ATP_NO_RING_TYPE;
495 port_info.signal_mask=ATP_TX_FLOW_UNMASK;
496
497 /* Store custom info from GSM */
498 atp_get_buffer(sizeof(T_ATP_CUSTOM_FROM_GSM_INFO),(void **) &custom_gsm_info_p);
499 custom_gsm_info_p->custom_type = ATP_FROM_GSM_INFO;
500 custom_gsm_info_p ->optimal_gsm_max_packet_size = gsm_port_info.optimal_gsm_max_packet_size;
501
502 if (ack == BTI_ACK)
503 {
504 ATP_SEND_TRACE("ATP/GSM : GSM accepted to open a port ", RV_TRACE_LEVEL_DEBUG_LOW);
505 // Initialise a new port
506 atp_get_buffer(sizeof(T_ATP_GSM_PORT_STRUCT),(void **) &(port_array[gsm_port_nb]));
507
508 atp_gsm_init_port(port_array[gsm_port_nb]);
509 port_array[gsm_port_nb]->tx_head_size = no_copy_info.tx_head_size;
510 port_array[gsm_port_nb]->tx_trail_size = no_copy_info.tx_trail_size;
511
512 return_status = atp_open_port_rsp( initiator_id,
513 (T_ATP_PORT_NB) initiator_port_nb,
514 atp_gsm_sw_id,
515 (T_ATP_PORT_NB) gsm_port_nb,
516 port_info,
517 no_copy_info,
518 (T_ATP_CUSTOM_INFO *) custom_gsm_info_p,
519 OPEN_PORT_OK);
520 }
521 else
522 {
523 rvf_send_trace("ATP/GSM : GSM refused the open port ",36,
524 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
525
526 return_status = atp_open_port_rsp( initiator_id,
527 (T_ATP_PORT_NB) initiator_port_nb,
528 atp_gsm_sw_id,
529 (T_ATP_PORT_NB) gsm_port_nb,
530 port_info,
531 no_copy_info,
532 NULL,
533 OPEN_PORT_NOK);
534 }
535
536 if(return_status != RV_OK)
537 {
538 rvf_send_trace("ATP/GSM : Failed to open a port ",33,
539 NULL_PARAM,RV_TRACE_LEVEL_WARNING, ATP_USE_ID);
540 }
541
542 open_port_pending = ATP_GSM_OPEN_PORT_NOT_PENDING;
543 }
544
545
546
547
548 /******************************************************************************
549 * Function name: bti_at_close_port_res
550 *
551 * Description : Not used by BT PS - Port is always closed
552 *
553 * Parameters :
554 *
555 * Return : BTI_AT_OK
556 *
557 * History : 0.1 (10-Jully-2000)
558 *
559 ******************************************************************************/
560 void bti_at_close_port_res(T_BTI_PORT_NB gsm_port_nb)
561 {
562 rvf_send_trace("ATP/GSM : bti_at_close_port_res has been called by GSM . Port nb = ",67,
563 (UINT32) gsm_port_nb,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
564
565 /* Memory Deallocation */
566 rvf_free_buf(port_array[gsm_port_nb]);
567 port_array[gsm_port_nb]=NULL;
568 }
569
570
571
572 /******************************************************************************
573 * Function name: bti_at_cmd_res
574 *
575 * Description : This function is called by GSM to provide result to BT
576 *
577 * Parameters : gsm_port_nb = number of the gsm port
578 * cmd = command in text format
579 *
580 * Return : BTI_AT_OK or BTI_AT_NOT_SUPPORTED
581 *
582 *
583 * History : 0.1 (10-Jully-2000)
584 *
585 ******************************************************************************/
586 void bti_at_cmd_res(T_BTI_PORT_NB gsm_port_nb,
587 char * cmd)
588 {
589 T_ATP_TXT_CMD txt_buffer_p;
590
591 ATP_SEND_TRACE ("ATP/GSM : bti_at_cmd_res has been called by GSM . Result is : ",
592 RV_TRACE_LEVEL_DEBUG_LOW);
593 rvf_send_trace(cmd,(UINT8) strlen(cmd),
594 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
595
596 /* Create a BTF buffer and copy command into. The command must be 0-terminated */
597 atp_get_buffer(strlen(cmd) + 0x00000001,(void **) &txt_buffer_p);
598 strcpy(txt_buffer_p,cmd);
599
600 port_array[gsm_port_nb]->cmd_status = CMD_NOT_PENDING;
601 if (atp_send_txt_cmd(atp_gsm_sw_id,(T_ATP_PORT_NB) gsm_port_nb,
602 RESULT_CODE,(T_ATP_TXT_CMD) txt_buffer_p) != RV_OK)
603 {
604 rvf_send_trace("ATP/GSM : Error when sending a command to ATP ",46,
605 NULL_PARAM,RV_TRACE_LEVEL_WARNING, ATP_USE_ID);
606 }
607 }
608
609
610 /******************************************************************************
611 * Function name: bti_at_cmd_req
612 *
613 * Description : This function is called by GSM to provide preliminary result to BT
614 * The end of the result will be issed via bti_at_cmd_res
615 *
616 * Parameters : gsm_port_nb = number of the gsm port
617 * cmd = command in text format
618 *
619 * Return : BTI_AT_OK or BTI_AT_NOT_SUPPORTED
620 *
621 *
622 * History : 0.1 (10-Jully-2000)
623 *
624 ******************************************************************************/
625 void bti_at_cmd_req(T_BTI_PORT_NB gsm_port_nb,
626 char * cmd)
627 {
628
629 T_ATP_CMD_TYPE cmd_type;
630 T_ATP_TXT_CMD txt_buffer_p;
631 ATP_SEND_TRACE("ATP/GSM : bti_at_cmd_req has been called by GSM. Code is : ",
632 RV_TRACE_LEVEL_DEBUG_LOW);
633 rvf_send_trace(cmd,(UINT8) strlen(cmd),
634 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
635
636 /* Create a BTF buffer and copy command into. The command must be 0-terminated */
637 atp_get_buffer(strlen(cmd) + 0x00000001,(void **) &txt_buffer_p);
638 strcpy(txt_buffer_p,cmd);
639
640 if (port_array[gsm_port_nb]->cmd_status == CMD_PENDING)
641 {
642 cmd_type = PRELIMINARY_RESULT_CODE;
643 }
644 else
645 {
646 cmd_type = UNSOLICITED_RESULT;
647 }
648
649 if (atp_send_txt_cmd(atp_gsm_sw_id,(T_ATP_PORT_NB) gsm_port_nb,cmd_type,
650 (T_ATP_TXT_CMD) txt_buffer_p) != RV_OK)
651 {
652 rvf_send_trace("ATP/GSM : Error when sending a command to ATP ",46,
653 NULL_PARAM,RV_TRACE_LEVEL_WARNING, ATP_USE_ID);
654 }
655
656 bti_at_cmd_cnf(gsm_port_nb); // Accept new results
657 }
658
659
660
661 /******************************************************************************
662 * Function name: bti_at_abort_res
663 *
664 * Description : This function is called by GSM to comfirm a command abort
665 * NOT USED BY ATP YET
666 *
667 * Parameters : gsm_port_nb = number of the gsm port
668 *
669 * Return : BTI_AT_NOT_SUPPORTED
670 *
671 *
672 * History : 0.1 (10-Jully-2000)
673 *
674 ******************************************************************************/
675 void bti_at_abort_res(T_BTI_PORT_NB gsm_port_nb)
676 {
677 rvf_send_trace("ATP/GSM : bti_at_abort_res has been called by GSM . Ignored . Port nb = ",72,
678 (UINT32) gsm_port_nb,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
679
680 // Not implemented yet . Maybe usefull to send a commande back to indicate the abortion has succeede (or failed ...)
681 }
682
683
684 /******************************************************************************
685 * Function name: bti_data_ready_req
686 *
687 * Description : This function is called by GSM to indicate that data are
688 * available for BT PS.
689 *
690 *
691 * Parameters : gsm_port_nb = number of the gsm port
692 * nb_bytes_available = number of bytes of data available
693 *
694 * Return : None
695 *
696 * History : 0.1 (10-Jully-2000)
697 * 0.2 (01-Jan-2001)
698 *
699 ******************************************************************************/
700 void bti_data_ready_req (T_BTI_PORT_NB gsm_port_nb,
701 unsigned long nb_bytes_available)
702 {
703 UINT32 nb_bytes_left,nb_bytes_to_transmit;
704 UINT8 * data_buffer_p;
705
706 rvf_send_trace("ATP/GSM : data_ready_req has been called by GSM . Nb Bytes = ",61,
707 (UINT32) nb_bytes_available,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
708
709 rvf_send_trace("ATP/GSM : Port Number used by GSM = ",37,
710 (UINT32) gsm_port_nb,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
711
712 if (nb_bytes_available !=0)
713 {
714
715 nb_bytes_left= nb_bytes_available; // number of byte to transmit in this function
716
717 while(nb_bytes_left > 0)
718 {
719 if (nb_bytes_left > port_array[gsm_port_nb]->bt_max_payload) // Bigger than allowed MFS
720 {
721 nb_bytes_to_transmit = port_array[gsm_port_nb]->bt_max_payload;
722 }
723 else
724 {
725 nb_bytes_to_transmit = nb_bytes_left;
726 }
727
728
729 /* This code is removed because of an issue with header and trailer size
730 /* It is temporary remplaced by setting to 0 header and trailer */
731 /* atp_buffer_size = nb_bytes_to_transmit + port_array[(T_ATP_PORT_NB) gsm_port_nb]->tx_head_size+
732 // port_array[(T_ATP_PORT_NB) gsm_port_nb]->tx_trail_size;
733 //
734 // rvf_send_trace("ATP/GSM : Buffer_size to send to ATP = ",40,
735 // (UINT32) atp_buffer_size,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
736 //
737 // rvf_send_trace("ATP/GSM : tx_header size = ",27,
738 // (UINT32) port_array[(T_ATP_PORT_NB) gsm_port_nb]->tx_head_size,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
739 //
740 // rvf_send_trace("ATP/GSM : tx_trail size = ",27,
741 // (UINT32) port_array[(T_ATP_PORT_NB) gsm_port_nb]->tx_trail_size,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
742
743
744 if (atp_get_buffer_from_tx_mb(atp_gsm_sw_id,gsm_port_nb,atp_buffer_size,
745 (void **) &data_buffer_p) == RV_OK)
746 {
747 /* Copy GSM data
748 rvf_send_trace("ATP/GSM : BT calls bti_get_gsm_data and request nb Bytes = ",59,
749 (UINT32) nb_bytes_to_transmit,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
750
751 bti_get_gsm_data(gsm_port_nb,(char *) &(data_buffer_p[port_array[(T_ATP_PORT_NB) gsm_port_nb]->tx_head_size]),nb_bytes_to_transmit);
752 atp_no_copy_send_data(atp_gsm_sw_id,gsm_port_nb,data_buffer_p,nb_bytes_to_transmit);
753 nb_bytes_left -= nb_bytes_to_transmit;
754 port_array[gsm_port_nb]->gsm_tx_data_left = nb_bytes_left;
755 }
756 else
757 {
758 port_array[gsm_port_nb]->gsm_tx_data_left = nb_bytes_left;
759 nb_bytes_left = 0; // Flow control has been activated : wait for FLOW ON flag
760 } */
761
762 ///////// START REPLACEMENT CODE ////////////////
763
764
765 if (atp_get_buffer_from_tx_mb(atp_gsm_sw_id,gsm_port_nb,nb_bytes_to_transmit,
766 (void **) &data_buffer_p) == RV_OK)
767 {
768 /* Copy GSM data */
769 rvf_send_trace("ATP/GSM : BT calls bti_get_gsm_data and request nb Bytes = ",59,
770 (UINT32) nb_bytes_to_transmit,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
771
772 bti_get_gsm_data(gsm_port_nb,(char *) (data_buffer_p),nb_bytes_to_transmit);
773 atp_no_copy_send_data(atp_gsm_sw_id,gsm_port_nb,data_buffer_p,nb_bytes_to_transmit);
774 nb_bytes_left -= nb_bytes_to_transmit;
775 port_array[gsm_port_nb]->gsm_tx_data_left = nb_bytes_left;
776 }
777 else
778 {
779 port_array[gsm_port_nb]->gsm_tx_data_left = nb_bytes_left;
780 nb_bytes_left = 0; // Flow control has been activated : wait for FLOW ON flag
781 }
782
783 // for (i=0;i<nb_bytes_to_transmit;i++)
784 // {
785 // rvf_send_trace("ATP/GSM : byte received from GSM = ",
786 // 36, (UINT32) (data_buffer_p[i]) ,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
787 // }
788
789 }
790 ///////// END REPLACEMENT CODE ////////////////
791
792
793 if (port_array[gsm_port_nb]->gsm_tx_data_left == 0)
794 {
795 ATP_SEND_TRACE("ATP/GSM: BT got all the data from GSM . BT calls bti_data_ready_cnf ",RV_TRACE_LEVEL_DEBUG_LOW);
796 bti_data_ready_cnf(gsm_port_nb); // Acknowledge data copy to GSM
797 }
798 }
799 }
800
801
802
803
804
805
806 /******************************************************************************
807 * Function name: bti_get_bt_data
808 *
809 * Description : This function is called by GSM to get data from BT side .
810 * Copy is processed by BT side
811 *
812 * Parameters : gsm_port_nb = number of the gsm port
813 * data_buffer = pointer on a buffer in which data can be copied
814 * nb_bytes_to_copy = number of bytes to copy into data_buffer
815 *
816 * Return : None
817 *
818 *
819 * History : 0.1 (10-Jully-2000)
820 * 0.2 (01-Jan-2001)
821 *
822 ******************************************************************************/
823 void bti_get_bt_data (T_BTI_PORT_NB gsm_port_nb,
824 char * data_buffer,
825 unsigned long nb_bytes_to_copy)
826 {
827 UINT32 data_left,data_read;
828
829
830 rvf_send_trace("ATP/GSM : bti_get_bt_data has been called by GSM . Requested nb of data = ",
831 74, (UINT32) nb_bytes_to_copy ,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
832
833 if ( (atp_get_data(atp_gsm_sw_id,gsm_port_nb,(UINT8 *) data_buffer,
834 (UINT32) nb_bytes_to_copy,&data_read,&data_left) != RV_OK) ||
835 (data_read != (UINT32) nb_bytes_to_copy))
836 {
837 ATP_SEND_TRACE("ATP/GSM : Could not get data from BT for GSM",RV_TRACE_LEVEL_ERROR);
838 }
839
840 // for (i=0;i<nb_bytes_to_copy;i++)
841 // {
842 // rvf_send_trace("ATP/GSM : byte sent to GSM = ",
843 // 29, (UINT32) (data_buffer[i]) ,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
844 // }
845
846 }
847
848
849 /******************************************************************************
850 * Function name: bti_data_ready_res
851 *
852 * Description : This function is called by GSM to indicate that it can receive
853 * new data from BT PS
854 *
855 *
856 * Parameters : gsm_port_nb = number of the gsm port
857 *
858 * Return : None
859 *
860 * History : 0.1 (10-Jully-2000)
861 * 0.2 (01-Jan-2001)
862 *
863 ******************************************************************************/
864 void bti_data_ready_res (T_BTI_PORT_NB gsm_port_nb)
865 {
866 UINT8 * dummy_data_buffer = NULL;
867 UINT32 data_left,data_read;
868
869 rvf_send_trace("ATP/GSM : bti_data_ready_res has been called by GSM ",52,
870 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
871
872 rvf_send_trace("ATP/GSM : port_number = ",25,
873 (UINT32) gsm_port_nb,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
874
875 /* Use the function atp_get_data to check if there are still data to transmit */
876 if (atp_get_data(atp_gsm_sw_id,gsm_port_nb,(UINT8 *) dummy_data_buffer,
877 (UINT32) 0,&data_read,&data_left) != RV_OK)
878 {
879 ATP_SEND_TRACE("ATP/GSM : Could not get number of data to read from BT to GSM ",RV_TRACE_LEVEL_ERROR);
880 }
881 else
882 {
883 rvf_send_trace("ATP/GSM : data_left = ",22,
884 (UINT32) data_left,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
885
886
887 if (data_left != 0)
888 {
889 rvf_send_trace("ATP/GSM : bti_data_ready_ind has been called by BT . Nb_Bytes = ",65,
890 (UINT32) data_left ,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID);
891
892 bti_data_ready_ind(gsm_port_nb,(unsigned long) data_left);
893 }
894 else
895 {
896 port_array[gsm_port_nb]->atp_tx_data_activity =
897 ATP_NOT_ACTIVE;
898 ATP_SEND_TRACE("ATP/GSM : ATP is ready to send new data to GSM ."
899 ,RV_TRACE_LEVEL_DEBUG_LOW);
900
901 }
902 }
903 }
904
905
906 /******************************************************************************
907 * Function name: atp_gsm_init_if
908 *
909 * Description : This function initialise the GSM/BT adaptor
910 *
911 *
912 *
913 *
914 * Return : RV_OK
915 *
916 * History : 0.1 (10-Jully-2000)
917 *
918 ******************************************************************************/
919 T_RV_RET atp_gsm_init_if(void)
920 {
921 UINT8 i;
922
923 open_port_pending = ATP_GSM_OPEN_PORT_NOT_PENDING;
924 atp_gsm_sw_id = ATP_INVALID_SWE_ID;
925 initiator_id = ATP_INVALID_SWE_ID;
926 initiator_port_nb = (T_ATP_PORT_NB) 0xFF;
927 current_nb_port = 0;
928 for (i=0;i<ATP_MAX_NB_OF_PORT_SUPPORTED_BY_GSM;i++)
929 {
930 port_array[i]=NULL;
931 }
932
933 return RV_OK;
934 }
935
936
937
938 /******************************************************************************
939 * Function name: bti_at_signal_change_req
940 *
941 * Description : This function is called by GSM to provide a new signal line status
942 * to BT
943 *
944 *
945 * Parameters : gsm_port_nb = number of the gsm port
946 * dce_signal = signal value
947 * ring_type_1 = voice, data or fax
948 * ring_type_2 = not used
949 *
950 * Return : None
951 *
952 * History : 0.1 (01-Jan-2001)
953 *
954 ******************************************************************************/
955 void bti_at_signal_change_req (T_BTI_PORT_NB gsm_port_nb,
956 T_BTI_AT_DCE_SIGNAL dce_signal,
957 T_BTI_AT_RING_TYPE ring_type_1,
958 T_BTI_AT_RING_TYPE ring_type_2)
959 {
960 T_ATP_PORT_SIGNAL old_signal,new_signal = 0;
961 T_ATP_SIGNAL_CHANGE_MASK mask = 0 ;
962
963 ATP_SEND_TRACE("ATP/GSM : bti_at_signal_change_req has been called by GSM ",
964 RV_TRACE_LEVEL_DEBUG_LOW);
965
966 atp_get_signal(atp_gsm_sw_id,gsm_port_nb,&old_signal);
967
968 if ( (dce_signal & BTI_AT_RING_MASK) == BTI_AT_RING_ON) // RING is ON
969 {
970 if ( (old_signal & ATP_RI_UNMASK) == ATP_RI_0) // RING is ON and was previously OFF
971 {
972 T_ATP_RING_TYPE atp_ring_type;
973 T_ATP_SW_NB sender_sw_nb;
974 T_ATP_PORT_STRUCT * port_p;
975
976 switch (ring_type_1)
977 {
978
979 /* Transparent data */
980 case BTI_AT_RING_Async:
981 {
982 atp_ring_type = ATP_DATA_RING_TYPE;
983 ATP_SEND_TRACE("ATP/GSM : RING_OFF -> RING_ON (Transparent data) "
984 ,RV_TRACE_LEVEL_DEBUG_LOW);
985 break;
986 }
987
988 /* Non transparent data */
989 case BTI_AT_RING_RelAsync:
990 {
991 atp_ring_type = ATP_DATA_RING_TYPE;
992 ATP_SEND_TRACE("ATP/GSM : RING_OFF -> RING_ON (Non-transparent data) "
993 ,RV_TRACE_LEVEL_DEBUG_LOW);
994 break;
995 }
996
997 /* Fax */
998 case BTI_AT_RING_Fax:
999 {
1000 atp_ring_type = ATP_FAX_RING_TYPE;
1001 ATP_SEND_TRACE("ATP/GSM : RING_OFF -> RING_ON (Fax) "
1002 ,RV_TRACE_LEVEL_DEBUG_LOW);
1003 break;
1004 }
1005
1006 /* Voice */
1007 case BTI_AT_RING_Voice:
1008 {
1009 atp_ring_type = ATP_VOICE_RING_TYPE;
1010 ATP_SEND_TRACE("ATP/GSM : RING_OFF -> RING_ON (Voice) "
1011 ,RV_TRACE_LEVEL_DEBUG_LOW);
1012 break;
1013 }
1014
1015 /* Not used */
1016 default:
1017 {
1018 atp_ring_type = ATP_NO_RING_TYPE;
1019 ATP_SEND_TRACE("ATP/GSM : RING_OFF -> RING_ON (Meaningless) "
1020 ,RV_TRACE_LEVEL_DEBUG_LOW);
1021 break;
1022 }
1023 } // End of switch
1024
1025 /* Get the pointer on the port structure */
1026 if(atp_get_port(atp_gsm_sw_id,gsm_port_nb,&port_p,&sender_sw_nb) != RV_OK)
1027 {
1028 atp_error_switch(ATP_ERROR_FAILED_TO_HANDLE_SIGNAL,ATP_PARAM_ERROR,NULL);
1029 return; /* This port does not exist */
1030 }
1031 if (atp_ring_type & port_p->port_info[(~sender_sw_nb)].ring_type)
1032 {
1033 new_signal |= ATP_RI_1;
1034 mask |= ATP_RI_UNMASK;
1035 }
1036 }
1037 }
1038 else
1039 {
1040 if ( (old_signal & ATP_RI_UNMASK) == ATP_RI_1) // RING is OFF and was previously ON
1041 {
1042 T_ATP_RING_TYPE atp_ring_type;
1043 T_ATP_SW_NB sender_sw_nb;
1044 T_ATP_PORT_STRUCT * port_p;
1045
1046 switch (ring_type_1)
1047 {
1048 /* Transparent data */
1049 case BTI_AT_RING_Async:
1050 {
1051 atp_ring_type = ATP_DATA_RING_TYPE;
1052 ATP_SEND_TRACE("ATP/GSM : RING_ON -> RING_OFF (Transparent data) "
1053 ,RV_TRACE_LEVEL_DEBUG_LOW);
1054 break;
1055 }
1056
1057 /* Non transparent data */
1058 case BTI_AT_RING_RelAsync:
1059 {
1060 atp_ring_type = ATP_DATA_RING_TYPE;
1061 ATP_SEND_TRACE("ATP/GSM : RING_ON -> RING_OFF (Non-transparent data) "
1062 ,RV_TRACE_LEVEL_DEBUG_LOW);
1063 break;
1064 }
1065
1066 /* Fax */
1067 case BTI_AT_RING_Fax:
1068 {
1069 atp_ring_type = ATP_FAX_RING_TYPE;
1070 ATP_SEND_TRACE("ATP/GSM : RING_ON -> RING_OFF (Fax) "
1071 ,RV_TRACE_LEVEL_DEBUG_LOW);
1072 break;
1073 }
1074
1075 /* Voice */
1076 case BTI_AT_RING_Voice:
1077 {
1078 atp_ring_type = ATP_VOICE_RING_TYPE;
1079 ATP_SEND_TRACE("ATP/GSM : RING_ON -> RING_OFF (Voice) "
1080 ,RV_TRACE_LEVEL_DEBUG_LOW);
1081 break;
1082 }
1083
1084 /* Not used */
1085 default:
1086 {
1087 atp_ring_type = ATP_NO_RING_TYPE;
1088 ATP_SEND_TRACE("ATP/GSM : RING_ON -> RING_OFF (Meaningless) "
1089 ,RV_TRACE_LEVEL_DEBUG_LOW);
1090 break;
1091 }
1092 } // End of switch
1093
1094
1095 /* Get the pointer on the port structure */
1096 if(atp_get_port(atp_gsm_sw_id,gsm_port_nb,&port_p,&sender_sw_nb) != RV_OK)
1097 {
1098 atp_error_switch(ATP_ERROR_FAILED_TO_HANDLE_SIGNAL,ATP_PARAM_ERROR,NULL);
1099 return; /* This port does not exist */
1100 }
1101
1102 if (atp_ring_type & port_p->port_info[(~sender_sw_nb)].ring_type)
1103 {
1104 new_signal |= ATP_RI_0;
1105 mask |= ATP_RI_UNMASK;
1106 }
1107
1108
1109 }
1110 }
1111
1112 if ( (dce_signal & BTI_AT_DCD_MASK) == BTI_AT_DCD_ON) // DCD is ON
1113 {
1114 if ( (old_signal & ATP_DCD_UNMASK) == ATP_DCD_0) // DCD is ON and was previously OFF
1115 {
1116 new_signal |= ATP_DCD_1;
1117 mask |= ATP_DCD_UNMASK;
1118 ATP_SEND_TRACE("ATP/GSM : DCD_OFF -> DCD_ON ",
1119 RV_TRACE_LEVEL_DEBUG_LOW);
1120 }
1121 }
1122 else
1123 {
1124 if ( (old_signal & ATP_DCD_UNMASK) == ATP_DCD_1) // DCD is OFF and was previously ON
1125 {
1126 new_signal |= ATP_DCD_0;
1127 mask |= ATP_DCD_UNMASK;
1128 ATP_SEND_TRACE("ATP/GSM : DCD_ON -> DCD_OFF ",
1129 RV_TRACE_LEVEL_DEBUG_LOW);
1130 }
1131 }
1132 if (mask != 0x00)
1133 {
1134 atp_set_signal(atp_gsm_sw_id,gsm_port_nb,new_signal,mask);
1135 }
1136 }
1137
1138
1139
1140 /******************************************************************************
1141 * Function name: atp_gsm_init_port
1142 *
1143 * Description : This function initialise the variable related to a port
1144 *
1145 *
1146 *
1147 *
1148 * Return : RV_OK
1149 *
1150 * History : 0.1 (10-Jully-2000)
1151 *
1152 ******************************************************************************/
1153 T_RV_RET atp_gsm_init_port(T_ATP_GSM_PORT_STRUCT * port_p)
1154 {
1155 port_p->cmd_status = CMD_NOT_PENDING;
1156 port_p->gsm_tx_data_left = 0;
1157 port_p->atp_tx_data_activity = ATP_NOT_ACTIVE;
1158 port_p->bt_max_payload = temp_bt_max_payload;
1159 return RV_OK;
1160 }
1161
1162
1163 /******************************************************************************
1164 * Function name: atp_gsm_get_new_port_nb
1165 *
1166 * Description : Provide a new available port number if possible. Otherwise, return
1167 * error
1168 *
1169 *
1170 *
1171 * Return : RV_OK
1172 *
1173 * History : 0.1 (10-Jully-2000)
1174 *
1175 ******************************************************************************/
1176 T_RV_RET atp_gsm_get_new_port_nb(UINT8 * port_nb)
1177 {
1178 UINT8 i;
1179
1180 for(i=0;i<ATP_MAX_NB_OF_PORT_SUPPORTED_BY_GSM;i++)
1181 {
1182 if (port_array[i] == NULL)
1183 {
1184 *port_nb = i;
1185 return RV_OK;
1186 }
1187 }
1188 *port_nb = 0xFF;
1189 return RV_NOT_SUPPORTED;
1190 }