Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
orangepi-xunlong
GitHub Repository: orangepi-xunlong/orangepi-build
Path: blob/next/external/cache/sources/rtk_hciattach/hciattach_rtk.c
8659 views
1
/*
2
* Copyright (C) 2013 Realtek Semiconductor Corp.
3
*
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License as published by
6
* the Free Software Foundation; either version 2 of the License, or
7
* (at your option) any later version.
8
*
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
13
*/
14
15
#ifdef HAVE_CONFIG_H
16
#include <config.h>
17
#endif
18
19
#include <stdio.h>
20
#include <errno.h>
21
#include <unistd.h>
22
#include <stdlib.h>
23
#include <termios.h>
24
#include <time.h>
25
#include <sys/time.h>
26
#include <sys/types.h>
27
#include <sys/param.h>
28
#include <sys/ioctl.h>
29
#include <sys/socket.h>
30
#include <sys/uio.h>
31
#include <sys/stat.h>
32
#include <fcntl.h>
33
#include <signal.h>
34
#include <stdint.h>
35
#include <string.h>
36
#include <endian.h>
37
#include <byteswap.h>
38
#include <netinet/in.h>
39
#include <poll.h>
40
#include <sys/timerfd.h>
41
#include <sys/epoll.h>
42
43
#include "rtb_fwc.h"
44
#include "hciattach.h"
45
#include "hciattach_h4.h"
46
47
#define RTK_VERSION "3.1.bca84ed.20190715-143612"
48
49
#define TIMESTAMP_PR
50
51
#define MAX_EVENTS 10
52
53
/* #define SERIAL_NONBLOCK_READ */
54
55
#ifdef SERIAL_NONBLOCK_READ
56
#define FD_BLOCK 0
57
#define FD_NONBLOCK 1
58
#endif
59
60
/* #define RTL_8703A_SUPPORT */
61
/* #define RTL8723DSH4_UART_HWFLOWC */ /* 8723DS H4 special */
62
63
uint8_t DBG_ON = 1;
64
65
#define HCI_EVENT_HDR_SIZE 2
66
/* #define RTK_PATCH_LENGTH_MAX 24576 */ //24*1024
67
#define RTB_PATCH_LENGTH_MAX (40 * 1024)
68
#define PATCH_DATA_FIELD_MAX_SIZE 252
69
70
#define HCI_CMD_READ_BD_ADDR 0x1009
71
#define HCI_VENDOR_CHANGE_BAUD 0xfc17
72
#define HCI_VENDOR_READ_ROM_VER 0xfc6d
73
#define HCI_CMD_READ_LOCAL_VER 0x1001
74
#define HCI_VENDOR_READ_CHIP_TYPE 0xfc61
75
#define HCI_CMD_RESET 0x0c03
76
77
/* HCI data types */
78
#define H5_ACK_PKT 0x00
79
#define HCI_COMMAND_PKT 0x01
80
#define HCI_ACLDATA_PKT 0x02
81
#define HCI_SCODATA_PKT 0x03
82
#define HCI_EVENT_PKT 0x04
83
#define H5_VDRSPEC_PKT 0x0E
84
#define H5_LINK_CTL_PKT 0x0F
85
86
#define H5_HDR_SEQ(hdr) ((hdr)[0] & 0x07)
87
#define H5_HDR_ACK(hdr) (((hdr)[0] >> 3) & 0x07)
88
#define H5_HDR_CRC(hdr) (((hdr)[0] >> 6) & 0x01)
89
#define H5_HDR_RELIABLE(hdr) (((hdr)[0] >> 7) & 0x01)
90
#define H5_HDR_PKT_TYPE(hdr) ((hdr)[1] & 0x0f)
91
#define H5_HDR_LEN(hdr) ((((hdr)[1] >> 4) & 0xff) + ((hdr)[2] << 4))
92
#define H5_HDR_SIZE 4
93
94
struct sk_buff {
95
uint32_t max_len;
96
uint32_t data_len;
97
uint8_t *data;
98
};
99
100
struct hci_ev_cmd_complete {
101
uint8_t ncmd;
102
uint16_t opcode;
103
} __attribute__ ((packed));
104
105
#define OP_H5_SYNC 0x01
106
#define OP_H5_CONFIG 0x02
107
#define OP_ROM_VER ((1 << 24) | HCI_VENDOR_READ_ROM_VER)
108
#define OP_LMP_VER ((1 << 24) | HCI_CMD_READ_LOCAL_VER)
109
#define OP_CHIP_TYPE ((1 << 24) | HCI_VENDOR_READ_CHIP_TYPE)
110
#define OP_SET_BAUD ((1 << 24) | HCI_VENDOR_CHANGE_BAUD)
111
#define OP_HCI_RESET ((1 << 24) | HCI_CMD_RESET)
112
113
struct rtb_struct rtb_cfg;
114
115
/* bite reverse in bytes
116
* 00000001 -> 10000000
117
* 00000100 -> 00100000
118
*/
119
const uint8_t byte_rev_table[256] = {
120
0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
121
0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
122
0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
123
0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
124
0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
125
0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
126
0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
127
0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
128
0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
129
0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
130
0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
131
0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
132
0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
133
0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
134
0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
135
0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
136
0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
137
0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
138
0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
139
0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
140
0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
141
0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
142
0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
143
0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
144
0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
145
0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
146
0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
147
0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
148
0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
149
0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
150
0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
151
0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
152
};
153
154
static __inline uint8_t bit_rev8(uint8_t byte)
155
{
156
return byte_rev_table[byte];
157
}
158
159
static __inline uint16_t bit_rev16(uint16_t x)
160
{
161
return (bit_rev8(x & 0xff) << 8) | bit_rev8(x >> 8);
162
}
163
164
static const uint16_t crc_table[] = {
165
0x0000, 0x1081, 0x2102, 0x3183,
166
0x4204, 0x5285, 0x6306, 0x7387,
167
0x8408, 0x9489, 0xa50a, 0xb58b,
168
0xc60c, 0xd68d, 0xe70e, 0xf78f
169
};
170
171
/* Initialise the crc calculator */
172
#define H5_CRC_INIT(x) x = 0xffff
173
174
static __inline struct sk_buff *skb_alloc(unsigned int len)
175
{
176
struct sk_buff *skb = NULL;
177
178
if ((skb = malloc(len + sizeof(*skb)))) {
179
skb->max_len = len;
180
skb->data_len = 0;
181
skb->data = ((uint8_t *)skb) + sizeof(*skb);
182
} else {
183
RS_ERR("Allocate skb fails!");
184
skb = NULL;
185
return NULL;
186
}
187
memset(skb->data, 0, len);
188
return skb;
189
}
190
191
static __inline void skb_free(struct sk_buff *skb)
192
{
193
free(skb);
194
return;
195
}
196
197
/*
198
* Add data to a buffer
199
* This function extends the used data area of the buffer.
200
*/
201
static uint8_t *skb_put(struct sk_buff *skb, uint32_t len)
202
{
203
uint32_t old_len = skb->data_len;
204
205
if ((skb->data_len + len) > (skb->max_len)) {
206
RS_ERR("Buffer too small");
207
exit(EXIT_FAILURE);
208
}
209
skb->data_len += len;
210
return (skb->data + old_len);
211
}
212
213
/*
214
* Remove end from a buffer
215
* Cut the length of a buffer down by removing data from the tail
216
*/
217
static void skb_trim(struct sk_buff *skb, uint32_t len)
218
{
219
if (skb->data_len > len) {
220
skb->data_len = len;
221
} else {
222
RS_ERR("Trim error, data_len %u < len %u", skb->data_len, len);
223
}
224
}
225
226
/*
227
* Remove data from the start of a buffer
228
* This function removes data from the start of a buffer.
229
* A pointer to the next data in the buffer is returned
230
*/
231
static uint8_t *skb_pull(struct sk_buff *skb, uint32_t len)
232
{
233
if (len > skb->data_len) {
234
RS_ERR("Pull error, data_len %u < len %u", skb->data_len, len);
235
exit(EXIT_FAILURE);
236
}
237
skb->data_len -= len;
238
skb->data += len;
239
return skb->data;
240
}
241
242
/**
243
* Add "d" into crc scope, caculate the new crc value
244
*
245
* @param crc crc data
246
* @param d one byte data
247
*/
248
static void h5_crc_update(uint16_t * crc, uint8_t d)
249
{
250
uint16_t reg = *crc;
251
252
reg = (reg >> 4) ^ crc_table[(reg ^ d) & 0x000f];
253
reg = (reg >> 4) ^ crc_table[(reg ^ (d >> 4)) & 0x000f];
254
255
*crc = reg;
256
}
257
258
struct __una_u16 {
259
uint16_t x;
260
};
261
static __inline uint16_t __get_unaligned_cpu16(const void *p)
262
{
263
const struct __una_u16 *ptr = (const struct __una_u16 *)p;
264
return ptr->x;
265
}
266
267
static __inline uint16_t get_unaligned_be16(const void *p)
268
{
269
return __get_unaligned_cpu16((const uint8_t *)p);
270
}
271
272
/*
273
* Get crc data.
274
*/
275
static uint16_t h5_get_crc(struct rtb_struct * h5)
276
{
277
uint16_t crc = 0;
278
uint8_t *data = h5->rx_skb->data + h5->rx_skb->data_len - 2;
279
280
crc = data[1] + (data[0] << 8);
281
return crc;
282
/* return get_unaligned_be16(&h5->rx_skb->data[h5->rx_skb->data_len - 2]); */
283
}
284
285
/*
286
* Add 0xc0 to buffer.
287
*/
288
static void h5_slip_msgdelim(struct sk_buff *skb)
289
{
290
const char pkt_delim = 0xc0;
291
memcpy(skb_put(skb, 1), &pkt_delim, 1);
292
}
293
294
/*
295
* Encode one byte in h5 proto
296
* 0xc0 -> 0xdb, 0xdc
297
* 0xdb -> 0xdb, 0xdd
298
* 0x11 -> 0xdb, 0xde
299
* 0x13 -> 0xdb, 0xdf
300
* others will not change
301
*/
302
static void h5_slip_one_byte(struct sk_buff *skb, uint8_t c)
303
{
304
const uint8_t esc_c0[2] = { 0xdb, 0xdc };
305
const uint8_t esc_db[2] = { 0xdb, 0xdd };
306
const uint8_t esc_11[2] = { 0xdb, 0xde };
307
const uint8_t esc_13[2] = { 0xdb, 0xdf };
308
309
switch (c) {
310
case 0xc0:
311
memcpy(skb_put(skb, 2), &esc_c0, 2);
312
break;
313
314
case 0xdb:
315
memcpy(skb_put(skb, 2), &esc_db, 2);
316
break;
317
318
case 0x11:
319
memcpy(skb_put(skb, 2), &esc_11, 2);
320
break;
321
322
case 0x13:
323
memcpy(skb_put(skb, 2), &esc_13, 2);
324
break;
325
326
default:
327
memcpy(skb_put(skb, 1), &c, 1);
328
break;
329
}
330
}
331
332
/*
333
* Decode one byte in h5 proto
334
* 0xdb, 0xdc -> 0xc0
335
* 0xdb, 0xdd -> 0xdb
336
* 0xdb, 0xde -> 0x11
337
* 0xdb, 0xdf -> 0x13
338
* others will not change
339
*/
340
static void h5_unslip_one_byte(struct rtb_struct * h5, unsigned char byte)
341
{
342
const uint8_t c0 = 0xc0, db = 0xdb;
343
const uint8_t oof1 = 0x11, oof2 = 0x13;
344
345
if (H5_ESCSTATE_NOESC == h5->rx_esc_state) {
346
if (0xdb == byte) {
347
h5->rx_esc_state = H5_ESCSTATE_ESC;
348
} else {
349
memcpy(skb_put(h5->rx_skb, 1), &byte, 1);
350
/* Check Pkt Header's CRC enable bit */
351
if ((h5->rx_skb->data[0] & 0x40) != 0 &&
352
h5->rx_state != H5_W4_CRC) {
353
h5_crc_update(&h5->message_crc, byte);
354
}
355
h5->rx_count--;
356
}
357
} else if (H5_ESCSTATE_ESC == h5->rx_esc_state) {
358
switch (byte) {
359
case 0xdc:
360
memcpy(skb_put(h5->rx_skb, 1), &c0, 1);
361
if ((h5->rx_skb->data[0] & 0x40) != 0 &&
362
h5->rx_state != H5_W4_CRC)
363
h5_crc_update(&h5->message_crc, 0xc0);
364
h5->rx_esc_state = H5_ESCSTATE_NOESC;
365
h5->rx_count--;
366
break;
367
368
case 0xdd:
369
memcpy(skb_put(h5->rx_skb, 1), &db, 1);
370
if ((h5->rx_skb->data[0] & 0x40) != 0 &&
371
h5->rx_state != H5_W4_CRC)
372
h5_crc_update(&h5->message_crc, 0xdb);
373
h5->rx_esc_state = H5_ESCSTATE_NOESC;
374
h5->rx_count--;
375
break;
376
377
case 0xde:
378
memcpy(skb_put(h5->rx_skb, 1), &oof1, 1);
379
if ((h5->rx_skb->data[0] & 0x40) != 0 &&
380
h5->rx_state != H5_W4_CRC)
381
h5_crc_update(&h5->message_crc, oof1);
382
h5->rx_esc_state = H5_ESCSTATE_NOESC;
383
h5->rx_count--;
384
break;
385
386
case 0xdf:
387
memcpy(skb_put(h5->rx_skb, 1), &oof2, 1);
388
if ((h5->rx_skb->data[0] & 0x40) != 0 &&
389
h5->rx_state != H5_W4_CRC)
390
h5_crc_update(&h5->message_crc, oof2);
391
h5->rx_esc_state = H5_ESCSTATE_NOESC;
392
h5->rx_count--;
393
break;
394
395
default:
396
RS_ERR("Error: Invalid byte %02x after esc byte", byte);
397
skb_free(h5->rx_skb);
398
h5->rx_skb = NULL;
399
h5->rx_state = H5_W4_PKT_DELIMITER;
400
h5->rx_count = 0;
401
break;
402
}
403
}
404
}
405
406
/*
407
* Prepare h5 packet
408
* Refer to Core Spec Vol 4, Part D
409
* Three-wire UART Transport Layer: 4 PACKET HEADER
410
*/
411
static struct sk_buff *h5_prepare_pkt(struct rtb_struct * h5, uint8_t *data,
412
int len, int pkt_type)
413
{
414
struct sk_buff *nskb;
415
uint8_t hdr[4];
416
uint16_t H5_CRC_INIT(h5_txmsg_crc);
417
int rel, i;
418
419
switch (pkt_type) {
420
case HCI_ACLDATA_PKT:
421
case HCI_COMMAND_PKT:
422
case HCI_EVENT_PKT:
423
rel = 1; /* reliable */
424
break;
425
426
case H5_ACK_PKT:
427
case H5_VDRSPEC_PKT:
428
case H5_LINK_CTL_PKT:
429
rel = 0; /* unreliable */
430
break;
431
432
default:
433
RS_ERR("Unknown packet type");
434
return NULL;
435
}
436
437
/* Max len of packet: (len + 4(h5 hdr) + 2(crc))*2
438
* Because bytes 0xc0 and 0xdb are escaped, worst case is that the
439
* packet is only made of 0xc0 and 0xdb
440
* The additional 2-octets are 0xc0 delimiters at start and end of each
441
* packet.
442
*/
443
nskb = skb_alloc((len + 6) * 2 + 2);
444
if (!nskb)
445
return NULL;
446
447
/* Add SLIP start byte: 0xc0 */
448
h5_slip_msgdelim(nskb);
449
/* Set ack number in SLIP header */
450
hdr[0] = h5->rxseq_txack << 3;
451
h5->is_txack_req = 0;
452
453
/* RS_DBG("Request packet no(%u) to card", h5->rxseq_txack); */
454
/* RS_DBG("Sending packet with seqno %u and wait %u", h5->msgq_txseq,
455
* h5->rxseq_txack);
456
*/
457
if (rel) {
458
/* Set reliable bit and seq number */
459
hdr[0] |= 0x80 + h5->msgq_txseq;
460
/* RS_DBG("Sending packet with seqno(%u)", h5->msgq_txseq); */
461
++(h5->msgq_txseq);
462
h5->msgq_txseq = (h5->msgq_txseq) & 0x07;
463
}
464
/* Set DIC Present bit */
465
if (h5->use_crc)
466
hdr[0] |= 0x40;
467
468
/* Set packet type and payload length */
469
hdr[1] = ((len << 4) & 0xff) | pkt_type;
470
hdr[2] = (uint8_t) (len >> 4);
471
/* Set header checksum */
472
hdr[3] = ~(hdr[0] + hdr[1] + hdr[2]);
473
474
/* Encode h5 header */
475
for (i = 0; i < 4; i++) {
476
h5_slip_one_byte(nskb, hdr[i]);
477
478
if (h5->use_crc)
479
h5_crc_update(&h5_txmsg_crc, hdr[i]);
480
}
481
482
/* Encode payload */
483
for (i = 0; i < len; i++) {
484
h5_slip_one_byte(nskb, data[i]);
485
486
if (h5->use_crc)
487
h5_crc_update(&h5_txmsg_crc, data[i]);
488
}
489
490
/* Encode CRC */
491
if (h5->use_crc) {
492
h5_txmsg_crc = bit_rev16(h5_txmsg_crc);
493
h5_slip_one_byte(nskb, (uint8_t) ((h5_txmsg_crc >> 8) & 0x00ff));
494
h5_slip_one_byte(nskb, (uint8_t) (h5_txmsg_crc & 0x00ff));
495
}
496
/* Add 0xc0 at the end of the packet */
497
h5_slip_msgdelim(nskb);
498
499
return nskb;
500
}
501
502
/*
503
* Remove controller acked packet from host unacked lists
504
*/
505
/* static void h5_remove_acked_pkt(struct rtb_struct * h5)
506
* {
507
* int pkts_to_be_removed = 0;
508
* int seqno = 0;
509
* int i = 0;
510
*
511
* seqno = h5->msgq_txseq;
512
* // pkts_to_be_removed = GetListLength(h5->unacked);
513
*
514
* while (pkts_to_be_removed) {
515
* if (h5->rxack == seqno)
516
* break;
517
*
518
* pkts_to_be_removed--;
519
* seqno = (seqno - 1) & 0x07;
520
* }
521
*
522
* if (h5->rxack != seqno) {
523
* RS_DBG("Peer acked invalid packet");
524
* }
525
* // skb_queue_walk_safe(&h5->unack, skb, tmp)
526
* // remove ack'ed packet from h5->unack queue
527
* for (i = 0; i < 5; ++i) {
528
* if (i >= pkts_to_be_removed)
529
* break;
530
* i++;
531
* //__skb_unlink(skb, &h5->unack);
532
* //skb_free(skb);
533
* }
534
*
535
* // if (skb_queue_empty(&h5->unack))
536
* // del_timer(&h5->th5);
537
* // spin_unlock_irqrestore(&h5->unack.lock, flags);
538
*
539
* if (i != pkts_to_be_removed)
540
* RS_DBG("Removed only (%u) out of (%u) pkts", i,
541
* pkts_to_be_removed);
542
* }
543
*/
544
545
/*
546
* Send host ack.
547
*/
548
static void rtb_send_ack(int fd)
549
{
550
int len;
551
struct sk_buff *nskb = h5_prepare_pkt(&rtb_cfg, NULL, 0, H5_ACK_PKT);
552
553
len = write(fd, nskb->data, nskb->data_len);
554
if (len != nskb->data_len)
555
RS_ERR("Write pure ack fails");
556
557
skb_free(nskb);
558
return;
559
}
560
561
/*
562
* Parse hci command complete event in h5 init state.
563
*/
564
static void h5_init_hci_cc(struct sk_buff *skb)
565
{
566
struct hci_ev_cmd_complete *ev = NULL;
567
uint16_t opcode = 0;
568
uint8_t status = 0;
569
570
skb_pull(skb, HCI_EVENT_HDR_SIZE);
571
ev = (struct hci_ev_cmd_complete *)skb->data;
572
opcode = le16_to_cpu(ev->opcode);
573
574
RS_DBG("Receive cmd complete event of command: %04x", opcode);
575
576
skb_pull(skb, sizeof(struct hci_ev_cmd_complete));
577
578
status = skb->data[0];
579
if (status) {
580
RS_ERR("status is %u for cmd %04x", status, opcode);
581
return;
582
}
583
584
if (rtb_cfg.cmd_state.opcode != opcode) {
585
RS_ERR("%s: Received unexpected cc for cmd %04x, %04x of cc",
586
__func__, rtb_cfg.cmd_state.opcode, opcode);
587
return;
588
}
589
590
rtb_cfg.cmd_state.state = CMD_STATE_SUCCESS;
591
592
switch (opcode) {
593
case HCI_VENDOR_CHANGE_BAUD:
594
RS_INFO("Received cc of vendor change baud");
595
break;
596
case HCI_CMD_READ_BD_ADDR:
597
RS_INFO("BD Address: %02x:%02x:%02x:%02x:%02x:%02x",
598
skb->data[5], skb->data[4], skb->data[3],
599
skb->data[2], skb->data[1], skb->data[0]);
600
break;
601
602
case HCI_CMD_READ_LOCAL_VER:
603
rtb_cfg.hci_ver = skb->data[1];
604
rtb_cfg.hci_rev = (skb->data[2] | skb->data[3] << 8);
605
rtb_cfg.lmp_subver = (skb->data[7] | (skb->data[8] << 8));
606
RS_INFO("HCI Version 0x%02x", rtb_cfg.hci_ver);
607
RS_INFO("HCI Revision 0x%04x", rtb_cfg.hci_rev);
608
RS_INFO("LMP Subversion 0x%04x", rtb_cfg.lmp_subver);
609
break;
610
611
case HCI_VENDOR_READ_ROM_VER:
612
rtb_cfg.eversion = skb->data[1];
613
RS_INFO("Read ROM version %02x", rtb_cfg.eversion);
614
break;
615
616
case HCI_VENDOR_READ_CHIP_TYPE:
617
rtb_cfg.chip_type = (skb->data[1] & 0x0f);
618
RS_INFO("Read chip type %02x", rtb_cfg.chip_type);
619
break;
620
default:
621
return;
622
}
623
624
/* Count the cmd num for makeing the seq number aligned */
625
rtb_cfg.num_of_cmd_sent++;
626
}
627
628
/*
629
* Parse hci command complete event in h5 post state.
630
*/
631
static void h5_post_hci_cc(struct sk_buff *skb)
632
{
633
struct hci_ev_cmd_complete *ev = NULL;
634
uint16_t opcode = 0;
635
uint8_t status = 0;
636
637
skb_pull(skb, HCI_EVENT_HDR_SIZE);
638
ev = (struct hci_ev_cmd_complete *)skb->data;
639
opcode = le16_to_cpu(ev->opcode);
640
641
RS_DBG("Receive cmd complete event of command: %04x", opcode);
642
643
skb_pull(skb, sizeof(struct hci_ev_cmd_complete));
644
645
status = skb->data[0];
646
if (status) {
647
RS_ERR("status is %u for cmd %04x", status, opcode);
648
return;
649
}
650
651
if (rtb_cfg.cmd_state.opcode != opcode) {
652
RS_ERR("%s: Received unexpected cc for cmd %04x, %04x of cc",
653
__func__, rtb_cfg.cmd_state.opcode, opcode);
654
return;
655
}
656
657
rtb_cfg.cmd_state.state = CMD_STATE_SUCCESS;
658
659
switch (opcode) {
660
case HCI_CMD_RESET:
661
RS_INFO("Received cc of hci reset cmd");
662
rtb_cfg.link_estab_state = H5_ACTIVE;
663
break;
664
default:
665
break;
666
}
667
}
668
669
/*
670
* Process a hci frame
671
*/
672
static void hci_recv_frame(struct sk_buff *skb)
673
{
674
if (rtb_cfg.link_estab_state == H5_INIT) {
675
if (skb->data[0] == 0x0e)
676
h5_init_hci_cc(skb);
677
678
/*
679
* rtb_send_ack(rtb_cfg.serial_fd);
680
* usleep(10000);
681
* rtb_send_ack(rtb_cfg.serial_fd);
682
*/
683
} else if (rtb_cfg.link_estab_state == H5_PATCH) {
684
if (skb->data[0] != 0x0e) {
685
RS_INFO("Received event 0x%x during download patch",
686
skb->data[0]);
687
return;
688
}
689
690
rtb_cfg.rx_index = skb->data[6];
691
692
/* RS_INFO("rx_index %d", rtb_cfg.rx_index); */
693
694
/* Download fw/config done */
695
if (rtb_cfg.rx_index & 0x80) {
696
rtb_cfg.rx_index &= ~0x80;
697
rtb_cfg.link_estab_state = H5_HCI_RESET;
698
}
699
} else if (rtb_cfg.link_estab_state == H5_HCI_RESET) {
700
if (skb->data[0] == 0x0e)
701
h5_post_hci_cc(skb);
702
} else {
703
RS_ERR("receive packets in active state");
704
}
705
}
706
707
static void h5_handle_internal_rx(struct sk_buff *skb)
708
{
709
int len;
710
uint8_t sync_req[2] = { 0x01, 0x7E };
711
uint8_t sync_resp[2] = { 0x02, 0x7D };
712
uint8_t sync_resp_pkt[0x8] = {
713
0xc0, 0x00, 0x2F, 0x00, 0xD0, 0x02, 0x7D, 0xc0
714
};
715
uint8_t conf_req[2] = { 0x03, 0xFC };
716
uint8_t conf_resp[2] = { 0x04, 0x7B };
717
uint8_t conf_resp_pkt[0x8] = {
718
0xc0, 0x00, 0x2F, 0x00, 0xD0, 0x04, 0x7B, 0xc0
719
};
720
721
if (rtb_cfg.link_estab_state == H5_SYNC) {
722
if (!memcmp(skb->data, sync_req, 2)) {
723
RS_INFO("[SYNC] Get SYNC Pkt\n");
724
len = write(rtb_cfg.serial_fd, sync_resp_pkt, 0x8);
725
if (len != 0x08)
726
RS_ERR("Send h5 sync resp error, %s",
727
strerror(errno));
728
} else if (!memcmp(skb->data, sync_resp, 2)) {
729
RS_INFO("[SYNC] Get SYNC Resp Pkt");
730
rtb_cfg.link_estab_state = H5_CONFIG;
731
}
732
} else if (rtb_cfg.link_estab_state == H5_CONFIG) {
733
if (!memcmp(skb->data, sync_req, 0x2)) {
734
RS_INFO("[CONFIG] Get SYNC pkt");
735
len = write(rtb_cfg.serial_fd, sync_resp_pkt, 0x8);
736
if (len != 0x08)
737
RS_ERR("Send h5 sync resp error, %s",
738
strerror(errno));
739
} else if (!memcmp(skb->data, conf_req, 0x2)) {
740
RS_INFO("[CONFIG] Get CONFG pkt");
741
len = write(rtb_cfg.serial_fd, conf_resp_pkt, 0x8);
742
if (len != 0x08)
743
RS_ERR("Send h5 sync resp to ctl error, %s",
744
strerror(errno));
745
} else if (!memcmp(skb->data, conf_resp, 0x2)) {
746
RS_INFO("[CONFIG] Get CONFG resp pkt");
747
/* Change state to H5_INIT after receiving a conf resp
748
*/
749
rtb_cfg.link_estab_state = H5_INIT;
750
if (skb->data_len > 2) {
751
rtb_cfg.use_crc = ((skb->data[2]) >> 4) & 0x01;
752
RS_INFO("dic is %u, cfg field 0x%02x",
753
rtb_cfg.use_crc, skb->data[2]);
754
}
755
} else {
756
RS_WARN("[CONFIG] Get unknown pkt");
757
rtb_send_ack(rtb_cfg.serial_fd);
758
}
759
}
760
}
761
762
/*
763
* Process the received complete h5 packet
764
*/
765
static void h5_complete_rx_pkt(struct rtb_struct *h5)
766
{
767
int pass_up = 1;
768
uint8_t *h5_hdr = NULL;
769
770
h5_hdr = (uint8_t *) (h5->rx_skb->data);
771
if (H5_HDR_RELIABLE(h5_hdr)) {
772
/* RS_DBG("Received reliable seqno %u from card", h5->rxseq_txack);
773
*/
774
h5->rxseq_txack = H5_HDR_SEQ(h5_hdr) + 1;
775
/* h5->rxseq_txack %= 8; */
776
h5->rxseq_txack &= 0x07;
777
h5->is_txack_req = 1;
778
}
779
780
h5->rxack = H5_HDR_ACK(h5_hdr);
781
782
switch (H5_HDR_PKT_TYPE(h5_hdr)) {
783
case HCI_ACLDATA_PKT:
784
case HCI_EVENT_PKT:
785
case HCI_COMMAND_PKT:
786
/* h5_remove_acked_pkt(h5); */
787
pass_up = 1;
788
break;
789
case HCI_SCODATA_PKT:
790
pass_up = 1;
791
break;
792
case H5_LINK_CTL_PKT:
793
pass_up = 0;
794
skb_pull(h5->rx_skb, H5_HDR_SIZE);
795
h5_handle_internal_rx(h5->rx_skb);
796
break;
797
default: /* Pure ack or other unexpected pkt */
798
pass_up = 0;
799
break;
800
}
801
802
if (pass_up) {
803
skb_pull(h5->rx_skb, H5_HDR_SIZE);
804
hci_recv_frame(h5->rx_skb);
805
}
806
807
if (h5->is_txack_req) {
808
rtb_send_ack(rtb_cfg.serial_fd);
809
h5->is_txack_req = 0;
810
}
811
812
skb_free(h5->rx_skb);
813
814
h5->rx_state = H5_W4_PKT_DELIMITER;
815
h5->rx_skb = NULL;
816
}
817
818
/*
819
* Parse the receive data in h5 proto.
820
*/
821
static int h5_recv(struct rtb_struct *h5, void *data, int count)
822
{
823
unsigned char *ptr;
824
ptr = (unsigned char *)data;
825
826
while (count) {
827
if (h5->rx_count) {
828
if (*ptr == 0xc0) {
829
RS_ERR("Short h5 packet");
830
skb_free(h5->rx_skb);
831
h5->rx_state = H5_W4_PKT_START;
832
h5->rx_count = 0;
833
} else
834
h5_unslip_one_byte(h5, *ptr);
835
836
ptr++;
837
count--;
838
continue;
839
}
840
841
switch (h5->rx_state) {
842
case H5_W4_HDR:
843
/* Check header checksum */
844
if ((0xff & (uint8_t)~(h5->rx_skb->data[0] + h5->rx_skb->data[1] +
845
h5->rx_skb->data[2])) != h5->rx_skb->data[3]) {
846
RS_ERR("h5 hdr checksum error");
847
skb_free(h5->rx_skb);
848
h5->rx_state = H5_W4_PKT_DELIMITER;
849
h5->rx_count = 0;
850
continue;
851
}
852
853
/* The received seq number is unexpected */
854
if (h5->rx_skb->data[0] & 0x80 &&
855
(h5->rx_skb->data[0] & 0x07) != h5->rxseq_txack) {
856
uint8_t rxseq_txack = (h5->rx_skb->data[0] & 0x07);
857
RS_ERR("Out-of-order packet arrived, got(%u)expected(%u)",
858
h5->rx_skb->data[0] & 0x07,
859
h5->rxseq_txack);
860
h5->is_txack_req = 1;
861
862
skb_free(h5->rx_skb);
863
h5->rx_state = H5_W4_PKT_DELIMITER;
864
h5->rx_count = 0;
865
866
/* Depend on whether Controller will reset ack
867
* number or not
868
*/
869
if (rtb_cfg.link_estab_state == H5_PATCH &&
870
rtb_cfg.tx_index == rtb_cfg.total_num)
871
rtb_cfg.rxseq_txack = rxseq_txack;
872
873
continue;
874
}
875
h5->rx_state = H5_W4_DATA;
876
h5->rx_count =
877
(h5->rx_skb->data[1] >> 4) +
878
(h5->rx_skb->data[2] << 4);
879
continue;
880
881
case H5_W4_DATA:
882
/* Packet with crc */
883
if (h5->rx_skb->data[0] & 0x40) {
884
h5->rx_state = H5_W4_CRC;
885
h5->rx_count = 2;
886
} else {
887
h5_complete_rx_pkt(h5);
888
}
889
continue;
890
891
case H5_W4_CRC:
892
if (bit_rev16(h5->message_crc) != h5_get_crc(h5)) {
893
RS_ERR("Checksum failed, computed %04x received %04x",
894
bit_rev16(h5->message_crc),
895
h5_get_crc(h5));
896
skb_free(h5->rx_skb);
897
h5->rx_state = H5_W4_PKT_DELIMITER;
898
h5->rx_count = 0;
899
continue;
900
}
901
skb_trim(h5->rx_skb, h5->rx_skb->data_len - 2);
902
h5_complete_rx_pkt(h5);
903
continue;
904
905
case H5_W4_PKT_DELIMITER:
906
switch (*ptr) {
907
case 0xc0:
908
h5->rx_state = H5_W4_PKT_START;
909
break;
910
911
default:
912
break;
913
}
914
ptr++;
915
count--;
916
break;
917
918
case H5_W4_PKT_START:
919
switch (*ptr) {
920
case 0xc0:
921
ptr++;
922
count--;
923
break;
924
925
default:
926
h5->rx_state = H5_W4_HDR;
927
h5->rx_count = 4;
928
h5->rx_esc_state = H5_ESCSTATE_NOESC;
929
H5_CRC_INIT(h5->message_crc);
930
931
/* Do not increment ptr or decrement count
932
* Allocate packet. Max len of a H5 pkt=
933
* 0xFFF (payload) +4 (header) +2 (crc)
934
*/
935
h5->rx_skb = skb_alloc(0x1005);
936
if (!h5->rx_skb) {
937
RS_ERR("Can't alloc skb for new pkt");
938
h5->rx_state = H5_W4_PKT_DELIMITER;
939
h5->rx_count = 0;
940
return 0;
941
}
942
break;
943
}
944
break;
945
946
default:
947
break;
948
}
949
}
950
return count;
951
}
952
953
static const char *op_string(uint32_t op)
954
{
955
switch (op) {
956
case OP_SET_BAUD:
957
return "OP_SET_BAUD";
958
case OP_H5_SYNC:
959
return "OP_H5_SYNC";
960
case OP_H5_CONFIG:
961
return "OP_H5_CONFIG";
962
case OP_HCI_RESET:
963
return "OP_HCI_RESET";
964
case OP_CHIP_TYPE:
965
return "OP_CHIP_TYPE";
966
case OP_ROM_VER:
967
return "OP_ROM_VER";
968
case OP_LMP_VER:
969
return "OP_LMP_VER";
970
default:
971
return "OP_UNKNOWN";
972
}
973
}
974
975
static int start_transmit_wait(int fd, struct sk_buff *skb,
976
uint32_t op, unsigned int msec, int retry)
977
{
978
unsigned char buf[128];
979
ssize_t result;
980
struct iovec iov;
981
ssize_t ret;
982
uint8_t *data;
983
int len;
984
int op_result = -1;
985
uint64_t expired;
986
int n;
987
struct epoll_event events[MAX_EVENTS];
988
int nfds;
989
uint16_t opcode = 0;
990
991
if (fd == -1 || !skb) {
992
RS_ERR("Invalid parameter");
993
return -1;
994
}
995
996
data = skb->data;
997
len = skb->data_len;
998
999
if (op & (1 << 24)) {
1000
opcode = (op & 0xffff);
1001
if (opcode != rtb_cfg.cmd_state.opcode ||
1002
rtb_cfg.cmd_state.state != CMD_STATE_UNKNOWN) {
1003
RS_ERR("Invalid opcode or cmd state");
1004
return -1;
1005
}
1006
}
1007
1008
iov.iov_base = data;
1009
iov.iov_len = len;
1010
do {
1011
ret = writev(fd, &iov, 1);
1012
if (ret != len)
1013
RS_WARN("Writev partially, ret %d", (int)ret);
1014
} while (ret < 0 && errno == EINTR);
1015
1016
if (ret < 0) {
1017
RS_ERR("Call writev error, %s", strerror(errno));
1018
return -errno;
1019
}
1020
1021
/* Set timeout */
1022
if (rtb_cfg.timerfd > 0)
1023
timeout_set(rtb_cfg.timerfd, msec);
1024
1025
do {
1026
nfds = epoll_wait(rtb_cfg.epollfd, events, MAX_EVENTS, msec);
1027
if (nfds == -1) {
1028
RS_ERR("epoll_wait, %s (%d)", strerror(errno), errno);
1029
exit(EXIT_FAILURE);
1030
}
1031
1032
for (n = 0; n < nfds; ++n) {
1033
if (events[n].data.fd == rtb_cfg.serial_fd) {
1034
if (events[n].events & (EPOLLERR | EPOLLHUP |
1035
EPOLLRDHUP)) {
1036
RS_ERR("%s: Error happens on serial fd",
1037
__func__);
1038
exit(EXIT_FAILURE);
1039
}
1040
result = read(events[n].data.fd, buf,
1041
sizeof(buf));
1042
if (result <= 0) {
1043
RS_ERR("Read serial error, %s",
1044
strerror(errno));
1045
continue;
1046
} else {
1047
h5_recv(&rtb_cfg, buf, result);
1048
}
1049
} else if (events[n].data.fd == rtb_cfg.timerfd) {
1050
if (events[n].events & (EPOLLERR | EPOLLHUP |
1051
EPOLLRDHUP)) {
1052
RS_ERR("%s: Error happens on timer fd",
1053
__func__);
1054
exit(EXIT_FAILURE);
1055
}
1056
RS_WARN("%s Transmission timeout",
1057
op_string(op));
1058
result = read(events[n].data.fd, &expired,
1059
sizeof(expired));
1060
if (result != sizeof(expired)) {
1061
RS_ERR("Skip retransmit");
1062
break;
1063
}
1064
if (retry <= 0) {
1065
RS_ERR("Retransmission exhausts");
1066
tcflush(fd, TCIOFLUSH);
1067
exit(EXIT_FAILURE);
1068
}
1069
1070
iov.iov_base = data;
1071
iov.iov_len = len;
1072
1073
do {
1074
ret = writev(fd, &iov, 1);
1075
if (ret != len)
1076
RS_WARN("Writev partial, %d",
1077
(int)ret);
1078
} while (ret < 0 && errno == EINTR);
1079
1080
if (ret < 0) {
1081
RS_ERR("ReCall writev error, %s",
1082
strerror(errno));
1083
return -errno;
1084
}
1085
1086
retry--;
1087
timeout_set(rtb_cfg.timerfd, msec);
1088
}
1089
}
1090
1091
if (!(op & (1 << 24))) {
1092
/* h5 sync or config */
1093
if (op == OP_H5_SYNC && rtb_cfg.link_estab_state ==
1094
H5_CONFIG) {
1095
op_result = 0;
1096
break;
1097
}
1098
1099
if (op == OP_H5_CONFIG && rtb_cfg.link_estab_state ==
1100
H5_INIT) {
1101
op_result = 0;
1102
break;
1103
}
1104
continue;
1105
}
1106
1107
if (rtb_cfg.cmd_state.opcode == opcode &&
1108
rtb_cfg.cmd_state.state == CMD_STATE_SUCCESS) {
1109
op_result = 0;
1110
break;
1111
}
1112
} while (1);
1113
1114
/* Disarms timer */
1115
timeout_set(rtb_cfg.timerfd, 0);
1116
1117
return op_result;
1118
}
1119
1120
static int h5_download_patch(int dd, int index, uint8_t *data, int len,
1121
struct termios *ti)
1122
{
1123
unsigned char buf[64];
1124
int retlen;
1125
struct iovec iov;
1126
ssize_t ret;
1127
int nfds;
1128
struct epoll_event events[MAX_EVENTS];
1129
int n;
1130
int timeout;
1131
uint64_t expired;
1132
int retry = 3;
1133
struct sk_buff *nskb;
1134
uint8_t hci_patch[PATCH_DATA_FIELD_MAX_SIZE + 4];
1135
1136
if (index & 0x80) {
1137
rtb_cfg.tx_index = index & 0x7f;
1138
timeout = 1000;
1139
} else {
1140
rtb_cfg.tx_index = index;
1141
timeout = 800;
1142
}
1143
1144
/* download cmd: 0xfc20 */
1145
hci_patch[0] = 0x20;
1146
hci_patch[1] = 0xfc;
1147
hci_patch[2] = len + 1;
1148
hci_patch[3] = (uint8_t)index;
1149
if (data)
1150
memcpy(&hci_patch[4], data, len);
1151
1152
/* length: 2-byte opcode + 1-byte len + 1-byte index + payload */
1153
nskb = h5_prepare_pkt(&rtb_cfg, hci_patch, len + 4, HCI_COMMAND_PKT);
1154
if (!nskb) {
1155
RS_ERR("Prepare command packet for download");
1156
return -1;
1157
}
1158
1159
/* Save pkt address and length for re-transmission */
1160
len = nskb->data_len;
1161
data = nskb->data;
1162
1163
iov.iov_base = nskb->data;
1164
iov.iov_len = nskb->data_len;
1165
do {
1166
ret = writev(dd, &iov, 1);
1167
if (ret != len)
1168
RS_WARN("Writev partially, ret %d", (int)ret);
1169
} while (ret < 0 && errno == EINTR);
1170
1171
if (ret < 0) {
1172
RS_ERR("Call writev error, %s", strerror(errno));
1173
skb_free(nskb);
1174
return -errno;
1175
}
1176
1177
/* RS_INFO("%s: tx_index %d, rx_index %d", __func__,
1178
* rtb_cfg.tx_index, rtb_cfg.rx_index);
1179
*/
1180
1181
if (index & 0x80) {
1182
/* For the last pkt, wait for its complete */
1183
tcdrain(dd);
1184
1185
if (rtb_cfg.uart_flow_ctrl) {
1186
RS_INFO("Enable host hw flow control");
1187
ti->c_cflag |= CRTSCTS;
1188
} else {
1189
RS_INFO("Disable host hw flow control");
1190
ti->c_cflag &= ~CRTSCTS;
1191
}
1192
1193
if (tcsetattr(dd, TCSANOW, ti) < 0) {
1194
RS_ERR("Can't set port settings");
1195
skb_free(nskb);
1196
return -1;
1197
}
1198
1199
/* RS_INFO("Change baud to %d", rtb_cfg.final_speed);
1200
* if (set_speed(dd, ti, rtb_cfg.final_speed) < 0) {
1201
* RS_ERR("Set final speed %d error",
1202
* rtb_cfg.final_speed);
1203
* }
1204
*/
1205
}
1206
1207
if (rtb_cfg.timerfd > 0)
1208
timeout_set(rtb_cfg.timerfd, timeout);
1209
1210
do {
1211
nfds = epoll_wait(rtb_cfg.epollfd, events, MAX_EVENTS, -1);
1212
if (nfds == -1) {
1213
RS_ERR("epoll_wait, %s (%d)", strerror(errno), errno);
1214
exit(EXIT_FAILURE);
1215
}
1216
1217
for (n = 0; n < nfds; ++n) {
1218
if (events[n].data.fd == dd) {
1219
if (events[n].events & (EPOLLERR | EPOLLHUP |
1220
EPOLLRDHUP)) {
1221
RS_ERR("%s: Error happens on serial fd",
1222
__func__);
1223
exit(EXIT_FAILURE);
1224
}
1225
retlen = read(dd, buf, sizeof(buf));
1226
if (retlen <= 0) {
1227
RS_ERR("Read serial error, %s", strerror(errno));
1228
continue;
1229
} else {
1230
h5_recv(&rtb_cfg, buf, retlen);
1231
}
1232
} else if (events[n].data.fd == rtb_cfg.timerfd) {
1233
int fd = events[n].data.fd;
1234
1235
if (events[n].events & (EPOLLERR | EPOLLHUP |
1236
EPOLLRDHUP)) {
1237
RS_ERR("%s: Error happens on timer fd",
1238
__func__);
1239
exit(EXIT_FAILURE);
1240
}
1241
RS_WARN("Patch pkt trans timeout, re-trans");
1242
ret = read(fd, &expired, sizeof(expired));
1243
if (ret != sizeof(expired)) {
1244
RS_ERR("Read expired info error");
1245
exit(EXIT_FAILURE);
1246
}
1247
if (retry <= 0) {
1248
RS_ERR("%s: Retransmission exhausts",
1249
__func__);
1250
tcflush(fd, TCIOFLUSH);
1251
exit(EXIT_FAILURE);
1252
}
1253
1254
iov.iov_base = data;
1255
iov.iov_len = len;
1256
1257
do {
1258
ret = writev(dd, &iov, 1);
1259
if (ret != len)
1260
RS_WARN("Writev partial, %d",
1261
(int)ret);
1262
} while (ret < 0 && errno == EINTR);
1263
1264
if (ret < 0) {
1265
RS_ERR("ReCall writev error, %s",
1266
strerror(errno));
1267
skb_free(nskb);
1268
return -errno;
1269
}
1270
1271
retry--;
1272
timeout_set(fd, timeout);
1273
}
1274
}
1275
} while (rtb_cfg.rx_index != rtb_cfg.tx_index);
1276
1277
/* Disarms timer */
1278
if (rtb_cfg.timerfd > 0)
1279
timeout_set(rtb_cfg.timerfd, 0);
1280
1281
skb_free(nskb);
1282
return 0;
1283
}
1284
1285
/*
1286
* Change the Controller's UART speed.
1287
*/
1288
int h5_vendor_change_speed(int fd, uint32_t baudrate)
1289
{
1290
struct sk_buff *nskb = NULL;
1291
unsigned char cmd[16] = { 0 };
1292
int result;
1293
1294
cmd[0] = 0x17;
1295
cmd[1] = 0xfc;
1296
cmd[2] = 4;
1297
1298
baudrate = cpu_to_le32(baudrate);
1299
#ifdef BAUDRATE_4BYTES
1300
memcpy((uint16_t *) & cmd[3], &baudrate, 4);
1301
#else
1302
memcpy((uint16_t *) & cmd[3], &baudrate, 2);
1303
1304
cmd[5] = 0;
1305
cmd[6] = 0;
1306
#endif
1307
1308
RS_DBG("baudrate in change speed command: 0x%02x 0x%02x 0x%02x 0x%02x",
1309
cmd[3], cmd[4], cmd[5], cmd[6]);
1310
1311
nskb = h5_prepare_pkt(&rtb_cfg, cmd, 7, HCI_COMMAND_PKT);
1312
if (!nskb) {
1313
RS_ERR("Prepare command packet for change speed fail");
1314
return -1;
1315
}
1316
1317
rtb_cfg.cmd_state.opcode = HCI_VENDOR_CHANGE_BAUD;;
1318
rtb_cfg.cmd_state.state = CMD_STATE_UNKNOWN;
1319
result = start_transmit_wait(fd, nskb, OP_SET_BAUD, 1000, 0);
1320
skb_free(nskb);
1321
if (result < 0) {
1322
RS_ERR("OP_SET_BAUD Transmission error");
1323
return result;
1324
}
1325
1326
return 0;
1327
}
1328
1329
/*
1330
* Init realtek Bluetooth h5 proto.
1331
* There are two steps: h5 sync and h5 config.
1332
*/
1333
int rtb_init_h5(int fd, struct termios *ti)
1334
{
1335
struct sk_buff *nskb;
1336
unsigned char h5sync[2] = { 0x01, 0x7E };
1337
/* 16-bit CCITT CRC may be used and the sliding win size is 4 */
1338
unsigned char h5conf[3] = { 0x03, 0xFC, 0x14 };
1339
int result;
1340
1341
/* Disable CRTSCTS by default */
1342
ti->c_cflag &= ~CRTSCTS;
1343
1344
/* set even parity */
1345
ti->c_cflag |= PARENB;
1346
ti->c_cflag &= ~(PARODD);
1347
if (tcsetattr(fd, TCSANOW, ti) < 0) {
1348
RS_ERR("Can't set port settings");
1349
return -1;
1350
}
1351
1352
/* h5 sync */
1353
rtb_cfg.link_estab_state = H5_SYNC;
1354
nskb = h5_prepare_pkt(&rtb_cfg, h5sync, sizeof(h5sync),
1355
H5_LINK_CTL_PKT);
1356
result = start_transmit_wait(fd, nskb, OP_H5_SYNC, 500, 10);
1357
skb_free(nskb);
1358
if (result < 0) {
1359
RS_ERR("OP_H5_SYNC Transmission error");
1360
return -1;
1361
}
1362
1363
/* h5 config */
1364
nskb = h5_prepare_pkt(&rtb_cfg, h5conf, sizeof(h5conf), H5_LINK_CTL_PKT);
1365
result = start_transmit_wait(fd, nskb, OP_H5_CONFIG, 500, 10);
1366
skb_free(nskb);
1367
if (result < 0) {
1368
RS_ERR("OP_H5_CONFIG Transmission error");
1369
return -1;
1370
}
1371
1372
rtb_send_ack(fd);
1373
RS_DBG("H5 init finished\n");
1374
1375
rtb_cfg.cmd_state.state = CMD_STATE_UNKNOWN;
1376
1377
return 0;
1378
}
1379
1380
static int h5_hci_reset(int fd)
1381
{
1382
uint8_t cmd[3] = { 0x03, 0x0c, 0x00};
1383
struct sk_buff *nskb;
1384
int result;
1385
1386
RS_INFO("%s: Issue hci reset cmd", __func__);
1387
1388
nskb = h5_prepare_pkt(&rtb_cfg, cmd, sizeof(cmd), HCI_COMMAND_PKT);
1389
if (!nskb) {
1390
RS_ERR("%s: Failed to alloc mem for hci reset skb", __func__);
1391
return -1;
1392
}
1393
1394
rtb_cfg.cmd_state.opcode = HCI_CMD_RESET;
1395
rtb_cfg.cmd_state.state = CMD_STATE_UNKNOWN;
1396
1397
result = start_transmit_wait(fd, nskb, OP_HCI_RESET, 1500, 1);
1398
skb_free(nskb);
1399
if (result < 0)
1400
RS_ERR("hci reset failed");
1401
1402
return result;
1403
}
1404
1405
#ifdef SERIAL_NONBLOCK_READ
1406
static int set_fd_nonblock(int fd)
1407
{
1408
long arg;
1409
int old_fl;
1410
1411
arg = fcntl(fd, F_GETFL);
1412
if (arg < 0)
1413
return -errno;
1414
1415
/* Return if already nonblock */
1416
if (arg & O_NONBLOCK)
1417
return FD_NONBLOCK;
1418
old_fl = FD_BLOCK;
1419
1420
arg |= O_NONBLOCK;
1421
if (fcntl(fd, F_SETFL, arg) < 0)
1422
return -errno;
1423
1424
return old_fl;
1425
}
1426
1427
static int set_fd_block(int fd)
1428
{
1429
long arg;
1430
1431
arg = fcntl(fd, F_GETFL);
1432
if (arg < 0)
1433
return -errno;
1434
1435
/* Return if already block */
1436
if (!(arg & O_NONBLOCK))
1437
return 0;
1438
1439
arg &= ~O_NONBLOCK;
1440
if (fcntl(fd, F_SETFL, arg) < 0)
1441
return -errno;
1442
1443
return 0;
1444
}
1445
#endif
1446
1447
/*
1448
* Download Realtek Firmware and Config
1449
*/
1450
static int rtb_download_fwc(int fd, uint8_t *buf, int size, int proto,
1451
struct termios *ti)
1452
{
1453
uint8_t curr_idx = 0;
1454
uint8_t curr_len = 0;
1455
uint8_t lp_len = 0;
1456
uint8_t add_pkts = 0;
1457
uint16_t end_idx = 0;
1458
uint16_t total_idx = 0;
1459
uint16_t num;
1460
unsigned char *pkt_buf;
1461
uint16_t i, j;
1462
int result;
1463
#ifdef SERIAL_NONBLOCK_READ
1464
int old_fl;
1465
#endif
1466
1467
end_idx = (uint16_t)((size - 1) / PATCH_DATA_FIELD_MAX_SIZE);
1468
lp_len = size % PATCH_DATA_FIELD_MAX_SIZE;
1469
1470
num = rtb_cfg.num_of_cmd_sent;
1471
num += end_idx + 1;
1472
1473
add_pkts = num % 8 ? (8 - num % 8) : 0;
1474
1475
#ifdef SERIAL_NONBLOCK_READ
1476
old_fl = set_fd_nonblock(fd);
1477
if (old_fl < 0) {
1478
RS_ERR("Set fd nonblock error, %s", strerror(errno));
1479
}
1480
if (old_fl == FD_BLOCK)
1481
RS_INFO("old fd state is block");
1482
#endif
1483
1484
/* Make sure the next seqno is zero after download patch and
1485
* hci reset
1486
*/
1487
if (proto == HCI_UART_3WIRE) {
1488
if (add_pkts)
1489
add_pkts -= 1;
1490
else
1491
add_pkts += 7;
1492
} else
1493
add_pkts = 0; /* No additional packets need */
1494
1495
total_idx = add_pkts + end_idx;
1496
rtb_cfg.total_num = total_idx;
1497
1498
RS_INFO("end_idx: %u, lp_len: %u, additional pkts: %u\n", end_idx,
1499
lp_len, add_pkts);
1500
RS_INFO("Start downloading...");
1501
1502
if (lp_len == 0)
1503
lp_len = PATCH_DATA_FIELD_MAX_SIZE;
1504
1505
pkt_buf = buf;
1506
1507
for (i = 0; i <= total_idx; i++) {
1508
/* Index will roll over when it reaches 0x80
1509
* 0, 1, 2, 3, ..., 126, 127(7f), 1, 2, 3, ...
1510
*/
1511
if (i > 0x7f)
1512
j = (i & 0x7f) + 1;
1513
else
1514
j = i;
1515
1516
if (i < end_idx) {
1517
curr_idx = j;
1518
curr_len = PATCH_DATA_FIELD_MAX_SIZE;
1519
} else if (i == end_idx) {
1520
/* Send last data packets */
1521
if (i == total_idx)
1522
curr_idx = j | 0x80;
1523
else
1524
curr_idx = j;
1525
curr_len = lp_len;
1526
} else if (i < total_idx) {
1527
/* Send additional packets */
1528
curr_idx = j;
1529
pkt_buf = NULL;
1530
curr_len = 0;
1531
RS_INFO("Send additional packet %u", curr_idx);
1532
} else {
1533
/* Send last packet */
1534
curr_idx = j | 0x80;
1535
pkt_buf = NULL;
1536
curr_len = 0;
1537
RS_INFO("Last packet %u", curr_idx);
1538
}
1539
1540
if (curr_idx & 0x80)
1541
RS_INFO("Send last pkt");
1542
1543
if (proto == HCI_UART_H4) {
1544
curr_idx = h4_download_patch(fd, curr_idx, pkt_buf,
1545
curr_len);
1546
if (curr_idx != j && i != total_idx) {
1547
RS_ERR("Index mismatch %u, curr_idx %u", j,
1548
curr_idx);
1549
return -1;
1550
}
1551
} else if (proto == HCI_UART_3WIRE) {
1552
if (h5_download_patch(fd, curr_idx, pkt_buf, curr_len,
1553
ti) < 0)
1554
return -1;
1555
}
1556
1557
if (curr_idx < end_idx) {
1558
pkt_buf += PATCH_DATA_FIELD_MAX_SIZE;
1559
}
1560
}
1561
1562
/* Make hci reset after Controller applies the Firmware and Config */
1563
if (proto == HCI_UART_H4)
1564
result = h4_hci_reset(fd);
1565
else
1566
result = h5_hci_reset(fd);
1567
1568
if (proto == HCI_UART_3WIRE) {
1569
/* Make sure the last pure ack is sent */
1570
tcdrain(fd);
1571
}
1572
1573
if (result)
1574
return result;
1575
1576
1577
#ifdef SERIAL_NONBLOCK_READ
1578
if (old_fl == FD_BLOCK)
1579
set_fd_block(fd);
1580
#endif
1581
1582
return 0;
1583
}
1584
1585
#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]) )
1586
struct rtb_baud {
1587
uint32_t rtb_speed;
1588
int uart_speed;
1589
};
1590
1591
#ifdef BAUDRATE_4BYTES
1592
struct rtb_baud baudrates[] = {
1593
#ifdef RTL_8703A_SUPPORT
1594
{0x00004003, 1500000}, /* for rtl8703as */
1595
#endif
1596
{0x0252C014, 115200},
1597
{0x0252C00A, 230400},
1598
{0x05F75004, 921600},
1599
{0x00005004, 1000000},
1600
{0x04928002, 1500000},
1601
{0x01128002, 1500000}, //8761AT
1602
{0x00005002, 2000000},
1603
{0x0000B001, 2500000},
1604
{0x04928001, 3000000},
1605
{0x052A6001, 3500000},
1606
{0x00005001, 4000000},
1607
};
1608
#else
1609
struct rtb_baud baudrates[] = {
1610
{0x701d, 115200}
1611
{0x6004, 921600},
1612
{0x4003, 1500000},
1613
{0x5002, 2000000},
1614
{0x8001, 3000000},
1615
{0x9001, 3000000},
1616
{0x7001, 3500000},
1617
{0x5001, 4000000},
1618
};
1619
#endif
1620
1621
static void vendor_speed_to_std(uint32_t rtb_speed, uint32_t *uart_speed)
1622
{
1623
*uart_speed = 115200;
1624
1625
unsigned int i;
1626
for (i = 0; i < ARRAY_SIZE(baudrates); i++) {
1627
if (baudrates[i].rtb_speed == rtb_speed) {
1628
*uart_speed = baudrates[i].uart_speed;
1629
return;
1630
}
1631
}
1632
return;
1633
}
1634
1635
static inline void std_speed_to_vendor(int uart_speed, uint32_t *rtb_speed)
1636
{
1637
*rtb_speed = 0x701D;
1638
1639
unsigned int i;
1640
for (i = 0; i < ARRAY_SIZE(baudrates); i++) {
1641
if (baudrates[i].uart_speed == uart_speed) {
1642
*rtb_speed = baudrates[i].rtb_speed;
1643
return;
1644
}
1645
}
1646
1647
return;
1648
}
1649
1650
void rtb_read_chip_type(int dd)
1651
{
1652
/* 0xB000A094 */
1653
unsigned char cmd_buff[] = {
1654
0x61, 0xfc, 0x05, 0x00, 0x94, 0xa0, 0x00, 0xb0
1655
};
1656
struct sk_buff *nskb;
1657
int result;
1658
1659
nskb = h5_prepare_pkt(&rtb_cfg, cmd_buff, sizeof(cmd_buff),
1660
HCI_COMMAND_PKT);
1661
if (!nskb) {
1662
RS_ERR("Alloc chip type cmd skb buff error");
1663
exit(EXIT_FAILURE);
1664
}
1665
1666
rtb_cfg.cmd_state.opcode = HCI_VENDOR_READ_CHIP_TYPE;
1667
rtb_cfg.cmd_state.state = CMD_STATE_UNKNOWN;
1668
result = start_transmit_wait(dd, nskb, OP_CHIP_TYPE, 250, 3);
1669
skb_free(nskb);
1670
if (result < 0)
1671
RS_ERR("OP_CHIP_TYPE Transmission error");
1672
1673
return;
1674
}
1675
1676
/*
1677
* Read ECO version with vendor cmd 0xfc65
1678
*/
1679
void rtb_read_eversion(int dd)
1680
{
1681
int result;
1682
unsigned char cmd_buf[3] = { 0x6d, 0xfc, 0x00 };
1683
struct sk_buff *nskb;
1684
1685
nskb= h5_prepare_pkt(&rtb_cfg, cmd_buf, 3, HCI_COMMAND_PKT);
1686
if (!nskb) {
1687
RS_ERR("Alloc eversion cmd skb buff error");
1688
exit(EXIT_FAILURE);
1689
}
1690
1691
rtb_cfg.cmd_state.opcode = HCI_VENDOR_READ_ROM_VER;
1692
rtb_cfg.cmd_state.state = CMD_STATE_UNKNOWN;
1693
result = start_transmit_wait(dd, nskb, OP_ROM_VER, 500, 3);
1694
skb_free(nskb);
1695
if (result < 0) {
1696
RS_ERR("OP_ROM_VER Transmit error");
1697
}
1698
1699
return;
1700
}
1701
1702
void rtb_read_local_version(int dd)
1703
{
1704
int result;
1705
unsigned char cmd_buf[3] = { 0x01, 0x10, 0x00 };
1706
struct sk_buff *nskb;
1707
1708
nskb = h5_prepare_pkt(&rtb_cfg, cmd_buf, 3, HCI_COMMAND_PKT);
1709
if (!nskb) {
1710
RS_ERR("Alloc local ver cmd skb buff error");
1711
exit(EXIT_FAILURE);
1712
}
1713
1714
rtb_cfg.cmd_state.state = CMD_STATE_UNKNOWN;
1715
rtb_cfg.cmd_state.opcode = HCI_CMD_READ_LOCAL_VER;
1716
result = start_transmit_wait(dd, nskb, OP_LMP_VER, 500, 3);
1717
skb_free(nskb);
1718
if (result < 0) {
1719
RS_ERR("OP_LMP_VER Transmit error");
1720
}
1721
1722
return;
1723
}
1724
1725
/*
1726
* Config Realtek Bluetooth.
1727
* Config parameters are got from Realtek Config file and FW.
1728
*
1729
* speed is the init_speed in uart struct
1730
* Returns 0 on success
1731
*/
1732
static int rtb_config(int fd, int proto, int speed, struct termios *ti)
1733
{
1734
int final_speed = 0;
1735
int ret = 0;
1736
1737
rtb_cfg.proto = proto;
1738
1739
/* Read Local Version Information and RTK ROM version */
1740
if (proto == HCI_UART_3WIRE) {
1741
RS_INFO("Realtek H5 IC");
1742
rtb_read_local_version(fd);
1743
rtb_read_eversion(fd);
1744
} else {
1745
RS_INFO("Realtek H4 IC");
1746
1747
/* The following set is for special requirement that enables
1748
* flow control before initializing */
1749
#ifdef RTL8723DSH4_UART_HWFLOWC
1750
ti->c_cflag &= ~PARENB;
1751
ti->c_cflag |= CRTSCTS;
1752
if (tcsetattr(fd, TCSANOW, ti) < 0) {
1753
RS_ERR("H4 Can't enable RTSCTS");
1754
return -1;
1755
}
1756
usleep(20 * 1000);
1757
#endif
1758
h4_read_local_ver(fd);
1759
h4_vendor_read_rom_ver(fd);
1760
if (rtb_cfg.lmp_subver == ROM_LMP_8761btc) {
1761
/* 8761B Test Chip */
1762
rtb_cfg.chip_type = CHIP_8761BTC;
1763
rtb_cfg.uart_flow_ctrl = 1;
1764
/* TODO: Change to different uart baud */
1765
std_speed_to_vendor(1500000, &rtb_cfg.vendor_baud);
1766
goto change_baud;
1767
} else if (rtb_cfg.lmp_subver == ROM_LMP_8761a) {
1768
if (rtb_cfg.hci_rev == 0x000b) {
1769
/* 8761B Test Chip without download */
1770
rtb_cfg.chip_type = CHIP_8761BH4;
1771
/* rtb_cfg.uart_flow_ctrl = 1; */
1772
/* TODO: Change to different uart baud */
1773
/* std_speed_to_vendor(1500000, &rtb_cfg.vendor_baud);
1774
* goto change_baud;
1775
*/
1776
} else if (rtb_cfg.hci_rev == 0x000a) {
1777
if (rtb_cfg.eversion == 3)
1778
rtb_cfg.chip_type = CHIP_8761ATF;
1779
else if (rtb_cfg.eversion == 2)
1780
rtb_cfg.chip_type = CHIP_8761AT;
1781
else
1782
rtb_cfg.chip_type = CHIP_UNKNOWN;
1783
}
1784
} else if (rtb_cfg.lmp_subver == ROM_LMP_8723b) {
1785
if (rtb_cfg.hci_ver == 0x08 &&
1786
rtb_cfg.hci_rev == 0x000d) {
1787
rtb_cfg.chip_type = CHIP_8723DS;
1788
} else if (rtb_cfg.hci_ver == 0x06 &&
1789
rtb_cfg.hci_rev == 0x000b) {
1790
rtb_cfg.chip_type = CHIP_8723BS;
1791
} else {
1792
RS_ERR("H4: unknown chip");
1793
return -1;
1794
}
1795
}
1796
1797
}
1798
1799
RS_INFO("LMP Subversion 0x%04x", rtb_cfg.lmp_subver);
1800
RS_INFO("EVersion %u", rtb_cfg.eversion);
1801
1802
switch (rtb_cfg.lmp_subver) {
1803
case ROM_LMP_8723a:
1804
break;
1805
case ROM_LMP_8723b:
1806
#ifdef RTL_8703A_SUPPORT
1807
/* Set chip type for matching fw/config entry */
1808
rtl->chip_type = CHIP_8703AS;
1809
#endif
1810
break;
1811
case ROM_LMP_8821a:
1812
break;
1813
case ROM_LMP_8761a:
1814
break;
1815
case ROM_LMP_8703b:
1816
rtb_read_chip_type(fd);
1817
break;
1818
}
1819
1820
rtb_cfg.patch_ent = get_patch_entry(&rtb_cfg);
1821
if (rtb_cfg.patch_ent) {
1822
RS_INFO("IC: %s", rtb_cfg.patch_ent->ic_name);
1823
RS_INFO("Firmware/config: %s, %s",
1824
rtb_cfg.patch_ent->patch_file,
1825
rtb_cfg.patch_ent->config_file);
1826
} else {
1827
RS_ERR("Can not find firmware/config entry\n");
1828
return -1;
1829
}
1830
1831
rtb_cfg.config_buf = rtb_read_config(&rtb_cfg, &rtb_cfg.config_len);
1832
if (!rtb_cfg.config_buf) {
1833
RS_ERR("Read Config file error, use eFuse settings");
1834
rtb_cfg.config_len = 0;
1835
}
1836
1837
rtb_cfg.fw_buf = rtb_read_firmware(&rtb_cfg, &rtb_cfg.fw_len);
1838
if (!rtb_cfg.fw_buf) {
1839
RS_ERR("Read Bluetooth firmware error");
1840
rtb_cfg.fw_len = 0;
1841
/* Free config buf */
1842
if (rtb_cfg.config_buf) {
1843
free(rtb_cfg.config_buf);
1844
rtb_cfg.config_buf = NULL;
1845
rtb_cfg.config_len = 0;
1846
}
1847
return -1;
1848
} else {
1849
rtb_cfg.total_buf = rtb_get_final_patch(fd, proto,
1850
&rtb_cfg.total_len);
1851
/* If the above function executes successfully, the Config and
1852
* patch were copied to the total buf */
1853
1854
/* Free config buf */
1855
if (rtb_cfg.config_buf) {
1856
free(rtb_cfg.config_buf);
1857
rtb_cfg.config_buf = NULL;
1858
}
1859
/* Free the fw buf */
1860
free(rtb_cfg.fw_buf);
1861
rtb_cfg.fw_buf = NULL;
1862
rtb_cfg.fw_len = 0;
1863
1864
if (!rtb_cfg.total_buf) {
1865
RS_ERR("Failed to get the final patch");
1866
exit(EXIT_FAILURE);
1867
}
1868
}
1869
1870
if (rtb_cfg.total_len > RTB_PATCH_LENGTH_MAX) {
1871
RS_ERR("Total length of fwc is larger than allowed");
1872
goto buf_free;
1873
}
1874
1875
RS_INFO("Total len %d for fwc", rtb_cfg.total_len);
1876
1877
/* rtl8723ds h4 */
1878
if (rtb_cfg.chip_type == CHIP_8723DS &&
1879
rtb_cfg.proto == HCI_UART_H4) {
1880
if (rtb_cfg.parenb) {
1881
/* set parity */
1882
ti->c_cflag |= PARENB;
1883
if (rtb_cfg.pareven)
1884
ti->c_cflag &= ~(PARODD);
1885
else
1886
ti->c_cflag |= PARODD;
1887
if (tcsetattr(fd, TCSANOW, ti) < 0) {
1888
RS_ERR("8723DSH4 Can't set parity");
1889
goto buf_free;
1890
}
1891
}
1892
}
1893
1894
change_baud:
1895
/* change baudrate if needed
1896
* rtb_cfg.vendor_baud is a __u32/__u16 vendor-specific variable
1897
* parsed from config file
1898
* */
1899
if (rtb_cfg.vendor_baud == 0) {
1900
/* No baud setting in Config file */
1901
std_speed_to_vendor(speed, &rtb_cfg.vendor_baud);
1902
RS_INFO("No baud from Config file, set baudrate: %d, 0x%08x",
1903
speed, rtb_cfg.vendor_baud);
1904
goto start_download;
1905
} else
1906
vendor_speed_to_std(rtb_cfg.vendor_baud,
1907
(uint32_t *)&(rtb_cfg.final_speed));
1908
1909
if (rtb_cfg.final_speed == 115200) {
1910
RS_INFO("Final speed is %d, no baud change needs",
1911
rtb_cfg.final_speed);
1912
goto start_download;
1913
}
1914
1915
if (proto == HCI_UART_3WIRE)
1916
h5_vendor_change_speed(fd, rtb_cfg.vendor_baud);
1917
else
1918
h4_vendor_change_speed(fd, rtb_cfg.vendor_baud);
1919
1920
/* Make sure the ack for cmd complete event is transmitted */
1921
tcdrain(fd);
1922
usleep(50000); /* The same value as before */
1923
final_speed = rtb_cfg.final_speed ? rtb_cfg.final_speed : speed;
1924
RS_INFO("Final speed %d", final_speed);
1925
if (set_speed(fd, ti, final_speed) < 0) {
1926
RS_ERR("Can't set baud rate: %d, %d, %d", final_speed,
1927
rtb_cfg.final_speed, speed);
1928
goto buf_free;
1929
}
1930
1931
start_download:
1932
/* For 8761B Test chip, no patch to download */
1933
if (rtb_cfg.chip_type == CHIP_8761BTC)
1934
goto done;
1935
1936
if (rtb_cfg.total_len > 0 && rtb_cfg.dl_fw_flag) {
1937
rtb_cfg.link_estab_state = H5_PATCH;
1938
rtb_cfg.rx_index = -1;
1939
1940
ret = rtb_download_fwc(fd, rtb_cfg.total_buf, rtb_cfg.total_len,
1941
proto, ti);
1942
free(rtb_cfg.total_buf);
1943
if (ret < 0)
1944
return ret;
1945
}
1946
1947
done:
1948
1949
RS_DBG("Init Process finished");
1950
return 0;
1951
1952
buf_free:
1953
free(rtb_cfg.total_buf);
1954
return -1;
1955
}
1956
1957
int rtb_init(int fd, int proto, int speed, struct termios *ti)
1958
{
1959
struct epoll_event ev;
1960
int result;
1961
1962
RS_INFO("Realtek hciattach version %s \n", RTK_VERSION);
1963
1964
memset(&rtb_cfg, 0, sizeof(rtb_cfg));
1965
rtb_cfg.serial_fd = fd;
1966
rtb_cfg.dl_fw_flag = 1;
1967
1968
rtb_cfg.epollfd = epoll_create(64);
1969
if (rtb_cfg.epollfd == -1) {
1970
RS_ERR("epoll_create1, %s (%d)", strerror(errno), errno);
1971
exit(EXIT_FAILURE);
1972
}
1973
1974
ev.events = EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLRDHUP;
1975
ev.data.fd = fd;
1976
if (epoll_ctl(rtb_cfg.epollfd, EPOLL_CTL_ADD, fd, &ev) == -1) {
1977
RS_ERR("epoll_ctl: epoll ctl add, %s (%d)", strerror(errno),
1978
errno);
1979
exit(EXIT_FAILURE);
1980
}
1981
1982
rtb_cfg.timerfd = timerfd_create(CLOCK_MONOTONIC, 0);
1983
if (rtb_cfg.timerfd == -1) {
1984
RS_ERR("timerfd_create error, %s (%d)", strerror(errno), errno);
1985
return -1;
1986
}
1987
1988
if (rtb_cfg.timerfd > 0) {
1989
ev.events = EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLRDHUP;
1990
ev.data.fd = rtb_cfg.timerfd;
1991
if (epoll_ctl(rtb_cfg.epollfd, EPOLL_CTL_ADD,
1992
rtb_cfg.timerfd, &ev) == -1) {
1993
RS_ERR("epoll_ctl: epoll ctl add, %s (%d)",
1994
strerror(errno), errno);
1995
exit(EXIT_FAILURE);
1996
}
1997
}
1998
1999
RS_INFO("Use epoll");
2000
2001
if (proto == HCI_UART_3WIRE) {
2002
if (rtb_init_h5(fd, ti) < 0)
2003
return -1;;
2004
}
2005
2006
result = rtb_config(fd, proto, speed, ti);
2007
2008
epoll_ctl(rtb_cfg.epollfd, EPOLL_CTL_DEL, fd, NULL);
2009
epoll_ctl(rtb_cfg.epollfd, EPOLL_CTL_DEL, rtb_cfg.timerfd, NULL);
2010
close(rtb_cfg.timerfd);
2011
rtb_cfg.timerfd = -1;
2012
2013
return result;
2014
}
2015
2016
int rtb_post(int fd, int proto, struct termios *ti)
2017
{
2018
/* No need to change baudrate */
2019
/* if (rtb_cfg.final_speed)
2020
* return set_speed(fd, ti, rtb_cfg.final_speed);
2021
*/
2022
2023
return 0;
2024
}
2025
2026