基于libUSB的USB设备固件更新程序(数据传输部分)

转载 2013年12月04日 00:03:01

文紧接上一篇日志:基于libUSB-Win32的USB设备固件更新程序(前言),相关背景以及起因等,此处不再赘述,如感兴趣请移步

libUSB-Win32给出的example里面,有一个bulk.c文件,分析其关键代码,结合libusb官方文档,摘出其关键代码如下:

1
2
3
4
5
6
7
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_busses();扫描所有连接的USB设备。
以上步骤是libUSB进行操作之前所必须的步骤(根据官方文档)。
接下来,轮询总线数据,查找指定VID&PID的设备:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//此处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协议的通信:

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

需要注意的是,以上函数的返回值为int型,如果该返回值>0,表示一切正常完成;该返回值<0,则表示操作失败,此时,可以调用usb_strerror()获得详细的错误信息(注:usb_strerror()的原型为char *usb_strerror(void);)。
至此,与USB设备的最基本的通信(符合最基本的USB标准设备通信)已经建立。
接下来就是配合下位机发送或者接受命令和数据了:
例如:

1
2
3
4
5
6
7
8
9
10
11
12
//发送下载控制命令
//  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)协议许可,可以自由使用其开发私有软件。

转载自我的博客,原文链接:http://blog.gamepader.com/archives/2012/09/libusb-based-usb-device-firmware-update-v2.html,略有修改,转载请注明出处

libusb数据结构说明

libusb 数据结构说明
  • wince_lover
  • wince_lover
  • 2017年04月15日 19:39
  • 894

为你的设备实现远程固件更新

很多时候, 我们很难将设备取下来并对其进行更新 : 气象站,交通控制系统,CATV光纤收/发器。再或我们一些Arduino爱好者, 做的一些远程监控家中空气湿度、温度的小应用等等太多的设备,那么如能都...
  • WIZnet2012
  • WIZnet2012
  • 2013年11月27日 15:17
  • 7135

STM32的BootLoader 从SD卡更新固件

预备知识 我们这里是为ARM的Cortex-M3单片机写的BootLoader,需要了解一下M3内核的架构,并且要了解M3单片机是怎么启动的等等。这个方面的知识,可以参考《Cortex-M3权威指南》...
  • gengyiping18
  • gengyiping18
  • 2015年08月05日 17:47
  • 1631

教Kindle新手 手动升级Kindle固件至5.8.5.0.1 全过程

亚马逊中国于2016年10月19日发布Kindle固件5.8.5版本,仅过去9天,亚马逊中国于10月28日再次升级Kindle固件至5.8.5.0.1。升级如此频繁,想必Kindle固件5.8.5.0...
  • oDreach
  • oDreach
  • 2016年11月05日 15:21
  • 2525

Jlink V8 提示更新固件,不能下载程序

最近要做uwb开发,重新使用Jlink V8,开发环境IAR7.10,一直提示固件升级。 原来由于升级搞坏过几个Jlink,一直不敢轻易升级。 然后开始重装驱动,问题一直没有解决。...
  • Angelo99
  • Angelo99
  • 2015年10月20日 11:22
  • 1079

win7系统JLink v8固件升级总结

声明:这是一篇转载文章,文章内容对我有所帮助,经过阅读该文章解决了win7系统JLink v8固件升级问题。 文章内容如下: -----------------------------------...
  • icekoor
  • icekoor
  • 2016年03月19日 18:46
  • 5961

stm32 IPA(在线程序更新方式)

实现IAP技术的核心是一段预先烧写在单片机内部的IAP程序。这段程序主要负责与外部的上位机软件进行握手同步,然后将通过外设通信接口将来自于上位机软件的程序数据接收后写入单片机内部指定的闪存区域,然后再...
  • sily521
  • sily521
  • 2017年02月09日 14:19
  • 530

部分内容7---升级固件

1、在system.lua中找到: entry({"admin", "system", "flashops"}, call("action_flashops"), _("Backup / Flash...
  • jin615567975
  • jin615567975
  • 2014年03月27日 11:12
  • 842

基于 HTTP的远程配置和固件更新

我们来探究一下这个应用的原理,在单片机里实现一个HTTP服务器,通过这个HTTP服务器来配置设备信息,并实现设备固件更新。基于Cortex-M3的W5200评估板(STM32F108C8 + W520...
  • WIZnet2012
  • WIZnet2012
  • 2013年11月28日 14:22
  • 4466

史上最优惠的OPenMV模块-OPENMV更新固件

史上最优惠的OPenMV模块: https://item.taobao.com/item.htm?id=548241215419 更新固件 OpenMV项目是一直更新的,用户可以升级固件来保持更新。...
  • wwqingshanke
  • wwqingshanke
  • 2017年04月08日 13:53
  • 3084
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于libUSB的USB设备固件更新程序(数据传输部分)
举报原因:
原因补充:

(最多只允许输入30个字)