History log of /haiku/src/add-ons/kernel/drivers/ports/usb_serial/SerialDevice.cpp
Revision Date Author Comments
# b1a92c72 28-Jul-2019 Jérôme Duval <jerome.duval@gmail.com>

usb_serial: make buffers kernel-only for SMAP, see #15172.

Change-Id: I11ea1e18977331a513bf97f5ce885f608e9b573a
Reviewed-on: https://review.haiku-os.org/c/1654
Reviewed-by: waddlesplash <waddlesplash@gmail.com>


# e399a883 30-Jun-2019 Adrien Destugues <pulkomandy@pulkomandy.tk>

usb_serial: don't allow Service() on a closed device.

- In Service, check that the device is open.
- In Close, clear dangling pointers to more easily spot problems and
avoid risk of accessing freed memory.

Change-Id: I970c4b8b8ec14db448388f74fc275634801c359a
Reviewed-on: https://review.haiku-os.org/c/1551
Reviewed-by: Jérôme Duval <jerome.duval@gmail.com>


# 7b6e6c15 26-Aug-2017 Adrien Destugues <pulkomandy@pulkomandy.tk>

FT232x driver: support hardware flow control.

We had everything in place, except we never actually sent the command to
the device.

Note that the other drivers (prolific, etc) as well as pc_serial need to
be updated as well (might do it when I get access to hardware where I
can test the changes).


# 93ea83e5 27-Feb-2016 Adrien Destugues <pulkomandy@pulkomandy.tk>

Allow custom baud rates for FTDI serial ports

- Termios: cf{get,set}{i,o}speed can handle arbitrary speed values.
- The value is stored in the appropriate fields of the termios structure
in this case. The old constants (stored in the flags) are preserved
for BeOS binary compatibility.
- Adjust the FTDI FT232* driver to accept custom rates, by replacing the
hardcoded regster values with a function that will compute it
according to FTDI documentation (confirmed giving the same values for
the existing baudrates).


# 24dba16d 09-May-2013 Jérôme Duval <jerome.duval@gmail.com>

usb_serial: fixes 64 bit warnings


# 7e67ec90 22-Jul-2012 Alexander von Gluck IV <kallisti5@unixzen.com>

usb_serial: Set option driver to use the last found port.

* Add a warning when >1 port is found (as we only use the
last found serial port)
* Verified working, remove if 0.


# 52b7ccf4 22-Jul-2012 Alexander von Gluck IV <kallisti5@unixzen.com>

usb_serial: Probe for USB endpoints on Option device

* More then one serial port is common, for now we only
work off of the first one detected.
* Still disabled as some setup is needed.


# b3b04af9 22-Jul-2012 Alexander von Gluck IV <kallisti5@unixzen.com>

usb_serial: Add new Option driver

* Option devices are generally WWAN serial
devices for 3G or lower.
* Picks up my CMOTECH Sprint 3G adaptor, need
to wire up endpoints so disabled for now.


# 5ba5e31f 20-Jul-2012 Alexander von Gluck IV <kallisti5@unixzen.com>

usb_serial: clean up usb device identification

* Update FTDI, KLSI, Prolific, and Silicon drivers to share a
common structural layout for device identification.
* More flexible and cleaner than massive switch case statements.
* Avoids the problem of different chipsets from identical vendors.


# 7117b2ea 16-Oct-2011 Adrien Destugues <pulkomandy@pulkomandy.ath.cx>

Add support for Silicon Labs CP210x to usb_serial.
Not completely tested : my device has no control lines wired. RX/TX seems to
work fine, at least.

Inspiration from the Linux driver since there isn't any documentation avilable:
http://lxr.free-electrons.com/source/drivers/usb/serial/cp210x.c

The switch/case for VID/PID identification is getting quite long. Isn't there a
better way to do it ?


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42860 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 08c7202f 13-Jun-2011 Michael Lotz <mmlr@mlotz.ch>

* Add a termios member that stores the config across open/close cycles. This
allows the use of stty to configure the serial device and later using other
commands with these settings still in place.
* Store incoming termios settings when they are set, restore the previous
settings on open and apply the control modes to the device side as well.
* Only send the control to the system side tty cookie again. Doing it for both
cookies was only done to configure the termios, which isn't necessary anymore.
* Remove fallbacks to c_{i|o}speed fields and always use c_cflag & CBAUD for the
single speed setting we have.
* Remove some leftover control line state logic that doesn't apply anymore.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42161 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 77a5d93e 13-Jun-2011 Michael Lotz <mmlr@mlotz.ch>

