linux下的用libusb讀寫自定義HID設備


本來是幫朋友寫個RFID讀寫器設備的程序,最開始沒要求USB接口,半路加了這個功能。而且windows版的早都完成了,Linux版的遲遲未做。今天終於抽空將Linux下的usb通信調通,特此記錄一下。

使用libusb做linux下的通信的調試過程大概如下:

1、使用命令行工具lsusb,查看當前設備的通信端點的通信方式。lsusb -v后,在Endpoint中的Transfer Type可以看到,我用的這個設備的通信方式為interrupt,中斷模式。

2、使用lsusb查看輸出端點和輸入端點,記錄端點號。一般情況為,寫設備為0x01(朋友的設備為0x02),讀設備為0x81.

3、查看輸出緩沖區的大小,在寫設備時會用到---絆在這塊時間比較久。

完成了上述三點就可以進行編程了,事例代碼如下:

#include <string.h>
#include <stdio.h>
#include <libusb-1.0/libusb.h>

static libusb_device_handle *dev_handle = NULL; 

int main() {
    int i = 0;
    int ret = 1;
    int transferred = 0;
    ssize_t cnt;  
    unsigned char cmd[64] = {0x5A, 0x00, 0x01, 0x02, 0x10, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x01, 0xF4, 0x87};    // 64為上述第3步獲取到的緩沖區大小

    struct libusb_device_descriptor desc;  
    libusb_device **devs; 

    libusb_context *ctx = NULL;   

    ret = libusb_init(NULL);  
    if(ret < 0) {
        fprintf(stderr, "failed to initialise libusb\n");
        return 1;    
    }

    dev_handle = libusb_open_device_with_vid_pid(NULL, 0x03eb, 0x2421);
    if(dev_handle == NULL){
    	perror("Cannot open device\n");
    }else{
        printf("Device Opened\n");
    }

	if(libusb_kernel_driver_active(dev_handle, 0) == 1) {  
		printf("Kernel Driver Active\n");
		if(libusb_detach_kernel_driver(dev_handle, 0) == 0){ 
			printf("Kernel Driver Detached!\n");
		}
	}   

	ret = libusb_claim_interface(dev_handle, 0); 
	if(ret < 0) {
		perror("Cannot Claim Interface\n");
		return 1;
	}

    ret = libusb_interrupt_transfer(dev_handle, 0x02, cmd, sizeof(cmd), &transferred, 0);
    if(ret==0 && transferred==sizeof(cmd_ir_start)){
        printf("write Successful!\n");
    }else{
        printf("write error!\n");
    }

	char buf[1024] = {0};
	ret = libusb_interrupt_transfer(dev_handle, 0x81, buf, sizeof(buf), &transferred, 0);
	if (ret != 0) {
		printf("failed to read \n");
	}

    ret = libusb_release_interface(dev_handle, 0);
    if(ret != 0){
        printf("Cannot Released Interface!\n");
    }else{
        printf("Released Interface!\n");
    }
   
    libusb_close(dev_handle); 
    libusb_exit(ctx);  

    return 0;
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM