Provided by: xboxdrv_0.8.2-1_amd64 bug

NAME

       xboxdrv - A Xbox/Xbox360 gamepad driver that works in userspace

SYNOPSIS

       xboxdrv [OPTION]... [--] [COMMAND] [ARGUMENTS]

DESCRIPTION

       xboxdrv  is  a driver for Xbox and Xbox360 gamepads. It works by reading the raw data from
       the controller with the userspace library libusb and then passes the interpreted  data  to
       the  kernel via uinput. This allows xboxdrv to provide regular joystick and event devices,
       which makes it compatible with all Linux software.

       Aside from the pure driver, xboxdrv also includes a rich set of configuration options that
       allow  you  to  tweak the abilities of the virtual input devices that xboxdrv will create.
       This includes basic button and axis remapping, as well as  more  complicated  things  like
       mouse and keyboard emulation, auto-fire and throttle control emulation.

       It  is  also  possible  for xboxdrv to read input data directly from an event device, this
       allows the use of the configurability of xboxdrv on regular PC  joysticks,  keyboards  and
       mice  and  thus  lets  xboxdrv  serve a similar purpose as joy2key. See the option --evdev
       below for more information.

       When a COMMAND is provided xboxdrv will launch that application and be running  till  that
       application  exits.   This  is  a convenience function to make it easier to use xboxdrv in
       wrapper  scripts.  See  the  section  [Writing  Start-Up  Scripts  for  Games]  for   more
       information.

