女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

USB DDK介紹與開(kāi)發(fā)指導(dǎo)

HarmonyOS開(kāi)發(fā)者 ? 來(lái)源:HarmonyOS開(kāi)發(fā)者 ? 作者:HarmonyOS開(kāi)發(fā)者 ? 2022-04-06 11:37 ? 次閱讀

HDF(Hardware Driver Foundation)驅(qū)動(dòng)框架是HarmonyOS硬件生態(tài)開(kāi)放的基礎(chǔ),為開(kāi)發(fā)者提供了驅(qū)動(dòng)加載、驅(qū)動(dòng)服務(wù)管理和驅(qū)動(dòng)消息機(jī)制等驅(qū)動(dòng)能力,讓開(kāi)發(fā)者能精準(zhǔn)且高效的開(kāi)發(fā)驅(qū)動(dòng)程序。本期,我們將為大家?guī)?lái)HDF驅(qū)動(dòng)框架中USB DDK的解析與指導(dǎo)。

一、USB DDK介紹

USB(Universal Serial Bus)通用串行總線(xiàn),用于規(guī)范電腦與外部設(shè)備的連接和通訊,包含了主機(jī)端(Host)和設(shè)備端(Device)。其中,主機(jī)端負(fù)責(zé)USB總線(xiàn)中的數(shù)據(jù)傳輸及端口管理,設(shè)備端則可以連接各種外設(shè),所以USB驅(qū)動(dòng)開(kāi)發(fā)又分為主機(jī)端驅(qū)動(dòng)開(kāi)發(fā)和設(shè)備端驅(qū)動(dòng)開(kāi)發(fā)。

由于基于內(nèi)核態(tài)開(kāi)發(fā)的USB驅(qū)動(dòng)功能擴(kuò)展性較差,目前開(kāi)發(fā)者通常選擇Libusb庫(kù)進(jìn)行USB驅(qū)動(dòng)開(kāi)發(fā)。該庫(kù)是一種跨平臺(tái)的用戶(hù)態(tài)開(kāi)源USB通信庫(kù),可以滿(mǎn)足開(kāi)發(fā)者基于用戶(hù)態(tài)開(kāi)發(fā)功能驅(qū)動(dòng)的需求。但是,由于Libusb庫(kù)是完全按照USB協(xié)議來(lái)封裝接口的,所以需要開(kāi)發(fā)者對(duì)USB協(xié)議要有較深的了解才能很好的使用,對(duì)開(kāi)發(fā)者的要求相對(duì)較高,讓很多比較初級(jí)的開(kāi)發(fā)者望而卻步。為了讓更多的開(kāi)發(fā)者都能進(jìn)行基于用戶(hù)態(tài)的USB驅(qū)動(dòng)開(kāi)發(fā),HDF引入了USB DDK開(kāi)發(fā)套件。

USB DDK(USB DriverDevelop Kit)是HDF驅(qū)動(dòng)框架為開(kāi)發(fā)者提供的USB驅(qū)動(dòng)程序開(kāi)發(fā)套件,包括USB Host DDK及USB Device DDK兩部分,支持基于用戶(hù)態(tài)開(kāi)發(fā)USB設(shè)備驅(qū)動(dòng)的同時(shí),還提供了豐富的USB驅(qū)動(dòng)開(kāi)發(fā)能力,讓廣大開(kāi)發(fā)者能精準(zhǔn)且高效的開(kāi)發(fā)USB驅(qū)動(dòng)程序。下面,我們將一一道來(lái)。

1USB Host DDK

USB Host DDK給開(kāi)發(fā)者提供了主機(jī)端USB驅(qū)動(dòng)開(kāi)發(fā)能力,按照功能分類(lèi)三大類(lèi),分別是DDK初始化類(lèi)、interface對(duì)象操作類(lèi)及request對(duì)象操作類(lèi)。并為開(kāi)發(fā)者提供了普通模式和專(zhuān)家模式兩種開(kāi)發(fā)模式。普通模式下,開(kāi)發(fā)者可通過(guò)USBDDK API直接完成相關(guān)USB數(shù)據(jù)讀寫(xiě)操作,不需要過(guò)多關(guān)注底層傳輸細(xì)節(jié)。專(zhuān)家模式下,開(kāi)發(fā)者通過(guò)USB RAW API直接訪(fǎng)問(wèn)OS平臺(tái)USB通道的接口,自定義實(shí)現(xiàn)更加復(fù)雜的功能。目的是給驅(qū)動(dòng)層留有更靈活,更強(qiáng)大的擴(kuò)展方案,同時(shí)也能夠兼容現(xiàn)有驅(qū)動(dòng),便于移植。USBHost DDK架構(gòu)如圖1所示:

