내장 PID의 ttyUSB0에 사용자 정의 PID가있는 USB 직렬 장치 연결


19

큰 성공없이 ttyUSB % n에 자동 (또는 수동으로) 연결하기 위해 사용자 정의 PID가있는 FTDI USB 직렬 장치를 얻으려고합니다. 장치의 일반 VID / PID는 0403/6001입니다. 이 방법으로 프로그래밍하면 플러그가 꽂 히면 완벽하게 자동으로 ttyUSB0에 자동으로 연결됩니다. 드라이버가 새 PID를 고려하여 다시 컴파일 된 경우에도 커스텀 ttyUSB0으로 프로그래밍 된 경우 나타나지 않지만이를 ftdi_sio 장치로 인식합니다. 드라이버를로드합니다.

헤더와 소스에 PID를 추가했습니다.

// in ftdi_sio_ids.h
#define FTDI_CUSTOM_PID 0xABCD // not the actual pid
// then in ftdi_sio.c
static struct usb_device_id id_table_combined [] = {
    // devices....
    { USB_DEVICE(FTDI_VID, FTDI_CUSTOM_PID) },
    // ....

전체 커널을 다시 컴파일하고 장치를 다시 플래시했습니다. 장치를 연결하면 다음과 같은 결과가 나타납니다.

usb 1-1: new full-speed USB device number 2 using at91_ohci
usbcore: registered new interface driver usbserial
usbserial: USB Serial Driver core
USB Serial support registered for FTDI USB Serial Device
usbcore: registered new interface driver ftdi_sio
ftdi_sio: v1.6.0:USB FTDI Serial Converters Driver

lsusb는 올바른 사용자 지정 VID / PID를 보여줍니다. 드라이버는 ftdi_sio를 사용해야한다고 인식하지만 수정되지 않은 PID와 같이 ttyUSB0에 첨부하지 않습니다. 내가 여기서 뭘 잘못하고 있는지에 대한 제안?


1
이것은 어떤 임베디드 타입입니까? UDEV가 있습니까? 그렇다면 UDEV가 최선의 방법입니다 (그리고 더 도움을 드릴 수 있습니다).
Brian Redbeard

답변:


17

커널을 한 번만 수정하면됩니다. 당신은 그것을 무시할 수 있습니다.

  1. 장치의 플러그를 뽑습니다
  2. modprobe ftdi_sio
  3. echo 0403 6001 >/sys/bus/usb-serial/drivers/ftdi_sio/new_id
  4. 장치를 연결하십시오

그리고 당신의 장치는 작동합니다.

다른 대안은 bindsysfs 인터페이스 를 사용하는 것입니다 . lsusb -t이 경우 올바른 경로 + 인터페이스를 파악 하는 데 사용 하는 것이 좋습니다 .

내 시스템에서 usb 저장 장치의 일부 예를 사용하면 usb-serial과 매우 유사합니다.

$ lsusb -t
...
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 5000M
    |__ Port 1: Dev 5, If 0, Class=Hub, Driver=hub/3p, 5000M
        |__ Port 3: Dev 6, If 0, Class=Hub, Driver=hub/3p, 5000M
            |__ Port 3: Dev 7, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
 ...
 $ echo '4-1.3.3:1.0' >/sys/bus/usb/drivers/usb-storage/bind

숫자의 형식은 다음과 같습니다 BUS-PORT(.PORT)+:1.INTERFACE. lsusb 출력에 표시되지 않는 유일한 숫자는 콜론 다음의 첫 번째 숫자입니다. 그리고 그것은 항상 1내 경험이었습니다. 더 깊은 커널 지식을 가진 사람은 아마도 그것이 무엇인지 말해주고 반례를 제공 할 수 있습니다.


고마워요. 허용되는 답변이어야합니다.
Amr Bekhit

1
궁금한 점이 있습니다. 마음이 바뀌면이 vid / pid가 ftdi_sio 드라이버를 사용하지 않고 다른 드라이버를 사용하고 싶지 않은 경우이 단계를 어떻게 되돌 립니까?
Bram

vid / pid를 remove_id에 작성하여 에코를 new_id에 실행 취소하십시오.
robbat2

@trycatch 대답을 받아 주시겠습니까?
robbat2

1
@kay new_id / remove_id는 동적으로 추가 된 ID를 제거하기위한 것입니다. 수행하려는 작업을 이해 한 경우 특정 드라이버가 일부 장치에로드되지 않도록하려고합니다.
robbat2

12

커널을 수정할 필요가 없으며 다음과 같이 프로세스를 자동화 할 수 있습니다.

  1. 다음 줄을 추가하십시오 /etc/udev/rules.d/99-ftdi.rules

    ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", RUN+="/sbin/modprobe ftdi_sio" RUN+="/bin/sh -c 'echo 0403 6001 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id'"

  2. 재부팅하거나 실행 sudo udevadm control --reload하여 새 규칙을 선택하십시오.

  3. 장치를 분리하십시오.

  4. 장치를 연결하십시오.


1

SiLabs의 평가 보드와 완전히 유사한 상황이 발생했습니다-USB-UART 칩 CP2102에는 불규칙한 VID / PID가 제공됩니다.

lsusb

Bus 001 Device 002: ID 10c4:804c Cygnal Integrated Products, Inc.

앞에서 언급 한대로 모듈 cp210x를로드하고 VID / PID를 전송하면 문제가 해결됩니다.

sudo modprobe cp210x

sudo -s

echo 10c4 804c > /sys/bus/usb-serial/drivers/cp210x/new_id

udev에 해당하는 99-cp210.rules 파일은 다음과 같습니다.

ACTION=="add", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="804c", RUN+="/sbin/modprobe cp210x" RUN+="/bin/sh -c 'echo 10c4 804c > /sys/bus/usb-serial/drivers/cp210x/new_id'"


미래의 여행객 작업에 HUSBZB-1 스틱을 얻을려고, 여기에는 / dev / 지그비와는 / dev / Z 파 상기 한 바와 같이하는 CP210x 드라이버를 연결하고 TTY 장치를 심볼릭 링크하는 udev에 파일입니다 ACTION=="add", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="8a2a", RUN+="/sbin/modprobe cp210x" RUN+="/bin/sh -c 'echo 10c4 8a2a > /sys/bus/usb-serial/drivers/cp210x/new_id'" SUBSYSTEM=="tty", ATTRS{interface}=="HubZ Z-Wave Com Port", SYMLINK+="zwave" SUBSYSTEM=="tty", ATTRS{interface}=="HubZ ZigBee Com Port", SYMLINK+="zigbee"
성운
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.