Re: [PATCH v4] serio: PS/2 gpio bit banging driver for serio bus
On Wed, Aug 2, 2017 at 2:12 PM, Danilo Krummrichwrote: > This driver provides PS/2 serio bus support by implementing bit banging > with the GPIO API. The GPIO pins, data and clock, can be configured with > a node in the device tree or by generic device properties (GDP). > > Writing to a device is supported as well, though it is not recommended as > the timings to be halt given by libps2 are very tough and difficult to > reach with bit banging. Therefore it can be configured (also in DT and > GDP) whether the serio write function should be available for clients. > > This driver is for development purposes and not for productive use. > However, this driver can be useful e.g. when no USB port is available or > using old peripherals is desired as PS/2 controller chips getting rare. > > This driver was tested on RPI1 and on Hikey960 and it worked well together > with the atkbd driver. > > Signed-off-by: Danilo Krummrich > --- > v2: Removed one verbose print statement, changed another one to dev_dbg. > v3: - fixed compiler warning on blackfin > - depends on GPIOLIB > - clarify documentation > v4: - fixed concurrent calls to ps2_gpio_write (serio->write) > - use gpiod API > - use generic device properties > - request irq separately, do not use gpiod_to_irq > - abort when gpio is connected via slow bus > - Fixed a bug where PS2_CMD_RESEND is always send after tx failed once. > The makes the write functionallity work better, tough timing is still > critical. > - disable irq initially until ps2_gpip_open (serio->open) is called Oh there is a new version of this patch. This is better, some review comments from my old review still holds. Yours, Linus Walleij
Re: [PATCH v4] serio: PS/2 gpio bit banging driver for serio bus
On Wed, Aug 2, 2017 at 2:12 PM, Danilo Krummrich wrote: > This driver provides PS/2 serio bus support by implementing bit banging > with the GPIO API. The GPIO pins, data and clock, can be configured with > a node in the device tree or by generic device properties (GDP). > > Writing to a device is supported as well, though it is not recommended as > the timings to be halt given by libps2 are very tough and difficult to > reach with bit banging. Therefore it can be configured (also in DT and > GDP) whether the serio write function should be available for clients. > > This driver is for development purposes and not for productive use. > However, this driver can be useful e.g. when no USB port is available or > using old peripherals is desired as PS/2 controller chips getting rare. > > This driver was tested on RPI1 and on Hikey960 and it worked well together > with the atkbd driver. > > Signed-off-by: Danilo Krummrich > --- > v2: Removed one verbose print statement, changed another one to dev_dbg. > v3: - fixed compiler warning on blackfin > - depends on GPIOLIB > - clarify documentation > v4: - fixed concurrent calls to ps2_gpio_write (serio->write) > - use gpiod API > - use generic device properties > - request irq separately, do not use gpiod_to_irq > - abort when gpio is connected via slow bus > - Fixed a bug where PS2_CMD_RESEND is always send after tx failed once. > The makes the write functionallity work better, tough timing is still > critical. > - disable irq initially until ps2_gpip_open (serio->open) is called Oh there is a new version of this patch. This is better, some review comments from my old review still holds. Yours, Linus Walleij
[PATCH v4] serio: PS/2 gpio bit banging driver for serio bus
This driver provides PS/2 serio bus support by implementing bit banging with the GPIO API. The GPIO pins, data and clock, can be configured with a node in the device tree or by generic device properties (GDP). Writing to a device is supported as well, though it is not recommended as the timings to be halt given by libps2 are very tough and difficult to reach with bit banging. Therefore it can be configured (also in DT and GDP) whether the serio write function should be available for clients. This driver is for development purposes and not for productive use. However, this driver can be useful e.g. when no USB port is available or using old peripherals is desired as PS/2 controller chips getting rare. This driver was tested on RPI1 and on Hikey960 and it worked well together with the atkbd driver. Signed-off-by: Danilo Krummrich--- v2: Removed one verbose print statement, changed another one to dev_dbg. v3: - fixed compiler warning on blackfin - depends on GPIOLIB - clarify documentation v4: - fixed concurrent calls to ps2_gpio_write (serio->write) - use gpiod API - use generic device properties - request irq separately, do not use gpiod_to_irq - abort when gpio is connected via slow bus - Fixed a bug where PS2_CMD_RESEND is always send after tx failed once. The makes the write functionallity work better, tough timing is still critical. - disable irq initially until ps2_gpip_open (serio->open) is called --- .../devicetree/bindings/serio/ps2-gpio.txt | 22 + Documentation/gpio/drivers-on-gpio.txt | 5 + drivers/input/serio/Kconfig| 11 + drivers/input/serio/Makefile | 1 + drivers/input/serio/ps2-gpio.c | 450 + 5 files changed, 489 insertions(+) create mode 100644 Documentation/devicetree/bindings/serio/ps2-gpio.txt create mode 100644 drivers/input/serio/ps2-gpio.c diff --git a/Documentation/devicetree/bindings/serio/ps2-gpio.txt b/Documentation/devicetree/bindings/serio/ps2-gpio.txt new file mode 100644 index 000..d825c8e --- /dev/null +++ b/Documentation/devicetree/bindings/serio/ps2-gpio.txt @@ -0,0 +1,22 @@ +Device-Tree bindings for ps2 gpio driver + +Required properties: + - compatible = "ps2-gpio" + - gpios: data and clock gpio + - interrupts: Should trigger on the falling edge of the clock line. + +Optional properties: + - ps2-gpio,write-enable: Indicates whether write function is provided + to serio device. Probably providing the write fn will not work, because + of the tough timing libps2 requires. + +Example nodes: + +ps2@0 { + compatible = "ps2-gpio"; + interrupt-parent = <>; + interrupts = <23 IRQ_TYPE_EDGE_FALLING>; + data-gpios = < 24 GPIO_ACTIVE_HIGH>; + clk-gpios = < 23 GPIO_ACTIVE_HIGH>; + ps2-gpio,write-enable; +}; diff --git a/Documentation/gpio/drivers-on-gpio.txt b/Documentation/gpio/drivers-on-gpio.txt index 3065132..97c8716 100644 --- a/Documentation/gpio/drivers-on-gpio.txt +++ b/Documentation/gpio/drivers-on-gpio.txt @@ -84,6 +84,11 @@ hardware descriptions such as device tree or ACPI: NAND flash MTD subsystem and provides chip access and partition parsing like any other NAND driving hardware. +- ps2-gpio: drivers/input/serio/ps2-gpio.c is used to drive an PS/2 (IBM) serio + bus, data and clock line, by bit banging two GPIO lines. It will appear as + any other serio bus to the system and makes it possible to connect drivers + for e.g. keyboards and other PS/2 protocol based devices. + Apart from this there are special GPIO drivers in subsystems like MMC/SD to read card detect and write protect GPIO lines, and in the TTY serial subsystem to emulate MCTRL (modem control) signals CTS/RTS by using two GPIO lines. The diff --git a/drivers/input/serio/Kconfig b/drivers/input/serio/Kconfig index c3d05b4..292d6e2 100644 --- a/drivers/input/serio/Kconfig +++ b/drivers/input/serio/Kconfig @@ -292,6 +292,17 @@ config SERIO_SUN4I_PS2 To compile this driver as a module, choose M here: the module will be called sun4i-ps2. +config SERIO_GPIO_PS2 + tristate "GPIO PS/2 bit banging driver" + depends on GPIOLIB + help + Say Y here if you want PS/2 bit banging support via GPIO. + + To compile this driver as a module, choose M here: the + module will be called gpio-ps2. + + If you are unsure, say N. + config USERIO tristate "User space serio port driver support" help diff --git a/drivers/input/serio/Makefile b/drivers/input/serio/Makefile index 2374ef9..767bd9b 100644 --- a/drivers/input/serio/Makefile +++ b/drivers/input/serio/Makefile @@ -30,4 +30,5 @@ obj-$(CONFIG_SERIO_APBPS2)+= apbps2.o obj-$(CONFIG_SERIO_OLPC_APSP) += olpc_apsp.o obj-$(CONFIG_HYPERV_KEYBOARD) += hyperv-keyboard.o obj-$(CONFIG_SERIO_SUN4I_PS2) +=
[PATCH v4] serio: PS/2 gpio bit banging driver for serio bus
This driver provides PS/2 serio bus support by implementing bit banging with the GPIO API. The GPIO pins, data and clock, can be configured with a node in the device tree or by generic device properties (GDP). Writing to a device is supported as well, though it is not recommended as the timings to be halt given by libps2 are very tough and difficult to reach with bit banging. Therefore it can be configured (also in DT and GDP) whether the serio write function should be available for clients. This driver is for development purposes and not for productive use. However, this driver can be useful e.g. when no USB port is available or using old peripherals is desired as PS/2 controller chips getting rare. This driver was tested on RPI1 and on Hikey960 and it worked well together with the atkbd driver. Signed-off-by: Danilo Krummrich --- v2: Removed one verbose print statement, changed another one to dev_dbg. v3: - fixed compiler warning on blackfin - depends on GPIOLIB - clarify documentation v4: - fixed concurrent calls to ps2_gpio_write (serio->write) - use gpiod API - use generic device properties - request irq separately, do not use gpiod_to_irq - abort when gpio is connected via slow bus - Fixed a bug where PS2_CMD_RESEND is always send after tx failed once. The makes the write functionallity work better, tough timing is still critical. - disable irq initially until ps2_gpip_open (serio->open) is called --- .../devicetree/bindings/serio/ps2-gpio.txt | 22 + Documentation/gpio/drivers-on-gpio.txt | 5 + drivers/input/serio/Kconfig| 11 + drivers/input/serio/Makefile | 1 + drivers/input/serio/ps2-gpio.c | 450 + 5 files changed, 489 insertions(+) create mode 100644 Documentation/devicetree/bindings/serio/ps2-gpio.txt create mode 100644 drivers/input/serio/ps2-gpio.c diff --git a/Documentation/devicetree/bindings/serio/ps2-gpio.txt b/Documentation/devicetree/bindings/serio/ps2-gpio.txt new file mode 100644 index 000..d825c8e --- /dev/null +++ b/Documentation/devicetree/bindings/serio/ps2-gpio.txt @@ -0,0 +1,22 @@ +Device-Tree bindings for ps2 gpio driver + +Required properties: + - compatible = "ps2-gpio" + - gpios: data and clock gpio + - interrupts: Should trigger on the falling edge of the clock line. + +Optional properties: + - ps2-gpio,write-enable: Indicates whether write function is provided + to serio device. Probably providing the write fn will not work, because + of the tough timing libps2 requires. + +Example nodes: + +ps2@0 { + compatible = "ps2-gpio"; + interrupt-parent = <>; + interrupts = <23 IRQ_TYPE_EDGE_FALLING>; + data-gpios = < 24 GPIO_ACTIVE_HIGH>; + clk-gpios = < 23 GPIO_ACTIVE_HIGH>; + ps2-gpio,write-enable; +}; diff --git a/Documentation/gpio/drivers-on-gpio.txt b/Documentation/gpio/drivers-on-gpio.txt index 3065132..97c8716 100644 --- a/Documentation/gpio/drivers-on-gpio.txt +++ b/Documentation/gpio/drivers-on-gpio.txt @@ -84,6 +84,11 @@ hardware descriptions such as device tree or ACPI: NAND flash MTD subsystem and provides chip access and partition parsing like any other NAND driving hardware. +- ps2-gpio: drivers/input/serio/ps2-gpio.c is used to drive an PS/2 (IBM) serio + bus, data and clock line, by bit banging two GPIO lines. It will appear as + any other serio bus to the system and makes it possible to connect drivers + for e.g. keyboards and other PS/2 protocol based devices. + Apart from this there are special GPIO drivers in subsystems like MMC/SD to read card detect and write protect GPIO lines, and in the TTY serial subsystem to emulate MCTRL (modem control) signals CTS/RTS by using two GPIO lines. The diff --git a/drivers/input/serio/Kconfig b/drivers/input/serio/Kconfig index c3d05b4..292d6e2 100644 --- a/drivers/input/serio/Kconfig +++ b/drivers/input/serio/Kconfig @@ -292,6 +292,17 @@ config SERIO_SUN4I_PS2 To compile this driver as a module, choose M here: the module will be called sun4i-ps2. +config SERIO_GPIO_PS2 + tristate "GPIO PS/2 bit banging driver" + depends on GPIOLIB + help + Say Y here if you want PS/2 bit banging support via GPIO. + + To compile this driver as a module, choose M here: the + module will be called gpio-ps2. + + If you are unsure, say N. + config USERIO tristate "User space serio port driver support" help diff --git a/drivers/input/serio/Makefile b/drivers/input/serio/Makefile index 2374ef9..767bd9b 100644 --- a/drivers/input/serio/Makefile +++ b/drivers/input/serio/Makefile @@ -30,4 +30,5 @@ obj-$(CONFIG_SERIO_APBPS2)+= apbps2.o obj-$(CONFIG_SERIO_OLPC_APSP) += olpc_apsp.o obj-$(CONFIG_HYPERV_KEYBOARD) += hyperv-keyboard.o obj-$(CONFIG_SERIO_SUN4I_PS2) += sun4i-ps2.o