How to programatically unplug & replug an USB device in linux?

linux에서 usb 장치의firmware를 업데이트한 후, 시스템이 새로운 usb 장치 정보를 읽을 수 있도록 usb 장치를 다시 삽입해야 합니다.
우리는 소프트웨어의 방식으로 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입니다.
 
 

좋은 웹페이지 즐겨찾기