How to programatically unplug & replug an USB device in linux?
우리는 소프트웨어의 방식으로 usb설비reset을 사용하여hot-replug목적을 실현하고 시스템이 usb설비 정보를 다시 읽도록 할 수 있다.
커널 리플러그 USB 장치를
1: usbfs 시스템 reset USB 장치 사용
먼저 원본 코드를 보십시오:
drivers/usb/core/devio.c의 usbdevioctl 함수에
case USBDEVFS_RESET:
snoop(&dev->dev, "%s: RESET
", __func__);
ret = proc_resetdevice(ps);
break;
proc_resetdevice가drivers/usb/core/hub를 호출했습니다.c의 usbreset_device usb 장치를 리셋하여 커널 리플렉스 이 usb
usbfs에 대응하는 usb 파일을 열고 ioctl(fd, USBDEVFS RESET, NULL)만 하면 됩니다.
2: 장치 드라이버 수정, ioctl에 USBDEVFS 추가RESET 옵션
저는 ftdisio 드라이브에 추가
static int ftdi_device_reset(struct usb_serial_port *port)
{
struct usb_device *dev = port->serial->dev;
int ret;
ret = usb_lock_device_for_reset(dev,NULL);
if (ret == 0) {
ret = usb_reset_device(dev);
usb_unlock_device(dev);
}
return ret;
}
static int ftdi_ioctl(struct tty_struct *tty, struct file *file,
unsigned int cmd, unsigned long arg)
{
struct usb_serial_port *port = tty->driver_data;
struct ftdi_private *priv = usb_get_serial_port_data(port);
dbg("%s cmd 0x%04x", __func__, cmd);
/* Based on code from acm.c and others */
switch (cmd) {
/* To support usb_control_msg to ttyUSB */
case USBDEVFS_CONTROL:
//dev_printk(KERN_DEBUG, &port->serial->dev->dev, "%s: CONTROL
", __FUNCTION__);
return tty_usb_control(port, (void __user *)arg);
break;
/* reset after downloading new firmware */
case USBDEVFS_RESET:
return ftdi_device_reset(port);
break;
이 핵을 사용하면 장치 구동을 통해 이 usb 장치를 실행할 수 있어 매우 편리하다.
제어 reset 장치를 사용하려면:
static int usb_device_reset(int fd)
{
int ret;
#define FTDI_USBDEV_RESET _IO('U', 20)
ret = ioctl(fd, FTDI_USBDEV_RESET, NULL);
if (ret < 0)
printf("USB device reset: %s
", strerror(errno));
return ret;
}
위 #define FTDIUSBDEV_RESET _IO('U', 20), 사실 USBDEVFSRESET
수정된 드라이버를 사용하여 구현했는데 실제 효과는 다음과 같습니다.
root@DLRC:/opt/sniffer/bin#setmoteid_4x -d /dev/ttyUSB0 -w 92
product :HKUST ATC Telos Rev B(9), len:24
old product :HKUST ATC Telos Rev B(9), len:24
new product : HKUST ATC Telos Rev B(92)
serial save:DS000338, len:8
ftdi_sio 1-1.4.3:1.0: forced unbind
ep93xx-ohci ep93xx-ohci: shutdown urb c563dde0 ep1in-bulk
ftdi_sio 1-1.4.3:1.0: device disconnected
hub 1-1.4:1.0: state 7 ports 4 chg 0000 evt 0008
hub 1-1.4:1.0: state 7 ports 4 chg 0000 evt 0008
usb 1-1.4.3: reset full speed USB device using ep93xx-ohci and address 4
hub 1-1.4:1.0: state 7 ports 4 chg 0000 evt 0008
hub 1-1.4:1.0: state 7 ports 4 chg 0000 evt 0008
usb 1-1.4.3: ep0 maxpacket = 8
usbserial_generic 1-1.4.3:1.0: usb_probe_interface
usbserial_generic 1-1.4.3:1.0: usb_probe_interface - got id
ftdi_sio 1-1.4.3:1.0: usb_probe_interface
ftdi_sio 1-1.4.3:1.0: usb_probe_interface - got id
ftdi_sio 1-1.4.3:1.0: FTDI USB Serial Device converter detected
usb 1-1.4.3: Detected FT232BM
usb 1-1.4.3: FTDI USB Serial Device converter now attached to ttyUSB1
ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0
볼 수 있습니다. 리셋은 리플렉스 USB입니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
9-1. 구조체와 클래스 비교, 구조체 개념(struct)구조체와 클래스는 프로그램 코드의 구성요소가 되는 범용 구조이다. 상수, 변수, 그리고 함수를 정의하는 것과 같은 구문을 사용해서 구조체와 클래스에 프로퍼티와 메서드를 기능적으로 추가할 수 있다. 스위프트에서 클래스...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.