Libusb開發教程 API介紹與使用
背景介紹
上一篇博文主要介紹了 Libusb 在 Linux 系統下的詳細安裝過程,除了 libusb-1.0.9.tar.bz2 離線包之外,還安裝了 libusb-compat-0.1.4.tar.bz2。顧名思義,第二個是先前版本的相容包,因此在使用過程中,開發者就需要區分引用不同的 lib 版本了。libusb 較大版本變動以 V1.0 為分界線,訪問官網:http://libusb.info 時也可以發現文件說明都以 V1.0 為主了。注意,libusb 已經從 libusb.org 切換到了 libusb.info。展示下最新網站首頁:
分類十分明確,開發者可以直接從網站下載文件,API使用說明,例程等內容。V1.0 相對於之前版本,提供了更豐富的功能和介面,然而大部分情形下舊版本庫提供的 API 函式功能已經可以滿足我們應用的需要了,並且官網的原始碼安裝包一直保持著對於老版本的相容。出於相容性以及大部分開發者使用習慣,本篇先基於老版本 Libusb 庫 API 進行說明與使用介紹。
Libusb API 函式與功能
瞭解包含的 API 函式以及結構體相關定義等很簡單,直接在安裝路徑下找到我們程式設計時需要引用的標頭檔案即可,這裡對應的標頭檔案是 usb.h。我們開啟 usb.h 可以看到,程式碼上部分為 usb 協議標準術語的巨集定義,中間為相關結構體定義,後半部為我們程式設計引用的 API 宣告,下面根據 API 功能和使用順序進行分類描述:
核心初始化函式
1. void usb_init(void);
函式功能:libusb 初始化,這一步必須首先執行。
2. int usb_find_busses(void);
函式功能:查詢系統上的 usb 匯流排,任何 usb 裝置依附於 usb 匯流排和主機通訊。成功返回 usb 匯流排數目,失敗返回負值。
3. int usb_find_devices(void);
函式功能:查詢匯流排上的 usb 裝置,這個函式必須在呼叫 usb_find_busses() 後使用。成功返回裝置數目,失敗返回負值。
4. struct usb_bus *usb_get_busses(void);
函式功能:返回全域性變數 usb_busses,用於遍歷匯流排連結串列,查詢匯流排 usb 裝置。失敗返回 NULL。這四步操作是任何程序必須首先執行的。
裝置操作介面
1. usb_dev_handle *usb_open(struct usb_device *dev);
函式功能:開啟 usb 裝置,引用的 usb_dev_handle 以及 usb_device 結構體是 libusb 最常見的,定義可以參見標頭檔案。函式返回 usb 裝置的操作控制程式碼,之後對該 usb 裝置的操作都通過該控制程式碼進行;
2. int usb_close(usb_dev_handle *dev);
函式功能:關閉 usb 裝置,在所有操作完成後或者程序退出前呼叫,傳入參數即上面提到的控制程式碼,成功返回0;
3. int usb_get_string(usb_dev_handle *dev, int index, int langid, char *buf, size_t buflen);
函式功能:獲取裝置的字串描述,通過 index 和 langid 進行索引。返回Unicode字串到buf中,成功返回實際寫入buf 的位元組數,失敗返回負值。
4. int usb_get_string_simple(usb_dev_handle *dev, int index, char *buf, size_t buflen);函式功能:包裝了 usb_get_string() 函式,返回第一種語言指定 index 索引的字串描述,並轉換到C風格的 ASCII。成功返回實際寫入buf 的位元組數,失敗返回負值。
5. int usb_get_descriptor_by_endpoint(usb_dev_handle *udev, int ep, unsigned char type, unsigned char index, void *buf, int size);
函式功能:從裝置獲取描述符,以 type 和 index 索引,以ep標誌的控制管道。成功返回實際寫入buf 的位元組數,失敗返回負值。
6. int usb_get_descriptor(usb_dev_handle *udev, unsigned char type, unsigned char index, void *buf, int size);
函式功能:獲取裝置預設控制管道的描述符,通過 type 和 index 索引。成功返回實際寫入buf 的位元組數,失敗返回負值。
7. int usb_set_configuration(usb_dev_handle *dev, int configuration);
函式功能:設定當前裝置使用的configuration,引數configuration 是裝置配置描述符中的 bConfigurationValue。成功返回0,失敗返回負值。
8. int usb_claim_interface(usb_dev_handle *dev, int interface);
函式功能: 註冊裝置與作業系統通訊的介面,interface 引數是介面描述符的 bInterfaceNumber 欄位。這個函式必須被呼叫,因為只有註冊介面,才能做相應的操作。必須在任何介面相關操作(如 usb_set_altinterface() 、 usb_bulk_write() 等)之前呼叫。成功返回0,失敗返回負值。
9. int usb_release_interface(usb_dev_handle *dev, int interface);
函式功能:登出在 usb_claim_interface 中註冊的通訊介面,釋放相關資源,與註冊函式成對使用。
10. int usb_set_altinterface(usb_dev_handle *dev, int alternate);
函式功能:設定當前介面中的活躍(起作用的)設定,alternate 為介面描述符中 bAlternateSetting 欄位。成功返回0,失敗返回負值。
11. int usb_resetep(usb_dev_handle *dev, unsigned int ep);
函式功能:復位指定的端點,引數 ep 為端點描述符中的 bEndpointAddress,此函式已被函式 usb_clear_halt 替代。成功返回0,失敗返回負值。
12. int usb_clear_halt(usb_dev_handle *dev, unsigned int ep);
函式功能:復位指定的端點,引數 ep 為端點描述符中的 bEndpointAddress。成功返回0,失敗返回負值。
13. int usb_reset(usb_dev_handle *dev);
函式功能:重置指定裝置,通過傳送 RESET 指令過去。返回0成功,負數失敗。在執行該函式之後,需要重新列舉裝置,且之前的控制程式碼無法再工作。因此現在使用 usb_close 函式來替代。
14. int usb_get_driver_np(usb_dev_handle *dev, int interface, char *name, unsigned int namelen);
函式功能:獲取裝置介面對應的驅動程式名稱,也即遍歷 sysfs 系統中驅動與裝置的對應關係,查詢當前系統中有無該介面驅動,成功驅動名寫入到 name 中且函式返回0,失敗返回負值。
15. int usb_detach_kernel_driver_np(usb_dev_handle *dev, int interface);
函式功能:從核心中分離該介面驅動程式,也即禁止該驅動對裝置起作用。這個步驟不可省略,不然會發現驅動和使用 Libusb 編寫的應用程式同時對裝置起作用,引起錯誤。使用時可以先通過 usb_get_driver_np 進行判斷,如果有繫結的驅動程式,那麼再呼叫此函式進行分離。成功返回0,失敗返回負值。
資料通訊介面
1. int usb_bulk_write(usb_dev_handle *dev, int ep, const char *bytes, int size, int timeout);
函式功能:批量端點寫函式,傳入指定的端點號,timeout 為超時時間,以 ms 為單位。成功返回實際寫入裝置的位元組數,失敗返回負值。
2. int usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);函式功能:批量端點讀函式,傳入指定的端點號,timeout 為超時時間,以 ms 為單位。成功返回實際寫入 buf 的位元組數,失敗返回負值。
3. int usb_interrupt_write(usb_dev_handle *dev, int ep, const char *bytes, int size, int timeout);
函式功能:中斷端點寫函式,傳入指定的端點號,timeout 為超時時間,以 ms 為單位。成功返回實際寫入裝置的位元組數,失敗返回負值。
4. int usb_interrupt_read(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);
函式功能:中斷端點讀函式,傳入指定的端點號,timeout 為超時時間,以 ms 為單位。成功返回實際寫入 buf 的位元組數,失敗返回負值。
5. int usb_control_msg(usb_dev_handle *dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout);
函式功能:控制請求讀寫函式,傳入引數與 usb 協議保持一致,timeout 為超時時間,以 ms 為單位。成功返回實際讀寫的位元組數,失敗返回負值。
輔助函式介面
1. char *usb_strerror(void);
函式功能:根據錯誤返回值 errno,返回錯誤碼碼對應的字串。
2. void usb_set_debug(int level);
函式功能:設定 libusb 的除錯級別,libusb 支援列印除錯資訊,level 值為指定的除錯級別。
3. struct usb_device *usb_device(usb_dev_handle *dev);
函式功能:根據控制程式碼返回對應的 usb_device。
有想法或者疑問可以給我郵件或者評論,覺得有用就點贊吧~:-D
相關文章
- HarmonyOS方舟開發框架容器類API的介紹與使用框架API
- iOS開發-UITabbarController的介紹與使用iOSUItabBarController
- ChatGPT API使用介紹ChatGPTAPI
- iOS開發-WKWebView的介紹與基本使用iOSWebView
- iOS開發- UILabel的基本介紹與使用iOSUI
- libusb開發者指南
- iOS開發-列表檢視的基本介紹與使用iOS
- java .stream(). 使用介紹 Streams APIJavaAPI
- Tomcat 介紹及使用教程Tomcat
- Web Storage API的介紹和使用WebAPI
- GoogleTagManager 介紹與使用Go
- Influxdb 介紹與使用UX
- 深度學習系列教程(六)tf.data API 使用方法介紹深度學習API
- 元宇宙鏈遊開發與介紹元宇宙
- Charles 功能介紹和使用教程
- 微信開發:小程式的客服介紹與功能使用
- Flutter混合開發二-FlutterBoost使用介紹Flutter
- Jenkins api 介紹JenkinsAPI
- QTreeView使用總結2,常用API介紹QTViewAPI
- java ShutdownHook介紹與使用JavaHook
- IIS Express介紹與使用Express
- JQuery的介紹與使用jQuery
- IOS 初級開發入門教程(一)介紹篇iOS
- iOS開發-檢視控制器UINavigationController的介紹與基本使用iOSUINavigationController
- Android入門教程 | AsyncTask 使用介紹Android
- .NET 8 Video教程介紹(開篇)IDE
- BookKeeper 介紹(3)--APIAPI
- Phabricator Conduit API介紹UIAPI
- Kubernetes Gateway API 介紹GatewayAPI
- 力軟快速開發框架建設與介紹框架
- 跨境物流APP開發價值與作用介紹APP
- [iOS] Socket & CocoaAsyncSocket介紹與使用iOS
- xtrabackup 2.4 的介紹與使用
- Shell指令碼介紹與使用指令碼
- item的介紹與使用-2.0
- Android 動畫 介紹與使用Android動畫
- FastAPI 的路由介紹與使用ASTAPI路由
- Redis - 介紹與使用場景Redis
- Jupyter Notebook介紹、安裝及使用教程