hc
2023-12-04 f33f61bdb7ca6d5ebe7a78f9d8694b91360279ac
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
From ac7992081abba87627c9e91735b3309584b48585 Mon Sep 17 00:00:00 2001
From: Gregory Hermant <gregory.hermant@calao-systems.com>
Date: Wed, 14 Nov 2012 14:27:02 +0100
Subject: [PATCH] add support for the ST-Ericsson CG2900 GPS FM Bluetooth
 combo controller
 
 
Signed-off-by: Gregory Hermant <gregory.hermant@calao-systems.com>
---
 tools/hciattach.c |   22 +++++++++++++++-------
 tools/hciattach.h |    1 +
 2 files changed, 16 insertions(+), 7 deletions(-)
 
diff --git a/tools/hciattach.c b/tools/hciattach.c
index e4d5aa1..7f08243 100644
--- a/tools/hciattach.c
+++ b/tools/hciattach.c
@@ -1066,6 +1066,11 @@ struct uart_t uart[] = {
     { "texasalt",   0x0000, 0x0000, HCI_UART_LL,   115200, 115200,
                 FLOW_CTL, DISABLE_PM, NULL, texasalt, NULL   },
 
+    /* ST-Ericsson CG2900 GPS FM Bluetooth combo controller */
+    { "cg2900",     0x0000, 0x0000, HCI_UART_STE,  115200, 115200,
+                FLOW_CTL, DISABLE_PM, NULL, NULL     },
+
+
     /* ST Microelectronics minikits based on STLC2410/STLC2415 */
     { "st",         0x0000, 0x0000, HCI_UART_H4,    57600, 115200,
                 FLOW_CTL, DISABLE_PM,  NULL, st       },
@@ -1157,10 +1162,10 @@ static struct uart_t * get_by_type(char *type)
 }
 
 /* Initialize UART driver */
-static int init_uart(char *dev, struct uart_t *u, int send_break, int raw)
+static int init_uart(char *dev, struct uart_t *u, int send_break, int raw, int line_disc)
 {
     struct termios ti;
-    int fd, i;
+    int fd;
     unsigned long flags = 0;
 
     if (raw)
@@ -1217,8 +1222,7 @@ static int init_uart(char *dev, struct uart_t *u, int send_break, int raw)
     }
 
     /* Set TTY to N_HCI line discipline */
-    i = N_HCI;
-    if (ioctl(fd, TIOCSETD, &i) < 0) {
+    if (ioctl(fd, TIOCSETD, &line_disc) < 0) {
         perror("Can't set line discipline");
         return -1;
     }
@@ -1243,7 +1247,7 @@ static void usage(void)
 {
     printf("hciattach - HCI UART driver initialization utility\n");
     printf("Usage:\n");
-    printf("\thciattach [-n] [-p] [-b] [-r] [-t timeout] [-s initial_speed] <tty> <type | id> [speed] [flow|noflow] [bdaddr]\n");
+    printf("\thciattach [-n] [-p] [-a line_disc_nr] [-b] [-r] [-t timeout] [-s initial_speed] <tty> <type | id> [speed] [flow|noflow] [bdaddr]\n");
     printf("\thciattach -l\n");
 }
 
@@ -1252,6 +1256,7 @@ int main(int argc, char *argv[])
     struct uart_t *u = NULL;
     int detach, printpid, raw, opt, i, n, ld, err;
     int to = 10;
+    int line_disc = N_HCI;
     int init_speed = 0;
     int send_break = 0;
     pid_t pid;
@@ -1264,8 +1269,11 @@ int main(int argc, char *argv[])
     printpid = 0;
     raw = 0;
 
-    while ((opt=getopt(argc, argv, "bnpt:s:lr")) != EOF) {
+    while ((opt=getopt(argc, argv, "bnpt:s:lra:")) != EOF) {
         switch(opt) {
+        case 'a':
+                        line_disc = atoi(optarg);
+                        break;
         case 'b':
             send_break = 1;
             break;
@@ -1381,7 +1389,7 @@ int main(int argc, char *argv[])
     alarm(to);
     bcsp_max_retries = to;
 
-    n = init_uart(dev, u, send_break, raw);
+    n = init_uart(dev, u, send_break, raw, line_disc);
     if (n < 0) {
         perror("Can't initialize device");
         exit(1);
diff --git a/tools/hciattach.h b/tools/hciattach.h
index fed0d11..09b534d 100644
--- a/tools/hciattach.h
+++ b/tools/hciattach.h
@@ -39,6 +39,7 @@
 #define HCI_UART_H4DS    3
 #define HCI_UART_LL    4
 #define HCI_UART_ATH3K  5
+#define HCI_UART_STE    6
 
 #define HCI_UART_RAW_DEVICE    0
 
-- 
1.7.9.5