mirror of
				https://github.com/mik3y/usb-serial-for-android
				synced 2025-10-31 18:37:34 +00:00 
			
		
		
		
	Merge pull request #195 from kai-morich/ch340-parameter
CH34x: data bits, parity, stop bits
This commit is contained in:
		
						commit
						c89ca2c96a
					
				| @ -49,6 +49,17 @@ public class Ch34xSerialDriver implements UsbSerialDriver { | |||||||
| 	private final UsbDevice mDevice; | 	private final UsbDevice mDevice; | ||||||
| 	private final UsbSerialPort mPort; | 	private final UsbSerialPort mPort; | ||||||
| 
 | 
 | ||||||
|  | 	private static final int LCR_ENABLE_RX   = 0x80; | ||||||
|  | 	private static final int LCR_ENABLE_TX   = 0x40; | ||||||
|  | 	private static final int LCR_MARK_SPACE  = 0x20; | ||||||
|  | 	private static final int LCR_PAR_EVEN    = 0x10; | ||||||
|  | 	private static final int LCR_ENABLE_PAR  = 0x08; | ||||||
|  | 	private static final int LCR_STOP_BITS_2 = 0x04; | ||||||
|  | 	private static final int LCR_CS8         = 0x03; | ||||||
|  | 	private static final int LCR_CS7         = 0x02; | ||||||
|  | 	private static final int LCR_CS6         = 0x01; | ||||||
|  | 	private static final int LCR_CS5         = 0x00; | ||||||
|  | 
 | ||||||
| 	public Ch34xSerialDriver(UsbDevice device) { | 	public Ch34xSerialDriver(UsbDevice device) { | ||||||
| 		mDevice = device; | 		mDevice = device; | ||||||
| 		mPort = new Ch340SerialPort(mDevice, 0); | 		mPort = new Ch340SerialPort(mDevice, 0); | ||||||
| @ -288,7 +299,7 @@ public class Ch34xSerialDriver implements UsbSerialDriver { | |||||||
| 
 | 
 | ||||||
| 			checkState("init #4", 0x95, 0x2518, new int[]{-1 /* 0x56, c3*/, 0x00}); | 			checkState("init #4", 0x95, 0x2518, new int[]{-1 /* 0x56, c3*/, 0x00}); | ||||||
| 
 | 
 | ||||||
| 			if (controlOut(0x9a, 0x2518, 0x0050) < 0) { | 			if (controlOut(0x9a, 0x2518, LCR_ENABLE_RX | LCR_ENABLE_TX | LCR_CS8) < 0) { | ||||||
| 				throw new IOException("init failed! #5"); | 				throw new IOException("init failed! #5"); | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| @ -340,7 +351,60 @@ public class Ch34xSerialDriver implements UsbSerialDriver { | |||||||
| 				throws IOException { | 				throws IOException { | ||||||
| 			setBaudRate(baudRate); | 			setBaudRate(baudRate); | ||||||
| 
 | 
 | ||||||
| 			// TODO databit, stopbit and paraty set not implemented | 			int lcr = LCR_ENABLE_RX | LCR_ENABLE_TX; | ||||||
|  | 
 | ||||||
|  | 			switch (dataBits) { | ||||||
|  | 				case DATABITS_5: | ||||||
|  | 					lcr |= LCR_CS5; | ||||||
|  | 					break; | ||||||
|  | 				case DATABITS_6: | ||||||
|  | 					lcr |= LCR_CS6; | ||||||
|  | 					break; | ||||||
|  | 				case DATABITS_7: | ||||||
|  | 					lcr |= LCR_CS7; | ||||||
|  | 					break; | ||||||
|  | 				case DATABITS_8: | ||||||
|  | 					lcr |= LCR_CS8; | ||||||
|  | 					break; | ||||||
|  | 				default: | ||||||
|  | 					throw new IllegalArgumentException("Unknown dataBits value: " + dataBits); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			switch (parity) { | ||||||
|  | 				case PARITY_NONE: | ||||||
|  | 					break; | ||||||
|  | 				case PARITY_ODD: | ||||||
|  | 					lcr |= LCR_ENABLE_PAR; | ||||||
|  | 					break; | ||||||
|  | 				case PARITY_EVEN: | ||||||
|  | 					lcr |= LCR_ENABLE_PAR | LCR_PAR_EVEN; | ||||||
|  | 					break; | ||||||
|  | 				case PARITY_MARK: | ||||||
|  | 					lcr |= LCR_ENABLE_PAR | LCR_MARK_SPACE; | ||||||
|  | 					break; | ||||||
|  | 				case PARITY_SPACE: | ||||||
|  | 					lcr |= LCR_ENABLE_PAR | LCR_MARK_SPACE | LCR_PAR_EVEN; | ||||||
|  | 					break; | ||||||
|  | 				default: | ||||||
|  | 					throw new IllegalArgumentException("Unknown parity value: " + parity); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			switch (stopBits) { | ||||||
|  | 				case STOPBITS_1: | ||||||
|  | 					break; | ||||||
|  | 				case STOPBITS_1_5: | ||||||
|  | 					throw new IllegalArgumentException("Unsupported stopBits value: 1.5"); | ||||||
|  | 				case STOPBITS_2: | ||||||
|  | 					lcr |= LCR_STOP_BITS_2; | ||||||
|  | 					break; | ||||||
|  | 				default: | ||||||
|  | 					throw new IllegalArgumentException("Unknown stopBits value: " + stopBits); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			int ret = controlOut(0x9a, 0x2518, lcr); | ||||||
|  | 			if (ret < 0) { | ||||||
|  | 				throw new IOException("Error setting control byte"); | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		@Override | 		@Override | ||||||
|  | |||||||
| @ -264,26 +264,38 @@ public class Cp21xxSerialDriver implements UsbSerialDriver { | |||||||
|                     configDataBits |= 0x0800; |                     configDataBits |= 0x0800; | ||||||
|                     break; |                     break; | ||||||
|                 default: |                 default: | ||||||
|                     configDataBits |= 0x0800; |                     throw new IllegalArgumentException("Unknown dataBits value: " + dataBits); | ||||||
|                     break; |  | ||||||
|             } |             } | ||||||
|              |              | ||||||
|             switch (parity) { |             switch (parity) { | ||||||
|  |                 case PARITY_NONE: | ||||||
|  |                     break; | ||||||
|                 case PARITY_ODD: |                 case PARITY_ODD: | ||||||
|                     configDataBits |= 0x0010; |                     configDataBits |= 0x0010; | ||||||
|                     break; |                     break; | ||||||
|                 case PARITY_EVEN: |                 case PARITY_EVEN: | ||||||
|                     configDataBits |= 0x0020; |                     configDataBits |= 0x0020; | ||||||
|                     break; |                     break; | ||||||
|  |                 case PARITY_MARK: | ||||||
|  |                     configDataBits |= 0x0030; | ||||||
|  |                     break; | ||||||
|  |                 case PARITY_SPACE: | ||||||
|  |                     configDataBits |= 0x0040; | ||||||
|  |                     break; | ||||||
|  |                 default: | ||||||
|  |                     throw new IllegalArgumentException("Unknown parity value: " + parity); | ||||||
|             } |             } | ||||||
|              |              | ||||||
|             switch (stopBits) { |             switch (stopBits) { | ||||||
|                 case STOPBITS_1: |                 case STOPBITS_1: | ||||||
|                     configDataBits |= 0; |  | ||||||
|                     break; |                     break; | ||||||
|  |                 case STOPBITS_1_5: | ||||||
|  |                     throw new IllegalArgumentException("Unsupported stopBits value: 1.5"); | ||||||
|                 case STOPBITS_2: |                 case STOPBITS_2: | ||||||
|                     configDataBits |= 2; |                     configDataBits |= 2; | ||||||
|                     break; |                     break; | ||||||
|  |                 default: | ||||||
|  |                     throw new IllegalArgumentException("Unknown stopBits value: " + stopBits); | ||||||
|             } |             } | ||||||
|             setConfigSingle(SILABSER_SET_LINE_CTL_REQUEST_CODE, configDataBits); |             setConfigSingle(SILABSER_SET_LINE_CTL_REQUEST_CODE, configDataBits); | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -378,7 +378,18 @@ public class FtdiSerialDriver implements UsbSerialDriver { | |||||||
|                 throws IOException { |                 throws IOException { | ||||||
|             setBaudRate(baudRate); |             setBaudRate(baudRate); | ||||||
| 
 | 
 | ||||||
|             int config = dataBits; |             int config = 0; | ||||||
|  |             switch (dataBits) { | ||||||
|  |                 case DATABITS_5: | ||||||
|  |                 case DATABITS_6: | ||||||
|  |                     throw new IllegalArgumentException("Unsupported dataBits value: " + dataBits); | ||||||
|  |                 case DATABITS_7: | ||||||
|  |                 case DATABITS_8: | ||||||
|  |                     config |= dataBits; | ||||||
|  |                     break; | ||||||
|  |                 default: | ||||||
|  |                     throw new IllegalArgumentException("Unknown dataBits value: " + dataBits); | ||||||
|  |             } | ||||||
| 
 | 
 | ||||||
|             switch (parity) { |             switch (parity) { | ||||||
|                 case PARITY_NONE: |                 case PARITY_NONE: | ||||||
| @ -405,8 +416,7 @@ public class FtdiSerialDriver implements UsbSerialDriver { | |||||||
|                     config |= (0x00 << 11); |                     config |= (0x00 << 11); | ||||||
|                     break; |                     break; | ||||||
|                 case STOPBITS_1_5: |                 case STOPBITS_1_5: | ||||||
|                     config |= (0x01 << 11); |                     throw new IllegalArgumentException("Unsupported stopBits value: 1.5"); | ||||||
|                     break; |  | ||||||
|                 case STOPBITS_2: |                 case STOPBITS_2: | ||||||
|                     config |= (0x02 << 11); |                     config |= (0x02 << 11); | ||||||
|                     break; |                     break; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user