OPTIONS

   GENERAL OPTIONS
       -h, --help
              Display help text and exit.

       -V, --version
              Print the version number and exit.

       -v, --verbose
              Print verbose messages.

       --debug
              Print even more verbose messages then --verbose.

       -s, --silent
              Do  not  display  controller  events  on  the terminal. For regular use this option
              should always be used as output data to the terminal can eat up quite a bit of CPU.

       --quiet
              Do not display startup text and suppress most other output.

       --priority PRIORITY
              Possible values for PRIORITY are "normal" and "realtime". Realtime scheduling gives
              the  xboxdrv  process  higher priority and thus allows it to function properly even
              when the machine is under load.

              Note that realtime priority requires running xboxdrv as root, when running  xboxdrv
              as user there is no way to increase the priority.

              This option is deprecated, use chrt(1) instead to achive the same effect.

   LIST OPTIONS
       --help-led
              List possible values for the led.

       --help-devices
              List supported devices.

       --list-supported-devices
              List supported devices (used by xboxdrv-daemon.py).

       --list-supported-devices-xpad
              List supported devices in xpad.c style.

       --help-abs
              List all allowed EV_ABS symbols.

       --help-rel
              List all allowed EV_REL symbols.

       --help-key
              List all allowed EV_KEY symbols.

       --help-x11keysym
              List all allowed X11 Keysym symbols.

       --help-axis
              List all allowed XboxAxis symbols.

       --help-button
              List all allowed XboxButton symbols.

       --help-all
              List  all symbols that can be used in --ui-buttonmap, --ui-axismap, --buttonmap and
              --axismap.  This  option  is  the  same  as  --help-abs,  --help-rel,   --help-key,
              --help-x11keysym, --help-axis and --help-button.

   CONFIG FILE OPTIONS
       -c, --config FILE
              Reads  configuration  information from FILE.  Configurations from file are handling
              as if they would be command line options at the position of --config FILE.

              The syntax of FILE is the familiar INI syntax used for  many  configuration  files.
              Regular key/value pairs must go into the [xboxdrv] section. '#' and ';' can be used
              for comments.  Key names have for most part the same name as command line  options.
              Command   line  options  that  take  a  list  of  input  mappings  (--ui-buttonmap,
              --ui-axismap, --evdev-absmap, ...) can be split  of  into  their  own  section  for
              better readability.

              The examples/ directory contains some example configuration files.

              [xboxdrv]
              silent=true
              deadzone=6000
              dpad-as-button=true
              trigger-as-button=true

              [ui-axismap]
              x2=REL_X:10
              y2=REL_Y:-10
              x1=KEY_A:KEY_D
              y1=KEY_W:KEY_S

              [ui-buttonmap]
              a=KEY_LEFTSHIFT
              b=BTN_C
              x=BTN_EXTRA
              y=KEY_C

              [ui-buttonmap]
              lb=BTN_RIGHT
              rb=KEY_SPACE

              [ui-buttonmap]
              lt=KEY_Z
              rt=BTN_LEFT

              [ui-buttonmap]
              dl=KEY_4
              dr=KEY_2
              du=REL_WHEEL:-1:150
              dd=REL_WHEEL:1:150

              [ui-buttonmap]
              back=KEY_TAB
              start=KEY_ESC

              # EOF #

       --alt-config FILE
              A shortcut for writing --next-config --config FILE.

              To load multiple configuration options use:

              xboxdrv --config first.ini --alt-config second.ini --alt-config third.ini

       -o, --option NAME=VALUE
              Set an option as if it would come from a config file from the command line.

       --write-config FILE
              Write an example configuration file to FILE.

   DAEMON OPTIONS
       -D, --daemon
              Run  xboxdrv as daemon. If this option is given xboxdrv will listen to udev for USB
              connection events and launch driver threads for newly connected controllers.

              Configuration options can still be supplied as usual.  Note  however  that  xboxdrv
              when  run  as  daemon will not create new uinput devices on demand, instead it will
              only create devices once at startup for the given configurations  and  then  assign
              new  controllers to these configurations. While this means xboxdrv can't support an
              unlimited number of controllers, it also means that xboxdrv can allow hot  plugging
              even  for  applications that don't support it themselves, as applications will only
              see the permanent device files, not the controller that xboxdrv will change  around
              under the hood.

              An example configuration that supports three controller would look like this:

              xboxdrv --daemon \
                  # config options for the first controller
                --next-controller \
                  # config options for the second controller
                --next-controller
                  # config options for the third controller

              The  --match  option  can  be  used  to  limit  the  controller slots to only those
              controllers that match the given RULE and thus be  used  to  assign  configurations
              only to specific controllers.

       --detach
              Detaches xboxdrv from the current shell, only valid if --daemon is given.

       --pid-file FILE
              Write the xboxdrv daemon process id to FILE.

       --on-connect EXE
              Launches  EXE  when  a  controller  gets  connected.  As arguments "BUSDEV:DEVNUM",
              "idVendor:idProduct", "NAME are provided.

       --on-disconnect EXE
              Launches EXE when a controller gets  disconnected.  As  arguments  "BUSDEV:DEVNUM",
              "idVendor:idProduct", "NAME are provided.

   DEVICE OPTIONS
       -L, --list-controller
              List available controllers on the system.

       -i, --id N
              Use  controller  with  id N (default: 0), use --list-controller to obtain a list of
              available controller.

       -w, --wid N
              Use wireless controller with wid N (default: 0).

       --device-by-path BUS:DEV
              Use the controller at BUS:DEV, do not do any automatic scanning. Useful  for  cases
              when a controller isn't known by xboxdrv, but supports one of the given protocols.

       --device-by-id VENDOR:PRODUCT
              Use  device  that  matches  VENDOR:PRODUCT (as returned by lsusb). Useful for cases
              when a controller isn't known by xboxdrv, but supports one of the given protocols.

       --type TYPE
              Ignore autodetection and enforce the controller type.  Possible values for TYPE:

              · xbox

              · xbox-mat

              · xbox360

              · xbox360-wireless

              · xbox360-guitar

              · firestorm

              · firestorm-vsb

              · saitek-p2500

              · generic-usb

       The generic-usb type is a special type that will work with any  USB  controller,  it  will
       however  not  interpret the input it gets, but just dump it to the console for development
       purposes.  See --generic-usb-spec for further information.

       -d, --detach-kernel-driver
              Detaches the kernel driver that is currently associated with the given device. This
              is  useful  when  you  have  the xpad module loaded and want to use xboxdrv without
              unloading it.

       --generic-usb-spec NAME=VALUE,...
              Allows one to specify from which endpoint generic-usb will read. The  spec  as  the
              form of NAME=VALUE,.... Allowed values are:

              vid=HEX
                     The vendor id of the controller to which this spec applies

              pid=HEX
                     The product id of the controller to which this spec applies

              if=NUM The interface from which GenericUSBController should be read

              ep=NUM The endpoint from which GenericUSBController should be read

   EVDEV OPTION
       --evdev DEVICE
              Allows  you  to read input data from a regular event device. This allows you to use
              xboxdrv on regular PC joysticks. The data that is read from  the  event  device  is
              converted  internally  into  a  XboxMsg  object  and  then  passed through the same
              configuration pipeline as it would be for a regular Xbox360 controller. This allows
              you to make use of all the regular configurability, but limits you to the number of
              axis and buttons that an Xbox360 controller provides.

              As a regular PC joystick will most likely already create a /dev/input/jsX device by
              itself,  you  might need to get rid of that so that a game will properly detect the
              joystick device created by xboxdrv. The easiest way to accomplish that is to simply
              delete   the   old   joystick  and  rename  the  device  that  xboxdrv  created  to
              /dev/input/js0.  When  you  use  udev,  this  operation  should  be  harmless   and
              automatically  reverse itself when you remove the controller and plug it back in or
              when you reboot the computer.

       --evdev-debug
              The evdev event handler will print all received events to  stdout,  this  makes  it
              easy to see which events a given controller sends.

       --evdev-no-grab
              By  default  the  evdev  driver will grab the device, thus making it impossible for
              other applications to receive events from  that  device.  This  is  done  to  avoid
              confusing  applications,  as otherwise an app would receive every event twice, once
              from the original device and once from the virtual xboxdrv one. In some cases  this
              behaviour  is  undesired,  such  when mapping only an otherwise unhandled subset of
              keys of an device, i.e. mapping the multimedia keys on a keyboard, so  this  option
              turns the grab off.

       --evdev-absmap ABSMAP,...
              ABSMAP = EVDEV_ABS [ "+", "-" ] "=" XBOXAXIS ;

              Sets  how  evdev  events  are  mapped to Xbox axis events. An example configuration
              would look like this:

              --evdev-absmap ABS_X=x1,ABS_Y=y1,ABS_RZ=x2,ABS_THROTTLE=y2,ABS_HAT0X=dpad_x,ABS_HAT0Y=dpad_y

              xboxdrv will output on startup a full list of event  names  that  the  given  event
              device supports and that can be used in place of EVDEV_ABS.

              It is also possible to map half-axis with a command like:

              --evdev-absmap ABS_Y+=LT,ABS_Y-=RT

              This  will  map  the  upward  movement  of  the  Y axis to the left trigger and the
              downward movement to the right trigger.

       --evdev-keymap KEYMAP
              Sets  how  evdev  events  are  mapped  to  Xbox  controller  events.   An   example
              configuration would look like this:

              --evdev-keymap BTN_TRIGGER=a,BTN_THUMB=b,BTN_THUMB2=x

              xboxdrv will output on start a full list of event names that the given event device
              supports.

   STATUS OPTIONS
       -l, --led NUM
              Set LED status. Possible values for NUM are:

              LED Status Codes

              Num   Behavior
                0   off
                1   all blinking
                2   1/top-left blink, then on

                3   2/top-right blink, then on
                4   3/bottom-left blink, then on
                5   4/bottom-right blink, then on
                6   1/top-left on
                7   2/top-right on
                8   3/bottom-left on
                9   4/bottom-right on
               10   rotate
               11   blink
               12   blink slower
               13   rotate with two lights
               14   blink
               15   blink once

       --rumble-gain AMOUNT
              You can change the rumble strength via:

              $ xboxdrv --rumble-gain 50%

              Values larger then 100%  are  possible  as  well  and  will  amplify  small  rumble
              commands, rumble commands already at the maximum will stay unchanged.

       -q, --quit
              Exit xboxdrv after setting LED or rumble values.

   CHATPAD OPTIONS (EXPERIMENTAL)
       Chatpad  support  is  still experimental. Basic keyboard usage will work, there is however
       currently no support for customization or the green and orange key modifiers.

       Starting xboxdrv multiple times  in  a  row  with  the  --chatpad  option  can  crash  the
       controller. Unplugging it and plugging it back in should reset it.

       --chatpad
              Enables  the support for the Xbox360 Chatpad. WARNING: This is preliminary code, it
              will crash your gamepad when xboxdrv is started multiple times  and  won't  provide
              proper keymapping for any of the umlauts and special characters.

       --chatpad-no-init
              This  will  start  chatpad  support  with  out  sending  the  init  sequence,  thus
              potentially avoiding crashing the controller if xboxdrv is started multiple times.

       --chatpad-debug
              Output raw chatpad data to the stdout for debugging purpose.

   HEADSET OPTIONS (EXPERIMENTAL, XBOX360 USB ONLY)
       Xboxdrv does not support the headset, the options below are for developers only  and  will
       dump raw headset data, not .wav files.

       --headset
              Enable headset support and dump incoming data to stdout.

       --headset-dump FILE
              Enable headset support and dump incoming data to FILE.

       --headset-play FILE
              Enable headset support and send FILE to the headset for playback.

   FORCE FEEDBACK
       --force-feedback
              Enables  the standard kernel force feedback interface. It is disabled by default as
              it causes trouble with some applications running in Wine.

              Since the Xbox360 controller supports just rumble not full force feedback,  xboxdrv
              tries  to  emulate  other effects. This emulation hasn't been tested much and might
              not always work as expected. Bug reports and test cases are welcome.

              Note that you must close the application that is using force feedback always before
              you  close  the  xboxdrv  driver,  else  you  might  end  up  with  a  hanging non-
              interruptable xboxdrv process that will require a reboot to get rid of.

              When using xboxdrv in daemon mode with multiple controller slots you have to enable
              force feedback for each slot separately.

       -R, --test-rumble
              Pressing  LT  will  move  the left rumble motor and pressing RT will move the right
              one. Rumble motor strength depends on how  hard  you  press.  This  is  useful  for
              testing the rumble motors.

       -r, --rumble L,R
              Set  the  speed  for  both  rumble  motors.  Values from 0 to 255 are accepted, the
              default is 0,0.

   CONTROLLER SLOT OPTIONS
       Controller slots are used when running xboxdrv in daemon mode.   Each  slot  represents  a
       complete  controller  configuration. If you want to use multiple controller in daemon mode
       you have to supply multiple controller slots.

       --controller-slot N
              Switches to the controller slot with the number N, numbering starts at zero.

       --next-controller
              Switches to the next controller slot.

       --match RULE,...
              Limits a controller slot to devices that match any one of the given rules. Possible
              match rules are:

              usbid=VENDOR:PRODUCT
                     Match controllers that have the given USB vendor and product ids.

              vendor=VENDOR
                     Match controllers that have the given USB idVendor.

              product=PRODUCT
                     Match controllers that have the given USB idProduct.

              property=PROPERTY:VALUE
                     Match  against  an  arbitrary  udev  property,  with name PROPERTY and value
                     VALUE.

              usbpath=BUS:DEV
                     Match against the USB path given by BUS and DEV.

              usbserial=SERIAL
                     Match against the USB iSerial number.

       --match-group RULE,...
              Limits a controller slot to devices that match all of  the  given  rules.  Possible
              match rules are the same as for --match.

   CONFIG SLOT OPTIONS
       You can use multiple configurations, called config slots, with your controller. You switch
       between those multiple configurations by pressing the Guide button by default, but you can
       also set another button via the option --toggle.

       --config-slot NUM
              Select the config slot NUM.

       --next-config
              Allows  the creation of an alternative uinput configuration to which one can toggle
              at runtime by pressing the ui-toggle button (defaults to guide).

              $ xboxdrv \
                  --mouse \
                --next-config
                  --ui-axismap X1=ABS_X,Y1=ABS_Y \
                  --ui-buttonmap A=JS_0,B=JS_1

              The above configuration would install mouse emulation as first configuration and  a
              simple  joystick emulation as second configuration. Allowing toggling between mouse
              emulation and joystick handling by pressing the guide button.

              Not that --next-config is  currently  limited  to  only  configurations  done  with
              --ui-buttonmap  and  --ui-axismap,  autofire, throttle emulation, deadzones and all
              other things can currently not be switched at runtime.

       --toggle XBOXBTN
              Sets  the  button  that  will  be  used  to  toggle  between  different   different
              configurations.  A  value  of  'void'  will disable the toggle button. If no toggle
              button  is  specified,  the  guide  button  will  be   used   to   toggle   between
              configurations.

   CONFIGURATION OPTIONS
       --modifier MOD
              Add  a  modifier  to the modifier stack, see [Modifier] for a full list of possible
              modifier.

       --timeout MSEC
              Specify the number of miliseconds that  xboxdrv  will  wait  for  events  from  the
              controller  before moving on and processing things like auto-fire or relative-axis.
              Default value is 10, smaller values will give you a higher resolution auto fire and
              relative event movement, but will waste some more CPU.

       -b, --buttonmap BUTTON=BUTTON,...
              Button  remapping  is  available  via  the  --buttonmap option. If you want to swap
              button A and B start with:

              $ xboxdrv --buttonmap A=B,B=A

              If you want all face buttons send out A button events:

              $ xboxdrv --buttonmap B=A,X=A,Y=A

              Possible button names are (aliases are in parenthesis):

              Button Names

              ┌─────────────────────────────────┬──────────────────────────────────┐
              │Name                             │ Description                      │
              ├─────────────────────────────────┼──────────────────────────────────┤
              │start, back                      │ start, back buttons              │
              ├─────────────────────────────────┼──────────────────────────────────┤
              │guide                            │ big  X-button  in   the   middle │
              │                                 │ (Xbox360 only)                   │
              ├─────────────────────────────────┼──────────────────────────────────┤
              │a(1), b(2), x(3), y(4)           │ face buttons                     │
              ├─────────────────────────────────┼──────────────────────────────────┤
              │black, white                     │ black,   white   buttons  (Xbox1 │
              │                                 │ only,  mapped  to  lb,   rb   on │
              │                                 │ Xbox360)                         │
              ├─────────────────────────────────┼──────────────────────────────────┤
              │lb(5), rb(6)                     │ shoulder  buttons (Xbox360 only, │
              │                                 │ mapped to black, white on Xbox1) │
              ├─────────────────────────────────┼──────────────────────────────────┤
              │lt(7), rt(8)                     │ analog      trigger       (needs │
              │                                 │ --trigger-as-button option)      │
              ├─────────────────────────────────┼──────────────────────────────────┤
              │tl, tr                           │ pressing   the   left  or  right │
              │                                 │ analog stick                     │
              ├─────────────────────────────────┼──────────────────────────────────┤
              │du(up),   dd(down),    dl(left), │ dpad      directions      (needs │
              │dr(right)                        │ --dpad-as-button option)         │
              ├─────────────────────────────────┼──────────────────────────────────┤
              │green, red, yellow, blue, orange │ guitar buttons                   │
              └─────────────────────────────────┴──────────────────────────────────┘
              Just like with --ui-buttonmap you can add button filter to each button.

       --axismap AXIS=MAPPING,...
              Axis remapping is available via --axismap and works the same as button mapping.  In
              addition  you  can supply a sign to indicate that an axis should be inverted. So if
              you want to invert the y1 axis start with:

              $ xboxdrv --axismap -Y1=Y1

              If you want to swap the left and right stick start with:

              $ xboxdrv --axismap X2=X1,Y2=Y1,X1=X2,Y1=Y2

              Possible axis names are: x1, y1, x2, y2, lt, rt

              Swaping lt or rt with x1, y1, x2, y2 will not work properly, since their  range  is
              different.

              Just like with --ui-axismap you can add axis filter to each axis.

   MODIFIER PRESET CONFIGURATION OPTIONS
       The  options in this sections are sortcuts for --modifier options.  Unlike --modifier they
       are not order depended, but have a predefined order that is used no matter  the  order  in
       which the options are given.

       --autofire BUTTON=FREQUENCY,...
              Autofire  mapping  allows  you  to  let  a  button  automatically fire with a given
              frequency in miliseconds:

              $ xboxdrv --autofire A=250

              Combining --autofire with button map allows you to have one button act as  autofire
              while another one, emitting the same signal, acts normally.

              $ xboxdrv --autofire B=250 --buttonmap B=A

       --axis-sensitivty AXIS=SENSITIVITY,...
              The sensitive of an axis can be adjusted via --axis-sensitivty:

              $ xboxdrv --axis-sensitivty X1=-1.0,Y1=-1.0

              A  value  of  0 gives you the default linear sensitivity, values larger then 0 will
              give you higher sensitivity, while values  smaller  then  0  will  give  you  lower
              sensitivity.  Sensitivity  values  in the range of [-1, 1] will generally give good
              results, everything beyond that won't be of much practical use.

              Sensitivity works by applying:

              t = 2 ** sensitivity;
              pos = (1.0f - (1.0f - pos) ** t) ** (1 / t);

              To the value of the axis, this means that both the minimum value  and  the  maximum
              value of the axis will always stay the same, just the response inbetween changes.

              For  a  complete  freeform  way  to change the axis response see the Response Curve
              Filter.

       --calibration CALIBRATIONSPEC
              If your gamepad for some reason can't reach the maximum  value  or  isn't  centered
              properly you can fix that via the calibration options:

              $ xboxdrv --calibration X2=-32768:0:32767

              X2  is  the  axis  name  and  the three values that follow are min, center and max.
              Simply insert the values that jstest reports when your axis is  in  the  respective
              positions.

              You  can  also  use  the  calibration option if you want to make your joystick more
              sensitive. A setting of:

              xboxdrv --calibration AXIS=MIN:CENTER:MAX,...

              Will cause the joystick device report maximum position  when  your  stick  is  only
              moved half the way.

       --deadzone NUM
              The  deadzone is the area at which the sticks do not report any events. The default
              is zero, which gives the best sensitifity but might  also  cause  trouble  in  some
              games  in  that the character or camera might move without moving the stick. To fix
              this one has to set the value to something higher:

              $ xboxdrv --deadzone 4000

              A value of 4000 works quite well for most games.

              You can also give the deadzone in percentage:

              $ xboxdrv --deadzone 15%

       --deadzone-trigger NUM
              The left and right trigger have a separate deadzone value which  can  be  specified
              with:

              $ xboxdrv --deadzone-trigger 15%

       --dpad-rotation DEGREE
              Allows  you to rotate the dpad. DEGREE must be a multiple of 45. This can be useful
              in isometric games where the playfield itself is rotated, thus a:

              xboxdrv --dpad-rotation 45

              Will give you controls  that  are  relative  to  your  character  instead  of  your
              viewpoint.

       --four-way-restrictor
              The  --four-way-restrictor  option  allows  one  to  limit  the  movement  on  both
              analogsticks to only  four  directions  (up,  down,  left,  right),  the  diagonals
              (up/left,  up/right,  down/left, down/right) are filtered out from the output. This
              option is useful for games such as Tetris, that don't need diagonals and where  you
              don't  want  to  accidently  trigger  the down-move while trying to do a left/right
              move.

       --relative-axis AXIS=NUM,...
              The function --relative-axis allows you to change the behaviour of an axis so  that
              your  movement  of  it  moves its value up or down instead of applying it directly.
              This allows you to simulate throttle control for flightsim games.

              Since the axis might be upside down, you might want to use the  --axismap  function
              to reverse it.

              $ xboxdrv --relative-axis y2=64000 --axismap -y2=y2

       --square-axis
              The  Xbox360  gamepad,  as  most  other  current  day gamepads, features a circular
              movement range, which restricts the movement so that the  distance  to  the  center
              never  gets  beyond 1. This means that when you have the controller at the top/left
              the value reported is (0.7, 0.7) (i.e. length 1, angle 45) instead of  (1,1).  This
              behaviour is different then most classic PC joysticks, which had a square range and
              would report (1,1) when hold in the top/left corner.

              Some old games (i.e. mostly DOS stuff) require a square movement range and will not
              function  properly  with  the Xbox360 gamepad. Via the --square-axis option you can
              work around this issue and diagonals will be reported as (1,1).

   UINPUT PRESET CONFIGURATION OPTIONS
       The following  options  are  simple  shortcuts  for  common  configurations  that  can  be
       accomplished manually by using --ui-buttonmap and --ui-axismap.

       --trigger-as-button
              LT and RT send button instead of axis events

       --trigger-as-zaxis
              Combine LT and RT to form a zaxis instead

       --dpad-as-button
              The DPad sends button instead of axis events.

       --dpad-only
              Both sticks are ignored, only the DPad sends out axis events. Useful for games that
              might  get  confused  by  additional  analog  axis.  Combining  this  option   with
              --trigger-as-button is recommend in most situations.

       --guitar
              Sets  a  predefined  button  and axis mapping for use with guitar controllers. This
              mainly gets rid of a few  unnecessary  buttons  and  axis  not  used  by  a  guitar
              controller.

       -m, --mouse
              Lets the controller act as a mouse. It is indendical to:

              $ xboxdrv \
                --dpad-as-button
                --deadzone 4000
                --trigger-as-zaxis
                --axismap "-y2=y2,-trigger=trigger"
                --ui-axismap "x1=REL_X:15:20,y1=REL_Y:15:20,y2=REL_WHEEL:5:100,x2=REL_HWHEEL:5:100,trigger=REL_WHEEL:5:100"
                --ui-buttonmap "a=BTN_LEFT,b=BTN_RIGHT,x=BTN_MIDDLE,y=KEY_ENTER,rb=KEY_PAGEDOWN,lb=KEY_PAGEUP,"
                --ui-buttonmap "dl=KEY_LEFT,dr=KEY_RIGHT,du=KEY_UP,dd=KEY_DOWN,"
                --ui-buttonmap "start=KEY_FORWARD,back=KEY_BACK,guide=KEY_ESC,tl=void,tr=void"

              You  can  customize it by the usual means, just make sure that --mouse comes before
              your customization options on the command line.

              Note that if you have your mouse buttons switched you  must  adjust  the  above  to
              match your mouse configuration or the button events will come out wrong.

       --mimic-xpad
              Causes  xboxdrv to use the same axis and button names as the xpad kernel driver for
              wired Xbox360 controller

       --mimic-xpad-wireless
              Causes xboxdrv to use the same axis and button names as the xpad kernel driver  for
              wired Xbox360 controller

   UINPUT CONFIGURATION OPTIONS
       --no-uinput
              Do  not to start UInput, instead simply read events from the controller, useful for
              debugging.

       --no-extra-devices
              By default xboxdrv will allocate multiple uinput devices and sort events to each of
              them.  Thus  mouse related events like BTN_LEFT or REL_X will go to a virtual mouse
              device, while ABS_X events would go to a virtual joystick device and KEY_ESC  would
              go to a virtual keyboard device.

              This  option  disables  that  automatism and all events will go to the same virtual
              device.

              Manual assignment to a specific  device  (i.e.   KEY_ESC@keyboard,  BTN_A@joystick,
              ...) is still possible.

       --no-extra-events
              By default xboxdrv will allocate multiple uinput devices and sort events to each of
              them. Thus mouse related events like BTN_LEFT or REL_X will go to a  virtual  mouse
              device,  while ABS_X events would go to a virtual joystick device and KEY_ESC would
              go to a virtual keyboard device.

              To make sure sure that a mouse, keyboard or joystick device is properly detected by
              Xorg,  the kernel or libraries such SDL xboxdrv will insert extra dummy events. For
              example a mouse device needs REL_X and REL_Y events to be detected as such,  but  a
              configuration  that  only  wants  to emulate the mouse buttons won't provide those,
              thus xboxdrv will add them automatically.  The --no-extra-events option will switch
              this behaviour off.

       --device-name NAME
              Changes  the  descriptive  name the device will have. This options acts the same as
              --device-names CURRENTSLOT.auto=NAME

       --device-names TYPE.SLOT=NAME,...
              Changes the descriptive name the device will have. TYPE is one of mouse,  keyboard,
              joystick,  auto  or a number. SLOT is a slot number or auto.  The auto name acts as
              wild card and matches everything.

       --device-usbid VENDOR:PRODUCT:VERSION:BUS
              Changes the vendor, product, version and bus id that the device will have. The last
              two  arguments  are  optional.   This  options  acts  the  same  as --device-usbids
              CURRENTSLOT.auto=VENDOR:PRODUCT:VERSION:BUS

       --device-usbids TYPE.SLOT=VENDOR:PRODUCT:VERSION:BUS,...
              Changes the vendor, product, version and bus id the device will have. TYPE  is  one
              of mouse, keyboard, joystick, auto or a number. SLOT is a slot number or auto.  The
              auto name acts as wild card and matches everything.

       --ui-clear
              Removes all uinput mappings and will leave the driver in a blank state and only map
              those  things you added yourself. If you only want to get rid of individual buttons
              you can use the 'void' event.

       --ui-buttonmap UIBUTTONSPEC,...
              UIBUTTONSPEC = XBOXBUTTON [ "+" XBOXBUTTON ] [ "^" FILTER ] ... "=" ( RELSPEC | BTNSPEC | EXECSPEC ) ;
              RELSPEC      = [ DEVICEID "-" ] "REL_" [ ":" [ VALUE ] [ ":" REPEAT ] ] ;
              BTNSPEC      = [ DEVICEID "-" ] ( ( "BTN_" NAME ) | ( "KEY_" NAME ) ) { "+" BTNSPEC } ;
              EXECSPEC     = PROGRAM { ":" ARGUMENT } ;
              XBOXBUTTON   = "a" | "b" | "x" | "y" | "lb" | "rb" | "lt" | "rt" |
                             "tl" | "tr" | "start" | "select" | "back" | "guide" | "black" | "white" ;
              FILTER       = "toggle" | "invert" | "autofire" [ ":" RATE ] [ ":" DELAY ] | log [ ":" STRING ] ;
              NAME         = STRING ;
              VALUE        = NUMBER ;
              REPEAT       = NUMBER ;
              DEVICEID     = NUMBER ;

              Allows you to change the event code that is send to the  kernel  for  buttons.  The
              usage  is  similar to the normal button mapping, except that the right hand side is
              an event name from /usr/include/linux/input.h. You can use all KEY_ or  BTN_  codes
              for --ui-buttonmap.

              If  the right hand side is left empty all the supplied filters will be added to the
              already existing button binding instead of a new one.

              Aside from the named keys, you can also give the input code directly as number  via
              the syntax KEY_#NUM.

              Instead of the low level KEY_ names, which represent keycodes, you can also use the
              higher level X11 keysyms XK_, the keysyms have the advantage that they map directly
              to  the  key  you expect, while a KEY_ name gets mangled by the X11 keymap and will
              often not report what you expect in case you use a keymap that  is  different  then
              your keyboard (i.e. dvorak on a qwerty keyboard).

              A full list of valid X11 keysyms can be optained with --help-x11keysym.

              For  joystick  buttons there is in addition to the BTN_JOYSTICK, BTN_X, etc. macros
              the special name JS_$NUM, which sets the given button to the $NUMS joystick button,
              i.e.:

              $ xboxdrv --ui-clear --ui-buttonmap A=JS_0,B=JS_1

              Note that this will only work if no other joystick button ids are in the way.

              You  can  also map a button to a REL_ event. In that case you can supply additional
              paramaters in the form of:

              $ xboxdrv --ui-buttonmap X=REL_???:VALUE:REPEAT

              VALUE gives the value of the event (default: 10)

              REPEAT gives the number of milisecond to pass  before  the  event  is  fired  again
              (default: 5)

              The  special  'void'  event  allows  you to clear any existing bindings for a given
              button, which can be useful in cases when a game only supports a limited number  of
              buttons.

              You  can  also  prepend  a device_id to the UIBUTTONSPEC which allows you to create
              multiple  uinput  devices.  By  default  'auto'  is  assumed  as  device_id   which
              automatically  try  to  do  the  right thing, sending keyboard events to a keyboard
              device and mouse events to a mouse device. Other possible values  are  'mouse'  and
              'keyboard'.  A  device_id of '0' refers to the first joystick device, values larger
              then 0 to the second, third, etc.

              Note that the 'mouse' and 'keyboard' device_id names do not give  you  a  mouse  or
              keyboard  device,  these are just symbolic names for the devices into which xboxdrv
              will sort events that look like a mouse or keyboard event. The final  determination
              of  which  device gets handled as what will be done by the Kernel or Xorg depending
              on what events a device provides.

              An example configuration making use of device_id would look like this:

              xboxdrv -s \
                --ui-clear \
                --ui-buttonmap A=JS_0@0,B=JS_1@0 --ui-axismap X2=ABS_X@0,Y2=ABS_Y@0
                --ui-buttonmap X=JS_0@0,Y=1-JS_1@0 --ui-axismap X2=ABS_X@1,Y2=ABS_Y@1

              In this example the left stick creates  a  joystick  device  and  the  right  stick
              creates a separate joystick device.

              When  using  multiple  controller slots you can additionally append the slot id and
              thus assign events across controller slot boundaries. The syntax for that is:

              BTN_A@{deviceid}.{slotid}

              Instead of giving just a single button, it is also possible to give two buttons  to
              --ui-buttonmap to allow shifting:

              xboxdrv -s \
                --ui-clear \
                --ui-buttonmap A=JS_0,B=JS_1,LB+A=JS_2,LB+B=JS_3

              In  this  example  LB acts as shift button, if A is pressed without LB it will send
              out a JS_0 event, but if LB is pressed it will send  a  JS_2  event  instead.  This
              allows you to multiply the number of available buttons on the controller.

              See  the  section  KEYBOARD  EMULATION below on how to resolve issues with Xorg not
              detecting the virtual keyboard that xboxdrv creates.

              You can also apply filters to button events:

              xboxdrv -s \
                --ui-buttonmap A^toggle=JS_0

              For documentation on the filters you can apply to events see [Button Filter].

       --ui-axismap UIAXISSPEC,...
              UIAXISSPEC = [ XBOXBTN "+" ] XBOXAXIS { "^" FILTER }  "=" ( RELSPEC | RELREP | KEYSPEC | ABSSPEC ) ;
              KEYSPEC    = [ "key:" ] "KEY_" NAME ":" "KEY_" NAME ":" THRESHOLD ;
              RELSPEC    = [ "rel:" ] "REL_" NAME ":" VALUE ":" REPEAT ;
              RELREP     = "rel-repeat:" "REL_" NAME ":" VALUE ":" REPEAT ;
              ABSSPEC    = [ "abs:" ] "ABS_" NAME ;
              FILTER     = ( "calibration" | "cal" ) ":" MIN ":" CENTER ":" MAX |
                           ( "sensitifity" | "sen" ) ":" SENSITIFITY |
                           ( "deadzone" | "dead" ) ":" MIN ":" MAX ":" SMOOTH |
                           ( "relative" | "rel" ) ":" SPEED  |
                           ( "responsecurve" | "response" | "resp" ) { ":" VALUE }
              XBOXBTN    = "a" | "b" | "x" | "y" | "start" | "back" | "guide" | "lb" | "rb" | ...
              XBOXAXIS   = "x1" | "y1" | "x2" | "y2" | "z" | "lt" | "rt" | "dpad_x" | "dpad_y" ;
              VALUE      = NUMBER ;
              REPEAT     = NUMBER ;
              THRESHOLD  = NUMBER ;
              NAME       = STRING ;

              Similar to --ui-buttonmap this option allows you to change the event code  that  is
              send  to  the  kernel  for  axes. The events that are available are the same as for
              --ui-buttonmap.

              $ xboxdrv --ui-axismap X1=REL_???:VALUE:REPEAT

              VALUE gives the maximum value of the event, the actual  value  that  gets  send  is
              VALUE * axis_state.  (default: 10)

              REPEAT  gives  the  number  of  milisecond  to pass before the event is fired again
              (default: 5).

              The value of -1 has a special meaning, it will result in the REL event being  fired
              as  soon  as possible (i.e.  every timeout miliseconds).  This is the recomment way
              for handling mouse emulation, as it will keep REL events syncronized and thus avoid
              jaggies in the movement, that will result from manually specifying a timeout.

              $ xboxdrv --ui-axismap X1=KEY_UP:KEY_DOWN:THRESHOLD

              KEY_UP gives the keycode to be send when the axis is moved up

              KEY_DOWN gives the keycode to be send when the axis is moved down

              THRESHOLD gives the threshold that triggers the sending of an event

              Just like --ui-buttonmap, you can also use shift keys in place of the XBOXAXIS:

              $ xboxdrv --ui-axismap X1=ABS_X,LB+X1=ABS_RX

              This  allows you to send ABS_X events normally and ABS_RX events when the LB button
              is held down.

              For information on how to use axis filters, see [Axis Filter].

