리눅스 환경에서 게임을 하거나 테스트 자동화를 구성하다 보면, 입력 장치로 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. 전체 구조 이해

데이터 흐름 구조
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,
};
주요 흐름
- USB device match
- xpad_probe() 호출
- input device 등록
- 인터럽트 URB submit
- 패킷 수신
- 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 비교
| 항목 | xpad | xpadneo |
|---|---|---|
| 커널 기본 포함 | O | X |
| Bluetooth 완전 지원 | X | O |
| 진동 지원 | 일부 | 좋음 |
| 유지관리 | 커널 메인라인 | 외부 |
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
참고 사이트
- Linux Kernel Source: drivers/input/joystick/xpad.c
- https://www.kernel.org
- https://github.com/atar-axis/xpadneo
- Ubuntu Wiki: https://wiki.ubuntu.com