USB DDK介紹與開(kāi)發(fā)指導(dǎo)

圖1 USB Host DDK架構(gòu)

(1)USB Interface Pool負(fù)責(zé)USBInterface管理。提供USB Interface申請(qǐng)和回收,USB Interface記錄設(shè)備端口信息以及資源。USB Interface Pool按照USB Port對(duì)USB Interface進(jìn)行分類(lèi)管理。同時(shí),此模塊還提供了USB DDK API,方便開(kāi)發(fā)者USB數(shù)據(jù)讀寫(xiě)操作。

(2)USB Protocol Layer提供USB協(xié)議封裝,根據(jù)USB協(xié)議對(duì)設(shè)備IO/控制命令的“翻譯/解析”,同時(shí)負(fù)責(zé)設(shè)備描述符的管理,根據(jù)USB Device上報(bào)的枚舉信息,匹配對(duì)應(yīng)的描述符,并構(gòu)建對(duì)應(yīng)的USB Interface,并加入到USB Interface Pool中管理。

(3)Device IO Manager負(fù)責(zé)USBIO請(qǐng)求管理,提供了同步IO和異步IO管理機(jī)制,對(duì)于異步IO,IO Manager負(fù)責(zé)將該請(qǐng)求記錄下來(lái),然后通過(guò)Raw API Library提供的接口依次處理待發(fā)送的IO請(qǐng)求;當(dāng)收到USB控制器應(yīng)答的處理結(jié)果后,IO接收線(xiàn)程負(fù)責(zé)解析并上報(bào)處理結(jié)果給上層調(diào)用者。

(4)Raw API Library抽象了底層OS能力,定義了統(tǒng)一的OS能力接口,對(duì)外提供了USB RAW API,讓開(kāi)發(fā)者自定義實(shí)現(xiàn)更加復(fù)雜的驅(qū)動(dòng)功能。

(5)OS Adapter用于封裝與平臺(tái)(LinuxLiteOS)相關(guān)的操作,根據(jù)不同平臺(tái)配置編譯對(duì)應(yīng)平臺(tái)的封裝接口。在Linux平臺(tái)上,訪(fǎng)問(wèn)USBFS的操作,全部都封裝在這個(gè)模塊中;而在LiteOS平臺(tái)上,基于FreeBSD USB框架的設(shè)備訪(fǎng)問(wèn)操作,對(duì)應(yīng)的也都全部封裝在這個(gè)模塊中。

(6)PNP Notify用于動(dòng)態(tài)監(jiān)測(cè)USB狀態(tài)變化,當(dāng)有新設(shè)備添加/移除時(shí),變化設(shè)備信息。同時(shí)將所有USB設(shè)備信息都通過(guò)KHDF上報(bào)給UHDF側(cè)的PNPNotify Manager模塊來(lái)完成加載/卸載第三方功能驅(qū)動(dòng)。

2USB Device DDK

USB Device DDK給開(kāi)發(fā)者提供了設(shè)備端USB驅(qū)動(dòng)開(kāi)發(fā)能力。例如,USB端口動(dòng)態(tài)注冊(cè)和去注冊(cè)能力,開(kāi)發(fā)者可以基于能力實(shí)現(xiàn)USB端口的動(dòng)態(tài)添加和組合;動(dòng)態(tài)實(shí)例化能力,支持根據(jù)動(dòng)態(tài)下發(fā)設(shè)備、配置、接口及端點(diǎn)描述符創(chuàng)建設(shè)備實(shí)例及傳輸通道;用戶(hù)態(tài)的數(shù)據(jù)發(fā)送及接收能力,支持用戶(hù)態(tài)下發(fā)送及接收數(shù)據(jù);復(fù)合設(shè)備能力,支持一個(gè)物理設(shè)備上多個(gè)邏輯設(shè)備,實(shí)現(xiàn)多個(gè)邏輯設(shè)備間隔離,并支持不同邏輯設(shè)備同時(shí)被不同的應(yīng)用進(jìn)程訪(fǎng)問(wèn)。USB Device DDK架構(gòu)如圖2所示:

USB DDK介紹與開(kāi)發(fā)指導(dǎo)
圖2 USB Device DDK架構(gòu)

(1)SDK IF負(fù)責(zé)USB設(shè)備按照設(shè)備、接口、管道進(jìn)行邏輯劃分,對(duì)配置管理、設(shè)備管理、IO管理進(jìn)行封裝。此模塊還向開(kāi)發(fā)者提供了設(shè)備創(chuàng)建、獲取接口、接收Event事件、收發(fā)數(shù)據(jù)等設(shè)備測(cè)驅(qū)動(dòng)開(kāi)發(fā)的能力接口。

