Bugfixes and improvements:
========================== Added 1000 Hz polling. (Hopefully) fixed Logitech mouse issues Removed special treatment for 12 and 16-bit mice Increased mouse queue size Increased current allowance from 100mA to 500mA Allow mouse to wake up a suspended host Added memory usage print to build Updated README - Added link to troubleshooting wiki - Mouse polling rate chart - Updated known issues - Updates about possible PCB/assembly ordering
This commit is contained in:
parent
73a83b72e3
commit
de3cb4dba7
|
@ -86,3 +86,13 @@ target_link_libraries(board_B PUBLIC ${COMMON_LINK_LIBRARIES})
|
||||||
|
|
||||||
pico_enable_stdio_usb(board_B 0)
|
pico_enable_stdio_usb(board_B 0)
|
||||||
pico_add_extra_outputs(board_B)
|
pico_add_extra_outputs(board_B)
|
||||||
|
|
||||||
|
target_link_options(board_A PRIVATE
|
||||||
|
-Xlinker
|
||||||
|
--print-memory-usage
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_options(board_B PRIVATE
|
||||||
|
-Xlinker
|
||||||
|
--print-memory-usage
|
||||||
|
)
|
||||||
|
|
21
README.md
21
README.md
|
@ -140,8 +140,7 @@ USB-A connector can be Molex MX-67643-0910 or a cheaper/budget one that shares t
|
||||||
|
|
||||||
Additional steps:
|
Additional steps:
|
||||||
|
|
||||||
- making the PCB ([Gerber provided](pcb/), JLC does it for a few bucks, choose 1.6 mm thickness)
|
- making the PCB ([Gerber provided](pcb/), choose 1.6 mm thickness)
|
||||||
|
|
||||||
- 3d printing the case ([stl files provided](case/), ~33g filament)
|
- 3d printing the case ([stl files provided](case/), ~33g filament)
|
||||||
|
|
||||||
## Assembly guide
|
## Assembly guide
|
||||||
|
@ -166,6 +165,10 @@ The standard process to do that is using isopropyl alcohol and an old toothbrush
|
||||||
|
|
||||||
*I'm not selling anything, this is just a personal, non-commercial hobby project.*
|
*I'm not selling anything, this is just a personal, non-commercial hobby project.*
|
||||||
|
|
||||||
|
[update] There is a manufacturing/assembly company in China that might offer PCBs in qty of 1, assembled boards and boards + case, so stay tuned.
|
||||||
|
|
||||||
|
I **don't want to take any commission** on this - the only goal is to provide an alternative for people who don't feel confident enough to assemble the boards themselves.
|
||||||
|
|
||||||
4. When the active screen is changed via the mouse, does the keyboard follow (and vice versa)?
|
4. When the active screen is changed via the mouse, does the keyboard follow (and vice versa)?
|
||||||
|
|
||||||
Yes, the idea was to make it behave like it was one single computer.
|
Yes, the idea was to make it behave like it was one single computer.
|
||||||
|
@ -178,6 +181,10 @@ Not with the current version, but there is work ongoing to add support. Testing
|
||||||
|
|
||||||
It should work - tried an Anker wireless mouse with a separate receiver and that worked just fine.
|
It should work - tried an Anker wireless mouse with a separate receiver and that worked just fine.
|
||||||
|
|
||||||
|
7. I have issues with build or compilation
|
||||||
|
|
||||||
|
Check out the [Troubleshooting Wiki](https://github.com/hrvach/deskhop/wiki/Troubleshooting) that might have some answers.
|
||||||
|
|
||||||
## Software Alternatives
|
## Software Alternatives
|
||||||
|
|
||||||
There are several software alternatives you can use if that works in your particular situation.
|
There are several software alternatives you can use if that works in your particular situation.
|
||||||
|
@ -190,9 +197,11 @@ There are several software alternatives you can use if that works in your partic
|
||||||
|
|
||||||
## Shortcomings
|
## Shortcomings
|
||||||
|
|
||||||
- Slow mouse movement reported for modern mice with 16-bit x/y values. Can't reproduce with my 2$ mouse, ordered a better one so once it arrives, I'll hopefully be able to recreate and fix. Apologies and thanks for understanding!
|
- Slow mouse movement with some devices.
|
||||||
|
- Windows 10 broke HID absolute coordinates behavior in KB5003637, so you can't use more than 1 screen on Windows (mouse will stay on the main screen).
|
||||||
|
- If you have more than one display, the mouse is faster in the X direction on that machine. Will get fixed with per-output configurable speed settings.
|
||||||
- Code needs cleanup, some refactoring etc.
|
- Code needs cleanup, some refactoring etc.
|
||||||
- Occasional bugs and weird behavior.
|
- Occasional bugs and weird behavior.
|
||||||
- Not tested with a wide variety of devices, I don't know how it will work with your hardware. There is a reasonable chance things might not work out-of-the-box.
|
- Not tested with a wide variety of devices, I don't know how it will work with your hardware. There is a reasonable chance things might not work out-of-the-box.
|
||||||
- NOTE: Both computers need to be connected and powered on for this to work (as each board gets powered by the computer it plugs into).
|
- NOTE: Both computers need to be connected and powered on for this to work (as each board gets powered by the computer it plugs into).
|
||||||
|
|
||||||
|
@ -210,6 +219,10 @@ Planned features:
|
||||||
- Unified firmware for both Picos
|
- Unified firmware for both Picos
|
||||||
- ... and more!
|
- ... and more!
|
||||||
|
|
||||||
|
Mouse polling should now work at 1000 Hz (the dips in the graph is my arm hurting from all the movement :-)):
|
||||||
|
|
||||||
|
![Mouse polling rate](img/polling_rate.png)
|
||||||
|
|
||||||
## Disclaimer
|
## Disclaimer
|
||||||
|
|
||||||
I kindly request that anyone attempting to build this project understands and acknowledges that I am not liable for any injuries, damages, or other consequences. Your safety is important, and I encourage you to approach this project carefully, taking necessary precautions and assuming personal responsibility for your well-being throughout the process. Please don't get electrocuted, burned, stressed or angry. Have fun and enjoy!
|
I kindly request that anyone attempting to build this project understands and acknowledges that I am not liable for any injuries, damages, or other consequences. Your safety is important, and I encourage you to approach this project carefully, taking necessary precautions and assuming personal responsibility for your well-being throughout the process. Please don't get electrocuted, burned, stressed or angry. Have fun and enjoy!
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 33 KiB |
|
@ -124,7 +124,7 @@ typedef struct {
|
||||||
#define RAW_PACKET_LENGTH (START_LENGTH + PACKET_LENGTH)
|
#define RAW_PACKET_LENGTH (START_LENGTH + PACKET_LENGTH)
|
||||||
|
|
||||||
#define KBD_QUEUE_LENGTH 128
|
#define KBD_QUEUE_LENGTH 128
|
||||||
#define MOUSE_QUEUE_LENGTH 256
|
#define MOUSE_QUEUE_LENGTH 2048
|
||||||
|
|
||||||
#define KEYS_IN_USB_REPORT 6
|
#define KEYS_IN_USB_REPORT 6
|
||||||
#define KBD_REPORT_LENGTH 8
|
#define KBD_REPORT_LENGTH 8
|
||||||
|
|
26
src/mouse.c
26
src/mouse.c
|
@ -96,30 +96,12 @@ void extract_values_report_protocol(uint8_t* report,
|
||||||
values->move_y = get_report_value(report, &state->mouse_dev.move_y);
|
values->move_y = get_report_value(report, &state->mouse_dev.move_y);
|
||||||
values->wheel = get_report_value(report, &state->mouse_dev.wheel);
|
values->wheel = get_report_value(report, &state->mouse_dev.wheel);
|
||||||
values->buttons = get_report_value(report, &state->mouse_dev.buttons);
|
values->buttons = get_report_value(report, &state->mouse_dev.buttons);
|
||||||
|
|
||||||
/* Mice generally come in 3 categories - 8-bit, 12-bit and 16-bit. */
|
|
||||||
switch (state->mouse_dev.move_x.size) {
|
|
||||||
case 12:
|
|
||||||
/* If we're already 12 bit, great! */
|
|
||||||
break;
|
|
||||||
case 16:
|
|
||||||
/* Initially we downscale fancy mice to 12-bits,
|
|
||||||
adding a 32-bit internal coordinate tracking is TODO */
|
|
||||||
values->move_x >>= 4;
|
|
||||||
values->move_y >>= 4;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* 8-bit is the default, upscale to 12-bit. */
|
|
||||||
values->move_x <<= 4;
|
|
||||||
values->move_y <<= 4;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void extract_values_boot_protocol(uint8_t* report, device_state_t* state, mouse_values_t* values) {
|
void extract_values_boot_protocol(uint8_t* report, device_state_t* state, mouse_values_t* values) {
|
||||||
hid_mouse_report_t* mouse_report = (hid_mouse_report_t*)report;
|
hid_mouse_report_t* mouse_report = (hid_mouse_report_t*)report;
|
||||||
/* For 8-bit values, we upscale them to 12-bit, TODO: 16 bit */
|
values->move_x = mouse_report->x;
|
||||||
values->move_x = mouse_report->x << 4;
|
values->move_y = mouse_report->y;
|
||||||
values->move_y = mouse_report->y << 4;
|
|
||||||
values->wheel = mouse_report->wheel;
|
values->wheel = mouse_report->wheel;
|
||||||
values->buttons = mouse_report->buttons;
|
values->buttons = mouse_report->buttons;
|
||||||
}
|
}
|
||||||
|
@ -171,6 +153,10 @@ void process_mouse_queue_task(device_state_t* state) {
|
||||||
if (!queue_try_peek(&state->mouse_queue, &report))
|
if (!queue_try_peek(&state->mouse_queue, &report))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* If we are suspended, let's wake the host up */
|
||||||
|
if(tud_suspended())
|
||||||
|
tud_remote_wakeup();
|
||||||
|
|
||||||
/* ... try sending it to the host, if it's successful */
|
/* ... try sending it to the host, if it's successful */
|
||||||
bool succeeded = tud_hid_abs_mouse_report(REPORT_ID_MOUSE, report.buttons, report.x, report.y,
|
bool succeeded = tud_hid_abs_mouse_report(REPORT_ID_MOUSE, report.buttons, report.x, report.y,
|
||||||
report.wheel, report.pan);
|
report.wheel, report.pan);
|
||||||
|
|
|
@ -107,7 +107,7 @@ uint8_t const desc_configuration[] = {
|
||||||
0,
|
0,
|
||||||
CONFIG_TOTAL_LEN,
|
CONFIG_TOTAL_LEN,
|
||||||
TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP,
|
TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP,
|
||||||
100),
|
500),
|
||||||
|
|
||||||
// Interface number, string index, protocol, report descriptor len, EP In address, size &
|
// Interface number, string index, protocol, report descriptor len, EP In address, size &
|
||||||
// polling interval
|
// polling interval
|
||||||
|
@ -117,7 +117,7 @@ uint8_t const desc_configuration[] = {
|
||||||
sizeof(desc_hid_report),
|
sizeof(desc_hid_report),
|
||||||
EPNUM_HID,
|
EPNUM_HID,
|
||||||
CFG_TUD_HID_EP_BUFSIZE,
|
CFG_TUD_HID_EP_BUFSIZE,
|
||||||
5)};
|
1)};
|
||||||
|
|
||||||
#if TUD_OPT_HIGH_SPEED
|
#if TUD_OPT_HIGH_SPEED
|
||||||
// Per USB specs: high speed capable device must report device_qualifier and
|
// Per USB specs: high speed capable device must report device_qualifier and
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
*
|
*
|
||||||
* */
|
* */
|
||||||
|
|
||||||
#define MOUSE_SPEED_FACTOR_X 1
|
#define MOUSE_SPEED_FACTOR_X 16
|
||||||
#define MOUSE_SPEED_FACTOR_Y 1
|
#define MOUSE_SPEED_FACTOR_Y 16
|
||||||
|
|
||||||
#define MOUSE_JUMP_THRESHOLD 0
|
#define MOUSE_JUMP_THRESHOLD 0
|
||||||
|
|
Loading…
Reference in New Issue