changeset 180:4d3bde06f8db

8085890: Support rs485 mode at UART interface Summary: rs475 can be enabled with specific properties provided to DeviceManager Reviewed-by: alkonsta
author snazarki
date Fri, 05 Jun 2015 13:36:37 +0300
parents a555fd602e89
children f3b2ea714446
files src/se/classes/com/oracle/dio/uart/impl/UARTOptionsHandler.java src/se/linux/native/com/oracle/dio/rs485_enabler.cpp src/share/classes/com/oracle/dio/uart/impl/UARTImpl.java
diffstat 3 files changed, 138 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/se/classes/com/oracle/dio/uart/impl/UARTOptionsHandler.java	Fri Jun 05 13:36:37 2015 +0300
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.oracle.dio.uart.impl;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.Properties;
+
+import com.oracle.dio.utils.Logging;
+
+/**
+ * This class is workaround for enabling rs485 mode at some
+ * serial port drivers.
+ *
+ */
+class UARTOptionsHandler {
+
+    private static final String RS485_ENABLE = "jdk.dio.uart.rs485.enable";
+    private static final String RS485_RTS_ON_SEND = "jdk.dio.uart.rs485.rts_on_send";
+
+    static void processOptions(UARTImpl device, String[] options) {
+        if (null == options) {
+            return;
+        }
+        StringBuilder sb = new StringBuilder();
+        for (String option: options) {
+            sb.append(option.trim()).append('\n');
+        }
+        try {
+            StringReader sr = new StringReader(sb.toString());
+            Properties props = new Properties();
+            props.load(sr);
+
+            if ("true".equals(props.get(RS485_ENABLE))) {
+                final boolean rts_on_send = "true".equals(props.get(RS485_RTS_ON_SEND));
+                enableRS485(device.getHandle().getNativeHandle(), rts_on_send);
+            }
+        } catch (IOException e) {
+            Logging.reportError("Can't parse UART options");
+        }
+    }
+
+    private static native boolean enableRS485(int handle, boolean rts_on_send);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/se/linux/native/com/oracle/dio/rs485_enabler.cpp	Fri Jun 05 13:36:37 2015 +0300
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+
+#include "asm-generic/ioctls.h"
+#include <linux/serial.h>
+#include <errno.h>
+
+#include "jni.h"
+
+#include "serial.h"
+#include "javacall_logging.h"
+#include <dio_common.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+JNIEXPORT jboolean JNICALL Java_com_oracle_dio_uart_impl_UARTOptionsHandler_enableRS485
+  (JNIEnv* env, jint def_ref_handle, jboolean rts_on_send) {
+    struct serial_rs485 rs485conf;
+    device_reference dev_ref = (device_reference)def_ref_handle;
+    if (def_ref_handle == -1) {
+        JAVACALL_REPORT_ERROR(JC_DIO, "Can't enable RS485 interface. Device is closed");
+        return JNI_FALSE;
+    }
+    int handle = ((serial_handle)getDeviceHandle(dev_ref))->fd;
+    memset(&rs485conf, 0x0, sizeof(struct serial_rs485));
+    /* Enable RS485 mode */
+    rs485conf.flags |= SER_RS485_ENABLED;
+    /* Set logical level for RTS pin equal to 1 when sending */
+    rs485conf.flags |= SER_RS485_RTS_ON_SEND;
+    /* need some field test to detect whether this value is necessary */
+    rs485conf.delay_rts_before_send = 0x00000001;
+    if (ioctl (handle, TIOCSRS485, &rs485conf) < 0) {
+        JAVACALL_REPORT_ERROR1(JC_DIO, "Can't enable RS485 interface. Err %d", errno);
+        return JNI_FALSE;
+    }
+
+    return JNI_TRUE;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
--- a/src/share/classes/com/oracle/dio/uart/impl/UARTImpl.java	Thu Jun 04 19:20:15 2015 +0300
+++ b/src/share/classes/com/oracle/dio/uart/impl/UARTImpl.java	Fri Jun 05 13:36:37 2015 +0300
@@ -112,6 +112,9 @@
         isWriting = false;
         eventListeners = new Hashtable<Integer, UARTEventListener>();
         initPowerManagement();
+
+        // this is quick update to support RS485 on Linux
+        UARTOptionsHandler.processOptions(this, dscr.getProperties());
     }
 
     private class InternalRoundListener implements  InputRoundListener<UART, ByteBuffer> {