(2)Configuration Manager負(fù)責(zé)解析HCS文件描述的USB描述符信息,得到的USB描述符信息用于設(shè)備創(chuàng)建,同時(shí)模塊還提供了自定義屬性的讀取、創(chuàng)建、刪除、修改等操作。

(3)Device Manager負(fù)責(zé)根據(jù)配置模塊解析的USB描述符,并根據(jù)USB描述符創(chuàng)建設(shè)備。同時(shí)模塊還負(fù)責(zé)獲取設(shè)備、刪除設(shè)備、獲取設(shè)備狀態(tài),獲取設(shè)備上面接口信息。

(4)IO Manager負(fù)責(zé)數(shù)據(jù)的讀寫(xiě),包括Events事件、數(shù)據(jù)讀寫(xiě)完成事件的接受,支持同步和異步模式數(shù)據(jù)讀寫(xiě)。

(5)Adapter IF主要是對(duì)復(fù)合設(shè)備配置驅(qū)動(dòng)及通用功能驅(qū)動(dòng)設(shè)備節(jié)點(diǎn)操作進(jìn)行封裝,為上層提供統(tǒng)一的設(shè)備管理接口。

(6)Adapter該模塊由復(fù)合設(shè)備配置驅(qū)動(dòng)及通用功能驅(qū)動(dòng)提供。

二、USB DDK開(kāi)發(fā)指導(dǎo)

相信大家已對(duì)USB DDK已經(jīng)有了一定的認(rèn)識(shí)。下面,我們來(lái)看看如何使用USB DDK來(lái)開(kāi)發(fā)USB Host和USB Device驅(qū)動(dòng)程序吧。

1USB Host的開(kāi)發(fā)

USB Host(主機(jī)端驅(qū)動(dòng))主要完成協(xié)議封裝、設(shè)備管理、驅(qū)動(dòng)安裝與卸載等。通過(guò)上文的介紹,開(kāi)發(fā)者可通過(guò)USB DDK API和USB RAW API來(lái)實(shí)現(xiàn)主機(jī)端驅(qū)動(dòng)。

1. USB DDK API的使用

USB DDK API主要實(shí)現(xiàn)主機(jī)端USB數(shù)據(jù)讀寫(xiě)操作,如圖3所示,是USB DDK API提供的部分接口。

USB DDK介紹與開(kāi)發(fā)指導(dǎo)

圖3 USB DDK API部分接口

使用步驟如下:

(1) 配置驅(qū)動(dòng)匹配表,完成主機(jī)端驅(qū)動(dòng)總體信息的配置,具體如下:

