Plan 9 from Bell Labs’s /usr/web/sources/patch/applied/serialchanges/ftdi.txt

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.



 bRequest: FTGETE2READ
 wIndex: Address of word to read
 Data: Will return a word of data from E2Address




 bRequest: FTRESET
 wValue: Ctl Val
 wIndex: Port

 The Reset SIO command has this effect:

 Sets flow control set to'none'
 Event char = 0
 Event trigger = disabled
 Purge RX buffer
 Purge TX buffer
 Clear DTR
 Clear RTS
 baud and data format not reset

 The Purge RX and TX buffer commands affect nothing except the buffers



BmRequestType: SET
bRequest: FTSETBaudRate
wValue: BaudDivisor value - see below
wIndex: Port

The BaudDivisor values are calculated as follows:
- BaseClock is either 12000000 or 48000000 depending on the device. FIXME: I wish
I knew how to detect old chips to select proper base clock!
- BaudDivisor is a fixed point number encoded in a funny way.
(--WRONG WAY OF THINKING--)
BaudDivisor is a fixed point number encoded with following bit weighs:
(-2)(-1)(13..0). It is a radical with a denominator of 4, so  values
end with 0.0 (00...), 0.25 (10...), 0.5 (01...), and 0.75 (11...).
(--THE REALITY--)
The both-bits-set has quite different meaning from 0.75 - the chip designers
have decided it to mean 0.125 instead of 0.75.
This info looked up in FT application note"FT8U232 DEVICES Data Rates
and Flow Control Consideration for USB to RS232".
- BaudDivisor = (BaseClock / 16) / BaudRate, where the (=) operation should
automagically re-encode the resulting value to take fractions into consideration.
As all values are integers, some bit twiddling is in order:
BaudDivisor = (BaseClock / 16 / BaudRate) |
(((BaseClock / 2 / BaudRate) & 4)? 0x4000 // 0.5
: ((BaseClock / 2 / BaudRate) & 2)? 0x8000 // 0.25
: ((BaseClock / 2 / BaudRate) & 1)? 0xc000 // 0.125
: 0)

For the FT232BM, a 17th divisor bit was introduced to encode the multiples
of 0.125 missing from the FT8U232AM. Bits 16 to 14 are coded as follows
(the first four codes are the same as for the FT8U232AM, where bit 16 is
always 0):
000 - add.000 to divisor
001 - add.500 to divisor
010 - add.250 to divisor
011 - add.125 to divisor
100 - add.375 to divisor
101 - add.625 to divisor
110 - add.750 to divisor
111 - add.875 to divisor
Bits 15 to 0 of the 17-bit divisor are placed in the request value. Bit 16 is
placed in bit 0 of the request index.

Note that there are a couple of special cases to support the highest baud
rates. If the calculated divisor value is 1, this needs to be replaced with
0. Additionally for the FT232BM, if the calculated divisor value is 0x4001
(1.5), this needs to be replaced with 0x0001 (1) (but this divisor value is
not supported by the FT8U232AM).



 bRequest: FTSETDATA
 wValue: Data characteristics (see below)
 wIndex: Port

 Data characteristics

 B0..7 Number of data bits
 B8..10 Parity
 0 = None
 1 = Odd
 2 = Even
 3 = Mark
 4 = Space
 B11..13 Stop Bits
 0 = 1
 1 = 1.5
 2 = 2
 B14
 1 = TX ON (break)
 0 = TX OFF (normal state)
 B15 Reserved




bRequest: FTSETMODEMCTRL
wValue: ControlValue (see below)
wIndex: Port

NOTE: If the device is in RTS/CTS flow control, the RTS set by this
command will be IGNORED without an error being returned
Also - you can not set DTR and RTS with one control message



 ControlValue
 B0 DTR state
 0 = reset
 1 = set
 B1 RTS state
 0 = reset
 1 = set
 B2..7 Reserved
 B8 DTR state enable
 0 = ignore
 1 = use DTR state
 B9 RTS state enable
 0 = ignore
 1 = use RTS state
 B10..15 Reserved



 bRequest: FTSETFLOWCTRL
 wValue: Xoff/Xon
 wIndex: Protocol/Port - hIndex is protocl / lIndex is port

 hIndex protocol is:
 B0 Output handshaking using RTS/CTS
 0 = disabled
 1 = enabled
 B1 Output handshaking using DTR/DSR
 0 = disabled
 1 = enabled
 B2 Xon/Xoff handshaking
 0 = disabled
 1 = enabled

 A value of zero in the hIndex field disables handshaking

 If Xon/Xoff handshaking is specified, the hValue field should
	contain the XOFF character
 and the lValue field contains the XON character.




 bRequest: FTGETLATENCYTIMER
 wIndex: Port
 wLength: 0
 Data: latency (on return)




 bRequest: FTSETLATENCYTIMER
 wValue: Latency (milliseconds)
 wIndex: Port

 wValue:
 B0..7 Latency timer
 B8..15 0

 Set the timeout interval. The FT collects data from the slave
 device, transmitting it to the host when either A) 62 bytes are
 received, or B) the timeout interval has elapsed and the buffer
 contains at least 1 byte. Setting this value to a small number
 can dramatically improve performance for applications which send
 small packets, since the default value is 16ms.





 BmRequestType: SET
 bRequest: FTSETEVENTCHAR
 wValue: EventChar
 wIndex: Port

 wValue:
 B0..7 Event Character
 B8 Event Character Processing
 0 = disabled
 1 = enabled
 B9..15 Reserved


 Set the special event character for the specified communications port.
 If the device sees this character it will immediately return the
 data read so far - rather than wait 40ms or until 62 bytes are read
 which is what normally happens.





 BmRequestType: SET
 bRequest: FTSETERRORCHAR
 wValue: Error Char
 wIndex: Port

 Error Char
 B0..7 Error Character
 B8 Error Character Processing
 0 = disabled
 1 = enabled
 B9..15 Reserved

 Set the parity error replacement character
 for the specified communications port


 

 BmRequestType: GET
 bRequest: FTGETMODEMSTATUS
 wIndex: Port
 wLength: 1
 Data: Status

 One byte of data is returned
 B0..3 0
 B4 CTS
 0 = inactive
 1 = active
 B5 DSR
 0 = inactive
 1 = active
 B6 Ring Indicator (RI)
 0 = inactive
 1 = active
 B7 Receive Line Signal Detect (RLSD)
 0 = inactive
 1 = active

Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to webmaster@9p.io.