리눅스 usb-serial latency 값 줄이기

2024. 2. 12. 20:58프로젝트 로그/테스트x솔루션 JIG 개발기

반응형

 

JIG에서 UART 메시지를 이용하여 Target MCU의 펌웨어 업데이트 하는 기능이 있습니다.

Target MCU에 펌웨어 업데이트 시간을 줄이기 위해 MCU에서 지원하는 최대 baud_rate로 설정하고 리눅스에 설정되어 있는 usb-serial 장치의 latency_timer 값을 1로 설정 하였다.

 

usb-serial/devices/latency_timer란

usb-serial 장치에서 데이터 전송을 얼마나 자주 할 것인지를 결정하는 설정 입니다.

이 값은 USB 버스에서 장치가 데이터 패킷을 보내는 빈도를 조절 합니다. 

예를 들어, 'latency_timer'가 낮은 값으로 설정되어 있다면, 시스템은 더 자주 데이터를 보내게 되어 실시간성이 좋아 지지만 전체 처리량은 감소 할 수 있습니다.

반대로 'latency_timer'가 높은 값으로 설정되면, 데이터 전송은 덜 자주 일어나지만 더 큰 데이터 덩어리를 한번에 보낼 수 있어 전체적인 네트워크 처리량은 증가 할 수 있습니다.

 

latency_timer를 수동으로 줄이는 방법

아래와 같은 스크립트를 작성하고 실행하면, /sys/bus/usb-serial/devices 폴더에 있는 장치들의 latency_timer 값을 1로 변경 합니다.

echo "Set Serial Latency"
for entry in "/sys/bus/usb-serial/devices"/*
do
    if [ -d "$entry" ]; then
        echo $entry
	echo 1 > $entry"/latency_timer"
    fi
done

 

udev 파일을 이용하여 latency_timer 값을 1로 설정하는 방법

lsusb로 디바이스의 VendorID와 Product ID를 확인

orangepi@orangepi5:/sys/bus/usb-serial/devices$ lsusb
Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 008 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 007 Device 002: ID 0403:6015 Future Technology Devices International, Ltd Bridge(I2C/SPI/UART/FIFO)
Bus 007 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 005: ID 0403:6011 Future Technology Devices International, Ltd FT4232H Quad HS USB-UART/FIFO IC
Bus 002 Device 004: ID 0403:6011 Future Technology Devices International, Ltd FT4232H Quad HS USB-UART/FIFO IC
Bus 002 Device 003: ID 0403:6011 Future Technology Devices International, Ltd FT4232H Quad HS USB-UART/FIFO IC
Bus 002 Device 002: ID 0424:2517 Microchip Technology, Inc. (formerly SMSC) Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 002: ID 1409:8000 IDS Imaging Development Systems GmbH U3-36LxXC-C
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

 

아래와 같이 setserial을 설치하고, rules파일을 만듭니다.

 

$ sudo apt install setserial
$ vi 99-usb-serial-latency.rules

 

vi 99-usb-serial-latency.rules 파일 내용

ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", DRIVER=="ftdi_sio", RUN+="/bin/sh -c 'echo 1 > /sys%p/latency_timer'"

 

위에서 작성한 rules 파일을 /etc/udev/rules.d/에 복사 하고 Reboot 해서 적용 되었는지 확인 합니다.

 

# cp 99-usb-serial-latency.rules  /etc/udev/rules.d/
# sudo reboot

 

제대로 설정 되었는지 확인

orangepi@orangepi5:/sys/bus/usb-serial/devices$ cd ~
orangepi@orangepi5:~$ cd /sys/bus/usb-serial/devices/
orangepi@orangepi5:/sys/bus/usb-serial/devices$ ls
ttyUSB0  ttyUSB1  ttyUSB10  ttyUSB11  ttyUSB12  ttyUSB2  ttyUSB3  ttyUSB4  ttyUSB5  ttyUSB6  ttyUSB7  ttyUSB8  ttyUSB9
orangepi@orangepi5:/sys/bus/usb-serial/devices$ cat ttyUSB1/latency_timer
1
orangepi@orangepi5:/sys/bus/usb-serial/devices$

 

반응형