svn commit: r279729 - in head/sys: dev/usb/serial sys
Hans Petter Selasky
hselasky at FreeBSD.org
Sat Mar 7 18:26:00 UTC 2015
Author: hselasky
Date: Sat Mar 7 18:25:58 2015
New Revision: 279729
URL: https://svnweb.freebsd.org/changeset/base/279729
Log:
Add PPS support to USB serial drivers.
Bump kernel version to reflect structure change.
PR: 196897
MFC after: 1 week
Modified:
head/sys/dev/usb/serial/usb_serial.c
head/sys/dev/usb/serial/usb_serial.h
head/sys/sys/param.h
Modified: head/sys/dev/usb/serial/usb_serial.c
==============================================================================
--- head/sys/dev/usb/serial/usb_serial.c Sat Mar 7 18:23:32 2015 (r279728)
+++ head/sys/dev/usb/serial/usb_serial.c Sat Mar 7 18:25:58 2015 (r279729)
@@ -96,6 +96,11 @@ __FBSDID("$FreeBSD$");
static SYSCTL_NODE(_hw_usb, OID_AUTO, ucom, CTLFLAG_RW, 0, "USB ucom");
+static int ucom_pps_mode;
+
+SYSCTL_INT(_hw_usb_ucom, OID_AUTO, pps_mode, CTLFLAG_RWTUN,
+ &ucom_pps_mode, 0, "pulse capturing mode - 0/1/2 - disabled/CTS/DCD");
+
#ifdef USB_DEBUG
static int ucom_debug = 0;
@@ -409,6 +414,10 @@ ucom_attach_tty(struct ucom_super_softc
sc->sc_tty = tp;
+ sc->sc_pps.ppscap = PPS_CAPTUREBOTH;
+ sc->sc_pps.mtx = sc->sc_mtx;
+ pps_init(&sc->sc_pps);
+
DPRINTF("ttycreate: %s\n", buf);
/* Check if this device should be a console */
@@ -858,6 +867,8 @@ ucom_ioctl(struct tty *tp, u_long cmd, c
} else {
error = ENOIOCTL;
}
+ if (error == ENOIOCTL)
+ error = pps_ioctl(cmd, data, &sc->sc_pps);
break;
}
return (error);
@@ -1061,7 +1072,7 @@ ucom_cfg_status_change(struct usb_proc_m
struct tty *tp;
uint8_t new_msr;
uint8_t new_lsr;
- uint8_t onoff;
+ uint8_t msr_delta;
uint8_t lsr_delta;
tp = sc->sc_tty;
@@ -1085,15 +1096,37 @@ ucom_cfg_status_change(struct usb_proc_m
/* TTY device closed */
return;
}
- onoff = ((sc->sc_msr ^ new_msr) & SER_DCD);
+ msr_delta = (sc->sc_msr ^ new_msr);
lsr_delta = (sc->sc_lsr ^ new_lsr);
sc->sc_msr = new_msr;
sc->sc_lsr = new_lsr;
- if (onoff) {
+ /* time pulse counting support */
+ switch(ucom_pps_mode) {
+ case 1:
+ if ((sc->sc_pps.ppscap & PPS_CAPTUREBOTH) &&
+ (msr_delta & SER_CTS)) {
+ pps_capture(&sc->sc_pps);
+ pps_event(&sc->sc_pps, (sc->sc_msr & SER_CTS) ?
+ PPS_CAPTUREASSERT : PPS_CAPTURECLEAR);
+ }
+ break;
+ case 2:
+ if ((sc->sc_pps.ppscap & PPS_CAPTUREBOTH) &&
+ (msr_delta & SER_DCD)) {
+ pps_capture(&sc->sc_pps);
+ pps_event(&sc->sc_pps, (sc->sc_msr & SER_DCD) ?
+ PPS_CAPTUREASSERT : PPS_CAPTURECLEAR);
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (msr_delta & SER_DCD) {
- onoff = (sc->sc_msr & SER_DCD) ? 1 : 0;
+ int onoff = (sc->sc_msr & SER_DCD) ? 1 : 0;
DPRINTF("DCD changed to %d\n", onoff);
Modified: head/sys/dev/usb/serial/usb_serial.h
==============================================================================
--- head/sys/dev/usb/serial/usb_serial.h Sat Mar 7 18:23:32 2015 (r279728)
+++ head/sys/dev/usb/serial/usb_serial.h Sat Mar 7 18:25:58 2015 (r279729)
@@ -64,6 +64,7 @@
#include <sys/serial.h>
#include <sys/fcntl.h>
#include <sys/sysctl.h>
+#include <sys/timepps.h>
/* Module interface related macros */
#define UCOM_MODVER 1
@@ -155,6 +156,8 @@ struct ucom_softc {
struct ucom_cfg_task sc_line_state_task[2];
struct ucom_cfg_task sc_status_task[2];
struct ucom_param_task sc_param_task[2];
+ /* pulse capturing support, PPS */
+ struct pps_state sc_pps;
/* Used to set "UCOM_FLAG_GP_DATA" flag: */
struct usb_proc_msg *sc_last_start_xfer;
const struct ucom_callback *sc_callback;
Modified: head/sys/sys/param.h
==============================================================================
--- head/sys/sys/param.h Sat Mar 7 18:23:32 2015 (r279728)
+++ head/sys/sys/param.h Sat Mar 7 18:25:58 2015 (r279729)
@@ -58,7 +58,7 @@
* in the range 5 to 9.
*/
#undef __FreeBSD_version
-#define __FreeBSD_version 1100063 /* Master, propagated to newvers */
+#define __FreeBSD_version 1100064 /* Master, propagated to newvers */
/*
* __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,
More information about the svn-src-all
mailing list