/* * btif_woble.h * * Created on: 2020 * Author: unisoc */ #ifndef __WOBLE_H #define __WOBLE_H #define HCI_CMD 0x01 #define HCI_ACL 0x02 #define HCI_SCO 0x03 #define HCI_EVT 0x04 #define PACKET_TYPE 0 #define EVT_HEADER_TYPE 0 #define EVT_HEADER_EVENT 1 #define EVT_HEADER_SIZE 2 #define EVT_VENDOR_CODE_LSB 3 #define EVT_VENDOR_CODE_MSB 4 #define EVT_LE_META_SUBEVT 3 #define EVT_ADV_LENGTH 13 #define BT_HCI_EVT_CMD_COMPLETE 0x0e #define BT_HCI_EVT_CMD_STATUS 0x0f #define ACL_HEADER_SIZE_LB 3 #define ACL_HEADER_SIZE_HB 4 #define EVT_HEADER_STATUS 4 #define HCI_CMD_MAX_LEN 258 #define BD_ADDR_LEN 6 #define UINT8_TO_STREAM(p, u8) {*(p)++ = (uint8_t)(u8); } #define UINT16_TO_STREAM(p, u16) {*(p)++ = (uint8_t)(u16); *(p)++ = (uint8_t)((u16) >> 8); } #define ARRAY_TO_STREAM(p, a, len) {register int ijk; for (ijk = 0; ijk < len; ijk++) *(p)++ = (uint8_t) a[ijk]; } #define STREAM_TO_UINT8(u8, p) {u8 = (uint8_t)(*(p)); (p) += 1; } #define STREAM_TO_UINT16(u16, p) {u16 = ((uint16_t)(*(p)) + (((uint16_t)(*((p) + 1))) << 8)); (p) += 2; } #define BDADDR_TO_STREAM(p, a) {register int ijk; for (ijk = 0; ijk < BD_ADDR_LEN; ijk++) *(p)++ = (uint8_t) a[BD_ADDR_LEN - 1 - ijk]; } #define STREAM_TO_ARRAY(a, p, len) {register int ijk; for (ijk = 0; ijk < len; ijk++) ((uint8_t *) a)[ijk] = *p++; } #define BT_HCI_OP_RESET 0x0c03 #define BT_HCI_OP_ENABLE 0xfca1 #define BT_HCI_OP_WOBLE 0xfd08 #define BT_HCI_OP_SET_SLEEPMODE 0xfd09 #define BT_HCI_OP_ADD_WAKEUPLIST 0xfd0a #define BT_HCI_OP_SET_STARTSLEEP 0xfd0d #define WOBLE_DEVICES_SIZE 10 struct HC_BT_HDR { unsigned short event; unsigned short len; unsigned short offset; unsigned short layer_specific; unsigned char data[]; }; struct hci_cmd_t { unsigned short opcode; struct semaphore wait; struct HC_BT_HDR response; }; typedef enum { WOBLE_MOD_DISABLE = 0, WOBLE_MOD_ENABLE, WOBLE_MOD_UNDEFINE = 0xff, } WOBLE_MOD; typedef enum { WOBLE_SLEEP_MOD_COULD_KNOW = 0, WOBLE_SLEEP_MOD_COULD_NOT_KNOW } WOBLE_SLEEP_MOD; typedef enum { WOBLE_SLEEP_MOD_NOT_NEED_NOTITY = 0, WOBLE_SLEEP_MOD_NEED_NOTITY, } WOBLE_NOFITY_MOD; typedef enum { WOBLE_WAKE_MOD_ALL_ADV_DATA = (1 << 0), WOBLE_WAKE_MOD_ALL_ACL_DATA = (1 << 1), WOBLE_WAKE_MOD_SPECIAL_ADV_DATA = (1 << 2), WOBLE_WAKE_MOD_SPECIAL_ACL_DATA = (1 << 3), } WOBLE_WAKE_MOD; typedef enum { WOBLE_DISCONNECT_MOD_NOT = 0, WOBLE_DISCONNECT_MOD_WILL } WOBLE_DISCONNECT_MOD; typedef enum { WOBLE_ADV_WAKE_MOD_RAW_DATA = (1 << 0), WOBLE_ADV_WAKE_MOD_ADTYE = (1 << 1), } WOBLE_ADV_WAKE_MOD; typedef enum { WOBLE_IS_NOT_SHUTDOWN = 0, WOBLE_IS_SHUTDOWN, } WOBLE_SHUTDOWN_MOD; typedef enum { WOBLE_IS_NOT_RESUME = 0, WOBLE_IS_RESUME, } WOBLE_RESUME_MOD; typedef struct { uint8_t woble_mod; uint8_t sleep_mod; uint16_t timeout; uint8_t notify; } woble_config_t; typedef struct mtty_bt_wake_t { uint8_t addr[6]; char *addr_str; uint8_t dev_tp; char *dev_tp_str; uint8_t addr_tp; char *addr_tp_str; } mtty_bt_wake_t; int woble_init(void); void hci_set_ap_sleep_mode(int is_shutdown, int is_resume); int mtty_bt_str_hex(char *str, uint8_t count, char *hex); int mtty_bt_conf_prase(char *conf_str); int mtty_bt_read_conf(void); int woble_data_recv(const unsigned char *buf, int count); int hci_cmd_send_sync(unsigned short opcode, struct HC_BT_HDR *py, struct HC_BT_HDR *rsp); void hci_add_device_to_wakeup_list(mtty_bt_wake_t bt_wakeup_dev); void hci_set_ap_start_sleep(void); #endif