[Core] PMW33XX drivers overhaul (#17613)
* PMW33XX drivers overhaul This combines the PMW3389 and PM3360 drivers as they only differ in the firmware blobs and CPI get and set functions. The following changes have been made: * PMW3389 now gets the same multi-sensor feature that is already available on the PMW3360. * Introduced a shared pmw33xx_report_t struct is now directly readable via SPI transactions instead of individual byte-sized reads, saving multiple copies and bitshift operations. * pmw33(89/60)_get_report functions had unreachable branches in their motion detection logic these have been simplied as much as possible. * The fast firmware upload option has been removed as this becomes obsolete by the newly introduced polled waiting functions for ChibiOS polled waiting * PMW33(60/89)_SPI_LSBFIRST and PMW33(60/89)_SPI_MODE config options have been removed as they don't need to be configurable. * All PMW3389 and PMW3360 defines have been unified to a PMW33XX prefix to reduce code duplication and make the defines interchangeable * Adjust keyboards to PMW33XX naming scheme
This commit is contained in:
parent
82685fc2ac
commit
3c58f98929
26 changed files with 1179 additions and 1456 deletions
|
@ -257,81 +257,48 @@ const pointing_device_driver_t pointing_device_driver = {
|
|||
};
|
||||
// clang-format on
|
||||
|
||||
#elif defined(POINTING_DEVICE_DRIVER_pmw3360)
|
||||
static void pmw3360_device_init(void) {
|
||||
pmw3360_init(0);
|
||||
#elif defined(POINTING_DEVICE_DRIVER_pmw3360) || defined(POINTING_DEVICE_DRIVER_pmw3389)
|
||||
static void pmw33xx_init_wrapper(void) {
|
||||
pmw33xx_init(0);
|
||||
}
|
||||
|
||||
report_mouse_t pmw3360_get_report(report_mouse_t mouse_report) {
|
||||
report_pmw3360_t data = pmw3360_read_burst(0);
|
||||
static uint16_t MotionStart = 0; // Timer for accel, 0 is resting state
|
||||
static void pmw33xx_set_cpi_wrapper(uint16_t cpi) {
|
||||
pmw33xx_set_cpi(0, cpi);
|
||||
}
|
||||
|
||||
if (data.isOnSurface && data.isMotion) {
|
||||
// Reset timer if stopped moving
|
||||
if (!data.isMotion) {
|
||||
if (MotionStart != 0) MotionStart = 0;
|
||||
return mouse_report;
|
||||
}
|
||||
static uint16_t pmw33xx_get_cpi_wrapper(void) {
|
||||
return pmw33xx_get_cpi(0);
|
||||
}
|
||||
|
||||
// Set timer if new motion
|
||||
if ((MotionStart == 0) && data.isMotion) {
|
||||
# ifdef CONSOLE_ENABLE
|
||||
if (debug_mouse) dprintf("Starting motion.\n");
|
||||
# endif
|
||||
MotionStart = timer_read();
|
||||
}
|
||||
mouse_report.x = CONSTRAIN_HID_XY(data.dx);
|
||||
mouse_report.y = CONSTRAIN_HID_XY(data.dy);
|
||||
report_mouse_t pmw33xx_get_report(report_mouse_t mouse_report) {
|
||||
pmw33xx_report_t report = pmw33xx_read_burst(0);
|
||||
static bool in_motion = false;
|
||||
|
||||
if (report.motion.b.is_lifted) {
|
||||
return mouse_report;
|
||||
}
|
||||
|
||||
if (!report.motion.b.is_motion) {
|
||||
in_motion = false;
|
||||
return mouse_report;
|
||||
}
|
||||
|
||||
if (!in_motion) {
|
||||
in_motion = true;
|
||||
dprintf("PWM3360 (0): starting motion\n");
|
||||
}
|
||||
|
||||
mouse_report.x = CONSTRAIN_HID_XY(report.delta_x);
|
||||
mouse_report.y = CONSTRAIN_HID_XY(report.delta_y);
|
||||
return mouse_report;
|
||||
}
|
||||
|
||||
// clang-format off
|
||||
const pointing_device_driver_t pointing_device_driver = {
|
||||
.init = pmw3360_device_init,
|
||||
.get_report = pmw3360_get_report,
|
||||
.set_cpi = pmw3360_set_cpi,
|
||||
.get_cpi = pmw3360_get_cpi
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
#elif defined(POINTING_DEVICE_DRIVER_pmw3389)
|
||||
static void pmw3389_device_init(void) {
|
||||
pmw3389_init();
|
||||
}
|
||||
|
||||
report_mouse_t pmw3389_get_report(report_mouse_t mouse_report) {
|
||||
report_pmw3389_t data = pmw3389_read_burst();
|
||||
static uint16_t MotionStart = 0; // Timer for accel, 0 is resting state
|
||||
|
||||
if (data.isOnSurface && data.isMotion) {
|
||||
// Reset timer if stopped moving
|
||||
if (!data.isMotion) {
|
||||
if (MotionStart != 0) MotionStart = 0;
|
||||
return mouse_report;
|
||||
}
|
||||
|
||||
// Set timer if new motion
|
||||
if ((MotionStart == 0) && data.isMotion) {
|
||||
# ifdef CONSOLE_ENABLE
|
||||
if (debug_mouse) dprintf("Starting motion.\n");
|
||||
# endif
|
||||
MotionStart = timer_read();
|
||||
}
|
||||
mouse_report.x = CONSTRAIN_HID_XY(data.dx);
|
||||
mouse_report.y = CONSTRAIN_HID_XY(data.dy);
|
||||
}
|
||||
|
||||
return mouse_report;
|
||||
}
|
||||
|
||||
// clang-format off
|
||||
const pointing_device_driver_t pointing_device_driver = {
|
||||
.init = pmw3389_device_init,
|
||||
.get_report = pmw3389_get_report,
|
||||
.set_cpi = pmw3389_set_cpi,
|
||||
.get_cpi = pmw3389_get_cpi
|
||||
.init = pmw33xx_init_wrapper,
|
||||
.get_report = pmw33xx_get_report,
|
||||
.set_cpi = pmw33xx_set_cpi_wrapper,
|
||||
.get_cpi = pmw33xx_get_cpi_wrapper
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue