Re: [PATCH 1/2] Input: rotary_encoder - Support key events
From: nazgul33 <hidden>
Date: 2019-01-06 03:36:44
Also in:
lkml
input_sync() is there, at the end of the function.
static void rotary_encoder_report_event(struct rotary_encoder *encoder)
{
if (encoder->relative_axis) {
input_report_rel(encoder->input,
encoder->axis, encoder->dir);
} else if (encoder->relative_keys) {
u32 keycode = encoder->keycodes[encoder->dir > 0];
input_event(encoder->input, EV_KEY, keycode, 1);
input_event(encoder->input, EV_KEY, keycode, 0);
} else {
unsigned int pos = encoder->pos;
if (encoder->dir < 0) {
/* turning counter-clockwise */
if (encoder->rollover)
pos += encoder->steps;
if (pos)
pos--;
} else {
/* turning clockwise */
if (encoder->rollover || pos < encoder->steps)
pos++;
}
if (encoder->rollover)
pos %= encoder->steps;
encoder->pos = pos;
input_report_abs(encoder->input, encoder->axis, encoder->pos);
}
input_sync(encoder->input);
}
On Sun, Jan 6, 2019 at 8:12 AM Dmitry Torokhov
[off-list ref] wrote:On Sat, Jan 5, 2019 at 2:27 PM Donghoon Han [off-list ref] wrote:quoted
From: Steven Han <redacted> Support generating EV_KEY pair, instead of EV_REL. Signed-off-by: Donghoon Han <redacted> --- drivers/input/misc/rotary_encoder.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-)diff --git a/drivers/input/misc/rotary_encoder.c b/drivers/input/misc/rotary_encoder.c index 72eee6d55527..180e35884289 100644 --- a/drivers/input/misc/rotary_encoder.c +++ b/drivers/input/misc/rotary_encoder.c@@ -41,6 +41,8 @@ struct rotary_encoder { u32 steps; u32 axis; bool relative_axis; + bool relative_keys; + u32 keycodes[2]; bool rollover; enum rotary_encoder_encoding encoding;@@ -79,6 +81,10 @@ static void rotary_encoder_report_event(struct rotary_encoder *encoder) if (encoder->relative_axis) { input_report_rel(encoder->input, encoder->axis, encoder->dir); + } else if (encoder->relative_keys) { + u32 keycode = encoder->keycodes[encoder->dir > 0]; + input_event(encoder->input, EV_KEY, keycode, 1);You need input_sync() here.quoted
+ input_event(encoder->input, EV_KEY, keycode, 0); } else { unsigned int pos = encoder->pos;@@ -237,6 +243,16 @@ static int rotary_encoder_probe(struct platform_device *pdev) device_property_read_u32(dev, "linux,axis", &encoder->axis); encoder->relative_axis = device_property_read_bool(dev, "rotary-encoder,relative-axis"); + encoder->relative_keys = + device_property_read_bool(dev, "rotary-encoder,relative-keys"); + if (encoder->relative_keys) { + err = device_property_read_u32_array(dev, + "rotary-encoder,relative-keycodes", + encoder->keycodes, 2); + if (err) + dev_err(dev, "unable to get keycodes: %d\n", err); + return err; + } encoder->gpios = devm_gpiod_get_array(dev, NULL, GPIOD_IN); if (IS_ERR(encoder->gpios)) {@@ -260,9 +276,12 @@ static int rotary_encoder_probe(struct platform_device *pdev) input->id.bustype = BUS_HOST; input->dev.parent = dev; - if (encoder->relative_axis) + if (encoder->relative_axis) { input_set_capability(input, EV_REL, encoder->axis); - else + } else if (encoder->relative_keys) { + input_set_capability(input, EV_KEY, encoder->keycodes[0]); + input_set_capability(input, EV_KEY, encoder->keycodes[1]); + } else input_set_abs_params(input, encoder->axis, 0, encoder->steps, 0, 1); --2.17.1Thanks. -- Dmitry
-- 한동훈 드림.