* Remove the output thread again and write to the device in the write call. To
ensure that we don't block on the tty buffer, we chop up the data into blocks
that are written into the tty and then the buffer is flushed to the device
each time. This resolves the issue that a quick open/write/close would not
actually send the data to the device as it would cancel the transfer before
the output thread had a chance to run.
* Use the tty_close_cookie() call. Doing the close before waiting for the input
thread ensures that it is woken up if it blocked on writing into the tty.
* Correct the type of the USB callback status and only try to clear a halt if
the device was actually stalled.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42156 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 224d969b 13-Jun-2011 Michael Lotz <mmlr@mlotz.ch>

* When determining the bit to be set for RTS/DTR there was a missing comparison
to op which would've caused a wrong line state to be set.
* Add some more allocation checks.
* Some cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42151 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 36986acb 10-Jun-2011 Michael Lotz <mmlr@mlotz.ch>

* Finish the port to the new tty module. Back when I left off last time it was
only halfway finished. The way it is supposed to work is that there are two
tty cookies, representing the system and the device side. Reads and writes
coming from the system and going to the device are using the system cookie
while reads and writes coming from the device use the device cookie.
* Move writing to the device into an output thread, similar to how reading from
the device works. This isn't necessarily a good idea and might be moved back
into the write hook again to ensure that writes can be made blocking. Right
now if you just write and then close, the writes will most likely be canceled
before every going out to the device.
* Removed the read and write lock mutex. They aren't necessary as the tty layer
will serialize the reads and writes anyway.
* Made simply copying the data to the write buffer the default implementation of
the OnWrite callback and removed the OnWrite in ACMDevice. The ProlificDevice
didn't provide an OnWrite hook before, so it would've never written anything.
* Break out the baud index to speed mapping into an inline function. Since the
defines might change in termios.h just adding an array is a bit fragile (it
already missed one entry and would've been broken for certain speeds).

This should make usb_serial usable for some (most?) cases. I've tested this with
an Arduino board that uses an FTDI interface. As mentioned above, since writes
currently just write into the tty layer and don't wait for the data to be
flushed, and since close doesn't wait for the output buffers to be drained
either, a simple write and close (as in "echo a > /dev/ports/usb0") will in most
cases cancel the output before it is written to the device. I'm looking into
a few ways to fix that next.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42089 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 4e1d68e9 09-Jun-2011 Michael Lotz <mmlr@mlotz.ch>

Style cleanup, 80 char limit. No functional changes.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42072 a95241bf-73f2-0310-859d-f6bbb57e9c96


# c5f2df28 03-Jan-2011 Philippe Houdoin <philippe.houdoin@gmail.com>

Switched to use USB_cdc.h definitions.
Expanded search in every configuration, not only first. ELSA USB modem for instance
publish two configurations, the first one being a vendor-specific one for
Windows NT.
ACMDevice now don't assume anymore union functional descriptor is always there.
The data interface index can be found also in Call Management (CM) functional
descriptor.

(Style cleanup pending...)


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40092 a95241bf-73f2-0310-859d-f6bbb57e9c96


# b77aa015 08-Dec-2010 François Revol <revol@free.fr>

Fix gcc4 build:
- use new(std::nothrow) from <new> since we dropped kernel_cpp.h,
- fix "declared 'extern' and later 'static'" warning,
- fix "deprecated conversion from string constant to 'char*'" warning in tracing code.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39784 a95241bf-73f2-0310-859d-f6bbb57e9c96


# b994a185 07-Dec-2010 Michael Lotz <mmlr@mlotz.ch>

Port of usb_serial to the generic tty module. I don't remember exactly if or how
well this was working, but since it was non-functional on Haiku anyway this
shouldn't hurt.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39762 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 12f32926 12-Jun-2008 François Revol <revol@free.fr>

- change KLSI init the way it's done by the linux driver
- do not count usb headers as part of count returned by write(), else we might end up writing more than the passed amount :)


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25939 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 2b07b8e0 28-May-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Replaced all instances of benaphores in the kernel code by mutexes.
* Removed kernel benaphores.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25690 a95241bf-73f2-0310-859d-f6bbb57e9c96


# dbcfdd5c 11-Apr-2008 Michael Lotz <mmlr@mlotz.ch>

Correct the way serial devices are deleted. They are either deleted on removal
when they are not open or they are deleted on free when they are already
removed. This should fix the sudden crashes when you unplugged a device that
might not have been fully closed yet.
Also handle the case of removal correctly and don't use the usb_device anymore
after releasing it by returning from the device removed hook. Calls to the
device just return B_DEV_NOT_READY in that case.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24920 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 7aa661d4 19-Jan-2008 Michael Lotz <mmlr@mlotz.ch>