INPUT EVENT HANDLER

       Input event handler decide what comes out  of  the  virtual  input  devices  that  xboxdrv
       creates.  They  for  example  decide  that  when  button A is pressed on a gamepad, that a
       virtual keyboard will emit a press of the space key.

       Furthermore input event handler can also perform some basic transformation  of  the  input
       signals, thus a joystick can be used to send WASD keys.

   BUTTON EVENT HANDLER
       A  button  event  handler  decides  what  happens when a button is pressed, it needs to be
       specified with the --ui-buttonmap option. The example below shows the simplest use case:

       $ xboxdrv --ui-buttonmap A=key:KEY_A

       Here key is the name of the button event handler, while KEY_A is an argument for the event
       handler. What kind of arguments an event handler allows depends on the event handler.

       There is also a shorthand form of specifying event handlers by just writing:

       $ xboxdrv --ui-buttonmap A=KEY_A

       Here no handler is specified explicitly, if that is the case, the appropriate handler will
       be guessed based on the event type. EV_KEY events will be  handled  by  the  key  handler,
       EV_REL by the rel handler and EV_ABS by the abs handler.

       key:KEY_EVENT, key:KEY_EVENT:KEY_EVENT:HOLD_THRESHOLD_MSEC
              The  key  handler is the most basic one, it maps a button directly to a virtual key
              or another button.

              If additional arguments are supplied the button  will  be  able  to  send  out  two
              different events. The first event specified will be send when the button is clicked
              normally, while the second event will be send in case the button is hold  down  for
              the time specified in HOLD_THRESHOLD_MSEC.

              An example for the hold button would look like:

              xboxdrv \
                --ui-buttonmap A=JS_0:JS_1:500

              This  will  send  JS_0  events when the button is pressed and switch to JS_1 events
              when the button was hold for 500 miliseconds.

              The hold button feature is useful  to  effectly  double  the  number  of  available
              buttons,  thus  the dpad can for example be used to send out eight different button
              events instead of just four, which is enough to handle weapons in most FPS games.

       abs    not yet implemented

       rel:REL_EVENT:VALUE:REPEAT
              The rel handler will send out a REL event whenever the  button  is  pressed.  VALUE
              gives  the  value  of the event that will be send, while REPEAT gives the number of
              miliseconds till the event will be send again.

              A typical use for REL events is emulation of  the  scroll  wheel  of  a  mouse,  an
              example configuration would be:

              xboxdrv \
                --ui-buttonmap Y=rel:REL_WHEEL:1:500,A=rel:REL_WHEEL:-1:500

              Here Y will scroll up and A will scroll down.

       cycle-key:KEY_EVENT:...
              The  cycle-key  handler  will  switch the KEY_EVENT that gets send with each button
              press. This is useful in situations where a range of buttons should be mapped to  a
              single  key.  For  example  a FPS might have weapons mapped from 1 to 6, but only a
              single key on the gamepad is free, thus one could write:

              xboxdrv \
                --ui-buttonmap A=cycle-key:KEY_1:KEY_2:KEY_3:KEY_4:KEY_5:KEY_6

       cycle-key-named:NAME:KEY_EVENT:...
              The cycle-key-named handler works exactly like the cycle-key handler, except that a
              name has to be supplied for the cycle sequence. The name of the sequence is used by
              cycle-key-ref to access the sequence and reuse it for another button.

              In this simple example A is used to toggle through all weapon keys forward, while B
              is used to toggle the keys backwards:

              xboxdrv \
                --ui-buttonmap A=cycle-key-named:weapons:KEY_1:KEY_2:KEY_3:KEY_4,B=cycle-key-ref:weapons

       cycle-key-ref:NAME:DIRECTION
              The  cycle-key-ref  handler will access and reuse the named cycle keysequence given
              by NAME.  If DIRECTION can either be 'forward' or 'backward', if  no  direction  is
              supplied it will default to 'backward'.

              See cycle-key-named for a full example.

       exec   The  exec  button  handler  allows one to launch an application when the button was
              pressed. An example would look like this:

              xboxdrv \
                --ui-buttonmap A=exec:/home/juser/local/bin/screenshot.sh

              Possible uses for the button are the ability to do  screenshots  or  perform  other
              tasks that are outside the main application you are using xboxdrv with.

       macro  A button can be bound to a macro via:

              xboxdrv \
                --ui-buttonmap A=macro:/home/juser/.xboxdrv/somefile.macro

              The .macro file has the form of:

              send KEY_LEFTSHIFT 1
              wait 500
              send KEY_LEFTSHIFT 0

              All abs, rel and key events can be send from a macro file.

   AXIS EVENT HANDLER
       Axis  event  handler decide what happens when an axis is moved.  Like button event handler
       they come in different forms and like button event handler they provide a  shortcut  form.
       EV_KEY  events will be handled by the key handler, EV_REL by the rel handler and EV_ABS by
       the abs handler.

       abs:ABS_EVENT
              The abs handler is the simplest of them all, it will simply send out the  value  it
              gets  as  input  as  the  given  ABS_EVENT  event  to  the  kernel.  Thus  a  basic
              configuration to make the left stick behave as joystick would look like this:

              xboxdrv \
                --ui-axismap X1=abs:ABS_X,Y1=abs:ABS_Y

       key:KEY_UP:KEY_DOWN:THRESHOLD
              KEY_UP gives the keycode to be send when the axis is moved up

              KEY_DOWN gives the keycode to be send when the axis is moved down

              THRESHOLD gives the threshold that triggers the sending of an event

              Just like --ui-buttonmap, you can also use shift keys in place of the XBOXAXIS:

              $ xboxdrv --ui-axismap X1=ABS_X,LB+X1=ABS_RX

              This allows you to send ABS_X events normally and ABS_RX events when the LB  button
              is held down.

       rel:REL_EVENT:VALUE:REPEAT
              VALUE  gives  the  maximum  value  of the event, the actual value that gets send is
              VALUE * axis_state.  (default: 10)

              REPEAT gives the number of milisecond to pass  before  the  event  is  fired  again
              (default: 5).

              The  value of -1 has a special meaning, it will result in the REL event being fired
              as soon as possible (i.e.  every timeout miliseconds).  This is the  recomment  way
              for handling mouse emulation, as it will keep REL events syncronized and thus avoid
              jaggies in the movement, that will result from manually specifying a timeout.

              The rel handler is mainly useful for  mouse  pointer  emulation,  if  you  want  to
              emulate a mouse scroll wheel use the rel-repeat handler instead.

       rel-repeat:REL_EVENT:VALUE:REPEAT
              The  rel-repeat  handler is similar to the rel handler, but optimized for emulating
              the scroll wheel of a mouse.

              VALUE isn't scaled to how far the axis has moved, instead it is  constant,  instead
              the time given in REPEAT is scaled according to the axis movement. Thus the further
              the stick is moved, the more events will be send.

              The need for both rel-repeat and rel arises from the fact that Xorg converts scroll
              wheel  movement to button presses before they are handed to an application, thus an
              application never properly sees the changes in VALUE,  by  scaling  REPEAT  instead
              that problem is worked around.

