드디어 마지막이다. xbox 패드를 마우스처럼 사용하고 싶어 이렇게 동작하도록 수정했다. 처음 연결하면 조이스틱으로 동작하고, 가운데 버튼을 누르면 마우스로 동작하도록 했다. 리눅스에서 조이스틱 쓸 일이 있나?? 초기값을 마우스로 바꿨어야 했다.
input_device에 name을 설정하지 않고 등록하면 xserver로 이벤트를 전달할 수 없다. input_device에 name을 설정하지 않으면 evtest에 이름이 표시되지 않는다.
xbox 스틱으로 들어오는 값을 그대로 사용하면 값이 너무 커서 커서가 화면 끝에서 끝까지 점프한다. 대략 2,000으로 나눴다. 바꿔 말하면 큰 값을 짧은 시간에 한번에 전달하기 위해 조이스틱을 사용한다.
버튼을 누르면 rising edge, falling edge 두 번 동작한다. 비트 시프트로 특정 값을 만족하면 모드가 바뀌도록 했다. 인터럽트 등록할 때 rising, falling edge 필터링 할 수 있는데, urb로 등록하면 그런 게 없는 듯 하다. 짱구를 많이 굴렸다.
xpad.c 드라이버를 따라 한 수준이지만 커스터 마이징을 해 보면서 무엇을 모르고 무엇을 학습했는지 알 수 있었다. 책만 보고서는 절대 이해하지 못했을 지식이다. 사용되는 함수들은 소스 코드를 보지 않는 한 절대 사용하지 못할 함수 들이다. 이미 내가 고민했던 내용을 누군가 해결하여 코드로 구현했다. 소스코드 검색을 자주 해야 시간을 줄일 수 있다.
xpad.c에 보면 사용할 struct에 관심있는 주소를 모두 때려 넣었다. 구조가 복잡하고, 주소가 너무 많아 북마크처럼 주소를 관리해야 한다. 커널에서 내려오면 항상 메모리를 해제할 수 있도록 했다. 보면 볼수록 container_of 매크로로 위력을 실감한다. 부분을 알면 구조체 멤버에 무제한으로 접근할 수 있다. 와!! 이거 생각해낸 사람이 정말 대단하다.
나도 이제 usb, character device에서 하산해도 될 듯 하다.
https://github.com/now0930/xbox_driver
참조 자료