1b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood/* 2b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * Copyright (C) 2011 The Android Open Source Project 3b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * 4b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 5b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * you may not use this file except in compliance with the License. 6b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * You may obtain a copy of the License at 7b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * 8b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 9b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * 10b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * Unless required by applicable law or agreed to in writing, software 11b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 12b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * See the License for the specific language governing permissions and 14b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * limitations under the License. 15b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood */ 16b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 17b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodpackage android.hardware; 18b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 19b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport android.os.ParcelFileDescriptor; 20b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 21b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport java.io.FileDescriptor; 22b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport java.io.IOException; 23b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 24b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport java.nio.ByteBuffer; 25b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 26b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood/** 27b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * @hide 28b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood */ 29b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodpublic class SerialPort { 30b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 31b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood private static final String TAG = "SerialPort"; 32b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 33b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood // used by the JNI code 34b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood private int mNativeContext; 35b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood private final String mName; 36b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood private ParcelFileDescriptor mFileDescriptor; 37b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 38b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood /** 39b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * SerialPort should only be instantiated by SerialManager 40b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * @hide 41b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood */ 42b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood public SerialPort(String name) { 43b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood mName = name; 44b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } 45b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 46b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood /** 47b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * SerialPort should only be instantiated by SerialManager 48b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * Speed must be one of 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 49b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * 19200, 38400, 57600, 115200, 230400, 460800, 500000, 576000, 921600, 1000000, 1152000, 50b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * 1500000, 2000000, 2500000, 3000000, 3500000, 4000000 51b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * 52b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * @hide 53b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood */ 54b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood public void open(ParcelFileDescriptor pfd, int speed) throws IOException { 55b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood native_open(pfd.getFileDescriptor(), speed); 56b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood mFileDescriptor = pfd; 57b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } 58b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 59b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood /** 60b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * Closes the serial port 61b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood */ 62b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood public void close() throws IOException { 63b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood if (mFileDescriptor != null) { 64b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood mFileDescriptor.close(); 65b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood mFileDescriptor = null; 66b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } 67b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood native_close(); 68b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } 69b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 70b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood /** 71b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * Returns the name of the serial port 72b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * 73b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * @return the serial port's name 74b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood */ 75b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood public String getName() { 76b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood return mName; 77b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } 78b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 79b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood /** 80cfde15d709a3466b9d503f51819b7d28e718b482Glenn Kasten * Reads data into the provided buffer. 81cfde15d709a3466b9d503f51819b7d28e718b482Glenn Kasten * Note that the value returned by {@link java.nio.Buffer#position()} on this buffer is 82cfde15d709a3466b9d503f51819b7d28e718b482Glenn Kasten * unchanged after a call to this method. 83b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * 84b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * @param buffer to read into 85b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * @return number of bytes read 86b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood */ 87b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood public int read(ByteBuffer buffer) throws IOException { 88b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood if (buffer.isDirect()) { 89b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood return native_read_direct(buffer, buffer.remaining()); 90b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } else if (buffer.hasArray()) { 91b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood return native_read_array(buffer.array(), buffer.remaining()); 92b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } else { 93b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood throw new IllegalArgumentException("buffer is not direct and has no array"); 94b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } 95b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } 96b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 97b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood /** 98cfde15d709a3466b9d503f51819b7d28e718b482Glenn Kasten * Writes data from provided buffer. 99cfde15d709a3466b9d503f51819b7d28e718b482Glenn Kasten * Note that the value returned by {@link java.nio.Buffer#position()} on this buffer is 100cfde15d709a3466b9d503f51819b7d28e718b482Glenn Kasten * unchanged after a call to this method. 101b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * 102b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * @param buffer to write 103b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * @param length number of bytes to write 104b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood */ 105b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood public void write(ByteBuffer buffer, int length) throws IOException { 106b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood if (buffer.isDirect()) { 107b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood native_write_direct(buffer, length); 108b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } else if (buffer.hasArray()) { 109b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood native_write_array(buffer.array(), length); 110b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } else { 111b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood throw new IllegalArgumentException("buffer is not direct and has no array"); 112b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } 113b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood } 114b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 1157dbc4b457d2c2c6dd39fa445e7edd8109796f0a2Mike Lockwood /** 1167dbc4b457d2c2c6dd39fa445e7edd8109796f0a2Mike Lockwood * Sends a stream of zero valued bits for 0.25 to 0.5 seconds 1177dbc4b457d2c2c6dd39fa445e7edd8109796f0a2Mike Lockwood */ 1187dbc4b457d2c2c6dd39fa445e7edd8109796f0a2Mike Lockwood public void sendBreak() { 1197dbc4b457d2c2c6dd39fa445e7edd8109796f0a2Mike Lockwood native_send_break(); 1207dbc4b457d2c2c6dd39fa445e7edd8109796f0a2Mike Lockwood } 1217dbc4b457d2c2c6dd39fa445e7edd8109796f0a2Mike Lockwood 122b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood private native void native_open(FileDescriptor pfd, int speed) throws IOException; 123b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood private native void native_close(); 124b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood private native int native_read_array(byte[] buffer, int length) throws IOException; 125b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood private native int native_read_direct(ByteBuffer buffer, int length) throws IOException; 126b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood private native void native_write_array(byte[] buffer, int length) throws IOException; 127b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood private native void native_write_direct(ByteBuffer buffer, int length) throws IOException; 1287dbc4b457d2c2c6dd39fa445e7edd8109796f0a2Mike Lockwood private native void native_send_break(); 129b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood} 130