/* * Copyright 2012 The Android Open Source Project * Copyright (c) 2013, The Linux Foundation. All rights reserved. * Not a Contribution. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef HW_AR3K_H #define HW_AR3K_H #include <sys/socket.h> /****************************************************************************** ** Constants & Macros ******************************************************************************/ #define MAX_CNT_RETRY 100 #define HCI_MAX_CMD_SIZE 260 #define HCI_MAX_EVENT_SIZE 260 #define HCI_CHG_BAUD_CMD_OCF 0x0C #define HCI_VENDOR_CMD_OGF 0x3F #define WRITE_BDADDR_CMD_LEN 14 #define WRITE_BAUD_CMD_LEN 6 #define MAX_CMD_LEN WRITE_BDADDR_CMD_LEN #define GET_VERSION_OCF 0x1E /* Byte order conversions */ #if __BYTE_ORDER == __LITTLE_ENDIAN #define htobs(d) (d) #define htobl(d) (d) #define btohs(d) (d) #define btohl(d) (d) #elif __BYTE_ORDER == __BIG_ENDIAN #define htobs(d) bswap_16(d) #define htobl(d) bswap_32(d) #define btohs(d) bswap_16(d) #define btohl(d) bswap_32(d) #else #error "Unknown byte order" #endif #define FW_PATH "/system/etc/firmware/ar3k/" #define STREAM_TO_UINT16(u16, p) \ {u16 = ((uint16_t)(*(p)) + (((uint16_t)(*((p) + 1))) << 8)); (p) += 2;} #define UINT16_TO_STREAM(p, u16) \ {*(p)++ = (uint8_t)(u16); *(p)++ = (uint8_t)((u16) >> 8);} #define UINT32_TO_STREAM(p, u32) \ {*(p)++ = (uint8_t)(u32); *(p)++ = (uint8_t)((u32) >> 8);\ *(p)++ = (uint8_t)((u32) >> 16); *(p)++ = (uint8_t)((u32) >> 24);} #define MAX_TAGS 50 #define PS_HDR_LEN 4 #define HCI_VENDOR_CMD_OGF 0x3F #define HCI_PS_CMD_OCF 0x0B #define VERIFY_CRC 9 #define PS_REGION 1 #define PATCH_REGION 2 #define BDADDR_FILE "ar3kbdaddr.pst" #define MAX_PATCH_CMD 244 struct patch_entry { int16_t len; uint8_t data[MAX_PATCH_CMD]; }; #define HCI_UART_RAW_DEVICE 0 #define HCI_COMMAND_HDR_SIZE 3 #define PS_WRITE 1 #define PS_RESET 2 #define WRITE_PATCH 8 #define ENABLE_PATCH 11 #define HCI_PS_CMD_HDR_LEN 7 #define HCI_CMD_MAX_LEN 258 #define PS_RESET_PARAM_LEN 6 #define PS_RESET_CMD_LEN (HCI_PS_CMD_HDR_LEN + PS_RESET_PARAM_LEN) #define PS_ID_MASK 0xFF #define LOCAL_NAME_BUFFER_LEN 32 #define DEV_REGISTER 0x4FFC #define GET_DEV_TYPE_OCF 0x05 #define HCIDEVUP _IOW('H', 201, int) #define OGF_VENDOR_CMD 0x3f #define EVT_CMD_COMPLETE_SIZE 3 #define EVT_CMD_STATUS 0x0F #define EVT_CMD_STATUS_SIZE 4 #define HCI_COMMAND_HDR_SIZE 3 #define HCI_EVENT_HDR_SIZE 2 #define HCI_EV_SUCCESS 0x00 /* HCI Socket options */ #define HCI_DATA_DIR 1 #define HCI_FILTER 2 #define HCI_TIME_STAMP 3 /* HCI CMSG flags */ #define HCI_CMSG_DIR 0x0001 #define HCI_CMSG_TSTAMP 0x0002 #ifndef VENDOR_LPM_PROC_NODE #define VENDOR_LPM_PROC_NODE "/sys/module/hci_uart/parameters/ath_lpm" #endif /* proc fs node for notifying write request */ #ifndef VENDOR_BTWRITE_PROC_NODE #define VENDOR_BTWRITE_PROC_NODE "/sys/module/hci_uart/parameters/ath_btwrite" #endif /****************************************************************************** ** Local type definitions ******************************************************************************/ typedef struct { uint8_t b[6]; } __attribute__((packed)) bdaddr_t; struct sockaddr_hci { sa_family_t hci_family; unsigned short hci_dev; unsigned short hci_channel; }; struct tag_info { unsigned section; unsigned line_count; unsigned char_cnt; unsigned byte_count; }; struct ps_cfg_entry { uint32_t id; uint32_t len; uint8_t *data; }; struct ps_entry_type { unsigned char type; unsigned char array; }; struct uart_t { char *type; int m_id; int p_id; int proto; int init_speed; int speed; int flags; int pm; char *bdaddr; int (*init) (int fd, struct uart_t *u, struct termios *ti); int (*post) (int fd, struct uart_t *u, struct termios *ti); }; #endif /* HW_AR3K_H */