struct UsbPnpMatchIdTable {//驅(qū)動(dòng)模塊名,該字段的值必須和驅(qū)動(dòng)入口結(jié)構(gòu)的moduleName一致const char *moduleName;//驅(qū)動(dòng)對(duì)外發(fā)布服務(wù)的名稱(chēng),必須唯一const char *serviceName;//驅(qū)動(dòng)私有數(shù)據(jù)匹配關(guān)鍵字const char *deviceMatchAttr;//從該字段開(kāi)始(包含該字段)之后數(shù)據(jù)長(zhǎng)度,以byte為單位uint8_t length;//USB驅(qū)動(dòng)匹配規(guī)則uint16_t matchFlag;//廠(chǎng)商編號(hào)uint16_t vendorId;//產(chǎn)品編號(hào)uint16_t productId;//設(shè)備出廠(chǎng)編號(hào),低16位uint16_t bcdDeviceLow;//設(shè)備出廠(chǎng)編號(hào),高16位uint16_t bcdDeviceHigh;  //USB分配的設(shè)備類(lèi)代碼uint8_t deviceClass;//USB分配的子類(lèi)代碼uint8_t deviceSubClass;//USB分配的設(shè)備協(xié)議代碼uint8_t deviceProtocol;//接口類(lèi)型,根據(jù)實(shí)際需要可填寫(xiě)多個(gè)uint8_t interfaceClass[USB_PNP_INFO_MAX_INTERFACES];//接口子類(lèi)型,根據(jù)實(shí)際需要可填寫(xiě)多個(gè)uint8_t interfaceSubClass[USB_PNP_INFO_MAX_INTERFACES];//接口所遵循的協(xié)議,根據(jù)實(shí)際需要可填寫(xiě)多個(gè)uint8_t interfaceProtocol[USB_PNP_INFO_MAX_INTERFACES];//接口的編號(hào),根據(jù)實(shí)際需要可填寫(xiě)多個(gè)uint8_t interfaceNumber[USB_PNP_INFO_MAX_INTERFACES];};
(左右滑動(dòng),查看更多)

其中matchFlag表示驅(qū)動(dòng)匹配規(guī)則,每個(gè)bit表示一種匹配方式,其取值如下:
enum {    USB_PNP_NOTIFY_MATCH_VENDOR = 0x0001,    USB_PNP_NOTIFY_MATCH_PRODUCT = 0x0002,    USB_PNP_NOTIFY_MATCH_DEV_LOW = 0x0004,    USB_PNP_NOTIFY_MATCH_DEV_HIGH = 0x0008,    USB_PNP_NOTIFY_MATCH_DEV_CLASS = 0x0010,    USB_PNP_NOTIFY_MATCH_DEV_SUBCLASS = 0x0020,    USB_PNP_NOTIFY_MATCH_DEV_PROTOCOL = 0x0040,    USB_PNP_NOTIFY_MATCH_INT_CLASS = 0x0080,    USB_PNP_NOTIFY_MATCH_INT_SUBCLASS = 0x0100,    USB_PNP_NOTIFY_MATCH_INT_PROTOCOL = 0x0200,    USB_PNP_NOTIFY_MATCH_INT_NUMBER = 0x0400,};
(左右滑動(dòng),查看更多)

(2) USB主機(jī)端驅(qū)動(dòng)開(kāi)發(fā)工具包初始化,使用如下接口:
int32_t UsbInitHostSdk(struct UsbSession **session)
(左右滑動(dòng),查看更多)

(3) 待步驟2初始化完后獲取UsbInterface對(duì)象,使用如下接口:
const struct UsbInterface *UsbClaimInterface(const struct UsbSession *session, uint8_t busNum, uint8_t usbAddr, uint8_t interfaceIndex);
(左右滑動(dòng),查看更多)

(4) 打開(kāi)步驟3獲取到的UsbInterface接口對(duì)象,獲取對(duì)應(yīng)接口的UsbInterfaceHandle對(duì)象,使用如下接口:
UsbInterfaceHandle *UsbOpenInterface(const struct UsbInterface *interfaceObj);
(左右滑動(dòng),查看更多)

(5) 根據(jù)步驟4獲取到的UsbInterfaceHandle對(duì)象,獲取指定索引為pinpeIndex的pipeInfo信息,使用如下接口:
int32_t UsbGetPipeInfo(const UsbInterfaceHandle *interfaceHandle, uint8_t settingIndex, uint8_t pipeId, struct UsbPipeInfo *pipeInfo);
(左右滑動(dòng),查看更多)

(6) 為步驟4獲取到的UsbInterfaceHandle預(yù)先分配待發(fā)送的IO Request對(duì)象,使用如下接口:
struct UsbRequest *UsbAllocRequest(const UsbInterfaceHandle *interfaceHandle, int isoPackets, int length);
(左右滑動(dòng),查看更多)

(7) 根據(jù)輸入?yún)?shù)params填充步驟6預(yù)先分配的IO Request,使用如下接口:
int32_t UsbFillRequest(const struct UsbRequest *request, const UsbInterfaceHandle *interfaceHandle, const struct UsbRequestParams *params);
(左右滑動(dòng),查看更多)

(8) 提交IO Request對(duì)象,可以選擇同步或異步兩種模式,使用如下接口:
int32_t UsbSubmitRequestSync(const struct UsbRequest *request);//發(fā)送同步IO請(qǐng)求int32_t UsbSubmitRequestAsync(const struct UsbRequest *request);//發(fā)送異步IO請(qǐng)求
(左右滑動(dòng),查看更多)

2. USB RAW API 的使用

USB RAW API主要實(shí)現(xiàn)USB更加復(fù)雜的功能,如獲取描述符信息、獲取設(shè)備指針、復(fù)位設(shè)備、提交傳輸請(qǐng)求等,如圖4所示,是USB RAW API提供的部分接口。

USB DDK介紹與開(kāi)發(fā)指導(dǎo)

圖4 USB RAW API

使用步驟如下:

(1) 同USB DDK API的步驟1一樣,需先進(jìn)行驅(qū)動(dòng)匹配表配置。

(2) 初始化Host RAW,使用如下接口:
int32_t UsbRawInit(struct UsbSession **session);
(左右滑動(dòng),查看更多)

(3) 待步驟2完成后打開(kāi)USB設(shè)備,使用如下接口:
UsbRawHandle *UsbRawOpenDevice(const struct UsbSession *session, uint8_t busNum, uint8_t usbAddr);
(左右滑動(dòng),查看更多)

