From a3dec2cbe5e539b5a270bed86eed78b283c79cdb Mon Sep 17 00:00:00 2001 From: Daniel Golle Date: Thu, 27 May 2021 01:18:20 +0200 Subject: [PATCH] add support for Sierra Wireless qcserial NMEA-0183 interface Sierra Wireless EM 74xx modems come with a serial port outputting NMEA-0183 GPS sentences. In order to make it work, the magic string '$GPS_START' needs to be written to the modem, as only then the modem firmware starts sending NMEA-0183 output. Add option 'sierragpsstart' which if set to anything else than 0 will make kplex send the magic string when the device is opened. --- serial.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/serial.c b/serial.c index 5f4318c..33fd8d4 100644 --- a/serial.c +++ b/serial.c @@ -24,6 +24,7 @@ #include #define DEFSERIALQSIZE 32 +#define SIERRA_GPS_START "$GPS_START\n" struct if_serial { int fd; @@ -290,7 +291,8 @@ struct iface *init_serial (struct iface *ifa) int ret; struct kopts *opt; int qsize=DEFSERIALQSIZE; - + int send_gps_start = 0; + for(opt=ifa->options;opt;opt=opt->next) { if (!strcasecmp(opt->var,"filename")) devname=opt->val; @@ -324,7 +326,9 @@ struct iface *init_serial (struct iface *ifa) logerr(0,"Invalid queue size specified: %s",opt->val); return(NULL); } - } else { + } else if (!strcasecmp(opt->var, "sierragpsstart")) { + send_gps_start=atoi(opt->val); + } else { logerr(0,"unknown interface option %s",opt->var); return(NULL); } @@ -337,7 +341,7 @@ struct iface *init_serial (struct iface *ifa) } /* Open interface or die */ - if ((ifs->fd=ttyopen(devname,ifa->direction)) < 0) { + if ((ifs->fd=ttyopen(devname, send_gps_start?BOTH:ifa->direction)) < 0) { return(NULL); } DEBUG(3,"%s: opened serial device %s for %s",ifa->name,devname, @@ -358,6 +362,9 @@ struct iface *init_serial (struct iface *ifa) ifs->saved=1; ifs->slavename=NULL; + if (send_gps_start) + write(ifs->fd, SIERRA_GPS_START, strlen(SIERRA_GPS_START)); + /* Assign pointers to read, write and cleanup routines */ ifa->read=do_read; ifa->readbuf=read_serial;