mirror of
				https://github.com/mik3y/usb-serial-for-android
				synced 2025-10-31 10:27:27 +00:00 
			
		
		
		
	
						commit
						57d10a08dd
					
				
							
								
								
									
										470
									
								
								LICENSE.txt
									
									
									
									
									
								
							
							
						
						
									
										470
									
								
								LICENSE.txt
									
									
									
									
									
								
							| @ -1,456 +1,22 @@ | |||||||
|                   GNU LESSER GENERAL PUBLIC LICENSE | MIT License | ||||||
|                        Version 2.1, February 1999 |  | ||||||
| 
 | 
 | ||||||
|  Copyright (C) 1991, 1999 Free Software Foundation, Inc. | Copyright (c) 2011-2013 Google Inc. | ||||||
|  51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA | Copyright (c) 2013 Mike Wakerly | ||||||
|  Everyone is permitted to copy and distribute verbatim copies |  | ||||||
|  of this license document, but changing it is not allowed. |  | ||||||
| 
 | 
 | ||||||
| [This is the first released version of the Lesser GPL.  It also counts | Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  as the successor of the GNU Library Public License, version 2, hence | of this software and associated documentation files (the "Software"), to deal | ||||||
|  the version number 2.1.] | in the Software without restriction, including without limitation the rights | ||||||
|  | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  | copies of the Software, and to permit persons to whom the Software is | ||||||
|  | furnished to do so, subject to the following conditions: | ||||||
| 
 | 
 | ||||||
|                             Preamble | The above copyright notice and this permission notice shall be included in all | ||||||
|  | copies or substantial portions of the Software. | ||||||
| 
 | 
 | ||||||
|   The licenses for most software are designed to take away your | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
| freedom to share and change it.  By contrast, the GNU General Public | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
| Licenses are intended to guarantee your freedom to share and change | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
| free software--to make sure the software is free for all its users. | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
| 
 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|   This license, the Lesser General Public License, applies to some | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
| specially designated software packages--typically libraries--of the | SOFTWARE. | ||||||
| Free Software Foundation and other authors who decide to use it.  You |  | ||||||
| can use it too, but we suggest you first think carefully about whether |  | ||||||
| this license or the ordinary General Public License is the better |  | ||||||
| strategy to use in any particular case, based on the explanations below. |  | ||||||
| 
 |  | ||||||
|   When we speak of free software, we are referring to freedom of use, |  | ||||||
| not price.  Our General Public Licenses are designed to make sure that |  | ||||||
| you have the freedom to distribute copies of free software (and charge |  | ||||||
| for this service if you wish); that you receive source code or can get |  | ||||||
| it if you want it; that you can change the software and use pieces of |  | ||||||
| it in new free programs; and that you are informed that you can do |  | ||||||
| these things. |  | ||||||
| 
 |  | ||||||
|   To protect your rights, we need to make restrictions that forbid |  | ||||||
| distributors to deny you these rights or to ask you to surrender these |  | ||||||
| rights.  These restrictions translate to certain responsibilities for |  | ||||||
| you if you distribute copies of the library or if you modify it. |  | ||||||
| 
 |  | ||||||
|   For example, if you distribute copies of the library, whether gratis |  | ||||||
| or for a fee, you must give the recipients all the rights that we gave |  | ||||||
| you.  You must make sure that they, too, receive or can get the source |  | ||||||
| code.  If you link other code with the library, you must provide |  | ||||||
| complete object files to the recipients, so that they can relink them |  | ||||||
| with the library after making changes to the library and recompiling |  | ||||||
| it.  And you must show them these terms so they know their rights. |  | ||||||
| 
 |  | ||||||
|   We protect your rights with a two-step method: (1) we copyright the |  | ||||||
| library, and (2) we offer you this license, which gives you legal |  | ||||||
| permission to copy, distribute and/or modify the library. |  | ||||||
| 
 |  | ||||||
|   To protect each distributor, we want to make it very clear that |  | ||||||
| there is no warranty for the free library.  Also, if the library is |  | ||||||
| modified by someone else and passed on, the recipients should know |  | ||||||
| that what they have is not the original version, so that the original |  | ||||||
| author's reputation will not be affected by problems that might be |  | ||||||
| introduced by others. |  | ||||||
|  |  | ||||||
|   Finally, software patents pose a constant threat to the existence of |  | ||||||
| any free program.  We wish to make sure that a company cannot |  | ||||||
| effectively restrict the users of a free program by obtaining a |  | ||||||
| restrictive license from a patent holder.  Therefore, we insist that |  | ||||||
| any patent license obtained for a version of the library must be |  | ||||||
| consistent with the full freedom of use specified in this license. |  | ||||||
| 
 |  | ||||||
|   Most GNU software, including some libraries, is covered by the |  | ||||||
| ordinary GNU General Public License.  This license, the GNU Lesser |  | ||||||
| General Public License, applies to certain designated libraries, and |  | ||||||
| is quite different from the ordinary General Public License.  We use |  | ||||||
| this license for certain libraries in order to permit linking those |  | ||||||
| libraries into non-free programs. |  | ||||||
| 
 |  | ||||||
|   When a program is linked with a library, whether statically or using |  | ||||||
| a shared library, the combination of the two is legally speaking a |  | ||||||
| combined work, a derivative of the original library.  The ordinary |  | ||||||
| General Public License therefore permits such linking only if the |  | ||||||
| entire combination fits its criteria of freedom.  The Lesser General |  | ||||||
| Public License permits more lax criteria for linking other code with |  | ||||||
| the library. |  | ||||||
| 
 |  | ||||||
|   We call this license the "Lesser" General Public License because it |  | ||||||
| does Less to protect the user's freedom than the ordinary General |  | ||||||
| Public License.  It also provides other free software developers Less |  | ||||||
| of an advantage over competing non-free programs.  These disadvantages |  | ||||||
| are the reason we use the ordinary General Public License for many |  | ||||||
| libraries.  However, the Lesser license provides advantages in certain |  | ||||||
| special circumstances. |  | ||||||
| 
 |  | ||||||
|   For example, on rare occasions, there may be a special need to |  | ||||||
| encourage the widest possible use of a certain library, so that it becomes |  | ||||||
| a de-facto standard.  To achieve this, non-free programs must be |  | ||||||
| allowed to use the library.  A more frequent case is that a free |  | ||||||
| library does the same job as widely used non-free libraries.  In this |  | ||||||
| case, there is little to gain by limiting the free library to free |  | ||||||
| software only, so we use the Lesser General Public License. |  | ||||||
| 
 |  | ||||||
|   In other cases, permission to use a particular library in non-free |  | ||||||
| programs enables a greater number of people to use a large body of |  | ||||||
| free software.  For example, permission to use the GNU C Library in |  | ||||||
| non-free programs enables many more people to use the whole GNU |  | ||||||
| operating system, as well as its variant, the GNU/Linux operating |  | ||||||
| system. |  | ||||||
| 
 |  | ||||||
|   Although the Lesser General Public License is Less protective of the |  | ||||||
| users' freedom, it does ensure that the user of a program that is |  | ||||||
| linked with the Library has the freedom and the wherewithal to run |  | ||||||
| that program using a modified version of the Library. |  | ||||||
| 
 |  | ||||||
|   The precise terms and conditions for copying, distribution and |  | ||||||
| modification follow.  Pay close attention to the difference between a |  | ||||||
| "work based on the library" and a "work that uses the library".  The |  | ||||||
| former contains code derived from the library, whereas the latter must |  | ||||||
| be combined with the library in order to run. |  | ||||||
|  |  | ||||||
|                   GNU LESSER GENERAL PUBLIC LICENSE |  | ||||||
|    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |  | ||||||
| 
 |  | ||||||
|   0. This License Agreement applies to any software library or other |  | ||||||
| program which contains a notice placed by the copyright holder or |  | ||||||
| other authorized party saying it may be distributed under the terms of |  | ||||||
| this Lesser General Public License (also called "this License"). |  | ||||||
| Each licensee is addressed as "you". |  | ||||||
| 
 |  | ||||||
|   A "library" means a collection of software functions and/or data |  | ||||||
| prepared so as to be conveniently linked with application programs |  | ||||||
| (which use some of those functions and data) to form executables. |  | ||||||
| 
 |  | ||||||
|   The "Library", below, refers to any such software library or work |  | ||||||
| which has been distributed under these terms.  A "work based on the |  | ||||||
| Library" means either the Library or any derivative work under |  | ||||||
| copyright law: that is to say, a work containing the Library or a |  | ||||||
| portion of it, either verbatim or with modifications and/or translated |  | ||||||
| straightforwardly into another language.  (Hereinafter, translation is |  | ||||||
| included without limitation in the term "modification".) |  | ||||||
| 
 |  | ||||||
|   "Source code" for a work means the preferred form of the work for |  | ||||||
| making modifications to it.  For a library, complete source code means |  | ||||||
| all the source code for all modules it contains, plus any associated |  | ||||||
| interface definition files, plus the scripts used to control compilation |  | ||||||
| and installation of the library. |  | ||||||
| 
 |  | ||||||
|   Activities other than copying, distribution and modification are not |  | ||||||
| covered by this License; they are outside its scope.  The act of |  | ||||||
| running a program using the Library is not restricted, and output from |  | ||||||
| such a program is covered only if its contents constitute a work based |  | ||||||
| on the Library (independent of the use of the Library in a tool for |  | ||||||
| writing it).  Whether that is true depends on what the Library does |  | ||||||
| and what the program that uses the Library does. |  | ||||||
| 
 |  | ||||||
|   1. You may copy and distribute verbatim copies of the Library's |  | ||||||
| complete source code as you receive it, in any medium, provided that |  | ||||||
| you conspicuously and appropriately publish on each copy an |  | ||||||
| appropriate copyright notice and disclaimer of warranty; keep intact |  | ||||||
| all the notices that refer to this License and to the absence of any |  | ||||||
| warranty; and distribute a copy of this License along with the |  | ||||||
| Library. |  | ||||||
| 
 |  | ||||||
|   You may charge a fee for the physical act of transferring a copy, |  | ||||||
| and you may at your option offer warranty protection in exchange for a |  | ||||||
| fee. |  | ||||||
|  |  | ||||||
|   2. You may modify your copy or copies of the Library or any portion |  | ||||||
| of it, thus forming a work based on the Library, and copy and |  | ||||||
| distribute such modifications or work under the terms of Section 1 |  | ||||||
| above, provided that you also meet all of these conditions: |  | ||||||
| 
 |  | ||||||
|     a) The modified work must itself be a software library. |  | ||||||
| 
 |  | ||||||
|     b) You must cause the files modified to carry prominent notices |  | ||||||
|     stating that you changed the files and the date of any change. |  | ||||||
| 
 |  | ||||||
|     c) You must cause the whole of the work to be licensed at no |  | ||||||
|     charge to all third parties under the terms of this License. |  | ||||||
| 
 |  | ||||||
|     d) If a facility in the modified Library refers to a function or a |  | ||||||
|     table of data to be supplied by an application program that uses |  | ||||||
|     the facility, other than as an argument passed when the facility |  | ||||||
|     is invoked, then you must make a good faith effort to ensure that, |  | ||||||
|     in the event an application does not supply such function or |  | ||||||
|     table, the facility still operates, and performs whatever part of |  | ||||||
|     its purpose remains meaningful. |  | ||||||
| 
 |  | ||||||
|     (For example, a function in a library to compute square roots has |  | ||||||
|     a purpose that is entirely well-defined independent of the |  | ||||||
|     application.  Therefore, Subsection 2d requires that any |  | ||||||
|     application-supplied function or table used by this function must |  | ||||||
|     be optional: if the application does not supply it, the square |  | ||||||
|     root function must still compute square roots.) |  | ||||||
| 
 |  | ||||||
| These requirements apply to the modified work as a whole.  If |  | ||||||
| identifiable sections of that work are not derived from the Library, |  | ||||||
| and can be reasonably considered independent and separate works in |  | ||||||
| themselves, then this License, and its terms, do not apply to those |  | ||||||
| sections when you distribute them as separate works.  But when you |  | ||||||
| distribute the same sections as part of a whole which is a work based |  | ||||||
| on the Library, the distribution of the whole must be on the terms of |  | ||||||
| this License, whose permissions for other licensees extend to the |  | ||||||
| entire whole, and thus to each and every part regardless of who wrote |  | ||||||
| it. |  | ||||||
| 
 |  | ||||||
| Thus, it is not the intent of this section to claim rights or contest |  | ||||||
| your rights to work written entirely by you; rather, the intent is to |  | ||||||
| exercise the right to control the distribution of derivative or |  | ||||||
| collective works based on the Library. |  | ||||||
| 
 |  | ||||||
| In addition, mere aggregation of another work not based on the Library |  | ||||||
| with the Library (or with a work based on the Library) on a volume of |  | ||||||
| a storage or distribution medium does not bring the other work under |  | ||||||
| the scope of this License. |  | ||||||
| 
 |  | ||||||
|   3. You may opt to apply the terms of the ordinary GNU General Public |  | ||||||
| License instead of this License to a given copy of the Library.  To do |  | ||||||
| this, you must alter all the notices that refer to this License, so |  | ||||||
| that they refer to the ordinary GNU General Public License, version 2, |  | ||||||
| instead of to this License.  (If a newer version than version 2 of the |  | ||||||
| ordinary GNU General Public License has appeared, then you can specify |  | ||||||
| that version instead if you wish.)  Do not make any other change in |  | ||||||
| these notices. |  | ||||||
|  |  | ||||||
|   Once this change is made in a given copy, it is irreversible for |  | ||||||
| that copy, so the ordinary GNU General Public License applies to all |  | ||||||
| subsequent copies and derivative works made from that copy. |  | ||||||
| 
 |  | ||||||
|   This option is useful when you wish to copy part of the code of |  | ||||||
| the Library into a program that is not a library. |  | ||||||
| 
 |  | ||||||
|   4. You may copy and distribute the Library (or a portion or |  | ||||||
| derivative of it, under Section 2) in object code or executable form |  | ||||||
| under the terms of Sections 1 and 2 above provided that you accompany |  | ||||||
| it with the complete corresponding machine-readable source code, which |  | ||||||
| must be distributed under the terms of Sections 1 and 2 above on a |  | ||||||
| medium customarily used for software interchange. |  | ||||||
| 
 |  | ||||||
|   If distribution of object code is made by offering access to copy |  | ||||||
| from a designated place, then offering equivalent access to copy the |  | ||||||
| source code from the same place satisfies the requirement to |  | ||||||
| distribute the source code, even though third parties are not |  | ||||||
| compelled to copy the source along with the object code. |  | ||||||
| 
 |  | ||||||
|   5. A program that contains no derivative of any portion of the |  | ||||||
| Library, but is designed to work with the Library by being compiled or |  | ||||||
| linked with it, is called a "work that uses the Library".  Such a |  | ||||||
| work, in isolation, is not a derivative work of the Library, and |  | ||||||
| therefore falls outside the scope of this License. |  | ||||||
| 
 |  | ||||||