(4) 待步驟3完成后獲取描述符,通過(guò)描述符獲取接口、端點(diǎn)信息,使用如下接口:
int32_t UsbRawGetConfigDescriptor(const UsbRawDevice *rawDev, uint8_t configIndex, struct UsbRawConfigDescriptor **config);
(左右滑動(dòng),查看更多)

(5) 分配Request,并根據(jù)不同的傳輸類(lèi)型使用相應(yīng)的接口對(duì)Request進(jìn)行填充:
int32_t UsbRawFillBulkRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRawFillRequestData *fillData);// 填充用于批量傳輸?shù)恼?qǐng)求int32_t UsbRawFillControlSetup(const unsigned char *setup, const struct UsbControlRequestData *requestData);int32_t UsbRawFillControlRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRawFillRequestData *fillData);// 填充用于控制傳輸?shù)恼?qǐng)求int32_t UsbRawFillInterruptRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRawFillRequestData *fillData);// 填充用于中斷傳輸?shù)恼?qǐng)求int32_t UsbRawFillIsoRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRawFillRequestData *fillData);// 填充用于同步傳輸?shù)恼?qǐng)求
(左右滑動(dòng),查看更多)

(6) 提交IO Request對(duì)象,可以選擇同步或異步兩種模式,分別使用如下接口:
int32_t UsbRawSendControlRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbControlRequestData *requestData);//發(fā)送同步USB控制傳輸請(qǐng)求int32_t UsbRawSendBulkRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRequestData *requestData);//發(fā)送同步USB批量傳輸請(qǐng)求int32_t UsbRawSendInterruptRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRequestData *requestData);//發(fā)送同步執(zhí)行USB中斷傳輸請(qǐng)求int32_t UsbRawSubmitRequest(const struct UsbRawRequest *request);//提交異步IO請(qǐng)求
(左右滑動(dòng),查看更多)

感興趣的小伙伴可點(diǎn)擊下方鏈接查看完整的USB Host開(kāi)發(fā)代碼:https://gitee.com/openharmony/drivers_peripheral/tree/master/usb/serial/src

2USB Device的開(kāi)發(fā)

USB Device(設(shè)備端驅(qū)動(dòng))主要實(shí)現(xiàn)設(shè)備管理、配置管理、IO管理、數(shù)據(jù)通信等。USB Deivce DDK給開(kāi)發(fā)者提供了設(shè)備創(chuàng)建、獲取接口、接收Event事件、收發(fā)數(shù)據(jù)等驅(qū)動(dòng)能力接口,如圖5所示:

USB DDK介紹與開(kāi)發(fā)指導(dǎo)

圖5 USB Device DDK開(kāi)放的API

下面,我們將根據(jù)USB Deivce DDK提供的驅(qū)動(dòng)能力接口來(lái)開(kāi)發(fā)設(shè)備端驅(qū)動(dòng)。

1. 構(gòu)造描述符

首先,需構(gòu)造描述符來(lái)說(shuō)明設(shè)備的總體信息。開(kāi)發(fā)者可以通過(guò)設(shè)備功能代碼及設(shè)備私有數(shù)據(jù)HCS兩種途徑進(jìn)行配置,下面將分別介紹。

(1) 在設(shè)備功能代碼中配置描述符,配置代碼如下:
static struct UsbFnFunction g_acmFunction = {//功能描述符    .enable         = true,    .funcName       = "f_generic.a",    .strings        = g_acmStrings,    .fsDescriptors  = g_acmFsFunction,    .hsDescriptors  = g_acmHsFunction,    .ssDescriptors  = g_acmSsFunction,.sspDescriptors = NULL,};struct UsbFnFunction *g_functions[] = {#ifdef CDC_ECM    &g_ecmFunction,#endif#ifdef CDC_ACM    &g_acmFunction,#endifNULL};static struct UsbFnConfiguration g_masterConfig = {//配置描述符    .configurationValue = 1,    .iConfiguration     = USB_FUNC_CONFIG_IDX,    .attributes         = USB_CFG_BUS_POWERED,    .maxPower           = POWER,    .functions          = g_functions,};static struct UsbFnConfiguration *g_configs[] = {    &g_masterConfig,    NULL,};static struct UsbDeviceDescriptor g_cdcMasterDeviceDesc = {//設(shè)備描述符    .bLength            = sizeof(g_cdcMasterDeviceDesc),    .bDescriptorType    = USB_DDK_DT_DEVICE,    .bcdUSB             = CpuToLe16(BCD_USB),    .bDeviceClass       = 0,    .bDeviceSubClass    = 0,    .bDeviceProtocol    = 0,    .bMaxPacketSize0    = USB_MAX_PACKET_SIZE,    .idVendor           = CpuToLe16(DEVICE_VENDOR_ID),    .idProduct          = CpuToLe16(DEVICE_PRODUCT_ID),    .bcdDevice          = CpuToLe16(DEVICE_VERSION),    .iManufacturer      = USB_FUNC_MANUFACTURER_IDX,    .iProduct           = USB_FUNC_PRODUCT_IDX,    .iSerialNumber      = USB_FUNC_SERIAL_IDX,    .bNumConfigurations = 1,};static struct UsbFnDeviceDesc g_masterFuncDevice = {//描述符入口    .deviceDesc    = &g_cdcMasterDeviceDesc,    .deviceStrings = g_devStrings,    .configs       = g_configs,};
(左右滑動(dòng),查看更多)

(2) 在設(shè)備私有數(shù)據(jù)HCS中配置,配置代碼如下:
root {    module = "master";master_config {        match_attr         = "usbfn_master_driver";//該字段與device中deviceMatchAttr                                                             保持一致,否則無(wú)法找到的這個(gè)節(jié)點(diǎn)的信息。    use_hcs            = 1;                         //用戶(hù)可以用該值決定是否使用hcs配置信息    udc_name           = "100e0000.hidwc3_0";   //UDC的名字        usb_dev_desc       = "UsbDeviceDescriptor";//設(shè)備描述符的節(jié)點(diǎn)UsbDeviceDescriptor        usb_dev_string     = "UsbDeviceStrings";   //設(shè)備字符串的節(jié)點(diǎn)為UsbDeviceStrings        usb_configuration = "UsbConfigs";           //配置描述符的節(jié)點(diǎn)為UsbConfigs        ...   }}
(左右滑動(dòng),查看更多)

設(shè)備描述符的節(jié)點(diǎn)為UsbDeviceDescriptor,配置如下:
UsbDeviceDescriptor {            bLength            = 18;            bDescriptorType  = 0x01;            bcdUSB             = 0x0200;            bDeviceClass      = 0;            bDeviceSubClass  = 0;            bDeviceProtocol  = 0;            bMaxPacketSize0  = 0x40;            idVendor           = 0x0525;            idProduct          = 0xA4A7;            bcdDevice          = 0x0100;            manufacturer       = 0;            product             = 1;            serialnumber       = 2;            numConfigurations = 1;  }
(左右滑動(dòng),查看更多)

2. 創(chuàng)建設(shè)備

描述符構(gòu)造完成后,使用UsbFnDeviceCreate函數(shù)創(chuàng)建一個(gè)USB設(shè)備,并傳入U(xiǎn)DC控制器名和UsbFnDescriptorData結(jié)構(gòu)體。實(shí)現(xiàn)代碼如下:

 if (useHcs == 0) {//使用代碼編寫(xiě)的描述符        descData.type        = USBFN_DESC_DATA_TYPE_DESC;        descData.descriptor = &g_acmFuncDevice;    } else {             //使用hcs編寫(xiě)的描述符        descData.type         = USBFN_DESC_DATA_TYPE_PROP;        descData.property    = acm->device->property;}   //創(chuàng)建設(shè)備    fnDev = (struct UsbFnDevice *) UsbFnCreateDevice(acm->udcName, &descData);
(左右滑動(dòng),查看更多)

3.獲取接口

設(shè)備創(chuàng)建后,使用UsbFnDeviceGetInterface函數(shù)獲取UsbInterface接口對(duì)象,并通過(guò)UsbFnGetInterfacePipeInfo函數(shù)獲取USB管道信息,實(shí)現(xiàn)代碼如下:

//獲取接口fnIface = (struct UsbFnInterface *)UsbFnGetInterface(fnDev, i);//獲取Pipe信息UsbFnGetInterfacePipeInfo(fnIface, i, &pipeInfo);//獲取Handlehandle = UsbFnOpenInterface(fnIface);//獲取控制(EP0)Requestreq = UsbFnAllocCtrlRequest(acm->ctrlIface.handle,            sizeof(struct UsbCdcLineCoding) + sizeof(struct UsbCdcLineCoding));//獲取Requestreq = UsbFnAllocCtrlRequest(acm->ctrlIface.handle,            sizeof(struct UsbCdcLineCoding) + sizeof(struct UsbCdcLineCoding));
(左右滑動(dòng),查看更多)

4. 接收Event事件

通過(guò)UsbFnStartRecvInterfaceEvent函數(shù)接收Event事件,并通過(guò)UsbFnEventCallback回調(diào)函數(shù)對(duì)Event事件做出響應(yīng),實(shí)現(xiàn)代碼如下:

//開(kāi)始接收Event事件ret = UsbFnStartRecvInterfaceEvent(acm->ctrlIface.fn, 0xff, UsbAcmEventCallback, acm);//Event處理回調(diào)函數(shù)static void UsbAcmEventCallback(struct UsbFnEvent *event){struct UsbAcmDevice *acm = NULL;

    if (event == NULL || event->context == NULL) {        HDF_LOGE("%s: event is null", __func__);        return;    }

    acm = (struct UsbAcmDevice *)event->context;    switch (event->type) {        case USBFN_STATE_BIND:            HDF_LOGI("%s: receive bind event", __func__);            break;        case USBFN_STATE_UNBIND:            HDF_LOGI("%s: receive unbind event", __func__);            break;        case USBFN_STATE_ENABLE:            HDF_LOGI("%s: receive enable event", __func__);            AcmEnable(acm);            break;        case USBFN_STATE_DISABLE:            HDF_LOGI("%s: receive disable event", __func__);            AcmDisable(acm);            acm->enableEvtCnt = 0;            break;        case USBFN_STATE_SETUP:            HDF_LOGI("%s: receive setup event", __func__);            if (event->setup != NULL) {                AcmSetup(acm, event->setup);            }            break;        case USBFN_STATE_SUSPEND:            HDF_LOGI("%s: receive suspend event", __func__);            AcmSuspend(acm);            break;        case USBFN_STATE_RESUME:            HDF_LOGI("%s: receive resume event", __func__);            AcmResume(acm);            break;        default:            break;    }}
(左右滑動(dòng),查看更多)

5. 收發(fā)數(shù)據(jù)

可以選擇同步異步發(fā)送模式,實(shí)現(xiàn)代碼如下:

notify = (struct UsbCdcNotification *)req->buf;    ...    if (memcpy_s((void *)(notify + 1), length, data, length)  != EOK) {        return HDF_FAILURE;    }ret = UsbFnSubmitRequestAsync(req);//異步發(fā)送
(左右滑動(dòng),查看更多)

以上就是本期全部?jī)?nèi)容,通過(guò)本文的介紹相信你已經(jīng)對(duì)USB DDK有了深刻的認(rèn)識(shí),期待廣大的開(kāi)發(fā)者加入我們,一起豐富基于USB DDK的第三方驅(qū)動(dòng)。

原文標(biāo)題:USB DDK助你輕松實(shí)現(xiàn)USB驅(qū)動(dòng)開(kāi)發(fā)

文章出處:【微信公眾號(hào):HarmonyOS開(kāi)發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
審核編輯:湯梓紅


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    8146

