changeset 355:4e60444605f6

add dmx_usb_module
author drewp@bigasterisk.com
date Wed, 13 Jun 2007 06:01:22 +0000
parents f3909c2df943
children c6aabf5bd3bc
files dmx_usb_module/.git/HEAD dmx_usb_module/.git/config dmx_usb_module/.git/description dmx_usb_module/.git/hooks/applypatch-msg dmx_usb_module/.git/hooks/commit-msg dmx_usb_module/.git/hooks/post-commit dmx_usb_module/.git/hooks/post-update dmx_usb_module/.git/hooks/pre-applypatch dmx_usb_module/.git/hooks/pre-commit dmx_usb_module/.git/hooks/pre-rebase dmx_usb_module/.git/hooks/update dmx_usb_module/.git/index dmx_usb_module/.git/info/exclude dmx_usb_module/.git/objects/09/a7ca6e8bb4840cc61357def7895a4598142c8a dmx_usb_module/.git/objects/0d/133393d78155c20721d74b64713b7d9e310a08 dmx_usb_module/.git/objects/11/24374d1091d38ce37280703b5df0b084ad67e2 dmx_usb_module/.git/objects/1b/7da8e5d9bad8451eabc4d94778f6ddde2aaabe dmx_usb_module/.git/objects/30/20516006966064612bf57d0b57412bc7607737 dmx_usb_module/.git/objects/32/df0335b5c8a9bc0699aebe2ff529eff31ec7a9 dmx_usb_module/.git/objects/3b/faeb835bec3d26d8ae0fd9d6b9b1dc15eafa7a dmx_usb_module/.git/objects/4b/76ed4be9816ae5c8552dcb6157f6d03b0ece28 dmx_usb_module/.git/objects/59/83527abe20f19a9d4db5ea28fb6dfe871abc0e dmx_usb_module/.git/objects/61/c7237e8d3788b65671374e2af4f33136bbdb29 dmx_usb_module/.git/objects/63/8904db932344ab556249cad8fbf8a96401ba76 dmx_usb_module/.git/objects/69/e812ef2ddf693f4756cff770207a7725590877 dmx_usb_module/.git/objects/76/db37107d983b0200624288e16aeb6e52f92534 dmx_usb_module/.git/objects/80/fe73e82b9192acf1048e896d495d4d8f1e34ec dmx_usb_module/.git/objects/8b/b14e2cda4ee4c9abe220ff2a9d9d188c452a28 dmx_usb_module/.git/objects/97/2aaf71b406124090ab8dd33c808d0a7b74bb26 dmx_usb_module/.git/objects/a3/4d04d9f793e52e1007db3773dea6db56198b97 dmx_usb_module/.git/objects/a3/ef1197dc190290702e435e9e6aa7397f208080 dmx_usb_module/.git/objects/a8/a806887d380133db6e66c420da855288df837e dmx_usb_module/.git/objects/ae/e15dc567e332c5b5d12864dedc537319f93891 dmx_usb_module/.git/objects/bb/e41f112303889d9a83fafcb58886c8ad9e7a1d dmx_usb_module/.git/objects/c0/60b144142425f5a17a17c85f589d5a21d964c8 dmx_usb_module/.git/objects/e9/a70df4a0b058b02335256ea0920509b707ed25 dmx_usb_module/.git/objects/ef/5914a45a5b4ce698e7a54637b3553b7c262b09 dmx_usb_module/.git/refs/heads/master dmx_usb_module/.git/refs/heads/origin dmx_usb_module/.git/remotes/origin 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.ko dmx_usb_module/dmx_usb_test dmx_usb_module/dmx_usb_test.c dmx_usb_module/pyout dmx_usb_module/setup.py
diffstat 51 files changed, 2001 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/.git/HEAD	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,1 @@
+ref: refs/heads/master
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/.git/config	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,3 @@
+[core]
+	repositoryformatversion = 0
+	filemode = true
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/.git/description	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,1 @@
+Unnamed repository; edit this file to name it for gitweb.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/.git/hooks/applypatch-msg	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,15 @@
+#!/bin/sh
+#
+# An example hook script to check the commit log message taken by
+# applypatch from an e-mail message.
+#
+# The hook should exit with non-zero status after issuing an
+# appropriate message if it wants to stop the commit.  The hook is
+# allowed to edit the commit message file.
+#
+# To enable this hook, make this file executable.
+
+. git-sh-setup
+test -x "$GIT_DIR/hooks/commit-msg" &&
+	exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"}
+:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/.git/hooks/commit-msg	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,14 @@
+#!/bin/sh
+#
+# An example hook script to check the commit log message.
+# Called by git-commit with one argument, the name of the file
+# that has the commit message.  The hook should exit with non-zero
+# status after issuing an appropriate message if it wants to stop the
+# commit.  The hook is allowed to edit the commit message file.
+#
+# To enable this hook, make this file executable.
+
+# This example catches duplicate Signed-off-by lines.
+
+test "" = "$(grep '^Signed-off-by: ' "$1" |
+	 sort | uniq -c | sed -e '/^[ 	]*1 /d')"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/.git/hooks/post-commit	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,8 @@
+#!/bin/sh
+#
+# An example hook script that is called after a successful
+# commit is made.
+#
+# To enable this hook, make this file executable.
+
+: Nothing
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/.git/hooks/post-update	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,8 @@
+#!/bin/sh
+#
+# An example hook script to prepare a packed repository for use over
+# dumb transports.
+#
+# To enable this hook, make this file executable by "chmod +x post-update".
+
+exec git-update-server-info
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/.git/hooks/pre-applypatch	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,15 @@
+#!/bin/sh
+#
+# An example hook script to verify what is about to be committed
+# by applypatch from an e-mail message.
+#
+# The hook should exit with non-zero status after issuing an
+# appropriate message if it wants to stop the commit.
+#
+# To enable this hook, make this file executable.
+
+. git-sh-setup
+test -x "$GIT_DIR/hooks/pre-commit" &&
+	exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"}
+:
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/.git/hooks/pre-commit	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,71 @@
+#!/bin/sh
+#
+# An example hook script to verify what is about to be committed.
+# Called by git-commit with no arguments.  The hook should
+# exit with non-zero status after issuing an appropriate message if
+# it wants to stop the commit.
+#
+# To enable this hook, make this file executable.
+
+# This is slightly modified from Andrew Morton's Perfect Patch.
+# Lines you introduce should not have trailing whitespace.
+# Also check for an indentation that has SP before a TAB.
+
+if git-rev-parse --verify HEAD 2>/dev/null
+then
+	git-diff-index -p -M --cached HEAD
+else
+	# NEEDSWORK: we should produce a diff with an empty tree here
+	# if we want to do the same verification for the initial import.
+	:
+fi |
+perl -e '
+    my $found_bad = 0;
+    my $filename;
+    my $reported_filename = "";
+    my $lineno;
+    sub bad_line {
+	my ($why, $line) = @_;
+	if (!$found_bad) {
+	    print STDERR "*\n";
+	    print STDERR "* You have some suspicious patch lines:\n";
+	    print STDERR "*\n";
+	    $found_bad = 1;
+	}
+	if ($reported_filename ne $filename) {
+	    print STDERR "* In $filename\n";
+	    $reported_filename = $filename;
+	}
+	print STDERR "* $why (line $lineno)\n";
+	print STDERR "$filename:$lineno:$line\n";
+    }
+    while (<>) {
+	if (m|^diff --git a/(.*) b/\1$|) {
+	    $filename = $1;
+	    next;
+	}
+	if (/^@@ -\S+ \+(\d+)/) {
+	    $lineno = $1 - 1;
+	    next;
+	}
+	if (/^ /) {
+	    $lineno++;
+	    next;
+	}
+	if (s/^\+//) {
+	    $lineno++;
+	    chomp;
+	    if (/\s$/) {
+		bad_line("trailing whitespace", $_);
+	    }
+	    if (/^\s* 	/) {
+		bad_line("indent SP followed by a TAB", $_);
+	    }
+	    if (/^(?:[<>=]){7}/) {
+		bad_line("unresolved merge conflict", $_);
+	    }
+	}
+    }
+    exit($found_bad);
+'
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/.git/hooks/pre-rebase	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,150 @@
+#!/bin/sh
+#
+# Copyright (c) 2006 Junio C Hamano
+#
+
+publish=next
+basebranch="$1"
+if test "$#" = 2
+then
+	topic="refs/heads/$2"
+else
+	topic=`git symbolic-ref HEAD`
+fi
+
+case "$basebranch,$topic" in
+master,refs/heads/??/*)
+	;;
+*)
+	exit 0 ;# we do not interrupt others.
+	;;
+esac
+
+# Now we are dealing with a topic branch being rebased
+# on top of master.  Is it OK to rebase it?
+
+# Is topic fully merged to master?
+not_in_master=`git-rev-list --pretty=oneline ^master "$topic"`
+if test -z "$not_in_master"
+then
+	echo >&2 "$topic is fully merged to master; better remove it."
+	exit 1 ;# we could allow it, but there is no point.
+fi
+
+# Is topic ever merged to next?  If so you should not be rebasing it.
+only_next_1=`git-rev-list ^master "^$topic" ${publish} | sort`
+only_next_2=`git-rev-list ^master           ${publish} | sort`
+if test "$only_next_1" = "$only_next_2"
+then
+	not_in_topic=`git-rev-list "^$topic" master`
+	if test -z "$not_in_topic"
+	then
+		echo >&2 "$topic is already up-to-date with master"
+		exit 1 ;# we could allow it, but there is no point.
+	else
+		exit 0
+	fi
+else
+	not_in_next=`git-rev-list --pretty=oneline ^${publish} "$topic"`
+	perl -e '
+		my $topic = $ARGV[0];
+		my $msg = "* $topic has commits already merged to public branch:\n";
+		my (%not_in_next) = map {
+			/^([0-9a-f]+) /;
+			($1 => 1);
+		} split(/\n/, $ARGV[1]);
+		for my $elem (map {
+				/^([0-9a-f]+) (.*)$/;
+				[$1 => $2];
+			} split(/\n/, $ARGV[2])) {
+			if (!exists $not_in_next{$elem->[0]}) {
+				if ($msg) {
+					print STDERR $msg;
+					undef $msg;
+				}
+				print STDERR " $elem->[1]\n";
+			}
+		}
+	' "$topic" "$not_in_next" "$not_in_master"
+	exit 1
+fi
+
+exit 0
+
+################################################################
+
+This sample hook safeguards topic branches that have been
+published from being rewound.
+
+The workflow assumed here is:
+
+ * Once a topic branch forks from "master", "master" is never
+   merged into it again (either directly or indirectly).
+
+ * Once a topic branch is fully cooked and merged into "master",
+   it is deleted.  If you need to build on top of it to correct
+   earlier mistakes, a new topic branch is created by forking at
+   the tip of the "master".  This is not strictly necessary, but
+   it makes it easier to keep your history simple.
+
+ * Whenever you need to test or publish your changes to topic
+   branches, merge them into "next" branch.
+
+The script, being an example, hardcodes the publish branch name
+to be "next", but it is trivial to make it configurable via
+$GIT_DIR/config mechanism.
+
+With this workflow, you would want to know:
+
+(1) ... if a topic branch has ever been merged to "next".  Young
+    topic branches can have stupid mistakes you would rather
+    clean up before publishing, and things that have not been
+    merged into other branches can be easily rebased without
+    affecting other people.  But once it is published, you would
+    not want to rewind it.
+
+(2) ... if a topic branch has been fully merged to "master".
+    Then you can delete it.  More importantly, you should not
+    build on top of it -- other people may already want to
+    change things related to the topic as patches against your
+    "master", so if you need further changes, it is better to
+    fork the topic (perhaps with the same name) afresh from the
+    tip of "master".
+
+Let's look at this example:
+
+		   o---o---o---o---o---o---o---o---o---o "next"
+		  /       /           /           /
+		 /   a---a---b A     /           /
+		/   /               /           /
+	       /   /   c---c---c---c B         /
+	      /   /   /             \         /
+	     /   /   /   b---b C     \       /
+	    /   /   /   /             \     /
+    ---o---o---o---o---o---o---o---o---o---o---o "master"
+
+
+A, B and C are topic branches.
+
+ * A has one fix since it was merged up to "next".
+
+ * B has finished.  It has been fully merged up to "master" and "next",
+   and is ready to be deleted.
+
+ * C has not merged to "next" at all.
+
+We would want to allow C to be rebased, refuse A, and encourage
+B to be deleted.
+
+To compute (1):
+
+	git-rev-list ^master ^topic next
+	git-rev-list ^master        next
+
+	if these match, topic has not merged in next at all.
+
+To compute (2):
+
+	git-rev-list master..topic
+
+	if this is empty, it is fully merged to "master".
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/.git/hooks/update	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,89 @@
+#!/bin/sh
+#
+# An example hook script to mail out commit update information.
+# It also blocks tags that aren't annotated.
+# Called by git-receive-pack with arguments: refname sha1-old sha1-new
+#
+# To enable this hook:
+# (1) change the recipient e-mail address
+# (2) make this file executable by "chmod +x update".
+#
+
+project=$(cat $GIT_DIR/description)
+recipients="commit-list@somewhere.com commit-list@somewhereelse.com"
+
+ref_type=$(git cat-file -t "$3")
+
+# Only allow annotated tags in a shared repo
+# Remove this code to treat dumb tags the same as everything else
+case "$1","$ref_type" in
+refs/tags/*,commit)
+	echo "*** Un-annotated tags are not allowed in this repo" >&2
+	echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate."
+	exit 1;;
+refs/tags/*,tag)
+	echo "### Pushing version '${1##refs/tags/}' to the masses" >&2
+	# recipients="release-announce@somwehere.com announce@somewhereelse.com"
+	;;
+esac
+
+# set this  to 'cat' to get a very detailed listing.
+# short only kicks in when an annotated tag is added
+short='git shortlog'
+
+# see 'date --help' for info on how to write this
+# The default is a human-readable iso8601-like format with minute
+# precision ('2006-01-25 15:58 +0100' for example)
+date_format="%F %R %z"
+
+(if expr "$2" : '0*$' >/dev/null
+then
+	# new ref
+	case "$1" in
+	refs/tags/*)
+		# a pushed and annotated tag (usually) means a new version
+		tag="${1##refs/tags/}"
+		if [ "$ref_type" = tag ]; then
+			eval $(git cat-file tag $3 | \
+				sed -n '4s/tagger \([^>]*>\)[^0-9]*\([0-9]*\).*/tagger="\1" ts="\2"/p')
+			date=$(date --date="1970-01-01 00:00:00 $ts seconds" +"$date_format")
+			echo "Tag '$tag' created by $tagger at $date"
+			git cat-file tag $3 | sed -n '5,$p'
+			echo
+		fi
+		prev=$(git describe "$3^" | sed 's/-g.*//')
+		# the first tag in a repo will yield no $prev
+		if [ -z "$prev" ]; then
+			echo "Changes since the dawn of time:"
+			git rev-list --pretty $3 | $short
+		else
+			echo "Changes since $prev:"
+			git rev-list --pretty $prev..$3 | $short
+			echo ---
+			git diff $prev..$3 | diffstat -p1
+			echo ---
+		fi
+		;;
+
+	refs/heads/*)
+		branch="${1##refs/heads/}"
+		echo "New branch '$branch' available with the following commits:"
+		git-rev-list --pretty "$3" $(git-rev-parse --not --all)
+		;;
+	esac
+else
+	base=$(git-merge-base "$2" "$3")
+	case "$base" in
+	"$2")
+		git diff "$3" "^$base" | diffstat -p1
+		echo
+		echo "New commits:"
+		;;
+	*)
+		echo "Rebased ref, commits from common ancestor:"
+		;;
+	esac
+	git-rev-list --pretty "$3" "^$base"
+fi) |
+mail -s "$project: Changes to '${1##refs/heads/}'" $recipients
+exit 0
Binary file dmx_usb_module/.git/index has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/.git/info/exclude	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,6 @@
+# git-ls-files --others --exclude-from=.git/info/exclude
+# Lines that start with '#' are comments.
+# For a project mostly in C, the following would be a good set of
+# exclude patterns (uncomment them if you want to use them):
+# *.[oa]
+# *~
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/.git/objects/09/a7ca6e8bb4840cc61357def7895a4598142c8a	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,2 @@
+xÚ¥ŽAnà E»æ³¯„†Á0XªªHU/80(V±UrüÐ\¡»ÿ7ï½XKY;·o½‰€Ÿ%’L)e?Û<±ó1gf$ä…™œ›10«ci²w0†&ËS28›dCËÑ^\ÊxÁ0-ɳZ~ûµ6øn÷u‡sÝàCþæéqD}­Eô붺éXËçà:g;¼5ªø
+íò„úªåX7¼> ˜]îƒGÚkãáGÚ.ÛM=zºRµ
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/.git/objects/0d/133393d78155c20721d74b64713b7d9e310a08	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,2 @@
+xÚe_kÂ0Å÷Ú|ŠK·‡ªÕ¦jZ·÷Á˜°—±‰HÛ¤¨©$©ûîËm‹èöv8÷žsIZ”)D“Ç» K /llwZW:]®Í ƒ1…!¥ã>öÃÂpNf£épuÀæBî…ÌŠŠq˜kÃD9Ø>_[g˜óžëÿ¶6‰¹uóLšâÖª¤°­†"Ei`—é¡HÔ&ó!Û&ª‹ú°\uÈ7q*©ÅFrVO ­òœ«eŽV1q0–³V(®[%bBœœÁ”{.=7`üØÏ¡®¿X¼/Þ^?;¸šƒg·æ@;`9{®T©<C..8ü$Œ×Qÿ`e©À¶–Æ lÎRÄ¢×kÒ-™XáüDiì4¡ñ°™D‘m#Îq+
+î…MÖ¢ÛÙQ	Ã-‘ß¾ÒÇ|KŠKÈŠki`¯iíåúxV”+ëÅM¥¤…'vôÙ“¡…
\ No newline at end of file
Binary file dmx_usb_module/.git/objects/11/24374d1091d38ce37280703b5df0b084ad67e2 has changed
Binary file dmx_usb_module/.git/objects/1b/7da8e5d9bad8451eabc4d94778f6ddde2aaabe has changed
Binary file dmx_usb_module/.git/objects/30/20516006966064612bf57d0b57412bc7607737 has changed
Binary file dmx_usb_module/.git/objects/32/df0335b5c8a9bc0699aebe2ff529eff31ec7a9 has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/.git/objects/3b/faeb835bec3d26d8ae0fd9d6b9b1dc15eafa7a	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,1 @@
+xÚ¥KjÄ0D³Ö)z0úÙjAÙd™Í@Ð’Z3–d„f&Çö²«‚G}b+e`¤}B`«²RÚHƒè“'4™r3".)yv¤’Ø©sà&ÊN+¥­ô’¦dLD‰I’Ά A÷qm>ûs­pi¼ñ!?~÷8][áé´½mSl唚g7£F¯RK)â9tð?"Ä…K{0t¦ù^ãX[…Ñ`ïü8Î<©×µþˆï=Ñ`ø¢çuãI
Ÿõqc:©?åÂd¸
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/.git/objects/4b/76ed4be9816ae5c8552dcb6157f6d03b0ece28	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,1 @@
+xÚα P×òwv ¥ÕNÆèàâ¨ñ <,)…0/í¸¼ÜáæÜ§\PhD»îÒ£©ë·¸XGp8Ñ/ÛÁñ>LgVíñšµÌ¤aBÄHÑ“Kð´PDV…w\´Œ‰#ž4¯èáôªu!%úú9 ÁšBr”>M6ƒU€úS¦lMsþBQùƒ ƒõï­­"É‘3öO$Fí
\ No newline at end of file
Binary file dmx_usb_module/.git/objects/59/83527abe20f19a9d4db5ea28fb6dfe871abc0e has changed
Binary file dmx_usb_module/.git/objects/61/c7237e8d3788b65671374e2af4f33136bbdb29 has changed
Binary file dmx_usb_module/.git/objects/63/8904db932344ab556249cad8fbf8a96401ba76 has changed
Binary file dmx_usb_module/.git/objects/69/e812ef2ddf693f4756cff770207a7725590877 has changed
Binary file dmx_usb_module/.git/objects/76/db37107d983b0200624288e16aeb6e52f92534 has changed
Binary file dmx_usb_module/.git/objects/80/fe73e82b9192acf1048e896d495d4d8f1e34ec has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/.git/objects/8b/b14e2cda4ee4c9abe220ff2a9d9d188c452a28	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,2 @@
+xÚeÝkÂ0Å÷Úü—n­V›¨Ýк½Æ„½ŒMDú‘j ¦’¤~0ö¿/·-¢ìípî=çþ’´¬Rˆ&Owa@^óä»ÓºÖéÚpm†L(Œ(ètÀ06c³ñô¸:
+	`s!!÷Bfes˜k“‹j¸}¹¶Î:4ç=×ÿmmsë™4å­UKa[Ñ#BØ%Bz(µÉȶ‰ê¡>,W>ù!N-µØHž7Hë¢àj±ñ*&ÆŠ¼ŠëN‰˜§Èáª=—žæüÚ n°X~,Þß¾|\-À³[s >ØCΞ+U)ÏÅ‹?	ã
ê_¬¬xÂÖÒ„ÍYŠXôûmº#+œŸ(6t!µ“(²mÄ9nEÉ=Öf-º•0ÜÝ+<àã[T\BV\X›L{Mk/7dz²ÒXÙ´(nj%-<±£?[šÀ
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/.git/objects/97/2aaf71b406124090ab8dd33c808d0a7b74bb26	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,2 @@
+xÚ¥ŽK
+Â0@]ç³J’fšDÜxÁL&S+´M	=¾Ÿ+¸{oóx\–åÞÀº~ת`=ZOI¬M¤˜]N(d؆<Jð†kQUYèHži’N3¦GŸeô!"¹OÎ8Ë=ÚT*œëó¾Â¥Ìp/ž^wSY¤ûi-sÇe9‚1ˆu0{mµVümòGB]·LM€'Zo2—›zÓN­
\ No newline at end of file
Binary file dmx_usb_module/.git/objects/a3/4d04d9f793e52e1007db3773dea6db56198b97 has changed
Binary file dmx_usb_module/.git/objects/a3/ef1197dc190290702e435e9e6aa7397f208080 has changed
Binary file dmx_usb_module/.git/objects/a8/a806887d380133db6e66c420da855288df837e has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/.git/objects/ae/e15dc567e332c5b5d12864dedc537319f93891	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,2 @@
+xÚÊK
+Â0Ea§Í*îØAi‹‚¸]A764É_’ˆ¸{±“Ã78&ŠÁ8vãO®˜†á€{ù„Œ‡Dœùçuk‘Ø[IÕíqsŽv¦]ЕDðh3ÑŠÎ5…Õæí=BÓÚ¾0ôR'!¿¶Ûê¥WêÝ,
\ No newline at end of file
Binary file dmx_usb_module/.git/objects/bb/e41f112303889d9a83fafcb58886c8ad9e7a1d has changed
Binary file dmx_usb_module/.git/objects/c0/60b144142425f5a17a17c85f589d5a21d964c8 has changed
Binary file dmx_usb_module/.git/objects/e9/a70df4a0b058b02335256ea0920509b707ed25 has changed
Binary file dmx_usb_module/.git/objects/ef/5914a45a5b4ce698e7a54637b3553b7c262b09 has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/.git/refs/heads/master	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,1 @@
+3bfaeb835bec3d26d8ae0fd9d6b9b1dc15eafa7a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/.git/refs/heads/origin	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,1 @@
+3bfaeb835bec3d26d8ae0fd9d6b9b1dc15eafa7a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/.git/remotes/origin	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,2 @@
+URL: http://www.erwinrol.com/git/dmx_usb_module
+Pull: refs/heads/master:refs/heads/origin
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/Changelog	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,10 @@
+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.
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/Makefile	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,29 @@
+#
+# $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 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
+
+
+drew:
+	gcc dmx_usb.c -o dmx_usb.o -I/usr/src/linux-source-2.6.15/include
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/README	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,22 @@
+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.
+ 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/dmx.pyx	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,28 @@
+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 __new__(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
+        res = write(self.fd, cbuf, 513)
+        if res < 0:
+            raise OSError("write failed")
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/dmx_usb.c	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,787 @@
+/*
+ * DMX USB driver
+ *
+ * Copyright (C) 2004,2006 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.
+ *
+ * $Id: dmx_usb.c 41 2004-09-14 23:35:25Z erwin $ 
+ */
+
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/smp_lock.h>
+#include <linux/completion.h>
+#include <asm/uaccess.h>
+#include <linux/usb.h>
+#include <linux/version.h>
+
+#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)
+
+
+/* Version Information */
+#define DRIVER_VERSION "v0.1.20060816"
+#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() */
+static DECLARE_MUTEX (disconnect_sem);
+
+/* 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);
+static int dmx_usb_ioctl	(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);
+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, struct pt_regs *regs);
+
+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,
+	.ioctl =	dmx_usb_ioctl,
+	.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,
+};
+
+
+/**
+ */
+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_buffer_free (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;
+}
+
+
+/**
+ */
+static int dmx_usb_ioctl (struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
+{
+	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 pt_regs *regs)
+{
+	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 ((udev->descriptor.idVendor != FTDI_VID) ||
+	    (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_buffer_alloc (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");
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/dmx_usb.h	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,663 @@
+/*
+ * 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)
+ * 
+ */
+
Binary file dmx_usb_module/dmx_usb.ko has changed
Binary file dmx_usb_module/dmx_usb_test has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/dmx_usb_test.c	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,44 @@
+/*
+ * $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] = 0x00;	
+	}
+
+	buffer[512] = 0x55;
+	
+	while(1) {
+		res = write(fd, buffer, 513);
+
+		if (res < 0){
+			perror("write");
+			exit(-1);
+		}
+	}
+
+	close(fd);
+
+	return 0;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/pyout	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,7 @@
+
+from dmx import Dmx
+
+d = Dmx()
+while 1:
+    d.write("\xff" * 100, times=1)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmx_usb_module/setup.py	Wed Jun 13 06:01:22 2007 +0000
@@ -0,0 +1,14 @@
+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})
+