1/******************************************************************************
2 *
3 *  Copyright (C) 1999-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 the PORT API definitions
22 *
23 ******************************************************************************/
24#ifndef PORT_API_H
25#define PORT_API_H
26
27#include "bt_target.h"
28
29/*****************************************************************************
30**  Constants and Types
31*****************************************************************************/
32
33/*
34** Define port settings structure send from the application in the
35** set settings request, or to the application in the set settings indication.
36*/
37typedef struct
38{
39
40#define PORT_BAUD_RATE_2400       0x00
41#define PORT_BAUD_RATE_4800       0x01
42#define PORT_BAUD_RATE_7200       0x02
43#define PORT_BAUD_RATE_9600       0x03
44#define PORT_BAUD_RATE_19200      0x04
45#define PORT_BAUD_RATE_38400      0x05
46#define PORT_BAUD_RATE_57600      0x06
47#define PORT_BAUD_RATE_115200     0x07
48#define PORT_BAUD_RATE_230400     0x08
49
50    UINT8  baud_rate;
51
52#define PORT_5_BITS               0x00
53#define PORT_6_BITS               0x01
54#define PORT_7_BITS               0x02
55#define PORT_8_BITS               0x03
56
57    UINT8  byte_size;
58
59#define PORT_ONESTOPBIT           0x00
60#define PORT_ONE5STOPBITS         0x01
61    UINT8   stop_bits;
62
63#define PORT_PARITY_NO            0x00
64#define PORT_PARITY_YES           0x01
65    UINT8   parity;
66
67#define PORT_ODD_PARITY           0x00
68#define PORT_EVEN_PARITY          0x01
69#define PORT_MARK_PARITY          0x02
70#define PORT_SPACE_PARITY         0x03
71
72    UINT8   parity_type;
73
74#define PORT_FC_OFF               0x00
75#define PORT_FC_XONXOFF_ON_INPUT  0x01
76#define PORT_FC_XONXOFF_ON_OUTPUT 0x02
77#define PORT_FC_CTS_ON_INPUT      0x04
78#define PORT_FC_CTS_ON_OUTPUT     0x08
79#define PORT_FC_DSR_ON_INPUT      0x10
80#define PORT_FC_DSR_ON_OUTPUT     0x20
81
82    UINT8 fc_type;
83
84    UINT8 rx_char1;
85
86#define PORT_XON_DC1              0x11
87    UINT8 xon_char;
88
89#define PORT_XOFF_DC3             0x13
90    UINT8 xoff_char;
91
92} tPORT_STATE;
93
94
95/*
96** Define the callback function prototypes.  Parameters are specific
97** to each event and are described bellow
98*/
99typedef int  (tPORT_DATA_CALLBACK) (UINT16 port_handle, void *p_data, UINT16 len);
100
101#define DATA_CO_CALLBACK_TYPE_INCOMING          1
102#define DATA_CO_CALLBACK_TYPE_OUTGOING_SIZE     2
103#define DATA_CO_CALLBACK_TYPE_OUTGOING          3
104typedef int  (tPORT_DATA_CO_CALLBACK) (UINT16 port_handle, UINT8* p_buf, UINT16 len, int type);
105
106typedef void (tPORT_CALLBACK) (UINT32 code, UINT16 port_handle);
107
108/*
109** Define events that registered application can receive in the callback
110*/
111
112#define PORT_EV_RXCHAR  0x00000001   /* Any Character received */
113#define PORT_EV_RXFLAG  0x00000002   /* Received certain character */
114#define PORT_EV_TXEMPTY 0x00000004   /* Transmitt Queue Empty */
115#define PORT_EV_CTS     0x00000008   /* CTS changed state */
116#define PORT_EV_DSR     0x00000010   /* DSR changed state */
117#define PORT_EV_RLSD    0x00000020   /* RLSD changed state */
118#define PORT_EV_BREAK   0x00000040   /* BREAK received */
119#define PORT_EV_ERR     0x00000080   /* Line status error occurred */
120#define PORT_EV_RING    0x00000100   /* Ring signal detected */
121#define PORT_EV_CTSS    0x00000400   /* CTS state */
122#define PORT_EV_DSRS    0x00000800   /* DSR state */
123#define PORT_EV_RLSDS   0x00001000   /* RLSD state */
124#define PORT_EV_OVERRUN 0x00002000   /* receiver buffer overrun */
125#define PORT_EV_TXCHAR  0x00004000   /* Any character transmitted */
126
127#define PORT_EV_CONNECTED    0x00000200  /* RFCOMM connection established */
128#define PORT_EV_CONNECT_ERR  0x00008000  /* Was not able to establish connection */
129                                     /* or disconnected */
130#define PORT_EV_FC      0x00010000   /* data flow enabled flag changed by remote */
131#define PORT_EV_FCS     0x00020000   /* data flow enable status true = enabled */
132
133/*
134** To register for events application should provide bitmask with
135** corresponding bit set
136*/
137
138#define PORT_MASK_ALL             (PORT_EV_RXCHAR | PORT_EV_TXEMPTY | PORT_EV_CTS | \
139                                   PORT_EV_DSR | PORT_EV_RLSD | PORT_EV_BREAK | \
140                                   PORT_EV_ERR | PORT_EV_RING | PORT_EV_CONNECT_ERR | \
141                                   PORT_EV_DSRS | PORT_EV_CTSS | PORT_EV_RLSDS | \
142                                   PORT_EV_RXFLAG | PORT_EV_TXCHAR | PORT_EV_OVERRUN | \
143                                   PORT_EV_FC | PORT_EV_FCS | PORT_EV_CONNECTED)
144
145
146/*
147** Define port result codes
148*/
149#define PORT_SUCCESS                0
150
151#define PORT_ERR_BASE               0
152
153#define PORT_UNKNOWN_ERROR          (PORT_ERR_BASE + 1)
154#define PORT_ALREADY_OPENED         (PORT_ERR_BASE + 2)
155#define PORT_CMD_PENDING            (PORT_ERR_BASE + 3)
156#define PORT_APP_NOT_REGISTERED     (PORT_ERR_BASE + 4)
157#define PORT_NO_MEM                 (PORT_ERR_BASE + 5)
158#define PORT_NO_RESOURCES           (PORT_ERR_BASE + 6)
159#define PORT_BAD_BD_ADDR            (PORT_ERR_BASE + 7)
160#define PORT_BAD_HANDLE             (PORT_ERR_BASE + 9)
161#define PORT_NOT_OPENED             (PORT_ERR_BASE + 10)
162#define PORT_LINE_ERR               (PORT_ERR_BASE + 11)
163#define PORT_START_FAILED           (PORT_ERR_BASE + 12)
164#define PORT_PAR_NEG_FAILED         (PORT_ERR_BASE + 13)
165#define PORT_PORT_NEG_FAILED        (PORT_ERR_BASE + 14)
166#define PORT_SEC_FAILED             (PORT_ERR_BASE + 15)
167#define PORT_PEER_CONNECTION_FAILED (PORT_ERR_BASE + 16)
168#define PORT_PEER_FAILED            (PORT_ERR_BASE + 17)
169#define PORT_PEER_TIMEOUT           (PORT_ERR_BASE + 18)
170#define PORT_CLOSED                 (PORT_ERR_BASE + 19)
171#define PORT_TX_FULL                (PORT_ERR_BASE + 20)
172#define PORT_LOCAL_CLOSED           (PORT_ERR_BASE + 21)
173#define PORT_LOCAL_TIMEOUT          (PORT_ERR_BASE + 22)
174#define PORT_TX_QUEUE_DISABLED      (PORT_ERR_BASE + 23)
175#define PORT_PAGE_TIMEOUT           (PORT_ERR_BASE + 24)
176#define PORT_INVALID_SCN            (PORT_ERR_BASE + 25)
177
178#define PORT_ERR_MAX                (PORT_ERR_BASE + 26)
179
180/*****************************************************************************
181**  External Function Declarations
182*****************************************************************************/
183#ifdef __cplusplus
184extern "C"
185{
186#endif
187
188/*******************************************************************************
189**
190** Function         RFCOMM_CreateConnection
191**
192** Description      RFCOMM_CreateConnection function is used from the application
193**                  to establish serial port connection to the peer device,
194**                  or allow RFCOMM to accept a connection from the peer
195**                  application.
196**
197** Parameters:      scn          - Service Channel Number as registered with
198**                                 the SDP (server) or obtained using SDP from
199**                                 the peer device (client).
200**                  is_server    - TRUE if requesting application is a server
201**                  mtu          - Maximum frame size the application can accept
202**                  bd_addr      - BD_ADDR of the peer (client)
203**                  mask         - specifies events to be enabled.  A value
204**                                 of zero disables all events.
205**                  p_handle     - OUT pointer to the handle.
206**                  p_mgmt_cb    - pointer to callback function to receive
207**                                 connection up/down events.
208** Notes:
209**
210** Server can call this function with the same scn parameter multiple times if
211** it is ready to accept multiple simulteneous connections.
212**
213** DLCI for the connection is (scn * 2 + 1) if client originates connection on
214** existing none initiator multiplexer channel.  Otherwise it is (scn * 2).
215** For the server DLCI can be changed later if client will be calling it using
216** (scn * 2 + 1) dlci.
217**
218*******************************************************************************/
219extern int RFCOMM_CreateConnection (UINT16 uuid, UINT8 scn,
220                                            BOOLEAN is_server, UINT16 mtu,
221                                            BD_ADDR bd_addr, UINT16 *p_handle,
222                                            tPORT_CALLBACK *p_mgmt_cb);
223
224
225/*******************************************************************************
226**
227** Function         RFCOMM_RemoveConnection
228**
229** Description      This function is called to close the specified connection.
230**
231** Parameters:      handle     - Handle of the port returned in the Open
232**
233*******************************************************************************/
234extern int RFCOMM_RemoveConnection (UINT16 handle);
235
236
237/*******************************************************************************
238**
239** Function         RFCOMM_RemoveServer
240**
241** Description      This function is called to close the server port.
242**
243** Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
244**
245*******************************************************************************/
246extern int RFCOMM_RemoveServer (UINT16 handle);
247
248
249/*******************************************************************************
250**
251** Function         PORT_SetEventCallback
252**
253** Description      Set event callback the specified connection.
254**
255** Parameters:      handle       - Handle of the port returned in the Open
256**                  p_callback   - address of the callback function which should
257**                                 be called from the RFCOMM when an event
258**                                 specified in the mask occurs.
259**
260*******************************************************************************/
261extern int PORT_SetEventCallback (UINT16 port_handle,
262                                  tPORT_CALLBACK *p_port_cb);
263
264/*******************************************************************************
265**
266** Function         PORT_ClearKeepHandleFlag
267**
268** Description      This function is called to clear the keep handle flag
269**                  which will cause not to keep the port handle open when closed
270** Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
271**
272*******************************************************************************/
273int PORT_ClearKeepHandleFlag (UINT16 port_handle);
274
275/*******************************************************************************
276**
277** Function         PORT_SetEventCallback
278**
279** Description      Set event data callback the specified connection.
280**
281** Parameters:      handle       - Handle of the port returned in the Open
282**                  p_callback   - address of the callback function which should
283**                                 be called from the RFCOMM when a data
284**                                 packet is received.
285**
286*******************************************************************************/
287extern int PORT_SetDataCallback (UINT16 port_handle,
288                                 tPORT_DATA_CALLBACK *p_cb);
289
290extern int PORT_SetDataCOCallback (UINT16 port_handle, tPORT_DATA_CO_CALLBACK *p_port_cb);
291/*******************************************************************************
292**
293** Function         PORT_SetEventMask
294**
295** Description      This function is called to close the specified connection.
296**
297** Parameters:      handle - Handle of the port returned in the Open
298**                  mask   - specifies events to be enabled.  A value
299**                           of zero disables all events.
300**
301*******************************************************************************/
302extern int PORT_SetEventMask (UINT16 port_handle, UINT32 mask);
303
304
305/*******************************************************************************
306**
307** Function         PORT_CheckConnection
308**
309** Description      This function returns PORT_SUCCESS if connection referenced
310**                  by handle is up and running
311**
312** Parameters:      handle     - Handle of the port returned in the Open
313**                  bd_addr    - OUT bd_addr of the peer
314**                  p_lcid     - OUT L2CAP's LCID
315**
316*******************************************************************************/
317extern int PORT_CheckConnection (UINT16 handle, BD_ADDR bd_addr,
318                                 UINT16 *p_lcid);
319
320/*******************************************************************************
321**
322** Function         PORT_IsOpening
323**
324** Description      This function returns TRUE if there is any RFCOMM connection
325**                  opening in process.
326**
327** Parameters:      TRUE if any connection opening is found
328**                  bd_addr    - bd_addr of the peer
329**
330*******************************************************************************/
331extern BOOLEAN PORT_IsOpening (BD_ADDR bd_addr);
332
333/*******************************************************************************
334**
335** Function         PORT_SetState
336**
337** Description      This function configures connection according to the
338**                  specifications in the tPORT_STATE structure.
339**
340** Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
341**                  p_settings - Pointer to a tPORT_STATE structure containing
342**                               configuration information for the connection.
343**
344*******************************************************************************/
345extern int PORT_SetState (UINT16 handle, tPORT_STATE *p_settings);
346
347/*******************************************************************************
348**
349** Function         PORT_GetRxQueueCnt
350**
351** Description      This function return number of buffers on the rx queue.
352**
353** Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
354**                  p_rx_queue_count - Pointer to return queue count in.
355**
356*******************************************************************************/
357extern int PORT_GetRxQueueCnt (UINT16 handle, UINT16 *p_rx_queue_count);
358
359/*******************************************************************************
360**
361** Function         PORT_GetState
362**
363** Description      This function is called to fill tPORT_STATE structure
364**                  with the current control settings for the port
365**
366** Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
367**                  p_settings - Pointer to a tPORT_STATE structure in which
368**                               configuration information is returned.
369**
370*******************************************************************************/
371extern int PORT_GetState (UINT16 handle, tPORT_STATE *p_settings);
372
373
374/*******************************************************************************
375**
376** Function         PORT_Control
377**
378** Description      This function directs a specified connection to pass control
379**                  control information to the peer device.
380**
381** Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
382**                  signal     - specify the function to be passed
383**
384*******************************************************************************/
385#define PORT_SET_DTRDSR         0x01
386#define PORT_CLR_DTRDSR         0x02
387#define PORT_SET_CTSRTS         0x03
388#define PORT_CLR_CTSRTS         0x04
389#define PORT_SET_RI             0x05        /* DCE only */
390#define PORT_CLR_RI             0x06        /* DCE only */
391#define PORT_SET_DCD            0x07        /* DCE only */
392#define PORT_CLR_DCD            0x08        /* DCE only */
393#define PORT_BREAK              0x09        /* Break event */
394
395extern int PORT_Control (UINT16 handle, UINT8 signal);
396
397
398/*******************************************************************************
399**
400** Function         PORT_FlowControl
401**
402** Description      This function directs a specified connection to pass
403**                  flow control message to the peer device.  Enable flag passed
404**                  shows if port can accept more data.
405**
406** Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
407**                  enable     - enables data flow
408**
409*******************************************************************************/
410extern int PORT_FlowControl (UINT16 handle, BOOLEAN enable);
411
412
413/*******************************************************************************
414**
415** Function         PORT_GetModemStatus
416**
417** Description      This function retrieves modem control signals.  Normally
418**                  application will call this function after a callback
419**                  function is called with notification that one of signals
420**                  has been changed.
421**
422** Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
423**                               callback.
424**                  p_signal   - specify the pointer to control signals info
425**
426*******************************************************************************/
427#define PORT_DTRDSR_ON          0x01
428#define PORT_CTSRTS_ON          0x02
429#define PORT_RING_ON            0x04
430#define PORT_DCD_ON             0x08
431
432/*
433** Define default initial local modem signals state set after connection established
434*/
435#define PORT_OBEX_DEFAULT_SIGNAL_STATE  (PORT_DTRDSR_ON | PORT_CTSRTS_ON | PORT_DCD_ON)
436#define PORT_SPP_DEFAULT_SIGNAL_STATE   (PORT_DTRDSR_ON | PORT_CTSRTS_ON | PORT_DCD_ON)
437#define PORT_PPP_DEFAULT_SIGNAL_STATE   (PORT_DTRDSR_ON | PORT_CTSRTS_ON | PORT_DCD_ON)
438#define PORT_DUN_DEFAULT_SIGNAL_STATE   (PORT_DTRDSR_ON | PORT_CTSRTS_ON)
439
440extern int PORT_GetModemStatus (UINT16 handle, UINT8 *p_control_signal);
441
442
443/*******************************************************************************
444**
445** Function         PORT_ClearError
446**
447** Description      This function retreives information about a communications
448**                  error and reports current status of a connection.  The
449**                  function should be called when an error occures to clear
450**                  the connection error flag and to enable additional read
451**                  and write operations.
452**
453** Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
454**                  p_errors   - pointer of the variable to receive error codes
455**                  p_status   - pointer to the tPORT_STATUS structur to receive
456**                               connection status
457**
458*******************************************************************************/
459
460#define PORT_ERR_BREAK      0x01    /* Break condition occured on the peer device */
461#define PORT_ERR_OVERRUN    0x02    /* Overrun is reported by peer device */
462#define PORT_ERR_FRAME      0x04    /* Framing error reported by peer device */
463#define PORT_ERR_RXOVER     0x08    /* Input queue overflow occured */
464#define PORT_ERR_TXFULL     0x10    /* Output queue overflow occured */
465
466typedef struct
467{
468#define PORT_FLAG_CTS_HOLD  0x01    /* Tx is waiting for CTS signal */
469#define PORT_FLAG_DSR_HOLD  0x02    /* Tx is waiting for DSR signal */
470#define PORT_FLAG_RLSD_HOLD 0x04    /* Tx is waiting for RLSD signal */
471
472    UINT16  flags;
473    UINT16  in_queue_size;          /* Number of bytes in the input queue */
474    UINT16  out_queue_size;         /* Number of bytes in the output queue */
475    UINT16  mtu_size;               /* peer MTU size */
476} tPORT_STATUS;
477
478
479extern int PORT_ClearError (UINT16 handle, UINT16 *p_errors,
480                            tPORT_STATUS *p_status);
481
482
483/*******************************************************************************
484**
485** Function         PORT_SendError
486**
487** Description      This function send a communications error to the peer device
488**
489** Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
490**                  errors     - receive error codes
491**
492*******************************************************************************/
493extern int PORT_SendError (UINT16 handle, UINT8 errors);
494
495
496/*******************************************************************************
497**
498** Function         PORT_GetQueueStatus
499**
500** Description      This function reports current status of a connection.
501**
502** Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
503**                  p_status   - pointer to the tPORT_STATUS structur to receive
504**                               connection status
505**
506*******************************************************************************/
507extern int PORT_GetQueueStatus (UINT16 handle, tPORT_STATUS *p_status);
508
509
510/*******************************************************************************
511**
512** Function         PORT_Purge
513**
514** Description      This function discards all the data from the output or
515**                  input queues of the specified connection.
516**
517** Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
518**                  purge_flags - specify the action to take.
519**
520*******************************************************************************/
521#define PORT_PURGE_TXCLEAR  0x01
522#define PORT_PURGE_RXCLEAR  0x02
523
524extern int PORT_Purge (UINT16 handle, UINT8 purge_flags);
525
526
527/*******************************************************************************
528**
529** Function         PORT_Read
530**
531** Description      This function returns the pointer to the buffer received
532**                  from the peer device.  Normally application will call this
533**                  function after receiving PORT_EVT_RXCHAR event.
534**                  Application calling this function is responsible to free
535**                  buffer returned.
536**
537** Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
538**                                callback.
539**                  pp_buf      - pointer to address of buffer with data,
540**
541*******************************************************************************/
542extern int PORT_Read (UINT16 handle, BT_HDR **pp_buf);
543
544
545/*******************************************************************************
546**
547** Function         PORT_ReadData
548**
549** Description      Normally application will call this function after receiving
550**                  PORT_EVT_RXCHAR event.
551**
552** Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
553**                                callback.
554**                  p_data      - Data area
555**                  max_len     - Byte count requested
556**                  p_len       - Byte count received
557**
558*******************************************************************************/
559extern int PORT_ReadData (UINT16 handle, char *p_data, UINT16 max_len,
560                          UINT16 *p_len);
561
562
563/*******************************************************************************
564**
565** Function         PORT_Write
566**
567** Description      This function to send BT buffer to the peer device.
568**                  Application should not free the buffer.
569**
570** Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
571**                  p_buf       - pointer to the buffer with data,
572**
573*******************************************************************************/
574extern int PORT_Write (UINT16 handle, BT_HDR *p_buf);
575
576
577/*******************************************************************************
578**
579** Function         PORT_WriteData
580**
581** Description      This function is called from the legacy application to
582**                  send data.
583**
584** Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
585**                  p_data      - Data area
586**                  max_len     - Byte count to write
587**                  p_len       - Bytes written
588**
589*******************************************************************************/
590extern int PORT_WriteData (UINT16 handle, char *p_data, UINT16 max_len,
591                           UINT16 *p_len);
592
593/*******************************************************************************
594**
595** Function         PORT_WriteDataCO
596**
597** Description      Normally not GKI aware application will call this function
598**                  to send data to the port by callout functions.
599**
600** Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
601**
602*******************************************************************************/
603extern int PORT_WriteDataCO (UINT16 handle, int* p_len);
604
605/*******************************************************************************
606**
607** Function         PORT_Test
608**
609** Description      Application can call this function to send RFCOMM Test frame
610**
611** Parameters:      handle      - Handle returned in the RFCOMM_CreateConnection
612**                  p_data      - Data area
613**                  max_len     - Byte count requested
614**
615*******************************************************************************/
616extern int PORT_Test (UINT16 handle, UINT8 *p_data, UINT16 len);
617
618
619/*******************************************************************************
620**
621** Function         RFCOMM_Init
622**
623** Description      This function is called to initialize RFCOMM layer
624**
625*******************************************************************************/
626extern void RFCOMM_Init (void);
627
628
629/*******************************************************************************
630**
631** Function         PORT_SetTraceLevel
632**
633** Description      This function sets the trace level for RFCOMM. If called with
634**                  a value of 0xFF, it simply reads the current trace level.
635**
636** Returns          the new (current) trace level
637**
638*******************************************************************************/
639extern UINT8 PORT_SetTraceLevel (UINT8 new_level);
640
641
642/*******************************************************************************
643**
644** Function         PORT_GetResultString
645**
646** Description      This function returns the human-readable string for a given
647**                  result code.
648**
649** Returns          a pointer to the human-readable string for the given
650**                  result. Note that the string returned must not be freed.
651**
652*******************************************************************************/
653extern const char *PORT_GetResultString (const uint8_t result_code);
654
655#ifdef __cplusplus
656}
657#endif
658
659#endif  /* PORT_API_H */
660