HarmonyOS 鸿蒙Next中如何开发适用HID协议的设备驱动

HarmonyOS 鸿蒙Next中如何开发适用HID协议的设备驱动 https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/hid-ddk-guidelines

无法根据此文档,来进行驱动开发,能给一个完成的demo吗

5 回复

handwriting-board项目是手写板应用、手写版驱动合一项目。参考链接:https://gitee.com/lixinsheng2/handwriting-board

手写板应用主要功能:

  • 设备连接状态显示(查询、绑定设备驱动)
  • 手写板按键设置。
  • 手写板区域设置。
  • 退出(解绑设备驱动)

手写板驱动应用主要功能:

  • 与设备进行USB通信(获取设备输入)
  • 与系统进行通信(向系统写入事件)

更多关于HarmonyOS 鸿蒙Next中如何开发适用HID协议的设备驱动的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


HID协议的设备驱动开发可以参考下面文档:

开发适用HID协议的设备驱动-扩展外设专项驱动开发-Driver Development Kit(驱动开发服务)-硬件-系统 - 华为HarmonyOS开发者

部分代码:

// 构建HID设备属性
std::vector<Hid_DeviceProp> deviceProp = {HID_PROP_DIRECT}; //需要引入vector头文件
std::string deviceName = "keyboard";
Hid_Device hidDevice = {
    .deviceName = deviceName.c_str(), 
    .vendorId = 0x6006, 
    .productId = 0x6006, 
    .version = 1, 
    .bustype = 3,
    .properties = deviceProp.data(),
    .propLength = (uint16_t)deviceProp.size()
};
// 构建HID设备关注的事件属性
std::vector<Hid_EventType> eventType = {HID_EV_ABS, HID_EV_KEY, HID_EV_SYN, HID_EV_MSC};
Hid_EventTypeArray eventTypeArray = {.hidEventType = eventType.data(), .length = (uint16_t)eventType.size()};
std::vector<Hid_KeyCode> keyCode = {HID_BTN_TOOL_PEN, HID_BTN_TOOL_RUBBER, HID_BTN_TOUCH, HID_BTN_STYLUS, HID_BTN_RIGHT};
Hid_KeyCodeArray keyCodeArray = {.hidKeyCode = keyCode.data(), .length = (uint16_t)keyCode.size()};
std::vector<Hid_MscEvent> mscEvent = {HID_MSC_SCAN};
Hid_MscEventArray mscEventArray = {.hidMscEvent = mscEvent.data(), .length = (uint16_t)mscEvent.size()};
std::vector<Hid_AbsAxes> absAxes = {HID_ABS_X, HID_ABS_Y, HID_ABS_PRESSURE};
Hid_AbsAxesArray absAxesArray = {.hidAbsAxes = absAxes.data(), .length = (uint16_t)absAxes.size()};
Hid_EventProperties hidEventProp = {
    .hidEventTypes = eventTypeArray,
    .hidKeys = keyCodeArray,
    .hidAbs = absAxesArray,
    .hidMiscellaneous = mscEventArray
    };
    // 创建设备并获取到deviceId
    int32_t deviceId = OH_Hid_CreateDevice(&hidDevice, &hidEventProp);

下边是基于HID协议的设备驱动开发的一个Demo:

1/CMakeLists.txt配置

cmake_minimum_required(VERSION 3.12)

project(hid_demo)

set(CMAKE_CXX_STANDARD 11)

add_library(hid_demo SHARED

    hid_driver.cpp

)

target_link_libraries(hid_demo PUBLIC libhid.z.so)

2/module.json5权限声明

{
  "module": {
    "requestPermissions": [
      "ohos.permission.ACCESS_DDK_HID"
    ]
  }
}

3/核心代码

#include <hid/hid_ddk_api.h>
#include <hid/hid_ddk_types.h>

// 定义HID设备属性
static Hid_Device hidDevice = {
    .busType = HID_BUS_USB,
    .vendorId = 0x1234,   // 替换实际厂商ID
    .productId = 0x5678, // 替换实际产品ID
    .version = 0x0100,
    .name = "DemoHIDDevice"
};

// 定义事件属性
static Hid_EventProperties eventProps = {
    .eventType = HID_EVENT_TYPE_KEY,
    .reportId = 1
};

// 创建HID设备
int32_t CreateHIDDevice() {
    int32_t ret = OH_Hid_CreateDevice(&hidDevice, &eventProps);
    if (ret < 0) {
        // 错误处理
        return ret;
    }
    return ret; // 返回deviceId
}

// 发送HID事件
void SendHIDEvent(int32_t deviceId) {
    Hid_Event event = {
        .timestamp = 0,
        .reportId = 1,
        .data = {0x01, 0x00} // 示例键值数据
    };
    
    int32_t ret = OH_Hid_EmitEvent(deviceId, &event);
    if (ret != HID_SUCCESS) {
        // 错误处理
    }
}

// 销毁设备
void DestroyDevice(int32_t deviceId) {
    OH_Hid_DestroyDevice(deviceId);
}

在HarmonyOS Next中开发HID设备驱动需使用ArkTS语言,通过Driver Kit框架实现。首先定义HID设备描述符,包括报告格式和设备类型。使用HdfDriverEntry入口注册驱动,实现Bind、Init和Release回调。通过HID核心服务处理输入报告,使用IoService接口进行数据读写。需实现HID事件解析和上报机制,确保符合HID协议规范。驱动需通过HDF配置工具部署到内核态。

目前HarmonyOS Next的HID设备驱动开发主要依赖华为官方提供的DDK(Driver Development Kit)框架。根据官方文档,开发流程涉及设备描述符配置、HID报告解析以及用户态与内核态的交互机制。

由于HID协议设备类型较多(如键盘、鼠标、游戏手柄等),建议先通过文档中的示例代码理解基础结构,再针对具体设备类型实现驱动逻辑。当前OpenHarmony社区已有部分开源示例(如input驱动模型),可结合文档中的API进行适配。

若仍无法满足需求,建议关注后续版本更新,华为通常会逐步释放更多参考实现。

回到顶部