精华内容
下载资源
问答
  • qt 监测u盘设备热插拔

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

    2018-01-10 10:31:46
    检测U盘热插拔事件检测U盘热插拔事件检测U盘热插拔事件
  • 在嵌入式linux系统中,往往可以基于mdev来实现U盘/SD卡的热插拔、自动挂/卸载功能。在mdev.conf配置文件中,可以对捕捉到的插、拔事件指定执行的命令/脚本,具体配置方法此处不再赘述。这也就意味着我们可以捕获U盘...

     编者按 

            在嵌入式linux系统中,往往可以基于mdev来实现U盘/SD卡的热插拔功能。在mdev.conf配置文件中,可以对捕捉到的插、拔事件指定执行的命令/脚本,具体配置方法此处不再赘述。这也就意味着我们可以捕获U盘等外设的插、拔事件并进一步作出相应的特殊处理。

            在Ubuntu系统中,本身已经具备U盘热插拔功能,但却不能很方便地对U盘的插、拔事件作出特殊的后续处理。一种方法是,定时巡查/media目录来检测是否有U盘插、拔事件发生,但这往往是傻瓜且低效的。而Udev实在是一种不错的选择。不过在Ubuntu14升级到Ubuntu18后,udev热插拔功能却无法正常使用。

            本文,仅基于实际项目经验对基于Udev实现设备热插拔检测稍作探讨及记录。对Udev和mdev的工作机制、配置文件的细节信息不作赘述。

    1.捕捉U盘事件

            首先需要编写规则文件捕捉U盘插、拔事件,本配置仅捕捉处理sdbX、sdcX设备。具体匹配规则可见udev介绍。

    1.在/etc/udev/rules.d目录下新建规则文件1-persistent-USB.rules

    2.在规则文件中加入以下规则,以实现捕捉U盘插入、拔出事件并执行 handle脚本

    ACTION=="add|change", SUBSYSTEM=="block", KERNEL=="sd[bc][0-9]",  MODE:="0777",  SYMLINK+="Myusb%n" ,  RUN+="/etc/udev/hotplug/usb/usb_handle" 

    SUBSYSTEM=="block", KERNEL=="sd[bc][0-9]", ACTION=="remove", RUN+="/etc/udev/hotplug/usb/usb_handle"

     2.编写U盘事件处理脚本

            执行脚本如下所示 ,主要分为3个步骤,mount 挂载、执行升级等自定义特殊操作、再次挂载到用户空间(U14:mount、U18:systemd-mount),这里需要特别注意的是,mount命令在U16以上系统中,无法挂载到用户空间,即挂载成功后仅在脚本内可见,脚本退出后,对其他命名空间不可见。通过df等命令均无法观察到挂载信息,程序自然也就无法操作,对于Ubuntu16实测不可使用,在U16上没有systemd-mount命令,需编写system [Automount]配置项文件来完成。

    #!/bin/bash
    
    UFail()
    {
    	return 1
    }
    
    
    Insert_to_tmp() 
    {
    	meg="The device does not exist or the mount point has been mounted by another device."
    	if [ -d /sys/block/*/${name} ] ; then
    		chk=`df | grep "$mount_dir" -q;echo $?`
    		if [ "$chk" == "0"  ]
    		then
    			exit 1
    		fi
    		if [ ! -d $mount_dir ]
                    then
                            /bin/mkdir -p $mount_dir
    
                    fi	
    	       	
    		if [ "$mode" = "0" ]
    		then	
    			msg=`$Mount -o noatime -o nodiratime -o  umask=000 -t auto  $DEVNAME $mount_dir 2>&1`
    		else
    			msg=`$Mount --no-block --automount=yes --collect $DEVNAME $mount_dir 2>&1`
    		fi
    		
    	fi
    	
    	msg=`echo "$msg" | xargs `
    
    	if [ -x /sh/hotplug.sh ] ; then
            	/sh/hotplug.sh $mount_dir $name "$msg"
    	fi
    
    }
    Insert() 
    {
    	if [ $# -le 0 ]
    	then
    		return 1
    	fi
    	InsertMode=$1
    
    	meg="The device does not exist or the mount point has been mounted by another device."
    	if [ -d /sys/block/*/${name} ] ; then
    		chk=`df | grep "$mount_dir" -q;echo $?`
    		if [ "$chk" == "0"  ]
    		then
    			exit 1
    		fi
    		if [ ! -d $mount_dir ]
                    then
                            /bin/mkdir -p $mount_dir
    
                    fi	
    	 	if [ "$InsertMode" = "0" ]
    		then	
    			msg="insert to namespace."
    			if [ "$mode" = "0" ]
    			then	
    				msg+=`$Mountold -o noatime -o nodiratime -o  umask=000 -t auto  $DEVNAME $mount_dir 2>&1`
    			else
    				msg+=`$Mount --no-block --automount=yes --collect $DEVNAME $mount_dir 2>&1`
    			fi
    		else
    			msg="insert to udev namespace."
    			msg+=`$Mountold -o noatime -o nodiratime -o  umask=000 -t auto  $DEVNAME $mount_dir 2>&1`
    		fi
    		
    	fi
    	
    	msg=`echo "$msg" | xargs `
    
    	if [ -x /sh/hotplug.sh ] ; then
            	/sh/hotplug.sh $mount_dir $name "$msg"
    	fi
    
    }
    
    
    Remove()
    {
    
    	 if [ $# -le 0 ]
    	 then
    		 return 1
    	 fi
    	 InsertMode=$1
    
    
    	mountinfo=`/bin/cat /etc/mtab | /bin/grep "$DEVNAME" -w`
    	if [ -z "$mountinfo" ]
    	then 
    		meg="All hardpoints of the device have been unmounted."
    
    		if [ -x /sh/hotplug.sh ] ; then
    			/sh/hotplug.sh $mountdir $name "$msg"
    		fi
    		exit 1
    	fi
    	
    
    	IFSOLD=$IFS          #默认的IFS的数值-->也是环境变量!
    	IFS=$'\n'             #自定义的IFS数值 
    	
    	for i in $mountinfo
    	do
    		mountdir=`echo $i | /usr/bin/awk '{print $2}'`
    		sync
    
    		if [ "$InsertMode" = "0" ] 
    		then
    			msg="remove from namespace."
    			if [ "$mode" = "0" ]
    			then
            			msg+=`$Umountold -f -l $mountdir 2>&1`
    			else
    				msg+=`$Umount -u $mountdir 2>&1`
    			fi
    		else
    			msg="remove from udev namespace."
    			msg+=`$Umountold -f -l $mountdir 2>&1`
    		fi
    		msg=`echo "$msg" | xargs`
    
    		if [ -x /sh/hotplug.sh ] ; then
                   		/sh/hotplug.sh $mountdir $name "$msg"
           		fi 
    	done
    	
    	IFS=$IFSOLD
    
    
    
    }
    
    
    Do_special()
    {
    	#此处自行实现特殊处理,自动检测到升级标志自动进行升级、更新等自定义操作
    	#do_Install || do_Restore
    }
    
    
    
    prefix_path=$(cd $(dirname $0);pwd)/
    name="`basename "$DEVNAME"`"
    mount_dir="/udisk"
    
    
    Mountold=/bin/mount
    Umountold=/bin/umount
    mode=0
    
    #/lib/systemd/systemd-udevd./lib/systemd/systemd-udevd:
    #systemd by default runs systemd-udevd.service with a separate "mount namespace",which means that mounts will not be visible to the rest of the system.
    #Even if you change the service parameters to fix this (commenting out the PrivateMounts and MountFlags lines), there is another problem which is that processes started from Udev are killed after a few seconds. 
    #In case of FUSE filesystems, such as exFAT (which is common to find on mp3 players or shareable thumb drives) and NTFS, "mount" starts a user-space process to handle the filesystem internals; 
    #when this is killed you will get Transport endpoint not connected errors if you try to access the filesystem.
    #There are some options that work:
    #     1)Start a custom systemd service from the Udev rule; the systemd service can invoke a script which can start any number of long-running processes (like FUSE).
    #A concise example which automatically mounts USB disks under /media is udev-media-automount. It was found to be fast and reliable. A variant of the same idea is explained in this blog post.
    #     2)Use systemd-mount instead of mount in your Udev rule. This is recommended by systemd developers. 
    
    if type "/usr/bin/systemd-mount" &>/dev/null
    then
    	
    	Mount=/usr/bin/systemd-mount 
    	Umount=/usr/bin/systemd-mount 
    	mode=1
    
    fi
    
    if [ $ACTION = "add" ] 
    then
    	#Mount the device into the current namespace to perform some special operations
    	Insert 1
    	Do_special
    	Remove 1
    	#Mount the device into the  namespace
    	Insert 0
    elif [ $ACTION = "remove" ]
    then
    	Remove 0
    fi
    
    
    
    

     3.测试前准备

    1.修改udev为调试模式,方便在/var/log/syslog中定位日志

    2.使规则生效,后期修改规则文件时必须执行udev重启生效,单纯修改usb_handle执行脚本无需重启。

            service udev restart  

    3.借助工具测试规则是否可以匹配

        使用udevadm test 模拟测试设备插入事件,查看打印信息确认配置无误。

       udevadm test -a add /sys/class/block/sdc1

     下图可知规则已被找到

     下图可知执行脚本可以被执行

     其中/sys/class/block/sdc1是具体的设备,根据实际情况修改即可

     3.测试

              插入U盘、拔出U盘,可通过df 命令、syslog日志观察到设备是否成功挂载。

            下面是/sh/hotplug.sh打印的信息,该脚本需要自行编写

      4.后记

            Udev挂在设备时,在U16版本前,可以使用mount命令直接挂载,umount卸载,这与嵌入式中mdev是一样的,U16版本之后,则必须使用systemd-mount进行挂载、卸载。否则会因为命名空间的限制而无法被其他空间使用,仅在udev命名空间可见。

            

    挂载命名空间隔离挂载点隔离文件目录进程运行时可以将挂载点与系统分离,使用这个功能时,我们可以达到 chroot 的功能,而在安全性方面比 chroot 更高
    展开全文
  • 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/
          # 
          # 

    展开全文
  • 在海思录像的时候一般大家都是使用硬盘和优盘来存储视频的,硬盘一般都是固定在设备上的,而优盘很多情况下是要支持热插拔的,那么怎么来实现呢。 如图所示,在插拔优盘的时候系统会出现一系列打印信息,remove@...

    点此进入原文链接

    在海思录像的时候一般大家都是使用硬盘和优盘来存储视频的,硬盘一般都是固定在设备上的,而优盘很多情况下是要支持热插拔的,那么怎么来实现呢。

    在这里插入图片描述
    如图所示,在插拔优盘的时候系统会出现一系列打印信息,remove@表示的就是优盘拔出的时候的打印,而add@打印就是再优盘插入时的打印,我们可以在程序里检测系统的打印消息,再用回调函数来做挂载和卸载之类的处理,就可以实现优盘的热插拔录像拉。

    易百纳技术社区内容涵盖半导体、图像处理、人工智能、物联网、工业板卡以及通用硬件等多个领域,已成为一个多系列(如:海思芯片等)的第一热门技术网站,致力于为更多工程师答疑解惑,创造机遇!

    展开全文
  • 32G U盘拿过来做启动盘,全部刻印好了,在新电脑上启动PE,进行分区的时候卡住了,直接就U盘。导致的问题是:之前把U盘刻印启动盘的电脑,已经新电脑上都识别不出来U盘。问题:电脑上设备管理器上能显示出U盘,...

    32G U盘拿过来做启动盘,全部刻印好了,在新电脑上启动PE,进行分区的时候卡住了,直接就拔出U盘。导致的问题是:之前把U盘刻印启动盘的电脑,已经新电脑上都识别不出来U盘。
    问题:
    电脑上设备管理器上能显示出U盘,但是没有盘符,也就是在我的电脑里面显示不出来。跟着网上说的卸载驱动,或者到磁盘管理里面选择格式化,皆解决不了问题。
    最后使用最后一步,生产U盘,就是下载USBoot这个软件,这个会识别U盘,按照上面的提示进行操作,插拔几次。发现U盘能识别了,但是磁盘空间只有2G,并且USBoot这个程序退不出去了。最后选择拔出U盘,任务管理器强行关闭程序,使用刻印U盘的工具,选择归还空间,即解决问题了。

    转载于:https://blog.51cto.com/13395140/2164754

    展开全文
  • qt linux下自动检测U盘热插拔

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

    2020-06-03 10:25:13
    ubuntu16.04下usb设备的自动检测挂载(脚本),可实现usb设备自动检测插拔挂载,将mountusb.sh、umountusb.sh脚本拷贝至/opt/usb(如果没有目录则自行创建一个)负责挂载和卸载usb设备,将11-add-usb.rules和11-add-...
  • Linux 自动挂载U盘 实现热插拔 1、必备知识 mount 命令 udev 设备管理器 1.1 mount 命令 ​ mount 命令是用于挂载Linux系统外的文件 具体参数: https://www.runoob.com/linux/linux-comm-mount.html 1.2 udev 设备...
  • 一个很好用的跨平台的USB设备(比如USB鼠标、U盘等)热插拔 QT库。兼容LINUX(Ubuntu),WINDOWS,WINCE,MAC OS。带有终端以及GUI例子,方便运行测试。
  • 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 ...
  • Android的热插拔监听源代码,可以用来监听耳机之类的热插拔事件发生
  • 检测u盘拔插

    2015-01-27 08:56:49
    qt检测u盘拔插,linux,windows可用
  • 学习工作中有很多时候会移动硬盘的热插拔,移动硬盘又非常脆弱,容易导致以下错误:“目录或文件损坏,无法打开。。” 针对这个错误在windows下可以用:chkdsk文件来修复; 具体用法可以用help chkdsk来查询,一般...
  • 操作系统:UOS 最近在做U盘热插拔监控,第一反应就是使用DBUS消息,发现DBUS是提供了对应的DBUS接口。 通过监听signals来捕获对应的消息。
  • 自动检测USB热插拔

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

    千次阅读 2017-05-19 08:42:03
    点击打开链接在调试Android驱动中,有时会遇到无法使用adb的情况,如果能通过U盘热插拔能运行shell命令,就可解决adb无法使用的困境。 基本思路是是安装一个驱动,该驱动负责监测usb的插拔事件,然后通过异步通知...
  • 这几天测试的时候发现个很奇怪的问题 如果将TF卡插到读卡里然后在插到板子上 热插拔后都可以挂载上 但是使用U盘只有第一次插上去的时候能挂载上 拔下来后 在插上就挂载不上了 驱动里可以识别到U盘已经插入...
  • USB热插拔

    千次阅读 2018-10-12 11:13:21
    学习USB热插拔之前,先学习一些USB的硬件知识: 一、USB基础概念 1、硬件知识(USB插座和插头) &nbsp; &nbsp; &nbsp; &nbsp;在最初的标准里,USB接头有4条线:电源,D-,D+,地线。我们暂且把这样的...
  • OpenWrt热插拔HotPlug

    千次阅读 2019-11-12 18:02:22
    热插拔官方文档 当某些 events事件发生时,Procd(init系统和进程管理守护进程)会执行位于/etc/hotplug.d/中的脚本,例如当接口启动或关闭时,检测到新的存储驱动器时,或者按下按钮时. 当使用PPPoE连接或者在不...
  • 4.U盘热插拔自动检测。 5.Sqlite数据库读写文件。 6.扫描SD卡目录,并在界面上显示。 7.中文字库的使用与显示(文泉驿字体)。 8.定时器的使用。 9.信号-槽的使用(signal-slot)。 10.多线程的使用。 11.QT常用...
  • openwrt USB外挂U盘的时候很需要热插拔功能 openwrt官网传送门 当某些事件发生时,Procd(init系统和进程管理守护进程)执行位于/etc/hotplug.d/中的脚本,例如当接口启动或关闭时,检测到新的存储驱动器时,或者...
  • 本次分享一中检测设备热插拔的方法,比如,在系统中插入一个usb设备,无线网卡等,都可以检测到,并决定后续的工作;研究检测计算机硬件的拔插,包括某类设备接口、文件系统、OEM或IHV厂商自定义设定的设备、端El...
  • 热插拔是大家每天都有可能做的事情。比如,将一块U盘从PC中拔出,将一个鼠标从一台电脑换到另一台电脑。这些都是再平常不过的事情了。对于数据中心的运维人员来说,更换硬盘也是一件很频繁的事情。 NVMe SSD已经从...
  • Linux驱动之热插拔

    2020-10-12 22:32:17
    这篇文章简单记录一下有关Linux驱动中的热拔插,在Linux内核驱动开发的时候经常会在程序里创建类,在类中创建设备,比如下面这一段,是从以前的代码中摘抄出来的 major = register_chrdev(0, "fifth_drv", &...
  • C# 实时检测USB热插拔

    千次阅读 2019-05-15 09:48:31
    /// <param name="usbRemoveHandler">USB出事件处理器 /// 发送通知允许的滞后时间 public Boolean AddUSBEventWatcher(EventArrivedEventHandler usbInsertHandler, EventArrivedEventHandler ...
  • 做嵌入式开发,尤其在网关、路由器或者其他支持USB设备的终端上,为了提高用户体验,我们常常需要支持自动识别并挂载USB设备功能,USB的热插拔应用广泛,比如U盘、手机、USB网卡等。 某些应用程序,在使用USB设备的...
  • Linux下的热插拔检测

    2020-12-24 17:17:03
    这几天在做Linux的U盘检测,仅限于热插拔。查了很多资料,有用HAL的,UDISK的,还有直接用libusb库的,最后无聊的我选择了用NetLinkSock和udev来接收内核发送过来的信息,从而判断有没有设备接入。 #include <sys...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,381
精华内容 1,352
关键字:

u盘热插拔