精华内容
下载资源
问答
  • 了解一下热插拔   Ldd3的话: 现在, 随着 USB 的出现, CardBus, PCMCIA,IEEE1394, 和 PCI 热插拔控制器, Linux 内核需要能够可靠地运行不管什么硬件从系统中...从这句话我们可以看出,热插拔有两个层次,一个是内核设

    了解一下热插拔

     

    Ldd3的话:

    现在, 随着 USB的出现, CardBus, PCMCIA,IEEE1394, PCI 热插拔控制器, Linux内核需要能够可靠地运行不管什么硬件从系统中增加或去除.这产生了一个额外的负担给设备驱动作者,因为现在他们必须一直处理一个没有任何通知而突然从地下冒出来的设备.

     

    从这句话我们可以看出,热插拔有两个层次,一个是内核设备模型中提供的机制,一个是硬件提供的功能。

    我们的实例主要是设备模型中提供的机制。硬件方面有时间的话我举个例子。

     

    一些基础知识如udevmdev我就不说了,论坛有。

     

    还是linux-3.2.36

    kobject中有个结构struct kset_uevent_ops,我没有列出,因为总线已有这个结构,我们是在总线层所以不要去管理这个结构。

    简单说一下热插拔过程(论坛也有这些分析)。

    ./drivers/base/core.c

    device_register()->device_add()->kobject_uevent()->

    ./lib/ kobject_uevent.c

    kobject_uevent_env()->call_usermodehelper()netlink_broadcast_filtered()

    一个是uevent_helper调用一个是netlink调用,这两个东西又够我写几遍文章了,等有时间我再写吧。现在简单了解。

    netlink是为udev实现机制用的

    uevent_helper是为mdev实现机制用的

    我的arm平台用的是mdev

    call_usermodehelper()第一个参数叫path

    path --- 用户空间所要启用的应用程序路径

     

    mdev时,echo “/sbin/mdev”> /proc/sys/kernel/hotplug把uevent_helper改为“/sbin/mdev”,再把uevent_helper赋给call_usermodehelper(),最终调用mdev。

    说实例之前,先说一下mdev配置。//udev的同学自己搞定,我就不说了

    # vi /etc/mdev.conf

    $MODALIAS=.* root:root777 @modprobe "$MODALIAS"

    保存

    MODALIAS要和驱动中一致,马上能看到。

    这条规则指的是:当收到的环境变量中含有MODALIAS,那么加载MODALIAS代表的模块。

     

    实例:

    这个是在上一文章的实例基础上做的,如果要了解,你还要先简单了解一下上一实例(设备模型5)。

    my_dev.c中修改,我们要答到的目的是加载my_dvc.ko时自动加载my_dvr.ko

    修改,红色为增加

     

    MODULE_DEVICE_TABLE(my_dvc, my_dvc_table);

     

    static ssize_t show_name(struct device *dev, structdevice_attribute *attr, char *buf)

    {

        struct my_device*mydev = (struct my_device*)dev->platform_data;

     

        return sprintf(buf,"%s\n", mydev->name);

    }

     

    static ssize_t show_modalias(struct device *dev, structdevice_attribute *attr, char *buf)

    {

        return sprintf(buf,"%s\n", "my_dvr");

    }

     

     

    static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);

    static DEVICE_ATTR(modalias, S_IRUGO, show_modalias, NULL);

    //这两个文件只是为了输出一些信息,可以不管

    static struct attribute *my_dvc_attrs[] = {

        &dev_attr_name.attr,

       &dev_attr_modalias.attr,

        NULL

    };

     

    static struct attribute_group my_dvc_attr_group =

    {

        .attrs          = my_dvc_attrs,

    };

     

    static const struct attribute_group *my_dvc_attr_groups[] =

    {

       &my_dvc_attr_group,

        NULL

    };

     

    static int my_dvc_uevent(struct device *dev, structkobj_uevent_env *env)

    {

        struct my_device*mydev = (struct my_device*)dev->platform_data;

         int i = 0;

        MY_DEBUG("%s_uevent\n",mydev->name);

     

         //实际一般用一些方法获得driver的name,这里就直接写了

        if(add_uevent_var(env, "MODALIAS=%s", "my_dvr"))// MODALIAS和mdev.conf一致

            return -ENOMEM;

     

        while(env->envp[i]!= NULL)//我们做一个调试信息

         {

             MY_DEBUG("%s\n",env->envp[i]);//打印环境变量

             i++;

         }

     

        return 0;

    }

     

    static struct device_type my_dvc_type = {

          .name          = "my_dvc_type",

         .groups         = my_dvc_attr_groups,

         .uevent         = my_dvc_uevent,

    };

     

    static ssize_t my_dvc_show_info(structdevice *devp,struct device_attribute *attr,char *buf)

    {

    static struct  my_device my_dvcs[2] =

    {

        {   

            .name = "my_dev0",

            .id = my_dvc_table,

            .dev =

            {

                .platform_data =&my_dvcs[0],

                .release =my_dev_release,

                .init_name = "my_dev0",

                  .type =&my_dvc_type,

            },

            .attr = &dev_attr_info,

        },

        {

            .name = "my_dev1",

            .id = &my_dvc_table[1],

            .dev =

            {

                .platform_data =&my_dvcs[1],

                .release =my_dev_release,

                .init_name = "my_dev1",

                .type = &my_dvc_type,

            },

        },

    };

     

    调试

    # insmod my_bus.ko

    # insmod my_dvc.ko

    # dmesg

    //my_dev0的加载打印

    my_bus_uevent

     

    my_dev0_uevent

     

    //这是生成的环境变量

    ACTION=add

     

    DEVPATH=/devices/mine0/my_dev0

     

    SUBSYSTEM=mine

     

    DEVTYPE=my_dvc_type

     

    MODALIAS=my_dvr

     

    my_dev1的加载打印

    my_bus_uevent

     

    my_dev1_uevent

     

    ACTION=add

     

    DEVPATH=/devices/mine0/my_dev1

     

    SUBSYSTEM=mine

     

    DEVTYPE=my_dvc_type

     

    MODALIAS=my_dvr


     //加载my_dvr的打印

    my_bus_match

     

    my_dvr_probe

     

    my_bus_match

     

    my_dvr_probe

     

    special_init

     

    # cat /proc/modules

    my_dvr 1245 0 - Live 0xbf00f000 (O)

    my_dvc 2023 0 - Live 0xbf00b000 (O)

    my_bus 2274 2 my_dvr,my_dvc, Live 0xbf007000 (O)

     

    my_dvr自动加载//过程从上面的分析应该能看出来吧。

     

    看完这个例子,可能会有两种感觉——失望和不解。可能说:

    这就是热插拔呀!

    这是热插拔吗?

     

    产生这样的心理,可能是读者带着usb等硬件热插拔的影子去看待热插拔。所以看完之后感觉还是没达到自己的目的。我在开始就说热插拔可以看成两层。我上面的例子是设备结构层体现的。

     

    我想很多人看热插拔,总会附带usb的热插拔的问题。好吧,我承认我也想知道,下面看一下usb的(终于看一些实际的东西了)。

    我的模块(我把usblinux系统中单独出来编译):usbohci

    usb-common.ko usbcore.ko ohci-hcd.ko s3c2440_add_usb.ko

     

    s3c2440_add_usb.ko主要是s3c_device_ohci加载,一般的平台在系统初始化时加载,我把它单独出来了。还有s3c2440usb有个报错是usb 1-1: device descriptor read/64, error -62。网上有人是在ubootupll初始化前加延时,我现在文件系统都有了还叫我动uboot,不就初始化upll,所以我在s3c2440_add_usb.ko做了一个upll的初始化工作。解决问题。开心!

     

    Ldd3: USB 总线

    任何在 USB总线上的设备有参数 name SUBSYSTEM环境变量设置为 usb.

    USB 子系统也总是一直添加下列的环境变量:

    PRODUCT 

    一个字符串, idVendor/idProduct/bcdDevice的格式,来指定这些 USB

    设备特定的成员.

    TYPE 

    一个 bDeviceClass/bDeviceSubClass/bDeviceProtocol格式的字符串,

    指定这些 USB设备特定的成员.

    如果 bDeviceClass成员设置为 0,下列的环境变量也被设置:

    INTERFACE 

    一个 bInterfaceClass/bInterfaceSubClass/bInterfaceProtocol格式

    的字符串, 指定这些 USB 设备特定成员.

    如果这个内核建立选项, CONFIG_USB_DEVICEFS,它选择 usbfs文件系统来在

    内核中建立, 被选中, 下列环境变量也被设置:

    DEVICE 

    一个字符串, 在设备所在的 usbfs 文件系统中出现.这个字串以

    /proc/bus/usb/USB_BUS_NUMBER/USB_DEVICE_NUMBER的格式,其中

    USB_BUS_NUMBER 是这个设备所在的 USB 总线的 3个数,

    USB_DEVICE_NUMBER 是已由内核分配给 USB 设备的 3位数.

     

    Linux3.2.36USB_BUS_NUMBERBUSNUM

    USBDEVICE_NUMBERDEVNUM

    主义你要在驱动中定义CONFIG_HOTPLUG才会有。

    你可以学着我上面的例子,根据这些环境变量在mdev.conf中加一些东西执行一些热插拔事件,我简单说一下PRODUCTTYPEDEVICE是总线产生的,INTERFACEBUSBUMDEVNUM产生的,这点分析就是为了和我们上面说的联系一下,下面我们装载:

     

     

    # insmod usb-common.ko

    # insmod usbcore.ko

    usbcore: registered new interface driver usbfs

    usbcore: registered new interface driver hub

    usbcore: registered new device driver usb

     

    # ls /sys/bus/usb/drivers

    hub    usb    usbfs

    我相信看过我之前写的总线实例的,应该对这些东西的生成过程不会陌生吧!不管你信不信反正我信了。

     

    # insmod ohci-hcd.ko

    ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver

     

    # insmod s3c2440_add_usb.ko

    s3c2440-ohci s3c2440-ohci: s3c2440-ohci

    s3c2440-ohci s3c2440-ohci: new USB bus registered, assigned bus number 1

    s3c2440-ohci s3c2440-ohci: irq 42, io mem 0x49000000

    hub 1-0:1.0: USB hub found

    hub 1-0:1.0: 2 ports detected

     

    # ls /sys/bus/usb/devices/

    1-0:1.0  usb1

    usb1就是我的usb主机控制器,1-0-1.0就是root-hub

     

    这里还没有出现热插拔,再申明一下,这里主角是热插拔,所以有些关于usb的知识我会跳过。首先在初始化时有个内核线程

           khubd_task = kthread_run(hub_thread, NULL, "khubd");

           if (!IS_ERR(khubd_task))

                   return 0;

    hub_thread调用hub_events()

    主要的代码

    static void hub_events(void)

    {

           

           while (1) {

                   

                   if (list_empty(&hub_event_list)) {//hub_event_list为空不执行

                           spin_unlock_irq(&hub_event_lock);

                           break;

                   }

     

                   tmp = hub_event_list.next;

                   list_del_init(tmp);

     

                   hub = list_entry(tmp, struct usb_hub, event_list);//event_list获取struct usb_hub结构数据

                   

     

                   /* deal with port status changes */

                   //处理各个口事件

                   for (i = 1; i <= hub->descriptor->bNbrPorts; i++) {

                   …

     

                           if (portchange & USB_PORT_STAT_C_CONNECTION) {

                                   …

                                   connect_change = 1;

                           }

     

                           …//还有其它事件,在这就不细说了

                          

                           if (connect_change)

                                   hub_port_connect_change(hub, i,

                                                   portstatus, portchange);

                           //我们主要演示设备插上和拔出,所以就看它。

                   } /* end for i */

     

                  

    }

     

    看过程hub_probe()->hub_configure()->hub_activate()->kick_khubd()

    kick_khubd()主要是list_add_tail(&hub->event_list, &hub_event_list);wake_up(&khubd_wait);执行之后hub_events就会去处理事件。

    对于这个话题你只要知道,hub_events()会去处理hub事件,调用kick_khubd()就是告诉hub_events()有事件要取处理。再看hub_configure中会执行

    usb_fill_int_urb(hub->urb, hdev, pipe, *hub->buffer, maxp, hub_irq,

                   hub, endpoint->bInterval);

    按一定的周期调用hub_irq

     

    static void hub_irq(struct urb *urb)

    {

            …

            kick_khubd(hub);//hub_events()会执行

            …

    }

    看到这我想说hub中断不是插入拔出usb设备时产生的,而是定时执行hub_irq如果有usb插入拔出时进行相应的处理。

    看一下

     

    插入usb设备

    # usb 1-1: new full-speed USB device number 2 using s3c2440-ohci

     

    # ls /sys/bus/usb/devices/

    1-0:1.0  1-1      1-1:1.0  usb1

     

    多出1-1

    # ls -l /sys/bus/usb/drivers/usb/

    lrwxrwxrwx   1 0        0                0 Jan  1 00:14 1-1 -> ../../../../devices/platform/s3c2440-ohci/usb1/1-1

    --w-------   1 0        0             4096 Jan  1 00:14 bind

    lrwxrwxrwx    1 0        0                0 Jan  1 00:14 module -> ../../../../module/usbcore

    --w-------    1 0        0             4096 Jan  1 00:14 uevent

    --w-------    1 0        0             4096 Jan  1 00:14 unbind

    lrwxrwxrwx    1 0        0                0 Jan  1 00:14 usb1 -> ../../../../devices/platform/s3c2440-ohci/usb1

     

    拔出usb设备

    # ls /sys/bus/usb/devices/usb 1-1: USB disconnect, device number 2

     

    # ls /sys/bus/usb/devices/

    1-0:1.0  usb1

    恢复

     

    到这我可以说usb的热插拔分析完了,当然还是在软件上,至于上面如何生成1-1.1.0等连接或文件和usb枚举过程在这就不讨论了。

     

    下期预告:

    固件开发

     

    展开全文
  • usb口的检测在linux中可以通过mdev/udev热插拔机制来检测,相应的,我们只需要更改配置文件中规则即可,但是实际中,有的时候应用程序就是需要知道事件发生了,并做一些动作,该如何做呢?使用 netlink 的方式。 ...

    1. 简介

    usb口的检测在linux中可以通过mdev/udev热插拔机制来检测,相应的,我们只需要更改配置文件中规则即可,但是实际中,有的时候应用程序就是需要知道事件发生了,并做一些动作,该如何做呢?使用 netlink 的方式。

     

    2. 程序

    #include <linux/netlink.h>
    #include <linux/rtnetlink.h>
    #include <errno.h>
    #include <sys/socket.h>
    
    /* Kernel Netlink */
    int CUSBListener_initSock()
    {
        const int buffersize = UEVENT_BUFFER_SIZE;
        int ret;
        int on = 1;
    
        struct sockaddr_nl snl;
        bzero(&snl, sizeof(struct sockaddr_nl));
        snl.nl_family = AF_NETLINK;
        snl.nl_pid = getpid();
        //snl.nl_groups = 1|RTNLGRP_LINK;
        //snl.nl_groups = 1;
        snl.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR;
    
        int s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
        if (s == -1)
        {
    		return -1;
        }
        if (setsockopt(s, SOL_SOCKET, /*SO_RCVBUFFORCE*/ SO_RCVBUF, &buffersize, sizeof(buffersize)) < 0)
        {
    		perror("setsockopet error\n");
    		return -1;
        }
        if((setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)))<0)
        {
    		perror("setsockopet error\n");
    		return -1;
        }
    
        ret = bind(s, (struct sockaddr *)&snl, sizeof(struct sockaddr_nl));
        if (ret < 0)
        {
    		return -2;
        }
        return s;
    }
    
    void CUSBListener_onUSB(const char *msg)
    {
        if (!memcmp(msg, "add@", 4))
        {
    		// 识别 U盘
    		if (!memcmp(&msg[strlen(msg)-5], "/sd", 3)) {
    			printf("Found U Disk\n");
    			printf("%s\n",&msg[strlen(msg) - 5]);
    		} else
    		// 识别 GPIB
    		if (!memcmp(&msg[strlen(msg)-9], "/usbgpib", 8)) {
    			printf("USB_GPIB connected\n");
    			system("mknod /dev/usbgpib0 c 180 176"); // 手动创建设备节点
    		}
        } else
        if (!memcmp(msg,"remove@",7))
        {
    		if (!memcmp(&msg[strlen(msg) - 5],"/sd",3)) {
    			printf("remove U Disk\n");
    			printf("%s\n",&msg[strlen(msg) - 5]);
    		} else
    		if (!memcmp(&msg[strlen(msg)-9], "/usbgpib", 8)) {
    			printf("USB_GPIB disconnected\n");
    			system("rm /dev/usbgpib0"); // 删除设备节点
    		}
        }
    }
    
    /* listener for USB Event message*/
    void CUSBListener_run()
    {
        char buf[UEVENT_BUFFER_SIZE * 2] = {0};
    
        int sock = CUSBListener_initSock();
    
        while(sock > 0)
        {
    		/* Netlink message buffer */
    		int b = recv(sock, &buf, sizeof(buf),0);
    		if(b > 0)
    		{
    			//printf("%s\n", buf);
    			CUSBListener_onUSB(buf);
    		}
        }
        perror("Create Netlink failed:" );
    }

     

    3. 接收到的内核的报文内容

    当由设备插入时,这里是一个U盘和一个GPIB设备,内核发送的报文内容如下

    插入

    ——————

    add@/devices/platform/fe3c0000.usb/usb1/1-1/1-1.4

    add@/devices/platform/fe3c0000.usb/usb1/1-1/1-1.4/1-1.4:1.0

    add@/devices/platform/fe3c0000.usb/usb1/1-1/1-1.4/1-1.4:1.0/host6

    add@/devices/platform/fe3c0000.usb/usb1/1-1/1-1.4/1-1.4:1.0/host6/scsi_host/host6

    add@/devices/platform/fe3c0000.usb/usb1/1-1/1-1.4/1-1.4:1.0/host6/target6:0:0

    add@/devices/platform/fe3c0000.usb/usb1/1-1/1-1.4/1-1.4:1.0/host6/target6:0:0/6:0:0:0

    add@/devices/platform/fe3c0000.usb/usb1/1-1/1-1.4/1-1.4:1.0/host6/target6:0:0/6:0:0:0/scsi_disk/6:0:0:0

    add@/devices/platform/fe3c0000.usb/usb1/1-1/1-1.4/1-1.4:1.0/host6/target6:0:0/6:0:0:0/scsi_device/6:0:0:0

    add@/devices/platform/fe3c0000.usb/usb1/1-1/1-1.4/1-1.4:1.0/host6/target6:0:0/6:0:0:0/scsi_generic/sg0

    add@/devices/platform/fe3c0000.usb/usb1/1-1/1-1.4/1-1.4:1.0/host6/target6:0:0/6:0:0:0/bsg/6:0:0:0

    add@/devices/virtual/bdi/8:0

    add@/devices/platform/fe3c0000.usb/usb1/1-1/1-1.4/1-1.4:1.0/host6/target6:0:0/6:0:0:0/block/sda

    add@/devices/platform/fe3c0000.usb/usb1/1-1/1-1.4/1-1.4:1.0/host6/target6:0:0/6:0:0:0/block/sda/sda1

    Found U Disk

    /sda1

    add@/devices/virtual/bdi/8:1-fuseblk

    add@/devices/virtual/bdi/0:28

    add@/devices/virtual/bdi/0:29

    add@/devices/virtual/bdi/0:30

    ——————

     

    删除

    ——————

    remove@/devices/platform/fe3c0000.usb/usb1/1-1/1-1.4/1-1.4:1.0/host6/target6:0:0/6:0:0:0/bsg/6:0:0:0

    remove@/devices/platform/fe3c0000.usb/usb1/1-1/1-1.4/1-1.4:1.0/host6/target6:0:0/6:0:0:0/scsi_generic/sg0

    remove@/devices/platform/fe3c0000.usb/usb1/1-1/1-1.4/1-1.4:1.0/host6/target6:0:0/6:0:0:0/scsi_device/6:0:0:0

    remove@/devices/platform/fe3c0000.usb/usb1/1-1/1-1.4/1-1.4:1.0/host6/target6:0:0/6:0:0:0/scsi_disk/6:0:0:0

    remove@/devices/platform/fe3c0000.usb/usb1/1-1/1-1.4/1-1.4:1.0/host6/target6:0:0/6:0:0:0/block/sda/sda1

    remove U Disk

    /sda1

    remove@/devices/platform/fe3c0000.usb/usb1/1-1/1-1.4/1-1.4:1.0/host6/target6:0:0/6:0:0:0/block/sda

    remove@/devices/platform/fe3c0000.usb/usb1/1-1/1-1.4/1-1.4:1.0/host6/target6:0:0/6:0:0:0

    remove@/devices/virtual/bdi/8:0

    remove@/devices/platform/fe3c0000.usb/usb1/1-1/1-1.4/1-1.4:1.0/host6/target6:0:0

    remove@/devices/platform/fe3c0000.usb/usb1/1-1/1-1.4/1-1.4:1.0/host6/scsi_host/host6

    remove@/devices/platform/fe3c0000.usb/usb1/1-1/1-1.4/1-1.4:1.0/host6

    remove@/devices/platform/fe3c0000.usb/usb1/1-1/1-1.4/1-1.4:1.0

    remove@/devices/platform/fe3c0000.usb/usb1/1-1/1-1.4

    remove@/devices/virtual/bdi/0:28

    remove@/devices/virtual/bdi/0:29

    remove@/devices/virtual/bdi/0:30

    remove@/devices/virtual/bdi/8:1-fuseblk

    ——————

     

    其中红色部分是我打印出来的

     

    GPIB的实验

    插入

    ——————

    add@/devices/platform/usb@fe900000/fe900000.dwc3/xhci-hcd.11.auto/usb3/3-1

    add@/devices/platform/usb@fe900000/fe900000.dwc3/xhci-hcd.11.auto/usb3/3-1/3-1:1.0

    add@/class/usbmisc

    add@/devices/platform/usb@fe900000/fe900000.dwc3/xhci-hcd.11.auto/usb3/3-1/3-1:1.0/usbmisc/usbgpib0

    ——————

    删除

    ——————

    add@/devices/platform/usb@fe900000/fe900000.dwc3/xhci-hcd.11.auto/usb3/3-1

    add@/devices/platform/usb@fe900000/fe900000.dwc3/xhci-hcd.11.auto/usb3/3-1/3-1:1.0

    add@/class/usbmisc

    add@/devices/platform/usb@fe900000/fe900000.dwc3/xhci-hcd.11.auto/usb3/3-1/3-1:1.0/usbmisc/usbgpib0

    ——————

     

    4. 参考

    https://gist.github.com/userid/9edfae91647479de3e5790fbbdba36c2

    https://blog.csdn.net/u010727765/article/details/79538101

     

     

     

     

    展开全文
  • Qt之USB热插拔

    2017-12-29 17:47:03
    基于Qt5.5.1的应用程序,支持监控系统设备变化,当插入可移动设备、右键弹出和移除可移动设备时可以实时的通知应用程序
  • 当我们做拔插的时候比如Usb或者SDCard,android底层会发出相应的Intent出来给上层应用成使用,比如SDCard或者Usb android都会发这样一个Intent.ACTION_MEDIA_MOUNTED,所以我们在上层应用程序中只要侦听这个Intent就...

    当我们做拔插的时候比如Usb或者SDCard,android底层会发出相应的Intent出来给上层应用成使用,比如SDCard或者Usb android都会发这样一个Intent.ACTION_MEDIA_MOUNTED,所以我们在上层应用程序中只要侦听这个Intent就可以了,怎么去区分到底是Usb或者SDCard?其实这个Intent里面带了一个Data,Data里面就封装了path参数,我们只要得到这个path进行判断就可以判断出到底是Usb还是SDCard了

    android底层frameworks/base/services/java/com/android/server/MountService.java发出Intent的代码如下:

    if (newState == VolumeState.Mounted) {

    if (DEBUG_EVENTS) Slog.w(TAG, "updating volume state mounted");

    updatePublicVolumeState(path, Environment.MEDIA_MOUNTED);

    in = new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + path));

    in.putExtra("read-only", false);

    应用程序中处理的代码:

    if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) {

    String path = intent.getData().toString()

    .substring("file://".length());

    startUpGrade(intent.getData());

    }

    展开全文
  • 热插拔与非热插拔的区别

    千次阅读 2017-08-31 10:58:50
    1、热插拔:即带电插拔,热插拔功能就是允许用户在不关闭系统,不切断电源的情况下取出和更换损坏的硬盘、电源或板卡等部件... 热插拔就是可以带电插拔的设备,比如USB设备、1394设备等,直接带电插拔的话不会对设备造
    1、热插拔:即带电插拔,热插拔功能就是允许用户在不关闭系统,不切断电源的情况下取出和更换损坏的硬盘、电源或板卡等部件,从而提高了系统对灾难的及时恢复能力、扩展性和灵活性等,例如一些面向高端应用的磁盘镜像系统都可以提供磁盘的热插拔功能。
    2、非热插拔:非热插拔的设备强行热插拔会造成永久的损伤。
          热插拔就是可以带电插拔的设备,比如USB设备、1394设备等,直接带电插拔的话不会对设备造成损伤,非热拔插设备则是不可带电插拔的,想要把插必须在关机断电的情况下进行操作,比如电脑内部的硬盘等。
    展开全文
  • MFC检测USB热插拔

    2017-11-22 16:23:49
    在网上找了很久,发现这个方法还是可以实现的,但是必须要知道USB设备的GUID,我准备写下来留作以便以后查询 BOOL CXXdlg::OnDeviceChange(UINT nEventType,DWORD dwData) { DEV_BROADCAST_DEVICEINTERFACE* dbd ...
  • linux下,如何检测USB热插拔事件。

    千次阅读 2011-11-27 18:34:40
    最近在做嵌入式板上的USB插拔检测。当有设备插入时,系统能够提示此设备是什么设备。 在网上查了查,大部分都说用udev可以实现。 目前我在嵌入式平台上用udev代码检测,发现没有此功能。 为了不影响开发进度,我...
  • 1.当不同设备热插拔后如何区别谁在进行插拔操作?通过UsbManager获取UsbDevice中的VID和PID,大部分USB设备的VID和PID是不同的,除了二代证的模块的VID和PID是同一个。所以可以通过判断VID和PID来区分那一个USB外设...
  • 当我们做拔插的时候比如Usb或者SDCard,android底层会发出相应的Intent出来给上层应用成使用,比如SDCard或者Usb android都会发这样一个Intent.ACTION_MEDIA_MOUNTED,所以我们在上层应用程序中只要侦听这个Intent就...
  • usb热插拔使用简介

    千次阅读 2007-04-06 17:47:00
    相关的网页可以通过man hotplug获取 USB USB hotplugging involves: MODULE_DEVICE_TABLE support in the USB Device Driver API, so that a drivers probe() routine is called only when its very l
  • 转自:https://blog.csdn.net/shengzhadon/article/details/51455361QT5.5.1 嵌入式平台 鼠标键盘不能热插拔问题解决 qt5.7.0编译的默认输入选项是-evdev,不支持usb鼠标热拔插,可以修改qt安装目录/Users/...
  • linux 在用户空间如何实现usb热插拔

    千次阅读 2016-09-20 15:44:18
    它是devfs和hotplug的继承者,运行在用户空间,并且用户可以用udev规则来改变设备的命名。udev依赖2.6内核引入的sysfs文件系统。每当一个设备被加入或移除,就会产生内核事件通知用户空间的udev。   mdev介绍:  ...
  • 使用udev检测显示器是否发生变化,然后执行脚本,解决linux显示器热插拔问题 先补充一点: [root@localhost ~]# cat /sys/class/drm/card0-VGA-1/status connected connectd 表示VGA口处于连接状态 拔掉则显示...
  • 硬件设计使用了,usb转sd卡的电路,类似sd卡读卡器,经过测试,发现linux系统,usb口不动,直接插拔sd卡,系统无法热插拔, 经过多方验证,查找到一种复位usb节点的方法,可实现重新加载usb设备,可以类比其他类似...
  • Qt5修改支持热插拔

    2020-11-02 18:33:53
    原文: QT5.7.0 嵌入式平台 usb鼠标键盘不能热插拔问题 - it610.comhttps://www.it610.com/article/1305212461422514176.htm ...谢谢作者,真是帮了大忙了,亲测可以解决USB鼠标键盘热插拔问题。
  • sATA和eSATA热插拔

    2013-09-02 14:30:29
    sATA和eSATA硬盘可以实现热插拔,可是又不像USB设备一样在系统托盘区有一个关闭图标,如果不关闭就拔下的话,可能造成硬盘数据不完整,严重的还会损坏硬盘。这个软件就是在系统托盘增加一个图标,可以关闭eSATA硬盘...
  • 有时候我们可能要侦听Usb或者SDCard一些拔插事件,其实很简单,当我们做拔插的时候比如Usb或者SDCard,android底层会发出相应的Intent出来给上层应用成使用,比如SDCard或者Usbandroid都会发这样一个Intent.ACTION_...
  • OCX中实现USB设备热拔插

    千次阅读 2016-03-24 10:54:35
    在知道要实现这个功能的时候,我最先想到了WM_DEVICECHANGE消息,它可以通知我们USB设备状态的改变 于是我学会了这个消息的使用http://blog.csdn.net/rankun1/article/details/50969183 但是很遗憾,如果是一个...
  • 热插拔技术已被广泛应用到电信服务器、USB接口、火线(firewire)和CompactPCI(是一种基于标准PCI总线的小巧而坚固的高性能总线技术,它定义了更加坚固耐用的PCI版本。在电气、逻辑和软件方面,它与PCI标准完全兼容)...
  • 因为项目需要支持usb 串口的设备,因为linux... 但是热插拔或者同时插入几个usb 串口设备。生成ttyUSB* 就是不确定序列号。 所以我们通过android ueventd 守护进程根据固定的设备路径做软连接。apk 就可以打开这个软
  • MiniGUI鼠标热插拔支持

    千次阅读 2015-07-21 19:05:17
    因产品需求,需要minigui支持USB鼠标支持热插拔功能。但是奇怪的是测试人员说以前测试的时候是支持usb热插拔的,现在不行了。这叫我情何以堪,我压根就没动什么呀,从linux内核到文件系统再到minigui 的库,我印象中...
  • 目前,最普遍的热插拔就是USB设备的插拔。热插拔时,端口的信号线(例如HDMI线)已经带电,本身可以等效成一个充了电的大电容,电荷会在与设备接触时释放。这种现象类似于静电释放,通常会对设备产生严...
  • 大家都知道SATA因盘和ESATA硬盘都可以实现热插拔,可是又不像USB设备一样在系统托盘区有一个关闭图标,如果不关闭就拔下的话,可能造成硬盘数据不完整,严重的还会损坏硬盘。 HotSwap的作用就是就是在系统托盘增加...
  • 热插拔技术已被广泛应用到电信服务器、USB接口、火线(firewire)和CompactPCI中。这种技术可在维持系统背板的电压下,更换发生故障的电路板,并保证系统中其他正常的电路板仍可保持运作。在工作中的背板上进行热插拔...
  • 如何使用busybox精简版本udev程序--mdev动态创建插入的u盘和鼠标...busybox的mdev是一个精简了的udev管理程序,它可以间接的以hotplug方式被内核调用,进而在arm平台上/dev目录下动态创建设备 节点,因为hotplug会被内...
  • 本次分享一中检测设备热插拔的方法,比如,在系统中插入一个usb设备,无线网卡等,都可以检测到,并决定后续的工作;研究检测计算机硬件的拔插,包括某类设备接口、文件系统、OEM或IHV厂商自定义设定的设备、端El...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 360
精华内容 144
关键字:

usb可以热插拔