    瀏覽量

    270944
  • 驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    12

    文章

    1900

    瀏覽量

    86539
  • DDK
    DDK
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    8993

原文標(biāo)題:USB DDK助你輕松實(shí)現(xiàn)USB驅(qū)動(dòng)開(kāi)發(fā)

文章出處:【微信號(hào):HarmonyOS_Dev,微信公眾號(hào):HarmonyOS開(kāi)發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    USB開(kāi)發(fā)指導(dǎo)資料

    USB開(kāi)發(fā)指導(dǎo)資料[hide][/hide]
    發(fā)表于 04-17 00:00

    DDK開(kāi)發(fā)Windows USB驅(qū)動(dòng)程序

    本帖最后由 eehome 于 2013-1-5 09:59 編輯 用DDK開(kāi)發(fā)Windows USB驅(qū)動(dòng)程序
    發(fā)表于 11-17 09:18

    Silicon、IDE開(kāi)發(fā)指導(dǎo)

    Silicon、IDE開(kāi)發(fā)指導(dǎo)手冊(cè),希望對(duì)大家有所幫助。
    發(fā)表于 01-09 14:45

    【HarmonyOS】HarmonyOS子系統(tǒng)開(kāi)發(fā)指導(dǎo)

    子系統(tǒng)開(kāi)發(fā)主要從三個(gè)方面進(jìn)行指導(dǎo),分別是圖形圖像類(lèi)子系統(tǒng)開(kāi)發(fā)指導(dǎo),相機(jī)子系統(tǒng)開(kāi)發(fā)指導(dǎo)和音視頻子系統(tǒng)開(kāi)發(fā)指導(dǎo)。圖形圖像容器類(lèi)組件
    發(fā)表于 09-21 14:50

    HarmonyOS USB DDK助你輕松實(shí)現(xiàn)USB驅(qū)動(dòng)開(kāi)發(fā)

    提供。 二、USB DDK開(kāi)發(fā)指導(dǎo) 相信大家已對(duì)USB DDK已經(jīng)有了一定的認(rèn)識(shí)。下面,我們來(lái)看看如何使用
    發(fā)表于 03-28 19:31

