HarmonyOS 鸿蒙Next中如何开发适用HID协议的设备驱动
HarmonyOS 鸿蒙Next中如何开发适用HID协议的设备驱动 https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/hid-ddk-guidelines
无法根据此文档,来进行驱动开发,能给一个完成的demo吗
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进行适配。
若仍无法满足需求,建议关注后续版本更新,华为通常会逐步释放更多参考实现。