Skip to content

Commit

Permalink
drivers: kscan: Introduce SDL mouse driver
Browse files Browse the repository at this point in the history
Introduces a new SDL mouse driver for the keyboard scan (kscan)
interface. Driver is implemented as SDL event filter

Signed-off-by: Pavlo Hamov <pavlo_hamov@jabil.com>
  • Loading branch information
Pavlo Hamov authored and MaureenHelm committed Mar 11, 2020
1 parent 8ccccbb commit 687f407
Show file tree
Hide file tree
Showing 5 changed files with 128 additions and 0 deletions.
4 changes: 4 additions & 0 deletions boards/posix/native_posix/Kconfig.defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,10 @@ config SDL_DISPLAY
default y
depends on DISPLAY

config KSCAN_SDL
default y
depends on KSCAN

config FLASH_SIMULATOR
default y
depends on FLASH
Expand Down
1 change: 1 addition & 0 deletions drivers/kscan/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ zephyr_library()

zephyr_library_sources_ifdef(CONFIG_KSCAN_FT5336 kscan_ft5336.c)
zephyr_library_sources_ifdef(CONFIG_KSCAN_XEC kscan_mchp_xec.c)
zephyr_library_sources_ifdef(CONFIG_KSCAN_SDL kscan_sdl.c)

zephyr_library_sources_ifdef(CONFIG_USERSPACE kscan_handlers.c)
1 change: 1 addition & 0 deletions drivers/kscan/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ if KSCAN

source "drivers/kscan/Kconfig.ft5336"
source "drivers/kscan/Kconfig.xec"
source "drivers/kscan/Kconfig.sdl"

module = KSCAN
module-str = kscan
Expand Down
14 changes: 14 additions & 0 deletions drivers/kscan/Kconfig.sdl
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Copyright (c) 2020 Jabil Inc.
# SPDX-License-Identifier: Apache-2.0

config KSCAN_SDL
bool "SDL event filter for touch panel emulation"
depends on HAS_SDL
help
Enable driver for the SDL mouse event filter.

config SDL_POINTER_KSCAN_DEV_NAME
string "SDL kscan device name"
depends on KSCAN_SDL
default LVGL_POINTER_KSCAN_DEV_NAME if LVGL
default "SDL_KSCAN"
108 changes: 108 additions & 0 deletions drivers/kscan/kscan_sdl.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
/*
* Copyright (c) 2020 Jabil Inc.
*
* SPDX-License-Identifier: Apache-2.0
*/

#include <drivers/kscan.h>
#include <logging/log.h>

#include <SDL.h>

LOG_MODULE_REGISTER(kscan, CONFIG_KSCAN_LOG_LEVEL);

struct sdl_data {
kscan_callback_t callback;
bool enabled;
};

static int sdl_filter(void *arg, SDL_Event *event)
{
struct device *dev = arg;
struct sdl_data *data = dev->driver_data;
u32_t row = 0;
u32_t column = 0;
bool pressed = 0;

switch (event->type) {
case SDL_MOUSEBUTTONDOWN: {
pressed = 1;
column = event->button.x;
row = event->button.y;
} break;
case SDL_MOUSEBUTTONUP: {
pressed = 0;
column = event->button.x;
row = event->button.y;
} break;
case SDL_MOUSEMOTION: {
if (!event->motion.state)
break;
pressed = 1;
column = event->button.x;
row = event->button.y;
} break;
default:
return 1;
}

if (data->enabled && data->callback) {
data->callback(dev, row, column, pressed);
}
return 1;
}

static int sdl_configure(struct device *dev, kscan_callback_t callback)
{
struct sdl_data *data = dev->driver_data;

if (!callback) {
LOG_ERR("Callback is null");
return -EINVAL;
}
LOG_DBG("%s: set callback", dev->config->name);

data->callback = callback;

return 0;
}

static int sdl_enable_callback(struct device *dev)
{
struct sdl_data *data = dev->driver_data;

LOG_DBG("%s: enable cb", dev->config->name);
data->enabled = true;
return 0;
}

static int sdl_disable_callback(struct device *dev)
{
struct sdl_data *data = dev->driver_data;

LOG_DBG("%s: disable cb", dev->config->name);
data->enabled = false;
return 0;
}

static int sdl_init(struct device *dev)
{
LOG_INF("Init '%s' device", dev->config->name);
SDL_AddEventWatch(sdl_filter, dev);

return 0;
}


static const struct kscan_driver_api sdl_driver_api = {
.config = sdl_configure,
.enable_callback = sdl_enable_callback,
.disable_callback = sdl_disable_callback,
};

static struct sdl_data sdl_data;

DEVICE_AND_API_INIT(sdl, CONFIG_SDL_POINTER_KSCAN_DEV_NAME, sdl_init,
&sdl_data, NULL,
POST_KERNEL, CONFIG_KSCAN_INIT_PRIORITY,
&sdl_driver_api);

0 comments on commit 687f407

Please sign in to comment.