|   However, linking a "work that uses the Library" with the Library |  | ||||||
| creates an executable that is a derivative of the Library (because it |  | ||||||
| contains portions of the Library), rather than a "work that uses the |  | ||||||
| library".  The executable is therefore covered by this License. |  | ||||||
| Section 6 states terms for distribution of such executables. |  | ||||||
| 
 |  | ||||||
|   When a "work that uses the Library" uses material from a header file |  | ||||||
| that is part of the Library, the object code for the work may be a |  | ||||||
| derivative work of the Library even though the source code is not. |  | ||||||
| Whether this is true is especially significant if the work can be |  | ||||||
| linked without the Library, or if the work is itself a library.  The |  | ||||||
| threshold for this to be true is not precisely defined by law. |  | ||||||
| 
 |  | ||||||
|   If such an object file uses only numerical parameters, data |  | ||||||
| structure layouts and accessors, and small macros and small inline |  | ||||||
| functions (ten lines or less in length), then the use of the object |  | ||||||
| file is unrestricted, regardless of whether it is legally a derivative |  | ||||||
| work.  (Executables containing this object code plus portions of the |  | ||||||
| Library will still fall under Section 6.) |  | ||||||
| 
 |  | ||||||
|   Otherwise, if the work is a derivative of the Library, you may |  | ||||||
| distribute the object code for the work under the terms of Section 6. |  | ||||||
| Any executables containing that work also fall under Section 6, |  | ||||||
| whether or not they are linked directly with the Library itself. |  | ||||||
|  |  | ||||||
|   6. As an exception to the Sections above, you may also combine or |  | ||||||
| link a "work that uses the Library" with the Library to produce a |  | ||||||
| work containing portions of the Library, and distribute that work |  | ||||||
| under terms of your choice, provided that the terms permit |  | ||||||
| modification of the work for the customer's own use and reverse |  | ||||||
| engineering for debugging such modifications. |  | ||||||
| 
 |  | ||||||
|   You must give prominent notice with each copy of the work that the |  | ||||||
| Library is used in it and that the Library and its use are covered by |  | ||||||
| this License.  You must supply a copy of this License.  If the work |  | ||||||
| during execution displays copyright notices, you must include the |  | ||||||
| copyright notice for the Library among them, as well as a reference |  | ||||||
| directing the user to the copy of this License.  Also, you must do one |  | ||||||
| of these things: |  | ||||||
| 
 |  | ||||||
|     a) Accompany the work with the complete corresponding |  | ||||||
|     machine-readable source code for the Library including whatever |  | ||||||
|     changes were used in the work (which must be distributed under |  | ||||||
|     Sections 1 and 2 above); and, if the work is an executable linked |  | ||||||
|     with the Library, with the complete machine-readable "work that |  | ||||||
|     uses the Library", as object code and/or source code, so that the |  | ||||||
|     user can modify the Library and then relink to produce a modified |  | ||||||
|     executable containing the modified Library.  (It is understood |  | ||||||
|     that the user who changes the contents of definitions files in the |  | ||||||
|     Library will not necessarily be able to recompile the application |  | ||||||
|     to use the modified definitions.) |  | ||||||
| 
 |  | ||||||
|     b) Use a suitable shared library mechanism for linking with the |  | ||||||
|     Library.  A suitable mechanism is one that (1) uses at run time a |  | ||||||
|     copy of the library already present on the user's computer system, |  | ||||||
|     rather than copying library functions into the executable, and (2) |  | ||||||
|     will operate properly with a modified version of the library, if |  | ||||||
|     the user installs one, as long as the modified version is |  | ||||||
|     interface-compatible with the version that the work was made with. |  | ||||||
| 
 |  | ||||||
|     c) Accompany the work with a written offer, valid for at |  | ||||||
|     least three years, to give the same user the materials |  | ||||||
|     specified in Subsection 6a, above, for a charge no more |  | ||||||
|     than the cost of performing this distribution. |  | ||||||
| 
 |  | ||||||
|     d) If distribution of the work is made by offering access to copy |  | ||||||
|     from a designated place, offer equivalent access to copy the above |  | ||||||
|     specified materials from the same place. |  | ||||||
| 
 |  | ||||||
|     e) Verify that the user has already received a copy of these |  | ||||||
|     materials or that you have already sent this user a copy. |  | ||||||
| 
 |  | ||||||
|   For an executable, the required form of the "work that uses the |  | ||||||
| Library" must include any data and utility programs needed for |  | ||||||
| reproducing the executable from it.  However, as a special exception, |  | ||||||
| the materials to be distributed need not include anything that is |  | ||||||
| normally distributed (in either source or binary form) with the major |  | ||||||
| components (compiler, kernel, and so on) of the operating system on |  | ||||||
| which the executable runs, unless that component itself accompanies |  | ||||||
| the executable. |  | ||||||
| 
 |  | ||||||
|   It may happen that this requirement contradicts the license |  | ||||||
| restrictions of other proprietary libraries that do not normally |  | ||||||
| accompany the operating system.  Such a contradiction means you cannot |  | ||||||
| use both them and the Library together in an executable that you |  | ||||||
| distribute. |  | ||||||
|  |  | ||||||
|   7. You may place library facilities that are a work based on the |  | ||||||
| Library side-by-side in a single library together with other library |  | ||||||
| facilities not covered by this License, and distribute such a combined |  | ||||||
| library, provided that the separate distribution of the work based on |  | ||||||
| the Library and of the other library facilities is otherwise |  | ||||||
| permitted, and provided that you do these two things: |  | ||||||
| 
 |  | ||||||
|     a) Accompany the combined library with a copy of the same work |  | ||||||
|     based on the Library, uncombined with any other library |  | ||||||
|     facilities.  This must be distributed under the terms of the |  | ||||||
|     Sections above. |  | ||||||
| 
 |  | ||||||
|     b) Give prominent notice with the combined library of the fact |  | ||||||
|     that part of it is a work based on the Library, and explaining |  | ||||||
|     where to find the accompanying uncombined form of the same work. |  | ||||||
| 
 |  | ||||||
|   8. You may not copy, modify, sublicense, link with, or distribute |  | ||||||
| the Library except as expressly provided under this License.  Any |  | ||||||
| attempt otherwise to copy, modify, sublicense, link with, or |  | ||||||
| distribute the Library is void, and will automatically terminate your |  | ||||||
| rights under this License.  However, parties who have received copies, |  | ||||||
| or rights, from you under this License will not have their licenses |  | ||||||
| terminated so long as such parties remain in full compliance. |  | ||||||
| 
 |  | ||||||
|   9. You are not required to accept this License, since you have not |  | ||||||
| signed it.  However, nothing else grants you permission to modify or |  | ||||||
| distribute the Library or its derivative works.  These actions are |  | ||||||
| prohibited by law if you do not accept this License.  Therefore, by |  | ||||||
| modifying or distributing the Library (or any work based on the |  | ||||||
| Library), you indicate your acceptance of this License to do so, and |  | ||||||
| all its terms and conditions for copying, distributing or modifying |  | ||||||
| the Library or works based on it. |  | ||||||
| 
 |  | ||||||
|   10. Each time you redistribute the Library (or any work based on the |  | ||||||
| Library), the recipient automatically receives a license from the |  | ||||||
| original licensor to copy, distribute, link with or modify the Library |  | ||||||
| subject to these terms and conditions.  You may not impose any further |  | ||||||
| restrictions on the recipients' exercise of the rights granted herein. |  | ||||||
| You are not responsible for enforcing compliance by third parties with |  | ||||||
| this License. |  | ||||||
|  |  | ||||||
|   11. If, as a consequence of a court judgment or allegation of patent |  | ||||||
| infringement or for any other reason (not limited to patent issues), |  | ||||||
| conditions are imposed on you (whether by court order, agreement or |  | ||||||
| otherwise) that contradict the conditions of this License, they do not |  | ||||||
| excuse you from the conditions of this License.  If you cannot |  | ||||||
| distribute so as to satisfy simultaneously your obligations under this |  | ||||||
| License and any other pertinent obligations, then as a consequence you |  | ||||||
| may not distribute the Library at all.  For example, if a patent |  | ||||||
| license would not permit royalty-free redistribution of the Library by |  | ||||||
| all those who receive copies directly or indirectly through you, then |  | ||||||
| the only way you could satisfy both it and this License would be to |  | ||||||
| refrain entirely from distribution of the Library. |  | ||||||
| 
 |  | ||||||
| If any portion of this section is held invalid or unenforceable under any |  | ||||||
| particular circumstance, the balance of the section is intended to apply, |  | ||||||
| and the section as a whole is intended to apply in other circumstances. |  | ||||||
| 
 |  | ||||||
| It is not the purpose of this section to induce you to infringe any |  | ||||||
| patents or other property right claims or to contest validity of any |  | ||||||
| such claims; this section has the sole purpose of protecting the |  | ||||||
| integrity of the free software distribution system which is |  | ||||||
| implemented by public license practices.  Many people have made |  | ||||||
| generous contributions to the wide range of software distributed |  | ||||||
| through that system in reliance on consistent application of that |  | ||||||
| system; it is up to the author/donor to decide if he or she is willing |  | ||||||
| to distribute software through any other system and a licensee cannot |  | ||||||
| impose that choice. |  | ||||||
| 
 |  | ||||||
| This section is intended to make thoroughly clear what is believed to |  | ||||||
| be a consequence of the rest of this License. |  | ||||||
| 
 |  | ||||||
|   12. If the distribution and/or use of the Library is restricted in |  | ||||||
| certain countries either by patents or by copyrighted interfaces, the |  | ||||||
| original copyright holder who places the Library under this License may add |  | ||||||
| an explicit geographical distribution limitation excluding those countries, |  | ||||||
| so that distribution is permitted only in or among countries not thus |  | ||||||
| excluded.  In such case, this License incorporates the limitation as if |  | ||||||
| written in the body of this License. |  | ||||||
| 
 |  | ||||||
|   13. The Free Software Foundation may publish revised and/or new |  | ||||||
| versions of the Lesser General Public License from time to time. |  | ||||||
| Such new versions will be similar in spirit to the present version, |  | ||||||
| but may differ in detail to address new problems or concerns. |  | ||||||
| 
 |  | ||||||
| Each version is given a distinguishing version number.  If the Library |  | ||||||
| specifies a version number of this License which applies to it and |  | ||||||
| "any later version", you have the option of following the terms and |  | ||||||
| conditions either of that version or of any later version published by |  | ||||||
| the Free Software Foundation.  If the Library does not specify a |  | ||||||
| license version number, you may choose any version ever published by |  | ||||||
| the Free Software Foundation. |  | ||||||
|  |  | ||||||
|   14. If you wish to incorporate parts of the Library into other free |  | ||||||
| programs whose distribution conditions are incompatible with these, |  | ||||||
| write to the author to ask for permission.  For software which is |  | ||||||
| copyrighted by the Free Software Foundation, write to the Free |  | ||||||
| Software Foundation; we sometimes make exceptions for this.  Our |  | ||||||
| decision will be guided by the two goals of preserving the free status |  | ||||||
| of all derivatives of our free software and of promoting the sharing |  | ||||||
| and reuse of software generally. |  | ||||||
| 
 |  | ||||||
|                             NO WARRANTY |  | ||||||
| 
 |  | ||||||
|   15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO |  | ||||||
| WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. |  | ||||||
| EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR |  | ||||||
| OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY |  | ||||||
| KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE |  | ||||||
| IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |  | ||||||
| PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE |  | ||||||
| LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME |  | ||||||
| THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. |  | ||||||
| 
 |  | ||||||
|   16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN |  | ||||||
| WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY |  | ||||||
| AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU |  | ||||||
| FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR |  | ||||||
| CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE |  | ||||||
| LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING |  | ||||||
| RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A |  | ||||||
| FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF |  | ||||||
| SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH |  | ||||||
| DAMAGES. |  | ||||||
|  | |||||||
							
								
								
									
										12
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								README.md
									
									
									
									
									
								
							| @ -149,18 +149,6 @@ and devices implementing the CDC/ACM protocol like | |||||||
| * BBC micro:bit using ARM mbed DAPLink firmware | * BBC micro:bit using ARM mbed DAPLink firmware | ||||||
| * ... | * ... | ||||||
| 
 | 
 | ||||||
| ## Author, License, and Copyright |  | ||||||
| 
 |  | ||||||
| usb-serial-for-android is written and maintained by *mike wakerly* and *kai morich* |  | ||||||
| 
 |  | ||||||
| This library is licensed under *LGPL Version 2.1*.  Please see LICENSE.txt for the |  | ||||||
| complete license. |  | ||||||
| 
 |  | ||||||
| Copyright 2011-2012, Google Inc. All Rights Reserved. |  | ||||||
| 
 |  | ||||||