    HDF驅(qū)動(dòng)框架中USB DDK的解析與指導(dǎo)

    是對(duì)復(fù)合設(shè)備配置驅(qū)動(dòng)及通用功能驅(qū)動(dòng)設(shè)備節(jié)點(diǎn)操作進(jìn)行封裝,為上層提供統(tǒng)一的設(shè)備管理接口。 (6)Adapter該模塊由復(fù)合設(shè)備配置驅(qū)動(dòng)及通用功能驅(qū)動(dòng)提供。二、USB DDK開(kāi)發(fā)指導(dǎo)相信大家已對(duì)U
    發(fā)表于 03-29 09:24

    USB接口驅(qū)動(dòng)程序開(kāi)發(fā)

    介紹USB的優(yōu)點(diǎn)和發(fā)展情況,基于DDKUSB設(shè)備驅(qū)動(dòng)程序結(jié)構(gòu),并結(jié)合開(kāi)發(fā)的ARM 板驅(qū)動(dòng)程序?qū)﹃P(guān)鍵程序進(jìn)行
    發(fā)表于 03-19 15:21 ?121次下載
    <b class='flag-5'>USB</b>接口驅(qū)動(dòng)程序<b class='flag-5'>開(kāi)發(fā)</b>

    基于GoKit的產(chǎn)品開(kāi)發(fā)指導(dǎo)

    基于GoKit的產(chǎn)品開(kāi)發(fā)指導(dǎo),有板子的可以下載看看的
    發(fā)表于 11-16 19:00 ?0次下載

    ZigBee2007視頻教程-應(yīng)用開(kāi)發(fā)指導(dǎo)

    ZigBee2007視頻教程-應(yīng)用開(kāi)發(fā)指導(dǎo)ZigBee2007視頻教程-應(yīng)用開(kāi)發(fā)指導(dǎo)ZigBee2007視頻教程-應(yīng)用開(kāi)發(fā)指導(dǎo)ZigBee2007視頻教程-應(yīng)用開(kāi)發(fā)指導(dǎo)
    發(fā)表于 12-29 10:31 ?20次下載

    LPC1300_USB開(kāi)發(fā)指介紹

    LPC1300 USB開(kāi)發(fā)指南,有需要的朋友下來(lái)看看。
    發(fā)表于 01-08 14:44 ?12次下載

    USB開(kāi)發(fā)指南——基于LPC2400》配套例程

    USB開(kāi)發(fā)指南——基于LPC2400》配套例程。
    發(fā)表于 05-20 15:07 ?26次下載

    TI DM388評(píng)估模塊和開(kāi)發(fā)開(kāi)發(fā)指導(dǎo)手冊(cè)

    TI DM388評(píng)估模塊和開(kāi)發(fā)開(kāi)發(fā)指導(dǎo)手冊(cè)
    發(fā)表于 11-25 18:06 ?15次下載

    nRF51 DK板載的開(kāi)發(fā)指導(dǎo)手冊(cè)免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是nRF51 DK板載的開(kāi)發(fā)指導(dǎo)手冊(cè)免費(fèi)下載。
    發(fā)表于 02-14 08:00 ?0次下載
    nRF51 DK板載的<b class='flag-5'>開(kāi)發(fā)指導(dǎo)</b>手冊(cè)免費(fèi)下載

    HDF驅(qū)動(dòng)框架中USB DDK的解析與開(kāi)發(fā)指導(dǎo)

    HDF(Hardware Driver Foundation)驅(qū)動(dòng)框架是HarmonyOS硬件生態(tài)開(kāi)放的基礎(chǔ),為開(kāi)發(fā)者提供了驅(qū)動(dòng)加載、驅(qū)動(dòng)服務(wù)管理和驅(qū)動(dòng)消息機(jī)制等驅(qū)動(dòng)能力,讓開(kāi)發(fā)者能精準(zhǔn)且高效的開(kāi)發(fā)驅(qū)動(dòng)程序。本期,我們將為大家?guī)?/div>
    的頭像 發(fā)表于 03-30 10:16 ?2532次閱讀

    USB PD 3.0控制器TPS65987DDK浪涌防護(hù)方案

    的安全性。 一、TPS65987DDK介紹 TPS65987DDK是一款高度集成的獨(dú)立式 USB Type-C?和電力傳輸 (PD)?控制器,針對(duì)U
    的頭像 發(fā)表于 04-10 14:53 ?202次閱讀
    <b class='flag-5'>USB</b> PD 3.0控制器TPS65987<b class='flag-5'>DDK</b>浪涌防護(hù)方案