鸿蒙HarmonyOS应用开发之USB DDK开发

场景介绍

USB DDK(USB Driver Develop Kit)是为开发者提供的USB驱动程序开发套件,支持开发者基于用户态,在应用层开发USB设备驱动。提供了一系列主机侧访问设备的接口,包括主机侧打开和关闭接口、管道同步异步读写通信、控制传输、中断传输等。

接口说明

名称描述
OH_Usb_Init(void)初始化DDK。
OH_Usb_Release(void)释放DDK。
OH_Usb_GetDeviceDescriptor(uint64_t deviceId, struct UsbDeviceDescriptor *desc)获取设备描述符。
OH_Usb_GetConfigDescriptor(uint64_t deviceId, uint8_t configIndex, struct UsbDdkConfigDescriptor **const config)获取配置描述符。请在描述符使用完后使用OH_Usb_FreeConfigDescriptor()释放描述符,否则会造成内存泄露。
OH_Usb_FreeConfigDescriptor(const struct UsbDdkConfigDescriptor *const config)释放配置描述符,请在描述符使用完后释放描述符,否则会造成内存泄露。
OH_Usb_ClaimInterface(uint64_t deviceId, uint8_t interfaceIndex, uint64_t *interfaceHandle)声明接口。
OH_Usb_SelectInterfaceSetting(uint64_t interfaceHandle, uint8_t settingIndex)激活接口的备用设置。
OH_Usb_GetCurrentInterfaceSetting(uint64_t interfaceHandle, uint8_t *settingIndex)获取接口当前激活的备用设置。
OH_Usb_SendControlReadRequest(uint64_t interfaceHandle, const struct UsbControlRequestSetup *setup, uint32_t timeout, uint8_t *data, uint32_t *dataLen)发送控制读请求,该接口为同步接口。
OH_Usb_SendControlWriteRequest(uint64_t interfaceHandle, const struct UsbControlRequestSetup *setup, uint32_t, const uint8_t *data, uint32_t dataLen)发送控制写请求,该接口为同步接口。
OH_Usb_ReleaseInterface(uint64_t interfaceHandle)释放接口。
OH_Usb_SendPipeRequest(const struct UsbRequestPipe *pipe, UsbDeviceMemMap *devMmap)发送管道请求,该接口为同步接口。中断传输和批量传输都使用该接口发送请求。
OH_Usb_CreateDeviceMemMap(uint64_t deviceId, size_t size, UsbDeviceMemMap **devMmap)创建缓冲区。请在缓冲区使用完后,调用OH_Usb_DestroyDeviceMemMap()销毁缓冲区,否则会造成资源泄露。
OH_Usb_DestroyDeviceMemMap(UsbDeviceMemMap *devMmap)销毁缓冲区。请在缓冲区使用完后及时销毁缓冲区,否则会造成资源泄露。

USB DDK开发步骤

以下步骤描述了如何使用 USB DDK开发USB驱动:

添加动态链接库

CMakeLists.txt中添加以下lib。

libusb_ndk.z.so

头文件

#include <usb/usb_ddk_api.h>
#include <usb/usb_ddk_types.h>
  1. 获取设备描述符。使用 usb_ddk_api.hOH_Usb_Init 接口初始化DDK,并使用 OH_Usb_GetDeviceDescriptor获取到设备描述符。
// 初始化USB DDK
OH_Usb_Init();
struct UsbDeviceDescriptor devDesc;
uint64_t deviceId = 0;
// 获取设备描述符
OH_Usb_GetDeviceDescriptor(deviceId, &devDesc);
  1. 获取配置描述符及声明接口。使用 usb_ddk_api.hOH_Usb_GetConfigDescriptor 接口获取配置描述符 config,并使用 OH_Usb_ClaimInterface 声明接口。
struct UsbDdkConfigDescriptor *config = nullptr;
// 获取配置描述符
OH_Usb_GetConfigDescriptor(deviceId, 1, &config);
// 根据配置描述符,找到所需要通信的interfaceIndex
uint8_t interfaceIndex = 0;
// 声明接口
uint64_t interfaceHandle = 0;
OH_Usb_ClaimInterface(deviceId, interfaceIndex, &interfaceHandle);
// 释放配置描述符
OH_Usb_FreeConfigDescriptor(config);
  1. 获取当前激活接口的备用设置及激活备用设置。使用 usb_ddk_api.hOH_Usb_GetCurrentInterfaceSetting 获取备用设置,并使用 OH_Usb_SelectInterfaceSetting 激活备用设置
