当前位置:   article > 正文

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

鸿蒙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
  • 1

头文件

#include <usb/usb_ddk_api.h>
#include <usb/usb_ddk_types.h>
  • 1
  • 2
  1. 获取设备描述符。使用 usb_ddk_api.h 的 OH_Usb_Init 接口初始化DDK,并使用 OH_Usb_GetDeviceDescriptor获取到设备描述符。
// 初始化USB DDK
OH_Usb_Init();
struct UsbDeviceDescriptor devDesc;
uint64_t deviceId = 0;
// 获取设备描述符
OH_Usb_GetDeviceDescriptor(deviceId, &devDesc);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  1. 获取配置描述符及声明接口。使用 usb_ddk_api.h 的 OH_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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  1. 获取当前激活接口的备用设置及激活备用设置。使用 usb_ddk_api.h 的 OH_Usb_GetCurrentInterfaceSetting 获取备用设置,并使用 OH_Usb_SelectInterfaceSetting 激活备用设置
uint8_t settingIndex = 0;
// 接口获取备用设置
OH_Usb_GetCurrentInterfaceSetting(interfaceHandle, &settingIndex);

// 激活备用设置
OH_Usb_SelectInterfaceSetting(interfaceHandle, &settingIndex);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  1. 发送控制读请求、发送控制写请求。使用 usb_ddk_api.h 的OH_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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  1. 创建内存映射缓冲区及发送请求。使用 usb_ddk_api.h 的OH_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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  1. 释放资源。在所有请求处理完毕,程序退出前,使用 usb_ddk_api.h 的 OH_Usb_DestroyDeviceMemMap 接口销毁缓冲区。使用OH_Usb_ReleaseInterface释放接口。使用OH_Usb_Release释放USB DDK。
// 销毁缓冲区
OH_Usb_DestroyDeviceMemMap(devMmap);
// 释放接口
OH_Usb_ReleaseInterface(interfaceHandle);
// 释放USB DDK
OH_Usb_Release();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

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

开发基础知识:https://qr21.cn/FV7h05

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

基于ArkTS 开发:https://qr21.cn/FV7h05

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

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/334465
推荐阅读
相关标签
  

闽ICP备14008679号