diff options
author | Michael Gielda <mgielda@antmicro.com> | 2014-04-03 14:53:04 +0200 |
---|---|---|
committer | Michael Gielda <mgielda@antmicro.com> | 2014-04-03 14:53:04 +0200 |
commit | ae1e4e08a1005a0c487f03ba189d7536e7fdcba6 (patch) | |
tree | f1c296f8a966a9a39876b0e98e16d9c5da1776dd /ecos/packages/devs/kbd | |
parent | f157da5337118d3c5cd464266796de4262ac9dbd (diff) |
Added the OS files
Diffstat (limited to 'ecos/packages/devs/kbd')
6 files changed, 731 insertions, 0 deletions
diff --git a/ecos/packages/devs/kbd/arm/aaed2000/current/ChangeLog b/ecos/packages/devs/kbd/arm/aaed2000/current/ChangeLog new file mode 100644 index 0000000..047fed0 --- /dev/null +++ b/ecos/packages/devs/kbd/arm/aaed2000/current/ChangeLog @@ -0,0 +1,28 @@ +2002-03-10 Gary Thomas <gthomas@redhat.com> + + * src/aaed2000_kbd.c: + * cdl/kbd_aaed2000.cdl: New file(s). Keyboard driver for AAED2000. + +//=========================================================================== +// ####GPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 or (at your option) any +// later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the +// Free Software Foundation, Inc., 51 Franklin Street, +// Fifth Floor, Boston, MA 02110-1301, USA. +// ------------------------------------------- +// ####GPLCOPYRIGHTEND#### +//=========================================================================== diff --git a/ecos/packages/devs/kbd/arm/aaed2000/current/cdl/kbd_aaed2000.cdl b/ecos/packages/devs/kbd/arm/aaed2000/current/cdl/kbd_aaed2000.cdl new file mode 100644 index 0000000..5d14823 --- /dev/null +++ b/ecos/packages/devs/kbd/arm/aaed2000/current/cdl/kbd_aaed2000.cdl @@ -0,0 +1,99 @@ +#========================================================================== +# +# kbd_aaed2000.cdl +# +# eCos configuration data for the Agilent AAED2000 keyboard +# +#========================================================================== +## ####ECOSGPLCOPYRIGHTBEGIN#### +## ------------------------------------------- +## This file is part of eCos, the Embedded Configurable Operating System. +## Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. +## +## eCos is free software; you can redistribute it and/or modify it under +## the terms of the GNU General Public License as published by the Free +## Software Foundation; either version 2 or (at your option) any later +## version. +## +## eCos is distributed in the hope that it will be useful, but WITHOUT +## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +## for more details. +## +## You should have received a copy of the GNU General Public License +## along with eCos; if not, write to the Free Software Foundation, Inc., +## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +## +## As a special exception, if other files instantiate templates or use +## macros or inline functions from this file, or you compile this file +## and link it with other works to produce a work based on this file, +## this file does not by itself cause the resulting work to be covered by +## the GNU General Public License. However the source code for this file +## must still be made available in accordance with section (3) of the GNU +## General Public License v2. +## +## This exception does not invalidate any other reasons why a work based +## on this file might be covered by the GNU General Public License. +## ------------------------------------------- +## ####ECOSGPLCOPYRIGHTEND#### +#========================================================================== +######DESCRIPTIONBEGIN#### +# +# Author(s): gthomas +# Contributors: gthomas +# Date: 2002-03-11 +# Purpose: +# Description: Keyboard driver for Agilent AAED2000 +# +#####DESCRIPTIONEND#### +# +#========================================================================== + +cdl_package CYGPKG_DEVS_KBD_AAED2000 { + display "Keypad driver for AAED2000" + include_dir cyg/io + + active_if CYGPKG_IO_FILEIO + requires CYGPKG_IO + requires CYGFUN_KERNEL_API_C + requires CYGPKG_HAL_ARM_ARM9_AAED2000 + active_if !CYGSEM_AAED2000_LCD_COMM + + compile -library=libextras.a aaed2000_kbd.c + + description "Keyboard driver for the AAED2000" + + cdl_component CYGPKG_DEVS_KBD_AAED2000_OPTIONS { + display "options" + flavor none + no_define + + cdl_option CYGPKG_DEVS_KBD_AAED2000_CFLAGS { + display "Additional compiler flags" + flavor data + no_define + default_value { "" } + description " + This option modifies the set of compiler flags for + building the keypad driver package. These flags + are used in addition to the set of global flags." + } + + cdl_option CYGDAT_DEVS_KBD_AAED2000_NAME { + display "Device name for the keyboard driver" + flavor data + default_value {"\"/dev/kbd\""} + description " This option specifies the name of the keypad device" + } + + cdl_option CYGNUM_DEVS_KBD_AAED2000_EVENT_BUFFER_SIZE { + display "Number of events the driver can buffer" + flavor data + default_value { 32 } + description " + This option defines the size of the keypad device internal + buffer. The cyg_io_read() function will return as many of these + as there is space for in the buffer passed." + } + } +} diff --git a/ecos/packages/devs/kbd/arm/aaed2000/current/src/aaed2000_kbd.c b/ecos/packages/devs/kbd/arm/aaed2000/current/src/aaed2000_kbd.c new file mode 100644 index 0000000..8127ff2 --- /dev/null +++ b/ecos/packages/devs/kbd/arm/aaed2000/current/src/aaed2000_kbd.c @@ -0,0 +1,245 @@ +//========================================================================== +// +// aaed2000_kbd.c +// +// Keyboard driver for the Agilent AAED2000 +// +//========================================================================== +// ####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. +// +// eCos is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 or (at your option) any later +// version. +// +// eCos is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License +// along with eCos; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +// As a special exception, if other files instantiate templates or use +// macros or inline functions from this file, or you compile this file +// and link it with other works to produce a work based on this file, +// this file does not by itself cause the resulting work to be covered by +// the GNU General Public License. However the source code for this file +// must still be made available in accordance with section (3) of the GNU +// General Public License v2. +// +// This exception does not invalidate any other reasons why a work based +// on this file might be covered by the GNU General Public License. +// ------------------------------------------- +// ####ECOSGPLCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas +// Contributors: gthomas +// Date: 2002-03-11 +// Purpose: +// Description: Keyboardd driver for Agilent AAED2000 +// +//####DESCRIPTIONEND#### +// +//========================================================================== + + +#include <pkgconf/devs_kbd_aaed2000.h> + +#include <cyg/kernel/kapi.h> +#include <cyg/hal/hal_io.h> +#include <cyg/hal/hal_arch.h> +#include <cyg/hal/drv_api.h> +#include <cyg/hal/hal_intr.h> +#include <cyg/hal/aaed2000.h> +#include <cyg/infra/cyg_type.h> +#include <cyg/infra/cyg_ass.h> + +#include <cyg/fileio/fileio.h> // For select() functionality +static cyg_selinfo kbd_select_info; +static cyg_bool kbd_select_active; + +#include <cyg/io/devtab.h> + +// Functions in this module + +static Cyg_ErrNo kbd_read(cyg_io_handle_t handle, + void *buffer, + cyg_uint32 *len); +static cyg_bool kbd_select(cyg_io_handle_t handle, + cyg_uint32 which, + cyg_addrword_t info); +static Cyg_ErrNo kbd_set_config(cyg_io_handle_t handle, + cyg_uint32 key, + const void *buffer, + cyg_uint32 *len); +static Cyg_ErrNo kbd_get_config(cyg_io_handle_t handle, + cyg_uint32 key, + void *buffer, + cyg_uint32 *len); +static bool kbd_init(struct cyg_devtab_entry *tab); +static Cyg_ErrNo kbd_lookup(struct cyg_devtab_entry **tab, + struct cyg_devtab_entry *st, + const char *name); + +CHAR_DEVIO_TABLE(aaed2000_kbd_handlers, + NULL, // Unsupported write() function + kbd_read, + kbd_select, + kbd_get_config, + kbd_set_config); + +CHAR_DEVTAB_ENTRY(aaed2000_kbd_device, + CYGDAT_DEVS_KBD_AAED2000_NAME, + NULL, // Base device name + &aaed2000_kbd_handlers, + kbd_init, + kbd_lookup, + NULL); // Private data pointer + +#define MAX_EVENTS CYGNUM_DEVS_KBD_AAED2000_EVENT_BUFFER_SIZE +static int num_events; +static int _event_put, _event_get; +static unsigned char _events[MAX_EVENTS]; + +static bool _is_open = false; + +#define STACK_SIZE CYGNUM_HAL_STACK_SIZE_TYPICAL +static char kbd_scan_stack[STACK_SIZE]; +static cyg_thread kbd_scan_thread_data; +static cyg_handle_t kbd_scan_thread_handle; +#define SCAN_FREQ 20 // Hz +//#define SCAN_FREQ 5 // Hz +#define SCAN_DELAY ((1000/SCAN_FREQ)/10) + +static void +kbd_scan(cyg_addrword_t param) +{ + unsigned char ch; + unsigned char *ev; + + diag_printf("Keyboard scan\n"); + while (true) { + cyg_thread_delay(SCAN_DELAY); + if (aaed2000_KeyboardTest()) { + ch = aaed2000_KeyboardGetc(); + if (num_events < MAX_EVENTS) { + num_events++; + ev = &_events[_event_put++]; + if (_event_put == MAX_EVENTS) { + _event_put = 0; + } + *ev = ch; + if (kbd_select_active) { + kbd_select_active = false; + cyg_selwakeup(&kbd_select_info); + } + } + } + } +} + +static Cyg_ErrNo +kbd_read(cyg_io_handle_t handle, + void *buffer, + cyg_uint32 *len) +{ + unsigned char *ev; + int tot = *len; + unsigned char *bp = (unsigned char *)buffer; + + cyg_scheduler_lock(); // Prevent interaction with DSR code + while (tot >= sizeof(*ev)) { + if (num_events > 0) { + ev = &_events[_event_get++]; + if (_event_get == MAX_EVENTS) { + _event_get = 0; + } + memcpy(bp, ev, sizeof(*ev)); + bp += sizeof(*ev); + tot -= sizeof(*ev); + num_events--; + } else { + break; // No more events + } + } + cyg_scheduler_unlock(); // Allow DSRs again + diag_dump_buf(buffer, tot); + *len -= tot; + return ENOERR; +} + +static cyg_bool +kbd_select(cyg_io_handle_t handle, + cyg_uint32 which, + cyg_addrword_t info) +{ + if (which == CYG_FREAD) { + cyg_scheduler_lock(); // Prevent interaction with DSR code + if (num_events > 0) { + cyg_scheduler_unlock(); // Reallow interaction with DSR code + return true; + } + if (!kbd_select_active) { + kbd_select_active = true; + cyg_selrecord(info, &kbd_select_info); + } + cyg_scheduler_unlock(); // Reallow interaction with DSR code + } + return false; +} + +static Cyg_ErrNo +kbd_set_config(cyg_io_handle_t handle, + cyg_uint32 key, + const void *buffer, + cyg_uint32 *len) +{ + return EINVAL; +} + +static Cyg_ErrNo +kbd_get_config(cyg_io_handle_t handle, + cyg_uint32 key, + void *buffer, + cyg_uint32 *len) +{ + return EINVAL; +} + +static bool +kbd_init(struct cyg_devtab_entry *tab) +{ + cyg_selinit(&kbd_select_info); + return true; +} + +static Cyg_ErrNo +kbd_lookup(struct cyg_devtab_entry **tab, + struct cyg_devtab_entry *st, + const char *name) +{ + if (!_is_open) { + _is_open = true; + cyg_thread_create(1, // Priority + kbd_scan, // entry + 0, // entry parameter + "Keyboard scan", // Name + &kbd_scan_stack[0], // Stack + STACK_SIZE, // Size + &kbd_scan_thread_handle, // Handle + &kbd_scan_thread_data // Thread data structure + ); + cyg_thread_resume(kbd_scan_thread_handle); // Start it + } + return ENOERR; +} + + + diff --git a/ecos/packages/devs/kbd/arm/ipaq/current/ChangeLog b/ecos/packages/devs/kbd/arm/ipaq/current/ChangeLog new file mode 100644 index 0000000..aebd5c8 --- /dev/null +++ b/ecos/packages/devs/kbd/arm/ipaq/current/ChangeLog @@ -0,0 +1,36 @@ +2001-08-29 Kenichi Nakamura <nakamura@redhat.com> + + * cdl/kbd_ipaq.cdl: Modified dependency on file I/O package. + +2001-04-24 Gary Thomas <gthomas@redhat.com> + + * cdl/kbd_ipaq.cdl: Add dependency on file I/O package. + +2001-03-15 Gary Thomas <gthomas@redhat.com> + + * src/ipaq_kbd.c: + * cdl/kbd_ipaq.cdl: New file(s) - keypad driver for iPAQ. + +//=========================================================================== +// ####GPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 or (at your option) any +// later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the +// Free Software Foundation, Inc., 51 Franklin Street, +// Fifth Floor, Boston, MA 02110-1301, USA. +// ------------------------------------------- +// ####GPLCOPYRIGHTEND#### +//=========================================================================== diff --git a/ecos/packages/devs/kbd/arm/ipaq/current/cdl/kbd_ipaq.cdl b/ecos/packages/devs/kbd/arm/ipaq/current/cdl/kbd_ipaq.cdl new file mode 100644 index 0000000..3856fec --- /dev/null +++ b/ecos/packages/devs/kbd/arm/ipaq/current/cdl/kbd_ipaq.cdl @@ -0,0 +1,99 @@ +#========================================================================== +# +# kbd_ipaq.cdl +# +# eCos configuration data for the Compaq iPAQ keypad/buttons +# +#========================================================================== +## ####ECOSGPLCOPYRIGHTBEGIN#### +## ------------------------------------------- +## This file is part of eCos, the Embedded Configurable Operating System. +## Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. +## +## eCos is free software; you can redistribute it and/or modify it under +## the terms of the GNU General Public License as published by the Free +## Software Foundation; either version 2 or (at your option) any later +## version. +## +## eCos is distributed in the hope that it will be useful, but WITHOUT +## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +## for more details. +## +## You should have received a copy of the GNU General Public License +## along with eCos; if not, write to the Free Software Foundation, Inc., +## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +## +## As a special exception, if other files instantiate templates or use +## macros or inline functions from this file, or you compile this file +## and link it with other works to produce a work based on this file, +## this file does not by itself cause the resulting work to be covered by +## the GNU General Public License. However the source code for this file +## must still be made available in accordance with section (3) of the GNU +## General Public License v2. +## +## This exception does not invalidate any other reasons why a work based +## on this file might be covered by the GNU General Public License. +## ------------------------------------------- +## ####ECOSGPLCOPYRIGHTEND#### +#========================================================================== +######DESCRIPTIONBEGIN#### +# +# Author(s): gthomas +# Contributors: gthomas +# Date: 2001-03-15 +# Purpose: +# Description: Kbdscreen drivers for Compaq iPAQ +# +#####DESCRIPTIONEND#### +# +#========================================================================== + +cdl_package CYGPKG_DEVS_KBD_IPAQ { + display "Keypad driver for iPAQ" + include_dir cyg/io + + active_if CYGPKG_IO_FILEIO + requires CYGPKG_IO + requires CYGFUN_KERNEL_API_C + requires CYGPKG_HAL_ARM_SA11X0_IPAQ + active_if !CYGSEM_IPAQ_LCD_COMM + + compile -library=libextras.a ipaq_kbd.c + + description "Keypad driver for the iPAQ using the Atmel micro-controller" + + cdl_component CYGPKG_DEVS_KBD_IPAQ_OPTIONS { + display "options" + flavor none + no_define + + cdl_option CYGPKG_DEVS_KBD_IPAQ_CFLAGS { + display "Additional compiler flags" + flavor data + no_define + default_value { "" } + description " + This option modifies the set of compiler flags for + building the keypad driver package. These flags + are used in addition to the set of global flags." + } + + cdl_option CYGDAT_DEVS_KBD_IPAQ_NAME { + display "Device name for the keypad driver" + flavor data + default_value {"\"/dev/kbd\""} + description " This option specifies the name of the keypad device" + } + + cdl_option CYGNUM_DEVS_KBD_IPAQ_EVENT_BUFFER_SIZE { + display "Number of events the driver can buffer" + flavor data + default_value { 32 } + description " + This option defines the size of the keypad device internal + buffer. The cyg_io_read() function will return as many of these + as there is space for in the buffer passed." + } + } +} diff --git a/ecos/packages/devs/kbd/arm/ipaq/current/src/ipaq_kbd.c b/ecos/packages/devs/kbd/arm/ipaq/current/src/ipaq_kbd.c new file mode 100644 index 0000000..a34f0d1 --- /dev/null +++ b/ecos/packages/devs/kbd/arm/ipaq/current/src/ipaq_kbd.c @@ -0,0 +1,224 @@ +//========================================================================== +// +// ipaq_kbd.c +// +// Keypad driver for the Compaq iPAQ +// +//========================================================================== +// ####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. +// +// eCos is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 or (at your option) any later +// version. +// +// eCos is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License +// along with eCos; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +// As a special exception, if other files instantiate templates or use +// macros or inline functions from this file, or you compile this file +// and link it with other works to produce a work based on this file, +// this file does not by itself cause the resulting work to be covered by +// the GNU General Public License. However the source code for this file +// must still be made available in accordance with section (3) of the GNU +// General Public License v2. +// +// This exception does not invalidate any other reasons why a work based +// on this file might be covered by the GNU General Public License. +// ------------------------------------------- +// ####ECOSGPLCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas +// Contributors: gthomas +// Date: 2001-03-15 +// Purpose: +// Description: Keypad driver for Compaq IPAQ +// +//####DESCRIPTIONEND#### +// +//========================================================================== + + +#include <pkgconf/devs_kbd_ipaq.h> + +#include <cyg/kernel/kapi.h> +#include <cyg/hal/hal_io.h> +#include <cyg/hal/hal_arch.h> +#include <cyg/hal/drv_api.h> +#include <cyg/hal/hal_intr.h> +#include <cyg/hal/hal_sa11x0.h> +#include <cyg/hal/ipaq.h> +#include <cyg/infra/cyg_type.h> +#include <cyg/infra/cyg_ass.h> + +#include <cyg/fileio/fileio.h> // For select() functionality +static cyg_selinfo kbd_select_info; +static cyg_bool kbd_select_active; + +#include <cyg/io/devtab.h> +#include <cyg/hal/atmel_support.h> + +// Functions in this module + +static Cyg_ErrNo kbd_read(cyg_io_handle_t handle, + void *buffer, + cyg_uint32 *len); +static cyg_bool kbd_select(cyg_io_handle_t handle, + cyg_uint32 which, + cyg_addrword_t info); +static Cyg_ErrNo kbd_set_config(cyg_io_handle_t handle, + cyg_uint32 key, + const void *buffer, + cyg_uint32 *len); +static Cyg_ErrNo kbd_get_config(cyg_io_handle_t handle, + cyg_uint32 key, + void *buffer, + cyg_uint32 *len); +static bool kbd_init(struct cyg_devtab_entry *tab); +static Cyg_ErrNo kbd_lookup(struct cyg_devtab_entry **tab, + struct cyg_devtab_entry *st, + const char *name); + +CHAR_DEVIO_TABLE(ipaq_kbd_handlers, + NULL, // Unsupported write() function + kbd_read, + kbd_select, + kbd_get_config, + kbd_set_config); + +CHAR_DEVTAB_ENTRY(ipaq_kbd_device, + CYGDAT_DEVS_KBD_IPAQ_NAME, + NULL, // Base device name + &ipaq_kbd_handlers, + kbd_init, + kbd_lookup, + NULL); // Private data pointer + +#define MAX_EVENTS CYGNUM_DEVS_KBD_IPAQ_EVENT_BUFFER_SIZE +static int num_events; +static int _event_put, _event_get; +static unsigned char _events[MAX_EVENTS]; + +static bool _is_open = false; + +// +// Note: this routine is called from the Atmel processing DSR +// +static void +kbd_handler(atmel_pkt *pkt) +{ + unsigned char *dp = pkt->data; + unsigned char *ev; + +// diag_printf("KBD = %x\n", dp[1]); + if (num_events < MAX_EVENTS) { + num_events++; + ev = &_events[_event_put++]; + if (_event_put == MAX_EVENTS) { + _event_put = 0; + } + *ev = dp[1]; + if (kbd_select_active) { + kbd_select_active = false; + cyg_selwakeup(&kbd_select_info); + } + } +} + +static Cyg_ErrNo +kbd_read(cyg_io_handle_t handle, + void *buffer, + cyg_uint32 *len) +{ + unsigned char *ev; + int tot = *len; + unsigned char *bp = (unsigned char *)buffer; + + cyg_scheduler_lock(); // Prevent interaction with DSR code + while (tot >= sizeof(*ev)) { + if (num_events > 0) { + ev = &_events[_event_get++]; + if (_event_get == MAX_EVENTS) { + _event_get = 0; + } + memcpy(bp, ev, sizeof(*ev)); + bp += sizeof(*ev); + tot -= sizeof(*ev); + num_events--; + } else { + break; // No more events + } + } + cyg_scheduler_unlock(); // Allow DSRs again + *len -= tot; + return ENOERR; +} + +static cyg_bool +kbd_select(cyg_io_handle_t handle, + cyg_uint32 which, + cyg_addrword_t info) +{ + if (which == CYG_FREAD) { + cyg_scheduler_lock(); // Prevent interaction with DSR code + if (num_events > 0) { + cyg_scheduler_unlock(); // Reallow interaction with DSR code + return true; + } + if (!kbd_select_active) { + kbd_select_active = true; + cyg_selrecord(info, &kbd_select_info); + } + cyg_scheduler_unlock(); // Reallow interaction with DSR code + } + return false; +} + +static Cyg_ErrNo +kbd_set_config(cyg_io_handle_t handle, + cyg_uint32 key, + const void *buffer, + cyg_uint32 *len) +{ + return EINVAL; +} + +static Cyg_ErrNo +kbd_get_config(cyg_io_handle_t handle, + cyg_uint32 key, + void *buffer, + cyg_uint32 *len) +{ + return EINVAL; +} + +static bool +kbd_init(struct cyg_devtab_entry *tab) +{ + cyg_selinit(&kbd_select_info); + return true; +} + +static Cyg_ErrNo +kbd_lookup(struct cyg_devtab_entry **tab, + struct cyg_devtab_entry *st, + const char *name) +{ + if (!_is_open) { + _is_open = true; + atmel_register(ATMEL_CMD_KEYBD, kbd_handler); + atmel_interrupt_mode(true); + } + return ENOERR; +} |