精华内容
下载资源
问答
  • 检测U盘热插拔事件

    2018-01-10 10:31:46
    检测U盘热插拔事件检测U盘热插拔事件检测U盘热插拔事件
  • Linux USB U盘热插拔挂载和卸载

    万次阅读 2016-03-31 16:57:35
    MT7620的U盘热插拔监听,热插拔挂载与卸载。 当插入U盘,则挂载; 当拔出U盘,则卸载。 监听热插拔采用socket监听,由用户层程序监听,并实现自动挂载与卸载。

    一、硬件平台

            1、  控制器:MT7620(A9内核)

            2、  RTC芯片:MCP7940

    二、软件平台

           1、开发环境:Ubuntu12.04 

           2、SDK内核包:MT7620 SDK软件开发包(MediaTek_ApSoC_SDK_4320_20150414.tar.bz2)

           3、内核版本:linux-2.6.36.x

    三、参考资料

          《MTK_APSoC_SDK_User_Manual.pdf》。

          下载链接:http://download.csdn.net/detail/xhoufei2010/9478004

    四、USB U盘驱动简介

            USB Mass Storage是一类USB存储设备,这些设备包括USB磁盘、USB硬盘、USB磁带机、USB光驱、U盘、记忆棒、智能卡和一些USB摄像头等,这类设备由USB协议支持。

           对于USB的U盘驱动,已经非常完善,大家只需要简单地配置一下内核,开启U盘的功能即可。

    五、U盘配置

           5.1 取消内核自动挂载功能

            由于Linux 内核包默认会自动挂载,且内核初始化的过程中,挂载出现在创建USB节点之前,经常出现自动挂载导致内核崩溃,故取消内核挂载,自己监听USB的热插拔,然后挂载。

            1.开启设置busybox

            进入到内核开发包目录 cd /home/kernel/source

            输入命令 make menuconfig

            Kernel/Library/Defaults Selection  --->Customize Busybox Settings ,选中该选项,如图5-1所示,设置完成之后,保存退出。

            

                                                              图5-1 设置Busybox

           2. 取消USB自动挂载/卸载功能

           在图5-1保存设置之后,会自动跳转到busybox的设置界面,在界面中,进入Linux System Utilities,取消掉Support command execution at device addition/removal 选项,如图5-2所示。


                                                           图5-2 取消USB的自动挂载/卸载

           5.2 开启U盘功能

            在linux-2.6.36.x中,输入命令make menuconfig,进入配置

            Linux Kernel Configuration ---> Device Drivers  ---> USB support ,在配置中,选中USB Mass Storage support,如图5-3所示。


                                                             图5-3 开启USB U盘支持

    六、监听USB热插拔程序

           6.1 说明

            对于USB的热插拔,实际就是建立一个socket,采用socket监听USB的插拔信息。

            当监听到USB插入信息,且发现在 /dev目录下,存在 sda1或者sdb1分区(有时候分区节点为其他名称,根据实际分区修改分区的名称判断条件)的时候,就挂载USB分区到 /tmp/usb目录下。

            当监听到USB拔出信息,则卸载 /tmp/usb目录。

            6.2 usb控制器头文件,UsbController.h。

    /**
     * @addtogroup module_genericGateway
     * @{
     */
    
    /**
     * @file
     * @brief USB控制器,管理USB插拔及挂载。
     * @details 
     * @version 1.0.0
     * @author sky.houfei
     * @date 2016-3-18
     */
    
    
    #ifndef _USB_USBCONTROLLER_H_
    #define _USB_USBCONTROLLER_H_
    
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    //******************************************************************************
    #include <stdbool.h>
    
    
    //******************************************************************************
    /**
     * @brief USB控制器初始化,准备USB的监听服务。
     * @return ret, int,如果初始化成功,则返回0,否则为-1.
     */
    int UsbController_Init(void);
    
    
    /**
     * @brief USB设备挂载监听。
     * @details 如果USB之前没有挂载且当前可以挂载,则挂载。
     * \n 如果USB之前挂载成功,此时设备已经被拔出,则卸载。
     */
    void UsbController_MountMonitor(void);
    
    
    /**
    * @brief 是否已经挂载成功。
    * @return bool s_isMounted, USB设备挂载成功,则返回 true, 否则返回false。
    */
    bool UsbController_IsMounted(void);
    
    
    #ifdef __cplusplus
    }
    #endif
    
    
    #endif  // _USB_USBCONTROLLER_H_
    
    /** @} */
    

           6.3 usb控制器监听热插拔c文件, UsbController.c

    /**
     * @addtogroup module_genericGateway
     * @{
     */
    
    /**
     * @file
     * @brief USB控制器,管理USB插拔及挂载。
     * @details 
     * @version 1.0.0
     * @author sky.houfei
     * @date 2016-3-18
     */
    
    //******************************************************
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    #include <ctype.h> 
    #include <sys/un.h> 
    #include <sys/ioctl.h> 
    #include <sys/socket.h> 
    #include <linux/types.h> 
    #include <linux/netlink.h> 
    #include <errno.h> 
    #include <unistd.h> 
    #include <arpa/inet.h> 
    #include <netinet/in.h> 
    #include "UsbController.h"
    #include "GenericGateway.h"
    
    //******************************************************
    #define UEVENT_BUFFER_SIZE 2048 
    
    //******************************************************
    static bool isUsbConnected = false;
    static int s_hotplugSock = 0;
    static bool s_isMounted = false;
    
     //******************************************************
    static void* UsbController_HotPlugMonitor(void);  // USB监听,监听USB的插拔事件,并进行挂载和卸载USB设备。
    
    
    //******************************************************
    static int UsbController_HotplugSockInit(void) 
    { 
        const int buffersize = 1024; 
        int ret; 
    
        struct sockaddr_nl snl; 
        bzero(&snl, sizeof(struct sockaddr_nl)); 
        snl.nl_family = AF_NETLINK; 
        snl.nl_pid = getpid(); 
        snl.nl_groups = 1; 
    
        int s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT); 
        if (s == -1)  
        { 
            perror("socket"); 
            return -1; 
        } 
        setsockopt(s, SOL_SOCKET, SO_RCVBUF, &buffersize, sizeof(buffersize)); 
    
        ret = bind(s, (struct sockaddr *)&snl, sizeof(struct sockaddr_nl)); 
        if (ret < 0)  
        { 
            perror("bind"); 
            close(s); 
            return -1; 
        } 
    
        return s; 
    } 
    
    
    /**
     * @brief USB控制器初始化,准备USB的监听服务。
     * @return ret, int,如果初始化成功,则返回0,否则为-1.
     */
    int UsbController_Init(void)
    {
    	const int buffersize = 1024; 
        int ret; 
    	pthread_t id;
    
        struct sockaddr_nl snl; 
        bzero(&snl, sizeof(struct sockaddr_nl)); 
        snl.nl_family = AF_NETLINK; 
        snl.nl_pid = getpid(); 
        snl.nl_groups = 1; 
    
    	if (access("/dev/sda1", 0) == 0)
    	{
    		// USB已经连接成功
    		isUsbConnected = true;
    	}
    
    
    	UsbController_MountMonitor();	// 首次检查USB是否挂载
        s_hotplugSock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT); 
        if (s_hotplugSock == -1)  
        { 
            perror("socket error"); 
            return -1; 
        } 
        setsockopt(s_hotplugSock, SOL_SOCKET, SO_RCVBUF, &buffersize, sizeof(buffersize)); 
    
        ret = bind(s_hotplugSock, (struct sockaddr *)&snl, sizeof(struct sockaddr_nl)); 
        if (ret < 0)  
        { 
            perror("bind error"); 
            close(s_hotplugSock); 
            return -1; 
        } 
    
    	ret = pthread_create(&id, NULL, UsbController_HotPlugMonitor, NULL);  
        if (ret != 0)   
        {  
            printf("pthread_create error = %d\n", ret);  
        }  
    
    	return 0;
    }
    
    
    /**
     * @brief USB监听热插拔,监听USB的插拔事件,并进行挂载和卸载USB设备。
     */
    static void* UsbController_HotPlugMonitor(void)
    { 
    	pthread_detach(pthread_self());
    	char *result = NULL;
        char buf[UEVENT_BUFFER_SIZE * 2] = {0};     //  Netlink message buffer  
    	
    	while (1)
    	{
    	    recv(s_hotplugSock, &buf, sizeof(buf), 0); // 获取 USB 设备的插拔会出现字符信息,
    		result = strtok(buf, "@");                // 查看 USB的插入还是拔出信息
    		if (result != NULL)
    		{
    			if ((strcmp(result, "add") == 0))
    			{
    				if (isUsbConnected == false)
    				{
    					isUsbConnected = true;
    				}
    
    			}
    			else if ((strcmp(result, "remove") == 0))
    			{
    				if (isUsbConnected == true)
    				{
    					isUsbConnected = false;
    				}
    			}
    		}
    		memset(buf, 0, UEVENT_BUFFER_SIZE * 2);
    	}
    }
    
    
    /**
    * @brief 是否连接成功。
    * @return bool isConnnected, USB设备连接成功,则返回 true, 否则返回false。
    */
    static bool UsbController_IsConnected(void)
    {
    	return isUsbConnected;
    }
    
    
    /**
     * @brief 挂载文件系统。
     * @details 创建文件夹 /tmp/usb,将USB设备挂在在该目录下。尝试挂在 sda1和sdb1,如果都挂在失败,则认为挂载失败。
     * @return 如果挂载成功,则返回0,否则为-1。
     */
    static int UsbController_MountFileSystem(void)
    {
    	const char directory[] = "/tmp/usb";
    	int ret = 0;
    
    	printf("Try to mount the usb device\n");
    	// 检测是否存在文件夹
    	if (access(directory, 0) == -1)
    	{
    		// 文件夹不存在
    		if (mkdir(directory, 0777)) // 创建文件夹
            {
                printf("creat directory(%s) failed!!!", directory);
    			return -1;
            }
    	}
    
    	if (system("mount -t vfat /dev/sda1  /tmp/usb") < 0)  // 挂载USB的文件系统
    	{
    		if (system("mount -t vfat /dev/sdb1  /tmp/usb") < 0)
    		{
    			return -1;
    		}
    	}
    
    	return 0;
    }
    
    
    /**
     * @brief 卸载文件系统。
     * @return 如果挂载成功,则返回0,否则为-1。
     */
    static int UsbController_UnmountFileSystem(void)
    {
    	int ret = 0;
    
    	if (system("umount /tmp/usb") < 0)  // 挂载USB的文件系统
    	{
    		printf("Umount the usb device failed\n");
    		ret =  -1;
    	}
    
    	printf("Umount the usb device success\n");
    	return ret;
    }
    
    
    /**
     * @brief USB设备是否可以挂载。
     * @details 设备处于连接状态,且在/dev/目录下创建了sda1或者sdb1节点,则视为可以挂载。
     * @return 如果可以挂在,则返回true,否则为false。
     */
    static bool UsbController_IsMountable(void)
    {
    	bool isMountable = false;
    	bool isPartitionExist = false;
    
    	if (access("/dev/sda1", 0) == 0 || access("/dev/sdb1", 0) == 0)
    	{
    		// 存在分区 /dev/sda1 或者 /dev/sdb1
    		isPartitionExist = true;
    	}
    
    	if (isUsbConnected == true && isPartitionExist == true)
    	{
    		isMountable = true;
    	}
    
    	return isMountable;
    }
    
    
    /**
     * @brief USB设备挂载监听。
     * @details 如果USB之前没有挂载且当前可以挂载,则挂载。
     * \n 如果USB之前挂载成功,此时设备已经被拔出,则卸载。
     */
    void UsbController_MountMonitor(void)
    {
    	if (s_isMounted == false && UsbController_IsMountable() == true)
    	{
    		// 之前没有挂载且当前可以挂载,挂载文件系统
    		if (0 == UsbController_MountFileSystem())
    		{
    			printf("Mount success\n");
    			s_isMounted = true;
    			GenericGateway_SetUsbMounted(s_isMounted);
    		}
    	}
    	else if (s_isMounted == true && UsbController_IsConnected() == false)
    	{
    		// 之前挂载成功,此时设备已经被拔出,卸载设备
    		if (0 == UsbController_UnmountFileSystem())
    		{
    			s_isMounted = false;
    			GenericGateway_SetUsbMounted(s_isMounted);
    		}
    	}
    }
    
    
    /**
    * @brief 是否已经挂载成功。
    * @return bool s_isMounted, USB设备挂载成功,则返回 true, 否则返回false。
    */
    bool UsbController_IsMounted(void)
    {
    	return s_isMounted;
    }
    
    
    /** @} */
    

           6.4 主函数 main.c

    #include <stdio.h>
    #include "usb/UsbController.h"
    
    int main(int argc, char** argv)
    {
    	int secondCount = 0;
    	UsbController_Init();
    	
    	
    	while (1)
    	{
    		sleep(1);
    		secondCount++;
    		if (secondCount >= 5)
    		{
    			secondCount = 0;
    			UsbController_MountMonitor();
    		}
    	}
    }
    

        6.5 测试结果

        6.5.1 USB 插入

         1. 查看USB设备

         # ls /dev/sd*
         /dev/sda1  /dev/sda

         2. 插入设备打印信息

    # [  226.340000] usb 1-1: new high speed USB device using rt3xxx-ehci and address 6
    [  226.490000] scsi4 : usb-storage 1-1:1.0
    [  227.520000] scsi 4:0:0:0: Direct-Access     Kingston DataTraveler 2.0 1.00 PQ: 0 ANSI: 4
    [  227.540000] sd 4:0:0:0: [sda] 30310400 512-byte logical blocks: (15.5 GB/14.4 GiB)
    [  227.550000] sd 4:0:0:0: [sda] Write Protect is off
    [  227.560000] sd 4:0:0:0: [sda] Assuming drive cache: write through
    [  227.570000] sd 4:0:0:0: [sda] Assuming drive cache: write through
    [  227.580000]  sda: sda1
    [  227.590000] sd 4:0:0:0: [sda] Assuming drive cache: write through
    [  227.590000] sd 4:0:0:0: [sda] Attached SCSI removable disk
    Try to mount the usb device
    [  232.110000] FAT: utf8 is not a recommended IO charset for FAT filesystems, filesystem will be case sensitive!
    Mount success

         3. 查看USB挂载后的文件系统

         查看之后,可以正常获取到U盘的内容。

         # ls /tmp/usb/
    test       software   computime

             6.5.2 USB 拔出

          1. USB拔出之后,打印信息:

          # [  789.230000] usb 1-1: USB disconnect, address 6
          Umount the usb device success

          2. 查看文件系统

          查看,发现/tmp/usb目录的内容已经被卸载,正常卸载。

          # ls /tmp/usb/
          # 
          # 

    展开全文
  • 基于海思5559的u盘热插拔教程 cd /etc/init.d vi rcS //修改rcS下的内容如下 /bin/mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s echo " _...

    基于海思3559的u盘热插拔教程

    cd  /etc/init.d
    vi rcS   //修改rcS下的内容如下
    
    /bin/mount -a
    mkdir /dev/pts
    mount -t devpts devpts /dev/pts
    
    echo /sbin/mdev > /proc/sys/kernel/hotplug
    
    mdev -s
    
    echo "
                _ _ _ _ _ _ _ _ _ _ _ _
                \  _  _   _  _ _ ___
                / /__/ \ |_/
               / __   /  -  _ ___
              / /  / /  / /
      _ _ _ _/ /  /  \_/  \_ ______
    ___________\___\__________________
    "
    for initscript in /etc/init.d/S[0-9][0-9]*
    do
            if [ -x $initscript ] ;
            then
                    echo "[RCS]: $initscript"
                    $initscript
            fi
    done 
    

    进入/etc 目录下创建mdev.conf 文件

    cd /etc 
    vi mdev.conf
    
    sd[a-z]*[0-9] 0:0 0660 @(mount -t vfat -o sync /dev/sd[a-z][0-9] /tmp)
    
    sd[a-z] 0:0 0660 $(umount /tmp)
    
    
    

    然后重启机器,插入U盘或者拔出U盘就可以正常使用了。

    展开全文
  • openwrt U盘热插拔

    千次阅读 2015-08-20 11:04:47
    自动挂载U盘:编辑 /etc/hotplug.d/block/10-mount 写入以下内容#!/bin/ash case "$ACTION" in add) for i in $(ls /dev/ | grep 'sd[a-z][1-9]') do mkdir -p /mnt/$i mou

    自动挂载U盘:编辑 /etc/hotplug.d/block/10-mount 写入以下内容

    #!/bin/ash  
    
    case "$ACTION" in  
        add)  
            for i in $(ls /dev/ | grep 'sd[a-z][1-9]')  
            do  
                mkdir -p /mnt/$i  
                mount -o iocharset=utf8,rw /dev/$i /mnt/$i  
                if [ $? -ne 0 ]  
                then  
                    mount -o rw /dev/$i /mnt/$i  
                fi  
            done  
            ;;  
        remove)  
            MOUNT=`mount | grep -o '/mnt/sd[a-z][1-9]'`  
            for i in $MOUNT  
            do  
                umount $i  
                if [ $? -eq 0 ]  
                then  
                    rm -r $i  
                fi  
            done  
            ;;  
    esac  
    展开全文
  • 1、检测U盘热插拔 http://blog.csdn.net/janexjx/article/details/50684786 2、获取盘符 如果是自动挂载的检查/mnt/mtab,如果U盘是/dev/sdb0 找到该文件下/dev/sdb0后面的就是挂载点 3、手动挂载 在/mnt...

    1、检测U盘热插拔

    http://blog.csdn.net/janexjx/article/details/50684786

    2、获取盘符

    如果是自动挂载的检查/mnt/mtab,如果U盘是/dev/sdb0

    找到该文件下/dev/sdb0后面的就是挂载点

    3、手动挂载

    在/mnt目录下新建一个目录

    用amount命令挂载到该目录下

    切换到该目录就能看到U盘

    4、U盘在linux上的工作过程

    http://blog.csdn.net/yanzi1225627/article/details/7867898


    整个一流水账大哭

    明天写python多线程,如何强制结束一个线程

    c语言+gtk




    展开全文
  • 一种通过U盘热插拔的升级方法

    千次阅读 2017-05-19 08:42:03
    点击打开链接在调试Android驱动中,有时会遇到无法使用adb的情况,如果能通过U盘热插拔能运行shell命令,就可解决adb无法使用的困境。 基本思路是是安装一个驱动,该驱动负责监测usb的插拔事件,然后通过异步通知...
  • android U盘热插拔检测

    2013-03-06 19:41:47
    在androi系统中如何对U盘热插拔进行 参考: http://blog.csdn.net/jesse_zhao_503/article/details/7683660 http://blog.csdn.net/zhudaozhuan/article/details/7199799 ...
  • 问题:U盘盘符热插拔之后,windows无法识别 1、没有出现U盘图标,计算机中也没有出现盘符 2、设备管理中通用串行总线控制器 与 便携设备都没有识别到 操作系统:win7 [color=#FF0000][size=16px]]通过C++...
  • 32G U盘拿过来做启动盘,全部刻印好了,在新电脑上启动PE,进行分区的时候卡住了,直接就U盘。导致的问题是:之前把U盘刻印启动盘的电脑,已经新电脑上都识别不出来U盘。问题:电脑上设备管理器上能显示出U盘,...
  • qt linux下自动检测U盘热插拔

    千次阅读 2018-09-05 15:06:49
    如果用U盘来更新软件,需要先删除当前的可执行文件,但是如果删除之后,复制失败的话会导致后续没有文件可以运行了。一个方法是将新的可执行文件放到另一个目录中,当copy成功后修改linux的启动文件,然后reboot. 1...
  • openwrt U盘热插拔自动挂载

    万次阅读 2015-06-17 10:04:28
    自动挂载U盘:编辑 /etc/hotplug.d/block/10-mount 写入以下内容 #!/bin/ash case "$ACTION" in add) for i in $(ls /dev/ | grep 'sd[a-z][1-9]') do mkdir -p /mnt/$i mount -o iocharset=utf8,rw /...
  • 这几天测试的时候发现个很奇怪的问题 如果将TF卡插到读卡里然后在插到板子上 热插拔后都可以挂载上 但是使用U盘只有第一次插上去的时候能挂载上 拔下来后 在插上就挂载不上了 驱动里可以识别到U盘已经插入...
  • qt 监测u盘设备热插拔

    2019-01-07 22:11:05
    linux qt 监测U盘热插拔,使用netlink底层通信技术,直接与内核进行通信
  • U盘不支持热插拔

    2008-11-24 08:42:00
    最近买了个u盘,刚用了两次就坏掉了,插到电脑上就提示“无法识别的usb设备”...后来发现,是u盘不支持热插拔了,把u盘插上去再开机,电脑就可以认出来,还好,u盘是2g的,当硬盘用了,不知道是把u盘上那个芯片烧坏了?
  • 一招教你u盘热拔插

    千次阅读 2014-09-23 09:22:04
    操作u盘过程中有时我们会遇到移除u盘时u盘提示“无法停止通用卷”情况,通常遇到这种情况的时候,不少用户为了方便都会因为u盘热拔插的缘故迅速下u盘,但是这样有可能会导致u盘的数据丢失的问题发生,那么有没有...
  • U盘移动硬盘支持热插拔的方法

    千次阅读 2011-05-15 17:53:00
    <br /> 我们在使用U盘或移动硬盘后,在拔出前往往会在系统任务栏右下角点击安全删除设备才可以拔出U盘或移动硬盘,这样对于频繁使用时会显得比较麻烦,那么有没有办法可以直接支持热插拔呢?用完后直接拔出而...
  • hotplug 热插拔 测试程序,程序源码,运行程序,插入和拔出U盘,程序会捕获热插拔信息。
  • 自动检测USB热插拔

    2018-11-21 09:25:47
    利用Linux的netlink机制,自动检测U盘或SD卡的热插拔事件,完成存储器的挂载
  • Linux USB热插拔

    2018-07-12 17:04:48
    Linux USB的挂载分为两种,一种是开机自动挂载,指的是... 本文以openWrt为样例来描述USB热插拔的问题,也是我曾经遇到过的问题。 1. Linux 内核要支持USB自动挂载(make menuconfig) 1)添加USB相关Kernel m...
  • SylixOS 热插拔系统

    2015-07-09 10:04:51
    1. 引入所谓热插拔(hot-pluggin)即带电插拔,热插拔功能是允许用户在不关闭系统,不切断电源的情况下插入或拨出设备,例如:USB设备(U盘、USB鼠标等)SD卡设备。这个对用户看似简单的操作,在系统层面却有着复杂...
  • #include stdio.h>#include string.h>#include sys/types.h>#include unistd.h>#include stdlib.h>#include sys/socket.h>#include linux/netlink.h>#define UE
  • 一个很好用的跨平台的USB设备(比如USB鼠标、U盘等)热插拔 QT库。兼容LINUX(Ubuntu),WINDOWS,WINCE,MAC OS。带有终端以及GUI例子,方便运行测试。
  • Linux下的热插拔检测

    2020-12-24 17:17:03
    这几天在做Linux的U盘检测,仅限于热插拔。查了很多资料,有用HAL的,UDISK的,还有直接用libusb库的,最后无聊的我选择了用NetLinkSock和udev来接收内核发送过来的信息,从而判断有没有设备接入。 #include <sys...
  • 热插拔是大家每天都有可能做的事情。比如,将一块U盘从PC中拔出,将一个鼠标从一台电脑换到另一台电脑。这些都是再平常不过的事情了。对于数据中心的运维人员来说,更换硬盘也是一件很频繁的事情。 NVMe SSD已经从...
  • 转: http://www.cnblogs.com/swarmbees/p/8145342.htmlQt之移动硬盘热插拔监控阅读目录一、windows消息二、注册设备通知三、获取系统事件四、运行效果五、下载连接 最近在做一个通用对话框,类似于windows的资源...
  • 热插拔设备

    2011-12-12 10:48:58
    下面是网友实现的U盘hotplug脚本。 小弟只想尝试着让其能自动挂载和卸载u盘,所以处理比较简单: 1、在/sbin/目录下放置hotplug脚本 2、在/etc下建立hotplug.d目录,里面存放一个名为usb.hotplug的脚本 ...
  • udev是Linux内核的设备管理器,主要功能是管理/dev目录下的设备节点,同时也是用来接替热拔插的功能。 Linux内核使用udev机制创建设备节点,udev 完全在用户态 (userspace) 工作,利用设备加入或移除时内核所发送...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 299
精华内容 119
关键字:

u盘热插拔