Add a uclass for keyboard input, mirroring the existing stdio methods. This is enabled by a new CONFIG_DM_KEYBOARD option. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Marek Vasut <marex@denx.de> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>master
parent
34ab37eef5
commit
e84421d8f3
@ -0,0 +1,91 @@ |
||||
/*
|
||||
* Copyright (c) 2015 Google, Inc |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <dm.h> |
||||
#include <keyboard.h> |
||||
|
||||
static int keyboard_start(struct stdio_dev *sdev) |
||||
{ |
||||
struct udevice *dev = sdev->priv; |
||||
struct keyboard_ops *ops = keyboard_get_ops(dev); |
||||
|
||||
if (ops->start) |
||||
return ops->start(dev); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static int keyboard_stop(struct stdio_dev *sdev) |
||||
{ |
||||
struct udevice *dev = sdev->priv; |
||||
struct keyboard_ops *ops = keyboard_get_ops(dev); |
||||
|
||||
if (ops->stop) |
||||
return ops->stop(dev); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static int keyboard_tstc(struct stdio_dev *sdev) |
||||
{ |
||||
struct udevice *dev = sdev->priv; |
||||
struct keyboard_priv *priv = dev_get_uclass_priv(dev); |
||||
struct keyboard_ops *ops = keyboard_get_ops(dev); |
||||
|
||||
/* Just get input to do this for us if we can */ |
||||
if (priv->input.dev) |
||||
return input_tstc(&priv->input); |
||||
else if (ops->tstc) |
||||
return ops->tstc(dev); |
||||
|
||||
return -ENOSYS; |
||||
} |
||||
|
||||
static int keyboard_getc(struct stdio_dev *sdev) |
||||
{ |
||||
struct udevice *dev = sdev->priv; |
||||
struct keyboard_priv *priv = dev_get_uclass_priv(dev); |
||||
struct keyboard_ops *ops = keyboard_get_ops(dev); |
||||
|
||||
/* Just get input to do this for us if we can */ |
||||
if (priv->input.dev) |
||||
return input_getc(&priv->input); |
||||
else if (ops->getc) |
||||
return ops->getc(dev); |
||||
|
||||
return -ENOSYS; |
||||
} |
||||
|
||||
static int keyboard_pre_probe(struct udevice *dev) |
||||
{ |
||||
struct keyboard_priv *priv = dev_get_uclass_priv(dev); |
||||
struct stdio_dev *sdev = &priv->sdev; |
||||
int ret; |
||||
|
||||
strlcpy(sdev->name, dev->name, sizeof(sdev->name)); |
||||
sdev->flags = DEV_FLAGS_INPUT; |
||||
sdev->getc = keyboard_getc; |
||||
sdev->tstc = keyboard_tstc; |
||||
sdev->start = keyboard_start; |
||||
sdev->stop = keyboard_stop; |
||||
sdev->priv = dev; |
||||
ret = input_init(&priv->input, 0); |
||||
if (ret) { |
||||
debug("%s: Cannot set up input, ret=%d - please add DEBUG to drivers/input/input.c to figure out the cause\n", |
||||
__func__, ret); |
||||
return ret; |
||||
} |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
UCLASS_DRIVER(keyboard) = { |
||||
.id = UCLASS_KEYBOARD, |
||||
.name = "keyboard", |
||||
.pre_probe = keyboard_pre_probe, |
||||
.per_device_auto_alloc_size = sizeof(struct keyboard_priv), |
||||
}; |
Loading…
Reference in new issue