Skip to contentSkip to conversation

dt-bindings: input: bindings for Adafruit Seesaw Gamepad

PATCH Applied Anshul Dalal 2 participants 4 messages Jan 6, 2024 – Jan 11, 2024

Subsystems (4)
lore
Share & tools
lore

Anshul Dalal

author maintainer
#0 lore raw

PATCH 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
new file mode 100644
index 000000000000..5e86f6de6978
@@ -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
author maintainer
#1 lore raw

PATCH 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 review
Kconfig:
- 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 271
Kconfig:
- Fixed indentation for the help text
- Updated module name
Makefile:
- Updated module object file name
MAINTAINERS:
- 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
index 81d5fc0bba68..b3f101edc24b 100644
@@ -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
index ac6925ce8366..7755e5b454d2 100644
@@ -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
index 3937535f0098..9976f596a920 100644
@@ -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
maintainer
#2 lore raw

Re: [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
maintainer Applied
#3 lore raw
In reply to Anshul Dalal
Quoted 6 lines · Anshul Dalal

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.

Quoted 9 lines

Product page:
https://www.adafruit.com/product/5743
Arduino driver:
https://github.com/adafruit/Adafruit_Seesaw

Applied, thank you.

Signature · 1 line
Dmitry