pinebuds/services/bt_if_enhanced/inc/rfcomm_api.h
2022-08-15 17:20:27 +08:00

309 lines
10 KiB
C

/***************************************************************************
*
* Copyright 2015-2019 BES.
* All rights reserved. All unpublished rights reserved.
*
* No part of this work may be used or reproduced in any form or by any
* means, or stored in a database or retrieval system, without prior written
* permission of BES.
*
* Use of this work is governed by a license granted by BES.
* This work contains confidential and proprietary information of
* BES. which is protected by copyright, trade secret,
* trademark and other intellectual property rights.
*
****************************************************************************/
#ifndef __RFCOMM_API_H__
#define __RFCOMM_API_H__
#include "bluetooth.h"
#include "me_api.h"
#include "bt_if.h"
typedef void *rf_channel_t;
typedef uint8_t rf_event_t;
#define BTIF_RFEVENT_OPEN_IND 1
#define BTIF_RFEVENT_OPEN 2
#define BTIF_RFEVENT_CLOSE_IND 3
#define BTIF_RFEVENT_CLOSED 4
#define BTIF_RFEVENT_DATA_IND 5
#define BTIF_RFEVENT_PACKET_HANDLED 6
#define BTIF_RFEVENT_TEST_CNF 7
#define BTIF_RFEVENT_PORT_NEG_IND 8
#define BTIF_RFEVENT_PORT_NEG_CNF 9
#define BTIF_RFEVENT_PORT_STATUS_IND 10
#define BTIF_RFEVENT_PORT_STATUS_CNF 11
#define BTIF_RFEVENT_MODEM_STATUS_IND 12
#define BTIF_RFEVENT_MODEM_STATUS_CNF 13
#define BTIF_RFEVENT_LINE_STATUS_IND 14
#define BTIF_RFEVENT_LINE_STATUS_CNF 15
#define BTIF_RFEVENT_FLOW_OFF_IND 16
#define BTIF_RFEVENT_FLOW_ON_IND 17
#define BTIF_RFEVENT_RESOURCE_FREE 18
#define BTIF_RFEVENT_FRAME_SIZE_CHANGED 19
typedef uint8_t rf_signals;
#define RFCOMM_FLOW 0x02
#define RFCOMM_RTC 0x04
#define RFCOMM_RTR 0x08
#define RFCOMM_IC 0x40
#define RFCOMM_DV 0x80
#define RFCOMM_DSR 0x04
#define RFCOMM_CTS 0x08
#define RFCOMM_RI 0x40
#define RFCOMM_CD 0x80
#define RFCOMM_DTR 0x04
#define RFCOMM_RTS 0x08
typedef uint8_t rf_data_format;
#define RFCOMM_DATA_BITS_5 0x00
#define RFCOMM_DATA_BITS_6 0x02
#define RFCOMM_DATA_BITS_7 0x01
#define RFCOMM_DATA_BITS_8 0x03
#define RFCOMM_STOP_BITS_1 0x00
#define RFCOMM_STOP_BITS_1_5 0x04
#define RFCOMM_PARITY_NONE 0x00
#define RFCOMM_PARITY_ON 0x08
#define RFCOMM_PARITY_TYPE_ODD 0x00
#define RFCOMM_PARITY_TYPE_EVEN 0x20
#define RFCOMM_PARITY_TYPE_MARK 0x10
#define RFCOMM_PARITY_TYPE_SPACE 0x30
#define RFCOMM_DATA_BITS_MASK 0x03
#define RFCOMM_STOP_BITS_MASK 0x04
#define RFCOMM_PARITY_MASK 0x08
#define RFCOMM_PARITY_TYPE_MASK 0x30
typedef uint8_t rf_line_status;
#define RFCOMM_LINE_ERROR 0x01
#define RFCOMM_OVERRUN 0x02
#define RFCOMM_PARITY 0x04
#define RFCOMM_FRAMING 0x08
typedef uint8_t rf_signals;
#define RFCOMM_FLOW 0x02
#define RFCOMM_RTC 0x04 /* Set when sender is ready to communicate. */
#define RFCOMM_RTR 0x08 /* Set when sender is ready to receive data. */
#define RFCOMM_IC 0x40 /* Set when a call is incoming. */
#define RFCOMM_DV 0x80 /* Set when valid data is being sent. */
#define RFCOMM_DSR 0x04
#define RFCOMM_CTS 0x08
#define RFCOMM_RI 0x40
#define RFCOMM_CD 0x80
#define RFCOMM_DTR 0x04
#define RFCOMM_RTS 0x08
struct rf_modem_status
{
rf_signals signals;
uint8_t break_len;
};
typedef uint16_t rf_port_settings_mask;
#define RFCOMM_PARM_BAUDRATE 0x0001
#define RFCOMM_PARM_DATABITS 0x0002
#define RFCOMM_PARM_STOPBITS 0x0004
#define RFCOMM_PARM_PARITY 0x0008
#define RFCOMM_PARM_PARITY_TYPE 0x0010
#define RFCOMM_PARM_DATA_FORMAT (RFCOMM_PARM_DATABITS | RFCOMM_PARM_STOPBITS | \
RFCOMM_PARM_PARITY | RFCOMM_PARM_PARITY_TYPE)
#define RFCOMM_PARM_XON_CHAR 0x0020
#define RFCOMM_PARM_XOFF_CHAR 0x0040
#define RFCOMM_PARM_XON_INPUT 0x0100
#define RFCOMM_PARM_XON_OUTPUT 0x0200
#define RFCOMM_PARM_RTR_INPUT 0x0400
#define RFCOMM_PARM_RTR_OUTPUT 0x0800
#define RFCOMM_PARM_RTC_INPUT 0x1000
#define RFCOMM_PARM_RTC_OUTPUT 0x2000
#define RFCOMM_PARM_FLOW_RTS_CTS (RFCOMM_PARM_RTR_INPUT | RFCOMM_PARM_RTR_OUTPUT)
#define RFCOMM_PARM_FLOW_DTR_DSR (RFCOMM_PARM_RTC_INPUT | RFCOMM_PARM_RTC_OUTPUT)
#define RFCOMM_PARM_FLOW_XON_XOFF (RFCOMM_PARM_XON_INPUT | RFCOMM_PARM_XON_OUTPUT)
typedef uint8_t rf_flow_control;
#define RFCOMM_FLOW_CTRL_NONE 0x00
#define RFCOMM_XON_ON_INPUT 0x01
#define RFCOMM_XON_ON_OUTPUT 0x02
#define RFCOMM_RTR_ON_INPUT 0x04
#define RFCOMM_RTR_ON_OUTPUT 0x08
#define RFCOMM_RTC_ON_INPUT 0x10
#define RFCOMM_RTC_ON_OUTPUT 0x20
#define RFCOMM_FLOW_RTS_CTS (RFCOMM_RTR_ON_INPUT | RFCOMM_RTR_ON_OUTPUT)
#define RFCOMM_FLOW_DTR_DSR (RFCOMM_RTC_ON_INPUT | RFCOMM_RTC_ON_OUTPUT)
#define RFCOMM_FLOW_XON_XOFF (RFCOMM_XON_ON_INPUT | RFCOMM_XON_ON_OUTPUT)
typedef uint8_t rf_data_format;
#define RFCOMM_DATA_BITS_5 0x00
#define RFCOMM_DATA_BITS_6 0x02
#define RFCOMM_DATA_BITS_7 0x01
#define RFCOMM_DATA_BITS_8 0x03
#define RFCOMM_STOP_BITS_1 0x00
#define RFCOMM_STOP_BITS_1_5 0x04
#define RFCOMM_PARITY_NONE 0x00
#define RFCOMM_PARITY_ON 0x08
#define RFCOMM_PARITY_TYPE_ODD 0x00
#define RFCOMM_PARITY_TYPE_EVEN 0x20
#define RFCOMM_PARITY_TYPE_MARK 0x10
#define RFCOMM_PARITY_TYPE_SPACE 0x30
#define RFCOMM_DATA_BITS_MASK 0x03
#define RFCOMM_STOP_BITS_MASK 0x04
#define RFCOMM_PARITY_MASK 0x08
#define RFCOMM_PARITY_TYPE_MASK 0x30
typedef uint8_t rf_baud_rate;
#define RFCOMM_BAUD_2400 0x00
#define RFCOMM_BAUD_4800 0x01
#define RFCOMM_BAUD_7200 0x02
#define RFCOMM_BAUD_9600 0x03
#define RFCOMM_BAUD_19200 0x04
#define RFCOMM_BAUD_38400 0x05
#define RFCOMM_BAUD_57600 0x06
#define RFCOMM_BAUD_115200 0x07
#define RFCOMM_BAUD_230400 0x08
typedef struct _rf_port_settings
{
rf_baud_rate baudRate;
rf_data_format dataFormat;
rf_flow_control flowControl;
uint8_t xonChar;
uint8_t xoffChar;
rf_port_settings_mask parmMask;
} rf_port_settings;
struct rf_callback_prams
{
rf_event_t event;
int status;
uint16_t data_len;
union
{
btif_bt_packet_t *packet;
U8 *data;
struct rf_modem_status *modem_status;
rf_line_status *line_status;
rf_port_settings *port_settings;
btif_remote_device_t *remDev;
} ptrs;
};
typedef void (*rf_callback_func) (rf_channel_t chan, struct rf_callback_prams * parms);
struct rf_chan_info
{
rf_callback_func callback;
uint16_t max_frame_size;
uint8_t priority;
void *priv;
};
struct rf_service
{
uint8_t serviceId;
};
struct _rf_channel
{
rf_callback_func callback;
int8_t server_channel;
uint32_t rfcomm_handle;
uint32_t app_id;
void *priv;
list_entry_t tx_queue;
};
#ifdef __cplusplus
extern "C" {
#endif /* */
void btif_rfcomm_ctx_input_init(void *para);
rf_channel_t btif_rf_create_channel(void);
void btif_rf_free_channel(rf_channel_t chan_h);
bt_status_t btif_rf_register_server_channel(rf_channel_t chan_h,
struct rf_service *service, uint8_t credit);
bt_status_t btif_rf_deregister_server_channel(rf_channel_t chan_h, struct rf_service *service);
bt_status_t btif_rf_deregister_service(struct rf_service *service);
uint16_t btif_rf_frame_size(rf_channel_t chan_h);
bt_status_t btif_rf_respond_channel(rf_channel_t chan_h, bool accept);
bt_status_t btif_rf_accept_channel(rf_channel_t chan_h);
#define btif_rf_accept_channel(c) btif_rf_respond_channel(c, true)
bt_status_t btif_rf_reject_channel(rf_channel_t chan_h);
#define btif_rf_reject_channel(c) btif_rf_respond_channel(c, false)
#if BTIF_RF_SEND_CONTROL == BTIF_ENABLED
bt_status_t btif_rf_send_port_settings(rf_channel_t chan_h, rf_port_settings * PortSettings);
bt_status_t btif_rf_request_port_settings(rf_channel_t chan_h, rf_port_settings * portSettings);
#define btif_rf_request_port_settings(c, p) btif_rf_send_port_settings(c, p)
bt_status_t btif_rf_request_port_status(rf_channel_t chan_h);
#define btif_rf_request_port_status(c) btif_rf_send_port_settings(c, NULL)
bt_status_t btif_rf_set_modem_status(rf_channel_t chan_h,
struct rf_modem_status *modem_status);
#endif /*BTIF_RF_SEND_CONTROL == BTIF_ENABLED */
bt_status_t btif_rf_open_client_channel(btif_remote_device_t * RemDev,
uint8_t server_id, rf_channel_t chan_h, uint8_t credit);
bt_status_t btif_rf_close_channel(rf_channel_t chan_h);
bt_status_t btif_rf_send_data(rf_channel_t chan_h, btif_bt_packet_t * Packet);
bt_status_t btif_rf_advance_credit(rf_channel_t chan_h, uint8_t credit);
bool btif_rf_credit_flow_enabled(rf_channel_t chan_h);
bt_status_t btif_rf_setup_channel(rf_channel_t chan_h, struct rf_chan_info *info);
void *btif_rf_get_channel_priv(rf_channel_t chan);
uint32_t btif_rf_get_app_id(rf_channel_t chan_h);
uint32_t btif_rf_get_rfcomm_handle(rf_channel_t chan_h);
bt_status_t btif_rf_set_rfcomm_handle(rf_channel_t chan_h, uint32_t rfcomm_handle);
uint8_t btif_rf_get_server_channel(rf_channel_t chan_h);
uint16_t btif_rf_max_frame_size_configure(void);
void btif_rf_set_app_id(rf_channel_t chan_h,uint32_t app_id);
#if defined(IBRT)
#if defined(ENHANCED_STACK)
uint32_t btif_save_rfc_ctx(uint8_t *ctx_buffer, uint8_t MuxId);
uint32_t btif_set_rfc_ctx(uint8_t* ctx_buffer, uint16_t MuxId, uint8_t rm_devtbl_idx);
uint32_t btif_rfc_get_session_l2c_handle(uint16_t hci_handle);
bool btif_rfc_is_dlci_channel_connected(uint32_t session_l2c_handle,uint32_t app_id);
#else
uint32_t btif_save_rfc_ctx(uint8_t *ctx_buffer, uint8_t MuxId);
uint32_t btif_set_rfc_ctx(uint8_t* ctx_buffer, uint16_t MuxId, uint8_t rm_devtbl_idx);
uint32_t btif_save_rfcomm_channel_ctx(uint8_t *ctx_buffer, uint8_t MuxId, uint32_t app_id);
uint32_t btif_set_rfcomm_channel_ctx(uint8_t *ctx_buffer, uint8_t MuxId, uint32_t app_id);
#endif
bool btif_rf_is_rfcomm_channel_connected(uint8_t mux_id,uint32_t app_id);
btif_remote_device_t* btif_rfc_get_mux_remote_device(uint8_t mux_idx);
uint8_t btif_rfc_get_mux_index(uint16_t hci_handle);
uint8_t btif_rfc_get_mux_state(uint8_t mux_idx);
#endif
#ifdef __cplusplus
}
#endif
#endif /*__RFCOMM_API_H__*/