dt-bindings: input: bindings for Adafruit Seesaw Gamepad
Subsystems (4)
Anshul Dalal
maintainerPATCH v12 1/2 dt-bindings: input: bindings for Adafruit Seesaw Gamepad
Adds bindings for the Adafruit Seesaw Gamepad.
The gamepad functions as an i2c device with the default address of 0x50 and has an IRQ pin that can be enabled in the driver to allow for a rising edge trigger on each button press or joystick movement.
Product page:
https://www.adafruit.com/product/5743
Arduino driver:
https://github.com/adafruit/Adafruit_Seesaw
---
Changes for v11,12:
- no updates
Changes for v10:
- Added interrupt-controller/irq.h header
Changes for v9:
- Added interrupt in example
Changes for v8:
- no updates
Changes for v7:
- no updates
Changes for v6:
- no updates
Changes for v5:
- Added link to the datasheet
Changes for v4:
- Fixed the URI for the id field
- Added interrupts property
Changes for v3:
- Updated id field to reflect updated file name from previous version
- Added reg property
Changes for v2:
- Renamed file to adafruit,seesaw-gamepad.yaml
- Removed quotes for $id and $schema
- Removed "Bindings for" from the description
- Changed node name to the generic name "joystick"
- Changed compatible to 'adafruit,seesaw-gamepad' instead of 'adafruit,seesaw_gamepad'
Previous versions:
v11: https://lore.kernel.org/lkml/[email protected]/
v10: https://lore.kernel.org/lkml/[email protected]/
v9: https://lore.kernel.org/lkml/[email protected]/
v8: https://lore.kernel.org/lkml/[email protected]/
v7: https://lore.kernel.org/lkml/[email protected]/
v6: https://lore.kernel.org/lkml/[email protected]/
v5: https://lore.kernel.org/lkml/[email protected]/
v4: https://lore.kernel.org/lkml/[email protected]/
v3: https://lore.kernel.org/linux-input/[email protected]/
v2: https://lore.kernel.org/linux-input/[email protected]/
v1: https://lore.kernel.org/linux-input/[email protected]/
--- .../input/adafruit,seesaw-gamepad.yaml | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 Documentation/devicetree/bindings/input/adafruit,seesaw-gamepad.yaml
Documentation/devicetree/bindings/input/adafruit,seesaw-gamepad.yaml new file +63 -0
@@ -0,0 +1,63 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/input/adafruit,seesaw-gamepad.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Adafruit Mini I2C Gamepad with seesaw + +maintainers: + - Anshul Dalal <[email protected]> + +description: | + Adafruit Mini I2C Gamepad + + +-----------------------------+ + | ___ | + | / \ (X) | + | | S | __ __ (Y) (A) | + | \___/ |ST| |SE| (B) | + | | + +-----------------------------+ + + S -> 10-bit precision bidirectional analog joystick + ST -> Start + SE -> Select + X, A, B, Y -> Digital action buttons + + Datasheet: https://cdn-learn.adafruit.com/downloads/pdf/gamepad-qt.pdf + Product page: https://www.adafruit.com/product/5743 + Arduino Driver: https://github.com/adafruit/Adafruit_Seesaw + +properties: + compatible: + const: adafruit,seesaw-gamepad + + reg: + maxItems: 1 + + interrupts: + maxItems: 1 + description: + The gamepad's IRQ pin triggers a rising edge if interrupts are enabled. + +required: + - compatible + - reg + +additionalProperties: false + +examples: + - | + #include <dt-bindings/interrupt-controller/irq.h> + + i2c { + #address-cells = <1>; + #size-cells = <0>; + + joystick@50 { + compatible = "adafruit,seesaw-gamepad"; + interrupts = <18 IRQ_TYPE_EDGE_RISING>; + reg = <0x50>; + }; + };
Signature · 1 line
2.43.0
Anshul Dalal
maintainerPATCH v12 2/2 input: joystick: driver for Adafruit Seesaw Gamepad
Adds a driver for a mini gamepad that communicates over i2c, the gamepad has bidirectional thumb stick input and six buttons.
The gamepad chip utilizes the open framework from Adafruit called 'Seesaw' to transmit the ADC data for the joystick and digital pin state for the buttons. I have only implemented the functionality required to receive the thumb stick and button state.
Steps in reading the gamepad state over i2c:
1. Reset the registers
2. Set the pin mode of the pins specified by the BUTTON_MASK to input BUTTON_MASK: A bit-map for the six digital pins internally connected to the joystick buttons.
3. Enable internal pullup resistors for the BUTTON_MASK
4. Bulk set the pin state HIGH for BUTTON_MASK
5. Poll the device for button and joystick state done by:
seesaw_read_data(struct i2c_client *client, struct seesaw_data *data)
Product page:
https://www.adafruit.com/product/5743
Arduino driver:
https://github.com/adafruit/Adafruit_Seesaw
Driver tested on RPi Zero 2W
---
Changes for v12:
- Added time unit of ms to SEESAW_GAMEPAD_POLL_INTERVAL_MS
- Use a single u16 register as argument instead of two u8s in:
seesaw_register_read
seesaw_register_write_u8
seesaw_register_write_u32
- Fixed improper usage of varaible name 'ret' where an error should be reported
Changes for v11:
- Removed of_match_ptr to prevent warning:
'seesaw_of_table' defined but not used
on non OF platforms
Changes for v10:
- no updates
Changes for v9:
- Added of_device_id
Changes for v8:
- Updated invalid references to adafruit_seesaw to adafruit-seesaw
Changes for v7:adafruit-seesaw.c
- Fixed formatting for macro definitions
- Made SEESAW_BUTTON_MASK static const
- Removed __be16 type for x and y fields of seesaw_data
- Used sparse_keymap implementation instead of custom keymap
- Used i2c_msg instead of i2c_master_send and recv in seesaw_register_read
- Use temporary variable adc_data to store data received from ADC
- Changed read_buf from u8[4] to __be32
- Use usleep_range instead of msleep
- Removed 'Reviewed-by: Thomas Weißschuh' due to large number of changes since last reviewKconfig:
- Added select INPUT_SPARSEKMAP
Changes for v6:
- Added TODO
- Removed clang-format directives
- Namespaced device buttons
- Removed char physical_path[32] field from struct seesaw_gamepad
- Added packed attribute to struct seesaw_data
- Moved from having booleans per button to single u32 button_state
- Added seesaw_button_description array to directly associate device buttons with respective keycodes
- Added wrapper functions seesaw_register_ around i2c_master_ API
- Ratelimited input error reporting with dev_err_ratelimited
- Removed of_device_id
Changes for v5:
- Added link to the datasheet
- Added debug log message when seesaw_read_data fails
Changes for v4:
- Changed 1UL << BUTTON_ to BIT(BUTTON_)
- Removed hardware_id field from struct seesaw_gamepad
- Removed redundant checks for the number of bytes written and received by i2c_master_send and i2c_master_recv
- Used get_unaligned_be32 to instantiate u32 result from read_buf
- Changed result & (1UL << BUTTON_) to
test_bit(BUTTON_, (long *)&result)
- Changed KBUILD_MODNAME in id-tables to SEESAW_DEVICE_NAME
- Fixed formatting issues
- Changed button reporting:
Since the gamepad had the action buttons in a non-standard layout:
(X)
(Y) (A)
(B)
Therefore moved to using generic directional action button event codes instead of BTN_[ABXY].
Changes for v3:
- no updates
Changes for v2:adafruit-seesaw.c:
- Renamed file from 'adafruit_seesaw.c'
- Changed device name from 'seesaw_gamepad' to 'seesaw-gamepad'
- Changed count parameter for receiving joystick x on line 118:
`2` to `sizeof(write_buf)`
- Fixed invalid buffer size on line 123 and 126:
`data->y` to `sizeof(data->y)`- Added comment for the mdelay(10) on line 169
- Changed inconsistent indentation on line 271Kconfig:
- Fixed indentation for the help text
- Updated module nameMakefile:
- Updated module object file nameMAINTAINERS:
- Updated file name for the driver and bindings
Previous versions:
v11: https://lore.kernel.org/lkml/[email protected]/
v10: https://lore.kernel.org/lkml/[email protected]/
v9: https://lore.kernel.org/lkml/[email protected]/
v8: https://lore.kernel.org/lkml/[email protected]/
v7: https://lore.kernel.org/lkml/[email protected]/
v6: https://lore.kernel.org/lkml/[email protected]/
v5: https://lore.kernel.org/lkml/[email protected]/
v4: https://lore.kernel.org/lkml/[email protected]/
v3: https://lore.kernel.org/linux-input/[email protected]/
v2: https://lore.kernel.org/linux-input/[email protected]/
v1: https://lore.kernel.org/linux-input/[email protected]/
--- MAINTAINERS | 7 + drivers/input/joystick/Kconfig | 10 + drivers/input/joystick/Makefile | 1 + drivers/input/joystick/adafruit-seesaw.c | 312 +++++++++++++++++++++++ 4 files changed, 330 insertions(+) create mode 100644 drivers/input/joystick/adafruit-seesaw.c
MAINTAINERS +7 -0
@@ -441,6 +441,13 @@ W: http://wiki.analog.com/AD7879 W: https://ez.analog.com/linux-software-drivers F: drivers/input/touchscreen/ad7879.c +ADAFRUIT MINI I2C GAMEPAD +M: Anshul Dalal <[email protected]> +L: [email protected] +S: Maintained +F: Documentation/devicetree/bindings/input/adafruit,seesaw-gamepad.yaml +F: drivers/input/joystick/adafruit-seesaw.c + ADDRESS SPACE LAYOUT RANDOMIZATION (ASLR) M: Jiri Kosina <[email protected]> S: Maintained
drivers/input/joystick/Kconfig +10 -0
@@ -412,4 +412,14 @@ config JOYSTICK_SENSEHAT To compile this driver as a module, choose M here: the module will be called sensehat_joystick. +config JOYSTICK_SEESAW + tristate "Adafruit Mini I2C Gamepad with Seesaw" + depends on I2C + select INPUT_SPARSEKMAP + help + Say Y here if you want to use the Adafruit Mini I2C Gamepad. + + To compile this driver as a module, choose M here: the module will be + called adafruit-seesaw. + endif
drivers/input/joystick/Makefile +1 -0
@@ -28,6 +28,7 @@ obj-$(CONFIG_JOYSTICK_N64) += n64joy.o obj-$(CONFIG_JOYSTICK_PSXPAD_SPI) += psxpad-spi.o obj-$(CONFIG_JOYSTICK_PXRC) += pxrc.o obj-$(CONFIG_JOYSTICK_QWIIC) += qwiic-joystick.o +obj-$(CONFIG_JOYSTICK_SEESAW) += adafruit-seesaw.o obj-$(CONFIG_JOYSTICK_SENSEHAT) += sensehat-joystick.o obj-$(CONFIG_JOYSTICK_SIDEWINDER) += sidewinder.o obj-$(CONFIG_JOYSTICK_SPACEBALL) += spaceball.o
drivers/input/joystick/adafruit-seesaw.c new file +312 -0
312 lines not on this page · raw message
Signature · 1 line
2.43.0
Dmitry Torokhov
maintainerRe: [PATCH v12 2/2] input: joystick: driver for Adafruit Seesaw Gamepad
Hi Anshul,
drivers/input/joystick/adafruit-seesaw.c line 195
Quoted 3 lines · Anshul Dalal
drivers/input/joystick/adafruit-seesaw.c new file +3
-0+ +for_each_set_bit (i, (long *)&SEESAW_BUTTON_MASK , +BITS_PER_TYPE (SEESAW_BUTTON_MASK )) {
This is not really safe as it might not be aligned properly, and we can potentially try to peek beyond the data element (even though we limit how many bits we consider valid). I changed SEESAW_BUTTON_MASK to be unsigned long.
I also dropped bunch of unneeded casts and applied, thank you.
Thanks.
Signature · 1 line
Dmitry
Quoted 6 lines · Anshul Dalal
Adds bindings for the Adafruit Seesaw Gamepad.
The gamepad functions as an i2c device with the default address of
0x50and has an IRQ pin that can be enabled in the driver to allow for a rising edge trigger on each button press or joystick movement.
Quoted 9 lines
Product page:
https://www.adafruit.com/product/5743
Arduino driver:
https://github.com/adafruit/Adafruit_SeesawReviewed-by Conor Dooley <[email protected]>Reviewed-by Krzysztof Kozlowski <[email protected]>Signed-off-by Anshul Dalal <[email protected]>
Applied, thank you.
Signature · 1 line
Dmitry