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_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失敗