1ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/******************************************************************************
2ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *
3ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  Copyright (C) 2009-2012 Broadcom Corporation
4ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *
5ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  Licensed under the Apache License, Version 2.0 (the "License");
6ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  you may not use this file except in compliance with the License.
7ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  You may obtain a copy of the License at:
8ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *
9ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  http://www.apache.org/licenses/LICENSE-2.0
10ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *
11ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  Unless required by applicable law or agreed to in writing, software
12ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  distributed under the License is distributed on an "AS IS" BASIS,
13ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  See the License for the specific language governing permissions and
15ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  limitations under the License.
16ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *
17ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ******************************************************************************/
18ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
19ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/******************************************************************************
20ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *
21ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  Filename:      userial_vendor.c
22ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *
23ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  Description:   Contains vendor-specific userial functions
24ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *
25ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ******************************************************************************/
26ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
27ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#define LOG_TAG "bt_userial_vendor"
28ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
29ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include <utils/Log.h>
30ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include <termios.h>
31ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include <fcntl.h>
32ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include <errno.h>
33ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include <stdio.h>
34ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include "bt_vendor_brcm.h"
35ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include "userial.h"
36ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include "userial_vendor.h"
37ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
38ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/******************************************************************************
39ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**  Constants & Macros
40ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville******************************************************************************/
41ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
42ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#ifndef VNDUSERIAL_DBG
43ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#define VNDUSERIAL_DBG FALSE
44ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif
45ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
46ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#if (VNDUSERIAL_DBG == TRUE)
47ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#define VNDUSERIALDBG(param, ...) {ALOGD(param, ## __VA_ARGS__);}
48ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#else
49ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#define VNDUSERIALDBG(param, ...) {}
50ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif
51ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
52ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#define VND_PORT_NAME_MAXLEN    256
53ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
54ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/******************************************************************************
55ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**  Local type definitions
56ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville******************************************************************************/
57ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
58ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/* vendor serial control block */
59ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savilletypedef struct
60ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{
61ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    int fd;                     /* fd to Bluetooth device */
62ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    struct termios termios;     /* serial terminal of BT port */
63ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    char port_name[VND_PORT_NAME_MAXLEN];
64ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville} vnd_userial_cb_t;
65ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
66ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/******************************************************************************
67ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**  Static variables
68ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville******************************************************************************/
69ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
70ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillestatic vnd_userial_cb_t vnd_userial;
71ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
72ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/*****************************************************************************
73ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**   Helper Functions
74ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville*****************************************************************************/
75ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
76ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/*******************************************************************************
77ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
78ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Function        userial_to_tcio_baud
79ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
80ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Description     helper function converts USERIAL baud rates into TCIO
81ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**                  conforming baud rates
82ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
83ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Returns         TRUE/FALSE
84ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
85ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville*******************************************************************************/
86ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savilleuint8_t userial_to_tcio_baud(uint8_t cfg_baud, uint32_t *baud)
87ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{
88ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    if (cfg_baud == USERIAL_BAUD_115200)
89ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        *baud = B115200;
90ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    else if (cfg_baud == USERIAL_BAUD_4M)
91ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        *baud = B4000000;
92ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    else if (cfg_baud == USERIAL_BAUD_3M)
93ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        *baud = B3000000;
94ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    else if (cfg_baud == USERIAL_BAUD_2M)
95ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        *baud = B2000000;
96ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    else if (cfg_baud == USERIAL_BAUD_1M)
97ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        *baud = B1000000;
98ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    else if (cfg_baud == USERIAL_BAUD_921600)
99ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        *baud = B921600;
100ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    else if (cfg_baud == USERIAL_BAUD_460800)
101ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        *baud = B460800;
102ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    else if (cfg_baud == USERIAL_BAUD_230400)
103ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        *baud = B230400;
104ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    else if (cfg_baud == USERIAL_BAUD_57600)
105ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        *baud = B57600;
106ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    else if (cfg_baud == USERIAL_BAUD_19200)
107ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        *baud = B19200;
108ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    else if (cfg_baud == USERIAL_BAUD_9600)
109ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        *baud = B9600;
110ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    else if (cfg_baud == USERIAL_BAUD_1200)
111ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        *baud = B1200;
112ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    else if (cfg_baud == USERIAL_BAUD_600)
113ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        *baud = B600;
114ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    else
115ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    {
116ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        ALOGE( "userial vendor open: unsupported baud idx %i", cfg_baud);
117ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        *baud = B115200;
118ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        return FALSE;
119ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    }
120ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
121ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    return TRUE;
122ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville}
123ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
124ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
125ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/*******************************************************************************
126ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
127ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Function        userial_ioctl_init_bt_wake
128ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
129ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Description     helper function to set the open state of the bt_wake if ioctl
130ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**                  is used. it should not hurt in the rfkill case but it might
131ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**                  be better to compile it out.
132ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
133ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Returns         none
134ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
135ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville*******************************************************************************/
136ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillevoid userial_ioctl_init_bt_wake(int fd)
137ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{
138ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    uint32_t bt_wake_state;
139ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
140b01dbb348576f8c06559f18152b98d9a4f83fee1Daniel Nygren#if (BT_WAKE_USERIAL_LDISC==TRUE)
141b01dbb348576f8c06559f18152b98d9a4f83fee1Daniel Nygren    int ldisc = N_BRCM_HCI; /* brcm sleep mode support line discipline */
142b01dbb348576f8c06559f18152b98d9a4f83fee1Daniel Nygren
143b01dbb348576f8c06559f18152b98d9a4f83fee1Daniel Nygren    /* attempt to load enable discipline driver */
144b01dbb348576f8c06559f18152b98d9a4f83fee1Daniel Nygren    if (ioctl(vnd_userial.fd, TIOCSETD, &ldisc) < 0)
145b01dbb348576f8c06559f18152b98d9a4f83fee1Daniel Nygren    {
146b01dbb348576f8c06559f18152b98d9a4f83fee1Daniel Nygren        VNDUSERIALDBG("USERIAL_Open():fd %d, TIOCSETD failed: error %d for ldisc: %d",
147b01dbb348576f8c06559f18152b98d9a4f83fee1Daniel Nygren                      fd, errno, ldisc);
148b01dbb348576f8c06559f18152b98d9a4f83fee1Daniel Nygren    }
149b01dbb348576f8c06559f18152b98d9a4f83fee1Daniel Nygren#endif
150b01dbb348576f8c06559f18152b98d9a4f83fee1Daniel Nygren
151b01dbb348576f8c06559f18152b98d9a4f83fee1Daniel Nygren
152b01dbb348576f8c06559f18152b98d9a4f83fee1Daniel Nygren
153ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    /* assert BT_WAKE through ioctl */
154ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    ioctl(fd, USERIAL_IOCTL_BT_WAKE_ASSERT, NULL);
155ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    ioctl(fd, USERIAL_IOCTL_BT_WAKE_GET_ST, &bt_wake_state);
156ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    VNDUSERIALDBG("userial_ioctl_init_bt_wake read back BT_WAKE state=%i", \
157ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville               bt_wake_state);
158ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville}
159ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif // (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
160ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
161ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
162ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/*****************************************************************************
163ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**   Userial Vendor API Functions
164ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville*****************************************************************************/
165ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
166ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/*******************************************************************************
167ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
168ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Function        userial_vendor_init
169ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
170ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Description     Initialize userial vendor-specific control block
171ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
172ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Returns         None
173ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
174ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville*******************************************************************************/
175ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillevoid userial_vendor_init(void)
176ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{
177ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    vnd_userial.fd = -1;
178ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    snprintf(vnd_userial.port_name, VND_PORT_NAME_MAXLEN, "%s", \
179ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            BLUETOOTH_UART_DEVICE_PORT);
180ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville}
181ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
182ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/*******************************************************************************
183ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
184ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Function        userial_vendor_open
185ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
186ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Description     Open the serial port with the given configuration
187ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
188ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Returns         device fd
189ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
190ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville*******************************************************************************/
191ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savilleint userial_vendor_open(tUSERIAL_CFG *p_cfg)
192ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{
193ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    uint32_t baud;
194ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    uint8_t data_bits;
195ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    uint16_t parity;
196ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    uint8_t stop_bits;
197ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
198ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    vnd_userial.fd = -1;
199ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
200ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    if (!userial_to_tcio_baud(p_cfg->baud, &baud))
201ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    {
202ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        return -1;
203ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    }
204ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
205ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    if(p_cfg->fmt & USERIAL_DATABITS_8)
206ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        data_bits = CS8;
207ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    else if(p_cfg->fmt & USERIAL_DATABITS_7)
208ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        data_bits = CS7;
209ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    else if(p_cfg->fmt & USERIAL_DATABITS_6)
210ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        data_bits = CS6;
211ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    else if(p_cfg->fmt & USERIAL_DATABITS_5)
212ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        data_bits = CS5;
213ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    else
214ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    {
215ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        ALOGE("userial vendor open: unsupported data bits");
216ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        return -1;
217ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    }
218ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
219ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    if(p_cfg->fmt & USERIAL_PARITY_NONE)
220ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        parity = 0;
221ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    else if(p_cfg->fmt & USERIAL_PARITY_EVEN)
222ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        parity = PARENB;
223ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    else if(p_cfg->fmt & USERIAL_PARITY_ODD)
224ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        parity = (PARENB | PARODD);
225ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    else
226ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    {
227ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        ALOGE("userial vendor open: unsupported parity bit mode");
228ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        return -1;
229ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    }
230ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
231ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    if(p_cfg->fmt & USERIAL_STOPBITS_1)
232ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        stop_bits = 0;
233ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    else if(p_cfg->fmt & USERIAL_STOPBITS_2)
234ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        stop_bits = CSTOPB;
235ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    else
236ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    {
237ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        ALOGE("userial vendor open: unsupported stop bits");
238ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        return -1;
239ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    }
240ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
241ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    ALOGI("userial vendor open: opening %s", vnd_userial.port_name);
242ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
243ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    if ((vnd_userial.fd = open(vnd_userial.port_name, O_RDWR)) == -1)
244ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    {
245ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        ALOGE("userial vendor open: unable to open %s", vnd_userial.port_name);
246ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        return -1;
247ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    }
248ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
249ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    tcflush(vnd_userial.fd, TCIOFLUSH);
250ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
251ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    tcgetattr(vnd_userial.fd, &vnd_userial.termios);
252ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    cfmakeraw(&vnd_userial.termios);
253ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    vnd_userial.termios.c_cflag |= (CRTSCTS | stop_bits);
254ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    tcsetattr(vnd_userial.fd, TCSANOW, &vnd_userial.termios);
255ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    tcflush(vnd_userial.fd, TCIOFLUSH);
256ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
257ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    tcsetattr(vnd_userial.fd, TCSANOW, &vnd_userial.termios);
258ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    tcflush(vnd_userial.fd, TCIOFLUSH);
259ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    tcflush(vnd_userial.fd, TCIOFLUSH);
260ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
261ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    /* set input/output baudrate */
262ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    cfsetospeed(&vnd_userial.termios, baud);
263ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    cfsetispeed(&vnd_userial.termios, baud);
264ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    tcsetattr(vnd_userial.fd, TCSANOW, &vnd_userial.termios);
265ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
266ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
267ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    userial_ioctl_init_bt_wake(vnd_userial.fd);
268ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif
269ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
270ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    ALOGI("device fd = %d open", vnd_userial.fd);
271ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
272ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    return vnd_userial.fd;
273ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville}
274ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
275ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/*******************************************************************************
276ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
277ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Function        userial_vendor_close
278ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
279ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Description     Conduct vendor-specific close work
280ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
281ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Returns         None
282ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
283ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville*******************************************************************************/
284ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillevoid userial_vendor_close(void)
285ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{
286ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    int result;
287ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
288ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    if (vnd_userial.fd == -1)
289ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        return;
290ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
291ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
292ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    /* de-assert bt_wake BEFORE closing port */
293ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    ioctl(vnd_userial.fd, USERIAL_IOCTL_BT_WAKE_DEASSERT, NULL);
294ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif
295ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
296ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    ALOGI("device fd = %d close", vnd_userial.fd);
2975f939e27e27f26d630c1cf8b5873bf8128161000Thomas.TT_Lin    // flush Tx before close to make sure no chars in buffer
2985f939e27e27f26d630c1cf8b5873bf8128161000Thomas.TT_Lin    tcflush(vnd_userial.fd, TCIOFLUSH);
299ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    if ((result = close(vnd_userial.fd)) < 0)
300ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        ALOGE( "close(fd:%d) FAILED result:%d", vnd_userial.fd, result);
301ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
302ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    vnd_userial.fd = -1;
303ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville}
304ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
305ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/*******************************************************************************
306ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
307ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Function        userial_vendor_set_baud
308ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
309ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Description     Set new baud rate
310ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
311ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Returns         None
312ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
313ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville*******************************************************************************/
314ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillevoid userial_vendor_set_baud(uint8_t userial_baud)
315ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{
316ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    uint32_t tcio_baud;
317ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
318ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    userial_to_tcio_baud(userial_baud, &tcio_baud);
319ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
320ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    cfsetospeed(&vnd_userial.termios, tcio_baud);
321ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    cfsetispeed(&vnd_userial.termios, tcio_baud);
322ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    tcsetattr(vnd_userial.fd, TCSANOW, &vnd_userial.termios);
323ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville}
324ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
325ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/*******************************************************************************
326ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
327ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Function        userial_vendor_ioctl
328ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
329ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Description     ioctl inteface
330ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
331ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Returns         None
332ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
333ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville*******************************************************************************/
334ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillevoid userial_vendor_ioctl(userial_vendor_ioctl_op_t op, void *p_data)
335ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{
336ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    switch(op)
337ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    {
338ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
339ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        case USERIAL_OP_ASSERT_BT_WAKE:
340ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            VNDUSERIALDBG("## userial_vendor_ioctl: Asserting BT_Wake ##");
341ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            ioctl(vnd_userial.fd, USERIAL_IOCTL_BT_WAKE_ASSERT, NULL);
342ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            break;
343ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
344ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        case USERIAL_OP_DEASSERT_BT_WAKE:
345ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            VNDUSERIALDBG("## userial_vendor_ioctl: De-asserting BT_Wake ##");
346ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            ioctl(vnd_userial.fd, USERIAL_IOCTL_BT_WAKE_DEASSERT, NULL);
347ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            break;
348ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
349ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        case USERIAL_OP_GET_BT_WAKE_STATE:
350ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            ioctl(vnd_userial.fd, USERIAL_IOCTL_BT_WAKE_GET_ST, p_data);
351ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            break;
352ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif  //  (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
353ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
354ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        default:
355ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            break;
356ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    }
357ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville}
358ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
359ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/*******************************************************************************
360ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
361ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Function        userial_set_port
362ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
363ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Description     Configure UART port name
364ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
365ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Returns         0 : Success
366ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**                 Otherwise : Fail
367ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
368ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville*******************************************************************************/
369ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savilleint userial_set_port(char *p_conf_name, char *p_conf_value, int param)
370ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{
371ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    strcpy(vnd_userial.port_name, p_conf_value);
372ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
373ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    return 0;
374ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville}
375ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
376