26 #include <linux/kernel.h>
27 #include <linux/errno.h>
29 #include <linux/slab.h>
31 #include <linux/tty.h>
34 #include <linux/module.h>
42 static int initial_mode = 1;
44 #define GARMIN_VENDOR_ID 0x091E
50 #define VERSION_MAJOR 0
51 #define VERSION_MINOR 36
54 #define _DRIVER_VERSION(a, b) "v" _STR(a) "." _STR(b)
55 #define DRIVER_VERSION _DRIVER_VERSION(VERSION_MAJOR, VERSION_MINOR)
56 #define DRIVER_AUTHOR "hermann kneissel"
57 #define DRIVER_DESC "garmin gps driver"
64 #define GARMIN_PKTHDR_LENGTH 12
67 #define MAX_SERIAL_PKT_SIZ (3 + 255 + 3)
70 #define MAX_SERIAL_PKT_SIZ_STUFFED (MAX_SERIAL_PKT_SIZ + 256)
78 #define GPS_IN_BUFSIZ (GARMIN_PKTHDR_LENGTH+MAX_SERIAL_PKT_SIZ)
81 #define GPS_OUT_BUFSIZ (GARMIN_PKTHDR_LENGTH+MAX_SERIAL_PKT_SIZ_STUFFED)
86 #define GSP_INITIAL_OFFSET (GARMIN_PKTHDR_LENGTH-2)
89 #define PRIVPKTSIZ (GARMIN_PKTHDR_LENGTH+4)
91 #define GARMIN_LAYERID_TRANSPORT 0
92 #define GARMIN_LAYERID_APPL 20
94 #define GARMIN_LAYERID_PRIVATE 0x01106E4B
96 #define GARMIN_PKTID_PVT_DATA 51
97 #define GARMIN_PKTID_L001_COMMAND_DATA 10
99 #define CMND_ABORT_TRANSFER 0
102 #define PRIV_PKTID_SET_DEBUG 1
103 #define PRIV_PKTID_SET_MODE 2
104 #define PRIV_PKTID_INFO_REQ 3
105 #define PRIV_PKTID_INFO_RESP 4
106 #define PRIV_PKTID_RESET_REQ 5
107 #define PRIV_PKTID_SET_DEF_MODE 6
146 #define STATE_INITIAL_DELAY 1
147 #define STATE_TIMEOUT 2
148 #define STATE_SESSION_REQ1 3
149 #define STATE_SESSION_REQ2 4
150 #define STATE_ACTIVE 5
152 #define STATE_RESET 8
153 #define STATE_DISCONNECTED 9
154 #define STATE_WAIT_TTY_ACK 10
155 #define STATE_GSP_WAIT_DATA 11
157 #define MODE_NATIVE 0
158 #define MODE_GARMIN_SERIAL 1
161 #define FLAGS_SESSION_REPLY_MASK 0x00C0
162 #define FLAGS_SESSION_REPLY1_SEEN 0x0080
163 #define FLAGS_SESSION_REPLY2_SEEN 0x0040
164 #define FLAGS_BULK_IN_ACTIVE 0x0020
165 #define FLAGS_BULK_IN_RESTART 0x0010
166 #define FLAGS_THROTTLED 0x0008
167 #define APP_REQ_SEEN 0x0004
168 #define APP_RESP_SEEN 0x0002
169 #define CLEAR_HALT_REQUIRED 0x0001
171 #define FLAGS_QUEUING 0x0100
172 #define FLAGS_DROP_DATA 0x0800
174 #define FLAGS_GSP_SKIP 0x1000
175 #define FLAGS_GSP_DLESEEN 0x2000
183 static int gsp_next_packet(
struct garmin_data *garmin_data_p);
185 const unsigned char *
buf,
int count,
189 static unsigned char const GARMIN_START_SESSION_REQ[]
190 = { 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0 };
191 static unsigned char const GARMIN_START_SESSION_REPLY[]
192 = { 0, 0, 0, 0, 6, 0, 0, 0, 4, 0, 0, 0 };
193 static unsigned char const GARMIN_BULK_IN_AVAIL_REPLY[]
194 = { 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0 };
195 static unsigned char const GARMIN_APP_LAYER_REPLY[]
197 static unsigned char const GARMIN_START_PVT_REQ[]
198 = { 20, 0, 0, 0, 10, 0, 0, 0, 2, 0, 0, 0, 49, 0 };
199 static unsigned char const GARMIN_STOP_PVT_REQ[]
200 = { 20, 0, 0, 0, 10, 0, 0, 0, 2, 0, 0, 0, 50, 0 };
201 static unsigned char const GARMIN_STOP_TRANSFER_REQ[]
202 = { 20, 0, 0, 0, 10, 0, 0, 0, 2, 0, 0, 0, 0, 0 };
203 static unsigned char const GARMIN_STOP_TRANSFER_REQ_V2[]
204 = { 20, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0, 0 };
205 static unsigned char const PRIVATE_REQ[]
206 = { 0x4B, 0x6E, 0x10, 0x01, 0xFF, 0, 0, 0, 0xFF, 0, 0, 0 };
219 static inline int getLayerId(
const __u8 *usbPacket)
221 return __le32_to_cpup((
__le32 *)(usbPacket));
224 static inline int getPacketId(
const __u8 *usbPacket)
226 return __le32_to_cpup((
__le32 *)(usbPacket+4));
229 static inline int getDataLength(
const __u8 *usbPacket)
231 return __le32_to_cpup((
__le32 *)(usbPacket+8));
239 static inline int isAbortTrfCmnd(
const unsigned char *
buf)
241 if (0 ==
memcmp(buf, GARMIN_STOP_TRANSFER_REQ,
242 sizeof(GARMIN_STOP_TRANSFER_REQ)) ||
243 0 ==
memcmp(buf, GARMIN_STOP_TRANSFER_REQ_V2,
244 sizeof(GARMIN_STOP_TRANSFER_REQ_V2)))
253 char *
data,
unsigned int actual_length)
257 if (tty && actual_length) {
258 usb_serial_debug_data(&port->
dev, __func__, actual_length, data);
259 tty_insert_flip_string(tty, data, actual_length);
273 static int pkt_add(
struct garmin_data *garmin_data_p,
286 dev_err(&garmin_data_p->
port->dev,
"out of memory\n");
294 result = list_empty(&garmin_data_p->
pktlist);
297 state = garmin_data_p->
state;
298 spin_unlock_irqrestore(&garmin_data_p->
lock, flags);
301 "%s - added: pkt: %d - %d bytes\n", __func__,
302 pkt->
seq, data_length);
307 gsp_next_packet(garmin_data_p);
320 if (!list_empty(&garmin_data_p->
pktlist)) {
324 spin_unlock_irqrestore(&garmin_data_p->
lock, flags);
330 static void pkt_clear(
struct garmin_data *garmin_data_p)
336 while (!list_empty(&garmin_data_p->
pktlist)) {
341 spin_unlock_irqrestore(&garmin_data_p->
lock, flags);
350 static int gsp_send_ack(
struct garmin_data *garmin_data_p,
__u8 pkt_id)
357 dev_dbg(&garmin_data_p->
port->dev,
"%s - pkt-id: 0x%X.\n", __func__,
374 *ptr++ = 0xFF & (-
cksum);
380 send_to_tty(garmin_data_p->
port, pkt, l);
404 int pktid = recpkt[0];
405 int size = recpkt[1];
407 usb_serial_debug_data(&garmin_data_p->
port->dev, __func__,
411 dev_dbg(dev,
"%s - invalid size, expected %d bytes, got %d\n",
420 if ((
__u8 *)&(usbdata[3]) != recpkt) {
421 dev_dbg(dev,
"%s - ptr mismatch %p - %p\n", __func__,
422 &(usbdata[4]), recpkt);
431 if ((0xff & (cksum + *recpkt)) != 0) {
432 dev_dbg(dev,
"%s - invalid checksum, expected %02x, got %02x\n",
433 __func__, 0xff & -cksum, 0xff & *recpkt);
441 garmin_write_bulk(garmin_data_p->
port, garmin_data_p->
inbuffer,
446 if (isAbortTrfCmnd(garmin_data_p->
inbuffer)) {
449 spin_unlock_irqrestore(&garmin_data_p->
lock, flags);
450 pkt_clear(garmin_data_p);
476 static int gsp_receive(
struct garmin_data *garmin_data_p,
477 const unsigned char *buf,
int count)
479 struct device *dev = &garmin_data_p->
port->dev;
482 int ack_or_nak_seen = 0;
495 size = garmin_data_p->
insize;
498 spin_unlock_irqrestore(&garmin_data_p->
lock, flags);
506 while (offs < count) {
516 }
else if (dleSeen) {
522 }
else if (data ==
ETX) {
529 ack_or_nak_seen =
ACK;
530 dev_dbg(dev,
"ACK packet complete.\n");
531 }
else if (data ==
NAK) {
532 ack_or_nak_seen =
NAK;
533 dev_dbg(dev,
"NAK packet complete.\n");
535 dev_dbg(dev,
"packet complete - id=0x%X.\n",
537 gsp_rec_packet(garmin_data_p, size);
557 dev_dbg(dev,
"%s - packet too large.\n", __func__);
579 spin_unlock_irqrestore(&garmin_data_p->
lock, flags);
581 if (ack_or_nak_seen) {
582 if (gsp_next_packet(garmin_data_p) > 0)
599 static int gsp_send(
struct garmin_data *garmin_data_p,
600 const unsigned char *buf,
int count)
602 struct device *dev = &garmin_data_p->
port->dev;
603 const unsigned char *
src;
611 dev_dbg(dev,
"%s - state %d - %d bytes.\n", __func__,
612 garmin_data_p->
state, count);
616 dev_dbg(dev,
"packet too large\n");
626 pktid = getPacketId(garmin_data_p->
outbuffer);
627 datalen = getDataLength(garmin_data_p->
outbuffer);
635 dev_dbg(dev,
"%s - %d bytes in buffer, %d bytes in pkt.\n", __func__, k, i);
639 usb_serial_debug_data(&garmin_data_p->
port->dev, __func__, k,
645 dev_dbg(dev,
"not an application packet (%d)\n",
651 dev_dbg(dev,
"packet-id %d too large\n", pktid);
656 dev_dbg(dev,
"packet-size %d too large\n", datalen);
664 for (i = 0; i <
datalen; i++) {
674 memcpy(dst, src, datalen);
688 for (i = 0; i <
datalen; i++) {
696 cksum = 0xFF & -
cksum;
705 send_to_tty(garmin_data_p->
port, garmin_data_p->
outbuffer, i);
707 garmin_data_p->
pkt_id = pktid;
717 static int gsp_next_packet(
struct garmin_data *garmin_data_p)
722 while ((pkt = pkt_pop(garmin_data_p)) !=
NULL) {
723 dev_dbg(&garmin_data_p->
port->dev,
"%s - next pkt: %d\n", __func__, pkt->
seq);
724 result = gsp_send(garmin_data_p, pkt->
data, pkt->
size);
749 static int nat_receive(
struct garmin_data *garmin_data_p,
750 const unsigned char *buf,
int count)
758 while (offs < count) {
762 +getDataLength(garmin_data_p->
inbuffer);
770 "%s - packet size too large: %d\n",
772 garmin_data_p->
insize = 0;
776 len -= garmin_data_p->
insize;
777 if (len > (count-offs))
782 memcpy(dest, buf+offs, len);
783 garmin_data_p->
insize += len;
791 getDataLength(garmin_data_p->
inbuffer);
792 if (garmin_data_p->
insize >= len) {
793 garmin_write_bulk(garmin_data_p->
port,
796 garmin_data_p->
insize = 0;
800 if (isAbortTrfCmnd(garmin_data_p->
inbuffer)) {
804 spin_unlock_irqrestore(
805 &garmin_data_p->
lock, flags);
806 pkt_clear(garmin_data_p);
821 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
831 send_to_tty(port, (
__u8 *)pkt, 6 * 4);
843 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
849 spin_unlock_irqrestore(&garmin_data_p->
lock, flags);
852 dev_dbg(&port->
dev,
"%s - usb_reset_device\n", __func__);
855 dev_dbg(&port->
dev,
"%s - usb_reset_device failed: %d\n",
865 static int garmin_clear(
struct garmin_data *garmin_data_p)
871 pkt_clear(garmin_data_p);
874 garmin_data_p->
insize = 0;
876 spin_unlock_irqrestore(&garmin_data_p->
lock, flags);
885 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
892 dev_dbg(&serial->
dev->dev,
"%s - adding interrupt input\n", __func__);
896 "%s - failed submitting interrupt urb, error %d\n",
905 dev_dbg(&serial->
dev->dev,
"%s - starting session ...\n", __func__);
908 for (i = 0; i < 3; i++) {
909 status = garmin_write_bulk(port,
910 GARMIN_START_SESSION_REQ,
911 sizeof(GARMIN_START_SESSION_REQ), 0);
930 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
933 garmin_data_p->
mode = initial_mode;
934 garmin_data_p->
count = 0;
936 spin_unlock_irqrestore(&garmin_data_p->
lock, flags);
943 status = garmin_init_session(port);
953 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
955 dev_dbg(&port->
dev,
"%s - port %d - mode=%d state=%d flags=0x%X\n",
964 if (!port->
serial->disconnected)
965 garmin_clear(garmin_data_p);
979 static void garmin_write_bulk_callback(
struct urb *
urb)
985 usb_get_serial_port_data(port);
990 gsp_send_ack(garmin_data_p,
991 ((
__u8 *)urb->transfer_buffer)[4]);
1001 kfree(urb->transfer_buffer);
1006 const unsigned char *buf,
int count,
1009 unsigned long flags;
1011 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1018 spin_unlock_irqrestore(&garmin_data_p->
lock, flags);
1033 memcpy(buffer, buf, count);
1035 usb_serial_debug_data(&port->
dev, __func__, count, buffer);
1037 usb_fill_bulk_urb(urb, serial->
dev,
1038 usb_sndbulkpipe(serial->
dev,
1041 garmin_write_bulk_callback,
1042 dismiss_ack ?
NULL : port);
1043 urb->transfer_flags |= URB_ZERO_PACKET;
1049 spin_unlock_irqrestore(&garmin_data_p->
lock, flags);
1052 pkt_clear(garmin_data_p);
1061 "%s - usb_submit_urb(write bulk) failed with status = %d\n",
1074 const unsigned char *buf,
int count)
1077 int pktid, pktsiz, len;
1078 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1081 usb_serial_debug_data(dev, __func__, count, buf);
1094 pktsiz = getDataLength(garmin_data_p->
privpkt);
1095 pktid = getPacketId(garmin_data_p->
privpkt);
1099 getLayerId(garmin_data_p->
privpkt)) {
1101 dev_dbg(dev,
"%s - processing private request %d\n",
1105 garmin_clear(garmin_data_p);
1112 dev_dbg(dev,
"%s - mode set to %d\n",
1113 __func__, garmin_data_p->
mode);
1117 priv_status_resp(port);
1121 process_resetdev_request(port);
1128 dev_dbg(dev,
"%s - initial_mode set to %d\n",
1130 garmin_data_p->
mode);
1138 return gsp_receive(garmin_data_p, buf, count);
1140 return nat_receive(garmin_data_p, buf, count);
1145 static int garmin_write_room(
struct tty_struct *tty)
1151 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1156 static void garmin_read_process(
struct garmin_data *garmin_data_p,
1157 unsigned char *data,
unsigned data_length,
1160 unsigned long flags;
1164 dev_dbg(&garmin_data_p->
port->dev,
"%s - pkt dropped\n", __func__);
1172 pkt_add(garmin_data_p, data, data_length);
1173 }
else if (bulk_data ||
1178 spin_unlock_irqrestore(&garmin_data_p->
lock, flags);
1181 pkt_add(garmin_data_p, data, data_length);
1183 send_to_tty(garmin_data_p->
port, data,
1192 static void garmin_read_bulk_callback(
struct urb *urb)
1194 unsigned long flags;
1197 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1198 unsigned char *data = urb->transfer_buffer;
1199 int status = urb->status;
1203 dev_dbg(&urb->dev->dev,
"%s - bad serial pointer, exiting\n", __func__);
1208 dev_dbg(&urb->dev->dev,
"%s - nonzero read bulk status received: %d\n",
1213 usb_serial_debug_data(&port->
dev, __func__, urb->actual_length, data);
1215 garmin_read_process(garmin_data_p, data, urb->actual_length, 1);
1217 if (urb->actual_length == 0 &&
1221 spin_unlock_irqrestore(&garmin_data_p->
lock, flags);
1225 "%s - failed resubmitting read urb, error %d\n",
1227 }
else if (urb->actual_length > 0) {
1233 "%s - failed resubmitting read urb, error %d\n",
1237 dev_dbg(&port->
dev,
"%s - end of bulk data\n", __func__);
1240 spin_unlock_irqrestore(&garmin_data_p->
lock, flags);
1245 static void garmin_read_int_callback(
struct urb *urb)
1247 unsigned long flags;
1250 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1251 unsigned char *data = urb->transfer_buffer;
1252 int status = urb->status;
1262 dev_dbg(&urb->dev->dev,
"%s - urb shutting down with status: %d\n",
1266 dev_dbg(&urb->dev->dev,
"%s - nonzero urb status received: %d\n",
1271 usb_serial_debug_data(&port->
dev, __func__, urb->actual_length,
1272 urb->transfer_buffer);
1274 if (urb->actual_length ==
sizeof(GARMIN_BULK_IN_AVAIL_REPLY) &&
1275 0 ==
memcmp(data, GARMIN_BULK_IN_AVAIL_REPLY,
1276 sizeof(GARMIN_BULK_IN_AVAIL_REPLY))) {
1278 dev_dbg(&port->
dev,
"%s - bulk data available.\n", __func__);
1286 "%s - failed submitting read urb, error %d\n",
1291 spin_unlock_irqrestore(&garmin_data_p->
lock,
1298 spin_unlock_irqrestore(&garmin_data_p->
lock, flags);
1301 }
else if (urb->actual_length == (4+
sizeof(GARMIN_START_SESSION_REPLY))
1302 && 0 ==
memcmp(data, GARMIN_START_SESSION_REPLY,
1303 sizeof(GARMIN_START_SESSION_REPLY))) {
1307 spin_unlock_irqrestore(&garmin_data_p->
lock, flags);
1313 dev_dbg(&port->
dev,
"%s - start-of-session reply seen - serial %u.\n",
1317 garmin_read_process(garmin_data_p, data, urb->actual_length, 0);
1322 "%s - Error %d submitting interrupt urb\n",
1332 static int garmin_flush_queue(
struct garmin_data *garmin_data_p)
1334 unsigned long flags;
1338 pkt = pkt_pop(garmin_data_p);
1340 send_to_tty(garmin_data_p->
port, pkt->
data, pkt->
size);
1347 spin_unlock_irqrestore(&garmin_data_p->
lock, flags);
1354 static void garmin_throttle(
struct tty_struct *tty)
1357 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1361 spin_lock_irq(&garmin_data_p->
lock);
1363 spin_unlock_irq(&garmin_data_p->
lock);
1367 static void garmin_unthrottle(
struct tty_struct *tty)
1370 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1373 spin_lock_irq(&garmin_data_p->
lock);
1375 spin_unlock_irq(&garmin_data_p->
lock);
1380 garmin_flush_queue(garmin_data_p);
1386 "%s - failed resubmitting read urb, error %d\n",
1396 static void timeout_handler(
unsigned long data)
1403 garmin_flush_queue(garmin_data_p);
1414 if (garmin_data_p ==
NULL) {
1415 dev_err(&port->
dev,
"%s - Out of memory\n", __func__);
1420 INIT_LIST_HEAD(&garmin_data_p->
pktlist);
1422 garmin_data_p->
timer.data = (
unsigned long)garmin_data_p;
1423 garmin_data_p->
timer.function = timeout_handler;
1425 garmin_data_p->
state = 0;
1426 garmin_data_p->
flags = 0;
1427 garmin_data_p->
count = 0;
1428 usb_set_serial_port_data(port, garmin_data_p);
1430 status = garmin_init_session(port);
1438 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1442 kfree(garmin_data_p);
1451 .name =
"garmin_gps",
1453 .description =
"Garmin GPS usb/tty",
1456 .open = garmin_open,
1457 .close = garmin_close,
1458 .throttle = garmin_throttle,
1459 .unthrottle = garmin_unthrottle,
1460 .port_probe = garmin_port_probe,
1461 .port_remove = garmin_port_remove,
1462 .write = garmin_write,
1463 .write_room = garmin_write_room,
1464 .write_bulk_callback = garmin_write_bulk_callback,
1465 .read_bulk_callback = garmin_read_bulk_callback,
1466 .read_int_callback = garmin_read_int_callback,
1470 &garmin_device,
NULL