본문 바로가기
개발이야기

임베디드 리눅스 입력 디바이스 관리

by 코저씨 2019. 4. 18.
728x90

임베디드 리눅스는 USB 바코드 스캐너나 keypad 디바이스를 등록하면 (이는 제품마다 다르지만..)

input device로 인식되어 /dev/input/eventN 장치로 등록되게 된다.

그래서 해당 디바이스를 open 하고 struct input_value 값을 읽어서 keyboard keymap으로 파싱 하여

처리하면 된다.

여기까지는 그리 어려운 일이 아닌데.. 문제는 재부팅 이후..

기본적인 프로세스를 설명하면 다음과 같다.

1. 장치 부팅 후 키패드 드라이버 등록. dev/input/event0으로 등록

2. USB 바코드스캐너를 연결. 리눅스 os에서 dev/input/event1으로 등록

3. 애플리케이션은 dev/input/event0으로 키 입력을 dev/input/event1으로는 바코드 입력을 처리

그런데 여기서 재부팅을 하면 다음과 같이 꼬여 버린다.

1. 재부팅을 하면서 커널이 usb 감지 udev rule이고 뭐고 하기 전에 이미 /dev에 event0로 장치 등록

2. 키패드 드라이버가 insmod 될 때 이미 0 번이 있어서 event1로 등록.

....

즉, 디바이스 넘버가 꼬이면서... 디바이스제어를 고정이름으로 처리하는 애플리케이션은 먹통이 되어 버린다.

이를 처리하기 위해 방법이 뭐 있나 알아보니..

1. USB Power를 제어하여 키패드 드라이버 로브 전에 붙은 장치를 강제로 disconnect 시키고 키패드 등록 후

다시 USB power를 활성화시켜서 다시 USB 장치 등록해주기

=> 하지만 이번 디바이스는 power 컨트롤이 안되는 장치여서 패스

2. https://askubuntu.com/questions/645/how-do-you-reset-a-usb-device-from-the-command-line

위 링크를 통해 USB 장치를 reset 시켜 주기

=> 테스트해보니 USB 통신을 reset 하는 거지 disconnect를 하는 것이 아님

3. /proc/bus/input/devices를 분석하여 키 패드가 어느 넘버로 등록되었는지, USB 바코드가 어디로 등록됐는지

파싱 후 제어하기

=> 파싱 프로그램도 따로 만들어야 하며 USB 포트가 2개 이상인 경우, USB 디바이스가 재연결이 잦은 경우

디바이스 명이 꼬이게 될 수 있다. 또 특정 포트로 연결된 디바이스만 사용하겠다 하면.. 아니다 이런 경우는 없나?

하긴 같은 입력장치를 2개 이상 연결하는 경우가 보통 없지..

이리저리 알아보다 생각해보니 간단하게 구현하는 방법을 생각해 냈다.

1. 키패드 등록 전의 /dev/input/event* 개수를 얻어낸다

ls /dev/input/event* | wc -l

2. 이때 카운트가 0이면 input device가 등록된 게 없다는 게 되며 키패드 드라이버는 event0로 등록되고

카운트가 1또는 2 이상의 값이면 다른 디바이스들이 연결되어있다는 뜻이므로 키 패드는 카운트+1의 값으로 등록이 된다.

(1이면 /dev/event/input1 )

3. 내가 사용하는 디바이스는 usb가 하나이고 usb 허브 사용을 하지 않기에 input device는 2개가 맥스가 되기에

이 방법을 선택했다.

두 개의 event0, event1 장치 중에 하나가 키패드 드라이버라는 걸 알게 되었으니, 남은 것은 USB 바코드스캐너가 된다.

4. 만약 usb 포트가 2개이면 /proc/bus/input/devices 를 가지고 하는 방법을 택해야 했을지도 모른다.

 

(글을 쓰다 보니 오기가 생긴다. 나중에 만들어보자)

728x90