/* * * BlueZ - Bluetooth protocol stack for Linux * * Copyright (C) 2003-2009 Marcel Holtmann * * * 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 #include #include #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);