1 /******************************************************************************
2 *
3 * Copyright (C) 2010-2012 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 /******************************************************************************
20 *
21 * This file contains function of the NCI unit to format and send NCI
22 * commands (for DH).
23 *
24 ******************************************************************************/
25 #include <string.h>
26 #include "nfc_target.h"
27
28 #if NFC_INCLUDED == TRUE
29 #include "nci_defs.h"
30 #include "nci_hmsgs.h"
31 #include "nfc_api.h"
32 #include "nfc_int.h"
33
34 /*******************************************************************************
35 **
36 ** Function nci_snd_core_reset
37 **
38 ** Description compose and send CORE RESET command to command queue
39 **
40 ** Returns status
41 **
42 *******************************************************************************/
nci_snd_core_reset(UINT8 reset_type)43 UINT8 nci_snd_core_reset (UINT8 reset_type)
44 {
45 BT_HDR *p;
46 UINT8 *pp;
47
48 if ((p = NCI_GET_CMD_BUF (NCI_CORE_PARAM_SIZE_RESET)) == NULL)
49 return (NCI_STATUS_FAILED);
50
51 p->event = BT_EVT_TO_NFC_NCI;
52 p->len = NCI_MSG_HDR_SIZE + NCI_CORE_PARAM_SIZE_RESET;
53 p->offset = NCI_MSG_OFFSET_SIZE;
54 p->layer_specific = 0;
55 pp = (UINT8 *) (p + 1) + p->offset;
56
57 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_CORE);
58 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_CORE_RESET);
59 UINT8_TO_STREAM (pp, NCI_CORE_PARAM_SIZE_RESET);
60 UINT8_TO_STREAM (pp, reset_type);
61
62 nfc_ncif_send_cmd (p);
63 return (NCI_STATUS_OK);
64 }
65
66 /*******************************************************************************
67 **
68 ** Function nci_snd_core_init
69 **
70 ** Description compose and send CORE INIT command to command queue
71 **
72 ** Returns status
73 **
74 *******************************************************************************/
nci_snd_core_init(void)75 UINT8 nci_snd_core_init (void)
76 {
77 BT_HDR *p;
78 UINT8 *pp;
79
80 if ((p = NCI_GET_CMD_BUF (NCI_CORE_PARAM_SIZE_INIT)) == NULL)
81 return (NCI_STATUS_FAILED);
82
83 p->event = BT_EVT_TO_NFC_NCI;
84 p->len = NCI_MSG_HDR_SIZE + NCI_CORE_PARAM_SIZE_INIT;
85 p->offset = NCI_MSG_OFFSET_SIZE;
86 p->layer_specific = 0;
87 pp = (UINT8 *) (p + 1) + p->offset;
88
89 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_CORE);
90 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_CORE_INIT);
91 UINT8_TO_STREAM (pp, NCI_CORE_PARAM_SIZE_INIT);
92
93 nfc_ncif_send_cmd (p);
94 return (NCI_STATUS_OK);
95 }
96
97 /*******************************************************************************
98 **
99 ** Function nci_snd_core_get_config
100 **
101 ** Description compose and send CORE GET_CONFIG command to command queue
102 **
103 ** Returns status
104 **
105 *******************************************************************************/
nci_snd_core_get_config(UINT8 * param_ids,UINT8 num_ids)106 UINT8 nci_snd_core_get_config (UINT8 *param_ids, UINT8 num_ids)
107 {
108 BT_HDR *p;
109 UINT8 *pp;
110
111 if ((p = NCI_GET_CMD_BUF (num_ids)) == NULL)
112 return (NCI_STATUS_FAILED);
113
114 p->event = BT_EVT_TO_NFC_NCI;
115 p->len = NCI_MSG_HDR_SIZE + num_ids + 1;
116 p->offset = NCI_MSG_OFFSET_SIZE;
117 p->layer_specific = 0;
118 pp = (UINT8 *) (p + 1) + p->offset;
119
120 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_CORE);
121 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_CORE_GET_CONFIG);
122 UINT8_TO_STREAM (pp, (UINT8) (num_ids + 1));
123 UINT8_TO_STREAM (pp, num_ids);
124 ARRAY_TO_STREAM (pp, param_ids, num_ids);
125
126 nfc_ncif_send_cmd (p);
127 return (NCI_STATUS_OK);
128 }
129
130 /*******************************************************************************
131 **
132 ** Function nci_snd_core_set_config
133 **
134 ** Description compose and send CORE SET_CONFIG command to command queue
135 **
136 ** Returns status
137 **
138 *******************************************************************************/
nci_snd_core_set_config(UINT8 * p_param_tlvs,UINT8 tlv_size)139 UINT8 nci_snd_core_set_config (UINT8 *p_param_tlvs, UINT8 tlv_size)
140 {
141 BT_HDR *p;
142 UINT8 *pp;
143 UINT8 num = 0, ulen, len, *pt;
144
145 if ((p = NCI_GET_CMD_BUF (tlv_size + 1)) == NULL)
146 return (NCI_STATUS_FAILED);
147
148 p->event = BT_EVT_TO_NFC_NCI;
149 p->len = NCI_MSG_HDR_SIZE + tlv_size + 1;
150 p->offset = NCI_MSG_OFFSET_SIZE;
151 pp = (UINT8 *) (p + 1) + p->offset;
152
153 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_CORE);
154 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_CORE_SET_CONFIG);
155 UINT8_TO_STREAM (pp, (UINT8) (tlv_size + 1));
156 len = tlv_size;
157 pt = p_param_tlvs;
158 while (len > 1)
159 {
160 len -= 2;
161 pt++;
162 num++;
163 ulen = *pt++;
164 pt += ulen;
165 if (len >= ulen)
166 {
167 len -= ulen;
168 }
169 else
170 {
171 GKI_freebuf (p);
172 return NCI_STATUS_FAILED;
173 }
174 }
175
176 UINT8_TO_STREAM (pp, num);
177 ARRAY_TO_STREAM (pp, p_param_tlvs, tlv_size);
178 nfc_ncif_send_cmd (p);
179
180 return (NCI_STATUS_OK);
181 }
182
183 /*******************************************************************************
184 **
185 ** Function nci_snd_core_conn_create
186 **
187 ** Description compose and send CORE CONN_CREATE command to command queue
188 **
189 ** Returns status
190 **
191 *******************************************************************************/
nci_snd_core_conn_create(UINT8 dest_type,UINT8 num_tlv,UINT8 tlv_size,UINT8 * p_param_tlvs)192 UINT8 nci_snd_core_conn_create (UINT8 dest_type, UINT8 num_tlv, UINT8 tlv_size, UINT8 *p_param_tlvs)
193 {
194 BT_HDR *p;
195 UINT8 *pp;
196 UINT8 size = NCI_CORE_PARAM_SIZE_CON_CREATE+tlv_size;
197
198 if ((p = NCI_GET_CMD_BUF (size)) == NULL)
199 return (NCI_STATUS_FAILED);
200
201 p->event = BT_EVT_TO_NFC_NCI;
202 p->len = NCI_MSG_HDR_SIZE + NCI_CORE_PARAM_SIZE_CON_CREATE;
203 p->offset = NCI_MSG_OFFSET_SIZE;
204 p->layer_specific = 0;
205 pp = (UINT8 *) (p + 1) + p->offset;
206
207 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_CORE);
208 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_CORE_CONN_CREATE);
209 UINT8_TO_STREAM (pp, size);
210 UINT8_TO_STREAM (pp, dest_type);
211 UINT8_TO_STREAM (pp, num_tlv);
212 if (tlv_size)
213 {
214 ARRAY_TO_STREAM (pp, p_param_tlvs, tlv_size);
215 p->len += tlv_size;
216 }
217
218 nfc_ncif_send_cmd (p);
219 return (NCI_STATUS_OK);
220 }
221
222 /*******************************************************************************
223 **
224 ** Function nci_snd_core_conn_close
225 **
226 ** Description compose and send CORE CONN_CLOSE command to command queue
227 **
228 ** Returns status
229 **
230 *******************************************************************************/
nci_snd_core_conn_close(UINT8 conn_id)231 UINT8 nci_snd_core_conn_close (UINT8 conn_id)
232 {
233 BT_HDR *p;
234 UINT8 *pp;
235
236 if ((p = NCI_GET_CMD_BUF (NCI_CORE_PARAM_SIZE_CON_CLOSE)) == NULL)
237 return (NCI_STATUS_FAILED);
238
239 p->event = BT_EVT_TO_NFC_NCI;
240 p->len = NCI_MSG_HDR_SIZE + NCI_CORE_PARAM_SIZE_CON_CLOSE;
241 p->offset = NCI_MSG_OFFSET_SIZE;
242 p->layer_specific = 0;
243 pp = (UINT8 *) (p + 1) + p->offset;
244
245 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_CORE);
246 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_CORE_CONN_CLOSE);
247 UINT8_TO_STREAM (pp, NCI_CORE_PARAM_SIZE_CON_CLOSE);
248 UINT8_TO_STREAM (pp, conn_id);
249
250 nfc_ncif_send_cmd (p);
251 return (NCI_STATUS_OK);
252 }
253
254
255 #if (NFC_NFCEE_INCLUDED == TRUE)
256 #if (NFC_RW_ONLY == FALSE)
257 /*******************************************************************************
258 **
259 ** Function nci_snd_nfcee_discover
260 **
261 ** Description compose and send NFCEE Management NFCEE_DISCOVER command
262 ** to command queue
263 **
264 ** Returns status
265 **
266 *******************************************************************************/
nci_snd_nfcee_discover(UINT8 discover_action)267 UINT8 nci_snd_nfcee_discover (UINT8 discover_action)
268 {
269 BT_HDR *p;
270 UINT8 *pp;
271
272 if ((p = NCI_GET_CMD_BUF (NCI_PARAM_SIZE_DISCOVER_NFCEE)) == NULL)
273 return (NCI_STATUS_FAILED);
274
275 p->event = BT_EVT_TO_NFC_NCI;
276 p->len = NCI_MSG_HDR_SIZE + NCI_PARAM_SIZE_DISCOVER_NFCEE;
277 p->offset = NCI_MSG_OFFSET_SIZE;
278 p->layer_specific = 0;
279 pp = (UINT8 *) (p + 1) + p->offset;
280
281 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_EE_MANAGE);
282 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_NFCEE_DISCOVER);
283 UINT8_TO_STREAM (pp, NCI_PARAM_SIZE_DISCOVER_NFCEE);
284 UINT8_TO_STREAM (pp, discover_action);
285
286 nfc_ncif_send_cmd (p);
287 return (NCI_STATUS_OK);
288 }
289
290 /*******************************************************************************
291 **
292 ** Function nci_snd_nfcee_mode_set
293 **
294 ** Description compose and send NFCEE Management NFCEE MODE SET command
295 ** to command queue
296 **
297 ** Returns status
298 **
299 *******************************************************************************/
nci_snd_nfcee_mode_set(UINT8 nfcee_id,UINT8 nfcee_mode)300 UINT8 nci_snd_nfcee_mode_set (UINT8 nfcee_id, UINT8 nfcee_mode)
301 {
302 BT_HDR *p;
303 UINT8 *pp;
304
305 if ((p = NCI_GET_CMD_BUF (NCI_CORE_PARAM_SIZE_NFCEE_MODE_SET)) == NULL)
306 return (NCI_STATUS_FAILED);
307
308 p->event = BT_EVT_TO_NFC_NCI;
309 p->len = NCI_MSG_HDR_SIZE + NCI_CORE_PARAM_SIZE_NFCEE_MODE_SET;
310 p->offset = NCI_MSG_OFFSET_SIZE;
311 p->layer_specific = 0;
312 pp = (UINT8 *) (p + 1) + p->offset;
313
314 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_EE_MANAGE);
315 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_NFCEE_MODE_SET);
316 UINT8_TO_STREAM (pp, NCI_CORE_PARAM_SIZE_NFCEE_MODE_SET);
317 UINT8_TO_STREAM (pp, nfcee_id);
318 UINT8_TO_STREAM (pp, nfcee_mode);
319
320 nfc_ncif_send_cmd (p);
321 return (NCI_STATUS_OK);
322 }
323 #endif
324 #endif
325
326 /*******************************************************************************
327 **
328 ** Function nci_snd_discover_cmd
329 **
330 ** Description compose and send RF Management DISCOVER command to command queue
331 **
332 ** Returns status
333 **
334 *******************************************************************************/
nci_snd_discover_cmd(UINT8 num,tNCI_DISCOVER_PARAMS * p_param)335 UINT8 nci_snd_discover_cmd (UINT8 num, tNCI_DISCOVER_PARAMS *p_param)
336 {
337 BT_HDR *p;
338 UINT8 *pp, *p_size, *p_start;
339 int xx;
340 int size;
341
342 size = num * sizeof (tNCI_DISCOVER_PARAMS) + 1;
343 if ((p = NCI_GET_CMD_BUF (size)) == NULL)
344 return (NCI_STATUS_FAILED);
345
346 p->event = BT_EVT_TO_NFC_NCI;
347 p->offset = NCI_MSG_OFFSET_SIZE;
348 p->layer_specific = 0;
349 pp = (UINT8 *) (p + 1) + p->offset;
350
351 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE);
352 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_DISCOVER);
353 p_size = pp;
354 pp++;
355 p_start = pp;
356 UINT8_TO_STREAM (pp, num);
357 for (xx=0; xx<num; xx++)
358 {
359 UINT8_TO_STREAM (pp, p_param[xx].type);
360 UINT8_TO_STREAM (pp, p_param[xx].frequency);
361 }
362 *p_size = (UINT8) (pp - p_start);
363 p->len = NCI_MSG_HDR_SIZE + *p_size;
364
365 nfc_ncif_send_cmd (p);
366 return (NCI_STATUS_OK);
367 }
368
369 /*******************************************************************************
370 **
371 ** Function nci_snd_discover_select_cmd
372 **
373 ** Description compose and send RF Management DISCOVER SELECT command
374 ** to command queue
375 **
376 ** Returns status
377 **
378 *******************************************************************************/
nci_snd_discover_select_cmd(UINT8 rf_disc_id,UINT8 protocol,UINT8 rf_interface)379 UINT8 nci_snd_discover_select_cmd (UINT8 rf_disc_id, UINT8 protocol, UINT8 rf_interface)
380 {
381 BT_HDR *p;
382 UINT8 *pp;
383
384 if ((p = NCI_GET_CMD_BUF (NCI_DISCOVER_PARAM_SIZE_SELECT)) == NULL)
385 return (NCI_STATUS_FAILED);
386
387 p->event = BT_EVT_TO_NFC_NCI;
388 p->len = NCI_MSG_HDR_SIZE + NCI_DISCOVER_PARAM_SIZE_SELECT;
389 p->offset = NCI_MSG_OFFSET_SIZE;
390 p->layer_specific = 0;
391 pp = (UINT8 *) (p + 1) + p->offset;
392
393 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE);
394 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_DISCOVER_SELECT);
395 UINT8_TO_STREAM (pp, NCI_DISCOVER_PARAM_SIZE_SELECT);
396 UINT8_TO_STREAM (pp, rf_disc_id);
397 UINT8_TO_STREAM (pp, protocol);
398 UINT8_TO_STREAM (pp, rf_interface);
399
400 nfc_ncif_send_cmd (p);
401 return (NCI_STATUS_OK);
402 }
403
404 /*******************************************************************************
405 **
406 ** Function nci_snd_deactivate_cmd
407 **
408 ** Description compose and send RF Management DEACTIVATE command
409 ** to command queue
410 **
411 ** Returns status
412 **
413 *******************************************************************************/
nci_snd_deactivate_cmd(UINT8 de_act_type)414 UINT8 nci_snd_deactivate_cmd (UINT8 de_act_type )
415 {
416 BT_HDR *p;
417 UINT8 *pp;
418
419 if ((p = NCI_GET_CMD_BUF (NCI_DISCOVER_PARAM_SIZE_DEACT)) == NULL)
420 return (NCI_STATUS_FAILED);
421
422 p->event = BT_EVT_TO_NFC_NCI;
423 p->len = NCI_MSG_HDR_SIZE + NCI_DISCOVER_PARAM_SIZE_DEACT;
424 p->offset = NCI_MSG_OFFSET_SIZE;
425 p->layer_specific = 0;
426 pp = (UINT8 *) (p + 1) + p->offset;
427
428 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE);
429 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_DEACTIVATE);
430 UINT8_TO_STREAM (pp, NCI_DISCOVER_PARAM_SIZE_DEACT);
431 UINT8_TO_STREAM (pp, de_act_type);
432
433 nfc_ncif_send_cmd (p);
434 return (NCI_STATUS_OK);
435 }
436
437 /*******************************************************************************
438 **
439 ** Function nci_snd_discover_map_cmd
440 **
441 ** Description compose and send RF Management DISCOVER MAP command
442 ** to command queue
443 **
444 ** Returns status
445 **
446 *******************************************************************************/
nci_snd_discover_map_cmd(UINT8 num,tNCI_DISCOVER_MAPS * p_maps)447 UINT8 nci_snd_discover_map_cmd (UINT8 num, tNCI_DISCOVER_MAPS *p_maps)
448 {
449 BT_HDR *p;
450 UINT8 *pp, *p_size, *p_start;
451 int xx;
452 int size;
453
454 size = num * sizeof (tNCI_DISCOVER_MAPS) + 1;
455
456 if ((p = NCI_GET_CMD_BUF (size)) == NULL)
457 return (NCI_STATUS_FAILED);
458
459 p->event = BT_EVT_TO_NFC_NCI;
460 p->offset = NCI_MSG_OFFSET_SIZE;
461 p->layer_specific = 0;
462 pp = (UINT8 *) (p + 1) + p->offset;
463
464 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE);
465 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_DISCOVER_MAP);
466 p_size = pp;
467 pp++;
468 p_start = pp;
469 UINT8_TO_STREAM (pp, num);
470 for (xx = 0; xx < num; xx++)
471 {
472 UINT8_TO_STREAM (pp, p_maps[xx].protocol);
473 UINT8_TO_STREAM (pp, p_maps[xx].mode);
474 UINT8_TO_STREAM (pp, p_maps[xx].intf_type);
475 }
476 *p_size = (UINT8) (pp - p_start);
477 p->len = NCI_MSG_HDR_SIZE + *p_size;
478 nfc_ncif_send_cmd (p);
479 return (NCI_STATUS_OK);
480 }
481 /*******************************************************************************
482 **
483 ** Function nci_snd_t3t_polling
484 **
485 ** Description compose and send RF Management T3T POLLING command
486 ** to command queue
487 **
488 ** Returns status
489 **
490 *******************************************************************************/
nci_snd_t3t_polling(UINT16 system_code,UINT8 rc,UINT8 tsn)491 UINT8 nci_snd_t3t_polling (UINT16 system_code, UINT8 rc, UINT8 tsn)
492 {
493 BT_HDR *p;
494 UINT8 *pp;
495
496 if ((p = NCI_GET_CMD_BUF (NCI_RF_PARAM_SIZE_T3T_POLLING)) == NULL)
497 return (NCI_STATUS_FAILED);
498
499 p->event = BT_EVT_TO_NFC_NCI;
500 p->len = NCI_MSG_HDR_SIZE + NCI_RF_PARAM_SIZE_T3T_POLLING;
501 p->offset = NCI_MSG_OFFSET_SIZE;
502 p->layer_specific = 0;
503 pp = (UINT8 *) (p + 1) + p->offset;
504
505 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE);
506 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_T3T_POLLING);
507 UINT8_TO_STREAM (pp, NCI_RF_PARAM_SIZE_T3T_POLLING);
508 UINT16_TO_BE_STREAM (pp, system_code);
509 UINT8_TO_STREAM (pp, rc);
510 UINT8_TO_STREAM (pp, tsn);
511
512 nfc_ncif_send_cmd (p);
513 return (NCI_STATUS_OK);
514 }
515
516 /*******************************************************************************
517 **
518 ** Function nci_snd_parameter_update_cmd
519 **
520 ** Description compose and send RF Management RF Communication Parameter
521 ** Update commandto command queue
522 **
523 ** Returns status
524 **
525 *******************************************************************************/
nci_snd_parameter_update_cmd(UINT8 * p_param_tlvs,UINT8 tlv_size)526 UINT8 nci_snd_parameter_update_cmd (UINT8 *p_param_tlvs, UINT8 tlv_size)
527 {
528 BT_HDR *p;
529 UINT8 *pp;
530 UINT8 num = 0, ulen, len, *pt;
531
532 if ((p = NCI_GET_CMD_BUF (tlv_size + 1)) == NULL)
533 return (NCI_STATUS_FAILED);
534
535 p->event = BT_EVT_TO_NFC_NCI;
536 p->len = NCI_MSG_HDR_SIZE + tlv_size + 1;
537 p->offset = NCI_MSG_OFFSET_SIZE;
538 pp = (UINT8 *) (p + 1) + p->offset;
539
540 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE);
541 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_PARAMETER_UPDATE);
542 UINT8_TO_STREAM (pp, (UINT8) (tlv_size + 1));
543 len = tlv_size;
544 pt = p_param_tlvs;
545 while (len > 1)
546 {
547 len -= 2;
548 pt++;
549 num++;
550 ulen = *pt++;
551 pt += ulen;
552 if (len >= ulen)
553 {
554 len -= ulen;
555 }
556 else
557 {
558 GKI_freebuf (p);
559 return NCI_STATUS_FAILED;
560 }
561 }
562
563 UINT8_TO_STREAM (pp, num);
564 ARRAY_TO_STREAM (pp, p_param_tlvs, tlv_size);
565 nfc_ncif_send_cmd (p);
566
567 return (NCI_STATUS_OK);
568 }
569
570 #if (NFC_NFCEE_INCLUDED == TRUE)
571 #if (NFC_RW_ONLY == FALSE)
572 /*******************************************************************************
573 **
574 ** Function nci_snd_set_routing_cmd
575 **
576 ** Description compose and send RF Management SET_LISTEN_MODE_ROUTING command
577 ** to command queue
578 **
579 ** Returns status
580 **
581 *******************************************************************************/
nci_snd_set_routing_cmd(BOOLEAN more,UINT8 target_handle,UINT8 num_tlv,UINT8 tlv_size,UINT8 * p_param_tlvs)582 UINT8 nci_snd_set_routing_cmd (BOOLEAN more, UINT8 target_handle, UINT8 num_tlv, UINT8 tlv_size, UINT8 *p_param_tlvs)
583 {
584 BT_HDR *p;
585 UINT8 *pp;
586 UINT8 size = tlv_size + 2;
587
588 if (tlv_size == 0)
589 {
590 /* just to terminate routing table
591 * 2 bytes (more=FALSE and num routing entries=0) */
592 size = 2;
593 }
594
595 if ((p = NCI_GET_CMD_BUF(size)) == NULL)
596 return (NCI_STATUS_FAILED);
597
598 p->event = BT_EVT_TO_NFC_NCI;
599 p->offset = NCI_MSG_OFFSET_SIZE;
600 p->len = NCI_MSG_HDR_SIZE + size;
601 p->layer_specific = 0;
602 pp = (UINT8 *) (p + 1) + p->offset;
603
604 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE);
605 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_SET_ROUTING);
606 UINT8_TO_STREAM (pp, size);
607 UINT8_TO_STREAM (pp, more);
608 if (size == 2)
609 {
610 UINT8_TO_STREAM (pp, 0);
611 }
612 else
613 {
614 UINT8_TO_STREAM (pp, num_tlv);
615 ARRAY_TO_STREAM (pp, p_param_tlvs, tlv_size);
616 }
617 nfc_ncif_send_cmd (p);
618
619 return (NCI_STATUS_OK);
620 }
621
622 /*******************************************************************************
623 **
624 ** Function nci_snd_get_routing_cmd
625 **
626 ** Description compose and send RF Management GET_LISTEN_MODE_ROUTING command
627 ** to command queue
628 **
629 ** Returns status
630 **
631 *******************************************************************************/
nci_snd_get_routing_cmd(void)632 UINT8 nci_snd_get_routing_cmd (void)
633 {
634 BT_HDR *p;
635 UINT8 *pp;
636 UINT8 param_size = 0;
637
638 if ((p = NCI_GET_CMD_BUF (param_size)) == NULL)
639 return (NCI_STATUS_FAILED);
640
641 p->event = BT_EVT_TO_NFC_NCI;
642 p->len = NCI_MSG_HDR_SIZE + param_size;
643 p->offset = NCI_MSG_OFFSET_SIZE;
644 p->layer_specific = 0;
645 pp = (UINT8 *) (p + 1) + p->offset;
646
647 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE);
648 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_GET_ROUTING);
649 UINT8_TO_STREAM (pp, param_size);
650
651 nfc_ncif_send_cmd (p);
652 return (NCI_STATUS_OK);
653 }
654 #endif
655 #endif
656
657
658 #endif /* NFC_INCLUDED == TRUE*/
659