f trackpad: drop wheel, check error, drop invert x y, add rotate 90

This commit is contained in:
crides 2023-02-05 02:22:19 -06:00
parent 1e6185439a
commit 52b43a72e8
3 changed files with 83 additions and 60 deletions

View file

@ -110,7 +110,7 @@ static int pinnacle_sample_fetch(const struct device *dev, enum sensor_channel c
#ifdef CONFIG_PINNACLE_TRIGGER #ifdef CONFIG_PINNACLE_TRIGGER
static void set_int(const struct device *dev, const bool en) { static void set_int(const struct device *dev, const bool en) {
const struct pinnacle_config *config = dev->config; const struct pinnacle_config *config = dev->config;
int ret = gpio_pin_interrupt_configure_dt(&config->dr, en ? GPIO_INT_LEVEL_ACTIVE : GPIO_INT_DISABLE); int ret = gpio_pin_interrupt_configure_dt(&config->dr, en ? GPIO_INT_EDGE_TO_ACTIVE : GPIO_INT_DISABLE);
if (ret < 0) { if (ret < 0) {
LOG_ERR("can't set interrupt"); LOG_ERR("can't set interrupt");
} }
@ -156,7 +156,6 @@ static void pinnacle_work_cb(struct k_work *work) {
static void pinnacle_gpio_cb(const struct device *port, struct gpio_callback *cb, uint32_t pins) { static void pinnacle_gpio_cb(const struct device *port, struct gpio_callback *cb, uint32_t pins) {
struct pinnacle_data *data = CONTAINER_OF(cb, struct pinnacle_data, gpio_cb); struct pinnacle_data *data = CONTAINER_OF(cb, struct pinnacle_data, gpio_cb);
const struct device *dev = data->dev;
#if defined(CONFIG_PINNACLE_TRIGGER_OWN_THREAD) #if defined(CONFIG_PINNACLE_TRIGGER_OWN_THREAD)
k_sem_give(&data->gpio_sem); k_sem_give(&data->gpio_sem);
#elif defined(CONFIG_PINNACLE_TRIGGER_GLOBAL_THREAD) #elif defined(CONFIG_PINNACLE_TRIGGER_GLOBAL_THREAD)
@ -169,30 +168,58 @@ static int pinnacle_init(const struct device *dev) {
struct pinnacle_data *data = dev->data; struct pinnacle_data *data = dev->data;
const struct pinnacle_config *config = dev->config; const struct pinnacle_config *config = dev->config;
pinnacle_write(dev, PINNACLE_STATUS1, 0); // Clear CC LOG_WRN("pinnacle start");
pinnacle_write(dev, PINNACLE_Z_IDLE, 0); // No Z-Idle packets int ret;
if (config->sleep_en) { ret = pinnacle_write(dev, PINNACLE_STATUS1, PINNACLE_SYS_CFG_RESET);
pinnacle_write(dev, PINNACLE_SYS_CFG, PINNACLE_SYS_CFG_EN_SLEEP); if (ret < 0) {
LOG_ERR("can't reset %d", ret);
return ret;
} }
k_msleep(20);
ret = pinnacle_write(dev, PINNACLE_STATUS1, 0); // Clear CC
if (ret < 0) {
LOG_ERR("can't write %d", ret);
return ret;
}
k_usleep(50);
ret = pinnacle_write(dev, PINNACLE_Z_IDLE, 0); // No Z-Idle packets
if (ret < 0) {
LOG_ERR("can't write %d", ret);
return ret;
}
if (config->sleep_en) {
ret = pinnacle_write(dev, PINNACLE_SYS_CFG, PINNACLE_SYS_CFG_EN_SLEEP);
if (ret < 0) {
LOG_ERR("can't write %d", ret);
return ret;
}
}
uint8_t feed_cfg2 = PINNACLE_FEED_CFG2_EN_IM;
if (config->no_taps) { if (config->no_taps) {
pinnacle_write(dev, PINNACLE_FEED_CFG2, PINNACLE_FEED_CFG2_DIS_TAP); feed_cfg2 |= PINNACLE_FEED_CFG2_DIS_TAP;
}
if (config->rotate_90) {
feed_cfg2 |= PINNACLE_FEED_CFG2_ROTATE_90;
}
ret = pinnacle_write(dev, PINNACLE_FEED_CFG2, feed_cfg2);
if (ret < 0) {
LOG_ERR("can't write %d", ret);
return ret;
} }
uint8_t feed_cfg1 = PINNACLE_FEED_CFG1_EN_FEED; uint8_t feed_cfg1 = PINNACLE_FEED_CFG1_EN_FEED;
if (config->invert_x) {
feed_cfg1 |= PINNACLE_FEED_CFG1_INV_X;
}
if (config->invert_y) {
feed_cfg1 |= PINNACLE_FEED_CFG1_INV_Y;
}
if (feed_cfg1) { if (feed_cfg1) {
pinnacle_write(dev, PINNACLE_FEED_CFG1, feed_cfg1); ret = pinnacle_write(dev, PINNACLE_FEED_CFG1, feed_cfg1);
}
if (ret < 0) {
LOG_ERR("can't write %d", ret);
return ret;
} }
#ifdef CONFIG_PINNACLE_TRIGGER #ifdef CONFIG_PINNACLE_TRIGGER
data->dev = dev; data->dev = dev;
gpio_pin_configure_dt(&config->dr, GPIO_INPUT); gpio_pin_configure_dt(&config->dr, GPIO_INPUT);
gpio_init_callback(&data->gpio_cb, pinnacle_gpio_cb, BIT(config->dr.pin)); gpio_init_callback(&data->gpio_cb, pinnacle_gpio_cb, BIT(config->dr.pin));
int ret = gpio_add_callback(config->dr.port, &data->gpio_cb); ret = gpio_add_callback(config->dr.port, &data->gpio_cb);
if (ret < 0) { if (ret < 0) {
LOG_ERR("Failed to set DR callback: %d", ret); LOG_ERR("Failed to set DR callback: %d", ret);
return -EIO; return -EIO;
@ -225,12 +252,11 @@ static const struct sensor_driver_api pinnacle_driver_api = {
static struct pinnacle_data pinnacle_data_##n; \ static struct pinnacle_data pinnacle_data_##n; \
static const struct pinnacle_config pinnacle_config_##n = { \ static const struct pinnacle_config pinnacle_config_##n = { \
.bus = COND_CODE_1(DT_INST_ON_BUS(0, i2c), (I2C_DT_SPEC_INST_GET(0)), (SPI_DT_SPEC_INST_GET(0, SPI_OP_MODE_MASTER | SPI_WORD_SET(8) | SPI_LINES_SINGLE | SPI_TRANSFER_MSB, 0))), \ .bus = COND_CODE_1(DT_INST_ON_BUS(0, i2c), (I2C_DT_SPEC_INST_GET(0)), (SPI_DT_SPEC_INST_GET(0, SPI_OP_MODE_MASTER | SPI_WORD_SET(8) | SPI_LINES_SINGLE | SPI_TRANSFER_MSB, 0))), \
.invert_x = DT_INST_PROP(0, invert_x), \ .rotate_90 = DT_INST_PROP(0, rotate_90), \
.invert_y = DT_INST_PROP(0, invert_y), \
.sleep_en = DT_INST_PROP(0, sleep), \ .sleep_en = DT_INST_PROP(0, sleep), \
.no_taps = DT_INST_PROP(0, no_taps), \ .no_taps = DT_INST_PROP(0, no_taps), \
COND_CODE_1(CONFIG_PINNACLE_TRIGGER, (.dr = GPIO_DT_SPEC_GET(DT_DRV_INST(0), dr_gpios),), ) \ COND_CODE_1(CONFIG_PINNACLE_TRIGGER, (.dr = GPIO_DT_SPEC_GET(DT_DRV_INST(0), dr_gpios),), ) \
}; \ }; \
DEVICE_DT_INST_DEFINE(n, pinnacle_init, device_pm_control_nop, &pinnacle_data_##n, &pinnacle_config_##n, POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY, &pinnacle_driver_api); DEVICE_DT_INST_DEFINE(n, pinnacle_init, NULL, &pinnacle_data_##n, &pinnacle_config_##n, POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY, &pinnacle_driver_api);
DT_INST_FOREACH_STATUS_OKAY(CIRQUE_INST) DT_INST_FOREACH_STATUS_OKAY(CIRQUE_INST)

View file

@ -33,7 +33,7 @@
#define PINNACLE_FEED_CFG2_DIS_SEC BIT(2) // Disable secondary tap #define PINNACLE_FEED_CFG2_DIS_SEC BIT(2) // Disable secondary tap
#define PINNACLE_FEED_CFG2_DIS_SCRL BIT(3) // Disable scroll #define PINNACLE_FEED_CFG2_DIS_SCRL BIT(3) // Disable scroll
#define PINNACLE_FEED_CFG2_DIS_GE BIT(4) // Disable GlideExtend #define PINNACLE_FEED_CFG2_DIS_GE BIT(4) // Disable GlideExtend
#define PINNACLE_FEED_CFG2_SWAP_XY BIT(7) // Swap X & Y #define PINNACLE_FEED_CFG2_ROTATE_90 BIT(7) // Swap X & Y
#define PINNACLE_CAL_CFG 0x07 // Contains calibration configuration bits. #define PINNACLE_CAL_CFG 0x07 // Contains calibration configuration bits.
#define PINNACLE_PS2_AUX 0x08 // Contains Data register for PS/2 Aux Control. #define PINNACLE_PS2_AUX 0x08 // Contains Data register for PS/2 Aux Control.
#define PINNACLE_SAMPLE 0x09 // Sample Rate Number of samples generated per second. #define PINNACLE_SAMPLE 0x09 // Sample Rate Number of samples generated per second.
@ -53,7 +53,6 @@
struct pinnacle_data { struct pinnacle_data {
int16_t dx, dy; int16_t dx, dy;
int8_t wheel;
uint8_t btn; uint8_t btn;
#ifdef CONFIG_PINNACLE_TRIGGER #ifdef CONFIG_PINNACLE_TRIGGER
const struct device *dev; const struct device *dev;
@ -76,7 +75,7 @@ struct pinnacle_config {
#elif DT_INST_ON_BUS(0, spi) #elif DT_INST_ON_BUS(0, spi)
const struct spi_dt_spec bus; const struct spi_dt_spec bus;
#endif #endif
bool invert_x, invert_y, sleep_en, no_taps; bool rotate_90, sleep_en, no_taps;
#ifdef CONFIG_PINNACLE_TRIGGER #ifdef CONFIG_PINNACLE_TRIGGER
const struct gpio_dt_spec dr; const struct gpio_dt_spec dr;
#endif #endif

View file

@ -2,9 +2,7 @@ properties:
dr-gpios: dr-gpios:
type: phandle-array type: phandle-array
description: Data ready pin for the trackpad description: Data ready pin for the trackpad
invert-x: rotate-90:
type: boolean
invert-y:
type: boolean type: boolean
sleep: sleep:
type: boolean type: boolean