Linux下实现USB口的热插拔
来源:互联网 发布:县医院 网络图片图 编辑:程序博客网 时间:2024/06/05 09:20
目前要做一个在嵌入式平台上的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的信息生成的文件进行解析。
目前我已经完成此功能。虽然能用,但是效率太低。
转自: http://www.linuxidc.com/Linux/2011-12/49112.htm
- linux下实现USB口的热插拔
- Linux下实现USB口的热插拔
- Linux下实现USB口的热插拔事件触发
- linux下usb传输实现
- 【servfox】Arm-linux下USB摄像头的视频服务器的实现
- linux下实现了dnw2的usb文件传输
- linux c 下获取USB设备的信息并禁止使用USB设备的实现
- Linux USB口的热插拔
- linux 下 USB 摄像头实现分析
- linux下USB DNW功能实现
- Linux下自动检测USB热插拔
- Linux下自动检测USB热插拔
- linux下usb驱动头文件的usb.h(二)
- WINCE下实现基于USB的camera
- WINCE下实现基于USB的camera
- WINCE下实现基于USB的camera
- Android下USB Accessory的实现分析
- Android下USB Accessory的实现分析
- Ehcache使用(一):初步使用Ehcache
- 通过浏览器直接打开Android应用程序
- leetcode Excel Sheet Column Number
- android 事件的传递与消费
- 使用tmpfs作缓存、临时文件存储加速
- Linux下实现USB口的热插拔
- 生成分页代码
- 欢迎使用CSDN-markdown编辑器
- 设计模式之单例模式(Java)
- 11111
- windows平台下安装python的setuptools工具
- SI与EMI(二)
- iOS GCD实现
- 如何用java 5分钟实现一个最简单的mysql代理服务器?