1、winUSB功能介紹
winUSB設(shè)備在win10系統(tǒng)下自帶驅(qū)動程序的,winUSB設(shè)備連接到USB后,可以直接被系統(tǒng)識別,無需安裝驅(qū)動,實現(xiàn)了免驅(qū)的功能。就像鍵盤、鼠標(biāo)插入到電腦上直接使用一下。
winUSB設(shè)備使用BULK傳輸,具有傳輸數(shù)據(jù)量的優(yōu)點,設(shè)備使用BULK IN, BULK OUT,CONTROL3個端點來進(jìn)行通信。因此winUSB設(shè)備在開發(fā)USB產(chǎn)品時是一個很好的選擇。
2、winUSB軟件選型
winUSB軟件采用RT thread操作系統(tǒng)自帶的USB device協(xié)議中 Winusb類驅(qū)動,此協(xié)議棧已經(jīng)實現(xiàn)了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電腦后是可以直接枚舉到的,但是具體進(jìn)行數(shù)據(jù)通信時要做軟件上的修改。
2其中對于winUSB部分代碼做了改進(jìn):
對于winUSB的read部分函數(shù):修改成讀取剩余部分的數(shù)據(jù),這樣在USB主機(jī)發(fā)送一包數(shù)據(jù)后就會立即觸發(fā)接收回調(diào)函數(shù)來處理數(shù)據(jù),原來的寫法是接收到輸入緩沖區(qū)長度的數(shù)據(jù)后才什么觸發(fā)接收回調(diào)函數(shù)。
對winusb設(shè)備端點IN處理流程中增加對發(fā)送整最大包數(shù)長度數(shù)據(jù)的處理,即這種情況下發(fā)送一個ZLP,0長度包,讓主機(jī)知道這次傳輸完成。
到這里,winUSB的驅(qū)動部分已經(jīng)改好了。但是要做USB進(jìn)行通信還有很多代碼要寫。
3、winUSB應(yīng)用程序的編寫
winUSB設(shè)備在RT THREAD操作系統(tǒng)中注冊成winUSB設(shè)備,所以對winUSB的讀寫要使用設(shè)備操作的幾個函數(shù)rt_device_find, rt_device_open, rt_device_read, rt_device_write。感覺跟其他設(shè)備一樣,但是在實際調(diào)試過程中由于底層是USB設(shè)備,用法還是有不少區(qū)別的,應(yīng)用時要做很多特殊的處理。
3.1 winUSB設(shè)備的初始化
1初始化時跟基他設(shè)備類型,find,open,注意除了注冊接收回調(diào)函數(shù)外還要注冊發(fā)送回調(diào)函數(shù)。最后必須先調(diào)用一下rt_device_read()給winUSB設(shè)備接收數(shù)據(jù)時傳入接收數(shù)據(jù)使用的緩沖區(qū),同時啟動USB設(shè)備接收。
1/*findandopencommanddevice*/
2dev_name=“winUSB”
3client->device=rt_device_find(dev_name);
4if(client->device)
5{
6/*usingthetxinterruptwhenuartisRS485*/
7open_result=rt_device_open(client->device,RT_DEVICE_OFLAG_RDWR);
8RT_ASSERT(open_result==RT_EOK);
9rt_device_set_tx_complete(client->device,utc_d_tx_ind);
10rt_device_set_rx_indicate(client->device,utc_d_rx_ind);
11client->putc_package=client->utcA_package;
12/*waitreadthewinusbdevicesuccess*/
13while(rt_device_read(client->device,0,client->putc_package,sizeof(client->utcA_package))==0)
14{
15rt_thread_mdelay(10);
16}
17}
18else
19{
20LOG_E("Notfindthedevice(%s).",dev_name);
21result=-RT_ERROR;
22}
1接收回調(diào)函數(shù),USB設(shè)備接收到數(shù)據(jù)后,發(fā)送一個信號量給接收數(shù)據(jù)的線程通知數(shù)據(jù)處理。這個接收回調(diào)函數(shù)中使用雙緩沖區(qū),讓接收數(shù)據(jù)與處理數(shù)據(jù)互不干擾。
1staticrt_err_tutc_d_rx_ind(rt_device_tdev,rt_size_tsize)
2{
3utc_d_client_tclient=&utc_d_client;
4if(client->package_len)
5{
6LOG_W("utcpackageoverwrite!");
7}
8client->package_len=size;
9if(client->putc_package==client->utcA_package)
10{
11client->putc_package=client->utcB_package;
12}
13else
14{
15client->putc_package=client->utcA_package;
16}
17/*readtheusbdatanext*/
18rt_device_read(dev,0,client->putc_package,sizeof(client->utcA_package));
19if(size)
20{
21/*releasethesem*/
22rt_sem_release(client->rx_notice);
23}
24returnRT_EOK;
25}
1發(fā)送回調(diào)函數(shù),usb設(shè)備發(fā)送成功后會調(diào)用發(fā)送回調(diào)函數(shù),發(fā)送一個信號量,通知發(fā)送函數(shù)已經(jīng)成功完成發(fā)送,這個功能非常重要,否則,USB設(shè)備無法正常工作。
1staticrt_err_tutc_d_tx_ind(rt_device_tdev,void*buffer)
2{
3utc_d_client_tclient=&utc_d_client;
4rt_sem_release(client->tx_notice);
5returnRT_EOK;
6}
1usb設(shè)備發(fā)送函數(shù)通過rt_device_write函數(shù)把數(shù)據(jù)發(fā)送給usb設(shè)備驅(qū)動后,一定要等待發(fā)送完成才行。
1staticintutc_d_send(utc_d_client_tclient,rt_uint8_t*send_data,rt_uint32_tsend_len)
2{
3/*sendthepacketcounter*/
4client->send_packet_counter++;
5if(rt_device_write(client->device,0,send_data,send_len)==send_len)
6{
7/*Mustwaittheusbsenddatafinish*/
8returnrt_sem_take(client->tx_notice,RT_WAITING_FOREVER);
9}
10else
11{
12return-RT_ERROR;
13}
14}
1至此,winUSB設(shè)備的應(yīng)用程序基本功能就全部實現(xiàn),你可以基于此來進(jìn)行與上位機(jī)的數(shù)據(jù)通信了。
2下期預(yù)告,winUSB的調(diào)試環(huán)境搭建與調(diào)試方法。
winUSB設(shè)備上位機(jī)驅(qū)動開發(fā)環(huán)境的搭建:
https://club.rt-thread.org/ask/article/691e79f4e05eb0fc.html(請復(fù)制至外部瀏覽器打開)
版權(quán)聲明:本文為RT-Thread論壇用戶「fhqmcu」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:
https://club.rt-thread.org/ask/article/691e79f4e05eb0fc.html
RT-Thread開發(fā)者大會
我們將聯(lián)合重量級合作伙伴,圍繞AIoT的發(fā)展、產(chǎn)業(yè)技術(shù)趨勢,聚焦控制、連接、行業(yè)應(yīng)用開發(fā),通過主題演講、技術(shù)分享、應(yīng)用演示等環(huán)節(jié),助力開發(fā)者探索萬物智能的世界,期待與大家一起相聚線上直播間!
現(xiàn)在掃碼報名 我們將在報名者中抽取“幸運參會者100名” 贈送RT-Thread新款開發(fā)板(即將揭秘)
本次將在大會當(dāng)天在直播間宣布中獎名單
更多獎品即將來襲...
原文標(biāo)題:winUSB設(shè)備的開發(fā)方法
文章出處:【微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
RT-Thread
+關(guān)注
關(guān)注
32文章
1412瀏覽量
41999
原文標(biāo)題:winUSB設(shè)備的開發(fā)方法
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
知識分享 | 敏捷方法在基于模型的軟件開發(fā)項目中的應(yīng)用

Linux系統(tǒng)查看及修改設(shè)備型號信息,觸覺智能RK3562開發(fā)板演示

波峰焊設(shè)備的維護(hù)和保養(yǎng)方法
如何將EZ CX3 MIPI庫從Linux移植到Windows?
使用CYUSB3014進(jìn)行編程,使用USB 3.0超高速會有什么影響嗎?
HPM6E80 cherryusb_winusb10例程速度測試
瑞芯微開發(fā)板/主板Android調(diào)試串口配置為普通串口方法

評論