-
检测U盘热插拔事件
2018-01-10 10:31:46检测U盘热插拔事件检测U盘热插拔事件检测U盘热插拔事件 -
Linux USB U盘热插拔挂载和卸载
2016-03-31 16:57:35MT7620的U盘热插拔监听,热插拔挂载与卸载。 当插入U盘,则挂载; 当拔出U盘,则卸载。 监听热插拔采用socket监听,由用户层程序监听,并实现自动挂载与卸载。一、硬件平台
1、 控制器:MT7620(A9内核)
二、软件平台
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/sda2. 插入设备打印信息
# [ 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 success3. 查看USB挂载后的文件系统
查看之后,可以正常获取到U盘的内容。
# ls /tmp/usb/
test software computime6.5.2 USB 拔出
1. USB拔出之后,打印信息:
# [ 789.230000] usb 1-1: USB disconnect, address 6
Umount the usb device success2. 查看文件系统
查看,发现/tmp/usb目录的内容已经被卸载,正常卸载。
# ls /tmp/usb/
#
# -
基于海思3559的U盘热插拔教程
2020-08-13 17:00:47基于海思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
-
2016/08/30linux检测U盘热插拔并获取挂载点
2016-08-30 21:54:161、检测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无法识别
2020-06-04 11:45:22问题:U盘盘符热插拔之后,windows无法识别 1、没有出现U盘图标,计算机中也没有出现盘符 2、设备管理中通用串行总线控制器 与 便携设备都没有识别到 操作系统:win7 [color=#FF0000][size=16px]]通过C++... -
记一次U盘热插拔导致的问题
2018-08-27 10:45:4032G 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 /... -
android4.0 U盘热插拔后挂载不上bug解决
2014-12-18 15:14:30这几天测试的时候发现个很奇怪的问题 如果将TF卡插到读卡里然后在插到板子上 热插拔后都可以挂载上 但是使用U盘只有第一次插上去的时候能挂载上 拔下来后 在插上就挂载不上了 驱动里可以识别到U盘已经插入... -
qt 监测u盘设备热插拔
2019-01-07 22:11:05linux 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 热插拔 测试程序
2014-04-08 15:06:28hotplug 热插拔 测试程序,程序源码,运行程序,插入和拔出U盘,程序会捕获热插拔信息。 -
自动检测USB热插拔
2018-11-21 09:25:47利用Linux的netlink机制,自动检测U盘或SD卡的热插拔事件,完成存储器的挂载 -
Linux USB热插拔
2018-07-12 17:04:48Linux USB的挂载分为两种,一种是开机自动挂载,指的是... 本文以openWrt为样例来描述USB热插拔的问题,也是我曾经遇到过的问题。 1. Linux 内核要支持USB自动挂载(make menuconfig) 1)添加USB相关Kernel m... -
SylixOS 热插拔系统
2015-07-09 10:04:511. 引入所谓热插拔(hot-pluggin)即带电插拔,热插拔功能是允许用户在不关闭系统,不切断电源的情况下插入或拨出设备,例如:USB设备(U盘、USB鼠标等)SD卡设备。这个对用户看似简单的操作,在系统层面却有着复杂... -
浅析u盘等热插拔uevent事件用户空间截获方法和具体实现
2010-01-15 15:53:00#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 -
多平台QT USB设备热插拔检测库
2018-08-24 10:16:11一个很好用的跨平台的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... -
对NVMe SSD热插拔时,我需要注意什么?
2019-03-18 15:23:27热插拔是大家每天都有可能做的事情。比如,将一块U盘从PC中拔出,将一个鼠标从一台电脑换到另一台电脑。这些都是再平常不过的事情了。对于数据中心的运维人员来说,更换硬盘也是一件很频繁的事情。 NVMe SSD已经从... -
Qt之移动硬盘热插拔监控
2018-06-08 09:22:04转: 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的脚本 ... -
Ubuntu core基于udev机制热拔插U盘
2019-06-04 21:06:58udev是Linux内核的设备管理器,主要功能是管理/dev目录下的设备节点,同时也是用来接替热拔插的功能。 Linux内核使用udev机制创建设备节点,udev 完全在用户态 (userspace) 工作,利用设备加入或移除时内核所发送...