編寫源碼
#include < errno.h >
#include < signal.h >
#include < stdio.h >
#include < stdlib.h >
#include < string.h >
#include < libusb-1.0/libusb.h >
int main(int argc, char **argv)
{
int err;
libusb_device *dev, **devs;
int num_devices;
int endpoint;
int interface_num;
int found = 0;
int transferred;
int count = 0;
unsigned char buffer[16];
struct libusb_config_descriptor *config_desc;
struct libusb_device_handle *dev_handle = NULL;
/* libusb_init */
err = libusb_init(NULL);
if (err < 0) {
fprintf(stderr, "failed to initialise libusb %d - %sn", err, libusb_strerror(err));
exit(1);
}
/* get device list */
if ((num_devices = libusb_get_device_list(NULL, &devs)) < 0) {
fprintf(stderr, "libusb_get_device_list() failedn");
libusb_exit(NULL);
exit(1);
}
fprintf(stdout, "libusb_get_device_list() okn");
/* for each device, get config descriptor */
for (int i = 0; i < num_devices; i++) {
dev = devs[i];
/* parse interface descriptor, find usb mouse */
err = libusb_get_config_descriptor(dev, 0, &config_desc);
if (err) {
fprintf(stderr, "could not get configuration descriptorn");
continue;
}
fprintf(stdout, "libusb_get_config_descriptor() okn");
for (int interface = 0; interface < config_desc- >bNumInterfaces; interface++) {
const struct libusb_interface_descriptor *intf_desc = &config_desc- >interface[interface].altsetting[0];
interface_num = intf_desc- >bInterfaceNumber;
if (intf_desc- >bInterfaceClass != 3 || intf_desc- >bInterfaceProtocol != 2)
continue;
else
{
/* 找到了USB鼠標(biāo) */
fprintf(stdout, "find usb mouse okn");
for (int ep = 0; ep < intf_desc- >bNumEndpoints; ep++)
{
if ((intf_desc- >endpoint[ep].bmAttributes & 3) == LIBUSB_TRANSFER_TYPE_INTERRUPT ||
(intf_desc- >endpoint[ep].bEndpointAddress & 0x80) == LIBUSB_ENDPOINT_IN) {
/* 找到了輸入的中斷端點 */
fprintf(stdout, "find in int endpointn");
endpoint = intf_desc- >endpoint[ep].bEndpointAddress;
found = 1;
break;
}
}
}
if (found)
break;
}
libusb_free_config_descriptor(config_desc);
if (found)
break;
}
if (!found)
{
/* free device list */
libusb_free_device_list(devs, 1);
libusb_exit(NULL);
exit(1);
}
if (found)
{
/* libusb_open */
err = libusb_open(dev, &dev_handle);
if (err)
{
fprintf(stderr, "failed to open usb mousen");
exit(1);
}
fprintf(stdout, "libusb_open okn");
}
/* free device list */
libusb_free_device_list(devs, 1);
/* claim interface */
libusb_set_auto_detach_kernel_driver(dev_handle, 1);
err = libusb_claim_interface(dev_handle, interface_num);
if (err)
{
fprintf(stderr, "failed to libusb_claim_interfacen");
exit(1);
}
fprintf(stdout, "libusb_claim_interface okn");
/* libusb_interrupt_transfer */
while (1)
{
err = libusb_interrupt_transfer(dev_handle, endpoint, buffer, 16, &transferred, 5000);
if (!err) {
/* parser data */
printf("%04d datas: ", count++);
for (int i = 0; i < transferred; i++)
{
printf("%02x ", buffer[i]);
}
printf("n");
} else if (err == LIBUSB_ERROR_TIMEOUT){
fprintf(stderr, "libusb_interrupt_transfer timoutn");
} else {
fprintf(stderr, "libusb_interrupt_transfer err : %dn", err);
//exit(1);
}
}
/* libusb_close */
libusb_release_interface(dev_handle, interface_num);
libusb_close(dev_handle);
libusb_exit(NULL);
}
2.2 上機實驗
2.2.1 在 Ubuntu 上實驗
// 1. 安裝開發(fā)包
$ sudo apt install libusb-1.0-0-dev
// 2. 修改源碼,包含libusb.h 頭文件時用如下代碼
#include < libusb-1.0/libusb.h >
// 3. 編譯程序指定庫
gcc -o readmouse readmouse.c -lusb-1.0
2.2.2 在 IMX6ULL 開發(fā)板上實驗
- 交叉編譯 libusb
sudo apt-get install libtool unzip libusb-1.0.26.zip cd libusb-1.0.26 ./autogen.sh ./configure --host=arm-buildroot-linux-gnueabihf --prefix=$PWD/tmp make make install ls tmp/ include lib
- 安裝庫、頭文件到工具鏈的目錄里
libusb-1.0.26/tmp/lib$ cp * -rfd /home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/lib/ libusb-1.0.26/tmp/include$ cp libusb-1.0 -rf /home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/include/
- 交叉編譯 app
arm-buildroot-linux-gnueabihf-gcc -o readmouse.c -lusb-1.0
- 在開發(fā)板上插入 USB 鼠標(biāo),執(zhí)行命令
./readmouse
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
接口
+關(guān)注
關(guān)注
33文章
8718瀏覽量
152026 -
usb
+關(guān)注
關(guān)注
60文章
7990瀏覽量
266283 -
鼠標(biāo)
+關(guān)注
關(guān)注
6文章
591瀏覽量
39939
發(fā)布評論請先 登錄
相關(guān)推薦
STM32讀取鼠標(biāo)芯片<原相的PAN3204>移動數(shù)據(jù)的問題
不能讀取到移動的數(shù)據(jù)(不管怎么動鼠標(biāo),讀取到數(shù)據(jù)就是不動,從紅色LED可以看出芯片檢測到移動了),找了很久的問題還是不行,所以來這個論壇找找
發(fā)表于 02-28 13:35
PS2鼠標(biāo)使用USB接口的轉(zhuǎn)換器
鼠標(biāo)與控制器間履行一種雙向同步串行數(shù)據(jù)幀協(xié)議,每幀為11~12Bit,如圖3所示。按照標(biāo)準(zhǔn)的三鍵鼠標(biāo)的數(shù)據(jù)包有效
發(fā)表于 12-06 10:14
嵌入式設(shè)備鼠標(biāo)接口的設(shè)計與實現(xiàn)
接口采用一種雙向同步串行協(xié)議。即每在時鐘線上發(fā)一個脈沖,就在數(shù)據(jù)線上發(fā)送一位數(shù)據(jù)。在相互傳輸中,主機擁有總線控制權(quán),即它可以在任何時候抑制鼠標(biāo)
發(fā)表于 12-14 10:58
PS/2鼠標(biāo)和單片機的接口
鼠標(biāo)有RS232串口和PS/2二種接口,在單片機應(yīng)用中,由于PS/2鼠標(biāo)是1yrL電平,和單片接口更方便,通常PS/2鼠標(biāo)控制芯片采用TP8
發(fā)表于 10-22 23:00
?121次下載
![PS/2<b class='flag-5'>鼠標(biāo)</b>和單片機的<b class='flag-5'>接口</b>](https://file.elecfans.com/web2/M00/48/84/pYYBAGKhtAuALdjvAAAbrhX2l0M564.jpg)
鼠標(biāo)接口
鼠標(biāo)接口7.1 鼠標(biāo)的工作原理1. 鼠標(biāo)分機械式鼠標(biāo)和光電式鼠標(biāo)
發(fā)表于 06-12 22:18
?43次下載
基于PS/2鼠標(biāo)接口單片機輸入設(shè)備的實現(xiàn)
基于PS/2鼠標(biāo)接口單片機輸入設(shè)備的實現(xiàn):詳細介紹了PS/2鼠標(biāo)/鍵盤接口的工作原理.提出了基于PS/2接口的三鍵
發(fā)表于 10-27 18:30
?82次下載
PS 2鼠標(biāo)接口轉(zhuǎn)串行鼠標(biāo)轉(zhuǎn)接器
PS 2鼠標(biāo)接口轉(zhuǎn)串行鼠標(biāo)轉(zhuǎn)接器
本轉(zhuǎn)換口把一個串行鼠標(biāo)接到 PS/2 鼠標(biāo)口上,到鼠
發(fā)表于 11-27 20:08
?920次閱讀
![PS 2<b class='flag-5'>鼠標(biāo)</b><b class='flag-5'>接口</b>轉(zhuǎn)串行<b class='flag-5'>鼠標(biāo)</b>轉(zhuǎn)接器](https://file1.elecfans.com//web2/M00/A4/41/wKgZomUMM2GAdmXKAAATdtU4D_o587.bmp)
鼠標(biāo)接口類型
鼠標(biāo)接口類型
接口類型是指鼠標(biāo)與電腦主機之間相連接的接口方式或類型。目前常見的鼠標(biāo)
發(fā)表于 12-28 11:26
?2222次閱讀
什么是主板PS/2鼠標(biāo)接口
什么是主板PS/2鼠標(biāo)接口
PS/2鼠標(biāo)接口:現(xiàn)今的一些流行的Pentium
發(fā)表于 02-05 11:46
?1581次閱讀
通過I2C兼容接口讀取ADC數(shù)據(jù)
本應(yīng)用筆記討論了通過I2C兼容接口讀取多字節(jié)數(shù)據(jù)時需要特別注意的地方。介紹了每次讀取一個字節(jié)時容易出現(xiàn)的問題,并給出了幾個具體示例。本文也描述了進行
發(fā)表于 08-26 22:13
?901次閱讀
![通過I2C兼容<b class='flag-5'>接口</b><b class='flag-5'>讀取</b>ADC<b class='flag-5'>數(shù)據(jù)</b>](https://file1.elecfans.com//web2/M00/A5/FA/wKgZomUMOxeAcf_kAAAFgBhWRm8923.gif)
KVM遠程鼠標(biāo)同步方法
提出一種基于高速USB2.0-HID 類規(guī)范的鼠標(biāo)同步方法。在傳統(tǒng)相對鼠標(biāo)同步方法中加入自適應(yīng)殘
發(fā)表于 05-10 11:50
?6784次閱讀
![KVM遠程<b class='flag-5'>鼠標(biāo)</b><b class='flag-5'>同步</b><b class='flag-5'>方法</b>](https://file1.elecfans.com//web2/M00/A6/35/wKgZomUMPEWAR_bNAAAPK5qQMaY167.jpg)
鼠標(biāo)PS2接口改USB方法
現(xiàn)在,大多數(shù)最新的筆記本電腦已經(jīng)放棄了PS2接口,但是很多用戶都是要外接鼠標(biāo)的,特別是要求效率高的或者是作圖用途的用戶更是如此。這就有一個問題了,以前買的PS2接口的鼠標(biāo)用不上了,一個
使用鼠標(biāo)失靈時的解決方法
步驟一:出現(xiàn)問題的鼠標(biāo)一般以USB接口的鼠標(biāo)居多,原因當(dāng)然不外乎鼠標(biāo)自身和USB接口問題了,首先我們來看看是否是
關(guān)于從I2C接口上的ADC讀取數(shù)據(jù)及處理方法
本應(yīng)用筆記討論了通過I2C兼容接口讀取多字節(jié)數(shù)據(jù)時需要注意的問題。討論了一次讀取一個字節(jié)的陷阱,并提供了一些具體示例。本文還介紹了處理此類數(shù)據(jù)
![關(guān)于從I2C<b class='flag-5'>接口</b>上的ADC<b class='flag-5'>讀取</b><b class='flag-5'>數(shù)據(jù)</b>及處理<b class='flag-5'>方法</b>](https://file.elecfans.com/web2/M00/8B/E3/pYYBAGPWJpqAV-Y8AAAeK9MruX8058.png)
評論