2014-07-24 4 views
2

Linux에서 USB 장치로 작업하고 있으며이 장치를 제어하는 ​​라이브러리를 작성했습니다.특정 연결된 USB 장치 감지

이 장치는 표준 UART 프로토콜을 사용하지 않으므로 open과 직렬 연결을 열고 전송 속도, 정지 비트, 패리티 등 관련 매개 변수를 구성해야합니다. , 시작 비트 - 뱅킹 레지스터.

라이브러리는 정상적으로 작동하지만이 장치가/dev/ttyUSB0라고 가정하기 위해 하드 코딩되었습니다. 즉, 이것은 내가 open에게 전달하는 것입니다. 열리지 않으면 실패합니다.

내가 무엇을하고 싶은지는 /dev/ttyUSB0, /dev/ttyUSB1 등이 있더라도이 장치가 존재 함을 감지하는 것입니다. 또한 이러한 장치가 여러 개 연결되어 있는지 검색합니다.

일련 번호, 제품 ID 등을 반환하는 장치의 특정 레지스터를 폴링하는 코드를 작성하여 USB의 다른 끝에있는 장치가 실제로 내 장치라는 것을 알아낼 수는 있지만 어떻게 할 수 있습니까? 네이티브 C에서 연결된 USB 장치 목록을 다시 찾을 수 있습니까?

또는 커널 모듈과의 인터페이스와 같은 더 우아한 방법이 있습니까? 실제로 사용하는 USB 드라이버를 제공 할 수는 있지만 코드를 살펴볼 때 손실됩니다.

어떤 통찰력에도 감사드립니다.

+0

나는'리눅스'명령을 알고있다. --->'lsusb' - 코딩은 당신에게 약간의 아이디어를 줄 것이다 !!! –

+0

나는 쉽게 답을 얻을 수는 없지만 Apple과 Spotify가 데몬을 사용하여 미디어 장치의 연결을 감지한다는 사실에 유의할 필요가 없습니다. –

+0

높은 수준의 응용 프로그램에서 내 라이브러리의 함수를 호출하여이를 추적하는 별도의 스레드를 실행하게됩니다. 내 라이브러리에서 이것을 구현하는 방법을 모르겠습니다. – justynnuff

답변

2

우아한 방법은 연결되었을 때 udev을 사용하여 장치에 대한 설명 기호 링크를 만드는 것입니다. 내 연구 그룹은 배터리 전원 라즈베리 파이 박스에 연결된 USB 장치에서 데이터를 수집하는 데 사용하는 실제 udev에 규칙의 아주 약간 수정 된 버전의 그 /etc/udev/rules.d

SUBSYSTEM=="tty",ENV{ID_MODEL}=="My_FlowMeter_Model",ENV{ID_USB_INTERFACE_NUM}=="00",SYMLINK+="flowmeter",RUN+="/bin/su pi -c /home/pi/record-flowmeter.sh 

이 같은 라인 뭔가를 추가합니다. 당신이 readlink /dev/flowmeter을 할 수 그것은 또한 당신이 "진짜"장치 파일 이름을 알고 싶다면

stty -F /dev/flowmeter 500000 -ixon -echo -icanon 

같은 명령이있는, 자동으로 스크립트를 실행합니다. fd = open("/dev/flowmeter"); (또는 프로그램에 대한 인수로 전달)

는 당연히 당신이 당신의 자신의 장치에 대한 짧은 이름으로 flowmeter을 교체해야합니다뿐만 아니라 ID_MODEL에 기초하여 갱신 :하지만 대부분은 그냥 링크를 사용할 수 있습니다 사용 lsusb의 출력

여러 장치는 좀 더 복잡하지만 거기에는 많은 udev 규칙의 예가 있습니다.

+0

나쁘지 않습니다. 나는 확실히 udev 규칙으로이 작업을 할 수 있다고 생각합니다. 고맙습니다. – justynnuff

1

Linux에서 찾고있는 정보는/sys 파일 시스템에 있으며 특히 /sys/bus/usb/devices입니다. 거기에서 파일 시스템을 검색하여 장치를 찾아야합니다.

예를 들어, USB 직렬 동글을 내 Linux (커널 버전 2.6.35)에 연결했는데 장치가 /sys/bus/usb/devices/2.1-8으로 표시되었습니다. 여기,이 장치가 vendorId : deviceId에 의해 idVendoridProduct 파일을 검사하여 내 장치라는 것을 알 수 있습니다. 여기에는 이라는 디렉토리가 포함 된 2.1-8:1:0이라는 디렉토리가 있습니다.

분명히 장치를 찾으려면 디렉토리 트리를 검색하여 올바른 항목을 찾으려면 코드 (또는 find을 사용하는 쉘 스크립트)가 필요합니다.

+0

왜 udev를 다시 작성합니까? –