Ubuntu에서 Xbox 컨트롤러(Xpad) 사용하기

리눅스 환경에서 게임을 하거나 테스트 자동화를 구성하다 보면, 입력 장치로 Xbox 패드를 사용하는 경우가 많다.

Ubuntu에서는 기본적으로 xpad 드라이버가 제공되며, 별도 드라이버 설치 없이도 대부분의 Xbox 컨트롤러를 사용할 수 있다.

이 글에서는 다음 내용을 정리한다.

  • Xpad 드라이버 구조
  • 커널 레벨 동작 방식
  • 장치 인식 확인 방법
  • xpad 설정 및 튜닝
  • xpad vs xpadneo 차이
  • 문제 해결 방법
  • 실제 테스트 예제 코드

1. Xpad란 무엇인가?

xpad는 Linux 커널에 포함된 Xbox 컨트롤러용 HID 드라이버이다.

공식 커널 드라이버이며, 별도 패키지 설치 없이도 Ubuntu에서 기본 동작한다.

지원 대상:

  • Xbox 360 Controller (USB / Wireless)
  • Xbox One Controller (USB 일부 모델)
  • 일부 Xbox 호환 패드

2. 전체 구조 이해

https://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/063/6396/6396f1.jpg

데이터 흐름 구조

Xbox Controller
      ↓
USB HID
      ↓
xpad.ko (kernel driver)
      ↓
Linux Input Subsystem
      ↓
/dev/input/eventX (evdev)
      ↓
User Application (SDL, Steam, Test Tool)

3. 드라이버 로딩 확인

3.1 모듈 확인

lsmod | grep xpad

정상이라면:

xpad  32768  0

3.2 모듈 수동 로딩

sudo modprobe xpad

3.3 장치 연결 후 로그 확인

dmesg | grep -i xpad

예시 출력:

xpad 1-1:1.0: Xbox 360 Controller
input: Microsoft X-Box 360 pad as /devices/.../input/input21

4. 입력 장치 확인

4.1 /dev/input 확인

ls /dev/input/

보통 eventX 형태로 생성된다.

4.2 evtest 사용

설치:

sudo apt install evtest

실행:

sudo evtest

출력 예시:

Event type 1 (EV_KEY)
  BTN_A
  BTN_B
  BTN_X
  BTN_Y

버튼을 누르면 실시간으로 이벤트가 출력된다.

5. 커널 레벨에서 xpad 동작 방식

xpad.c 내부 구조는 대략 다음과 같다.

static struct usb_driver xpad_driver = {
    .name       = "xpad",
    .probe      = xpad_probe,
    .disconnect = xpad_disconnect,
    .id_table   = xpad_table,
};

주요 흐름

  1. USB device match
  2. xpad_probe() 호출
  3. input device 등록
  4. 인터럽트 URB submit
  5. 패킷 수신
  6. input_report_key() 호출

예시 코드:

input_report_key(dev, BTN_A, pressed);
input_sync(dev);

6. 사용자 공간에서 테스트 프로그램 작성

시스템 엔지니어 관점에서,
입력 이벤트를 직접 읽어보는 것이 가장 확실하다.

예제 C 코드 (evdev 직접 읽기)

#include <stdio.h>
#include <fcntl.h>
#include <linux/input.h>
#include <unistd.h>

int main() {
    struct input_event ev;
    int fd = open("/dev/input/event0", O_RDONLY);

    if (fd < 0) {
        perror("open");
        return 1;
    }

    while (1) {
        read(fd, &ev, sizeof(struct input_event));

        if (ev.type == EV_KEY) {
            printf("Key code %d value %d\n", ev.code, ev.value);
        }
    }

    close(fd);
    return 0;
}

컴파일:

gcc test_xpad.c -o test_xpad

7. 무선 Xbox One / Bluetooth 지원

기본 xpad는 Bluetooth를 완벽히 지원하지 않는다.

Bluetooth 환경에서는 보통:

xpadneo 사용

GitHub: https://github.com/atar-axis/xpadneo

설치 예시:

sudo apt install dkms
git clone https://github.com/atar-axis/xpadneo.git
cd xpadneo
sudo ./install.sh

8. xpad vs xpadneo 비교

항목xpadxpadneo
커널 기본 포함OX
Bluetooth 완전 지원XO
진동 지원일부좋음
유지관리커널 메인라인외부

9. 고급 튜닝 (시스템 엔지니어 관점)

9.1 module parameter 확인

modinfo xpad

예시:

parm:  dpad_to_buttons:bool
parm:  triggers_to_buttons:bool

로드 시 옵션 지정:

sudo modprobe xpad dpad_to_buttons=1

9.2 영구 적용

echo "options xpad dpad_to_buttons=1" | sudo tee /etc/modprobe.d/xpad.conf

참고 사이트

답글 남기기