INPUT FILTER

       Input  filter  allow  to  manipulate the events that come from the controller. They can be
       used on --buttonmap, --axismap, --ui-buttonmap and --ui-axismap.  The  difference  between
       the  two  is  that  the  --ui-...  versions  applies to the uinput events, while the other
       version applies to Xbox360 controller events.

   BUTTON FILTER
       tog, toggle
              The toggle filter will turn the button into a toggle button,  clicking  the  button
              will  set  it  to  pressed  state and pressing it again will unpress it. Useful for
              games where you might want to permanently run or duck without  holding  the  button
              pressed.

       inv, invert
              The  invert filter will keep the button in pressed state when it is not pressed and
              in unpressed state when it is pressed.

       auto, autofire:RATE:DELAY
              The autofire filter allows one to repeatedly send  button  press  events  when  the
              button is held down. It takes two optional parameters:

              RATE is the number of miliseconds between button press events.

              DELAY the amount of miliseconds till the autofire will start, before that delay the
              button will act as normal.

       click-press
              The click-press filter will transmit a single  button  click  when  the  button  is
              pressed.

       click-release
              The  click-release  filter  will  transmit a single button click when the button is
              released.

       click-both
              The click-both filter will transmit a  single  button  click  when  the  button  is
              pressed and another one when it is released.

       const:VALUE
              The  const  filter  will  ignore  the input signal and send a constant value to the
              output. This can be used for example in combination with multiple configurations to
              signal a game or another application which configuration is currently active.

       delay:TIME
              A  button  has  to  be held down for TIME miliseconds before it will emit an event,
              press events shorter then that will be ignored.

       log:STRING
              The log filter will output everything to stdout that goes through it  to,  this  is
              useful for debugging the filter. A STRING can be provided as parameter that will be
              outputed before the event.

   AXIS FILTER
       cal, calibration:MIN:CENTER:MAX
              See --calibration.

       sen, sensitivity:SENSITIVITY
              See --axis-sensitivity.

       dead, deadzone:VALUE, deadzone:MIN:CENTER:MAX
              Deadzone filter applies a deadzone to the current axis.  If only MIN  is  provided,
              the  parameter  will  be  interpreted  as  -MIN:MIN:1. If the argument is 1, smooth
              filtering will be applied so that the  end  of  the  deadzone  is  0.  Setting  the
              argument to 0 will apply a simple cut-off filter, where all events smaller then the
              threshold are ignored.

       rel, relative:SPEED
              See --relative-axis.

       resp, response:VALUES:...
              The response curve filter allows you to completely change the way an  axis  reacts.
              The  filter  takes  a list of VALUES that are then linearly interpolated and spread
              across the full range of the axis. An example would look like this:

              xboxdrv \
               --ui-axismap x1^resp:-32768:-4000:0:4000:32767

              Here the X1 axis is manipulated so that it will have a  lower  sensitivity  in  the
              center and a higher one on the outside.

       const:VALUE
              The  const  filter  will  ignore  the input signal and send a constant value to the
              output. This can be used for example in combination with multiple configurations to
              signal a game or another application which configuration is currently active.

       log:STRING
              The  log  filter  will output everything to stdout that goes through it to, this is
              useful for debugging the filter. A STRING can be provided as parameter that will be
              outputed before the event.

   MODIFIER
       While  button  and  axis filter only apply to a single axis or button at a time, modifiers
       apply to the complete controller at once and can thus be  used  to  perform  modifications
       that  require  input  from multiple axis or buttons. Most of the modifiers explained below
       replicate functionality provided by regular options, but allow more fine tuning,  such  as
       limiting the effects to a single analog stick instead of just applyig it to all. Note that
       modifiers are applied one after the other, so order is important.

       dpad-rotate=DEGREE
              See --dpad-rotation.

       dpad-restrictor=RESTRICTON
              Restricts the dpad movement, values for RESTRICTON can be:

              x-axis: only allow movement in the X axis

              y-axis: only allow movement in the Y axis

              fourway: allow movement in X and Y axis, but filter out diagonals

       4wayrest, four-way-restrictor=XAXIS:YAXIS
              See --four-way-restrictor.

       square, square-axis=XAXIS:YAXIS
              See --square-axis.

       rotate=XAXIS:YAXIS:DEGREE:MIRROR
              Rotates the stick given by XAXIS and YAXIS by DEGREE and optionally MIRRORS it.

       stat, statistic
              The statistic modifier  doesn't  actually  modify  anything,  instead  it  collects
              statistics on the controller, such as how many times a button has been pressed. The
              results of the collections will be displayed on shutdown of xboxdrv.

              Note that the stat modifier is part of the modifier  stack,  thus  to  get  correct
              results  you must make sure that it comes first in the stack when it should work on
              real events and not be confused by auto-fire or similar modifications.

RUNNING XBOXDRV

   USING A SINGLE CONTROLLER
       Plug in your Xbox360 gamepad and then unload the xpad driver via:

       $ rmmod xpad

       If   you   want   to   permanently   unload    it    add    the    following    line    to
       /etc/modprobe.d/blacklist.conf:

       blacklist xpad

       Next  you  have to load the uinput kernel module which allows userspace programs to create
       virtual input devices and the joydev module handles the /dev/input/jsX devices:

       $ modprobe uinput
       $ modprobe joydev

       You also have to make sure that you have access rights to  /dev/input/uinput,  either  add
       yourself to the appropriate group, adjust the permissions or run xboxdrv as root.

       Once  ensured  that  xpad is out of the way and everything is in place start the userspace
       driver with:

       $ xboxdrv

       Or in case you don't have the necessary rights  (being  in  group  root  should  often  be
       enough) start the driver as root via:

       $ sudo xboxdrv

       This will create /dev/input/js0 and allow you to access the gamepad from any game. To exit
       the driver press Ctrl-c.

       By default xboxdrv will echo all controller events to the console, this makes it  easy  to
       see  if  things  are  properly  working,  but  will  eat a lot of CPU, thus it is strongly
       recomment to disabled that output with the --silent option.

       The trigger buttons are handled by xboxdrv normally as axis, giving you  analog  feedback,
       while this reproduces the Xbox360 controller the most accurately, it will confuse many and
       only be useful in a few, racing games mainly. So in the majority of cases it is  recomment
       to change the triggers to regular buttons via:

       $ xboxdrv --trigger-as-button

   USING MULTIPLE CONTROLLER
       If  you want to use multiple wired controllers you need to start multiple instances of the
       xboxdrv driver and append the -i argument to select the appropriate controller like this:

       $ xboxdrv -i 1

       If you have multiple wireless controller you need  to  start  multiple  instances  of  the
       xboxdrv driver and append the --wid option like this:

       $ xboxdrv --wid 1

       You have to sync the wireless controller as usual.

       To  see  a list of all the controllers that xboxdrv detects being connected to your system
       use:

       $ xboxdrv --list-controller

   HOTPLUGGING AND XBOXDRV DAEMON
       To allow hotplugging  of  gamepads  xboxdrv  has  to  be  run  in  daemon  mode.  This  is
       accomplished with the --daemon option:

       $ xboxdrv --daemon

       When  launched  in  daemon  mode  xboxdrv  will listen to udev events and thus be notified
       whenever a new USB device gets plugged into the computer. It will then match  that  device
       against its list of supported devices and launch a separate thread to handle that gamepad.

       Note  that  xboxdrv  will not allow an arbitrary large number of controllers to be used in
       that mode, it can only handle as many controllers as you have allocated  controller  slots
       at  startup.  New slots can be allocated with --next-controller and by default one slot is
       always allocated, thus to support three controller you would run it with:

       $ xboxdrv --daemon --next-controller --next-controller

       Each controller slot can be configured individually and you can limit which  gamepad  gets
       assigned to which slot with the --match option.

       Note  that  xboxdrv  will create the virtual uinput devices on startup, not when a gamepad
       gets plugged in, this allows one to plug in gamepads even after a game or  an  application
       like XBMC has already been launched and still have it all function properly.

       In  daemon  mode  xboxdrv  can  be  detached from the current shell via --detach, to get a
       handle on it to kill it you can write its pid via the --pid-file:

       $ sudo xboxdrv --daemon --detach --pid-file /var/run/xboxdrv.pid

