天天看點

基于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),

      (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 報告操作

hid_get_input_report //同1.5

hid_set_output_report//同1.5

2.4 debug

hid_set_debug(HID_DEBUG_ALL);

hid_set_usb_debug(0);

繼續閱讀