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模式時,將採用這個密碼來聯接.