FreeBSD joystick support
------------------------

FreeBSD supports two flavors of joysticks: analog and USB. By default,
non-root users do not have access to these devices on FreeBSD, and the
required devices may not even be created yet. Please browse the below
notes before writing to the plib mailing list.

Contents of this file:
-----------
	Analog joysticks
	USB joysticks
	Testing the joysticks
	Compiling and linking

Analog joysticks
----------------

Plib uses the joy(4) interface to analog joysticks. You will need to
make sure the device files exist:
	ls -l /dev/joy*

If they do not yet exist, create them (logged in as root):
	cd /dev
	sh MAKEDEV joy

By default, they will have permissions that do not allow unprivileged
users access to them:
	crw-r-----   1 root   operator   51,   0 Aug 30 16:59 joy0
	crw-r-----   1 root   operator   51,   1 Aug 30 16:59 joy1

You may wish to consider making the devices world read/writable:
	chmod a+rw /dev/joy*

Users of xdm(1) or any of its more modern successors may wish to look
into GiveConsole and TakeConsole or its equivalent.

If you do not have a joystick driver compiled into you kernel, you can
load one dynamically with the command
	kldload joy
When in doubt, check the FreeBSD handbook about making sure this driver
is loaded every time you reboot.


USB joysticks
-------------

Plib uses the usbhid(3) interface to USB joysticks. Joysticks will show
up as generic USB Human Interface Devices (uhid). Because the USB design
allows an almost unlimited number of USB buses and USB devices, you should
make sure you have enough devices in /dev to deal with your devices.
When in doubt, create a few extra to make sure. If you have insufficient
USB or uhid devices, your joystick may not appear at all, or it may
disappear if you connect your USB devices in a different order.
Fortunately, device nodes are free. For example, you might see this:
	ls -al /dev/usb* /dev/uhid*
	crw-rw----  1 root  operator  108, 255 Apr 12 01:44 /dev/usb
	crw-rw----  1 root  operator  108,   0 Apr 12 01:44 /dev/usb0
	crw-rw----  1 root  operator  122,   0 Apr 12 01:44 /dev/uhid0

This shows you have one usb interface (/dev/usb itself doesn't count), and
one uhid device. Make a few extra with
	cd /dev
	sh MAKEDEV usb0 usb1 usb2 usb3 uhid0 uhid1 uhid2 uhid3
(you can leave out the devices that exist already).

Next, you'll have to think about permissions. Both the /dev/usb0..3
(but not /dev/usb) have to be world readable, as well as the uhid devices.
This command will take care of it:
	chmod a+r /dev/usb?* /dev/uhid*
(yes, the "?*" after /dev/usb is intentional).

Obviously, any permission change you make is at your own risk! XDM users
may use the GiveConsole/TakeConsole mechanism as an alternative.

Plib will complain if /dev/uhid* or /dev/usb* exist but are
unreadable with your current privileges.


Testing the joysticks
---------------------

Users of FlightGear can quickly test their joysticks with the js_demo
program.


Compiling and linking
---------------------

Compile plib on FreeBSD with the same compiler options as used for the
other libraries you may use. In particular, if you use pthreads anywhere
in your application, you should compile Plib with
	g++ -pthread

Applications linking to recent Plib's -ljs should add -lusbhid to the
link command line in the Makefile.
