基於libhid/libusb進行開發


操作環境:ubuntu,基於libhid/libusb進行開發
 
libusb介紹:

libusb 設計了一系列的外部API 為應用程序所調用,通過這些API應用程序可以操作硬件,從libusb的源代碼可以看出,這些API 調用了內核的底層接口(ioctl),和kernel driver中所用到的函數所實現的功能差不多,只是libusb更加接近USB 規范。使得libusb的使用也比開發內核驅動相對容易的多。相關資料見http://www.libusb.org/。中文資料見百度百科libusb。

libhid介紹
      libhid是在libusb基礎上封裝了一層API,簡化了數據操作,使得HID設備讀寫更方便,也更貼近PC端編程習慣。源碼下載地址 http://libhid.alioth.debian.org/
 
1.libusb操作流程簡介
1.1.初始化
struct usb_bus *bus;
struct usb_device *dev;
usb_init();
usb_find_busses();
usb_find_devices();

 

1.2.找到設備

for (bus = busses; bus; bus = bus->next)

{        

for (dev = bus->devices; dev; dev = dev->next)

{              

if(dev->descriptor.idVendor==VENDOR_ID&& dev->descriptor.idProduct == PRODUCT_ID)

 {

//找到設備

break;

}

       }

}

1.3.打開設備
dev_handle = usb_open(dev);//打開設備
usb_set_configuration( dev_handle , bConfigureType); //設置設備config類型
usb_claim_interface( dev_handle , 0);//注冊與操作系統通信的接口
Note:
usb_claim_interface失敗
1)
現象1:函數返回值=-1,獲取usb_strerror,為Operation not permitted
原因:是應用程序沒有/dev/mnt/usb目錄的寫權限。
解決方法:一種方法是root登陸;另一種是“chmod o+w -R /dev/bus/usb into /etc/init.d/rc shell script”
2)
現象2:函數返回-2,錯誤信息為"USB error: could not claim interface 0: No such file or directory"
usb_set_configuration中的參數必須與控制描述符中的bConfigureType一致
 
 
1.4.獲取報告描述符 
usb_control_msg(dev_handle,
      USB_ENDPOINT_IN+1,
      USB_REQ_GET_DESCRIPTOR,
      (USB_DT_REPORT << 8) + 0, hidif->interface,
      (char*)hidif->hid_parser->ReportDesc, hidif->hid_parser->ReportDescSize,
      USB_TIMEOUT);
 
報告描述符中得到ReportSize
 
1.5. 設置/獲取HID Report
//get_input_report
len = usb_control_msg(dev_handle,
      USB_ENDPOINT_IN + USB_TYPE_CLASS + USB_RECIP_INTERFACE,
      HID_REPORT_GET,
      hidif->hid_data->ReportID + (HID_RT_INPUT << 8),
      hidif->interface,
      buffer, REPROTSIZE, USB_TIMEOUT);
//set output report
 int len = usb_control_msg(hidif->dev_handle,
      USB_ENDPOINT_OUT + USB_TYPE_CLASS + USB_RECIP_INTERFACE,
      HID_REPORT_SET,
      hidif->hid_data->ReportID + (HID_RT_OUTPUT << 8),
      hidif->interface,
      (char*)buffer, REPROTSIZE, USB_TIMEOUT);
 
1.6.關閉設備
usb_release_interfaces
usb_close
 
1.7. debug
lib_usb_setdebug
usb_strerror
 
2.libhid接口使用說明
2.1初始化
hid_init ()//同1.1
hid_new_HIDInterface,准備結構體memory
2.2 查找設備,並打開設備,注冊通信接口
hid_force_open();//同1.2,1.3,1.4
2.3 報告操作
2.4 debug
hid_set_debug(HID_DEBUG_ALL);
hid_set_usb_debug(0);


免責聲明!

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



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