XBOXDRV DAEMON DBUS INTERFACE

       When Xboxdrv is run as daemon it will export some API functions via D-Bus,  thus  allowing
       to  make  configuration  changes at runtime. The D-Bus interface can be accessed either by
       the numerous language bindings provided or via the generic command line tool dbus-send  or
       by the more userfriendly xboxdrvctl tool. Examples below are given for the raw dbus-send.

       Introspection is provided via the usual means:

       dbus-send --session --type=method_call --print-reply \
         --dest=org.seul.Xboxdrv /org/seul/Xboxdrv org.freedesktop.DBus.Introspectable.Introspect

       dbus-send --session --type=method_call --print-reply \
         --dest=org.seul.Xboxdrv /org/seul/Xboxdrv/ControllerSlots/0 org.freedesktop.DBus.Introspectable.Introspect

       dbus-send --session --type=method_call --print-reply \
         --dest=org.seul.Xboxdrv /org/seul/Xboxdrv/Daemon org.freedesktop.DBus.Introspectable.Introspect

       Status  information  on  available  slots,  configuration  and  active  controllers can be
       obtained via:

       dbus-send \
         --session --type=method_call --print-reply \
         --dest=org.seul.Xboxdrv /org/seul/Xboxdrv/Daemon  org.seul.Xboxdrv.Daemon.Status

       Setting the LED on controller 0 can be done via:

       dbus-send --session --type=method_call  --print-reply \
         --dest=org.seul.Xboxdrv  /org/seul/Xboxdrv/ControllerSlots/0  org.seul.Xboxdrv.Controller.SetLed int32:4

       Setting the rumble motors on controller 0 can be done via:

       dbus-send --session --type=method_call  --print-reply \
         --dest=org.seul.Xboxdrv  /org/seul/Xboxdrv/ControllerSlots/0  org.seul.Xboxdrv.Controller.SetRumble int32:255 int32:255

       Setting a specific controller slot configuration, just as --toggle BTN allows, can be done
       with:

       dbus-send --session --type=method_call  --print-reply \
         --dest=org.seul.Xboxdrv  /org/seul/Xboxdrv/ControllerSlots/0  org.seul.Xboxdrv.Controller.SetConfig int32:2

