歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux下實現USB口的熱插拔

Linux下實現USB口的熱插拔

日期:2017/2/28 16:01:41   编辑:Linux教程

目前要做一個在嵌入式平台上的USB口的熱插拔事件。

經過我現在的分析總結目前有如下方法:

1,定時檢查/proc/scsi/scsi文件

此方法只能在PC上,但在嵌入式平台上不可用。

2,netlink方式

使用netlink.

#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>

#define UEVENT_BUFFER_SIZE 2048

static int init_hotplug_sock()
{
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;
}

int main(int argc, char* argv[])
{
int hotplug_sock = init_hotplug_sock();

while(1)
{
/* Netlink message buffer */
char buf[UEVENT_BUFFER_SIZE * 2] = {0};
recv(hotplug_sock, &buf, sizeof(buf), 0);
printf("%s\n", buf);

/* USB 設備的插拔會出現字符信息,通過比較不同的信息確定特定設備的插拔,在這添加比較代碼 */
}
return 0;

}

經過測試發現只能實現插與拔,但是無法具體到具體是什麼設備。

3,使用mdev。

此方法相當麻煩,現在在研究中。

4,使用最原始的解析文件方式

此方法相當麻煩,生成很多文件。

就是用cat /proc/bus/usb/devices的信息生成的文件進行解析。

目前我已經完成此功能。雖然能用,但是效率太低。

Copyright © Linux教程網 All Rights Reserved