Rework of the usb_serial driver:
* Refactored everything to C++ with the different devices as subclasses
* Added proper ACM detection with parsing of the ACM descriptors
* Added device transfer error handling and fixed some concurency issues
* Big cleanup to conform to our style guide

This should make at least ACM stable to use. Commiting this over my K850i with
ACM compliant USB modem and UMTS data connection. Note that support for all
other device classes (Prolific, FTDI and KLSI) is untested but should work the
same as before. Note also that since we currently lack a TTY module this will
only build/work for R5 or Dano with the proper TTY headers.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23634 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 24dba16d04b9acd835871de8f9066c8874948e54 09-May-2013 Jérôme Duval <jerome.duval@gmail.com>

usb_serial: fixes 64 bit warnings


# 7e67ec90a46ec4202ab7e4f7b0e07cf398200f45 22-Jul-2012 Alexander von Gluck IV <kallisti5@unixzen.com>

usb_serial: Set option driver to use the last found port.

* Add a warning when >1 port is found (as we only use the
last found serial port)
* Verified working, remove if 0.


# 52b7ccf49e8215e58c9c341e013999ee1795848b 22-Jul-2012 Alexander von Gluck IV <kallisti5@unixzen.com>

usb_serial: Probe for USB endpoints on Option device

* More then one serial port is common, for now we only
work off of the first one detected.
* Still disabled as some setup is needed.


# b3b04af940fef90e722a590596527c6cc79920a3 22-Jul-2012 Alexander von Gluck IV <kallisti5@unixzen.com>

usb_serial: Add new Option driver

* Option devices are generally WWAN serial
devices for 3G or lower.
* Picks up my CMOTECH Sprint 3G adaptor, need
to wire up endpoints so disabled for now.


# 5ba5e31f8a59cb5f3299edd7af256d0fb4db12aa 20-Jul-2012 Alexander von Gluck IV <kallisti5@unixzen.com>

usb_serial: clean up usb device identification

* Update FTDI, KLSI, Prolific, and Silicon drivers to share a
common structural layout for device identification.
* More flexible and cleaner than massive switch case statements.
* Avoids the problem of different chipsets from identical vendors.


# 7117b2ea258118c2cb0b41ac3c46a9de6ea293d6 16-Oct-2011 Adrien Destugues <pulkomandy@pulkomandy.ath.cx>

Add support for Silicon Labs CP210x to usb_serial.
Not completely tested : my device has no control lines wired. RX/TX seems to
work fine, at least.

Inspiration from the Linux driver since there isn't any documentation avilable:
http://lxr.free-electrons.com/source/drivers/usb/serial/cp210x.c

The switch/case for VID/PID identification is getting quite long. Isn't there a
better way to do it ?


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42860 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 08c7202f8a3977afe560df956f83ea29e1398607 13-Jun-2011 Michael Lotz <mmlr@mlotz.ch>

* Add a termios member that stores the config across open/close cycles. This
allows the use of stty to configure the serial device and later using other
commands with these settings still in place.
* Store incoming termios settings when they are set, restore the previous
settings on open and apply the control modes to the device side as well.
* Only send the control to the system side tty cookie again. Doing it for both
cookies was only done to configure the termios, which isn't necessary anymore.
* Remove fallbacks to c_{i|o}speed fields and always use c_cflag & CBAUD for the
single speed setting we have.
* Remove some leftover control line state logic that doesn't apply anymore.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42161 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 77a5d93e961506b3f89b6821210992e1b24a947e 13-Jun-2011 Michael Lotz <mmlr@mlotz.ch>

* Remove the output thread again and write to the device in the write call. To
ensure that we don't block on the tty buffer, we chop up the data into blocks
that are written into the tty and then the buffer is flushed to the device
each time. This resolves the issue that a quick open/write/close would not
actually send the data to the device as it would cancel the transfer before
the output thread had a chance to run.
* Use the tty_close_cookie() call. Doing the close before waiting for the input
thread ensures that it is woken up if it blocked on writing into the tty.
* Correct the type of the USB callback status and only try to clear a halt if
the device was actually stalled.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42156 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 224d969b1df46413ff9d852aae0738f99f61f5be 13-Jun-2011 Michael Lotz <mmlr@mlotz.ch>

* When determining the bit to be set for RTS/DTR there was a missing comparison
to op which would've caused a wrong line state to be set.
* Add some more allocation checks.
* Some cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42151 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 36986acbbd67c4866976aeb4a6a3e98d953b69c3 10-Jun-2011 Michael Lotz <mmlr@mlotz.ch>

