본문 바로가기
개발이야기

임베디드 리눅스 input device 관련

by 코저씨 2019. 2. 14.
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