| Portions of this library are based on [libftdi](http://www.intra2net.com/en/developer/libftdi). |  | ||||||
| Please see FtdiSerialDriver.java for more information. |  | ||||||
| 
 |  | ||||||
| ## Help & Discussion | ## Help & Discussion | ||||||
| 
 | 
 | ||||||
| For common problems, see the | For common problems, see the | ||||||
|  | |||||||
| @ -15,6 +15,10 @@ android { | |||||||
|                 'rfc2217_server_nonstandard_baudrates': 'true',   // true    false     false |                 'rfc2217_server_nonstandard_baudrates': 'true',   // true    false     false | ||||||
|         ] |         ] | ||||||
|     } |     } | ||||||
|  |     compileOptions { | ||||||
|  |         sourceCompatibility JavaVersion.VERSION_1_8 | ||||||
|  |         targetCompatibility JavaVersion.VERSION_1_8 | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| dependencies { | dependencies { | ||||||
|  | |||||||
| @ -5,7 +5,7 @@ publishing { | |||||||
|         maven(MavenPublication) { |         maven(MavenPublication) { | ||||||
|             groupId 'com.github.mik3y' |             groupId 'com.github.mik3y' | ||||||
|             artifactId 'usb-serial-for-android' |             artifactId 'usb-serial-for-android' | ||||||
|             version '2.2.2a' |             version '3.0.0beta' | ||||||
|             afterEvaluate { |             afterEvaluate { | ||||||
|                 artifact androidSourcesJar |                 artifact androidSourcesJar | ||||||
|                 artifact bundleReleaseAar |                 artifact bundleReleaseAar | ||||||
|  | |||||||
| @ -32,6 +32,7 @@ import static org.junit.Assert.assertEquals; | |||||||
| import static org.junit.Assert.assertNotEquals; | import static org.junit.Assert.assertNotEquals; | ||||||
| import static org.junit.Assert.assertThat; | import static org.junit.Assert.assertThat; | ||||||
| import static org.junit.Assert.fail; | import static org.junit.Assert.fail; | ||||||
|  | import static org.junit.Assume.assumeTrue; | ||||||
| 
 | 
 | ||||||
| @RunWith(AndroidJUnit4.class) | @RunWith(AndroidJUnit4.class) | ||||||
| public class CrossoverTest { | public class CrossoverTest { | ||||||
| @ -51,6 +52,9 @@ public class CrossoverTest { | |||||||
| 
 | 
 | ||||||
|     @Before |     @Before | ||||||
|     public void setUp() throws Exception { |     public void setUp() throws Exception { | ||||||
|  |         assumeTrue("ignore test for device specific coverage report", | ||||||
|  |                 InstrumentationRegistry.getArguments().getString("test_device_driver") == null); | ||||||
|  | 
 | ||||||
|         context = InstrumentationRegistry.getContext(); |         context = InstrumentationRegistry.getContext(); | ||||||
|         usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); |         usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); | ||||||
|         List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(usbManager); |         List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(usbManager); | ||||||
|  | |||||||
| @ -383,6 +383,44 @@ public class DeviceTest { | |||||||
|                 assertThat("42000/8N1", data2, equalTo(buf2)); |                 assertThat("42000/8N1", data2, equalTo(buf2)); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |         if (usb.serialDriver instanceof FtdiSerialDriver) { | ||||||
|  |             try { | ||||||
|  |                 usb.setParameters(183, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
|  |                 fail("baud rate to low expected"); | ||||||
|  |             } catch (IOException ignored) { | ||||||
|  |             } | ||||||
|  |             usb.setParameters(184, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
|  |             usb.setParameters( 960000, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
|  |             usb.setParameters(1000000, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
|  |             usb.setParameters(1043478, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
|  |             usb.setParameters(1090909, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
|  |             usb.setParameters(1142857, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
|  |             usb.setParameters(1200000, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
|  |             usb.setParameters(1263157, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
|  |             usb.setParameters(1333333, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
|  |             usb.setParameters(1411764, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
|  |             usb.setParameters(1500000, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
|  |             try { | ||||||
|  |                 usb.setParameters((int)(2000000/1.04), 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
|  |                 fail("baud rate error expected"); | ||||||
|  |             } catch (IOException ignored) { | ||||||
|  |             } | ||||||
|  |             usb.setParameters((int)(2000000/1.03), 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
|  |             usb.setParameters(2000000, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
|  |             usb.setParameters((int)(2000000*1.03), 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
|  |             try { | ||||||
|  |                 usb.setParameters((int)(2000000*1.04), 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
|  |                 fail("baud rate error expected"); | ||||||
|  |             } catch (IOException ignored) { | ||||||
|  |             } | ||||||
|  |             usb.setParameters(2000000, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
|  |             usb.setParameters(3000000, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
|  |             try { | ||||||
|  |                 usb.setParameters(4000000, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
|  |                 fail("baud rate to high expected"); | ||||||
|  |             } catch (IOException ignored) { | ||||||
|  |             } | ||||||
|  |         } | ||||||
|         { // non matching baud rate |         { // non matching baud rate | ||||||
|             telnet.setParameters(19200, 8, 1, UsbSerialPort.PARITY_NONE); |             telnet.setParameters(19200, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
|             usb.setParameters(2400, 8, 1, UsbSerialPort.PARITY_NONE); |             usb.setParameters(2400, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
| @ -922,7 +960,13 @@ public class DeviceTest { | |||||||
| 
 | 
 | ||||||
|         usb.write(buf); |         usb.write(buf); | ||||||
|         Thread.sleep(50); // ~ 12 bytes |         Thread.sleep(50); // ~ 12 bytes | ||||||
|         boolean purged = usb.serialPort.purgeHwBuffers(true, false); |         boolean purged; | ||||||
|  |         try { | ||||||
|  |             usb.serialPort.purgeHwBuffers(true, false); | ||||||
|  |             purged = true; | ||||||
|  |         } catch (UnsupportedOperationException ex) { | ||||||
|  |             purged = false; | ||||||
|  |         } | ||||||
|         usb.write("bcd".getBytes()); |         usb.write("bcd".getBytes()); | ||||||
|         Thread.sleep(50); |         Thread.sleep(50); | ||||||
|         while(data.length()==0 || data.charAt(data.length()-1)!='d') |         while(data.length()==0 || data.charAt(data.length()-1)!='d') | ||||||
| @ -946,7 +990,8 @@ public class DeviceTest { | |||||||
|         telnet.setParameters(19200, 8, 1, UsbSerialPort.PARITY_NONE); |         telnet.setParameters(19200, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
|         telnet.write("x".getBytes()); |         telnet.write("x".getBytes()); | ||||||
|         Thread.sleep(10); // ~ 20 bytes |         Thread.sleep(10); // ~ 20 bytes | ||||||
|         purged = usb.serialPort.purgeHwBuffers(false, true); |         if(purged) | ||||||
|  |             usb.serialPort.purgeHwBuffers(false, true); | ||||||
|         Log.d(TAG, "purged = " + purged); |         Log.d(TAG, "purged = " + purged); | ||||||
|         telnet.write("y".getBytes()); |         telnet.write("y".getBytes()); | ||||||
|         Thread.sleep(10); // ~ 20 bytes |         Thread.sleep(10); // ~ 20 bytes | ||||||
| @ -1261,6 +1306,9 @@ public class DeviceTest { | |||||||
|             inputLinesSupported = true; |             inputLinesSupported = true; | ||||||
|             inputLinesConnected = true; |             inputLinesConnected = true; | ||||||
|         } |         } | ||||||
|  |         Boolean inputLineFalse = inputLinesSupported ? Boolean.FALSE : null; | ||||||
|  |         Boolean inputLineTrue = inputLinesConnected ? Boolean.TRUE : inputLineFalse; | ||||||
|  | 
 | ||||||
|         EnumSet<UsbSerialPort.ControlLine> supportedControlLines = EnumSet.of(UsbSerialPort.ControlLine.RTS, UsbSerialPort.ControlLine.DTR); |         EnumSet<UsbSerialPort.ControlLine> supportedControlLines = EnumSet.of(UsbSerialPort.ControlLine.RTS, UsbSerialPort.ControlLine.DTR); | ||||||
|         if(inputLinesSupported) { |         if(inputLinesSupported) { | ||||||
|             supportedControlLines.add(UsbSerialPort.ControlLine.CTS); |             supportedControlLines.add(UsbSerialPort.ControlLine.CTS); | ||||||
| @ -1293,12 +1341,12 @@ public class DeviceTest { | |||||||
|                         ? EnumSet.of(UsbSerialPort.ControlLine.RI) |                         ? EnumSet.of(UsbSerialPort.ControlLine.RI) | ||||||
|                         : EnumSet.noneOf(UsbSerialPort.ControlLine.class), |                         : EnumSet.noneOf(UsbSerialPort.ControlLine.class), | ||||||
|                 usb.serialPort.getControlLines()); |                 usb.serialPort.getControlLines()); | ||||||
|         assertFalse(usb.serialPort.getRTS()); |         assertThat(usb.getControlLine(usb.serialPort::getRTS), equalTo(Boolean.FALSE)); | ||||||
|         assertFalse(usb.serialPort.getCTS()); |         assertThat(usb.getControlLine(usb.serialPort::getCTS), equalTo(inputLineFalse)); | ||||||
|         assertFalse(usb.serialPort.getDTR()); |         assertThat(usb.getControlLine(usb.serialPort::getDTR), equalTo(Boolean.FALSE)); | ||||||
|         assertFalse(usb.serialPort.getDSR()); |         assertThat(usb.getControlLine(usb.serialPort::getDSR), equalTo(inputLineFalse)); | ||||||
|         assertFalse(usb.serialPort.getCD()); |         assertThat(usb.getControlLine(usb.serialPort::getCD), equalTo(inputLineFalse)); | ||||||
|         assertEquals(usb.serialPort.getRI(), inputLinesConnected); |         assertThat(usb.getControlLine(usb.serialPort::getRI), equalTo(inputLineTrue)); | ||||||
|         telnet.write(data); |         telnet.write(data); | ||||||
|         if(usb.serialDriver instanceof CdcAcmSerialDriver) |         if(usb.serialDriver instanceof CdcAcmSerialDriver) | ||||||
|             // arduino: control line feedback as serial_state notification is not implemented. |             // arduino: control line feedback as serial_state notification is not implemented. | ||||||
| @ -1316,12 +1364,12 @@ public class DeviceTest { | |||||||
|                         ? EnumSet.of(UsbSerialPort.ControlLine.RTS, UsbSerialPort.ControlLine.CTS) |                         ? EnumSet.of(UsbSerialPort.ControlLine.RTS, UsbSerialPort.ControlLine.CTS) | ||||||
|                         : EnumSet.of(UsbSerialPort.ControlLine.RTS), |                         : EnumSet.of(UsbSerialPort.ControlLine.RTS), | ||||||
|                 usb.serialPort.getControlLines()); |                 usb.serialPort.getControlLines()); | ||||||
|         assertTrue(usb.serialPort.getRTS()); |         assertThat(usb.getControlLine(usb.serialPort::getRTS), equalTo(Boolean.TRUE)); | ||||||
|         assertEquals(usb.serialPort.getCTS(), inputLinesConnected); |         assertThat(usb.getControlLine(usb.serialPort::getCTS), equalTo(inputLineTrue)); | ||||||
|         assertFalse(usb.serialPort.getDTR()); |         assertThat(usb.getControlLine(usb.serialPort::getDTR), equalTo(Boolean.FALSE)); | ||||||
|         assertFalse(usb.serialPort.getDSR()); |         assertThat(usb.getControlLine(usb.serialPort::getDSR), equalTo(inputLineFalse)); | ||||||
|         assertFalse(usb.serialPort.getCD()); |         assertThat(usb.getControlLine(usb.serialPort::getCD), equalTo(inputLineFalse)); | ||||||
|         assertFalse(usb.serialPort.getRI()); |         assertThat(usb.getControlLine(usb.serialPort::getRI), equalTo(inputLineFalse)); | ||||||
|         telnet.write(data); |         telnet.write(data); | ||||||
|         assertThat(Arrays.toString(data), usb.read(4), equalTo(data)); |         assertThat(Arrays.toString(data), usb.read(4), equalTo(data)); | ||||||
|         usb.write(data); |         usb.write(data); | ||||||
| @ -1334,12 +1382,12 @@ public class DeviceTest { | |||||||
|                         ? EnumSet.of(UsbSerialPort.ControlLine.RTS, UsbSerialPort.ControlLine.DTR, UsbSerialPort.ControlLine.CD) |                         ? EnumSet.of(UsbSerialPort.ControlLine.RTS, UsbSerialPort.ControlLine.DTR, UsbSerialPort.ControlLine.CD) | ||||||
|                         : EnumSet.of(UsbSerialPort.ControlLine.RTS, UsbSerialPort.ControlLine.DTR), |                         : EnumSet.of(UsbSerialPort.ControlLine.RTS, UsbSerialPort.ControlLine.DTR), | ||||||
|                 usb.serialPort.getControlLines()); |                 usb.serialPort.getControlLines()); | ||||||
|         assertTrue(usb.serialPort.getRTS()); |         assertThat(usb.getControlLine(usb.serialPort::getRTS), equalTo(Boolean.TRUE)); | ||||||
|         assertFalse(usb.serialPort.getCTS()); |         assertThat(usb.getControlLine(usb.serialPort::getCTS), equalTo(inputLineFalse)); | ||||||
|         assertTrue(usb.serialPort.getDTR()); |         assertThat(usb.getControlLine(usb.serialPort::getDTR), equalTo(Boolean.TRUE)); | ||||||
|         assertFalse(usb.serialPort.getDSR()); |         assertThat(usb.getControlLine(usb.serialPort::getDSR), equalTo(inputLineFalse)); | ||||||
|         assertEquals(usb.serialPort.getCD(), inputLinesConnected); |         assertThat(usb.getControlLine(usb.serialPort::getCD), equalTo(inputLineTrue)); | ||||||
|         assertFalse(usb.serialPort.getRI()); |         assertThat(usb.getControlLine(usb.serialPort::getRI), equalTo(inputLineFalse)); | ||||||
|         telnet.write(data); |         telnet.write(data); | ||||||
|         assertThat(Arrays.toString(data), usb.read(4), equalTo(data)); |         assertThat(Arrays.toString(data), usb.read(4), equalTo(data)); | ||||||
|         usb.write(data); |         usb.write(data); | ||||||
| @ -1352,12 +1400,12 @@ public class DeviceTest { | |||||||
|                         ? EnumSet.of(UsbSerialPort.ControlLine.DTR, UsbSerialPort.ControlLine.DSR) |                         ? EnumSet.of(UsbSerialPort.ControlLine.DTR, UsbSerialPort.ControlLine.DSR) | ||||||
|                         : EnumSet.of(UsbSerialPort.ControlLine.DTR), |                         : EnumSet.of(UsbSerialPort.ControlLine.DTR), | ||||||
|                 usb.serialPort.getControlLines()); |                 usb.serialPort.getControlLines()); | ||||||
|         assertFalse(usb.serialPort.getRTS()); |         assertThat(usb.getControlLine(usb.serialPort::getRTS), equalTo(Boolean.FALSE)); | ||||||
|         assertFalse(usb.serialPort.getCTS()); |         assertThat(usb.getControlLine(usb.serialPort::getCTS), equalTo(inputLineFalse)); | ||||||
|         assertTrue(usb.serialPort.getDTR()); |         assertThat(usb.getControlLine(usb.serialPort::getDTR), equalTo(Boolean.TRUE)); | ||||||
|         assertEquals(usb.serialPort.getDSR(), inputLinesConnected); |         assertThat(usb.getControlLine(usb.serialPort::getDSR), equalTo(inputLineTrue)); | ||||||
|         assertFalse(usb.serialPort.getCD()); |         assertThat(usb.getControlLine(usb.serialPort::getCD), equalTo(inputLineFalse)); | ||||||
|         assertFalse(usb.serialPort.getRI()); |         assertThat(usb.getControlLine(usb.serialPort::getRI), equalTo(inputLineFalse)); | ||||||
|         telnet.write(data); |         telnet.write(data); | ||||||
|         assertThat(Arrays.toString(data), usb.read(4), equalTo(data)); |         assertThat(Arrays.toString(data), usb.read(4), equalTo(data)); | ||||||
|         usb.write(data); |         usb.write(data); | ||||||
| @ -1366,8 +1414,6 @@ public class DeviceTest { | |||||||
|         // control lines retained over close+open |         // control lines retained over close+open | ||||||
|         boolean inputRetained = inputLinesConnected; |         boolean inputRetained = inputLinesConnected; | ||||||
|         boolean outputRetained = true; |         boolean outputRetained = true; | ||||||
|         if(usb.serialDriver instanceof FtdiSerialDriver) |  | ||||||
|             outputRetained = false; // todo |  | ||||||
|         usb.close(EnumSet.of(UsbWrapper.OpenCloseFlags.NO_CONTROL_LINE_INIT)); |         usb.close(EnumSet.of(UsbWrapper.OpenCloseFlags.NO_CONTROL_LINE_INIT)); | ||||||
|         usb.open(EnumSet.of(UsbWrapper.OpenCloseFlags.NO_CONTROL_LINE_INIT, UsbWrapper.OpenCloseFlags.NO_IOMANAGER_THREAD)); |         usb.open(EnumSet.of(UsbWrapper.OpenCloseFlags.NO_CONTROL_LINE_INIT, UsbWrapper.OpenCloseFlags.NO_IOMANAGER_THREAD)); | ||||||
|         usb.setParameters(19200, 8, 1, UsbSerialPort.PARITY_NONE); |         usb.setParameters(19200, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
| @ -1376,12 +1422,12 @@ public class DeviceTest { | |||||||
|         if(outputRetained) retainedControlLines.add(UsbSerialPort.ControlLine.DTR); |         if(outputRetained) retainedControlLines.add(UsbSerialPort.ControlLine.DTR); | ||||||
|         if(inputRetained)  retainedControlLines.add(UsbSerialPort.ControlLine.DSR); |         if(inputRetained)  retainedControlLines.add(UsbSerialPort.ControlLine.DSR); | ||||||
|         assertEquals(retainedControlLines, usb.serialPort.getControlLines()); |         assertEquals(retainedControlLines, usb.serialPort.getControlLines()); | ||||||
|         assertFalse(usb.serialPort.getRTS()); |         assertThat(usb.getControlLine(usb.serialPort::getRTS), equalTo(Boolean.FALSE)); | ||||||
|         assertFalse(usb.serialPort.getCTS()); |         assertThat(usb.getControlLine(usb.serialPort::getCTS), equalTo(inputLineFalse)); | ||||||
|         assertEquals(usb.serialPort.getDTR(), outputRetained); |         assertThat(usb.getControlLine(usb.serialPort::getDTR), equalTo(outputRetained)); | ||||||
|         assertEquals(usb.serialPort.getDSR(), inputRetained); |         assertThat(usb.getControlLine(usb.serialPort::getDSR), equalTo(inputRetained ? inputLineTrue : inputLineFalse)); | ||||||
|         assertFalse(usb.serialPort.getCD()); |         assertThat(usb.getControlLine(usb.serialPort::getCD), equalTo(inputLineFalse)); | ||||||
|         assertFalse(usb.serialPort.getRI()); |         assertThat(usb.getControlLine(usb.serialPort::getRI), equalTo(inputLineFalse)); | ||||||
| 
 | 
 | ||||||
|         usb.close(EnumSet.of(UsbWrapper.OpenCloseFlags.NO_CONTROL_LINE_INIT)); |         usb.close(EnumSet.of(UsbWrapper.OpenCloseFlags.NO_CONTROL_LINE_INIT)); | ||||||
|         usb.open(EnumSet.of(UsbWrapper.OpenCloseFlags.NO_CONTROL_LINE_INIT, UsbWrapper.OpenCloseFlags.NO_IOMANAGER_THREAD)); |         usb.open(EnumSet.of(UsbWrapper.OpenCloseFlags.NO_CONTROL_LINE_INIT, UsbWrapper.OpenCloseFlags.NO_IOMANAGER_THREAD)); | ||||||
| @ -1400,28 +1446,35 @@ public class DeviceTest { | |||||||
|         // get... error |         // get... error | ||||||
|         try { |         try { | ||||||
|             usb.serialPort.getRI(); |             usb.serialPort.getRI(); | ||||||
|             if (!inputLinesSupported) |             if (usb.serialDriver instanceof ProlificSerialDriver) | ||||||
|                 ; |  | ||||||
|             else if (usb.serialDriver instanceof ProlificSerialDriver) |  | ||||||
|                 ; // todo: currently not possible to detect, as bulkTransfer in background thread does not distinguish timeout and error |                 ; // todo: currently not possible to detect, as bulkTransfer in background thread does not distinguish timeout and error | ||||||
|             else |             else | ||||||
|                 fail("error expected"); |                 fail("error expected"); | ||||||
|         } catch (IOException ignored) { |         } catch (IOException ignored) { | ||||||
|  |         } catch (UnsupportedOperationException ignored) { | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @Test |     @Test | ||||||
|     public void deviceConnection() throws Exception { |     public void deviceConnection() throws Exception { | ||||||
|         byte buf[] = new byte[256]; |         byte[] buf = new byte[256]; | ||||||
|         usb.open(EnumSet.of(UsbWrapper.OpenCloseFlags.NO_IOMANAGER_THREAD)); |         usb.open(EnumSet.of(UsbWrapper.OpenCloseFlags.NO_IOMANAGER_THREAD)); | ||||||
|         usb.setParameters(115200, 8, 1, UsbSerialPort.PARITY_NONE); |         usb.setParameters(115200, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
| 
 | 
 | ||||||
|         usb.write("x".getBytes()); |         usb.write("x".getBytes()); | ||||||
|         usb.serialPort.read(buf, 1000); |         usb.serialPort.read(buf, 1000); | ||||||
|         usb.serialPort.setRTS(true); |         usb.serialPort.setRTS(true); | ||||||
|  |         try { | ||||||
|             usb.serialPort.getRI(); |             usb.serialPort.getRI(); | ||||||
|         boolean purged = usb.serialPort.purgeHwBuffers(true, true); |         } catch (UnsupportedOperationException ignored) { | ||||||
| 
 |         } | ||||||
|  |         boolean purged; | ||||||
|  |         try { | ||||||
|  |             usb.serialPort.purgeHwBuffers(true, true); | ||||||
|  |             purged = true; | ||||||
|  |         } catch (UnsupportedOperationException ex) { | ||||||
|  |             purged = false; | ||||||
|  |         } | ||||||
|         usb.deviceConnection.close(); |         usb.deviceConnection.close(); | ||||||
|         try { |         try { | ||||||
|             usb.setParameters(115200, 8, 1, UsbSerialPort.PARITY_NONE); |             usb.setParameters(115200, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
| @ -1445,13 +1498,12 @@ public class DeviceTest { | |||||||
|             fail("setRts error expected"); |             fail("setRts error expected"); | ||||||
|         } catch (IOException ignored) { |         } catch (IOException ignored) { | ||||||
|         } |         } | ||||||
|         if(usb.serialPort.getSupportedControlLines().contains(UsbSerialPort.ControlLine.RI) ) { |  | ||||||
|         try { |         try { | ||||||
|             usb.serialPort.getRI(); |             usb.serialPort.getRI(); | ||||||
|             if(!(usb.serialDriver instanceof ProlificSerialDriver)) |             if(!(usb.serialDriver instanceof ProlificSerialDriver)) | ||||||
|                 fail("getRI error expected"); |                 fail("getRI error expected"); | ||||||
|         } catch (IOException ignored) { |         } catch (IOException ignored) { | ||||||
|             } |         } catch (UnsupportedOperationException ignored) { | ||||||
|         } |         } | ||||||
|         if(purged) { |         if(purged) { | ||||||
|             try { |             try { | ||||||
|  | |||||||
| @ -20,6 +20,7 @@ import java.nio.ByteBuffer; | |||||||
| import java.util.Deque; | import java.util.Deque; | ||||||
| import java.util.EnumSet; | import java.util.EnumSet; | ||||||
| import java.util.LinkedList; | import java.util.LinkedList; | ||||||
|  | import java.util.concurrent.Callable; | ||||||
| import java.util.concurrent.Executors; | import java.util.concurrent.Executors; | ||||||
| 
 | 
 | ||||||
| import static org.junit.Assert.assertEquals; | import static org.junit.Assert.assertEquals; | ||||||
| @ -223,6 +224,15 @@ public class UsbWrapper implements SerialInputOutputManager.Listener { | |||||||
|             Thread.sleep(1); |             Thread.sleep(1); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /* return TRUE/FALSE/null instead of true/false/<throw UnsupportedOperationException> */ | ||||||
|  |     public Boolean getControlLine(Callable<?> callable) throws Exception { | ||||||
|  |         try { | ||||||
|  |             return (Boolean)callable.call(); | ||||||
|  |         } catch (UnsupportedOperationException t) { | ||||||
|  |             return null; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     @Override |     @Override | ||||||
|     public void onNewData(byte[] data) { |     public void onNewData(byte[] data) { | ||||||
|         long now = System.currentTimeMillis(); |         long now = System.currentTimeMillis(); | ||||||
|  | |||||||
| @ -1,21 +1,6 @@ | |||||||
| /* Copyright 2011-2013 Google Inc. | /* Copyright 2011-2013 Google Inc. | ||||||
|  * Copyright 2013 mike wakerly <opensource@hoho.com> |  * Copyright 2013 mike wakerly <opensource@hoho.com> | ||||||
|  * |  * | ||||||
|  * This library is free software; you can redistribute it and/or |  | ||||||
|  * modify it under the terms of the GNU Lesser General Public |  | ||||||
|  * License as published by the Free Software Foundation; either |  | ||||||
|  * version 2.1 of the License, or (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This library 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 |  | ||||||
|  * Lesser General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU Lesser General Public |  | ||||||
|  * License along with this library; if not, write to the Free Software |  | ||||||
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, |  | ||||||
|  * USA. |  | ||||||
|  * |  | ||||||
|  * Project home page: https://github.com/mik3y/usb-serial-for-android |  * Project home page: https://github.com/mik3y/usb-serial-for-android | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| @ -254,21 +239,6 @@ public class CdcAcmSerialDriver implements UsbSerialDriver { | |||||||
|             sendAcmControlMessage(SET_LINE_CODING, 0, msg); |             sendAcmControlMessage(SET_LINE_CODING, 0, msg); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         @Override |  | ||||||
|         public boolean getCD() throws IOException { |  | ||||||
|             return false;  // TODO |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         @Override |  | ||||||
|         public boolean getCTS() throws IOException { |  | ||||||
|             return false;  // TODO |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         @Override |  | ||||||
|         public boolean getDSR() throws IOException { |  | ||||||
|             return false;  // TODO |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         @Override |         @Override | ||||||
|         public boolean getDTR() throws IOException { |         public boolean getDTR() throws IOException { | ||||||
|             return mDtr; |             return mDtr; | ||||||
| @ -280,11 +250,6 @@ public class CdcAcmSerialDriver implements UsbSerialDriver { | |||||||
|             setDtrRts(); |             setDtrRts(); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         @Override |  | ||||||
|         public boolean getRI() throws IOException { |  | ||||||
|             return false;  // TODO |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         @Override |         @Override | ||||||
|         public boolean getRTS() throws IOException { |         public boolean getRTS() throws IOException { | ||||||
|             return mRts; |             return mRts; | ||||||
|  | |||||||
| @ -1,19 +1,4 @@ | |||||||
| /* Copyright 2014 Andreas Butti | /* Copyright 2014 Andreas Butti | ||||||
|  * |  | ||||||
|  * This library is free software; you can redistribute it and/or |  | ||||||
|  * modify it under the terms of the GNU Lesser General Public |  | ||||||
|  * License as published by the Free Software Foundation; either |  | ||||||
|  * version 2.1 of the License, or (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This library 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 |  | ||||||
|  * Lesser General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU Lesser General Public |  | ||||||
|  * License along with this library; if not, write to the Free Software |  | ||||||
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, |  | ||||||
|  * USA. |  | ||||||
|  * |  * | ||||||
|  * Project home page: https://github.com/mik3y/usb-serial-for-android |  * Project home page: https://github.com/mik3y/usb-serial-for-android | ||||||
|  */ |  */ | ||||||
|  | |||||||
| @ -1,21 +1,6 @@ | |||||||
| /* Copyright 2011-2013 Google Inc. | /* Copyright 2011-2013 Google Inc. | ||||||
|  * Copyright 2013 mike wakerly <opensource@hoho.com> |  * Copyright 2013 mike wakerly <opensource@hoho.com> | ||||||
|  * |  * | ||||||
|  * This library is free software; you can redistribute it and/or |  | ||||||
|  * modify it under the terms of the GNU Lesser General Public |  | ||||||
|  * License as published by the Free Software Foundation; either |  | ||||||
|  * version 2.1 of the License, or (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This library 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 |  | ||||||
|  * Lesser General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU Lesser General Public |  | ||||||
|  * License along with this library; if not, write to the Free Software |  | ||||||
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, |  | ||||||
|  * USA. |  | ||||||
|  * |  | ||||||
|  * Project home page: https://github.com/mik3y/usb-serial-for-android |  * Project home page: https://github.com/mik3y/usb-serial-for-android | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| @ -227,28 +212,28 @@ public abstract class CommonUsbSerialPort implements UsbSerialPort { | |||||||
|     public abstract void setParameters(int baudRate, int dataBits, int stopBits, int parity) throws IOException; |     public abstract void setParameters(int baudRate, int dataBits, int stopBits, int parity) throws IOException; | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     public abstract boolean getCD() throws IOException; |     public boolean getCD() throws IOException { throw new UnsupportedOperationException(); } | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     public abstract boolean getCTS() throws IOException; |     public boolean getCTS() throws IOException { throw new UnsupportedOperationException(); } | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     public abstract boolean getDSR() throws IOException; |     public boolean getDSR() throws IOException { throw new UnsupportedOperationException(); } | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     public abstract boolean getDTR() throws IOException; |     public boolean getDTR() throws IOException { throw new UnsupportedOperationException(); } | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     public abstract void setDTR(boolean value) throws IOException; |     public void setDTR(boolean value) throws IOException { throw new UnsupportedOperationException(); } | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     public abstract boolean getRI() throws IOException; |     public boolean getRI() throws IOException { throw new UnsupportedOperationException(); } | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     public abstract boolean getRTS() throws IOException; |     public boolean getRTS() throws IOException { throw new UnsupportedOperationException(); } | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     public abstract void setRTS(boolean value) throws IOException; |     public void setRTS(boolean value) throws IOException { throw new UnsupportedOperationException(); } | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     public abstract EnumSet<ControlLine> getControlLines() throws IOException; |     public abstract EnumSet<ControlLine> getControlLines() throws IOException; | ||||||
| @ -257,8 +242,8 @@ public abstract class CommonUsbSerialPort implements UsbSerialPort { | |||||||
|     public abstract EnumSet<ControlLine> getSupportedControlLines() throws IOException; |     public abstract EnumSet<ControlLine> getSupportedControlLines() throws IOException; | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     public boolean purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException { |     public void purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException { | ||||||
|         return false; |         throw new UnsupportedOperationException(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,21 +1,6 @@ | |||||||
| /* Copyright 2011-2013 Google Inc. | /* Copyright 2011-2013 Google Inc. | ||||||
|  * Copyright 2013 mike wakerly <opensource@hoho.com> |  * Copyright 2013 mike wakerly <opensource@hoho.com> | ||||||
|  * |  * | ||||||
|  * This library is free software; you can redistribute it and/or |  | ||||||
|  * modify it under the terms of the GNU Lesser General Public |  | ||||||
|  * License as published by the Free Software Foundation; either |  | ||||||
|  * version 2.1 of the License, or (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This library 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 |  | ||||||
|  * Lesser General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU Lesser General Public |  | ||||||
|  * License along with this library; if not, write to the Free Software |  | ||||||
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, |  | ||||||
|  * USA. |  | ||||||
|  * |  | ||||||
|  * Project home page: https://github.com/mik3y/usb-serial-for-android |  * Project home page: https://github.com/mik3y/usb-serial-for-android | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| @ -320,15 +305,13 @@ public class Cp21xxSerialDriver implements UsbSerialDriver { | |||||||
| 
 | 
 | ||||||
|         @Override |         @Override | ||||||
|         // note: only working on some devices, on other devices ignored w/o error |         // note: only working on some devices, on other devices ignored w/o error | ||||||
|         public boolean purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException { |         public void purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException { | ||||||
|             int value = (purgeReadBuffers ? FLUSH_READ_CODE : 0) |             int value = (purgeReadBuffers ? FLUSH_READ_CODE : 0) | ||||||
|                     | (purgeWriteBuffers ? FLUSH_WRITE_CODE : 0); |                     | (purgeWriteBuffers ? FLUSH_WRITE_CODE : 0); | ||||||
| 
 | 
 | ||||||
|             if (value != 0) { |             if (value != 0) { | ||||||
|                 setConfigSingle(SILABSER_FLUSH_REQUEST_CODE, value); |                 setConfigSingle(SILABSER_FLUSH_REQUEST_CODE, value); | ||||||
|             } |             } | ||||||
| 
 |  | ||||||
|             return true; |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -1,20 +1,6 @@ | |||||||
| /* Copyright 2011-2013 Google Inc. | /* Copyright 2011-2013 Google Inc. | ||||||
|  * Copyright 2013 mike wakerly <opensource@hoho.com> |  * Copyright 2013 mike wakerly <opensource@hoho.com> | ||||||
|  * |  * Copyright 2020 kai morich <mail@kai-morich.de> | ||||||
|  * This library is free software; you can redistribute it and/or |  | ||||||
|  * modify it under the terms of the GNU Lesser General Public |  | ||||||
|  * License as published by the Free Software Foundation; either |  | ||||||
|  * version 2.1 of the License, or (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This library 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 |  | ||||||
|  * Lesser General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU Lesser General Public |  | ||||||
|  * License along with this library; if not, write to the Free Software |  | ||||||
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, |  | ||||||
|  * USA. |  | ||||||
|  * |  * | ||||||
|  * Project home page: https://github.com/mik3y/usb-serial-for-android |  * Project home page: https://github.com/mik3y/usb-serial-for-android | ||||||
|  */ |  */ | ||||||
| @ -33,73 +19,22 @@ import java.util.LinkedHashMap; | |||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
| 
 | 
 | ||||||
| /** | /* | ||||||
|  * A {@link CommonUsbSerialPort} implementation for a variety of FTDI devices |  * driver is implemented from various information scattered over FTDI documentation | ||||||
|  * <p> |  | ||||||
|  * This driver is based on <a |  | ||||||
|  * href="http://www.intra2net.com/en/developer/libftdi">libftdi</a>, and is |  | ||||||
|  * copyright and subject to the following terms: |  | ||||||
|  * |  * | ||||||
|  * <pre> |  * baud rate calculation https://www.ftdichip.com/Support/Documents/AppNotes/AN232B-05_BaudRates.pdf | ||||||
|  *   Copyright (C) 2003 by Intra2net AG |  * control bits https://www.ftdichip.com/Firmware/Precompiled/UM_VinculumFirmware_V205.pdf | ||||||
|  |  * device type https://www.ftdichip.com/Support/Documents/AppNotes/AN_233_Java_D2XX_for_Android_API_User_Manual.pdf -> bvdDevice | ||||||
|  * |  * | ||||||
|  *   This program is free software; you can redistribute it and/or modify |  | ||||||
|  *   it under the terms of the GNU Lesser General Public License |  | ||||||
|  *   version 2.1 as published by the Free Software Foundation; |  | ||||||
|  * |  | ||||||
|  *   opensource@intra2net.com |  | ||||||
|  *   http://www.intra2net.com/en/developer/libftdi |  | ||||||
|  * </pre> |  | ||||||
|  * |  | ||||||
|  * </p> |  | ||||||
|  * <p> |  | ||||||
|  * Some FTDI devices have not been tested; see later listing of supported and |  | ||||||
|  * unsupported devices. Devices listed as "supported" support the following |  | ||||||
|  * features: |  | ||||||
|  * <ul> |  | ||||||
|  * <li>Read and write of serial data (see |  | ||||||
|  * {@link CommonUsbSerialPort#read(byte[], int)} and |  | ||||||
|  * {@link CommonUsbSerialPort#write(byte[], int)}.</li> |  | ||||||
|  * <li>Setting serial line parameters (see |  | ||||||
|  * {@link CommonUsbSerialPort#setParameters(int, int, int, int)}.</li> |  | ||||||
|  * </ul> |  | ||||||
|  * </p> |  | ||||||
|  * <p> |  | ||||||
|  * Supported and tested devices: |  | ||||||
|  * <ul> |  | ||||||
|  * <li>{@value DeviceType#TYPE_R}</li> |  | ||||||
|  * <li>{@value DeviceType#TYPE_2232H}</li> |  | ||||||
|  * <li>{@value DeviceType#TYPE_4232H}</li> |  | ||||||
|  * </ul> |  | ||||||
|  * </p> |  | ||||||
|  * <p> |  | ||||||
|  * Unsupported but possibly working devices (please contact the author with |  | ||||||
|  * feedback or patches): |  | ||||||
|  * <ul> |  | ||||||
|  * <li>{@value DeviceType#TYPE_2232C}</li> |  | ||||||
|  * <li>{@value DeviceType#TYPE_AM}</li> |  | ||||||
|  * <li>{@value DeviceType#TYPE_BM}</li> |  | ||||||
|  * </ul> |  | ||||||
|  * </p> |  | ||||||
|  * |  | ||||||
|  * @author mike wakerly (opensource@hoho.com) |  | ||||||
|  * @see <a href="https://github.com/mik3y/usb-serial-for-android">USB Serial |  | ||||||
|  *      for Android project page</a> |  | ||||||
|  * @see <a href="http://www.ftdichip.com/">FTDI Homepage</a> |  | ||||||
|  * @see <a href="http://www.intra2net.com/en/developer/libftdi">libftdi</a> |  | ||||||
|  */ |  */ | ||||||
|  | 
 | ||||||
| public class FtdiSerialDriver implements UsbSerialDriver { | public class FtdiSerialDriver implements UsbSerialDriver { | ||||||
| 
 | 
 | ||||||
|  |     private static final String TAG = FtdiSerialPort.class.getSimpleName(); | ||||||
|  | 
 | ||||||
|     private final UsbDevice mDevice; |     private final UsbDevice mDevice; | ||||||
|     private final List<UsbSerialPort> mPorts; |     private final List<UsbSerialPort> mPorts; | ||||||
| 
 | 
 | ||||||
|     /** |  | ||||||
|      * FTDI chip types. |  | ||||||
|      */ |  | ||||||
|     private static enum DeviceType { |  | ||||||
|         TYPE_BM, TYPE_AM, TYPE_2232C, TYPE_R, TYPE_2232H, TYPE_4232H; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public FtdiSerialDriver(UsbDevice device) { |     public FtdiSerialDriver(UsbDevice device) { | ||||||
|         mDevice = device; |         mDevice = device; | ||||||
|         mPorts = new ArrayList<>(); |         mPorts = new ArrayList<>(); | ||||||
| @ -120,96 +55,35 @@ public class FtdiSerialDriver implements UsbSerialDriver { | |||||||
| 
 | 
 | ||||||
|     public class FtdiSerialPort extends CommonUsbSerialPort { |     public class FtdiSerialPort extends CommonUsbSerialPort { | ||||||
| 
 | 
 | ||||||
|         private static final int USB_TYPE_STANDARD = 0x00 << 5; |  | ||||||
|         private static final int USB_TYPE_CLASS = 0x00 << 5; |  | ||||||
|         private static final int USB_TYPE_VENDOR = 0x00 << 5; |  | ||||||
|         private static final int USB_TYPE_RESERVED = 0x00 << 5; |  | ||||||
| 
 |  | ||||||
|         private static final int USB_RECIP_DEVICE = 0x00; |  | ||||||
|         private static final int USB_RECIP_INTERFACE = 0x01; |  | ||||||
|         private static final int USB_RECIP_ENDPOINT = 0x02; |  | ||||||
|         private static final int USB_RECIP_OTHER = 0x03; |  | ||||||
| 
 |  | ||||||
|         private static final int USB_ENDPOINT_IN = 0x80; |  | ||||||
|         private static final int USB_ENDPOINT_OUT = 0x00; |  | ||||||
| 
 |  | ||||||
|         private static final int USB_WRITE_TIMEOUT_MILLIS = 5000; |         private static final int USB_WRITE_TIMEOUT_MILLIS = 5000; | ||||||
|         private static final int USB_READ_TIMEOUT_MILLIS = 5000; |         private static final int READ_HEADER_LENGTH = 2; // contains MODEM_STATUS | ||||||
| 
 | 
 | ||||||
|         // From ftdi.h |         private static final int REQTYPE_HOST_TO_DEVICE = UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_OUT; | ||||||
|         /** |         private static final int REQTYPE_DEVICE_TO_HOST = UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_IN; | ||||||
|          * Reset the port. |  | ||||||
|          */ |  | ||||||
|         private static final int SIO_RESET_REQUEST = 0; |  | ||||||
| 
 | 
 | ||||||
|         /** |         private static final int RESET_REQUEST = 0; | ||||||
|          * Set the modem control register. |         private static final int MODEM_CONTROL_REQUEST = 1; | ||||||
|          */ |         private static final int SET_BAUD_RATE_REQUEST = 3; | ||||||
|         private static final int SIO_MODEM_CTRL_REQUEST = 1; |         private static final int SET_DATA_REQUEST = 4; | ||||||
|  |         private static final int GET_MODEM_STATUS_REQUEST = 5; | ||||||
|  |         private static final int SET_LATENCY_TIMER_REQUEST = 9; | ||||||
|  |         private static final int GET_LATENCY_TIMER_REQUEST = 10; | ||||||
| 
 | 
 | ||||||
|         /** |         private static final int MODEM_CONTROL_DTR_ENABLE = 0x0101; | ||||||
|          * Set flow control register. |         private static final int MODEM_CONTROL_DTR_DISABLE = 0x0100; | ||||||
|          */ |         private static final int MODEM_CONTROL_RTS_ENABLE = 0x0202; | ||||||
|         private static final int SIO_SET_FLOW_CTRL_REQUEST = 2; |         private static final int MODEM_CONTROL_RTS_DISABLE = 0x0200; | ||||||
|  |         private static final int MODEM_STATUS_CTS = 0x10; | ||||||
|  |         private static final int MODEM_STATUS_DSR = 0x20; | ||||||
|  |         private static final int MODEM_STATUS_RI = 0x40; | ||||||
|  |         private static final int MODEM_STATUS_CD = 0x80; | ||||||
|  |         private static final int RESET_ALL = 0; | ||||||
|  |         private static final int RESET_PURGE_RX = 1; | ||||||
|  |         private static final int RESET_PURGE_TX = 2; | ||||||
| 
 | 
 | ||||||
|         private static final int SIO_SET_DTR_HIGH = 0x0101; |         private boolean baudRateWithPort = false; | ||||||
|         private static final int SIO_SET_DTR_LOW = 0x0100; |         private boolean dtr = false; | ||||||
|         private static final int SIO_SET_RTS_HIGH = 0x0202; |         private boolean rts = false; | ||||||
|         private static final int SIO_SET_RTS_LOW = 0x0200; |  | ||||||
| 
 |  | ||||||
|         /** |  | ||||||
|          * Set baud rate. |  | ||||||
|          */ |  | ||||||
|         private static final int SIO_SET_BAUD_RATE_REQUEST = 3; |  | ||||||
| 
 |  | ||||||
|         /** |  | ||||||
|          * Set the data characteristics of the port. |  | ||||||
|          */ |  | ||||||
|         private static final int SIO_SET_DATA_REQUEST = 4; |  | ||||||
| 
 |  | ||||||
|         private static final int SIO_RESET_SIO = 0; |  | ||||||
|         private static final int SIO_RESET_PURGE_RX = 1; // RX @ FTDI device = write @ usb-serial-for-android library |  | ||||||
|         private static final int SIO_RESET_PURGE_TX = 2; |  | ||||||
| 
 |  | ||||||
|         /** |  | ||||||
|          * Get modem status. |  | ||||||
|          */ |  | ||||||
|         private static final int SIO_GET_MODEM_STATUS_REQUEST = 5; |  | ||||||
| 
 |  | ||||||
|         private static final int SIO_MODEM_STATUS_CTS = 0x10; |  | ||||||
|         private static final int SIO_MODEM_STATUS_DSR = 0x20; |  | ||||||
|         private static final int SIO_MODEM_STATUS_RI = 0x40; |  | ||||||
|         private static final int SIO_MODEM_STATUS_RLSD = 0x80; |  | ||||||
| 
 |  | ||||||
|         /** |  | ||||||
|          * Set the latency timer. |  | ||||||
|          */ |  | ||||||
|         private static final int SIO_SET_LATENCY_TIMER_REQUEST = 9; |  | ||||||
| 
 |  | ||||||
|         /** |  | ||||||
|          * Get the latency timer. |  | ||||||
|          */ |  | ||||||
|         private static final int SIO_GET_LATENCY_TIMER_REQUEST = 10; |  | ||||||
| 
 |  | ||||||
|         private static final int FTDI_DEVICE_OUT_REQTYPE = |  | ||||||
|                 UsbConstants.USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT; |  | ||||||
| 
 |  | ||||||
|         private static final int FTDI_DEVICE_IN_REQTYPE = |  | ||||||
|                 UsbConstants.USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN; |  | ||||||
| 
 |  | ||||||
|         /** |  | ||||||
|          * Length of the modem status header, transmitted with every read. |  | ||||||
|          */ |  | ||||||
|         private static final int MODEM_STATUS_HEADER_LENGTH = 2; |  | ||||||
| 
 |  | ||||||
|         private final String TAG = FtdiSerialDriver.class.getSimpleName(); |  | ||||||
| 
 |  | ||||||
|         private DeviceType mType; |  | ||||||
| 
 |  | ||||||
|         private int mIndex = 0; |  | ||||||
| 
 |  | ||||||
|         private boolean mDtrState = false; |  | ||||||
|         private boolean mRtsState = false; |  | ||||||
| 
 | 
 | ||||||
|         public FtdiSerialPort(UsbDevice device, int portNumber) { |         public FtdiSerialPort(UsbDevice device, int portNumber) { | ||||||
|             super(device, portNumber); |             super(device, portNumber); | ||||||
| @ -220,95 +94,38 @@ public class FtdiSerialDriver implements UsbSerialDriver { | |||||||
|             return FtdiSerialDriver.this; |             return FtdiSerialDriver.this; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         /** |  | ||||||
|          * Filter FTDI status bytes from buffer |  | ||||||
|          * @param buffer The source buffer (which contains status bytes) |  | ||||||
|          *        buffer The destination buffer to write the status bytes into (can be src) |  | ||||||
|          * @param totalBytesRead Number of bytes read to src |  | ||||||
|          * @return The number of payload bytes |  | ||||||
|          */ |  | ||||||
|         @Override |  | ||||||
|         protected int readFilter(byte[] buffer, int totalBytesRead) throws IOException { |  | ||||||
|             if (totalBytesRead < MODEM_STATUS_HEADER_LENGTH) { |  | ||||||
|                 throw new IOException("Expected at least " + MODEM_STATUS_HEADER_LENGTH + " bytes"); |  | ||||||
|             } |  | ||||||
|             int maxPacketSize = mReadEndpoint.getMaxPacketSize(); |  | ||||||
|             final int packetsCount = (totalBytesRead + maxPacketSize -1 )/ maxPacketSize; |  | ||||||
|             for (int packetIdx = 0; packetIdx < packetsCount; ++packetIdx) { |  | ||||||
|                 final int count = (packetIdx == (packetsCount - 1)) |  | ||||||
|                         ? totalBytesRead - packetIdx * maxPacketSize - MODEM_STATUS_HEADER_LENGTH |  | ||||||
|                         : maxPacketSize - MODEM_STATUS_HEADER_LENGTH; |  | ||||||
|                 if (count > 0) { |  | ||||||
|                     System.arraycopy(buffer, packetIdx * maxPacketSize + MODEM_STATUS_HEADER_LENGTH, |  | ||||||
|                                      buffer, packetIdx * (maxPacketSize - MODEM_STATUS_HEADER_LENGTH), |  | ||||||
|                                      count); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             return totalBytesRead - (packetsCount * 2); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         private void reset() throws IOException { |  | ||||||
|             // TODO(mikey): autodetect. |  | ||||||
|             mType = DeviceType.TYPE_R; |  | ||||||
|             if(mDevice.getInterfaceCount() > 1) { |  | ||||||
|                 mIndex = mPortNumber + 1; |  | ||||||
|                 if (mDevice.getInterfaceCount() == 2) |  | ||||||
|                     mType = DeviceType.TYPE_2232H; |  | ||||||
|                 if (mDevice.getInterfaceCount() == 4) |  | ||||||
|                     mType = DeviceType.TYPE_4232H; |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             int result = mConnection.controlTransfer(FTDI_DEVICE_OUT_REQTYPE, SIO_RESET_REQUEST, |  | ||||||
|                     SIO_RESET_SIO, mIndex, null, 0, USB_WRITE_TIMEOUT_MILLIS); |  | ||||||
|             if (result != 0) { |  | ||||||
|                 throw new IOException("Reset failed: result=" + result); |  | ||||||
|             } |  | ||||||
|             mDtrState = false; |  | ||||||
|             mRtsState = false; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         public void setLatencyTimer(int latencyTime) throws IOException { |  | ||||||
|             int result = mConnection.controlTransfer(FTDI_DEVICE_OUT_REQTYPE, SIO_SET_LATENCY_TIMER_REQUEST, |  | ||||||
|                     latencyTime, mIndex, null, 0, USB_WRITE_TIMEOUT_MILLIS); |  | ||||||
|             if (result != 0) { |  | ||||||
|                 throw new IOException("Set latency timer failed: result=" + result); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         public int getLatencyTimer() throws IOException { |  | ||||||
|             byte[] data = new byte[1]; |  | ||||||
|             int result = mConnection.controlTransfer(FTDI_DEVICE_IN_REQTYPE, SIO_GET_LATENCY_TIMER_REQUEST, |  | ||||||
|                     0, mIndex, data, data.length, USB_WRITE_TIMEOUT_MILLIS); |  | ||||||
|             if (result != 1) { |  | ||||||
|                 throw new IOException("Get latency timer failed: result=" + result); |  | ||||||
|             } |  | ||||||
|             return data[0]; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         private int getModemStatus() throws IOException { |  | ||||||
|             byte[] data = new byte[2]; |  | ||||||
|             int result = mConnection.controlTransfer(FTDI_DEVICE_IN_REQTYPE, SIO_GET_MODEM_STATUS_REQUEST, |  | ||||||
|                     0, mIndex, data, data.length, USB_WRITE_TIMEOUT_MILLIS); |  | ||||||
|             if (result != 2) { |  | ||||||
|                 throw new IOException("Get modem statusfailed: result=" + result); |  | ||||||
|             } |  | ||||||
|             return data[0]; |  | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
|         @Override |         @Override | ||||||
|         protected void openInt(UsbDeviceConnection connection) throws IOException { |         protected void openInt(UsbDeviceConnection connection) throws IOException { | ||||||
|             if (connection.claimInterface(mDevice.getInterface(mPortNumber), true)) { |             if (!connection.claimInterface(mDevice.getInterface(mPortNumber), true)) { | ||||||
|                 Log.d(TAG, "claimInterface " + mPortNumber + " SUCCESS"); |                 throw new IOException("Could not claim interface " + mPortNumber); | ||||||
|             } else { |  | ||||||
|                 throw new IOException("Error claiming interface " + mPortNumber); |  | ||||||
|             } |             } | ||||||
|             if (mDevice.getInterface(mPortNumber).getEndpointCount() < 2) { |             if (mDevice.getInterface(mPortNumber).getEndpointCount() < 2) { | ||||||
|                 throw new IOException("Insufficient number of endpoints (" + |                 throw new IOException("Not enough endpoints"); | ||||||
|                         mDevice.getInterface(mPortNumber).getEndpointCount() + ")"); |  | ||||||
|             } |             } | ||||||
|             mReadEndpoint = mDevice.getInterface(mPortNumber).getEndpoint(0); |             mReadEndpoint = mDevice.getInterface(mPortNumber).getEndpoint(0); | ||||||
|             mWriteEndpoint = mDevice.getInterface(mPortNumber).getEndpoint(1); |             mWriteEndpoint = mDevice.getInterface(mPortNumber).getEndpoint(1); | ||||||
|             reset(); | 
 | ||||||
|  |             int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, RESET_REQUEST, | ||||||
|  |                     RESET_ALL, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); | ||||||
|  |             if (result != 0) { | ||||||
|  |                 throw new IOException("Reset failed: result=" + result); | ||||||
|  |             } | ||||||
|  |             result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, MODEM_CONTROL_REQUEST, | ||||||
|  |                     (dtr ? MODEM_CONTROL_DTR_ENABLE : MODEM_CONTROL_DTR_DISABLE) | | ||||||
|  |                             (rts ? MODEM_CONTROL_RTS_ENABLE : MODEM_CONTROL_RTS_DISABLE), | ||||||
|  |                     mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); | ||||||
|  |             if (result != 0) { | ||||||
|  |                 throw new IOException("Init RTS,DTR failed: result=" + result); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             // mDevice.getVersion() would require API 23 | ||||||
|  |             byte[] rawDescriptors = connection.getRawDescriptors(); | ||||||
|  |             if(rawDescriptors == null || rawDescriptors.length < 14) { | ||||||
|  |                 throw new IOException("Could not get device descriptors"); | ||||||
|  |             } | ||||||
|  |             int deviceType = rawDescriptors[13]; | ||||||
|  |             baudRateWithPort = deviceType == 7 || deviceType == 8 || deviceType == 9; // ...H devices | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         @Override |         @Override | ||||||
| @ -318,18 +135,69 @@ public class FtdiSerialDriver implements UsbSerialDriver { | |||||||
|             } catch(Exception ignored) {} |             } catch(Exception ignored) {} | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         private int setBaudRate(int baudRate) throws IOException { |         @Override | ||||||
|             long[] vals = convertBaudrate(baudRate); |         protected int readFilter(byte[] buffer, int totalBytesRead) throws IOException { | ||||||
|             long actualBaudrate = vals[0]; |             final int maxPacketSize = mReadEndpoint.getMaxPacketSize(); | ||||||
|             long index = vals[1]; |             int destPos = 0; | ||||||
|             long value = vals[2]; |             for(int srcPos = 0; srcPos < totalBytesRead; srcPos += maxPacketSize) { | ||||||
|             int result = mConnection.controlTransfer(FTDI_DEVICE_OUT_REQTYPE, |                 int length = Math.min(srcPos + maxPacketSize, totalBytesRead) - (srcPos + READ_HEADER_LENGTH); | ||||||
|                     SIO_SET_BAUD_RATE_REQUEST, (int) value, (int) index, |                 if (length < 0) | ||||||
|                     null, 0, USB_WRITE_TIMEOUT_MILLIS); |                     throw new IOException("Expected at least " + READ_HEADER_LENGTH + " bytes"); | ||||||
|  |                 System.arraycopy(buffer, srcPos + READ_HEADER_LENGTH, buffer, destPos, length); | ||||||
|  |                 destPos += length; | ||||||
|  |             } | ||||||
|  |             return destPos; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private void setBaudrate(int baudRate) throws IOException { | ||||||
|  |             int divisor, subdivisor, effectiveBaudRate; | ||||||
|  |             if (baudRate > 3500000) { | ||||||
|  |                 throw new IOException("Baud rate to high"); | ||||||
|  |             } else if(baudRate >= 2500000) { | ||||||
|  |                 divisor = 0; | ||||||
|  |                 subdivisor = 0; | ||||||
|  |                 effectiveBaudRate = 3000000; | ||||||
|  |             } else if(baudRate >= 1750000) { | ||||||
|  |                 divisor = 1; | ||||||
|  |                 subdivisor = 0; | ||||||
|  |                 effectiveBaudRate = 2000000; | ||||||
|  |             } else { | ||||||
|  |                 divisor = (24000000 << 1) / baudRate; | ||||||
|  |                 divisor = (divisor + 1) >> 1; // round | ||||||
|  |                 subdivisor = divisor & 0x07; | ||||||
|  |                 divisor >>= 3; | ||||||
|  |                 if (divisor > 0x3fff) // exceeds bit 13 at 183 baud | ||||||
|  |                     throw new IOException("Baud rate to low"); | ||||||
|  |                 effectiveBaudRate = (24000000 << 1) / ((divisor << 3) + subdivisor); | ||||||
|  |                 effectiveBaudRate = (effectiveBaudRate +1) >> 1; | ||||||
|  |             } | ||||||
|  |             double baudRateError = Math.abs(1.0 - (effectiveBaudRate / (double)baudRate)); | ||||||
|  |             if(baudRateError >= 0.031) // can happen only > 1.5Mbaud | ||||||
|  |                 throw new IOException(String.format("baud rate deviation %.1f%% is higher than allowed 3%%", baudRateError*100)); | ||||||
|  |             int value = divisor; | ||||||
|  |             int index = 0; | ||||||
|  |             switch(subdivisor) { | ||||||
|  |                 case 0:                              break; // 16,15,14 = 000 - sub-integer divisor = 0 | ||||||
|  |                 case 4: value |= 0x4000;             break; // 16,15,14 = 001 - sub-integer divisor = 0.5 | ||||||
|  |                 case 2: value |= 0x8000;             break; // 16,15,14 = 010 - sub-integer divisor = 0.25 | ||||||
|  |                 case 1: value |= 0xc000;             break; // 16,15,14 = 011 - sub-integer divisor = 0.125 | ||||||
|  |                 case 3: value |= 0x0000; index |= 1; break; // 16,15,14 = 100 - sub-integer divisor = 0.375 | ||||||
|  |                 case 5: value |= 0x4000; index |= 1; break; // 16,15,14 = 101 - sub-integer divisor = 0.625 | ||||||
|  |                 case 6: value |= 0x8000; index |= 1; break; // 16,15,14 = 110 - sub-integer divisor = 0.75 | ||||||
|  |                 case 7: value |= 0xc000; index |= 1; break; // 16,15,14 = 111 - sub-integer divisor = 0.875 | ||||||
|  |             } | ||||||
|  |             if(baudRateWithPort) { | ||||||
|  |                 index <<= 8; | ||||||
|  |                 index |= mPortNumber+1; | ||||||
|  |             } | ||||||
|  |             Log.d(TAG, String.format("baud rate=%d, effective=%d, error=%.1f%%, value=0x%04x, index=0x%04x, divisor=%d, subdivisor=%d", | ||||||
|  |                     baudRate, effectiveBaudRate, baudRateError*100, value, index, divisor, subdivisor)); | ||||||
|  | 
 | ||||||
|  |             int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, SET_BAUD_RATE_REQUEST, | ||||||
|  |                     value, index, null, 0, USB_WRITE_TIMEOUT_MILLIS); | ||||||
|             if (result != 0) { |             if (result != 0) { | ||||||
|                 throw new IOException("Setting baudrate failed: result=" + result); |                 throw new IOException("Setting baudrate failed: result=" + result); | ||||||
|             } |             } | ||||||
|             return (int) actualBaudrate; |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         @Override |         @Override | ||||||
| @ -337,7 +205,7 @@ public class FtdiSerialDriver implements UsbSerialDriver { | |||||||
|             if(baudRate <= 0) { |             if(baudRate <= 0) { | ||||||
|                 throw new IllegalArgumentException("Invalid baud rate: " + baudRate); |                 throw new IllegalArgumentException("Invalid baud rate: " + baudRate); | ||||||
|             } |             } | ||||||
|             setBaudRate(baudRate); |             setBaudrate(baudRate); | ||||||
| 
 | 
 | ||||||
|             int config = 0; |             int config = 0; | ||||||
|             switch (dataBits) { |             switch (dataBits) { | ||||||
| @ -354,19 +222,18 @@ public class FtdiSerialDriver implements UsbSerialDriver { | |||||||
| 
 | 
 | ||||||
|             switch (parity) { |             switch (parity) { | ||||||
|                 case PARITY_NONE: |                 case PARITY_NONE: | ||||||
|                     config |= (0x00 << 8); |  | ||||||
|                     break; |                     break; | ||||||
|                 case PARITY_ODD: |                 case PARITY_ODD: | ||||||
|                     config |= (0x01 << 8); |                     config |= 0x100; | ||||||
|                     break; |                     break; | ||||||
|                 case PARITY_EVEN: |                 case PARITY_EVEN: | ||||||
|                     config |= (0x02 << 8); |                     config |= 0x200; | ||||||
|                     break; |                     break; | ||||||
|                 case PARITY_MARK: |                 case PARITY_MARK: | ||||||
|                     config |= (0x03 << 8); |                     config |= 0x300; | ||||||
|                     break; |                     break; | ||||||
|                 case PARITY_SPACE: |                 case PARITY_SPACE: | ||||||
|                     config |= (0x04 << 8); |                     config |= 0x400; | ||||||
|                     break; |                     break; | ||||||
|                 default: |                 default: | ||||||
|                     throw new IllegalArgumentException("Invalid parity: " + parity); |                     throw new IllegalArgumentException("Invalid parity: " + parity); | ||||||
| @ -374,170 +241,93 @@ public class FtdiSerialDriver implements UsbSerialDriver { | |||||||
| 
 | 
 | ||||||
|             switch (stopBits) { |             switch (stopBits) { | ||||||
|                 case STOPBITS_1: |                 case STOPBITS_1: | ||||||
|                     config |= (0x00 << 11); |  | ||||||
|                     break; |                     break; | ||||||
|                 case STOPBITS_1_5: |                 case STOPBITS_1_5: | ||||||
|                     throw new UnsupportedOperationException("Unsupported stop bits: 1.5"); |                     throw new UnsupportedOperationException("Unsupported stop bits: 1.5"); | ||||||
|                 case STOPBITS_2: |                 case STOPBITS_2: | ||||||
|                     config |= (0x02 << 11); |                     config |= 0x1000; | ||||||
|                     break; |                     break; | ||||||
|                 default: |                 default: | ||||||
|                     throw new IllegalArgumentException("Invalid stop bits: " + stopBits); |                     throw new IllegalArgumentException("Invalid stop bits: " + stopBits); | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             int result = mConnection.controlTransfer(FTDI_DEVICE_OUT_REQTYPE, |             int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, SET_DATA_REQUEST, | ||||||
|                     SIO_SET_DATA_REQUEST, config, mIndex, |                     config, mPortNumber+1,null, 0, USB_WRITE_TIMEOUT_MILLIS); | ||||||
|                     null, 0, USB_WRITE_TIMEOUT_MILLIS); |  | ||||||
|             if (result != 0) { |             if (result != 0) { | ||||||
|                 throw new IOException("Setting parameters failed: result=" + result); |                 throw new IOException("Setting parameters failed: result=" + result); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         private long[] convertBaudrate(int baudrate) { |         private int getStatus() throws IOException { | ||||||
|             // TODO(mikey): Braindead transcription of libfti method.  Clean up, |             byte[] data = new byte[2]; | ||||||
|             // using more idiomatic Java where possible. |             int result = mConnection.controlTransfer(REQTYPE_DEVICE_TO_HOST, GET_MODEM_STATUS_REQUEST, | ||||||
|             int divisor = 24000000 / baudrate; |                     0, mPortNumber+1, data, data.length, USB_WRITE_TIMEOUT_MILLIS); | ||||||
|             int bestDivisor = 0; |             if (result != 2) { | ||||||
|             int bestBaud = 0; |                 throw new IOException("Get modem status failed: result=" + result); | ||||||
|             int bestBaudDiff = 0; |  | ||||||
|             int fracCode[] = { |  | ||||||
|                     0, 3, 2, 4, 1, 5, 6, 7 |  | ||||||
|             }; |  | ||||||
| 
 |  | ||||||
|             for (int i = 0; i < 2; i++) { |  | ||||||
|                 int tryDivisor = divisor + i; |  | ||||||
|                 int baudEstimate; |  | ||||||
|                 int baudDiff; |  | ||||||
| 
 |  | ||||||
|                 if (tryDivisor <= 8) { |  | ||||||
|                     // Round up to minimum supported divisor |  | ||||||
|                     tryDivisor = 8; |  | ||||||
|                 } else if (mType != DeviceType.TYPE_AM && tryDivisor < 12) { |  | ||||||
|                     // BM doesn't support divisors 9 through 11 inclusive |  | ||||||
|                     tryDivisor = 12; |  | ||||||
|                 } else if (divisor < 16) { |  | ||||||
|                     // AM doesn't support divisors 9 through 15 inclusive |  | ||||||
|                     tryDivisor = 16; |  | ||||||
|                 } else { |  | ||||||
|                     if (mType == DeviceType.TYPE_AM) { |  | ||||||
|                         // TODO |  | ||||||
|                     } else { |  | ||||||
|                         if (tryDivisor > 0x1FFFF) { |  | ||||||
|                             // Round down to maximum supported divisor value (for |  | ||||||
|                             // BM) |  | ||||||
|                             tryDivisor = 0x1FFFF; |  | ||||||
|             } |             } | ||||||
|                     } |             return data[0]; | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 // Get estimated baud rate (to nearest integer) |  | ||||||
|                 baudEstimate = (24000000 + (tryDivisor / 2)) / tryDivisor; |  | ||||||
| 
 |  | ||||||
|                 // Get absolute difference from requested baud rate |  | ||||||
|                 if (baudEstimate < baudrate) { |  | ||||||
|                     baudDiff = baudrate - baudEstimate; |  | ||||||
|                 } else { |  | ||||||
|                     baudDiff = baudEstimate - baudrate; |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (i == 0 || baudDiff < bestBaudDiff) { |  | ||||||
|                     // Closest to requested baud rate so far |  | ||||||
|                     bestDivisor = tryDivisor; |  | ||||||
|                     bestBaud = baudEstimate; |  | ||||||
|                     bestBaudDiff = baudDiff; |  | ||||||
|                     if (baudDiff == 0) { |  | ||||||
|                         // Spot on! No point trying |  | ||||||
|                         break; |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             // Encode the best divisor value |  | ||||||
|             long encodedDivisor = (bestDivisor >> 3) | (fracCode[bestDivisor & 7] << 14); |  | ||||||
|             // Deal with special cases for encoded value |  | ||||||
|             if (encodedDivisor == 1) { |  | ||||||
|                 encodedDivisor = 0; // 3000000 baud |  | ||||||
|             } else if (encodedDivisor == 0x4001) { |  | ||||||
|                 encodedDivisor = 1; // 2000000 baud (BM only) |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             // Split into "value" and "index" values |  | ||||||
|             long value = encodedDivisor & 0xFFFF; |  | ||||||
|             long index; |  | ||||||
|             if (mType == DeviceType.TYPE_2232C || mType == DeviceType.TYPE_2232H |  | ||||||
|                     || mType == DeviceType.TYPE_4232H) { |  | ||||||
|                 index = (encodedDivisor >> 8) & 0xff00; |  | ||||||
|                 index |= mIndex; |  | ||||||
|             } else { |  | ||||||
|                 index = (encodedDivisor >> 16) & 0xffff; |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             // Return the nearest baud rate |  | ||||||
|             return new long[] { |  | ||||||
|                     bestBaud, index, value |  | ||||||
|             }; |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         @Override |         @Override | ||||||
|         public boolean getCD() throws IOException { |         public boolean getCD() throws IOException { | ||||||
|             return (getModemStatus() & SIO_MODEM_STATUS_RLSD) != 0; |             return (getStatus() & MODEM_STATUS_CD) != 0; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         @Override |         @Override | ||||||
|         public boolean getCTS() throws IOException { |         public boolean getCTS() throws IOException { | ||||||
|             return (getModemStatus() & SIO_MODEM_STATUS_CTS) != 0; |             return (getStatus() & MODEM_STATUS_CTS) != 0; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         @Override |         @Override | ||||||
|         public boolean getDSR() throws IOException { |         public boolean getDSR() throws IOException { | ||||||
|             return (getModemStatus() & SIO_MODEM_STATUS_DSR) != 0; |             return (getStatus() & MODEM_STATUS_DSR) != 0; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         @Override |         @Override | ||||||
|         public boolean getDTR() throws IOException { |         public boolean getDTR() throws IOException { | ||||||
|             return mDtrState; |             return dtr; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         @Override |         @Override | ||||||
|         public void setDTR(boolean value) throws IOException { |         public void setDTR(boolean value) throws IOException { | ||||||
|             int result = mConnection.controlTransfer(FTDI_DEVICE_OUT_REQTYPE, SIO_MODEM_CTRL_REQUEST, |             int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, MODEM_CONTROL_REQUEST, | ||||||
|                     value ? SIO_SET_DTR_HIGH : SIO_SET_DTR_LOW, mIndex, null, 0, USB_WRITE_TIMEOUT_MILLIS); |                     value ? MODEM_CONTROL_DTR_ENABLE : MODEM_CONTROL_DTR_DISABLE, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); | ||||||
|             if (result != 0) { |             if (result != 0) { | ||||||
|                 throw new IOException("Set DTR failed: result=" + result); |                 throw new IOException("Set DTR failed: result=" + result); | ||||||
|             } |             } | ||||||
|             mDtrState = value; |             dtr = value; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         @Override |         @Override | ||||||
|         public boolean getRI() throws IOException { |         public boolean getRI() throws IOException { | ||||||
|             return (getModemStatus() & SIO_MODEM_STATUS_RI) != 0; |             return (getStatus() & MODEM_STATUS_RI) != 0; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         @Override |         @Override | ||||||
|         public boolean getRTS() throws IOException { |         public boolean getRTS() throws IOException { | ||||||
|             return mRtsState; |             return rts; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         @Override |         @Override | ||||||
|         public void setRTS(boolean value) throws IOException { |         public void setRTS(boolean value) throws IOException { | ||||||
|             int result = mConnection.controlTransfer(FTDI_DEVICE_OUT_REQTYPE, SIO_MODEM_CTRL_REQUEST, |             int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, MODEM_CONTROL_REQUEST, | ||||||
|                     value ? SIO_SET_RTS_HIGH : SIO_SET_RTS_LOW, mIndex, null, 0, USB_WRITE_TIMEOUT_MILLIS); |                     value ? MODEM_CONTROL_RTS_ENABLE : MODEM_CONTROL_RTS_DISABLE, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); | ||||||
|             if (result != 0) { |             if (result != 0) { | ||||||
|                 throw new IOException("Set DTR failed: result=" + result); |                 throw new IOException("Set DTR failed: result=" + result); | ||||||
|             } |             } | ||||||
|             mRtsState = value; |             rts = value; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         @Override |         @Override | ||||||
|         public EnumSet<ControlLine> getControlLines() throws IOException { |         public EnumSet<ControlLine> getControlLines() throws IOException { | ||||||
|             int status = getModemStatus(); |             int status = getStatus(); | ||||||
|             EnumSet<ControlLine> set = EnumSet.noneOf(ControlLine.class); |             EnumSet<ControlLine> set = EnumSet.noneOf(ControlLine.class); | ||||||
|             if(mRtsState) set.add(ControlLine.RTS); |             if(rts) set.add(ControlLine.RTS); | ||||||
|             if((status & SIO_MODEM_STATUS_CTS) != 0) set.add(ControlLine.CTS); |             if((status & MODEM_STATUS_CTS) != 0) set.add(ControlLine.CTS); | ||||||
|             if(mDtrState) set.add(ControlLine.DTR); |             if(dtr) set.add(ControlLine.DTR); | ||||||
|             if((status & SIO_MODEM_STATUS_DSR) != 0) set.add(ControlLine.DSR); |             if((status & MODEM_STATUS_DSR) != 0) set.add(ControlLine.DSR); | ||||||
|             if((status & SIO_MODEM_STATUS_RLSD) != 0) set.add(ControlLine.CD); |             if((status & MODEM_STATUS_CD) != 0) set.add(ControlLine.CD); | ||||||
|             if((status & SIO_MODEM_STATUS_RI) != 0) set.add(ControlLine.RI); |             if((status & MODEM_STATUS_RI) != 0) set.add(ControlLine.RI); | ||||||
|             return set; |             return set; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -547,24 +337,42 @@ public class FtdiSerialDriver implements UsbSerialDriver { | |||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         @Override |         @Override | ||||||
|         public boolean purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException { |         public void purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException { | ||||||
|             if (purgeWriteBuffers) { |             if (purgeWriteBuffers) { | ||||||
|                 int result = mConnection.controlTransfer(FTDI_DEVICE_OUT_REQTYPE, SIO_RESET_REQUEST, |                 int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, RESET_REQUEST, | ||||||
|                         SIO_RESET_PURGE_RX, mIndex, null, 0, USB_WRITE_TIMEOUT_MILLIS); |                         RESET_PURGE_RX, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); | ||||||
|                 if (result != 0) { |                 if (result != 0) { | ||||||
|                     throw new IOException("purge write buffer failed: result=" + result); |                     throw new IOException("purge write buffer failed: result=" + result); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             if (purgeReadBuffers) { |             if (purgeReadBuffers) { | ||||||
|                 int result = mConnection.controlTransfer(FTDI_DEVICE_OUT_REQTYPE, SIO_RESET_REQUEST, |                 int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, RESET_REQUEST, | ||||||
|                         SIO_RESET_PURGE_TX, mIndex, null, 0, USB_WRITE_TIMEOUT_MILLIS); |                         RESET_PURGE_TX, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); | ||||||
|                 if (result != 0) { |                 if (result != 0) { | ||||||
|                     throw new IOException("purge read buffer failed: result=" + result); |                     throw new IOException("purge read buffer failed: result=" + result); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             return true; |  | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         public void setLatencyTimer(int latencyTime) throws IOException { | ||||||
|  |             int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, SET_LATENCY_TIMER_REQUEST, | ||||||
|  |                     latencyTime, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); | ||||||
|  |             if (result != 0) { | ||||||
|  |                 throw new IOException("Set latency timer failed: result=" + result); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public int getLatencyTimer() throws IOException { | ||||||
|  |             byte[] data = new byte[1]; | ||||||
|  |             int result = mConnection.controlTransfer(REQTYPE_DEVICE_TO_HOST, GET_LATENCY_TIMER_REQUEST, | ||||||
|  |                     0, mPortNumber+1, data, data.length, USB_WRITE_TIMEOUT_MILLIS); | ||||||
|  |             if (result != 1) { | ||||||
|  |                 throw new IOException("Get latency timer failed: result=" + result); | ||||||
|  |             } | ||||||
|  |             return data[0]; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public static Map<Integer, int[]> getSupportedDevices() { |     public static Map<Integer, int[]> getSupportedDevices() { | ||||||
| @ -575,7 +383,6 @@ public class FtdiSerialDriver implements UsbSerialDriver { | |||||||
|                     UsbId.FTDI_FT232H, |                     UsbId.FTDI_FT232H, | ||||||
|                     UsbId.FTDI_FT2232H, |                     UsbId.FTDI_FT2232H, | ||||||
|                     UsbId.FTDI_FT4232H, |                     UsbId.FTDI_FT4232H, | ||||||
|                     UsbId.FTDI_FT231X, |  | ||||||
|                 }); |                 }); | ||||||
|         return supportedDevices; |         return supportedDevices; | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -1,21 +1,6 @@ | |||||||
| /* Copyright 2011-2013 Google Inc. | /* Copyright 2011-2013 Google Inc. | ||||||
|  * Copyright 2013 mike wakerly <opensource@hoho.com> |  * Copyright 2013 mike wakerly <opensource@hoho.com> | ||||||
|  * |  * | ||||||
|  * This library is free software; you can redistribute it and/or |  | ||||||
|  * modify it under the terms of the GNU Lesser General Public |  | ||||||
|  * License as published by the Free Software Foundation; either |  | ||||||
|  * version 2.1 of the License, or (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This library 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 |  | ||||||
|  * Lesser General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU Lesser General Public |  | ||||||
|  * License along with this library; if not, write to the Free Software |  | ||||||
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, |  | ||||||
|  * USA. |  | ||||||
|  * |  | ||||||
|  * Project home page: https://github.com/mik3y/usb-serial-for-android |  * Project home page: https://github.com/mik3y/usb-serial-for-android | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,30 +1,12 @@ | |||||||
| /* This library is free software; you can redistribute it and/or | /* | ||||||
|  * modify it under the terms of the GNU Lesser General Public |  * Ported to usb-serial-for-android by Felix Hädicke <felixhaedicke@web.de> | ||||||
|  * License as published by the Free Software Foundation; either |  | ||||||
|  * version 2.1 of the License, or (at your option) any later version. |  | ||||||
|  * |  * | ||||||
|  * This library is distributed in the hope that it will be useful, |  * Based on the pyprolific driver written by Emmanuel Blot <emmanuel.blot@free.fr> | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  * See https://github.com/eblot/pyftdi | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU |  | ||||||
|  * Lesser General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU Lesser General Public |  | ||||||
|  * License along with this library; if not, write to the Free Software |  | ||||||
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, |  | ||||||
|  * USA. |  | ||||||
|  * |  * | ||||||
|  * Project home page: https://github.com/mik3y/usb-serial-for-android |  * Project home page: https://github.com/mik3y/usb-serial-for-android | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| /* |  | ||||||
|  * Ported to usb-serial-for-android |  | ||||||
|  * by Felix Hädicke <felixhaedicke@web.de> |  | ||||||
|  * |  | ||||||
|  * Based on the pyprolific driver written |  | ||||||
|  * by Emmanuel Blot <emmanuel.blot@free.fr> |  | ||||||
|  * See https://github.com/eblot/pyftdi |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| package com.hoho.android.usbserial.driver; | package com.hoho.android.usbserial.driver; | ||||||
| 
 | 
 | ||||||
| import android.hardware.usb.UsbConstants; | import android.hardware.usb.UsbConstants; | ||||||
| @ -482,7 +464,7 @@ public class ProlificSerialDriver implements UsbSerialDriver { | |||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         @Override |         @Override | ||||||
|         public boolean purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException { |         public void purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException { | ||||||
|             if (purgeWriteBuffers) { |             if (purgeWriteBuffers) { | ||||||
|                 vendorOut(FLUSH_RX_REQUEST, 0, null); |                 vendorOut(FLUSH_RX_REQUEST, 0, null); | ||||||
|             } |             } | ||||||
| @ -490,8 +472,6 @@ public class ProlificSerialDriver implements UsbSerialDriver { | |||||||
|             if (purgeReadBuffers) { |             if (purgeReadBuffers) { | ||||||
|                 vendorOut(FLUSH_TX_REQUEST, 0, null); |                 vendorOut(FLUSH_TX_REQUEST, 0, null); | ||||||
|             } |             } | ||||||
| 
 |  | ||||||
|             return true; |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,21 +1,6 @@ | |||||||
| /* Copyright 2011-2013 Google Inc. | /* Copyright 2011-2013 Google Inc. | ||||||
|  * Copyright 2013 mike wakerly <opensource@hoho.com> |  * Copyright 2013 mike wakerly <opensource@hoho.com> | ||||||
|  * |  * | ||||||
|  * This library is free software; you can redistribute it and/or |  | ||||||
|  * modify it under the terms of the GNU Lesser General Public |  | ||||||
|  * License as published by the Free Software Foundation; either |  | ||||||
|  * version 2.1 of the License, or (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This library 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 |  | ||||||
|  * Lesser General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU Lesser General Public |  | ||||||
|  * License along with this library; if not, write to the Free Software |  | ||||||
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, |  | ||||||
|  * USA. |  | ||||||
|  * |  | ||||||
|  * Project home page: https://github.com/mik3y/usb-serial-for-android |  * Project home page: https://github.com/mik3y/usb-serial-for-android | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| @ -36,7 +21,6 @@ public final class UsbId { | |||||||
|     public static final int FTDI_FT2232H = 0x6010; |     public static final int FTDI_FT2232H = 0x6010; | ||||||
|     public static final int FTDI_FT4232H = 0x6011; |     public static final int FTDI_FT4232H = 0x6011; | ||||||
|     public static final int FTDI_FT232H = 0x6014; |     public static final int FTDI_FT232H = 0x6014; | ||||||
|     public static final int FTDI_FT231X = 0x6015; |  | ||||||
| 
 | 
 | ||||||
|     public static final int VENDOR_ATMEL = 0x03EB; |     public static final int VENDOR_ATMEL = 0x03EB; | ||||||
|     public static final int ATMEL_LUFA_CDC_DEMO_APP = 0x2044; |     public static final int ATMEL_LUFA_CDC_DEMO_APP = 0x2044; | ||||||
|  | |||||||
| @ -1,21 +1,6 @@ | |||||||
| /* Copyright 2011-2013 Google Inc. | /* Copyright 2011-2013 Google Inc. | ||||||
|  * Copyright 2013 mike wakerly <opensource@hoho.com> |  * Copyright 2013 mike wakerly <opensource@hoho.com> | ||||||
|  * |  * | ||||||
|  * This library is free software; you can redistribute it and/or |  | ||||||
|  * modify it under the terms of the GNU Lesser General Public |  | ||||||
|  * License as published by the Free Software Foundation; either |  | ||||||
|  * version 2.1 of the License, or (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This library 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 |  | ||||||
|  * Lesser General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU Lesser General Public |  | ||||||
|  * License along with this library; if not, write to the Free Software |  | ||||||
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, |  | ||||||
|  * USA. |  | ||||||
|  * |  | ||||||
|  * Project home page: https://github.com/mik3y/usb-serial-for-android |  * Project home page: https://github.com/mik3y/usb-serial-for-android | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,21 +1,6 @@ | |||||||
| /* Copyright 2011-2013 Google Inc. | /* Copyright 2011-2013 Google Inc. | ||||||
|  * Copyright 2013 mike wakerly <opensource@hoho.com> |  * Copyright 2013 mike wakerly <opensource@hoho.com> | ||||||
|  * |  * | ||||||
|  * This library is free software; you can redistribute it and/or |  | ||||||
|  * modify it under the terms of the GNU Lesser General Public |  | ||||||
|  * License as published by the Free Software Foundation; either |  | ||||||
|  * version 2.1 of the License, or (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This library 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 |  | ||||||
|  * Lesser General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU Lesser General Public |  | ||||||
|  * License along with this library; if not, write to the Free Software |  | ||||||
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, |  | ||||||
|  * USA. |  | ||||||
|  * |  | ||||||
|  * Project home page: https://github.com/mik3y/usb-serial-for-android |  * Project home page: https://github.com/mik3y/usb-serial-for-android | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| @ -167,32 +152,36 @@ public interface UsbSerialPort extends Closeable { | |||||||
|     /** |     /** | ||||||
|      * Gets the CD (Carrier Detect) bit from the underlying UART. |      * Gets the CD (Carrier Detect) bit from the underlying UART. | ||||||
|      * |      * | ||||||
|      * @return the current state, or {@code false} if not supported. |      * @return the current state | ||||||
|      * @throws IOException if an error occurred during reading |      * @throws IOException if an error occurred during reading | ||||||
|  |      * @throws UnsupportedOperationException if not supported | ||||||
|      */ |      */ | ||||||
|     public boolean getCD() throws IOException; |     public boolean getCD() throws IOException; | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Gets the CTS (Clear To Send) bit from the underlying UART. |      * Gets the CTS (Clear To Send) bit from the underlying UART. | ||||||
|      * |      * | ||||||
|      * @return the current state, or {@code false} if not supported. |      * @return the current state | ||||||
|      * @throws IOException if an error occurred during reading |      * @throws IOException if an error occurred during reading | ||||||
|  |      * @throws UnsupportedOperationException if not supported | ||||||
|      */ |      */ | ||||||
|     public boolean getCTS() throws IOException; |     public boolean getCTS() throws IOException; | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Gets the DSR (Data Set Ready) bit from the underlying UART. |      * Gets the DSR (Data Set Ready) bit from the underlying UART. | ||||||
|      * |      * | ||||||
|      * @return the current state, or {@code false} if not supported. |      * @return the current state | ||||||
|      * @throws IOException if an error occurred during reading |      * @throws IOException if an error occurred during reading | ||||||
|  |      * @throws UnsupportedOperationException if not supported | ||||||
|      */ |      */ | ||||||
|     public boolean getDSR() throws IOException; |     public boolean getDSR() throws IOException; | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Gets the DTR (Data Terminal Ready) bit from the underlying UART. |      * Gets the DTR (Data Terminal Ready) bit from the underlying UART. | ||||||
|      * |      * | ||||||
|      * @return the current state, or {@code false} if not supported. |      * @return the current state | ||||||
|      * @throws IOException if an error occurred during reading |      * @throws IOException if an error occurred during reading | ||||||
|  |      * @throws UnsupportedOperationException if not supported | ||||||
|      */ |      */ | ||||||
|     public boolean getDTR() throws IOException; |     public boolean getDTR() throws IOException; | ||||||
| 
 | 
 | ||||||
| @ -201,22 +190,25 @@ public interface UsbSerialPort extends Closeable { | |||||||
|      * |      * | ||||||
|      * @param value the value to set |      * @param value the value to set | ||||||
|      * @throws IOException if an error occurred during writing |      * @throws IOException if an error occurred during writing | ||||||
|  |      * @throws UnsupportedOperationException if not supported | ||||||
|      */ |      */ | ||||||
|     public void setDTR(boolean value) throws IOException; |     public void setDTR(boolean value) throws IOException; | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Gets the RI (Ring Indicator) bit from the underlying UART. |      * Gets the RI (Ring Indicator) bit from the underlying UART. | ||||||
|      * |      * | ||||||
|      * @return the current state, or {@code false} if not supported. |      * @return the current state | ||||||
|      * @throws IOException if an error occurred during reading |      * @throws IOException if an error occurred during reading | ||||||
|  |      * @throws UnsupportedOperationException if not supported | ||||||
|      */ |      */ | ||||||
|     public boolean getRI() throws IOException; |     public boolean getRI() throws IOException; | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Gets the RTS (Request To Send) bit from the underlying UART. |      * Gets the RTS (Request To Send) bit from the underlying UART. | ||||||
|      * |      * | ||||||
|      * @return the current state, or {@code false} if not supported. |      * @return the current state | ||||||
|      * @throws IOException if an error occurred during reading |      * @throws IOException if an error occurred during reading | ||||||
|  |      * @throws UnsupportedOperationException if not supported | ||||||
|      */ |      */ | ||||||
|     public boolean getRTS() throws IOException; |     public boolean getRTS() throws IOException; | ||||||
| 
 | 
 | ||||||
| @ -225,6 +217,7 @@ public interface UsbSerialPort extends Closeable { | |||||||
|      * |      * | ||||||
|      * @param value the value to set |      * @param value the value to set | ||||||
|      * @throws IOException if an error occurred during writing |      * @throws IOException if an error occurred during writing | ||||||
|  |      * @throws UnsupportedOperationException if not supported | ||||||
|      */ |      */ | ||||||
|     public void setRTS(boolean value) throws IOException; |     public void setRTS(boolean value) throws IOException; | ||||||
| 
 | 
 | ||||||
| @ -250,11 +243,10 @@ public interface UsbSerialPort extends Closeable { | |||||||
|      * |      * | ||||||
|      * @param purgeWriteBuffers {@code true} to discard non-transmitted output data |      * @param purgeWriteBuffers {@code true} to discard non-transmitted output data | ||||||
|      * @param purgeReadBuffers {@code true} to discard non-read input data |      * @param purgeReadBuffers {@code true} to discard non-read input data | ||||||
|      * @return {@code true} if the operation was successful, or |  | ||||||
|      *         {@code false} if the operation is not supported by the driver or device |  | ||||||
|      * @throws IOException if an error occurred during flush |      * @throws IOException if an error occurred during flush | ||||||
|  |      * @throws UnsupportedOperationException if not supported | ||||||
|      */ |      */ | ||||||
|     public boolean purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException; |     public void purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException; | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Returns the current state of the connection. |      * Returns the current state of the connection. | ||||||
|  | |||||||
| @ -1,21 +1,6 @@ | |||||||
| /* Copyright 2011-2013 Google Inc. | /* Copyright 2011-2013 Google Inc. | ||||||
|  * Copyright 2013 mike wakerly <opensource@hoho.com> |  * Copyright 2013 mike wakerly <opensource@hoho.com> | ||||||
|  * |  * | ||||||
|  * This library is free software; you can redistribute it and/or |  | ||||||
|  * modify it under the terms of the GNU Lesser General Public |  | ||||||
|  * License as published by the Free Software Foundation; either |  | ||||||
|  * version 2.1 of the License, or (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This library 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 |  | ||||||
|  * Lesser General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU Lesser General Public |  | ||||||
|  * License along with this library; if not, write to the Free Software |  | ||||||
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, |  | ||||||
|  * USA. |  | ||||||
|  * |  | ||||||
|  * Project home page: https://github.com/mik3y/usb-serial-for-android |  * Project home page: https://github.com/mik3y/usb-serial-for-android | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,21 +1,6 @@ | |||||||
| /* Copyright 2011-2013 Google Inc. | /* Copyright 2011-2013 Google Inc. | ||||||
|  * Copyright 2013 mike wakerly <opensource@hoho.com> |  * Copyright 2013 mike wakerly <opensource@hoho.com> | ||||||
|  * |  * | ||||||
|  * This library is free software; you can redistribute it and/or |  | ||||||
|  * modify it under the terms of the GNU Lesser General Public |  | ||||||
|  * License as published by the Free Software Foundation; either |  | ||||||
|  * version 2.1 of the License, or (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This library 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 |  | ||||||
|  * Lesser General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU Lesser General Public |  | ||||||
|  * License along with this library; if not, write to the Free Software |  | ||||||
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, |  | ||||||
|  * USA. |  | ||||||
|  * |  | ||||||
|  * Project home page: https://github.com/mik3y/usb-serial-for-android |  * Project home page: https://github.com/mik3y/usb-serial-for-android | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user