源:基于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

转载于:https://www.cnblogs.com/LittleTiger/p/4572158.html

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

  1. 基于WMI获取USB设备信息(即获取插即用设备信息)System.Management.ManagementObjectSearcher--ManagementObjectCollection

    基于WMI获取USB设备信息(即获取插即用设备信息)System.Management.ManagementObjectSearcher--ManagementObjectCollection 获取P ...

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

    [基于STM32F407IGT6]STemWin5.20d + uCOS-III + FatFS程序下载 转载于:https://www.cnblogs.com/LittleTiger/p/49151 ...

  3. 使用libusb检测USB设备插拔状态

    libusb是一个提供USB设备访问的跨平台用户模式程序库.该项目最新网址:http://www.libusb.info, 支持主流的操作系统:Linux.Mac OS X. Windows.Open ...

  4. linux串口重定向到usb串口,基于Linux的USB设备重定向研究

    第27卷第4期2008年12月武 汉 工 业 学 院 学 报 Journal of W uhan Polytechnic University Vol 127No 14Dec 12008 收稿日期:2 ...

  5. 通过libusb操作usb设备扫描二维码

    libusb是开源的操作usb设备的类库,可以在Windows, linux, android使用. 以下代码是参照libusb官方网站提供的api文档和example开发的操作二维码扫描头设备的例子 ...

  6. linux 查看libusb版本,linux / libusb获取usb设备路径

    我使用libusb来枚举一些usb设备.现在我想获得"设备路径".我认为这不是usb device-path,因为我没有成功使用谷歌. 如果我用linux连接usb设备,我会在dm ...

  7. libusb获取usb设备的idVendor(vid),idProduct(pid),以及Serial Number

    发表于2015/6/23 21:55:11  4594人阅读 最近在做关于usb设备的项目,用到了libusb,发现关于这个的函数库的介绍,讲解很少,下面仅仅是简单展示一些基本的使用方法,以备后用. ...

  8. 嵌入式处理器中Bootloader程序是什么以及IAP设备固件更新原理

    Bootloader程序也是一个单片机程序,编译后也是一个hex文件,然后下载到内部flash的前面区域 1.选择启动处在内部flash后面区域1的app1还是区域2的app2,然后把cpu运行指针加 ...

  9. python读取usb数据显示_在python中从各种usb设备读取和存储各种数据

    您似乎认为该传感器通信协议的行尾字符是4个不同的字符:表示,在许多编程语言中,它只是用\r表示(尽管它看起来像2个字符,但它只表示一个字符).在 由于协议是结构化的,通过逐行读取传感器的数据,可以大大 ...

最新文章

  1. Redis 主库宕机如何快速恢复?面试必问!
  2. Ubuntu系统在VMware虚拟机中显示显示过小
  3. nginx bind() to 0.0.0.0:**** failed (13: Permission denied)
  4. Cache一致性与2种基本写策略(1)
  5. 【Python Flask】SQLAlchemy增删改查总结;不重复查询某一列
  6. MySql - GROUP BY 和 HAVING关键字
  7. 直播地址公布|第八届“数学、计算机与生命科学交叉研究” 青年学者论坛--特别云论坛...
  8. Html5——WebSocket
  9. 杰里之006-p2 的 Linein 录音使用方式【篇】
  10. 三.minio 的分布式部署、单节点多磁盘、多节点模式
  11. 码~ps基本概念知识
  12. 跑马灯实现的三种方式
  13. warring:integer conversion resulted in a change of sign
  14. EasyRecovery14个人版电脑数据恢复软件支持Win/Mac
  15. 直接建内网穿透服务器替换TeamViewer和向日葵可以实现远程操控
  16. ghost linux引导修复工具,GhostBSD 19.10 发布,UEFI多重引导的修复
  17. 基于Java毕业设计银创科技有限公司人事信息系统源码+系统+mysql+lw文档+部署软件
  18. Docker私服硬盘满问题
  19. 世界著名的膳食结构模式共有三种
  20. 压力开关常见故障原因及排除方法

热门文章

  1. 使用snmp4j实现Snmp功能(一)
  2. Ubuntu下用webstorm开发Nodejs(二)
  3. JZOJ 5627. 【NOI2018模拟4.3】paint
  4. 字符串拼接数字 java_使用JAVA代码实现字符串的简单拼接
  5. localdatetime转化为date_为啥你用@JsonFormat注解时,LocalDateTime会反序列化失败?
  6. A Tutorial on Clustering Algorithms-聚类小知识
  7. BZOJ-3531-旅行
  8. 2020-06-15 有理分式矩阵及其互质分解
  9. ASP.NET Core 2.2 基础知识(十四) WebAPI Action返回类型(未完待续)
  10. Python 基本数据类型 (一) - 整数