* Finish the port to the new tty module. Back when I left off last time it was
only halfway finished. The way it is supposed to work is that there are two
tty cookies, representing the system and the device side. Reads and writes
coming from the system and going to the device are using the system cookie
while reads and writes coming from the device use the device cookie.
* Move writing to the device into an output thread, similar to how reading from
the device works. This isn't necessarily a good idea and might be moved back
into the write hook again to ensure that writes can be made blocking. Right
now if you just write and then close, the writes will most likely be canceled
before every going out to the device.
* Removed the read and write lock mutex. They aren't necessary as the tty layer
will serialize the reads and writes anyway.
* Made simply copying the data to the write buffer the default implementation of
the OnWrite callback and removed the OnWrite in ACMDevice. The ProlificDevice
didn't provide an OnWrite hook before, so it would've never written anything.
* Break out the baud index to speed mapping into an inline function. Since the
defines might change in termios.h just adding an array is a bit fragile (it
already missed one entry and would've been broken for certain speeds).

This should make usb_serial usable for some (most?) cases. I've tested this with
an Arduino board that uses an FTDI interface. As mentioned above, since writes
currently just write into the tty layer and don't wait for the data to be
flushed, and since close doesn't wait for the output buffers to be drained
either, a simple write and close (as in "echo a > /dev/ports/usb0") will in most
cases cancel the output before it is written to the device. I'm looking into
a few ways to fix that next.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42089 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 4e1d68e99449a62eb533704b1c026053deedae39 09-Jun-2011 Michael Lotz <mmlr@mlotz.ch>

Style cleanup, 80 char limit. No functional changes.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42072 a95241bf-73f2-0310-859d-f6bbb57e9c96


# c5f2df286e21f263432f1deb39b6ccf6a6ff32c0 03-Jan-2011 Philippe Houdoin <philippe.houdoin@gmail.com>

Switched to use USB_cdc.h definitions.
Expanded search in every configuration, not only first. ELSA USB modem for instance
publish two configurations, the first one being a vendor-specific one for
Windows NT.
ACMDevice now don't assume anymore union functional descriptor is always there.
The data interface index can be found also in Call Management (CM) functional
descriptor.

(Style cleanup pending...)


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40092 a95241bf-73f2-0310-859d-f6bbb57e9c96


# b77aa0155d4296ca41fc23d5216a326a97edd0f1 08-Dec-2010 François Revol <revol@free.fr>

Fix gcc4 build:
- use new(std::nothrow) from <new> since we dropped kernel_cpp.h,
- fix "declared 'extern' and later 'static'" warning,
- fix "deprecated conversion from string constant to 'char*'" warning in tracing code.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39784 a95241bf-73f2-0310-859d-f6bbb57e9c96


# b994a185080e8f2706d5a153496070f7fe7b4d7e 07-Dec-2010 Michael Lotz <mmlr@mlotz.ch>

Port of usb_serial to the generic tty module. I don't remember exactly if or how
well this was working, but since it was non-functional on Haiku anyway this
shouldn't hurt.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39762 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 12f329261557cff6c769a4cb0c23fe8a55bb2622 12-Jun-2008 François Revol <revol@free.fr>

- change KLSI init the way it's done by the linux driver
- do not count usb headers as part of count returned by write(), else we might end up writing more than the passed amount :)


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25939 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 2b07b8e0f1a7f1e76f31db24a21a42cbb01d7b9c 28-May-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Replaced all instances of benaphores in the kernel code by mutexes.
* Removed kernel benaphores.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25690 a95241bf-73f2-0310-859d-f6bbb57e9c96


# dbcfdd5ca72fcd9910b65a9061df902f78b2b3d6 11-Apr-2008 Michael Lotz <mmlr@mlotz.ch>

Correct the way serial devices are deleted. They are either deleted on removal
when they are not open or they are deleted on free when they are already
removed. This should fix the sudden crashes when you unplugged a device that
might not have been fully closed yet.
Also handle the case of removal correctly and don't use the usb_device anymore
after releasing it by returning from the device removed hook. Calls to the
device just return B_DEV_NOT_READY in that case.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24920 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 7aa661d403eac10eab21bcd0facf01c2bcc03c24 19-Jan-2008 Michael Lotz <mmlr@mlotz.ch>

Rework of the usb_serial driver:
* Refactored everything to C++ with the different devices as subclasses
* Added proper ACM detection with parsing of the ACM descriptors
* Added device transfer error handling and fixed some concurency issues
* Big cleanup to conform to our style guide

This should make at least ACM stable to use. Commiting this over my K850i with
ACM compliant USB modem and UMTS data connection. Note that support for all
other device classes (Prolific, FTDI and KLSI) is untested but should work the
same as before. Note also that since we currently lack a TTY module this will
only build/work for R5 or Dano with the proper TTY headers.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23634 a95241bf-73f2-0310-859d-f6bbb57e9c96