基于libUSB的USB设备固件更新程序(下载数据)(转)
源:基于libUSB的USB設(shè)備固件更新程序(下載數(shù)據(jù))
本文緊接上一篇日志:基于libUSB-Win32的USB設(shè)備固件更新程序(前言),相關(guān)背景以及起因等,此處不再贅述,如感興趣請(qǐng)移步。
libUSB-Win32給出的example里面,有一個(gè)bulk.c文件,分析其關(guān)鍵代碼,結(jié)合libusb官方文檔,摘出其關(guān)鍵代碼如下:
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 */
分析其工作流程:
首先,調(diào)用usb_init();初始化libUSB程序庫(kù);
然后,使用usb_find_busses();掃描機(jī)器上所有總線信息,為下一步操作提供基礎(chǔ)信息;
接著,調(diào)用usb_find_devices();掃描所有連接的USB設(shè)備。
以上步驟是libUSB進(jìn)行操作之前所必須的步驟(根據(jù)官方文檔)。
接下來(lái),輪詢總線數(shù)據(jù),查找指定VID&PID的設(shè)備:
//此處VID、PID為測(cè)試用,工業(yè)生產(chǎn)請(qǐng)勿使用,如有冒犯貴公司,請(qǐng)及時(shí)指出以便我們修改 #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);}
此操作結(jié)束后,就是按照USB協(xié)議規(guī)范,按部就班的和USB Device,完成枚舉的過(guò)程,以建立符合USB協(xié)議的通信:
需要注意的是,以上函數(shù)的返回值為int型,如果該返回值>0,表示一切正常完成;該返回值<0,則表示操作失敗,此時(shí),可以調(diào)用usb_strerror();獲得詳細(xì)的錯(cuò)誤信息(注:usb_strerror();的原型為char *usb_strerror(void);)。
至此,與USB設(shè)備的最基本的通信(符合最基本的USB標(biāo)準(zhǔn)設(shè)備通信)已經(jīng)建立。
接下來(lái)就是配合下位機(jī)發(fā)送或者接受命令和數(shù)據(jù)了:
例如:
//發(fā)送下載控制命令 // 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");//等待接收下位機(jī)反饋 // ret = usb_bulk_read(dev, EP_IN, get, sizeof(get), 5000);ret = usb_interrupt_read(dev, EP_IN, get, sizeof(get), 5000);//開(kāi)始發(fā)送數(shù)據(jù),循環(huán)發(fā)送總共16KB,將整個(gè)24c128填充滿 // ret = usb_bulk_write(dev, EP_IN, dldata, sizeof(dldata), 5000);ret = usb_interrupt_write(dev, EP_IN, dldata, sizeof(dldata), 5000);
兩次發(fā)送下載數(shù)據(jù)之間,還是需要一點(diǎn)點(diǎn)延時(shí)等待的,因?yàn)?bit的MCU處理速度肯定比不上上位機(jī)。
下載完數(shù)據(jù)之后,不要忘記關(guān)閉USB設(shè)備。
if(dev)usb_close(dev);
至此,USB下載的過(guò)程已經(jīng)全部完畢。由于本人編寫(xiě)的代碼中包含有公司的PID、VID等識(shí)別信息,所以就不便放出來(lái)當(dāng)測(cè)試代碼了,有需要的童鞋,請(qǐng)自行參照l(shuí)ibusb-Win32里面的示例代碼,修改、研究、學(xué)習(xí)。
版權(quán)信息:根據(jù)libUSB的GNU/LGPL(GNU Lesser General Public License)協(xié)議許可,可以自由使用其開(kāi)發(fā)私有軟件。
本文鏈接:https://blog.gamepader.com/archives/2012/09/libusb-based-usb-device-firmware-update-v2.html
?
轉(zhuǎn)載于:https://www.cnblogs.com/LittleTiger/p/4572158.html
總結(jié)
以上是生活随笔為你收集整理的基于libUSB的USB设备固件更新程序(下载数据)(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: (笔试题)最大覆盖点
- 下一篇: Could not parse conf