changeset 2366:b42cb1ea1d20

rm - we don't do a kernel module anymore; just usb api
author drewp@bigasterisk.com
date Mon, 05 Jun 2023 17:34:01 -0700
parents b61c2369aa08
children d66ef053faeb
files dmx_usb_module/Changelog dmx_usb_module/Makefile dmx_usb_module/Modules.symvers dmx_usb_module/README dmx_usb_module/dmx.pyx dmx_usb_module/dmx_usb.c dmx_usb_module/dmx_usb.h dmx_usb_module/dmx_usb_test.c dmx_usb_module/pyout dmx_usb_module/setup.py
diffstat 9 files changed, 0 insertions(+), 1648 deletions(-) [+]
line wrap: on
line diff
--- a/dmx_usb_module/Changelog	Sun Jun 04 17:23:23 2023 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-08 Aug 2006 Erwin Rol <erwin@erwinrol.com>
-	* Updated for kernels newer than 2.6.16
-
-16 Jan 2006 Erwin Rol <erwin@erwinrol.com>
-	* Updated for kernels newer than 2.6.13
-
-15 Sep 2004 Erwin Rol <erwin@erwinrol.com>
-	* Added a check to see if the transmit 
-	  buffer is empty before doing the break.
-
--- a/dmx_usb_module/Makefile	Sun Jun 04 17:23:23 2023 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-#
-# $Id: Makefile 38 2004-09-11 11:15:09Z erwin $
-#
-
-ifneq ($(KERNELRELEASE),)
-
-obj-m := dmx_usb.o
-
-else
-
-KDIR	:= /lib/modules/$(shell uname -r)/build
-PWD	:= $(shell pwd)
-
-default:
-	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
-	gcc -O2 -pipe -Wall dmx_usb_test.c -o dmx_usb_test
-
-endif
-
-clean:
-	rm -f *.o *.ko
-	rm -f dmx_usb_test
-	rm -f dmx_usb.mod.c
-	rm -f .dmx_usb.*
-	rm -rf .tmp_versions
-	rm -f Module.markers  modules.order  Module.symvers
-
-
--- a/dmx_usb_module/README	Sun Jun 04 17:23:23 2023 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-The DMX USB driver is a Linux 2.6 kernel driver for the Enttec
-DMX USB dongle ( http://www.enttec.com/dmxusb.php )
-
-Building the driver
-
-Before the driver can be build, the kernel sourcecode needs to be 
-installed. To build the driver just call make, this should build a
-dmx_usb.ko (the kernel module) and a dmx_usb_test(a small test
-program).
-
-Loading the right driver.
-
-A "small" problem to solve was to make the kernel clear that it should 
-use my driver for the dongle and not the standard usbserial driver. 
-Since I don't have any other USBserial devices with the samechip type I 
-just removed the ftdi_sio.ko module, and changed the /etc/hotplug/usb.distmap 
-to point to my module. To support both the ftdi_sio.o module and the 
-dmx_usb.o module the ftdi_sio.o module should be patched and the Product ID 
-for the FT232BM should be removed from it, this will mean all other 
-serial-usb devices are still supported just not the one with FT232BM chips, 
-since it isn't possible to differentiate DMX-USB and normal-serial versions.
- 
--- a/dmx_usb_module/dmx.pyx	Sun Jun 04 17:23:23 2023 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-cdef extern from "fcntl.h":
-    int open(char *pathname, int flags)
-    int O_WRONLY
-
-cdef extern from "unistd.h":
-    int write(int fd, void *buf, int count)
-
-cdef extern from "string.h":
-    char *strncpy(char *dest, char *src, int n)
-
-cdef extern from "Python.h":
-    char* PyString_AsString(object string)
-
-cdef class Dmx:
-    cdef int fd
-    def __cinit__(self, port="/dev/dmx0"):
-        self.fd = open(port, O_WRONLY)
-        if self.fd < 0:
-            raise OSError("open failed")
-
-    def write(self, buf):
-        cdef char *cbuf
-        cbuf = PyString_AsString(buf)
-        if cbuf == NULL:
-            raise ValueError("string buffer conversion failed")
-        res = write(self.fd, cbuf, 513)
-        if res < 0:
-            raise OSError("write failed")
--- a/dmx_usb_module/dmx_usb.c	Sun Jun 04 17:23:23 2023 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,832 +0,0 @@
-/*
- * DMX USB driver
- *
- * Copyright (C) 2004,2006,2010 Erwin Rol (erwin@erwinrol.com)
- *
- * This driver is based on the usb-skeleton driver;
- *
- * Copyright (C) 2001-2003 Greg Kroah-Hartman (greg@kroah.com)
- *
- *	This program is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU General Public License as
- *	published by the Free Software Foundation, version 2.
- *
- */
-
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/init.h>
-#include <linux/slab.h>
-#include <linux/module.h>
-#include <linux/spinlock.h>
-#include <linux/completion.h>
-#include <asm/uaccess.h>
-#include <linux/usb.h>
-#include <linux/version.h>
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
-#include <linux/semaphore.h>
-#else
-#include <asm/semaphore.h>
-#endif
-
-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,36) )
-#define init_MUTEX(LOCKNAME) sema_init(LOCKNAME,1);
-#endif
-
-#include "dmx_usb.h"
-
-#ifdef CONFIG_USB_DEBUG
-	static int debug = 1;
-#else
-	static int debug;
-#endif
-
-/* Use our own dbg macro */
-#undef dbg
-#define dbg(format, arg...) do { if (debug) printk(KERN_DEBUG __FILE__ ": " format "\n" , ## arg); } while (0)
-
-#ifndef info
-#define info(format, arg...) do { printk(KERN_INFO __FILE__ ": " format "\n" , ## arg); } while (0)
-#endif
-
-#ifndef err
-#define err(format, arg...) do { printk(KERN_INFO __FILE__ ": (error) " format "\n" , ## arg); } while (0)
-#endif
-
-/* Version Information */
-#define DRIVER_VERSION "v0.1.20111215"
-#define DRIVER_AUTHOR "Erwin Rol, erwin@erwinrol.com"
-#define DRIVER_DESC "DMX USB Driver"
-
-/* Module parameters */
-#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16) )
-MODULE_PARM(debug, "i");
-MODULE_PARM_DESC(debug, "Debug enabled or not");
-#else
-//module_param(debug, bool, S_IRUGO | S_IWUSR);
-//MODULE_PARM_DESC(debug, "Debug enabled or not");
-#endif
-
-static struct usb_device_id dmx_usb_table [] = {
-	{ USB_DEVICE_VER(FTDI_VID, FTDI_8U232AM_PID, 0x400, 0xffff) },
-	{ USB_DEVICE_VER(FTDI_VID, FTDI_8U232AM_ALT_PID, 0x400, 0xffff) },
-	{ }                                             /* Terminating entry */
-};
-
-MODULE_DEVICE_TABLE (usb, dmx_usb_table);
-
-/* Get a minor range for your devices from the usb maintainer */
-#define DMX_USB_MINOR_BASE	192
-
-/* Structure to hold all of our device specific stuff */
-struct dmx_usb_device {
-	struct usb_device *	udev;			/* save off the usb device pointer */
-	struct usb_interface *	interface;		/* the interface for this device */
-	unsigned char		minor;			/* the starting minor number for this device */
-	unsigned char		num_ports;		/* the number of ports this device has */
-	char			num_interrupt_in;	/* number of interrupt in endpoints we have */
-	char			num_bulk_in;		/* number of bulk in endpoints we have */
-	char			num_bulk_out;		/* number of bulk out endpoints we have */
-
-	unsigned char *		bulk_in_buffer;		/* the buffer to receive data */
-	size_t			bulk_in_size;		/* the size of the receive buffer */
-	__u8			bulk_in_endpointAddr;	/* the address of the bulk in endpoint */
-
-	unsigned char *		bulk_out_buffer;	/* the buffer to send data */
-	size_t			bulk_out_size;		/* the size of the send buffer */
-	struct urb *		write_urb;		/* the urb used to send data */
-	__u8			bulk_out_endpointAddr;	/* the address of the bulk out endpoint */
-	atomic_t		write_busy;		/* true iff write urb is busy */
-	struct completion	write_finished;		/* wait for the write to finish */
-
-	int			open;			/* if the port is open or not */
-	int			present;		/* if the device is not disconnected */
-	struct semaphore	sem;			/* locks this structure */
-};
-
-
-/* prevent races between open() and disconnect() */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)
-	static DECLARE_MUTEX(disconnect_sem);
-#else
-	static DEFINE_SEMAPHORE(disconnect_sem);
-#endif
-
-/* local function prototypes */
-//static ssize_t dmx_usb_read	(struct file *file, char *buffer, size_t count, loff_t *ppos);
-static ssize_t dmx_usb_write	(struct file *file, const char *buffer, size_t count, loff_t *ppos);
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37) )
-static int dmx_usb_ioctl	(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);
-#else
-static long dmx_usb_ioctl	(struct file *file, unsigned int cmd, unsigned long arg);
-#endif
-static int dmx_usb_open		(struct inode *inode, struct file *file);
-static int dmx_usb_release	(struct inode *inode, struct file *file);
-
-static int dmx_usb_probe	(struct usb_interface *interface, const struct usb_device_id *id);
-static void dmx_usb_disconnect	(struct usb_interface *interface);
-
-static void dmx_usb_write_bulk_callback	(struct urb *urb);
-
-static struct file_operations dmx_usb_fops = {
-	/*
-	 * The owner field is part of the module-locking
-	 * mechanism. The idea is that the kernel knows
-	 * which module to increment the use-counter of
-	 * BEFORE it calls the device's open() function.
-	 * This also means that the kernel can decrement
-	 * the use-counter again before calling release()
-	 * or should the open() function fail.
-	 */
-	.owner =	THIS_MODULE,
-
-	/* .read =		dmx_usb_read, */
-	.write =		dmx_usb_write,
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37) )
-	.ioctl		=	dmx_usb_ioctl,
-#else
-	.unlocked_ioctl =	dmx_usb_ioctl,
-#endif
-	.open =			dmx_usb_open,
-	.release =		dmx_usb_release,
-};
-
-/*
- * usb class driver info in order to get a minor number from the usb core,
- * and to have the device registered with devfs and the driver core
- */
-static struct usb_class_driver dmx_usb_class = {
-	.name =		"usb/dmx%d",
-	.fops =		&dmx_usb_fops,
-	.minor_base =	DMX_USB_MINOR_BASE,
-};
-
-/* usb specific object needed to register this driver with the usb subsystem */
-static struct usb_driver dmx_usb_driver = {
-#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16) )
-	.owner =	THIS_MODULE,
-#endif
-	.name =		"dmx_usb",
-	.probe =	dmx_usb_probe,
-	.disconnect =	dmx_usb_disconnect,
-	.id_table =	dmx_usb_table,
-};
-
-#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34) )
-static inline void *usb_alloc_coherent(struct usb_device *dev, size_t size,
-                                    gfp_t mem_flags, dma_addr_t *dma)
-{
-	return usb_buffer_alloc(dev, size, mem_flags, dma);
-}
-
-static inline void usb_free_coherent(struct usb_device *dev, size_t size,
-                                  void *addr, dma_addr_t dma)
-{
-	return usb_buffer_free(dev, size, addr, dma);
-}
-#endif
-
-/**
- */
-static inline void dmx_usb_debug_data (const char *function, int size, const unsigned char *data)
-{
-	int i;
-
-	if (!debug)
-		return;
-
-	printk (KERN_DEBUG __FILE__": %s - length = %d, data = ",
-		function, size);
-	for (i = 0; i < size; ++i) {
-		printk ("%.2x ", data[i]);
-	}
-	printk ("\n");
-}
-
-static __u32 dmx_usb_baud_to_divisor(int baud)
-{
-	static const unsigned char divfrac[8] = { 0, 3, 2, 4, 1, 5, 6, 7 };
-	__u32 divisor;
-	int divisor3 = 48000000 / 2 / baud; // divisor shifted 3 bits to the left
-	divisor = divisor3 >> 3;
-	divisor |= (__u32)divfrac[divisor3 & 0x7] << 14;
-	/* Deal with special cases for highest baud rates. */
-	if (divisor == 1) divisor = 0; else     // 1.0
-	if (divisor == 0x4001) divisor = 1;     // 1.5
-	return divisor;
-}
-
-static int dmx_usb_set_speed(struct dmx_usb_device* dev)
-{
-	char *buf;
-	__u16 urb_value;
-	__u16 urb_index;
-	__u32 urb_index_value;
-	int rv;
-
-	buf = kmalloc(1, GFP_NOIO);
-	if (!buf)
-		return -ENOMEM;
-
-	urb_index_value = dmx_usb_baud_to_divisor(250000);
-	urb_value = (__u16)urb_index_value;
-	urb_index = (__u16)(urb_index_value >> 16);
-
-	rv = usb_control_msg(dev->udev,
-				usb_sndctrlpipe(dev->udev, 0),
-				FTDI_SIO_SET_BAUDRATE_REQUEST,
-				FTDI_SIO_SET_BAUDRATE_REQUEST_TYPE,
-				urb_value, urb_index,
-				buf, 0, HZ*10);
-
-	kfree(buf);
-	return rv;
-}
-
-static int dmx_usb_setup(struct dmx_usb_device* dev)
-{
-	__u16 urb_value;
-	char buf[1];
-
-	urb_value = FTDI_SIO_SET_DATA_STOP_BITS_2 | FTDI_SIO_SET_DATA_PARITY_NONE;
-	urb_value |= 8; // number of data bits
-
-	if (usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0),
-				FTDI_SIO_SET_DATA_REQUEST,
-				FTDI_SIO_SET_DATA_REQUEST_TYPE,
-				urb_value , 0,
-				buf, 0, HZ*10) < 0) {
-		err("%s FAILED to set databits/stopbits/parity", __FUNCTION__);
-	}
-
-	if (usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0),
-				FTDI_SIO_SET_FLOW_CTRL_REQUEST,
-				FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
-				0, 0,
-				buf, 0, HZ*10) < 0) {
-		err("%s error from disable flowcontrol urb", __FUNCTION__);
-	}
-
-	dmx_usb_set_speed(dev);
-
-	return 0;
-}
-
-static void dmx_usb_set_break(struct dmx_usb_device* dev, int break_state)
-{
-	__u16 urb_value = FTDI_SIO_SET_DATA_STOP_BITS_2 | FTDI_SIO_SET_DATA_PARITY_NONE | 8;
-
-	char buf[2];
-
-	if (break_state) {
-		urb_value |= FTDI_SIO_SET_BREAK;
-	}
-
-	if (usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0),
-				FTDI_SIO_SET_DATA_REQUEST,
-				FTDI_SIO_SET_DATA_REQUEST_TYPE,
-				urb_value , 0,
-				buf, 2, HZ*10) < 0) {
-		err("%s FAILED to enable/disable break state (state was %d)", __FUNCTION__,break_state);
-	}
-
-
-	dbg("%s break state is %d - urb is %d", __FUNCTION__,break_state, urb_value);
-}
-
-/**
- */
-static inline void dmx_usb_delete (struct dmx_usb_device *dev)
-{
-	kfree (dev->bulk_in_buffer);
-	usb_free_coherent (dev->udev, dev->bulk_out_size,
-				dev->bulk_out_buffer,
-				dev->write_urb->transfer_dma);
-	usb_free_urb (dev->write_urb);
-	kfree (dev);
-}
-
-
-/**
- */
-static int dmx_usb_open (struct inode *inode, struct file *file)
-{
-	struct dmx_usb_device *dev = NULL;
-	struct usb_interface *interface;
-	int subminor;
-	int retval = 0;
-
-	dbg("%s", __FUNCTION__);
-
-	subminor = iminor(inode);
-
-	/* prevent disconnects */
-	down (&disconnect_sem);
-
-	interface = usb_find_interface (&dmx_usb_driver, subminor);
-	if (!interface) {
-		err ("%s - error, can't find device for minor %d",
-		     __FUNCTION__, subminor);
-		retval = -ENODEV;
-		goto exit_no_device;
-	}
-
-	dev = usb_get_intfdata(interface);
-	if (!dev) {
-		retval = -ENODEV;
-		goto exit_no_device;
-	}
-
-	/* lock this device */
-	down (&dev->sem);
-
-	/* increment our usage count for the driver */
-	++dev->open;
-
-	/* save our object in the file's private structure */
-	file->private_data = dev;
-
-	/* unlock this device */
-	up (&dev->sem);
-
-exit_no_device:
-	up (&disconnect_sem);
-	return retval;
-}
-
-
-/**
- */
-static int dmx_usb_release (struct inode *inode, struct file *file)
-{
-	struct dmx_usb_device *dev;
-	int retval = 0;
-
-	dev = (struct dmx_usb_device *)file->private_data;
-	if (dev == NULL) {
-		dbg ("%s - object is NULL", __FUNCTION__);
-		return -ENODEV;
-	}
-
-	dbg("%s - minor %d", __FUNCTION__, dev->minor);
-
-	/* lock our device */
-	down (&dev->sem);
-
-	if (dev->open <= 0) {
-		dbg ("%s - device not opened", __FUNCTION__);
-		retval = -ENODEV;
-		goto exit_not_opened;
-	}
-
-	/* wait for any bulk writes that might be going on to finish up */
-	if (atomic_read (&dev->write_busy))
-		wait_for_completion (&dev->write_finished);
-
-	--dev->open;
-
-	if (!dev->present && !dev->open) {
-		/* the device was unplugged before the file was released */
-		up (&dev->sem);
-		dmx_usb_delete (dev);
-		return 0;
-	}
-
-exit_not_opened:
-	up (&dev->sem);
-
-	return retval;
-}
-
-#if 0 
-
-Read is not yet supported
-
-/**
- */
-static ssize_t dmx_usb_read (struct file *file, char *buffer, size_t count, loff_t *ppos)
-{
-	struct dmx_usb_device *dev;
-	int retval = 0;
-	int bytes_read;
-
-	dev = (struct dmx_usb_device *)file->private_data;
-
-	dbg("%s - minor %d, count = %Zd", __FUNCTION__, dev->minor, count);
-
-	/* lock this object */
-	down (&dev->sem);
-
-	/* verify that the device wasn't unplugged */
-	if (!dev->present) {
-		up (&dev->sem);
-		return -ENODEV;
-	}
-
-	/* do a blocking bulk read to get data from the device */
-	retval = usb_bulk_msg (dev->udev,
-			       usb_rcvbulkpipe (dev->udev,
-						dev->bulk_in_endpointAddr),
-			       dev->bulk_in_buffer,
-			       min (dev->bulk_in_size, count),
-			       &bytes_read, HZ*10);
-
-	/* if the read was successful, copy the data to userspace */
-	if (!retval) {
-		if (copy_to_user (buffer, dev->bulk_in_buffer+2, bytes_read-2))
-			retval = -EFAULT;
-		else
-			retval = bytes_read;
-	}
-
-	/* unlock the device */
-	up (&dev->sem);
-	return retval;
-}
-
-#endif
-
-static __u16 dmx_usb_get_status(struct dmx_usb_device* dev)
-{
-	int retval = 0;
-	int count = 0;
-	__u16 buf;
-
-	retval = usb_bulk_msg (dev->udev,
-				usb_rcvbulkpipe (dev->udev, dev->bulk_in_endpointAddr),
-				&buf, 2, &count, HZ*10);
-
-	if (retval)
-		return 0;
-
-	return buf;
-}
-
-
-
-/**
- *	dmx_usb_write
- *
- *	A device driver has to decide how to report I/O errors back to the
- *	user.  The safest course is to wait for the transfer to finish before
- *	returning so that any errors will be reported reliably.  dmx_usb_read()
- *	works like this.  But waiting for I/O is slow, so many drivers only
- *	check for errors during I/O initiation and do not report problems
- *	that occur during the actual transfer.  That's what we will do here.
- *
- *	A driver concerned with maximum I/O throughput would use double-
- *	buffering:  Two urbs would be devoted to write transfers, so that
- *	one urb could always be active while the other was waiting for the
- *	user to send more data.
- */
-static ssize_t dmx_usb_write (struct file *file, const char *buffer, size_t count, loff_t *ppos)
-{
-	struct dmx_usb_device *dev;
-	ssize_t bytes_written = 0;
-	int retval = 0;
-	__u16 stat;
-
-	dev = (struct dmx_usb_device *)file->private_data;
-
-	dbg("%s - minor %d, count = %Zd", __FUNCTION__, dev->minor, count);
-
-	/* lock this object */
-	down (&dev->sem);
-
-	/* verify that the device wasn't unplugged */
-	if (!dev->present) {
-		retval = -ENODEV;
-		goto exit;
-	}
-
-	/* verify that we actually have some data to write */
-	if (count == 0) {
-		dbg("%s - write request of 0 bytes", __FUNCTION__);
-		goto exit;
-	}
-
-	/* wait for a previous write to finish up; we don't use a timeout
-	 * and so a nonresponsive device can delay us indefinitely.
-	 */
-	if (atomic_read (&dev->write_busy))
-		wait_for_completion (&dev->write_finished);
-
-	/* we can only write as much as our buffer will hold */
-	bytes_written = min (dev->bulk_out_size, count);
-
-	/* copy the data from userspace into our transfer buffer;
-	 * this is the only copy required.
-	 */
-	if (copy_from_user(dev->write_urb->transfer_buffer, buffer,
-			   bytes_written)) {
-		retval = -EFAULT;
-		goto exit;
-	}
-
-	dmx_usb_debug_data (__FUNCTION__, bytes_written,
-			     dev->write_urb->transfer_buffer);
-
-	/* this urb was already set up, except for this write size */
-	dev->write_urb->transfer_buffer_length = bytes_written;
-
-	/* Poll the device to see if the transmit buffer is empty */
-	do {
-		stat = dmx_usb_get_status(dev);
-		if (stat == 0) {
-			retval = -EFAULT;
-			goto exit;
-		}
-	} while ( (stat & ((FTDI_RS_TEMT) << 8) ) == 0 ) ;
-
-	/* the transmit buffer is empty, now toggle the break */
-	dmx_usb_set_break(dev, 1);
-	dmx_usb_set_break(dev, 0);
-
-	/* send the data out the bulk port */
-	/* a character device write uses GFP_KERNEL,
-	 unless a spinlock is held */
-	init_completion (&dev->write_finished);
-	atomic_set (&dev->write_busy, 1);
-	retval = usb_submit_urb(dev->write_urb, GFP_KERNEL);
-	if (retval) {
-		atomic_set (&dev->write_busy, 0);
-		err("%s - failed submitting write urb, error %d",
-		    __FUNCTION__, retval);
-	} else {
-		retval = bytes_written;
-	}
-
-exit:
-	/* unlock the device */
-	up (&dev->sem);
-
-	return retval;
-}
-
-
-/**
- */
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37) )
-static int dmx_usb_ioctl (struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
-#else
-static long dmx_usb_ioctl (struct file *file, unsigned int cmd, unsigned long arg)
-#endif
-{
-	struct dmx_usb_device *dev;
-
-	dev = (struct dmx_usb_device *)file->private_data;
-
-	/* lock this object */
-	down (&dev->sem);
-
-	/* verify that the device wasn't unplugged */
-	if (!dev->present) {
-		up (&dev->sem);
-		return -ENODEV;
-	}
-
-	dbg("%s - minor %d, cmd 0x%.4x, arg %ld", __FUNCTION__,
-	    dev->minor, cmd, arg);
-
-	/* fill in your device specific stuff here */
-
-	/* unlock the device */
-	up (&dev->sem);
-
-	/* return that we did not understand this ioctl call */
-	return -ENOTTY;
-}
-
-
-/**
- */
-static void dmx_usb_write_bulk_callback (struct urb *urb)
-{
-	struct dmx_usb_device *dev = (struct dmx_usb_device *)urb->context;
-
-	dbg("%s - minor %d", __FUNCTION__, dev->minor);
-
-	/* sync/async unlink faults aren't errors */
-	if (urb->status && !(urb->status == -ENOENT ||
-				urb->status == -ECONNRESET)) {
-		dbg("%s - nonzero write bulk status received: %d",
-		    __FUNCTION__, urb->status);
-	}
-
-	/* notify anyone waiting that the write has finished */
-	atomic_set (&dev->write_busy, 0);
-	complete (&dev->write_finished);
-}
-
-/**
- *
- *	Called by the usb core when a new device is connected that it thinks
- *	this driver might be interested in.
- */
-static int dmx_usb_probe(struct usb_interface *interface, const struct usb_device_id *id)
-{
-	struct usb_device *udev = interface_to_usbdev(interface);
-	struct dmx_usb_device *dev = NULL;
-	struct usb_host_interface *iface_desc;
-	struct usb_endpoint_descriptor *endpoint;
-	size_t buffer_size;
-	int i;
-	int retval = -ENOMEM;
-
-	/* See if the device offered us matches what we can accept */
-	if ((le16_to_cpu(udev->descriptor.idVendor) != FTDI_VID) ||
-	    (le16_to_cpu(udev->descriptor.idProduct) != FTDI_8U232AM_PID)) {
-		return -ENODEV;
-	}
-
-	/* allocate memory for our device state and initialize it */
-	dev = kmalloc (sizeof(struct dmx_usb_device), GFP_KERNEL);
-	if (dev == NULL) {
-		err ("Out of memory");
-		return -ENOMEM;
-	}
-	memset (dev, 0x00, sizeof (*dev));
-
-	init_MUTEX (&dev->sem);
-	dev->udev = udev;
-	dev->interface = interface;
-
-	/* set up the endpoint information */
-	/* check out the endpoints */
-	/* use only the first bulk-in and bulk-out endpoints */
-	iface_desc = &interface->altsetting[0];
-	for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
-		endpoint = &iface_desc->endpoint[i].desc;
-
-		if (!dev->bulk_in_endpointAddr &&
-		    (endpoint->bEndpointAddress & USB_DIR_IN) &&
-		    ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
-					== USB_ENDPOINT_XFER_BULK)) {
-			/* we found a bulk in endpoint */
-			buffer_size = endpoint->wMaxPacketSize;
-			dev->bulk_in_size = buffer_size;
-			dev->bulk_in_endpointAddr = endpoint->bEndpointAddress;
-			dev->bulk_in_buffer = kmalloc (buffer_size, GFP_KERNEL);
-			if (!dev->bulk_in_buffer) {
-				err("Couldn't allocate bulk_in_buffer");
-				goto error;
-			}
-		}
-
-		if (!dev->bulk_out_endpointAddr &&
-		    !(endpoint->bEndpointAddress & USB_DIR_IN) &&
-		    ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
-					== USB_ENDPOINT_XFER_BULK)) {
-			/* we found a bulk out endpoint */
-			/* a probe() may sleep and has no restrictions on memory allocations */
-			dev->write_urb = usb_alloc_urb(0, GFP_KERNEL);
-			if (!dev->write_urb) {
-				err("No free urbs available");
-				goto error;
-			}
-			dev->bulk_out_endpointAddr = endpoint->bEndpointAddress;
-
-			/* on some platforms using this kind of buffer alloc
-			 * call eliminates a dma "bounce buffer".
-			 *
-			 * NOTE: you'd normally want i/o buffers that hold
-			 * more than one packet, so that i/o delays between
-			 * packets don't hurt throughput.
-			 */
-			buffer_size = endpoint->wMaxPacketSize;
-			dev->bulk_out_size = 513;
-			dev->write_urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
-			dev->bulk_out_buffer = usb_alloc_coherent (udev,
-					buffer_size, GFP_KERNEL,
-					&dev->write_urb->transfer_dma);
-			if (!dev->bulk_out_buffer) {
-				err("Couldn't allocate bulk_out_buffer");
-				goto error;
-			}
-			usb_fill_bulk_urb(dev->write_urb, udev,
-				      usb_sndbulkpipe(udev,
-						      endpoint->bEndpointAddress),
-				      dev->bulk_out_buffer, buffer_size,
-				      dmx_usb_write_bulk_callback, dev);
-		}
-	}
-	if (!(dev->bulk_in_endpointAddr && dev->bulk_out_endpointAddr)) {
-		err("Couldn't find both bulk-in and bulk-out endpoints");
-		goto error;
-	}
-
-	dmx_usb_setup(dev);
-
-	/* allow device read, write and ioctl */
-	dev->present = 1;
-
-	/* we can register the device now, as it is ready */
-	usb_set_intfdata (interface, dev);
-	retval = usb_register_dev (interface, &dmx_usb_class);
-	if (retval) {
-		/* something prevented us from registering this driver */
-		err ("Not able to get a minor for this device.");
-		usb_set_intfdata (interface, NULL);
-		goto error;
-	}
-
-	dev->minor = interface->minor;
-
-	/* let the user know what node this device is now attached to */
-	info ("DMX USB device now attached to dmx%d", dev->minor);
-	return 0;
-
-error:
-	dmx_usb_delete (dev);
-	return retval;
-}
-
-
-/**
- *
- *	Called by the usb core when the device is removed from the system.
- *
- *	This routine guarantees that the driver will not submit any more urbs
- *	by clearing dev->udev.  It is also supposed to terminate any currently
- *	active urbs.  Unfortunately, usb_bulk_msg(), used in dmx_usb_read(), does
- *	not provide any way to do this.  But at least we can cancel an active
- *	write.
- */
-static void dmx_usb_disconnect(struct usb_interface *interface)
-{
-	struct dmx_usb_device *dev;
-	int minor;
-
-	/* prevent races with open() */
-	down (&disconnect_sem);
-
-	dev = usb_get_intfdata (interface);
-	usb_set_intfdata (interface, NULL);
-
-	down (&dev->sem);
-
-	minor = dev->minor;
-
-	/* give back our minor */
-	usb_deregister_dev (interface, &dmx_usb_class);
-
-	/* terminate an ongoing write */
-	if (atomic_read (&dev->write_busy)) {
-		usb_unlink_urb (dev->write_urb);
-		wait_for_completion (&dev->write_finished);
-	}
-
-	/* prevent device read, write and ioctl */
-	dev->present = 0;
-
-	up (&dev->sem);
-
-	/* if the device is opened, dmx_usb_release will clean this up */
-	if (!dev->open)
-		dmx_usb_delete (dev);
-
-	up (&disconnect_sem);
-
-	info("DMX USB #%d now disconnected", minor);
-}
-
-
-
-/**
- *	dmx_usb_init
- */
-static int __init dmx_usb_init(void)
-{
-	int result;
-
-	/* register this driver with the USB subsystem */
-	result = usb_register(&dmx_usb_driver);
-	if (result) {
-		err("usb_register failed. Error number %d",
-		    result);
-		return result;
-	}
-
-	info(DRIVER_DESC " " DRIVER_VERSION);
-	return 0;
-}
-
-
-/**
- *	dmx_usb_exit
- */
-static void __exit dmx_usb_exit(void)
-{
-	/* deregister this driver with the USB subsystem */
-	usb_deregister(&dmx_usb_driver);
-}
-
-
-module_init (dmx_usb_init);
-module_exit (dmx_usb_exit);
-
-MODULE_AUTHOR(DRIVER_AUTHOR);
-MODULE_DESCRIPTION(DRIVER_DESC);
-MODULE_LICENSE("GPL");
-
--- a/dmx_usb_module/dmx_usb.h	Sun Jun 04 17:23:23 2023 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,663 +0,0 @@
-/*
- * Definitions for the FTDI USB Single Port Serial Converter - 
- * known as FTDI_SIO (Serial Input/Output application of the chipset) 
- *
- * The example I have is known as the USC-1000 which is available from
- * http://www.dse.co.nz - cat no XH4214 It looks similar to this:
- * http://www.dansdata.com/usbser.htm but I can't be sure There are other
- * USC-1000s which don't look like my device though so beware!
- *
- * The device is based on the FTDI FT8U100AX chip. It has a DB25 on one side, 
- * USB on the other.
- *
- * Thanx to FTDI (http://www.ftdi.co.uk) for so kindly providing details
- * of the protocol required to talk to the device and ongoing assistence
- * during development.
- *
- * Bill Ryder - bryder@sgi.com formerly of Silicon Graphics, Inc.- wrote the 
- * FTDI_SIO implementation.
- *
- * Philipp Gühring - pg@futureware.at - added the Device ID of the USB relais
- * from Rudolf Gugler
- *
- * $Id: dmx_usb.h 40 2004-09-11 11:16:39Z erwin $
- */
-
-#define FTDI_VID	0x0403	/* Vendor Id */
-#define FTDI_SIO_PID	0x8372	/* Product Id SIO application of 8U100AX  */
-#define FTDI_8U232AM_PID 0x6001 /* Similar device to SIO above */
-#define FTDI_8U232AM_ALT_PID 0x6006 /* FTDI's alternate PID for above */
-#define FTDI_RELAIS_PID	0xFA10  /* Relais device from Rudolf Gugler */
-#define FTDI_NF_RIC_VID	0x0DCD	/* Vendor Id */
-#define FTDI_NF_RIC_PID	0x0001	/* Product Id */
-
-/* www.irtrans.de device */
-#define FTDI_IRTRANS_PID 0xFC60 /* Product Id */
-
-/* www.crystalfontz.com devices - thanx for providing free devices for evaluation ! */
-/* they use the ftdi chipset for the USB interface and the vendor id is the same */
-#define FTDI_XF_632_PID 0xFC08	/* 632: 16x2 Character Display */
-#define FTDI_XF_634_PID 0xFC09	/* 634: 20x4 Character Display */
-#define FTDI_XF_547_PID 0xFC0A	/* 547: Two line Display */
-#define FTDI_XF_633_PID 0xFC0B	/* 633: 16x2 Character Display with Keys */
-#define FTDI_XF_631_PID 0xFC0C	/* 631: 20x2 Character Display */
-#define FTDI_XF_635_PID 0xFC0D	/* 635: 20x4 Character Display */
-#define FTDI_XF_640_PID 0xFC0E	/* 640: Two line Display */
-#define FTDI_XF_642_PID 0xFC0F	/* 642: Two line Display */
-
-/* Video Networks Limited / Homechoice in the UK use an ftdi-based device for their 1Mb */
-/* broadband internet service.  The following PID is exhibited by the usb device supplied */
-/* (the VID is the standard ftdi vid (FTDI_VID) */
-#define FTDI_VNHCPCUSB_D_PID 0xfe38 /* Product Id */
-
-/*
- * The following are the values for the Matrix Orbital LCD displays,
- * which are the FT232BM ( similar to the 8U232AM )
- */
-#define FTDI_MTXORB_0_PID      0xFA00  /* Matrix Orbital Product Id */
-#define FTDI_MTXORB_1_PID      0xFA01  /* Matrix Orbital Product Id */
-#define FTDI_MTXORB_2_PID      0xFA02  /* Matrix Orbital Product Id */
-#define FTDI_MTXORB_3_PID      0xFA03  /* Matrix Orbital Product Id */
-#define FTDI_MTXORB_4_PID      0xFA04  /* Matrix Orbital Product Id */
-#define FTDI_MTXORB_5_PID      0xFA05  /* Matrix Orbital Product Id */
-#define FTDI_MTXORB_6_PID      0xFA06  /* Matrix Orbital Product Id */
-
-/*
- * The following are the values for the Perle Systems
- * UltraPort USB serial converters
- */
-#define FTDI_PERLE_ULTRAPORT_PID 0xF0C0	/* Perle UltraPort Product Id */
-
-/*
- * The following are the values for the Sealevel SeaLINK+ adapters.
- * (Original list sent by Tuan Hoang.  Ian Abbott renamed the macros and
- * removed some PIDs that don't seem to match any existing products.)
- */
-#define SEALEVEL_VID		0x0c52	/* Sealevel Vendor ID */
-#define SEALEVEL_2101_PID	0x2101	/* SeaLINK+232 (2101/2105) */
-#define SEALEVEL_2102_PID	0x2102	/* SeaLINK+485 (2102) */
-#define SEALEVEL_2103_PID	0x2103	/* SeaLINK+232I (2103) */
-#define SEALEVEL_2104_PID	0x2104	/* SeaLINK+485I (2104) */
-#define SEALEVEL_2201_1_PID	0x2211	/* SeaPORT+2/232 (2201) Port 1 */
-#define SEALEVEL_2201_2_PID	0x2221	/* SeaPORT+2/232 (2201) Port 2 */
-#define SEALEVEL_2202_1_PID	0x2212	/* SeaPORT+2/485 (2202) Port 1 */
-#define SEALEVEL_2202_2_PID	0x2222	/* SeaPORT+2/485 (2202) Port 2 */
-#define SEALEVEL_2203_1_PID	0x2213	/* SeaPORT+2 (2203) Port 1 */
-#define SEALEVEL_2203_2_PID	0x2223	/* SeaPORT+2 (2203) Port 2 */
-#define SEALEVEL_2401_1_PID	0x2411	/* SeaPORT+4/232 (2401) Port 1 */
-#define SEALEVEL_2401_2_PID	0x2421	/* SeaPORT+4/232 (2401) Port 2 */
-#define SEALEVEL_2401_3_PID	0x2431	/* SeaPORT+4/232 (2401) Port 3 */
-#define SEALEVEL_2401_4_PID	0x2441	/* SeaPORT+4/232 (2401) Port 4 */
-#define SEALEVEL_2402_1_PID	0x2412	/* SeaPORT+4/485 (2402) Port 1 */
-#define SEALEVEL_2402_2_PID	0x2422	/* SeaPORT+4/485 (2402) Port 2 */
-#define SEALEVEL_2402_3_PID	0x2432	/* SeaPORT+4/485 (2402) Port 3 */
-#define SEALEVEL_2402_4_PID	0x2442	/* SeaPORT+4/485 (2402) Port 4 */
-#define SEALEVEL_2403_1_PID	0x2413	/* SeaPORT+4 (2403) Port 1 */
-#define SEALEVEL_2403_2_PID	0x2423	/* SeaPORT+4 (2403) Port 2 */
-#define SEALEVEL_2403_3_PID	0x2433	/* SeaPORT+4 (2403) Port 3 */
-#define SEALEVEL_2403_4_PID	0x2443	/* SeaPORT+4 (2403) Port 4 */
-#define SEALEVEL_2801_1_PID	0X2811	/* SeaLINK+8/232 (2801) Port 1 */
-#define SEALEVEL_2801_2_PID	0X2821	/* SeaLINK+8/232 (2801) Port 2 */
-#define SEALEVEL_2801_3_PID	0X2831	/* SeaLINK+8/232 (2801) Port 3 */
-#define SEALEVEL_2801_4_PID	0X2841	/* SeaLINK+8/232 (2801) Port 4 */
-#define SEALEVEL_2801_5_PID	0X2851	/* SeaLINK+8/232 (2801) Port 5 */
-#define SEALEVEL_2801_6_PID	0X2861	/* SeaLINK+8/232 (2801) Port 6 */
-#define SEALEVEL_2801_7_PID	0X2871	/* SeaLINK+8/232 (2801) Port 7 */
-#define SEALEVEL_2801_8_PID	0X2881	/* SeaLINK+8/232 (2801) Port 8 */
-#define SEALEVEL_2802_1_PID	0X2812	/* SeaLINK+8/485 (2802) Port 1 */
-#define SEALEVEL_2802_2_PID	0X2822	/* SeaLINK+8/485 (2802) Port 2 */
-#define SEALEVEL_2802_3_PID	0X2832	/* SeaLINK+8/485 (2802) Port 3 */
-#define SEALEVEL_2802_4_PID	0X2842	/* SeaLINK+8/485 (2802) Port 4 */
-#define SEALEVEL_2802_5_PID	0X2852	/* SeaLINK+8/485 (2802) Port 5 */
-#define SEALEVEL_2802_6_PID	0X2862	/* SeaLINK+8/485 (2802) Port 6 */
-#define SEALEVEL_2802_7_PID	0X2872	/* SeaLINK+8/485 (2802) Port 7 */
-#define SEALEVEL_2802_8_PID	0X2882	/* SeaLINK+8/485 (2802) Port 8 */
-#define SEALEVEL_2803_1_PID	0X2813	/* SeaLINK+8 (2803) Port 1 */
-#define SEALEVEL_2803_2_PID	0X2823 	/* SeaLINK+8 (2803) Port 2 */
-#define SEALEVEL_2803_3_PID	0X2833 	/* SeaLINK+8 (2803) Port 3 */
-#define SEALEVEL_2803_4_PID	0X2843 	/* SeaLINK+8 (2803) Port 4 */
-#define SEALEVEL_2803_5_PID	0X2853 	/* SeaLINK+8 (2803) Port 5 */
-#define SEALEVEL_2803_6_PID	0X2863 	/* SeaLINK+8 (2803) Port 6 */
-#define SEALEVEL_2803_7_PID	0X2873 	/* SeaLINK+8 (2803) Port 7 */
-#define SEALEVEL_2803_8_PID	0X2883 	/* SeaLINK+8 (2803) Port 8 */
-
-/*
- * DSS-20 Sync Station for Sony Ericsson P800
- */
- 
-#define FTDI_DSS20_PID          0xFC82  
-
-/*
- * Home Electronics (www.home-electro.com) USB gadgets
- */
-#define FTDI_HE_TIRA1_PID	0xFA78	/* Tira-1 IR tranceiver */
-
-/* USB-UIRT - An infrared receiver and transmitter using the 8U232AM chip */
-/* http://home.earthlink.net/~jrhees/USBUIRT/index.htm */
-#define FTDI_USB_UIRT_PID	0xF850	/* Product Id */
-
-/* ELV USB Module UO100 (PID sent by Stefan Frings) */
-#define FTDI_ELV_UO100_PID	0xFB58	/* Product Id */
-
-/*
- * Definitions for ID TECH (www.idt-net.com) devices
- */
-#define IDTECH_VID		0x0ACD	/* ID TECH Vendor ID */
-#define IDTECH_IDT1221U_PID	0x0300	/* IDT1221U USB to RS-232 adapter */
-
-/*
- * Definitions for Omnidirectional Control Technology, Inc. devices
- */
-#define OCT_VID			0x0B39	/* OCT vendor ID */
-/* Note: OCT US101 is also rebadged as Dick Smith Electronics (NZ) XH6381 */
-#define OCT_US101_PID		0x0421	/* OCT US101 USB to RS-232 */
-
-/* an infrared receiver for user access control with IR tags */
-#define FTDI_PIEGROUP_PID	0xF208	/* Product Id */
-
-/*
- * Protego product ids
- */
-#define PROTEGO_SPECIAL_1	0xFC70	/* special/unknown device */
-#define PROTEGO_R2X0		0xFC71	/* R200-USB TRNG unit (R210, R220, and R230) */
-#define PROTEGO_SPECIAL_3	0xFC72	/* special/unknown device */
-#define PROTEGO_SPECIAL_4	0xFC73	/* special/unknown device */
-
-/*
- * Gude Analog- und Digitalsysteme GmbH
- */
-#define FTDI_GUDEADS_E808_PID    0xE808
-#define FTDI_GUDEADS_E809_PID    0xE809
-#define FTDI_GUDEADS_E80A_PID    0xE80A
-#define FTDI_GUDEADS_E80B_PID    0xE80B
-#define FTDI_GUDEADS_E80C_PID    0xE80C
-#define FTDI_GUDEADS_E80D_PID    0xE80D
-#define FTDI_GUDEADS_E80E_PID    0xE80E
-#define FTDI_GUDEADS_E80F_PID    0xE80F
-#define FTDI_GUDEADS_E888_PID    0xE888  /* Expert ISDN Control USB */
-#define FTDI_GUDEADS_E889_PID    0xE889  /* USB RS-232 OptoBridge */
-#define FTDI_GUDEADS_E88A_PID    0xE88A
-#define FTDI_GUDEADS_E88B_PID    0xE88B
-#define FTDI_GUDEADS_E88C_PID    0xE88C
-#define FTDI_GUDEADS_E88D_PID    0xE88D
-#define FTDI_GUDEADS_E88E_PID    0xE88E
-#define FTDI_GUDEADS_E88F_PID    0xE88F
-
-/*
- * Linx Technologies product ids
- */
-#define LINX_SDMUSBQSS_PID	0xF448	/* Linx SDM-USB-QS-S */
-#define LINX_MASTERDEVEL2_PID   0xF449   /* Linx Master Development 2.0 */
-#define LINX_FUTURE_0_PID   0xF44A   /* Linx future device */
-#define LINX_FUTURE_1_PID   0xF44B   /* Linx future device */
-#define LINX_FUTURE_2_PID   0xF44C   /* Linx future device */
-#define FTDI_GUDEADS_889_PID    0xe889  /* USB RS323 OptoBridge */ 
-/* CCS Inc. ICDU/ICDU40 product ID - the FT232BM is used in an in-circuit-debugger */
-/* unit for PIC16's/PIC18's */
-#define FTDI_CCSICDU20_0_PID    0xF9D0     
-#define FTDI_CCSICDU40_1_PID    0xF9D1     
-
-/* Inside Accesso contactless reader (http://www.insidefr.com) */
-#define INSIDE_ACCESSO		0xFAD0
-
-/* Commands */
-#define FTDI_SIO_RESET 		0 /* Reset the port */
-#define FTDI_SIO_MODEM_CTRL 	1 /* Set the modem control register */
-#define FTDI_SIO_SET_FLOW_CTRL	2 /* Set flow control register */
-#define FTDI_SIO_SET_BAUD_RATE	3 /* Set baud rate */
-#define FTDI_SIO_SET_DATA	4 /* Set the data characteristics of the port */
-#define FTDI_SIO_GET_MODEM_STATUS	5 /* Retrieve current value of modern status register */
-#define FTDI_SIO_SET_EVENT_CHAR	6 /* Set the event character */
-#define FTDI_SIO_SET_ERROR_CHAR	7 /* Set the error character */
-
-/* Port Identifier Table */
-#define PIT_DEFAULT 		0 /* SIOA */
-#define PIT_SIOA		1 /* SIOA */
-/* The device this driver is tested with one has only one port */
-#define PIT_SIOB		2 /* SIOB */
-#define PIT_PARALLEL		3 /* Parallel */
-
-/* FTDI_SIO_RESET */
-#define FTDI_SIO_RESET_REQUEST FTDI_SIO_RESET
-#define FTDI_SIO_RESET_REQUEST_TYPE 0x40
-#define FTDI_SIO_RESET_SIO 0
-#define FTDI_SIO_RESET_PURGE_RX 1
-#define FTDI_SIO_RESET_PURGE_TX 2
-
-/*
- * BmRequestType:  0100 0000B
- * bRequest:       FTDI_SIO_RESET
- * wValue:         Control Value 
- *                   0 = Reset SIO
- *                   1 = Purge RX buffer
- *                   2 = Purge TX buffer
- * wIndex:         Port
- * wLength:        0
- * Data:           None
- *
- * The Reset SIO command has this effect:
- *
- *    Sets flow control set to 'none'
- *    Event char = $0D
- *    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
- *
-   */
-
-/* FTDI_SIO_SET_BAUDRATE */
-#define FTDI_SIO_SET_BAUDRATE_REQUEST_TYPE 0x40
-#define FTDI_SIO_SET_BAUDRATE_REQUEST 3
-
-/*
- * BmRequestType:  0100 0000B
- * bRequest:       FTDI_SIO_SET_BAUDRATE
- * wValue:         BaudDivisor value - see below
- * wIndex:         Port
- * wLength:        0
- * Data:           None
- * 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 FTDI 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 urb value.  Bit 16 is 
- * placed in bit 0 of the urb 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).
- */
-
-typedef enum {
-	SIO = 1,
-	FT8U232AM = 2,
-	FT232BM = 3,
-} ftdi_chip_type_t;
-
-typedef enum {
- ftdi_sio_b300 = 0, 
- ftdi_sio_b600 = 1, 
- ftdi_sio_b1200 = 2,
- ftdi_sio_b2400 = 3,
- ftdi_sio_b4800 = 4,
- ftdi_sio_b9600 = 5,
- ftdi_sio_b19200 = 6,
- ftdi_sio_b38400 = 7,
- ftdi_sio_b57600 = 8,
- ftdi_sio_b115200 = 9
-} FTDI_SIO_baudrate_t ;
-
-/*
- * The ftdi_8U232AM_xxMHz_byyy constants have been removed. The encoded divisor values
- * are calculated internally.
- */
-
-#define FTDI_SIO_SET_DATA_REQUEST FTDI_SIO_SET_DATA
-#define FTDI_SIO_SET_DATA_REQUEST_TYPE 0x40
-#define FTDI_SIO_SET_DATA_PARITY_NONE (0x0 << 8 )
-#define FTDI_SIO_SET_DATA_PARITY_ODD (0x1 << 8 )
-#define FTDI_SIO_SET_DATA_PARITY_EVEN (0x2 << 8 )
-#define FTDI_SIO_SET_DATA_PARITY_MARK (0x3 << 8 )
-#define FTDI_SIO_SET_DATA_PARITY_SPACE (0x4 << 8 )
-#define FTDI_SIO_SET_DATA_STOP_BITS_1 (0x0 << 11 )
-#define FTDI_SIO_SET_DATA_STOP_BITS_15 (0x1 << 11 )
-#define FTDI_SIO_SET_DATA_STOP_BITS_2 (0x2 << 11 )
-#define FTDI_SIO_SET_BREAK (0x1 << 14)
-/* FTDI_SIO_SET_DATA */
-
-/*
- * BmRequestType:  0100 0000B 
- * bRequest:       FTDI_SIO_SET_DATA
- * wValue:         Data characteristics (see below)
- * wIndex:         Port
- * wLength:        0
- * Data:           No
- *
- * 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
- *
- */
-
-
-
-/* FTDI_SIO_MODEM_CTRL */
-#define FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE 0x40
-#define FTDI_SIO_SET_MODEM_CTRL_REQUEST FTDI_SIO_MODEM_CTRL
-
-/* 
- * BmRequestType:   0100 0000B
- * bRequest:        FTDI_SIO_MODEM_CTRL
- * wValue:          ControlValue (see below)
- * wIndex:          Port
- * wLength:         0
- * Data:            None
- *
- * 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
- */
-
-#define FTDI_SIO_SET_DTR_MASK 0x1
-#define FTDI_SIO_SET_DTR_HIGH ( 1 | ( FTDI_SIO_SET_DTR_MASK  << 8))
-#define FTDI_SIO_SET_DTR_LOW  ( 0 | ( FTDI_SIO_SET_DTR_MASK  << 8))
-#define FTDI_SIO_SET_RTS_MASK 0x2
-#define FTDI_SIO_SET_RTS_HIGH ( 2 | ( FTDI_SIO_SET_RTS_MASK << 8 ))
-#define FTDI_SIO_SET_RTS_LOW ( 0 | ( FTDI_SIO_SET_RTS_MASK << 8 ))
-
-/*
- * 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
- */
-
-/* FTDI_SIO_SET_FLOW_CTRL */
-#define FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE 0x40
-#define FTDI_SIO_SET_FLOW_CTRL_REQUEST FTDI_SIO_SET_FLOW_CTRL
-#define FTDI_SIO_DISABLE_FLOW_CTRL 0x0 
-#define FTDI_SIO_RTS_CTS_HS (0x1 << 8)
-#define FTDI_SIO_DTR_DSR_HS (0x2 << 8)
-#define FTDI_SIO_XON_XOFF_HS (0x4 << 8)
-/*
- *   BmRequestType:  0100 0000b
- *   bRequest:       FTDI_SIO_SET_FLOW_CTRL
- *   wValue:         Xoff/Xon
- *   wIndex:         Protocol/Port - hIndex is protocl / lIndex is port
- *   wLength:        0 
- *   Data:           None
- *
- * 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.
- */  
- 
-/*
- * FTDI_SIO_SET_EVENT_CHAR 
- *
- * 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.
- */
-
-
-#define  FTDI_SIO_SET_EVENT_CHAR_REQUEST FTDI_SIO_SET_EVENT_CHAR
-#define  FTDI_SIO_SET_EVENT_CHAR_REQUEST_TYPE 0x40
-
-
-/* 
- *  BmRequestType:   0100 0000b
- *  bRequest:        FTDI_SIO_SET_EVENT_CHAR
- *  wValue:          EventChar
- *  wIndex:          Port
- *  wLength:         0
- *  Data:            None
- *
- * wValue:
- *   B0..7   Event Character
- *   B8      Event Character Processing
- *             0 = disabled
- *             1 = enabled
- *   B9..15  Reserved
- *
- */
-          
-/* FTDI_SIO_SET_ERROR_CHAR */
-
-/* Set the parity error replacement character for the specified communications port */
-
-/* 
- *  BmRequestType:  0100 0000b
- *  bRequest:       FTDI_SIO_SET_EVENT_CHAR
- *  wValue:         Error Char
- *  wIndex:         Port
- *  wLength:        0
- *  Data:           None
- *
- *Error Char
- *  B0..7  Error Character
- *  B8     Error Character Processing
- *           0 = disabled
- *           1 = enabled
- *  B9..15 Reserved
- *
- */
-
-/* FTDI_SIO_GET_MODEM_STATUS */
-/* Retreive the current value of the modem status register */
-
-#define FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE 0xc0
-#define FTDI_SIO_GET_MODEM_STATUS_REQUEST FTDI_SIO_GET_MODEM_STATUS
-#define FTDI_SIO_CTS_MASK 0x10
-#define FTDI_SIO_DSR_MASK 0x20
-#define FTDI_SIO_RI_MASK  0x40
-#define FTDI_SIO_RLSD_MASK 0x80
-/* 
- *   BmRequestType:   1100 0000b
- *   bRequest:        FTDI_SIO_GET_MODEM_STATUS
- *   wValue:          zero
- *   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 
- */
-
-
-
-/* Descriptors returned by the device 
- * 
- *  Device Descriptor
- * 
- * Offset	Field		Size	Value	Description
- * 0	bLength		1	0x12	Size of descriptor in bytes
- * 1	bDescriptorType	1	0x01	DEVICE Descriptor Type
- * 2	bcdUSB		2	0x0110	USB Spec Release Number
- * 4	bDeviceClass	1	0x00	Class Code
- * 5	bDeviceSubClass	1	0x00	SubClass Code
- * 6	bDeviceProtocol	1	0x00	Protocol Code
- * 7	bMaxPacketSize0 1	0x08	Maximum packet size for endpoint 0
- * 8	idVendor	2	0x0403	Vendor ID
- * 10	idProduct	2	0x8372	Product ID (FTDI_SIO_PID)
- * 12	bcdDevice	2	0x0001	Device release number
- * 14	iManufacturer	1	0x01	Index of man. string desc
- * 15	iProduct	1	0x02	Index of prod string desc
- * 16	iSerialNumber	1	0x02	Index of serial nmr string desc
- * 17	bNumConfigurations 1    0x01	Number of possible configurations
- * 
- * Configuration Descriptor
- * 
- * Offset	Field			Size	Value
- * 0	bLength			1	0x09	Size of descriptor in bytes
- * 1	bDescriptorType		1	0x02	CONFIGURATION Descriptor Type
- * 2	wTotalLength		2	0x0020	Total length of data
- * 4	bNumInterfaces		1	0x01	Number of interfaces supported
- * 5	bConfigurationValue	1	0x01	Argument for SetCOnfiguration() req
- * 6	iConfiguration		1	0x02	Index of config string descriptor
- * 7	bmAttributes		1	0x20	Config characteristics Remote Wakeup
- * 8	MaxPower		1	0x1E	Max power consumption
- * 
- * Interface Descriptor
- * 
- * Offset	Field			Size	Value
- * 0	bLength			1	0x09	Size of descriptor in bytes
- * 1	bDescriptorType		1	0x04	INTERFACE Descriptor Type
- * 2	bInterfaceNumber	1	0x00	Number of interface
- * 3	bAlternateSetting	1	0x00	Value used to select alternate
- * 4	bNumEndpoints		1	0x02	Number of endpoints
- * 5	bInterfaceClass		1	0xFF	Class Code
- * 6	bInterfaceSubClass	1	0xFF	Subclass Code
- * 7	bInterfaceProtocol	1	0xFF	Protocol Code
- * 8	iInterface		1	0x02	Index of interface string description
- * 
- * IN Endpoint Descriptor
- * 
- * Offset	Field			Size	Value
- * 0	bLength			1	0x07	Size of descriptor in bytes
- * 1	bDescriptorType		1	0x05	ENDPOINT descriptor type
- * 2	bEndpointAddress	1	0x82	Address of endpoint
- * 3	bmAttributes		1	0x02	Endpoint attributes - Bulk
- * 4	bNumEndpoints		2	0x0040	maximum packet size
- * 5	bInterval		1	0x00	Interval for polling endpoint
- * 
- * OUT Endpoint Descriptor
- * 
- * Offset	Field			Size	Value
- * 0	bLength			1	0x07	Size of descriptor in bytes
- * 1	bDescriptorType		1	0x05	ENDPOINT descriptor type
- * 2	bEndpointAddress	1	0x02	Address of endpoint
- * 3	bmAttributes		1	0x02	Endpoint attributes - Bulk
- * 4	bNumEndpoints		2	0x0040	maximum packet size
- * 5	bInterval		1	0x00	Interval for polling endpoint
- *     
- * DATA FORMAT
- * 
- * IN Endpoint
- * 
- * The device reserves the first two bytes of data on this endpoint to contain the current
- * values of the modem and line status registers. In the absence of data, the device 
- * generates a message consisting of these two status bytes every 40 ms
- * 
- * Byte 0: Modem Status
- * 
- * Offset	Description
- * B0	Reserved - must be 1
- * B1	Reserved - must be 0
- * B2	Reserved - must be 0
- * B3	Reserved - must be 0
- * B4	Clear to Send (CTS)
- * B5	Data Set Ready (DSR)
- * B6	Ring Indicator (RI)
- * B7	Receive Line Signal Detect (RLSD)
- * 
- * Byte 1: Line Status
- * 
- * Offset	Description
- * B0	Data Ready (DR)
- * B1	Overrun Error (OE)
- * B2	Parity Error (PE)
- * B3	Framing Error (FE)
- * B4	Break Interrupt (BI)
- * B5	Transmitter Holding Register (THRE)
- * B6	Transmitter Empty (TEMT)
- * B7	Error in RCVR FIFO
- * 
- */
-#define FTDI_RS0_CTS	(1 << 4)
-#define FTDI_RS0_DSR	(1 << 5)
-#define FTDI_RS0_RI	(1 << 6)
-#define FTDI_RS0_RLSD	(1 << 7)
-
-#define FTDI_RS_DR  1
-#define FTDI_RS_OE (1<<1)
-#define FTDI_RS_PE (1<<2)
-#define FTDI_RS_FE (1<<3)
-#define FTDI_RS_BI (1<<4)
-#define FTDI_RS_THRE (1<<5)
-#define FTDI_RS_TEMT (1<<6)
-#define FTDI_RS_FIFO  (1<<7)
-
-/*
- * OUT Endpoint
- * 
- * This device reserves the first bytes of data on this endpoint contain the length
- * and port identifier of the message. For the FTDI USB Serial converter the port 
- * identifier is always 1.
- * 
- * Byte 0: Line Status
- * 
- * Offset	Description
- * B0	Reserved - must be 1
- * B1	Reserved - must be 0
- * B2..7	Length of message - (not including Byte 0)
- * 
- */
-
--- a/dmx_usb_module/dmx_usb_test.c	Sun Jun 04 17:23:23 2023 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-/*
- * $Id: dmx_usb_test.c 40 2004-09-11 11:16:39Z erwin $ 
- */
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <stdlib.h>
-
-int main(int argc, char* argv[])
-{
-	unsigned char buffer[513];
-	int fd;
-	int res;
-	int i;
-
-	fd = open("/dev/dmx0",O_WRONLY);
-	if (fd < 0) {
-		perror("open");
-		exit(-1);
-	}
-
-	for (i = 0; i < 513;i++) {
-		buffer[i] = i;	
-	}
-
-	buffer[512] = 0x55;
-	
-	while(1) {
-		res = write(fd, buffer, 513);
-
-		if (res < 0){
-			perror("write");
-			exit(-1);
-		}
-	}
-
-	close(fd);
-
-	return 0;
-}
-
--- a/dmx_usb_module/pyout	Sun Jun 04 17:23:23 2023 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-
-from dmx import Dmx
-
-d = Dmx(port="/dev/dmx1")
-while 1:
-    d.write("\x00" * 100)
-    print "wrote"
--- a/dmx_usb_module/setup.py	Sun Jun 04 17:23:23 2023 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-from distutils.core import setup
-from distutils.extension import Extension
-from Pyrex.Distutils import build_ext
-
-setup(name="dmx",
-      ext_modules=[
-        Extension("dmx",
-                  ["dmx.pyx"],
-#                  library_dirs=['/usr/X11R6/lib'],
-#                  libraries=["X11","Xtst"]
-                  ),
-        ],  
-      cmdclass={'build_ext':build_ext})
-