From b00f03537d164e99f91c0e176557c71d677ceccf Mon Sep 17 00:00:00 2001 From: FearlessSpiff Date: Sun, 12 Nov 2023 21:08:13 +0000 Subject: [PATCH] first working (unoptimized) poller version tested with i2c only --- .../shields/splitkb_aurora_corne/trackpad.c | 22 ++++++++++++-- app/module/drivers/sensor/pinnacle/pinnacle.c | 30 +++++++++++++++---- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/app/boards/shields/splitkb_aurora_corne/trackpad.c b/app/boards/shields/splitkb_aurora_corne/trackpad.c index d55e8eeccca..ca79b860cee 100644 --- a/app/boards/shields/splitkb_aurora_corne/trackpad.c +++ b/app/boards/shields/splitkb_aurora_corne/trackpad.c @@ -2,22 +2,29 @@ #include #include +#include +#include #include #include #include #define SCROLL_DIV_FACTOR 5 +#define THREAD_STACK_SIZE 1024 +#define THREAD_PRIORITY 5 + LOG_MODULE_REGISTER(trackpad, CONFIG_SENSOR_LOG_LEVEL); -const struct device *trackpad = DEVICE_DT_GET(DT_INST(0, cirque_pinnacle)); +const struct device *trackpad = DEVICE_DT_GET(DT_NODELABEL(trackpad)); static void handle_trackpad(const struct device *dev, const struct sensor_trigger *trig) { static uint8_t last_pressed = 0; int ret = sensor_sample_fetch(dev); - if (ret < 0) { + if (ret < 0 && ret != -EAGAIN) { LOG_ERR("fetch: %d", ret); return; + } else if (ret == -EAGAIN) { + return; } struct sensor_value dx, dy, btn; ret = sensor_channel_get(dev, SENSOR_CHAN_POS_DX, &dx); @@ -63,6 +70,7 @@ static void handle_trackpad(const struct device *dev, const struct sensor_trigge last_pressed = btn.val1; } +#ifdef CONFIG_PINNACLE_TRIGGER static int trackpad_init() { struct sensor_trigger trigger = { .type = SENSOR_TRIG_DATA_READY, @@ -77,3 +85,13 @@ static int trackpad_init() { } SYS_INIT(trackpad_init, APPLICATION, CONFIG_KSCAN_INIT_PRIORITY); +#else +void poll_trackpad(void *a, void *b, void *c) { + while (1) { + handle_trackpad(trackpad, NULL); + k_sleep(K_MSEC(10)); + } +} + +K_THREAD_DEFINE(my_tid, THREAD_STACK_SIZE, poll_trackpad, NULL, NULL, NULL, THREAD_PRIORITY, 0, 0); +#endif diff --git a/app/module/drivers/sensor/pinnacle/pinnacle.c b/app/module/drivers/sensor/pinnacle/pinnacle.c index 91a7f4458a5..4a3dd34e72f 100644 --- a/app/module/drivers/sensor/pinnacle/pinnacle.c +++ b/app/module/drivers/sensor/pinnacle/pinnacle.c @@ -96,7 +96,7 @@ static int pinnacle_channel_get(const struct device *dev, enum sensor_channel ch static int pinnacle_sample_fetch(const struct device *dev, enum sensor_channel chan) { uint8_t packet[3]; int ret; - ret = pinnacle_seq_read(dev, PINNACLE_STATUS1, packet, 0); + ret = pinnacle_seq_read(dev, PINNACLE_STATUS1, packet, 1); if (ret < 0) { LOG_ERR("read status: %d", ret); return ret; @@ -113,13 +113,24 @@ static int pinnacle_sample_fetch(const struct device *dev, enum sensor_channel c data->btn = packet[0] & PINNACLE_PACKET0_BTN_PRIM; data->dx = (int16_t) (int8_t) packet[1]; data->dy = (int16_t) (int8_t) packet[2]; +#ifdef CONFIG_PINNACLE_TRIGGER if (!data->in_int) { - ret = pinnacle_write(dev, PINNACLE_STATUS1, 0); // Clear SW_DR + ret = pinnacle_write(dev, PINNACLE_STATUS1, 0); // Clear SW_DR & SW_CC if (ret < 0) { LOG_ERR("clear dr: %d", ret); return ret; } } +#else + // Clear SW_DR & SW_CC + ret = pinnacle_write(dev, PINNACLE_STATUS1, 0); + if (ret < 0) { + LOG_ERR("clear dr & cc: %d", ret); + return ret; + } + k_sleep(K_MSEC(50)); +#endif + return 0; } @@ -196,7 +207,7 @@ static int pinnacle_init(const struct device *dev) { LOG_ERR("can't reset %d", ret); return ret; } - k_msleep(20); + k_msleep(30); ret = pinnacle_write(dev, PINNACLE_STATUS1, 0); // Clear CC if (ret < 0) { LOG_ERR("can't write %d", ret); @@ -235,6 +246,13 @@ static int pinnacle_init(const struct device *dev) { LOG_ERR("can't write %d", ret); return ret; } + // Clear SW_DR & SW_CC + ret = pinnacle_write(dev, PINNACLE_STATUS1, 0); + if (ret < 0) { + LOG_ERR("clear dr & cc: %d", ret); + return ret; + } + k_sleep(K_MSEC(50)); #ifdef CONFIG_PINNACLE_TRIGGER data->dev = dev; @@ -263,10 +281,10 @@ static int pinnacle_init(const struct device *dev) { static const struct sensor_driver_api pinnacle_driver_api = { #if CONFIG_PINNACLE_TRIGGER - .trigger_set = pinnacle_trigger_set, + .trigger_set = pinnacle_trigger_set, #endif - .sample_fetch = pinnacle_sample_fetch, - .channel_get = pinnacle_channel_get, + .sample_fetch = pinnacle_sample_fetch, + .channel_get = pinnacle_channel_get, }; #define PINNACLE_INST(n) \