基于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协议的通信:

    usb_set_configuration(dev, MY_CONFIG);
    usb_claim_interface(dev, 0);

需要注意的是,以上函数的返回值为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

时间: 2024-12-14 11:57:35

基于libUSB的USB设备固件更新程序(下载数据)(转)的相关文章

Azure IOT 设备固件更新技巧,看这一篇就够了

嫌长不看版 今天为大家准备的硬菜是:在 Azure IoT 中心创建 Node.js 控制台应用,进行端到端模拟固件更新,为基于 Intel Edison 的设备安装新版固件的流程.通过创建模拟设备应用,可实现 firmwareUpdate 直接方法,启动等待下载固件映像.下载固件映像,最终应用新版固件映像,并在每个阶段显示操作进度. 操作细节版 在进行物联网开发的过程中,很多用户会遇到这样的问题:物联网中的某些边缘设备上运行的固件存在问题需要修复,准备好新版固件后,如何集中批量部署给所有适合的

C#:基于WMI查询USB设备

来源:http://blog.csdn.net/jhqin/article/details/6734673 /* ---------------------------------------------------------- 文件名称:WMIUsbQuery.cs 作者:秦建辉 MSN:[email protected] QQ:36748897 博客:http://blog.csdn.net/jhqin 开发环境: Visual Studio V2010 .NET Framework 4

【基于STM32F407IGT6】STemWin5.20d + uCOS-III + FatFS程序下载

[基于STM32F407IGT6]STemWin5.20d + uCOS-III + FatFS程序下载

C#:USB设备枚举 --转自CSDN作者:Splash

(一)DeviceIoControl的PInvoke /* ---------------------------------------------------------- 文件名称:DeviceIoControl.cs 作者:秦建辉 MSN:[email protected] QQ:36748897 博客:http://blog.csdn.net/jhqin 开发环境: Visual Studio V2010 .NET Framework 4 Client Profile 版本历史: V1

C# 获取USB设备信息

WMI方式 using System; using System.Management; using System.Text.RegularExpressions; using System.Collections.Generic; namespace Splash.IO.PORTS { /// <summary> /// 即插即用设备信息结构 /// </summary> public struct PnPEntityInfo { public String PNPDeviceI

linux下虚拟机virtualbox USB设备设置

1.装好virtualbox以及扩展包后,系统将自动生成vboxusers的用户组,将自己的用户名添加到bvoxusers组,否则无法使用vbox. sudo usermod -G vboxusers your_user_name 2.使用USB设备: 在Virtualbox虚拟机配置面板中打开USB设备选项,分别勾选上“启动USB控制器”“启用usb2.0控制器”选项. 1.最简单的办法如下:$ sudo gedit /etc/fstab在末尾加上# the USB group# 对所有用户开

Linux下的硬件驱动——USB设备(转载)

usb_bulk_msg函数 当对usb设备进行一次读或者写时,usb_bulk_msg 函数是非常有用的; 然而, 当你需要连续地对设备进行读/写时,建议你建立一个自己的urbs,同时将urbs 提交给usb子系统. 转载于此http://os.chinaunix.net/a2003/0630/1056/000001056933.shtml Linux下的硬件驱动——USB设备(上)(驱动配置部分) USB设备越来越多,而Linux在硬件配置上仍然没有做到完全即插即用,对于Linux怎样配置和

利用WSUS部署更新程序

WSUS概述 为了让用户的windows系统与其他microsoft产品能够更安全,更稳定,因此microsoft会不定期在网站上推出最新的更新程序供用户下载与安装,而用户可以通过以下方式来取得这些程序: 手动连接microsoft update网站 通过windows系统的自动更新功能 然而以上两种方式对企业内部来说,都可能会有以下缺点. 影响网络效率:如果企业内部每台计算机都自行上网更新,将会增加对外网络的负担. 与现有软件相互干扰:如果企业内部使用的软件与更新程序发生冲突,则用户自行下载与

在 QT 中使用 libusb 检测 MAC 上的 USB 设备

最近在用 QT 做一个 MAC 上的 Kindle 批注管理软件,遇到的第一个问题就是检测 MAC 上连接的 USB 设备的状态.如果是在 Cocoa 进行开发,会有对应的系统 API 可供使用,但是由于我是在 QT 平台进行的开发,所以无形中加大了一点难度.就在这时,我发现了一个库:libusb libusb 介绍 libusb 设计了一系列的外部API 为应用程序所调用,通过这些API应用程序可以操作硬件,从libusb的源代码可以看出,这些API 调用了内核的底层接口,和kernel dr