uint8_t settingIndex = 0;
// 接口获取备用设置
OH_Usb_GetCurrentInterfaceSetting(interfaceHandle, &settingIndex);

// 激活备用设置
OH_Usb_SelectInterfaceSetting(interfaceHandle, &settingIndex);
  1. 发送控制读请求、发送控制写请求。使用 usb_ddk_api.hOH_Usb_SendControlReadRequest发送控制读请求,或者使用OH_Usb_SendControlWriteRequest发送控制写请求。
    // 超时时间,设置为1s;
uint32_t timeout = 1000;

struct UsbControlRequestSetup setupRead;
setupRead.bmRequestType	= 0x80;
setupRead.bRequest = 0x08;
setupRead.wValue = 0;
setupRead.wIndex = 0;
setupRead.wLength = 0x01;
uint8_t dataRead[256] = {0};
uint32_t dataReadLen = 256;
// 发送控制读请求
OH_Usb_SendControlReadRequest(interfaceHandle, &setupRead, timeout, dataRead, &dataReadLen);

struct UsbControlRequestSetup setupWrite;
setupWrite.bmRequestType = 0;
setupWrite.bRequest = 0x09;
setupWrite.wValue = 1;
setupWrite.wIndex = 0;
setupWrite.wLength = 0;
uint8_t dataWrite[256] = {0};
uint32_t dataWriteLen = 256;
// 发送控制写请求
OH_Usb_SendControlWriteRequest(interfaceHandle, &setupWrite, timeout, dataWrite, &dataWriteLen);
  1. 创建内存映射缓冲区及发送请求。使用 usb_ddk_api.hOH_Usb_CreateDeviceMemMap接口创建内存映射缓冲区devMmap,并使用OH_Usb_SendPipeRequest发送请求。
struct UsbDeviceMemMap *devMmap = nullptr;
// 创建用于存放数据的缓冲区
size_t bufferLen = 10;
OH_Usb_CreateDeviceMemMap(deviceId, bufferLen, &devMmap);
struct UsbRequestPipe pipe;
pipe.interfaceHandle = interfaceHandle;
// 根据配置描述符找到所要通信的端点
pipe.endpoint = 128;
pipe.timeout = UINT32_MAX;
// 发送请求
OH_Usb_SendPipeRequest(&pipe, devMmap);
  1. 释放资源。在所有请求处理完毕,程序退出前,使用 usb_ddk_api.hOH_Usb_DestroyDeviceMemMap 接口销毁缓冲区。使用OH_Usb_ReleaseInterface释放接口。使用OH_Usb_Release释放USB DDK。
// 销毁缓冲区
OH_Usb_DestroyDeviceMemMap(devMmap);
// 释放接口
OH_Usb_ReleaseInterface(interfaceHandle);
// 释放USB DDK
OH_Usb_Release();

总是有很多小伙伴反馈说:鸿蒙开发不知道学习哪些技术?不知道需要重点掌握哪些鸿蒙应用开发知识点? 为了解决大家这些学习烦恼。在这准备了一份很实用的鸿蒙(HarmonyOS NEXT)学习路线与学习文档给大家用来跟着学习。

针对一些列因素,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。

《鸿蒙 (Harmony OS)开发学习手册》(共计892页):https://gitcode.com/HarmonyOS_MN

如何快速入门?

1.基本概念
2.构建第一个ArkTS应用
3.……


在这里插入图片描述

开发基础知识

1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……

基于ArkTS 开发

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

鸿蒙开发面试真题(含参考答案):https://gitcode.com/HarmonyOS_MN

OpenHarmony 开发环境搭建:https://gitcode.com/HarmonyOS_MN


在这里插入图片描述

《OpenHarmony源码解析》:https://gitcode.com/HarmonyOS_MN

搭建开发环境
系统架构分析

  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

OpenHarmony 设备开发学习手册:https://gitcode.com/HarmonyOS_MN

在这里插入图片描述

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值