diff options
| author | Nicolas James <Eele1Ephe7uZahRie@tutanota.com> | 2025-04-14 13:32:55 +1000 |
|---|---|---|
| committer | Nicolas James <Eele1Ephe7uZahRie@tutanota.com> | 2025-04-14 13:32:55 +1000 |
| commit | 1249653b654bca6caaecc407a2128c4f1ccabd52 (patch) | |
| tree | 444622eb6c90217c54a2beb6044db1a68a38f495 /src | |
| parent | 12ad6ebd615f57b7b1032953ab9ea9b29ca1bc87 (diff) | |
Move impl to header single file, fix linking etc
Diffstat (limited to 'src')
| -rw-r--r-- | src/fastmouse.h | 184 | ||||
| -rw-r--r-- | src/linux/hid-core.c | 2 | ||||
| -rw-r--r-- | src/linux/hid-input.c | 148 | ||||
| -rwxr-xr-x | src/make_kernel.sh | 1 | ||||
| -rwxr-xr-x | src/make_patch.sh | 4 |
5 files changed, 194 insertions, 145 deletions
diff --git a/src/fastmouse.h b/src/fastmouse.h index f1ee96a..2383de8 100644 --- a/src/fastmouse.h +++ b/src/fastmouse.h @@ -1,5 +1,189 @@ #ifndef FASTMOUSE_H_ #define FASTMOUSE_H_ +// Mock functionality and structs for user space unit tests. +#ifndef __KERNEL__ +#include <climits> + +typedef int __s32; +struct input_dev {}; +enum event_type { + EV_REL, +}; +enum movement_type { + REL_X, + REL_Y, +}; +struct mouse_movement { + int x = 0; + int y = 0; +}; +static struct mouse_movement movement = { + .x = 0, + .y = 0, +}; +static void input_event(input_dev*, event_type, movement_type code, int value) { + movement.x += (code == REL_X) * value; + movement.y += (code == REL_Y) * value; +} +#endif + +extern void input_event_fastmouse_log( + struct input_dev*, + const unsigned int, + const unsigned int code, + __s32 value); +extern void fastmouse_input_emit(struct input_dev *input); + +struct fastmouse_state { + int division; + long frame_x, frame_y; + long accum_x, accum_y; + int rise, run; + /* TODO + int polling_rate; + long accel; + */ +}; + +/* TODO (for accel) +static unsigned __int128 i128_sqrt(const unsigned __int128 v) { + unsigned __int128 left = 0; + unsigned __int128 right = v; + while (left < right) { + const unsigned __int128 mid = left + ((right - left) / 2); + if (mid >= ~(u64)0 || mid * mid > v) { + right = mid; + } else if (mid * mid == v) { + return mid; + } else { + left = mid + 1; + } + } + return left != 0 ? left - 1 : 0; +} +*/ + +#ifdef FASTMOUSE_IMPL +static struct fastmouse_state fastmouse = { + .division = 1, + .frame_x = 0, + .frame_y = 0, + .accum_x = 0, + .accum_y = 0, + .rise = 0, + .run = INT_MAX, + /* TODO + .polling_rate = 4000, + .accel = 1, + */ +}; + +void input_event_fastmouse_log( + struct input_dev*, + const unsigned int, + const unsigned int code, + __s32 value) { + fastmouse.frame_x += (code == REL_X) * value; + fastmouse.frame_y += (code == REL_Y) * value; +} + +void fastmouse_input_emit(struct input_dev *input) { + const long rise = fastmouse.rise / fastmouse.division; + const long run = fastmouse.run / fastmouse.division; + + fastmouse.accum_x += fastmouse.frame_x * run - fastmouse.frame_y * rise; + fastmouse.accum_y += fastmouse.frame_x * rise + fastmouse.frame_y * run; + + const long emit_x = fastmouse.accum_x / INT_MAX; + if (emit_x != 0) { + input_event(input, EV_REL, REL_X, (__s32)emit_x); + } + const long emit_y = fastmouse.accum_y / INT_MAX; + if (emit_y != 0) { + input_event(input, EV_REL, REL_Y, (__s32)emit_y); + } + fastmouse.accum_x %= INT_MAX; + fastmouse.accum_y %= INT_MAX; + + fastmouse.frame_x = fastmouse.frame_y = 0; +} + +#ifdef __KERNEL__ +#include <linux/moduleparam.h> + +static int set_division(const char *val, const struct kernel_param *kp) { + const int ret = kstrtoint(val, 0, &fastmouse.division); + if (ret != 0 || fastmouse.division <= 0) { + return -EINVAL; + } + return ret; +} +static const struct kernel_param_ops division_ops = { + .set = set_division, + .get = param_get_int, +}; +module_param_cb(division, &division_ops, &fastmouse.division, 0664); +MODULE_PARM_DESC(division, "Mouse movement division amount (default: 1)"); + +static int set_rise(const char *val, const struct kernel_param *kp) { + const int ret = kstrtoint(val, 0, &fastmouse.rise); + if (ret != 0) { + return -EINVAL; + } + return ret; +} +static const struct kernel_param_ops rise_ops = { + .set = set_rise, + .get = param_get_int, +}; +module_param_cb(rise, &rise_ops, &fastmouse.rise, 0664); +MODULE_PARM_DESC(rise, "Mouse movement rise amount (default: 0)"); + +static int set_run(const char *val, const struct kernel_param *kp) { + const int ret = kstrtoint(val, 0, &fastmouse.run); + if (ret != 0) { + return -EINVAL; + } + return ret; +} +static const struct kernel_param_ops run_ops = { + .set = set_run, + .get = param_get_int, +}; +module_param_cb(run, &run_ops, &fastmouse.run, 0664); +MODULE_PARM_DESC(run, "Mouse movement run amount (default: INT_MAX)"); + +/* TODO +static int set_polling_rate(const char *val, const struct kernel_param *kp) { + const int ret = kstrtoint(val, 0, &fastmouse.polling_rate); + if (ret != 0) { + return -EINVAL; + } + return ret; +} +static const struct kernel_param_ops poll_ops = { + .set = set_polling_rate, + .get = param_get_int, +}; +module_param_cb(polling_rate, &poll_ops, &fastmouse.polling_rate, 0664); +MODULE_PARM_DESC(polling_rate, "Mouse polling rate (default: 4000)"); + +static int set_accel(const char *val, const struct kernel_param *kp) { + const int ret = kstrtol(val, 0, &fastmouse.accel); + if (ret != 0) { + return -EINVAL; + } + return ret; +} +static const struct kernel_param_ops accel_ops = { + .set = set_accel, + .get = param_get_int, +}; +module_param_cb(acceleration, &accel_ops, &fastmouse.accel, 0664); +MODULE_PARM_DESC(acceleration, "Mouse acceleration (default: 1)"); +*/ +#endif +#endif #endif
\ No newline at end of file diff --git a/src/linux/hid-core.c b/src/linux/hid-core.c index 5a64a10..9dc8422 100644 --- a/src/linux/hid-core.c +++ b/src/linux/hid-core.c @@ -35,6 +35,8 @@ #include "hid-ids.h" +#include "fastmouse.h" + /* * Version Information */ diff --git a/src/linux/hid-input.c b/src/linux/hid-input.c index 56e1bb7..552bb63 100644 --- a/src/linux/hid-input.c +++ b/src/linux/hid-input.c @@ -14,7 +14,6 @@ */ #include <linux/module.h> -#include <linux/moduleparam.h> #include <linux/slab.h> #include <linux/kernel.h> @@ -23,6 +22,10 @@ #include "hid-ids.h" +#define FASTMOUSE_IMPL +#include "fastmouse.h" +#undef FASTMOUSE_IMPL + #define unk KEY_UNKNOWN static const unsigned char hid_keyboard[256] = { @@ -1506,149 +1509,6 @@ static void hid_report_set_tool(struct hid_report *report, struct input_dev *inp report->tool = new_tool; } -struct fastmouse_state { - int division; - long frame_x, frame_y; - long accum_x, accum_y; - int rise, run; - /* TODO - int polling_rate; - long accel; - */ -}; -static struct fastmouse_state fastmouse = { - .division = 1, - .frame_x = 0, - .frame_y = 0, - .accum_x = 0, - .accum_y = 0, - .rise = 0, - .run = INT_MAX, - /* TODO - .polling_rate = 4000, - .accel = 1, - */ -}; - -static int set_division(const char *val, const struct kernel_param *kp) { - const int ret = kstrtoint(val, 0, &fastmouse.division); - if (ret != 0 || fastmouse.division <= 0) { - return -EINVAL; - } - return ret; -} -static const struct kernel_param_ops division_ops = { - .set = set_division, - .get = param_get_int, -}; -module_param_cb(division, &division_ops, &fastmouse.division, 0664); -MODULE_PARM_DESC(division, "Mouse movement division amount (default: 1)"); - -static int set_rise(const char *val, const struct kernel_param *kp) { - const int ret = kstrtoint(val, 0, &fastmouse.rise); - if (ret != 0) { - return -EINVAL; - } - return ret; -} -static const struct kernel_param_ops rise_ops = { - .set = set_rise, - .get = param_get_int, -}; -module_param_cb(rise, &rise_ops, &fastmouse.rise, 0664); -MODULE_PARM_DESC(rise, "Mouse movement rise amount (default: 0)"); - -static int set_run(const char *val, const struct kernel_param *kp) { - const int ret = kstrtoint(val, 0, &fastmouse.run); - if (ret != 0) { - return -EINVAL; - } - return ret; -} -static const struct kernel_param_ops run_ops = { - .set = set_run, - .get = param_get_int, -}; -module_param_cb(run, &run_ops, &fastmouse.run, 0664); -MODULE_PARM_DESC(run, "Mouse movement run amount (default: INT_MAX)"); - -/* TODO -static int set_polling_rate(const char *val, const struct kernel_param *kp) { - const int ret = kstrtoint(val, 0, &fastmouse.polling_rate); - if (ret != 0) { - return -EINVAL; - } - return ret; -} -static const struct kernel_param_ops poll_ops = { - .set = set_polling_rate, - .get = param_get_int, -}; -module_param_cb(polling_rate, &poll_ops, &fastmouse.polling_rate, 0664); -MODULE_PARM_DESC(polling_rate, "Mouse polling rate (default: 4000)"); - -static int set_accel(const char *val, const struct kernel_param *kp) { - const int ret = kstrtol(val, 0, &fastmouse.accel); - if (ret != 0) { - return -EINVAL; - } - return ret; -} -static const struct kernel_param_ops accel_ops = { - .set = set_accel, - .get = param_get_int, -}; -module_param_cb(acceleration, &accel_ops, &fastmouse.accel, 0664); -MODULE_PARM_DESC(acceleration, "Mouse acceleration (default: 1)"); -*/ - -static void input_event_fastmouse_log( - struct input_dev *input, - const unsigned int type, - const unsigned int code, - __s32 value) { - fastmouse.frame_x += (code == REL_X) * value; - fastmouse.frame_y += (code == REL_Y) * value; -} - -/* TODO (for accel) -static unsigned __int128 i128_sqrt(const unsigned __int128 v) { - unsigned __int128 left = 0; - unsigned __int128 right = v; - while (left < right) { - const unsigned __int128 mid = left + ((right - left) / 2); - if (mid >= ~(u64)0 || mid * mid > v) { - right = mid; - } else if (mid * mid == v) { - return mid; - } else { - left = mid + 1; - } - } - return left != 0 ? left - 1 : 0; -} -*/ - -void fastmouse_input_emit(struct input_dev *input) { - const long rise = fastmouse.rise / fastmouse.division; - const long run = fastmouse.run / fastmouse.division; - - fastmouse.accum_x += fastmouse.frame_x * run - fastmouse.frame_y * rise; - fastmouse.accum_y += fastmouse.frame_x * rise + fastmouse.frame_y * run; - - const long emit_x = fastmouse.accum_x / INT_MAX; - if (emit_x != 0) { - input_event(input, EV_REL, REL_X, emit_x); - } - const long emit_y = fastmouse.accum_y / INT_MAX; - if (emit_y != 0) { - input_event(input, EV_REL, REL_Y, emit_y); - } - fastmouse.accum_x %= INT_MAX; - fastmouse.accum_y %= INT_MAX; - - fastmouse.frame_x = fastmouse.frame_y = 0; -} void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct hid_usage *usage, __s32 value) { diff --git a/src/make_kernel.sh b/src/make_kernel.sh index 8700351..64b3527 100755 --- a/src/make_kernel.sh +++ b/src/make_kernel.sh @@ -3,6 +3,7 @@ set -xe cp ./src/linux/* ./linux/drivers/hid/ +cp ./src/fastmouse.h ./linux/drivers/hid/ cd ./linux make -j$(nproc) diff --git a/src/make_patch.sh b/src/make_patch.sh index 58c946e..2aa27c0 100755 --- a/src/make_patch.sh +++ b/src/make_patch.sh @@ -3,7 +3,9 @@ set -xe cp ./src/linux/* ./linux/drivers/hid/ +cp ./src/fastmouse.h ./linux/drivers/hid/ cd ./linux +git add --intent-to-add ./drivers/hid/fastmouse.h git diff > ../fastmouse.patch -exit 0
\ No newline at end of file +exit 0 |
