맞춤형 PID가 있는 USB 직렬 장치를 임베디드의 ttyUSB0에 연결합니다.

맞춤형 PID가 있는 USB 직렬 장치를 임베디드의 ttyUSB0에 연결합니다.

나는 큰 성공 없이 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

커널을 한 번 수정할 필요는 없으며 덮어쓸 수 있습니다.

  1. 장치를 분리하세요
  2. modprobe ftdi_sio
  3. echo 0403 6001 >/sys/bus/usb-serial/drivers/ftdi_sio/new_id
  4. 장치를 연결하세요

그러면 장치가 작동해야 합니다.

bind다른 옵션은 sysfs 인터페이스를 사용하는 것입니다 . lsusb -t이 경우 올바른 경로 + 인터페이스를 알아내는 것이 좋습니다.

내 시스템에서 USB 저장 장치를 사용하는 몇 가지 예입니다(USB 직렬 장치와 매우 유사함).

$ 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이는 항상 숫자입니다. 커널에 대한 더 깊은 지식을 가진 사람이 그것이 무엇인지 알려주고 반례를 제시할 수도 있습니다.

답변2

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

  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. 장치를 연결하십시오.

답변3

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'"

관련 정보