1/*
2 *  Copyright (c) 2013, The Linux Foundation. All rights reserved.
3 *  Not a Contribution.
4 *  Copyright (C) 2009-2012 Broadcom Corporation
5 *
6 *  Licensed under the Apache License, Version 2.0 (the "License");
7 *  you may not use this file except in compliance with the License.
8 *  You may obtain a copy of the License at
9 *
10 *  http://www.apache.org/licenses/LICENSE-2.0
11 *
12 *  Unless required by applicable law or agreed to in writing, software
13 *  distributed under the License is distributed on an "AS IS" BASIS,
14 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 *  See the License for the specific language governing permissions and
16 *  limitations under the License.
17 */
18
19#ifndef HCI_UART_H
20#define HCI_UART_H
21
22#include <asm-generic/ioctls.h>
23
24/* Variables to identify the platform */
25/*BT HS UART TTY DEVICE */
26#define BT_HS_UART_DEVICE "/dev/ttyHS0"
27
28/**** baud rates ****/
29#define USERIAL_BAUD_300        0
30#define USERIAL_BAUD_600        1
31#define USERIAL_BAUD_1200       2
32#define USERIAL_BAUD_2400       3
33#define USERIAL_BAUD_9600       4
34#define USERIAL_BAUD_19200      5
35#define USERIAL_BAUD_57600      6
36#define USERIAL_BAUD_115200     7
37#define USERIAL_BAUD_230400     8
38#define USERIAL_BAUD_460800     9
39#define USERIAL_BAUD_921600     10
40#define USERIAL_BAUD_1M         11
41#define USERIAL_BAUD_1_5M       12
42#define USERIAL_BAUD_2M         13
43#define USERIAL_BAUD_3M         14
44#define USERIAL_BAUD_4M         15
45#define USERIAL_BAUD_AUTO       16
46
47/**** Data Format ****/
48/* Stop Bits */
49#define USERIAL_STOPBITS_1      1
50#define USERIAL_STOPBITS_1_5    (1<<1)
51#define USERIAL_STOPBITS_2      (1<<2)
52
53/* Parity Bits */
54#define USERIAL_PARITY_NONE     (1<<3)
55#define USERIAL_PARITY_EVEN     (1<<4)
56#define USERIAL_PARITY_ODD      (1<<5)
57
58/* Data Bits */
59#define USERIAL_DATABITS_5      (1<<6)
60#define USERIAL_DATABITS_6      (1<<7)
61#define USERIAL_DATABITS_7      (1<<8)
62#define USERIAL_DATABITS_8      (1<<9)
63
64/* HCI Packet types */
65#define HCI_COMMAND_PKT     0x01
66#define HCI_ACLDATA_PKT      0x02
67#define HCI_SCODATA_PKT     0x03
68#define HCI_EVENT_PKT           0x04
69#define HCI_VENDOR_PKT        0xff
70
71/* HCI Command/Event Opcode */
72#define HCI_RESET                       0x0C03
73#define EVT_CMD_COMPLETE       0x0E
74
75/* Command opcode pack/unpack */
76#define cmd_opcode_pack(ogf, ocf)   (uint16_t)((ocf & 0x03ff)|(ogf << 10))
77
78#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
79/* These are the ioctl values used for bt_wake ioctl via UART driver. you may
80 * need to redefine them on you platform!
81 * Logically they need to be unique and not colide with existing uart ioctl's.
82 */
83#ifndef USERIAL_IOCTL_BT_WAKE_ASSERT
84#define USERIAL_IOCTL_BT_WAKE_ASSERT   0x8003
85#endif
86#ifndef USERIAL_IOCTL_BT_WAKE_DEASSERT
87#define USERIAL_IOCTL_BT_WAKE_DEASSERT 0x8004
88#endif
89#ifndef USERIAL_IOCTL_BT_WAKE_GET_ST
90#define USERIAL_IOCTL_BT_WAKE_GET_ST   0x8005
91#endif
92#endif // (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
93
94/* UART CLOCK IOCTLS*/
95/* UART CLOCK IOCTLS*/
96#define USERIAL_OP_CLK_ON    TIOCPMGET    /* PM get */
97#define USERIAL_OP_CLK_OFF    TIOCPMPUT   /* PM put */
98#define USERIAL_OP_CLK_STATE    TIOCPMACT    /* PM is active */
99
100/******************************************************************************
101**  Type definitions
102******************************************************************************/
103
104/* Structure used to configure serial port during open */
105typedef struct
106{
107    uint16_t fmt;       /* Data format */
108    uint8_t  baud;      /* Baud rate */
109} tUSERIAL_CFG;
110
111typedef enum {
112#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
113    USERIAL_OP_ASSERT_BT_WAKE,
114    USERIAL_OP_DEASSERT_BT_WAKE,
115    USERIAL_OP_GET_BT_WAKE_STATE,
116#endif
117    USERIAL_OP_FLOW_ON,
118    USERIAL_OP_FLOW_OFF,
119    USERIAL_OP_NOP,
120} userial_vendor_ioctl_op_t;
121
122/* UPIO signals */
123enum {
124    UPIO_BT_WAKE = 0,
125    UPIO_HOST_WAKE,
126    UPIO_LPM_MODE,
127    UPIO_MAX_COUNT
128};
129
130/* UPIO assertion/deassertion */
131enum {
132    UPIO_UNKNOWN = 0,
133    UPIO_DEASSERT,
134    UPIO_ASSERT
135};
136
137#define VND_PORT_NAME_MAXLEN    256
138
139/* vendor serial control block */
140typedef struct
141{
142    int fd;                     /* fd to Bluetooth device */
143    struct termios termios;     /* serial terminal of BT port */
144    char port_name[VND_PORT_NAME_MAXLEN];
145} vnd_userial_cb_t;
146
147typedef struct {
148    uint8_t     ncmd;
149    uint16_t    opcode;
150} __attribute__ ((packed)) evt_cmd_complete;
151
152typedef struct {
153    uint8_t     status;
154    uint8_t     ncmd;
155    uint16_t    opcode;
156} __attribute__ ((packed)) evt_cmd_status;
157
158typedef struct {
159    uint16_t    opcode;
160    uint8_t     plen;
161} __attribute__ ((packed))  hci_command_hdr;
162
163typedef struct {
164    uint8_t     evt;
165    uint8_t     plen;
166} __attribute__ ((packed))  hci_event_hdr;
167
168/******************************************************************************
169**  Extern
170******************************************************************************/
171extern vnd_userial_cb_t vnd_userial;
172
173
174/*******************************************************************************
175**
176** Function        userial_vendor_init
177**
178** Description     Initialize userial vendor-specific control block
179**
180** Returns         None
181**
182*******************************************************************************/
183void userial_vendor_init(void);
184
185/*******************************************************************************
186**
187** Function        userial_vendor_open
188**
189** Description     Open the serial port with the given configuration
190**
191** Returns         device fd
192**
193*******************************************************************************/
194int userial_vendor_open(tUSERIAL_CFG *p_cfg);
195
196/*******************************************************************************
197**
198** Function        userial_vendor_close
199**
200** Description     Conduct vendor-specific close work
201**
202** Returns         None
203**
204*******************************************************************************/
205void userial_vendor_close(void);
206
207/*******************************************************************************
208**
209** Function        userial_vendor_set_baud
210**
211** Description     Set new baud rate
212**
213** Returns         None
214**
215*******************************************************************************/
216void userial_vendor_set_baud(uint8_t userial_baud);
217
218/*******************************************************************************
219**
220** Function        userial_vendor_ioctl
221**
222** Description     ioctl inteface
223**
224** Returns         int error
225**
226*******************************************************************************/
227int userial_vendor_ioctl(userial_vendor_ioctl_op_t op, int *p_data);
228
229/*******************************************************************************
230**
231** Function        userial_to_tcio_baud
232**
233** Description     helper function converts USERIAL baud rates into TCIO
234**                  conforming baud rates
235**
236** Returns         TRUE/FALSE
237**
238*******************************************************************************/
239uint8_t userial_to_tcio_baud(uint8_t cfg_baud, uint32_t *baud);
240
241/*******************************************************************************
242**
243** Function        userial_to_baud_tcio
244**
245** Description     helper function converts TCIO baud rate into integer
246**
247** Returns         uint32_t
248**
249*******************************************************************************/
250int userial_tcio_baud_to_int(uint32_t baud);
251
252/*******************************************************************************
253**
254** Function        read_hci_event
255**
256** Description     Read HCI event during vendor initialization
257**
258** Returns         int: size to read
259**
260*******************************************************************************/
261int read_hci_event(int fd, unsigned char* buf, int size);
262
263#endif /* HCI_UART_H */
264