Linux mini-HOWTO

Игровой порт (джойстик)


Игровой порт находится по адресам 0x200-0x207. Для управления обычным джойстиком существует драйвер на уровне ядра. См. ftp://sunsite.unc.edu/pub/Linux/kernel/patches/

, имя файла joystick-*.

Разводка (15-контактный разъем (мама)):

  • 1,8,9,15: +5В (питание)

  • 4,5,12: Земля

  • 2,7,10,14: Цифровые входы BA1, BA2, BB1 и BB2, соответственно

  • 3,6,11,13: ``Аналоговые'' входы AX, AY, BX и BY, соответственно

Контакты +5В обычно подключены прямо к питанию материнской платы и не обеспечивают большую загрузку (в зависимости от материнской платы, блока питания и игрового порта).

Цифровые входы используются для определения состояния кнопок на двух джойстиках (джойстик A и джойстик B, по две кнопки на каждом), подключаемых к порту. Это должны быть обычные входы TTL, и вы можете считывать их состояние непосредственно из регистра состояния (см. ниже). Обычные джойстики устанавливают ноль (0В), при нажатой кнопке, и единицу (5В от питания через резистор 1КОм), в противном случае.

Так называемые аналоговые входы, на самом деле, измеряют сопротивление. Игровой порт имеет четыре одноимпульсных мультивибратора, подключенных к четырем входам. На каждом входе стоит резистор 2.2КОм между выходом мультивибратора и землей. Обычные джойстики имеют потенциометр по каждой оси (X и Y), связанный с +5В и соответствующим входным контактом (AX или AY для джойстика A, и BX или BY для джойстика B).

Во время включения, мультивибратор устанавливает напряжение +5В и ждет, когда напряжение на конденсаторе достигнет 3.3В, а затем сбрасывает напряжение. Таким образом, длительность импульса мультивибратора прямопропорциональна сопротивлению потенциометра на джойстике (т.е. положению джойстика по соответствующей оси): "R = (t - 24.2) / 0.011," где R - сопротивление (Ом) потенциометра, а t - длительность импульса (секунд).

Таким образом, чтобы считать состояние аналогового входа, сначала нужно включить мультивибратор (путем записи в порт; см. ниже), а затем считывать состояние всех четырех осей, пока они сбросятся с 1 на 0, измеряя длительность сигнала. Такое считывание требует много процессорного времени и на многозадачных операционных системах, таких как Linux (для пользовательских программ), результат будет не очень точен, т.к. вы не можете считывать из порта постоянно (если только не используете драйвер на уровне ядра и отключаете прерывания, что, впрочем, требует еще больше процессорного времени). Если вы знаете, что сигнал будет продолжаться достаточно долгое время (десятки миллисекунд), вы можете использовать usleep() перед считыванием, передав процессорное время другим процессам.

Вам нужно использовать только один порт - 0x201 (другие порты идентичны или вообще ничего не делают). Любая запись в этот порт (не важно, что вы записываете) включает мультивибратор. Чтение из порта возвращает состояние входных сигналов:

  • Бит 0: AX (состояние на выходе мультивибратора)

  • Бит 1: AY (состояние на выходе мультивибратора)

  • Бит 2: BX (состояние на выходе мультивибратора)

  • Бит 3: BY (состояние на выходе мультивибратора)

  • Бит 4: BA1 (цифровой вход)

  • Бит 5: BA2 (цифровой вход

  • Бит 6: BB1 (цифровой вход)

  • Бит 7: BB2 (цифровой вход)



Содержание раздела