天天看點

libusb系列-005-部分API簡介

libusb系列-005-部分API簡介

文章目錄

  • ​​libusb系列-005-部分API簡介​​
  • ​​摘要​​
  • ​​libusb_init​​
  • ​​libusb_open_device_with_vid_pid​​
  • ​​libusb_kernel_driver_active​​
  • ​​libusb_detach_kernel_driver​​
  • ​​libusb_claim_interface​​
  • ​​libusb_release_interface​​
  • ​​libusb_attach_kernel_driver​​
  • ​​libusb_close​​
  • ​​libusb_exit​​
  • ​​libusb_interrupt_transfer​​
  • ​​libusb_bulk_transfer​​

關鍵字:

​Debian​

​、

​Linux​

​、

​Qt​

​、

​libusb​

​、

​API​

内容背景:

最近項目終于切到Linux下開發了,是以最近的記錄都是發生在​

​Debian 10​

​​ 以及​

​Arm Debain 10​

​​ 下,​

​Qt​

​​版本​

​5.12.3​

​。這幾天真是問題多多,收獲滿滿,不過目前階段僅僅停留在解決問題,至于原理性的東西,還得慢慢消化。最近好多問題都是直接群裡問大神,感謝各位大神助我成長。

開始本來USB傳世使用的是HIDUSB,後面計劃開發一個專用的驅動,到最後,因為最終系統一直定不下來,最終成了使用libusb了。大部分人都是直接使用libusb 的庫的,把源碼直接放在項目中參與編譯的應該很好,哎,我就是那個大冤種,那麼請跟随我一起看我如何給自己完坑踩坑吧。

摘要

本着現用現學,現學現賣的原則,這篇就簡單介紹一下我在項目中實際使用的幾個接口,其他接口等用到再說,或者後期有精力且閑的蛋疼了再研究(就是沒有了)。

libusb系列-005-部分API簡介

libusb_init

名字就說明了一切了,就是libusb庫的初始化函數,也可以了解為libusb 的入口函數吧,最先調用

int libusb_init(libusb_context **ctx);      

✍參數:

ctx 通常設定為NULL。

☄傳回值:

​ 傳回0表示成功,非零表示失敗 ,可以通過​

​libusb_error_name​

​列印錯誤資訊。

這裡放下我在代碼中的使用

if((libusb_init(NULL) < 0))
    {
        qDebug() <<"failed to initialise libusb" << LOGINFOR;
        return false;
    }      

libusb_open_device_with_vid_pid

通過VID和PID打開一個USB 裝置,并傳回裝置句柄libusb_device_handle的指針

libusb_device_handle * LIBUSB_CALL libusb_open_device_with_vid_pid(libusb_context *ctx,
    uint16_t vendor_id,
    uint16_t product_id);      

✍參數:

ctx 通常為NULL

vendor_id 裝置的VID

product_id 裝置的PID

☄傳回值:

成功傳回libusb_device_handle的指針 ,失敗傳回NULL

我在項目中的使用

devhandle = libusb_open_device_with_vid_pid(NULL, USB_DEV_VID, USB_DEV_PID);      

libusb_kernel_driver_active

确定指定接口的核心驅動程式是否已經激活。如果一個核心驅動程式是激活的,libusb_claim_interface調用的會失敗

int LIBUSB_CALL libusb_kernel_driver_active(libusb_device_handle *dev,
    int interface_number);      

✍參數:

dev 調用 libusb_open或者libusb_open_device_with_vid_pid傳回的libusb_device_handle的句柄

interface_number 接口号,這個對應接口描述符的 bInterfaceNumber

☄傳回值:

1 已經激活,非1 沒有激活

libusb_detach_kernel_driver

解除安裝指定接口的核心驅動程式。如果一個核心驅動程式是激活的,必須先調用這個函數,再調用libusb_claim_interface

int LIBUSB_CALL libusb_detach_kernel_driver(libusb_device_handle *dev,
    int interface_number);      

✍參數:

dev 調用 libusb_open或者libusb_open_device_with_vid_pid傳回的libusb_device_handle的句柄

interface_number 接口号,這個對應接口描述符的 bInterfaceNumber

☄傳回值:

0 成功,非0失敗

libusb_claim_interface

為指定的裝置申請接口

int LIBUSB_CALL libusb_claim_interface(libusb_device_handle *dev,
    int interface_number);      

✍參數:

dev 調用 libusb_open或者libusb_open_device_with_vid_pid傳回的libusb_device_handle的句柄

interface_number 接口号,這個對應接口描述符的 bInterfaceNumber

☄傳回值:

0 成功,非0失敗

libusb_release_interface

釋放之前為指定的裝置申請接口,注意這個函數隻是釋放接口,不會重新加載核心驅動

int LIBUSB_CALL libusb_release_interface(libusb_device_handle *dev,
    int interface_number);      

✍參數:

dev 調用 libusb_open或者libusb_open_device_with_vid_pid傳回的libusb_device_handle的句柄

interface_number 接口号,這個對應接口描述符的 bInterfaceNumber

☄傳回值:

0 成功,非0失敗

libusb_attach_kernel_driver

加載指定接口的核心驅動

int LIBUSB_CALL libusb_attach_kernel_driver(libusb_device_handle *dev,
    int interface_number);      

✍參數:

dev 調用 libusb_open或者libusb_open_device_with_vid_pid傳回的libusb_device_handle的句柄

interface_number 接口号,這個對應接口描述符的 bInterfaceNumber

☄傳回值:

0 成功,非0失敗

libusb_close

關閉 libusb_open或者libusb_open_device_with_vid_pid打開的裝置

void LIBUSB_CALL libusb_close(libusb_device_handle *dev_handle);      

✍參數:

dev_handle 調用libusb_open或者libusb_open_device_with_vid_pid傳回的裝置句柄libusb_device_handle的指針

libusb_exit

和libusb_init成對使用,釋放相應的資源。

void  libusb_exit(libusb_context *ctx);      

✍參數:

ctx通常設定NULL

libusb_interrupt_transfer

執行USB中斷傳輸。該函數可以處理輸入和輸出,根據端點位址的方向位推斷傳輸方向,該函數采用同步模式,資料傳輸完畢才傳回

int LIBUSB_CALL libusb_interrupt_transfer(
    libusb_device_handle *dev_handle,
    unsigned char endpoint, 
    unsigned char *data, 
    int length,
    int *actual_length, 
    unsigned int timeout);      

✍參數:

dev_handle 調用 libusb_open或者libusb_open_device_with_vid_pid傳回的libusb_device_handle的句柄

endpoint 端點位址 最高位為1表示輸入

data 發送或者接收緩沖區指針

length 緩沖區長度

actual_length 帶回實際傳輸長度

timeout 逾時的毫秒數,0 永不逾時

☄傳回值:

0 成功,非0失敗

libusb_bulk_transfer

執行USB批量傳輸。該函數可以處理輸入和輸出,根據端點位址的方向位推斷傳輸方向,該函數采用同步模式,資料傳輸完畢才傳回

int LIBUSB_CALL libusb_bulk_transfer(
    libusb_device_handle *dev_handle,
    unsigned char endpoint,
    unsigned char *data,
    int length,
    int *actual_length,
    unsigned int timeout);      

✍參數:

dev_handle 調用 libusb_open或者libusb_open_device_with_vid_pid傳回的libusb_device_handle的句柄

endpoint 端點位址 最高位為1表示輸入

data 發送或者接收緩沖區指針

length 緩沖區長度

actual_length 帶回實際傳輸長度

timeout 逾時的毫秒數,0 永不逾時

☄傳回值:

0 成功,非0失敗

繼續閱讀