knowplace.org

Polhemus Patriot Linux Driver - USB Component

Author: Daniel Myall (daniel@westco.co.nz)
With support from Polhemus

February 10, 2004
Modified for Patriot by James Farr of Polhemus

July 20, 2005
Modified by Shane Chen (shane at ict usc edu)

Intro

There are two components to the driver. The first is the firmware loader, the second is the Linux USB kernel module that communicates to the Patriot System. When the Patriot system is initially attached, it will appear with a device ID of 0f44:ef11. If the hotplug system is working, it will immediately download the firmware, and reconnect as a serial device with the ID of ID 0f44:ef12 at '/dev/ttyUSB0' or '/dev/usb/ttyUSB0'. The Patriot system can be directly addressed via the ttyUSB0 device by using a serial communication program such as minicom.

Installation

This assumes that USB is working correctly on the machine. The following instructions need to be done as root.

Part A: Firmware

The firmware is loaded by the program fxload, standard with most linux distributions (or available from
http://prdownloads.sourceforge.net/linux-hotplug/).

First, edit (or create if needed) '/etc/hotplug/usb.usermap' (on Redhat 9.0 and Debian Sarge) and add the following line:

patriot 0x0003 0x0f44 0xef11 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000

Copy the file "patriot" to '/etc/hotplug/usb'. This script assumes that a3load.hex and PatriotUSB.hex have been placed in the directory '/usr/share/usb'. If you wish to relocate the files, edit '/etc/hotplug/usb/patriot' and update the location.

Note that case is important. The patriot script also assumes that  fxload is located in '/sbin'. Change this as needed on your system.

This will cause the firmware to be uploaded when the Patriot is connected. Look in '/var/log/messages' for any error messages.

Part B: USB Driver

At the moment the generic linux USB driver is used. This works, although it is not ideal.

Under a Linux 2.4 kernel to make this work simply run:

/sbin/insmod usbserial vendor=0x0f44 product=0xef12

This assumes that usbserial has been compiled as a module. Redhat 8.0 has this by default. This line can be placed in '/etc/rc.d/rc.local' to run on startup.

Under a Linux 2.6 kernel the visor module is used instead of usbserial.

Edit '/etc/modprobe.conf' or '/etc/modprobe.d/usb' (create if needed) and add the following line.

options visor vendor=0x0f44 product=0xef12

Either add the following lines to '/etc/rc.d/rc.local':

modprobe usbserial
modprobe visor

OR under Debian add the lines to '/etc/modules':

usbserial
visor

Troubleshooting

* In a pinch, you can manually invoke:

/sbin/insmod visor vendor=0x0f44 product=0xef12

to load the module (usbserial should autoload).

* To make sure that the visor module is loaded with the right options, issue `modprobe -nv visor`. If you do not see the options appended to the end of the insmod statement, it will not work. Note that with the '-n' option modprobe performs a dry run, it does not load the module.

* If `lsusb` (part of usbutils) outputs:

Bus ### Device ###: ID 0f44:ef11

instead of:

Bus ### Device ###: ID 0f44:ef12

This means that the firmware upload and/or hotplug failed.

* Under 2.6 and udev, the device will automatically created at '/dev/ttyUSB0'. If necessary, `mknod /dev/ttyUSB0 c 188 0` can create the device. Disregard '/dev/ttyUSB1' if created. It is a useless
phantom device.

 
Shane Tzen © 2008