基于libUSB的USB设备固件更新程序(下载数据)(转)
源:基于libUSB的USB設備固件更新程序(下載數據)
本文緊接上一篇日志:基于libUSB-Win32的USB設備固件更新程序(前言),相關背景以及起因等,此處不再贅述,如感興趣請移步。
libUSB-Win32給出的example里面,有一個bulk.c文件,分析其關鍵代碼,結合libusb官方文檔,摘出其關鍵代碼如下:
int main(void) {usb_dev_handle *dev = NULL; /* the device handle */usb_init(); /* initialize the library */usb_find_busses(); /* find all busses */usb_find_devices(); /* find all connected devices */
分析其工作流程:
首先,調用usb_init();初始化libUSB程序庫;
然后,使用usb_find_busses();掃描機器上所有總線信息,為下一步操作提供基礎信息;
接著,調用usb_find_devices();掃描所有連接的USB設備。
以上步驟是libUSB進行操作之前所必須的步驟(根據官方文檔)。
接下來,輪詢總線數據,查找指定VID&PID的設備:
//此處VID、PID為測試用,工業生產請勿使用,如有冒犯貴公司,請及時指出以便我們修改 #define MY_VID 0x0666 #define MY_PID 0x0001 //…… …… usb_dev_handle *open_dev(void) {struct usb_bus *bus;struct usb_device *dev;for (bus = usb_get_busses(); bus; bus = bus->next){for (dev = bus->devices; dev; dev = dev->next){if (dev->descriptor.idVendor == MY_VID&& dev->descriptor.idProduct == MY_PID){return usb_open(dev);}}}return NULL; } //…… ……if (!(dev = open_dev())){printf("error opening device: \n%s\n", usb_strerror());return 0;}else{printf("success: device %04X:%04X opened\n", MY_VID, MY_PID);}
此操作結束后,就是按照USB協議規范,按部就班的和USB Device,完成枚舉的過程,以建立符合USB協議的通信:
需要注意的是,以上函數的返回值為int型,如果該返回值>0,表示一切正常完成;該返回值<0,則表示操作失敗,此時,可以調用usb_strerror();獲得詳細的錯誤信息(注:usb_strerror();的原型為char *usb_strerror(void);)。
至此,與USB設備的最基本的通信(符合最基本的USB標準設備通信)已經建立。
接下來就是配合下位機發送或者接受命令和數據了:
例如:
//發送下載控制命令 // ret = usb_bulk_write(dev, EP_OUT, dl, sizeof(dlcmd), 5000);ret = usb_interrupt_write(dev, EP_OUT, dlcmd, sizeof(dlcmd), 5000);printf("Waiting for device ready...... \n");//等待接收下位機反饋 // ret = usb_bulk_read(dev, EP_IN, get, sizeof(get), 5000);ret = usb_interrupt_read(dev, EP_IN, get, sizeof(get), 5000);//開始發送數據,循環發送總共16KB,將整個24c128填充滿 // ret = usb_bulk_write(dev, EP_IN, dldata, sizeof(dldata), 5000);ret = usb_interrupt_write(dev, EP_IN, dldata, sizeof(dldata), 5000);
兩次發送下載數據之間,還是需要一點點延時等待的,因為8bit的MCU處理速度肯定比不上上位機。
下載完數據之后,不要忘記關閉USB設備。
if(dev)usb_close(dev);
至此,USB下載的過程已經全部完畢。由于本人編寫的代碼中包含有公司的PID、VID等識別信息,所以就不便放出來當測試代碼了,有需要的童鞋,請自行參照libusb-Win32里面的示例代碼,修改、研究、學習。
版權信息:根據libUSB的GNU/LGPL(GNU Lesser General Public License)協議許可,可以自由使用其開發私有軟件。
本文鏈接:https://blog.gamepader.com/archives/2012/09/libusb-based-usb-device-firmware-update-v2.html
?
轉載于:https://www.cnblogs.com/LittleTiger/p/4572158.html
總結
以上是生活随笔為你收集整理的基于libUSB的USB设备固件更新程序(下载数据)(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (笔试题)最大覆盖点
- 下一篇: Could not parse conf