USB驱动程序支持在原生Linux提供了。
方法要求启用驱动,但是,取决于你所使用的分布和内核版本。
哪个发行版支持USBFS?
已知提供USBFS支持:
Ubuntu 9.04或以上,
Ubuntu 9.10的内核2.6.31-19服务器,
CentOS的4.8,
CentOS的5.4,
一般情况下,任何分布用内核版本<2.6.32
已知不提供USBFS支持:
Ubuntu 10.04,
一般情况下,任何分布用内核版本> = 2.6.32
方法1:USBFS支持
如果你的发行版提供了USBFS支持,那么下面的命令将工作:
mount -t usbfs none /proc/bus/usb -o devmode=0666
为了使这种更改永久,确保下面一行是在/ etc / fstab文件中:
none /proc/bus/usb usbfs defaults,devmode=0666 0 0
这将自动安装在系统启动。
一旦 /etc/fstab添加已经做完,一个简单的命令应该挂载USBFS文件系统:
mount /proc/bus/usb
无论是FTDI / XTAG和XTAG-2的调试适配器现在应该工作。
方法2:没有USBFS支持
为了确保在任何一个FTDI / XTAG或XTAG-2调试适配器插入时的权限是在设备上是正确的,您需要配置“udev”来识别这个设备。
创建一个文件“/etc/udev/rules.d/99-xmos.rules”,其内容如下:
SUBSYSTEM!="usb|usb_device", GOTO="xmos_rules_end"
ACTION!="add", GOTO="xmos_rules_end"
# 20b1:f7d1 for xmos xtag2
ATTRS{idVendor}=="20b1", ATTRS{idProct}=="f7d1", MODE="0666", SYMLINK+="xtag2-%n"
# 20b1:f7d3 for xmos startkit
ATTRS{idVendor}=="20b1", ATTRS{idProct}=="f7d3", MODE="0666", SYMLINK+="startkit-%n"
# 0403:6010 for XC-1 with FTDI al-uart chip
ATTRS{idVendor}=="0403", ATTRS{idProct}=="6010", MODE="0666", SYMLINK+="xc1-%n"
LABEL="xmos_rules_end"
注意:本ATTRS,MODE和SYMLINK节必须全部在同一行,因为每个规则只能在一行上。
现在告诉udev进行重新加载,以确保文件添加新的规则:
service udev reload
还必须拔下并重新插上USB线,让udev的识别设备的新规则。或者触发重新插上的udev类型为“udevadm触发”或“udevtrigger”命令,取决于在你的Linux分布上udev的版本。
FTDI / XTAG其他注意事项
FTDI的库需要USB设备的文件都可以从/ proc /bus/ USB,不支持的/dev/bus/usb作为文件的位置。
但是,如果你的发行版不支持USBFS(以上方法1),但确实有一个的/proc/bus/usb空目录,你可以使用下面的绑定mount命令的解决方法:
mount --bind /dev/bus/usb /proc/bus/usb
如果你的发行版不支持USBFS,也没有一个的/proc/bus/usb目录(这是较新的内核的情况下,大约从2.6.32开始),然后联系XMOS的rthe设备库的非官方补丁的版本; 发送XMOS的支持标签,其中包括“Linux的FTDI库请求”的主题。
『贰』 如何在Linux下利用Libusb与HID USB设备通信
USB HID 是Human Interface Device的缩写,由其名称可以了解HID设备是直接与人交互的设备,例如键盘、鼠标与游戏杆等。不过HID设备并不一定要有人机接口,只要符合HID类别规范的设备都是HID设备。 下列是HID类别设备的主要能力
『叁』 如何在Linux下利用Libusb与HID USB设备通信
由于公司的产品,导致我在Linux下写usb通信的代码出现了许多的问题,最后发现这些设备只能通过控制传输来操作设备,所以后面的问题就迎刃而解了。现在贴上当时在QT下写的代码,以防日后再碰到此类问题的时候翻查。
还有在QT下使用libusb库的时候一定要在(项目名.pro)文件加上:
[cpp] view plain
INCLUDEPATH += /usr/include/libusb-1.0
LIBS += -L"/usr/lib/x86_64-linux-gnu" -lusb-1.0
否则程序无法找到该库的路径。
[cpp] view plain
libusb_device **devs;
libusb_device_handle *dev_handle;
libusb_context *ctx=NULL;
struct libusb_device_descriptor desc;
int r;
ssize_t cnt;
r=libusb_init(&ctx);
if(r<0)
{
//printf("init error");
QMessageBox::about(this,"haha","initialerror");
return ;
}
libusb_set_debug(ctx,3);
//cnt=libusb_get_device_list(ctx,&devs);
dev_handle=libusb_open_device_with_vid_pid(ctx,VID,PID);
if(dev_handle==NULL)
QMessageBox::about(this,"haha","open my dev error");
else
QMessageBox::about(this,"haha","open my dev success");
//libusb_free_device_list(devs,1);
if(libusb_kernel_driver_active(dev_handle,0)==1)
{
QMessageBox::about(this,"haha","kernel driver active");
if(libusb_detach_kernel_driver(dev_handle,0)==0)
QMessageBox::about(this,"haha","kernel driver detached");
}
r=libusb_claim_interface(dev_handle,0);
if(r<0)
{
QMessageBox::about(this,"haha","cannot claim interface");
return ;
}
QMessageBox::about(this,"haha","claimed interface");
// start use this usb
unsigned char dataOut[0x30]={0};
dataOut[0]=0x00;
dataOut[1]=0x02;
dataOut[2]=0x08;
dataOut[3]=0x00;
dataOut[4]=0x02;
dataOut[5]=0x00;
dataOut[6]=0xb2;
dataOut[7]=0x30;
dataOut[8]=dataOut[2]^dataOut[3]^dataOut[4]^dataOut[5]^dataOut[6]^dataOut[7];
//r=libusb_interrupt_transfer(dev_handle,LIBUSB_ENDPOINT_OUT, dataOut,9, &actual_length, 0);
//r=libusb_bulk_transfer(dev_handle,LIBUSB_ENDPOINT_OUT,dataOut,9,&actual_length,5000);
//此设备必须用控制传输
r=libusb_control_transfer(dev_handle, 0x21, 0x09, 0x0300, 0x00, dataOut+1, 0x20, 1000);
unsigned char dataRead[0x30]={0};
r=libusb_control_transfer(dev_handle, 0xa1, 0x01, 0x0300, 0x00, dataRead, 0x20, 1000);
if(r<0)
{
QMessageBox::about(this,"haha","transfer data error");
}else
{
QMessageBox::about(this,"haha","transfer data success");
}
//release everything
r=libusb_release_interface(dev_handle,0);
libusb_attach_kernel_driver(dev_handle,0);
libusb_close(dev_handle);
libusb_exit(ctx);
『肆』 嵌入式linux 蓝牙怎么开发
一.Linux对于蓝牙的支持
在Linux 2.6内核已经实现如下协议。
串口形式蓝牙设备驱动(HCI UART driver)
USB蓝牙棒驱动(HCI USB driver)
内核也实现了L2CAP,RFCOMM串口接口,以及SCO链路支持.
另外内核也直接支持BNEP(Bluetooth Network Encapsulation Protocol ),即把蓝牙网络当成一个无线局域网操作。
Linux也带了蓝牙输入设备的相关支持。
需要打开 HIDP 和HID2HCI两个选项都要打开.
DUND 把蓝牙网络当成一个拨号网络来处理。
2.蓝牙协议栈
在实现了L2CAP后,也需要一个蓝牙协议栈处理。它起什么作用呢? 我的理解是内核封装到RFCOMM的层次,即只负责的蓝牙的包的封装与收发。至于包收上来,在蓝牙的四个阶段,如何应用的状态影响,以及如何响应正确的包,这一些事情由蓝牙协议栈来完成的。
在Linux实现蓝牙功能有多个互相竞争的蓝牙协议栈,但是影响最大是bluez.几乎已经成为Linux下的标准协议栈的代名词。
还有一个协议栈是Affix 不过用的人比较少
在应用程序级,它主要由两部分组成,一个是bluez的应用程序库,主要负责与内核的bluez通信,和bluez-util工具。即完成蓝牙四阶段处理的一些命令行工具。
3.蓝牙的概念。
配对由一方发起即可,如果本设备需要被其它设备搜索,需要有被发现功能。
二.Linux关于蓝牙命令
-------------------------------------------------
在Linux使用蓝牙最方便是使用bluez-util自带向个命令来测试。
我们这里采用市面最容易找到的蓝牙棒来做物理层设备与手机进行通讯测试。把蓝牙棒插LINUX下的USB口后,在dmesg我们会看到提示
passkey 配置项指明请求联接的设备的pin码。当采用auto模式时,将采用这个密码来联接.