资讯动态

ZMK Scaler 输入处理器详解:用 multiplier/divisor 精确缩放指针事件数值

发布时间:2026/10/14 20:04:40 来源:尧图企业网站定制
固件嵌入式智能硬件蓝牙【免费下载链接】zmkZMK Firmware Repository项目地址https://gitcode.com/gh_mirrors/zm/zmk点击查看免费下载导读本文讲解 ZMK 固件中zmk,input-processor-scaler缩放器输入处理器的完整用法它通过乘以 multiplier、除以 divisor两个正整数参数对指定类型的输入事件数值进行缩放可用于放大或细化鼠标移动、滚轮滚动等指针事件的幅度。读完本文你将掌握其预定义实例zip_xy_scaler、zip_x_scaler、zip_y_scaler、zip_scroll_scaler的调用方式、自定义实例的 Devicetree 配置、余数跟踪track-remainders的工作原理以及源码层面的实现细节与测试验证方法。概述缩放器处理器做了什么缩放器输入处理器Scaler Input Processor的作用是对输入事件中代码code匹配处理器配置的事件数值进行缩放。缩放规则为缩放后数值 原始数值 × multiplier / divisor事件代码不匹配的事件会被直接忽略继续交给后续处理器处理。其他处理器类型如 Code Mapper、Transform各有侧重而 Scaler 专用于按比例放大或缩小这一类需求。完整的处理器清单与相互对比可参考 Input Processor 总览 与 Input Processor 使用指南。基本用法两个正整数参数使用缩放器时需要提供两个正整数参数multiplier乘数和 divisor除数。典型写法如下zip_xy_scaler 2 1这条配置将 X/Y 轴的全部移动数值翻倍。与之对应zip_xy_scaler 1 3将移动速度降为原来的三分之一使移动更精细、更易于精确定位。:::warning 参数上限为避免整数运算溢出multiplier 与 divisor 参数的最大值建议不超过16。:::这两个参数通过#input-processor-cells 2声明为两个 cellparam1、param2由调用处的input-processors属性按phandle-array形式传入。关于处理器如何挂接到输入监听器input listener以及图层级覆盖layer-specific overrides的完整规则请参阅 Input Listener 配置 中的input-processors属性说明。预定义实例ZMK 内置了四个缩放器实例定义在 app/dts/input/processors/scaler.dtsi 中均通过input/processors.dtsi见 app/dts/input/processors.dtsi随 keymap 引入引用名说明源码中的匹配目标zip_xy_scaler按相同比例缩放 X 轴与 Y 轴数值INPUT_REL_X INPUT_REL_Yzip_x_scaler仅缩放 X 轴数值INPUT_REL_Xzip_y_scaler仅缩放 Y 轴数值INPUT_REL_Yzip_scroll_scaler缩放滚轮与水平滚轮数值INPUT_REL_WHEEL INPUT_REL_HWHEEL从 app/dts/input/processors/scaler.dtsi 的定义可以看出四个实例统一配置为type INPUT_EV_REL相对事件并且都开启了track-remainders;保证连续缩放时不会因整除截断而累积误差。四个节点均带/omit-if-no-ref/前缀只有被 keymap 或 overlay 实际引用时才会编译进固件。预定义实例的典型挂接方式把缩放器加到鼠标移动监听器上#include input/processors.dtsi mmv_input_listener { input-processors zip_xy_scaler 3 2; };自定义实例针对其他事件代码当预定义实例覆盖的代码X/Y 轴、滚轮不满足需求时可以自定义新的缩放器实例。自定义示例#include zephyr/dt-bindings/input/input-event-codes.h / { input_processors { zip_wheel_scaler: zip_wheel_scaler { compatible zmk,input-processor-scaler; #input-processor-cells 2; type INPUT_EV_REL; codes INPUT_REL_WHEEL; track-remainders; }; }; }定义后即可在监听器中使用input-processors zip_wheel_scaler 2 1;。compatible 属性自定义缩放器使用compatible zmk,input-processor-scaler其 schema 定义在 app/dts/bindings/input_processors/zmk,input-processor-scaler.yamltypeint必填要缩放的事件类型codesarray必填该类型下需要缩放的具体事件代码列表。标准属性属性说明#input-processor-cells必须恒为2即调用时携带 multiplier、divisor 两个参数track-remainders布尔标志指示调用方允许处理器在事件之间跟踪余数避免整除截断造成累计误差#input-processor-cells 2与两个 cellparam1/param2的约束定义在 app/dts/bindings/input_processors/ip_two_param.yaml 中。用户自定义属性属性说明type要缩放的事件类型通常是INPUT_EV_REL相对事件相关事件类型常量定义于 Zephyr 的input-event-codes.h头文件codes指定type内具体要缩放的事件代码例如相对事件代码INPUT_REL_X、INPUT_REL_Y、INPUT_REL_WHEEL、INPUT_REL_HWHEEL等自定义实例可自由组合type与codes例如只对水平滚轮INPUT_REL_HWHEEL单独缩放或对混合代码集合统一缩放从而精细控制不同输入通道的灵敏度。源码原理缩放、匹配与余数跟踪缩放器的核心实现位于 app/src/pointing/input_processor_scaler.c其驱动兼容符为zmk_input_processor_scaler。事件匹配逻辑scaler_handle_event首先比对事件类型event-type ! cfg-type与事件代码遍历cfg-codes只有类型与代码都匹配的事件才会进入缩放流程不匹配时返回ZMK_INPUT_PROC_CONTINUE表示继续交给后续处理器处理。这与文档其他代码的事件会被忽略的描述一致。缩放计算与余数跟踪scale_val函数完成实际运算int16_t value_mul event-value * (int16_t)mul; // 先乘 if (state state-remainder) { value_mul *state-remainder; // 累加上一次遗留的余数 } int16_t scaled value_mul / (int16_t)div; // 再除 if (state state-remainder) { *state-remainder value_mul - (scaled * (int16_t)div); // 保存本次余数 } event-value scaled;要点先乘后除value × multiplier ÷ divisor的顺序避免了先除再乘造成的精度损失余数跟踪当处理器配置了track-remainders且状态中提供了remainder指针时每次整除的余数会被保存并在下一次缩放时累加。例如5 3缩放连续事件时1 → 1(余2) → 2(余1) → 2的累计结果比逐次截断更精确返回 0匹配成功即返回 0表示事件已被本处理器处理即ZMK_INPUT_PROC_STOP语义后续处理器不再处理该事件。驱动 API 的类型定义与ZMK_INPUT_PROC_CONTINUE/ZMK_INPUT_PROC_STOP常量可参见 app/include/drivers/input_processor.h其中还包含处理器条目如何从 Devicetree 解析param1/param2以及track_remainders的宏。测试验证对角线缩放的实测快照仓库内置了两组针对缩放器的回归测试可直接验证行为鼠标移动缩放app/tests/pointing/mouse-move/processors/move_diagonal_scaling/ 使用zip_xy_scaler 5 3见其native_sim.keymap模拟左右移动与向上移动事件滚轮缩放app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/ 使用zip_scroll_scaler 6 2对垂直/水平滚轮事件进行缩放。其keycode_events.snapshot快照展示了缩放后的实际输出例如移动测试中输出movement_set: Mouse movement set to -5/-5等结果序列。结合 app/tests/pointing/mouse-move/processors/move_diagonal_scaling/native_sim.conf 中的CONFIG_ZMK_POINTINGy配置这些测试以 native_sim 目标运行是理解缩放器在真实事件流中行为的第一手证据。使用建议与注意事项参数范围multiplier 与 divisor 使用正整数的同时最大值建议不超过 16防止int16_t中间结果溢出余数跟踪自定义实例建议保留track-remainders;尤其是需要连续平滑缩放如持续按住移动键的场景否则每次取整误差会累积匹配范围type与codes决定了处理器影响哪些事件zip_xy_scaler这类组合实例同时覆盖多个代码而单轴实例zip_x_scaler/zip_y_scaler可用于非对称灵敏度调整结合图层覆盖缩放器可与输入监听器的 layer-specific overrides 配合见 Input Listener 配置在不同图层使用不同缩放比例例如按住特定层时切换为精细模式组合使用缩放器可与 Code Mapper、Transform 等其他输入处理器串联按列表顺序依次作用于同一事件流。赞分享固件嵌入式智能硬件蓝牙【免费下载链接】zmkZMK Firmware Repository项目地址https://gitcode.com/gh_mirrors/zm/zmk点击查看免费下载相关推荐OpenTiny TinyEngine 数字输入数值精确输入控制OpenTiny TinyEngine 数字输入数值精确输入控制 前言为什么需要专业的数字输入控制 在低代码开发平台中数字输入是最基础也是最关键的交互组低代码前端AI 应用代码生成ZMK 指向设备Pointing Devices功能全解析鼠标仿真、物理指针硬件与输入处理器配置指南ZMK 指向设备Pointing Devices功能全解析鼠标仿真、物理指针硬件与输入处理器配置指南 ZMK 固件当前仓库为 ZMK Firmware固件嵌入式智能硬件蓝牙三步永久保存微信聊天记录WeChatMsg让珍贵记忆永不丢失三步永久保存微信聊天记录WeChatMsg让珍贵记忆永不丢失 你是否曾为那些转瞬即逝的微信对话感到惋惜从深夜与挚友的谈心到家人间的温馨问候从工作的重要决创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