/*
|
*
|
* BlueZ - Bluetooth protocol stack for Linux
|
*
|
* Copyright (C) 2003-2009 Marcel Holtmann <marcel@holtmann.org>
|
*
|
*
|
* This program is free software; you can redistribute it and/or modify
|
* it under the terms of the GNU General Public License as published by
|
* the Free Software Foundation; either version 2 of the License, or
|
* (at your option) any later version.
|
*
|
* This program is distributed in the hope that it will be useful,
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* GNU General Public License for more details.
|
*
|
* You should have received a copy of the GNU General Public License
|
* along with this program; if not, write to the Free Software
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
*
|
*/
|
|
#include <termios.h>
|
#include <stdint.h>
|
#include <syslog.h>
|
|
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
#define cpu_to_le16(d) (d)
|
#define cpu_to_le32(d) (d)
|
#define le16_to_cpu(d) (d)
|
#define le32_to_cpu(d) (d)
|
#elif __BYTE_ORDER == __BIG_ENDIAN
|
#define cpu_to_le16(d) bswap_16(d)
|
#define cpu_to_le32(d) bswap_32(d)
|
#define le16_to_cpu(d) bswap_16(d)
|
#define le32_to_cpu(d) bswap_32(d)
|
#else
|
#error "Unknown byte order"
|
#endif
|
|
#ifndef N_HCI
|
#define N_HCI 15
|
#endif
|
|
#define HCIUARTSETPROTO _IOW('U', 200, int)
|
#define HCIUARTGETPROTO _IOR('U', 201, int)
|
#define HCIUARTGETDEVICE _IOR('U', 202, int)
|
#define HCIUARTSETFLAGS _IOW('U', 203, int)
|
#define HCIUARTGETFLAGS _IOR('U', 204, int)
|
|
#define HCI_UART_H4 0
|
#define HCI_UART_BCSP 1
|
#define HCI_UART_3WIRE 2
|
#define HCI_UART_H4DS 3
|
#define HCI_UART_LL 4
|
#define HCI_UART_RAW_DEVICE 0
|
|
extern uint8_t DBG_ON;
|
|
/* #define SYSLOG */
|
|
#define LOG_STR "Realtek Bluetooth"
|
#ifdef SYSLOG
|
#define RS_DBG(fmt, arg...) \
|
do{ \
|
if (DBG_ON) \
|
syslog(LOG_DEBUG, "%s :" fmt "\n" , LOG_STR, ##arg); \
|
}while(0)
|
|
#define RS_INFO(fmt, arg...) \
|
do{ \
|
syslog(LOG_INFO, "%s :" fmt "\n", LOG_STR, ##arg); \
|
}while(0)
|
|
#define RS_WARN(fmt, arg...) \
|
do{ \
|
syslog(LOG_WARNING, "%s WARN: " fmt "\n", LOG_STR, ##arg); \
|
}while(0)
|
|
#define RS_ERR(fmt, arg...) \
|
do{ \
|
syslog(LOG_ERR, "%s ERROR: " fmt "\n", LOG_STR, ##arg); \
|
}while(0)
|
#else
|
#define RS_DBG(fmt, arg...) \
|
do{ \
|
if (DBG_ON) \
|
printf("%s :" fmt "\n" , LOG_STR, ##arg); \
|
}while(0)
|
|
#define RS_INFO(fmt, arg...) \
|
do{ \
|
printf("%s :" fmt "\n", LOG_STR, ##arg); \
|
}while(0)
|
|
#define RS_WARN(fmt, arg...) \
|
do{ \
|
printf("%s WARN: " fmt "\n", LOG_STR, ##arg); \
|
}while(0)
|
|
#define RS_ERR(fmt, arg...) \
|
do{ \
|
printf("%s ERROR: " fmt "\n", LOG_STR, ##arg); \
|
}while(0)
|
#endif
|
|
typedef enum _H5_RX_STATE {
|
H5_W4_PKT_DELIMITER,
|
H5_W4_PKT_START,
|
H5_W4_HDR,
|
H5_W4_DATA,
|
H5_W4_CRC
|
} H5_RX_STATE;
|
|
typedef enum _H5_RX_ESC_STATE {
|
H5_ESCSTATE_NOESC,
|
H5_ESCSTATE_ESC
|
} H5_RX_ESC_STATE;
|
|
typedef enum _H5_LINK_STATE {
|
H5_SYNC,
|
H5_CONFIG,
|
H5_INIT,
|
H5_PATCH,
|
H5_HCI_RESET,
|
H5_ACTIVE
|
} H5_LINK_STATE;
|
|
struct patch_info;
|
typedef struct rtb_struct {
|
/* three wire releated */
|
uint8_t rxseq_txack; /* expected rx seq number */
|
uint8_t rxack; /* last packet that the peer ack'ed */
|
uint8_t use_crc;
|
uint8_t is_txack_req; /* txack required */
|
uint8_t msgq_txseq; /* next pkt seq */
|
uint16_t message_crc;
|
uint32_t rx_count; /* expected pkts to recv */
|
|
H5_RX_STATE rx_state;
|
H5_RX_ESC_STATE rx_esc_state;
|
H5_LINK_STATE link_estab_state;
|
|
struct sk_buff *rx_skb;
|
|
uint16_t num_of_cmd_sent;
|
uint16_t lmp_subver;
|
uint16_t hci_rev;
|
uint8_t hci_ver;
|
uint8_t eversion;
|
uint8_t chip_type;
|
|
uint32_t vendor_baud;
|
uint8_t dl_fw_flag;
|
int serial_fd;
|
uint32_t uart_flow_ctrl;
|
uint32_t parenb: 16;
|
uint32_t pareven: 16;
|
int final_speed;
|
int total_num; /* total pkt number */
|
int tx_index; /* current sending pkt number */
|
int rx_index; /* ack index from board */
|
int fw_len; /* fw patch file len */
|
int config_len; /* config patch file len */
|
int total_len; /* fw & config extracted buf len */
|
uint8_t *fw_buf; /* fw patch file buf */
|
uint8_t *config_buf; /* config patch file buf */
|
uint8_t *total_buf; /* fw & config extracted buf */
|
#define CMD_STATE_UNKNOWN 0x00
|
#define CMD_STATE_SUCCESS 0x01
|
struct __cmd_state {
|
uint16_t opcode;
|
uint16_t state;
|
} cmd_state;
|
|
struct patch_info *patch_ent;
|
|
int proto;
|
int timerfd;
|
int epollfd;
|
} rtb_struct_t;
|
extern struct rtb_struct rtb_cfg;
|
int timeout_set(int fd, unsigned int msec);
|
int set_speed(int fd, struct termios *ti, int speed);
|
int rtb_init(int fd, int proto, int speed, struct termios *ti);
|
int rtb_post(int fd, int proto, struct termios *ti);
|
void util_hexdump(const uint8_t *buf, size_t len);
|