TESTING

       Knowing how to test a xboxdrv configuration is absolutely crucial in understanding what is
       wrong in a given setup. Testing the configuration in a game is  most  often  not  helpful,
       since  you  won't  see the true cause beyond endless layers of abstraction between you and
       the actual events. Luckily there are a few tools you can use to test,  all  of  these  are
       command line based and it is recomment that you get familiar with them when you want to do
       any more complex configuration.

   EVTEST
       evtest lets you read raw input events from /dev/input/eventX. The event  devices  are  the
       very  core  of  all  event handling, things like the joystick devices are derived from the
       event device, so if you want to fix some issue on the joystick device, you have to fix the
       event device.

       evtest is available in the tools/ directory or as part of your distribution in the package
       evtest. your distribution.

   JSTEST
       jstest lets you read the output out of a joystick event device (/dev/input/js0).

       jstest is available in the tools/ directory or as part of your distribution joystick.

   SDL-JSTEST
       sdl-jstest lets you see events as games using SDL see them. This is  very  important  when
       you want to set and test the SDL_LINUX_JOYSTICK environment variables.

       It is currently available via:

       $ svn co svn://svn.berlios.de/windstille/trunk/sdl-jstest

       Or from the same Ubuntu PPA that also contains xboxdrv in the package sdl-jstest.

   XEV
       xev  lets  you  see  the  events  that  Xorg sees. Note however that you might not see all
       events, since some will be grapped by your Window manager before they reach xev,  this  is
       normal.

       xev is part of every Linux distribution, on Ubuntu its available via:

       $ apt-get install x11-utils

   JSCALC AND JSCALIBRATOR
       Both  of these tools lets you calibrate your gamepad, however with pretty much all current
       gamepads this is no longer needed and actually harmful as it might overwrite  a  perfectly
       good  working configuration with a broken one (unplugging the gamepad or a reboot will fix
       that). So avoid them unless you clearly understand the issues of using them.

       If your gamepad produces incorrect data and you do want to calibrate it you might want  to
       check  out  the option --calibration, which lets you tweak the way xboxdrv interprets your
       gamepad data.

   MOUSE
       No tools for testing the output on /dev/input/mouseX are known.

   NOTE
       If the tools provide no output at all, this might not be due to a wrong configuration, but
       due  to  Xorg  grabbing  your  event  device and locking it, see Xorg section for possible
       fixes.

EXAMPLES

       The configurations below are just a few random examples, further examples can be found  in
       the examples/ directory of the xboxdrv source tree or in /usr/share/doc/xboxdrv/examples/.

   TURNING TRIGGERS INTO BUTTONS
       By  default  xboxdrv  will  handle  the trigger as analog axis, not buttons, while this is
       beneficial for racing games, it will confuse many other games, thus  xboxdrv  provides  an
       easy way to change the handling into buttons via the --trigger-as-button option:

       $ xboxdrv --trigger-as-button

   CONFIGURE A DEADZONE
       Many  gamepads  don't center exactly at zero, but at random values around it. This 'noise'
       can confuse some games and is thus be best filtered out, this can be accomplished with:

       $ xboxdrv --deadzone 25%

       The percentance is the amount of noise that will get filtered out, you can also  give  raw
       device  values  if  you  leave  out  the  % sign. If you want to have a deadzone only on a
       specific axis you have to use axis filter:

       $ xboxdrv --buttonmap X1^deadzone:15000

   KEYBOARD EMULATION
       The following configuration will cause xboxdrv to emulate a keyboard, which can be  useful
       for  games  that  are played with keyboard, like Flash games or games that don't support a
       joystick. Since different games use different keyboard keys you might have to  adjust  the
       keybindings to fit the game:

       $ xboxdrv \
         --ui-clear \
         --ui-buttonmap a=XK_a,b=XK_b,x=XK_x,y=XK_y \
         --ui-buttonmap dl=XK_Left,dr=XK_Right,du=XK_Up,dd=XK_Down

   FIGHTING GAMES:
       In this configuration the left and right trigger get turned into digital buttons. All axis
       except the dpad are ignored. RB and RT are mapped to act as  if  buttons  1,2  and  3  are
       pressed  simultaniously  which  is  useful for some special attacks.  Instead of using the
       native button names, the 1,2,3,...  aliases are used, which makes things a  little  easier
       to read:

       $ xboxdrv \
         --dpad-only \
         --trigger-as-button \
         --buttonmap lb=1,x=2,y=3,lt=4,a=5,b=6 \
         --buttonmap rb=1,rb=2,rb=3 \
         --buttonmap rt=4,rt=5,rt=6

   CH FLIGHTSTICK EMULATION IN DOSBOX:
       In dosbox.conf set:

       [joystick]
       joysticktype = ch

       Start xboxdrv with:

       $ xboxdrv -s \
         --trigger-as-zaxis --square-axis \
         --relative-axis y2=64000 --axismap -y2=x2,x2=y2

       Your  right  analog  stick  will  act  as  trottle  control,  the trigger as rudder. Using
       --modifier to install a four-way restrictor might also be worth  a  consideration  to  not
       accidently touch the throttle when the rudder is moved.

   USING MOUSE EMULATION AND JOYSTICK AT THE SAME TIME
       To  use  mouse  emulation  and  joystick  at  the  same  time  you  have  to  register two
       configuration with xboxdrv, this works via:

       $ xboxdrv --next-config --mouse

       The --next-config option will open up a second configuration and all configuration options
       on  the  right  side  of it will go there, while everything on the left side of it will go
       into the first configuration. Toggling between the configurations  works  with  the  guide
       button, you can have as many configuratios as you want.

   MAPPING EVERY BUTTON MULTIPLE
       Some  games might require more buttons then your gamepad has, in those situation it can be
       useful to map a button twice by using shifted buttons:

       $ xboxdrv \
         --ui-clear \
         --ui-axismap X1=ABS_X,Y1=ABS_Y \
         --ui-buttonmap a=JS_0,b=JS_1,x=JS_2,y=JS_3 \
         --ui-buttonmap lb+a=JS_4,lb+b=JS_5,lb+x=JS_6,lb+y=JS_7 \
         --ui-buttonmap rb+a=JS_8,rb+b=JS_9,rb+x=JS_10,rb+y=JS_11
       .fi

       Here all face buttons are get mapped three times, once when
       pressed normally, once when pressed while LB is held down and
       once when RB is held down, thus given you for the six buttons
       12 virtual ones.

   SAUERBRATEN
       First analogstick gets mapped te cursor keys, second analogstick  gets  mapped  to  mouse.
       Note: This is just an incomplete example, not a perfectly playable configuration, you have
       to do tweaking yourself.

       $ xboxdrv \
         --ui-axismap x2=REL_X:10,y2=REL_Y:-10,x1=KEY_LEFT:KEY_RIGHT,y1=KEY_UP:KEY_DOWN \
         --ui-buttonmap a=BTN_RIGHT,b=BTN_LEFT,x=BTN_EXTRA \
         --ui-buttonmap rb=KEY_5,lb=KEY_6,lt=BTN_LEFT,rt=BTN_RIGHT \
         --ui-buttonmap y=KEY_ENTER,dl=KEY_4,dr=KEY_2,du=KEY_1,dd=KEY_3,back=KEY_TAB,start=KEY_ESC \
         -s --deadzone 6000  --dpad-as-button --trigger-as-button

   WARSOW
       Note: This is just an incomplete example, not a perfectly playable configuration, you have
       to do tweaking yourself.

       $ xboxdrv \
         --ui-axismap x2=REL_X:10,y2=REL_Y:-10,x1=KEY_A:KEY_D,y1=KEY_W:KEY_S \
         --ui-buttonmap a=KEY_LEFTSHIFT,b=BTN_C,x=BTN_EXTRA,y=KEY_C \
         --ui-buttonmap lb=BTN_RIGHT,rb=KEY_SPACE \
         --ui-buttonmap lt=KEY_Z,rt=BTN_LEFT \
         --ui-buttonmap dl=KEY_4,dr=KEY_2,du=REL_WHEEL:-1:150,dd=REL_WHEEL:1:150 \
         --ui-buttonmap back=KEY_TAB,start=KEY_ESC \
         -s --deadzone 6000 --dpad-as-button --trigger-as-button

WRITING START-UP SCRIPTS FOR GAMES

       When you want full game specific configurability and automatic launching of xboxdrv, it is
       easiest to write little startup scripts for your games that will  launch  xboxdrv,  launch
       your game and then when the game is finished tear down xboxdrv:

       #!/bin/sh

       exec xboxdrv \
         --trigger-as-button -s \
         -- \
         your_favorite_game

       # EOF #

       Here  your_favorite_game  is  the executable of your game and is passed to xboxdrv as last
       argument. This will cause xboxdrv to start the game and keep running as long as  the  game
       is running, when the game is done, xboxdrv will quit automatically.

       If  you  want  to pass parameters to the game you have to add a -- separator, as otherwise
       your options to the game would be eaten up by xboxdrv.

SDL NOTES

       To let SDL know which axis act as a hat and which act as normal axis you have  to  set  an
       environment variable:

       $ SDL_LINUX_JOYSTICK="'Xbox Gamepad (userspace driver)' 6 1 0"
       $ export SDL_LINUX_JOYSTICK

       You might also need in addition use this (depends on the way SDL was compiled):

       $ SDL_JOYSTICK_DEVICE="/dev/input/js0"
       $ export SDL_JOYSTICK_DEVICE

       This will let the DPad act as Hat in SDL based application. For many games the driver will
       work without this, but especially in Dosbox this variable is very important.

       If you use options in xboxdrv that change the number  of  axis  you  have  to  adjust  the
       variable accordingly, see:

       · ⟨ftp://ptah.lnf.kth.se/pub/misc/sdl-env-vars⟩

       SDL_LINUX_JOYSTICK
         Special  joystick  configuration  string  for linux. The format is "name numaxes numhats
         numballs" where name is the name string of the joystick (possibly in single quotes), and
         the rest are the number of axes, hats and balls respectively.

       SDL_JOYSTICK_DEVICE
         Joystick device to use in the linux joystick driver, in addition to the usual: /dev/js*,
         /dev/input/event*, /dev/input/js*

