1、winusb功能介绍
winusb设备在win10系统下自带驱动程序的,winusb设备连接到usb后,可以直接被系统识别,无需安装驱动,实现了免驱的功能。就像键盘、鼠标插入到电脑上直接使用一下。
winusb设备使用bulk传输,具有传输数据量的优点,设备使用bulk in, bulk out,control3个端点来进行通信。因此winusb设备在开发usb产品时是一个很好的选择。
2、winusb软件选型
winusb软件采用rt thread操作系统自带的usb device协议中 winusb类驱动,此协议栈已经实现了usb的基本功能,具体代码可以参考分享仓库地址:github - longtengmcu/usb-host-driver-4g-rndis-device: stm32f429 usb host driver 4g rndis device, realization of high speed ethernet data communication。
1程序在stm32中运行usb连接到win10电脑后是可以直接枚举到的,但是具体进行数据通信时要做软件上的修改。 2其中对于winusb部分代码做了改进: 对于winusb的read部分函数:修改成读取剩余部分的数据,这样在usb主机发送一包数据后就会立即触发接收回调函数来处理数据,原来的写法是接收到输入缓冲区长度的数据后才什么触发接收回调函数。
对winusb设备端点in处理流程中增加对发送整最大包数长度数据的处理,即这种情况下发送一个zlp,0长度包,让主机知道这次传输完成。
到这里,winusb的驱动部分已经改好了。但是要做usb进行通信还有很多代码要写。
3、winusb应用程序的编写
winusb设备在rt thread操作系统中注册成winusb设备,所以对winusb的读写要使用设备操作的几个函数rt_device_find, rt_device_open, rt_device_read, rt_device_write。感觉跟其他设备一样,但是在实际调试过程中由于底层是usb设备,用法还是有不少区别的,应用时要做很多特殊的处理。
3.1 winusb设备的初始化
1初始化时跟基他设备类型,find,open,注意除了注册接收回调函数外还要注册发送回调函数。最后必须先调用一下rt_device_read()给winusb设备接收数据时传入接收数据使用的缓冲区,同时启动usb设备接收。 1 /* find and open command device */ 2 dev_name = “winusb” 3 client->device = rt_device_find(dev_name); 4 if (client->device) 5 { 6 /* using the tx interrupt when uart is rs485 */ 7 open_result = rt_device_open(client->device, rt_device_oflag_rdwr); 8 rt_assert(open_result == rt_eok); 9 rt_device_set_tx_complete(client->device, utc_d_tx_ind);10 rt_device_set_rx_indicate(client->device, utc_d_rx_ind);11 client->putc_package = client->utca_package;12 /*wait read the winusb device success */13 while(rt_device_read(client->device, 0, client->putc_package, sizeof(client->utca_package)) == 0)14 {15 rt_thread_mdelay(10);16 }17 }18 else19 {20 log_e(not find the device(%s)., dev_name);21 result = -rt_error;22 } 1 接收回调函数,usb设备接收到数据后,发送一个信号量给接收数据的线程通知数据处理。这个接收回调函数中使用双缓冲区,让接收数据与处理数据互不干扰。 1static rt_err_t utc_d_rx_ind(rt_device_t dev, rt_size_t size) 2{ 3 utc_d_client_t client = &utc_d_client; 4 if(client->package_len) 5 { 6 log_w(utc package overwrite!); 7 } 8 client->package_len = size; 9 if(client->putc_package == client->utca_package)10 {11 client->putc_package = client->utcb_package;12 }13 else14 {15 client->putc_package = client->utca_package;16 }17 /*read the usb data next */18 rt_device_read(dev, 0, client->putc_package, sizeof(client->utca_package));19 if(size)20 {21 /*release the sem */22 rt_sem_release(client->rx_notice);23 }24 return rt_eok;25} 1发送回调函数,usb设备发送成功后会调用发送回调函数,发送一个信号量,通知发送函数已经成功完成发送,这个功能非常重要,否则,usb设备无法正常工作。 1static rt_err_t utc_d_tx_ind(rt_device_t dev, void *buffer)2{3 utc_d_client_t client = &utc_d_client;4 rt_sem_release(client->tx_notice);5 return rt_eok;6} 1usb设备发送函数通过rt_device_write函数把数据发送给usb设备驱动后,一定要等待发送完成才行。 1static int utc_d_send(utc_d_client_t client, rt_uint8_t *send_data, rt_uint32_t send_len) 2{ 3 /*send the packet counter */ 4 client->send_packet_counter++; 5 if(rt_device_write(client->device, 0, send_data, send_len) == send_len) 6 { 7 /*must wait the usb send data finish */ 8 return rt_sem_take(client->tx_notice, rt_waiting_forever); 9 } 10 else11 {12 return -rt_error;13 }14} 1至此,winusb设备的应用程序基本功能就全部实现,你可以基于此来进行与上位机的数据通信了。2 下期预告,winusb的调试环境搭建与调试方法。 winusb设备上位机驱动开发环境的搭建: https://club.rt-thread.org/ask/article/691e79f4e05eb0fc.html (请复制至外部浏览器打开)
版权声明:本文为rt-thread论坛用户「fhqmcu」的原创文章,遵循cc 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:
https://club.rt-thread.org/ask/article/691e79f4e05eb0fc.html
rt-thread开发者大会
我们将联合重量级合作伙伴,围绕aiot的发展、产业技术趋势,聚焦控制、连接、行业应用开发,通过主题演讲、技术分享、应用演示等环节,助力开发者探索万物智能的世界,期待与大家一起相聚线上直播间!
现在扫码报名 我们将在报名者中抽取 “幸运参会者100名” 赠送rt-thread新款开发板(即将揭秘)
本次将在大会当天在直播间宣布中奖名单
更多奖品即将来袭...
原文标题:winusb设备的开发方法
文章出处:【微信公众号:rtthread物联网操作系统】欢迎添加关注!文章转载请注明出处。
五分钟了解吉利混合动力驱动系统
可满足老人生命体征监测的养老院人员定位系统
基于模型的单目视觉定位的各种特征定位方法的研究现状
对芯片缺货涨价危机的一些个人观点和建议
“科技界春晚”要逃离帝都,99%工程师都震惊了!
winUSB设备的开发方法
我们能从Linux系统上学到什么?谈谈linux的四个维度
家用机器人市场前景广阔 家用机器人体系架构和零部件推荐
视觉AI微处理器Z/V系列的实施示例
NAND供大于求 价格将会进一步下降
消除 AC 驱动器的 8 个常见误区
小米6最新消息:小米6升级系统之后问题重重,充电温度高达45度,真的是为发烧而生?
3D打印生物传感器可用于监测身体健康状况
太阳能杀虫灯是什么,它的使用说明和效果分析
时间敏感网络产业链名录创建计划正式启动
一文解读毫米波雷达的发展现状及发展趋势
荣耀10青春版性能值得肯定的六大理由
Diodes incorporated宣布推出符合汽车规格的两款PNP晶体管
ARM9S3C2440处理器下通信控制接口设计方法
东海航空正式引进了一架注册号为B-1159的波音737-800型客机