ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

ZMK 输入处理器 Code Mapper 完全指南:事件码映射、XY 互换与滚轮转换

ZMK 输入处理器 Code Mapper 完全指南:事件码映射、XY 互换与滚轮转换 固件嵌入式智能硬件蓝牙【免费下载链接】zmkZMK Firmware Repository项目地址https://gitcode.com/gh_mirrors/zm/zmk点击查看免费下载导读Code Mapper代码映射是 ZMK 固件中一类输入处理器input processor它能把输入事件的事件码code改写成另一个事件码例如把垂直方向的 Y 移动事件改写成滚轮滚动事件或把 X/Y 移动方向互换。本文基于官方文档 code-mapper.md 展开并结合 ZMK 仓库中的驱动实现input_processor_code_mapper.c、设备树绑定zmk,input-processor-code-mapper.yaml与测试用例完整讲解其用法、两个预定义实例、用户自定义实例的配置方法以及底层工作原理。读完本文你将掌握如何把指针设备的移动事件映射为滚轮事件、交换 X/Y 轴以及为任意事件码编写自定义映射。背景什么是输入处理器在 ZMK 中输入处理器是一类负责处理并可选修改指针事件的小功能单元事件既可以来自物理指针设备如轨迹球、触控板也可以来自软件模拟的指针设备。处理器可以完成诸如缩放移动量、把移动事件改写成滚动事件、在指针使用时临时启用某一层等功能详见 输入处理器概览。输入处理器通过输入监听器input listener挂载到指定指针设备上处理器按input-processors属性中声明的顺序依次处理事件还可以通过子节点为特定层配置覆盖规则详见 输入处理器使用说明。Code Mapper 是什么Code Mapper 输入处理器的作用是把事件的**事件码code**映射为一个新的事件码。典型场景如把垂直的 Y 移动事件INPUT_REL_Y改写成滚轮事件INPUT_REL_WHEEL从而让轨迹板或轨迹球在某个层上变成一个滚动设备。需要注意它与 Transformer 的区别Code Mapper 只做事件码的一对一改写不改动事件的值value。Transformer 则对匹配类型的事件值做变换如取反、交换 X/Y 轴不改写事件码。二者都可以实现 X/Y 互换但方式不同Code Mapper 把 X 码映射成 Y 码、Y 码映射成 X 码Transformer 则交换事件值的含义。官方文档明确提示交换 X 和 Y 移动也可以使用 transformer 处理器完成你可以根据实际需求选择。用法零参数处理器Code Mapper 在使用时不接收任何参数因为具体的代码映射关系已经固化在处理器实例的定义中。在input-processors属性中直接引用实例即可zip_xy_to_scroll_mapper配合输入监听器使用时例如为trackpad设备的监听器挂载#include input/processors.dtsi trackpad_listener { input-processors zip_xy_to_scroll_mapper; }处理器链式处理时#input-processor-cells必须为0因此在引用处不能再附加param1、param2之类的参数。从驱动 APIinput_processor.h看handle_event回调接收的param1、param2会从设备树input-processors引用处解析零参数实例的这两个值恒为 0。预定义实例仓库在 code_mapper.dtsi 中提供了两个预定义实例只需在 keymap/overlay 顶部#include input/processors.dtsi即可引用该头文件内部会包含input/processors/code_mapper.dtsi见 processors.dtsi。引用说明zip_xy_to_scroll_mapper把 X/Y 移动事件分别映射为水平滚轮/滚轮事件zip_xy_swap_mapper把 X 映射为 Y、Y 映射为 X实现移动轴互换zip_xy_to_scroll_mapper的实际定义源码 code_mapper.dtsi/omit-if-no-ref/ zip_xy_to_scroll_mapper: zip_xy_to_scroll_mapper { compatible zmk,input-processor-code-mapper; #input-processor-cells 0; type INPUT_EV_REL; map INPUT_REL_Y INPUT_REL_WHEEL , INPUT_REL_X INPUT_REL_HWHEEL ; };zip_xy_swap_mapper的实际定义源码 code_mapper.dtsi/omit-if-no-ref/ zip_xy_swap_mapper: zip_xy_swap_mapper { compatible zmk,input-processor-code-mapper; #input-processor-cells 0; type INPUT_EV_REL; map INPUT_REL_Y INPUT_REL_X , INPUT_REL_X INPUT_REL_Y ; };/omit-if-no-ref/标记保证只有当你的 keymap 真正引用了这些节点时它们才会被编入固件从而避免无谓的固件体积增加。用户自定义实例官方文档允许用户针对不同的事件码定义新的 Code Mapper 实例。下面这个示例把鼠标左键映射为鼠标中键#include zephyr/dt-bindings/input/input-event-codes.h / { input_processors { zip_click_to_middle_click_mapper: zip_click_to_middle_click_mapper { compatible zmk,input-processor-code-mapper; #input-processor-cells 0; type INPUT_EV_KEY; map INPUT_BTN_0 INPUT_BTN_2; }; }; }CompatibleCode Mapper 输入处理器使用compatible属性值zmk,input-processor-code-mapper这一点与绑定文件 zmk,input-processor-code-mapper.yaml 中的声明一致。标准属性#input-processor-cells— 必须为常量值0表示该处理器在引用处不携带任何附加参数见 ip_zero_param.yaml。用户属性type— 要处理的事件类型。通常相对移动事件用INPUT_EV_REL按键/按钮事件用INPUT_EV_KEY。事件类型与事件码的完整取值可参考 Zephyr 的input-event-codes.hINPUT_EV_REL与INPUT_EV_KEY等类型定义在 input-event-codes.h 所依赖的 Zephyr 头文件include/zephyr/dt-bindings/input/input-event-codes.h中。map— 给定类型下的具体事件码映射对列表例如相对事件码INPUT_REL_X、INPUT_REL_Y、INPUT_REL_WHEEL、INPUT_REL_HWHEEL等或按键事件码INPUT_BTN_0、INPUT_BTN_2等。该列表条目数必须是偶数按每两个一组解析为映射对每对的第一个码是源事件码source code第二个码是映射目标事件码。type与map在绑定文件中均标记为required: true即自定义实例必须同时提供这两个属性缺一不可。底层实现原理驱动入口与事件处理Code Mapper 驱动位于 input_processor_code_mapper.c通过DT_DRV_COMPAT zmk_input_processor_code_mapper绑定到设备树节点。其核心处理逻辑cm_handle_event大致如下类型过滤若事件类型不等于配置的type直接返回ZMK_INPUT_PROC_CONTINUE将事件原样交给链中下一个处理器。码查找与改写在mapping数组中按步长 2 遍历当某个偶数下标元素等于事件码时将event-code改写为紧随其后的映射目标码并记录调试日志Remapped %d to %d。继续传递无论是否发生映射均返回ZMK_INPUT_PROC_CONTINUE保证后续处理器如缩放、行为触发仍能正常处理该事件。值得注意的实现细节源码用DT_INST_PROP_OR(n, type, INPUT_EV_REL)读取type未指定时默认INPUT_EV_REL用DT_INST_PROP_LEN(n, map)读取映射条目总数并通过BUILD_ASSERT(DT_INST_PROP_LEN(n, map) % 2 0, ...)在编译期强制校验map必须为偶数条目——这正是文档中该列表条目数必须是偶数的底层保障。事件在处理器链中的流转输入监听器input_listener.c在收到事件后会调用zmk_input_processor_handle_event()把事件按input-processors属性声明的顺序依次交给每个处理器见apply_config中的循环与 input_processor.h 中的驱动 API 定义。处理器返回ZMK_INPUT_PROC_CONTINUE时继续链式传递返回ZMK_INPUT_PROC_STOP时终止处理并丢弃该事件。Code Mapper 属于只改写、不拦截型处理器因此非常适合与缩放、变换等其他处理器自由组合。Kconfig 开关Code Mapper 由 Kconfig 选项ZMK_INPUT_PROCESSOR_CODE_MAPPER控制默认开启且仅当设备树中存在启用的zmk,input-processor-code-mapper节点时才会生效见 pointing/Kconfig源码文件也仅在开启该选项时才参与编译见 pointing/CMakeLists.txt。测试用例验证仓库的自动化测试直接验证了zip_xy_swap_mapper的行为。move_diagonal_xy_swap 测试在mmv_input_listener上挂载了input-processors zip_xy_swap_mapper随后通过 mock 键盘扫描注入左上方向的对角移动事件并与预期的快照结果比对。该测试与move_diagonal、move_diagonal_xy_invert等用例共同构成对移动事件处理含映射/变换的回归保障可作为你验证自定义映射配置的参考模板。实战建议让轨迹设备变滚轮把zip_xy_to_scroll_mapper挂到监听器上或仅在某层启用即可把 X/Y 移动映射为水平/垂直滚轮滚动。竖握/横握轨迹球适配当物理设备的安装方向与逻辑坐标不一致时使用zip_xy_swap_mapper交换 X/Y 轴若还需要镜像方向可再叠加 Transformer 的取反变换。自定义按钮映射按上文示例用type INPUT_EV_KEYmap 源码 目标码实现按键重映射例如把INPUT_BTN_0左键映射为INPUT_BTN_2中键。组合使用Code Mapper 不拦截事件可放心与 Scaler、Transformer 等处理器串联实现先映射、再缩放/变换的完整处理链。记住零参数在input-processors中引用 Code Mapper 实例时不要附加任何参数#input-processor-cells 0否则设备树解析会出错。关于输入处理器与监听器的完整挂载方式、层覆盖layer override与process-next行为请继续阅读 输入处理器使用说明 与 指向功能配置。赞分享固件嵌入式智能硬件蓝牙【免费下载链接】zmkZMK Firmware Repository项目地址https://gitcode.com/gh_mirrors/zm/zmk点击查看免费下载相关推荐RedwoodJS映射器对象映射与转换的完整指南RedwoodJS映射器对象映射与转换的完整指南 RedwoodJS是一个专为初创公司设计的全栈应用框架而RedwoodRecord是其核心的 对象关系映射后端前端Web框架开发工具SkillsGate与skills.sh深度集成探索91,000公共AI技能库SkillsGate与skills.sh深度集成探索91,000公共AI技能库 SkillsGate是一款功能强大的AI技能管理工具通过与skills.s如何使用Frappe映射器数据转换处理的终极指南如何使用Frappe映射器数据转换处理的终极指南 Frappe映射器是Frappe框架中一个强大的数据转换工具它允许开发者轻松地将数据从一个文档类型映射到另后端Web框架低代码前端认证鉴权创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表