TROUBLESHOOTING

   "NO XBOX OR XBOX360 CONTROLLER FOUND"
       This means that either your controller isn't plugged  in  or  is  not  recognized  by  the
       driver. To fix this you need to know the idVendor and the idProduct numbers, which you can
       find out via:

       $ lsusb -v

       Once done you can try to add them to this array in src/xpad_device.cpp:

       XPadDevice xpad_devices[] = { ... }

       If you have success with that, send a patch to <grumbel@gmail.com>,  if  not,  contact  me
       too, I might be able to provide additional help.

       As  an alternative you can also use the --device and --type option to enforce a USB device
       as well as a controller type an bypass any auto detection.

   "UNKNOWN DATA: BYTES: 3 DATA: ..."
       This means that your controller is sending data that isn't understood by  the  driver.  If
       your  controller still works, you can just ignore it, the Xbox360 controller seems to send
       out useless data every now and then. If your controller does not work and you  get  plenty
       of  those  lines  when  you move the sticks or press buttons it means that your controller
       talks an  un-understood  protocol  and  some  reverse  enginiering  is  required.  Contact
       <grumbel@gmail.com> and include the output of:

       $ lsusb -v

       Along with all the "Unknown data" lines you get.

   "ERROR: NO STUITABLE UINPUT DEVICE FOUND"
       Make  sure  that  uinput  and  joydev kernel modules are loaded. Make sure that you have a
       /dev/input/uinput, /dev/uinput or /dev/misc/uinput and permissions to access it.

       Before reporting this as a bug make sure you have tested if the driver itself works with:

       $ xboxdrv --no-uinput -v

   THE WIRELESS CONTROLLER DOESN'T WORK
       You have to sync the controller befor it can be used, restart of the driver  isn't  needed
       and  the  driver  should  let  you  now  when  it recieves a connection after you sync the
       controller.

   KEYBOARD EMULATION
       When you try to let xboxdrv send a keyboard events via --ui-buttonmap or --ui-axismap Xorg
       must  register  the  device  as  keyboard  device  to  work  properly.  This seems to work
       automatically when you bind more then two keyboard keys, if you  bind  less  you  need  to
       create the file /etc/hal/fdi/preprobe/xboxdrv.fdi containing:

       <?xml version="1.0" encoding="UTF-8"?>
       <deviceinfo version="0.2">
         <device>
           <match key="input.product" string="Xbox Gamepad (userspace driver) - Keyboard Emulation">
             <addset key="info.capabilities" type="strlist">input.keys</addset>
           </match>
         </device>
       </deviceinfo>

       This will tell HAL and later Xorg that xboxdrv acts as keyboard.

   WACOM ISSUES
       In  some older kernels a Wacom graphic tablet creates a joystick device, so xboxdrv or any
       other real joysticks ends up as /dev/input/js1 instead of /dev/input/js0.  In  many  games
       this causes the joystick to not function any more.

       A temporary workaround for this is to simply delete the joystick device js0 and replace it
       with a symbolic link js1 via:

       $ sudo ln -sf /dev/input/js1 /dev/input/js0

       This workaround will  only  last  till  the  next  reboot,  since  the  device  names  are
       dynamically  created, but for the time being there doesn't seem to any other way to easily
       work around this issue.

       In newer kernels this issue is fixed.

   UINPUT ISSUES
       On Ubuntu 9.04 the permissions of the uinput device have changed  to  0640,  meaning  only
       root  has  access to the device.  To change this back so that users in the group root have
       access the device and in turn can run xboxdrv without sudo  you  have  to  create  a  file
       called /etc/udev/rules.d/55-permissions-uinput.rules with the content:

       KERNEL=="uinput", MODE="0660", GROUP="root"

   WINE ISSUES
       When using the Xbox360 gamepad in Wine it is not specially handled as Xbox360 gamepad, but
       as generic DirectInput gamepad.  This means games  will  not  display  the  proper  button
       labels,  but  just  numbers  (i.e.  'Btn1' instead of 'A' for example). Aside from that it
       should work fine.

       XInput support (the Microsoft DirectInput replacment,  not  the  Xorg  xinput)  is  as  of
       January  2011  not  implemented  in  Wine,  so games that require XInput and don't have an
       DirectInput fallback will not work with a Xbox360 controller, unofficial  patches  however
       do exist.

XORG ISSUES

       If  you  start  xboxdrv  and  instead  of  having  a  fully  working  joystick, you end up
       controlling the mouse that might be due to recent changes in Xorg and its  device  hotplug
       handling.    There    are    four    workarounds,    the   one   that   involves   editing
       /etc/hal/fdi/policy/preferences.fdi is the recommont one.

   TEMPORARY WORKAROUND USING HAL-DEVICE
       Get the device id from hal:

       $ hal-find-by-property --key 'info.product' --string 'Xbox Gamepad (userspace driver)'

       Then remove the device from hal with:

       $ hal-device -r $DEVICEID

   TEMPORARY WORKAROUND USING XINPUT
       Second workaround works with xinput:

       $ xinput list
       $ xinput set-int-prop $DEVICEID 'Device Enabled' 32 0

   PERMANENT WORKAROUND USING .FDI FILES
       The former two workarounds are just temporary and have to be redone after  each  start  of
       xboxdrv, the last workaround is a permanent one:

       You have to edit:

       /etc/hal/fdi/policy/preferences.fdi

       And insert the following lines:

       <match key="input.product" string="Xbox Gamepad (userspace driver)">
         <remove key="input.x11_driver" />
       </match>

   PERMANENT WORKAROUND BY DISABLING DEVICE AUTO DETECTION
       A  fourth  workaround  involved disabling the autodetection of Xorg completely, you can do
       that by adding the following lines to /etc/X11/xorg.conf:

       Section "ServerFlags"
         Option "AutoAddDevices" "False"
       EndSection

       Note that without auto detection you will have to manually configure  all  your  mice  and
       keyboards  or your Xorg Server won't start up properly. So unless you are already familiar
       with editing Xorg you better avoid this workaround. Workaround 3) has basically  the  same
       effect,  except that auto detection only gets disabled for the single device it is causing
       problems.

FORCE FEEDBACK PROGRAMMING

       For documentation on the FF interface see:

       · ⟨http://github.com/github/linux-2.6/blob/f3b8436ad9a8ad36b3c9fa1fe030c7f38e5d3d0b/Documentation/input/ff.txt⟩

       · /usr/include/linux/input.h

       Additional, non Linux related, force feedback related information can be found at:

       · ⟨http://www.immersion.com/developer/downloads/ImmFundamentals/HTML/⟩

       · ⟨http://msdn.microsoft.com/en-us/library/bb219655(VS.85).aspx⟩

       fftest is an application you can use to test the force feedback interface.

       Force feedback is disabed by default since it causes trouble in certain application. "Tomb
       Raider: Legend" for example when run in Wine crashes at startup when  rumble  is  enabled,
       while it works perfectly normal when rumble is disabled.

BUGS

   X11 KEYSYM ISSUES
       X11  keysyms  might not work correctly in --ui-buttonmap a=XK_Foobar when Foobar is mapped
       to multiple keycodes in the keymap.

       Workaround: Use KEY_ instead or cleanup your keymap

       Newer versions of Xorg will also do perform some auto configuration  that  might  lead  to
       your  keymap  being  switched  whenever  a  new  keyboard  is detected, in cases of custom
       Xmodmaps this might confuse xboxdrv and make the XK_ style names unusable.  No  workaround
       for that is known right now.

   NON-INTERRUPTABLE PROCESSES DUE TO FORCE FEEDBACK
       Force  feedback  support is brittle, if you Ctrl-c the driver in the wrong moment you will
       end up with a dead uninterruptable process and basically have to reboot. This  looks  like
       it might be a kernel issue and not a xboxdrv one.

       Workaround: Kill the app that uses xboxdrv before xboxdrv itself.

   QUESTIONS, BUG REPORTS AND FEATURE REQUESTS
       Bug reports and feature request can be report to the xboxdrv issue tracker at:

       ⟨https://github.com/Grumbel/xboxdrv/issues/new⟩

       General  questions  and  requests for configuration help should be directed to the xboxdrv
       mailing list at:

       ⟨http://groups.google.com/group/xboxdrv

COPYRIGHT

       Copyright © 2010-2011 Ingo Ruhnke <grumbel@gmail.com> License GPLv3+: GNU GPL version 3 or
       later  ⟨http://gnu.org/licenses/gpl.html⟩  . This is free software: you are free to change
       and redistribute it. There is NO WARRANTY, to the extent permitted by law.

SEE ALSO

       xboxdrvctl(1), evtest(1), jstest(1), jstest-gtk(1), xev(1), fftest(1), lsusb(1)