Hi, I'm new to pyusb, thinking I have an idea to propose for how
uniformly serial and usb support in Python could be handled ... it
started with this sort of dream vision:

1. I have this gizmo that once upon a time had an old-fashioned 232
   serial interface to the computer. I can talk to it in Python:

   import serial
   giz = serial.serial_for_url(sys.argv[1])  # caller passes /dev/ttyS0

2. But that was then. These days it's the same gizmo with a
   USB-to-serial chip glued on the front. I'd like that to change my
   code as little as possible - maybe even not at all except for what
   the caller sends as argv[1].

   Under the hood a few different things could be going on:

2a. My kernel has a driver for that USB-to-serial chip, and makes a
    native device node.

    import serial
    giz = serial.serial_for_url(sys.argv[1])
    # caller passes /dev/serial/by-id/usb-0683_1550-if01-port0

2b. Maybe the kernel doesn't have a specific driver for that chip, but
    the chip has the right communications USB class and the kernel's
    usbserial generic driver might work with it. Same native device node
    gets created, so nothing changes in Python code, not even the device
    name.

2c. Instead of using an in-kernel driver, maybe pyusb is around and the
    chip is from FTDI...
    import serial
    import ftdi.serialext # ?? see more dream below
    giz = serial.serial_for_url(sys.argv[1])
    # caller passes ftdi://0x0683:0x1550/2

2d. Maybe the chip's an MCT instead? (caution, science fiction ahead)
    import serial
    giz = serial.serial_for_url(sys.argv[1])
    # caller passes mct://0x0711:0x0210/1

2e. Could there be a generic communications-USB-class driver, like the
    one the linux kernel has? (Also science fiction at the moment.)
    import serial
    giz = serial.serial_for_url(sys.argv[1])
    # caller passes usb://0x0683:0x1550/2

Ok, waking up from the dream ....

The current state of things is almost where it could allow all the above
to work.

- pyserial already provides serial_for_url() that can open a native
  serial device node or a "url" with extensible schemes via
  protocol_handler_packages. It already provides a SerialBase class and
  several implementations.

- There's already a UsbSerial base class that extends SerialBase and is
  used as a mixin for the pyftdi driver allowing it to be used as a
  pyserial driver. This should work for other USB-to-serial drivers
  (prolific, mct, whatever) too, or a generic communications-USB-class
  driver.

- That UsbSerial class, and the rest of the 'serialext' package, was
  contributed to pyftdi by Emmanuel Blot, but maybe pyftdi isn't the
  best place for it, because it could be a base mixin for many different
  USB-serial driver protocols and ftdi is just one specific one.

- Maybe it would make sense if pyftdi.serialext became pyusb.serialext
  instead? It is BSD-licensed (unlike the rest of the code in pyftdi,
  which carries LGPL headers) so that much should be a comfortable fit
  with pyusb.

- That way, any Python driver for a USB-serial chip would probably
  import pyusb (as it likely would anyway) and extend UsbSerial.

- Moving serialext would require Emmanuel Blot's agreement for pyftdi,
  and for a while pyftdi would probably have to do try: import
  pyusb.serialext; except ImportError: import pyftdi.serialext; to work
  in old and new cases.

- UsbSerial does import some UsbTools code from pyftdi proper (LGPL),
  most significantly parse_url, which is useful. It would be good to
  have one url-parsing scheme applicable across any USB-serial drivers,
  not just as part of pyftdi. Maybe Emmanuel could be approached about
  allowing BSD licensing for usbtools.py?

- At the moment there isn't a generic,
  don't-care-what-the-chip-is-as-long-as-I-can-bulk-read-write-it
  pure-pyusb driver like the usbserial generic one in the linux kernel.
  I might be interested enough to try writing one at some point. Maybe
  such a generic usb-serial driver would also be at home within pyusb?
  I realize both of these proposals turn pyusb into something slightly
  more than a ctypes wrapper on libusb. Maybe that's not desired, and
  there should just be a package usbserial in its own right, with
  relationships like

      pyserial                      pyusb
         |                            |
         +--------------+-------------+
                        |
                    serialusb
          (UsbSerial base class,
           generic USB-class-based driver)
                        |
        +-------+-------+------------------...
        |       |
      pyftdi    other specific USB-serial chip drivers...


On the other hand, if there is no objection to growing pyusb a little
bit beyond wrapping libusb, that would save creating another separate
package.

Reactions? Does my dream make sense to other pyusb-users readers?

Thanks,
Chapman Flack

------------------------------------------------------------------------------
BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT
Develop your own process in accordance with the BPMN 2 standard
Learn Process modeling best practices with Bonita BPM through live exercises
http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- event?utm_
source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF
_______________________________________________
pyusb-users mailing list
pyusb-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/pyusb-users

Reply via email to