Index: embios/trunk/init.c |
— | — | @@ -170,6 +170,9 @@ |
171 | 171 | #ifdef HAVE_USB
|
172 | 172 | usb_init();
|
173 | 173 | #endif
|
| 174 | +#ifdef HAVE_BUTTON
|
| 175 | + button_init();
|
| 176 | +#endif
|
174 | 177 | #ifdef HAVE_STORAGE
|
175 | 178 | DEBUGF("Initializing storage drivers...");
|
176 | 179 | storage_init();
|
Index: embios/trunk/button.c |
— | — | @@ -0,0 +1,94 @@ |
| 2 | +//
|
| 3 | +//
|
| 4 | +// Copyright 2010 TheSeven
|
| 5 | +//
|
| 6 | +//
|
| 7 | +// This file is part of emBIOS.
|
| 8 | +//
|
| 9 | +// emBIOS is free software: you can redistribute it and/or
|
| 10 | +// modify it under the terms of the GNU General Public License as
|
| 11 | +// published by the Free Software Foundation, either version 2 of the
|
| 12 | +// License, or (at your option) any later version.
|
| 13 | +//
|
| 14 | +// emBIOS is distributed in the hope that it will be useful,
|
| 15 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
| 16 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
| 17 | +// See the GNU General Public License for more details.
|
| 18 | +//
|
| 19 | +// You should have received a copy of the GNU General Public License along
|
| 20 | +// with emBIOS. If not, see <http://www.gnu.org/licenses/>.
|
| 21 | +//
|
| 22 | +//
|
| 23 | +
|
| 24 | +
|
| 25 | +#include "global.h"
|
| 26 | +#include "button.h"
|
| 27 | +#include "thread.h"
|
| 28 | +
|
| 29 | +
|
| 30 | +#ifndef BUTTON_MAX_HOOKS
|
| 31 | +#define BUTTON_MAX_HOOKS 16
|
| 32 | +#endif
|
| 33 | +
|
| 34 | +
|
| 35 | +extern struct scheduler_thread* current_thread;
|
| 36 | +static struct button_hook_entry button_hooks[BUTTON_MAX_HOOKS] IBSS_ATTR;
|
| 37 | +static struct mutex button_mutex;
|
| 38 | +
|
| 39 | +
|
| 40 | +void button_init()
|
| 41 | +{
|
| 42 | + memset(button_hooks, 0, sizeof(button_hooks));
|
| 43 | + mutex_init(&button_mutex);
|
| 44 | +}
|
| 45 | +
|
| 46 | +int button_register_handler(void (*handler)(enum button_event, int which, int value))
|
| 47 | +{
|
| 48 | + int i;
|
| 49 | + mutex_lock(&button_mutex, TIMEOUT_BLOCK);
|
| 50 | + for (i = 0; i < BUTTON_MAX_HOOKS; i++)
|
| 51 | + if (button_hooks[i].owner == NULL)
|
| 52 | + {
|
| 53 | + button_hooks[i].owner = current_thread;
|
| 54 | + button_hooks[i].handler = handler;
|
| 55 | + return 0;
|
| 56 | + }
|
| 57 | + mutex_unlock(&button_mutex);
|
| 58 | + return -1;
|
| 59 | +}
|
| 60 | +
|
| 61 | +int button_unregister_handler(void (*handler)(enum button_event, int which, int value))
|
| 62 | +{
|
| 63 | + int i;
|
| 64 | + mutex_lock(&button_mutex, TIMEOUT_BLOCK);
|
| 65 | + for (i = 0; i < BUTTON_MAX_HOOKS; i++)
|
| 66 | + if (button_hooks[i].handler == handler)
|
| 67 | + {
|
| 68 | + button_hooks[i].owner = NULL;
|
| 69 | + button_hooks[i].handler = NULL;
|
| 70 | + return 0;
|
| 71 | + }
|
| 72 | + mutex_unlock(&button_mutex);
|
| 73 | + return -1;
|
| 74 | +}
|
| 75 | +
|
| 76 | +void button_send_event(enum button_event eventtype, int which, int value)
|
| 77 | +{
|
| 78 | + int i;
|
| 79 | + for (i = 0; i < BUTTON_MAX_HOOKS; i++)
|
| 80 | + if (button_hooks[i].owner != NULL)
|
| 81 | + handler(eventtype, which, value);
|
| 82 | +}
|
| 83 | +
|
| 84 | +void button_unregister_all_of_thread(struct scheduler_thread* process)
|
| 85 | +{
|
| 86 | + int i;
|
| 87 | + mutex_lock(&button_mutex, TIMEOUT_BLOCK);
|
| 88 | + for (i = 0; i < BUTTON_MAX_HOOKS; i++)
|
| 89 | + if (button_hooks[i].owner == process)
|
| 90 | + {
|
| 91 | + button_hooks[i].owner = NULL;
|
| 92 | + button_hooks[i].handler = NULL;
|
| 93 | + }
|
| 94 | + mutex_unlock(&button_mutex);
|
| 95 | +}
|
Index: embios/trunk/button.h |
— | — | @@ -0,0 +1,60 @@ |
| 2 | +//
|
| 3 | +//
|
| 4 | +// Copyright 2010 TheSeven
|
| 5 | +//
|
| 6 | +//
|
| 7 | +// This file is part of emBIOS.
|
| 8 | +//
|
| 9 | +// emBIOS is free software: you can redistribute it and/or
|
| 10 | +// modify it under the terms of the GNU General Public License as
|
| 11 | +// published by the Free Software Foundation, either version 2 of the
|
| 12 | +// License, or (at your option) any later version.
|
| 13 | +//
|
| 14 | +// emBIOS is distributed in the hope that it will be useful,
|
| 15 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
| 16 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
| 17 | +// See the GNU General Public License for more details.
|
| 18 | +//
|
| 19 | +// You should have received a copy of the GNU General Public License along
|
| 20 | +// with emBIOS. If not, see <http://www.gnu.org/licenses/>.
|
| 21 | +//
|
| 22 | +//
|
| 23 | +
|
| 24 | +
|
| 25 | +#ifndef __BUTTON_H__
|
| 26 | +#define __BUTTON_H__
|
| 27 | +
|
| 28 | +
|
| 29 | +#include "global.h"
|
| 30 | +#include "thread.h"
|
| 31 | +
|
| 32 | +
|
| 33 | +enum button_event
|
| 34 | +{
|
| 35 | + BUTTON_PRESS,
|
| 36 | + BUTTON_RELEASE,
|
| 37 | + BUTTON_SHORTPRESS,
|
| 38 | + BUTTON_LONGPRESS,
|
| 39 | + WHEEL_TOUCH,
|
| 40 | + WHEEL_UNTOUCH,
|
| 41 | + WHEEL_POSITION,
|
| 42 | + WHEEL_MOVED,
|
| 43 | + WHEEL_FORWARD,
|
| 44 | + WHEEL_BACKWARD
|
| 45 | +};
|
| 46 | +
|
| 47 | +struct button_hook_entry
|
| 48 | +{
|
| 49 | + struct scheduler_thread* owner;
|
| 50 | + void (*handler)(enum button_event, int which, int value);
|
| 51 | +};
|
| 52 | +
|
| 53 | +
|
| 54 | +void button_init() INITCODE_ATTR;
|
| 55 | +int button_register_handler(void (*handler)(enum button_event, int which, int value));
|
| 56 | +int button_unregister_handler(void (*handler)(enum button_event, int which, int value));
|
| 57 | +void button_send_event(enum button_event eventtype, int which, int value) ICODE_ATTR;
|
| 58 | +void button_unregister_all_of_thread(struct scheduler_thread* process);
|
| 59 | +
|
| 60 | +
|
| 61 | +#endif
|
Index: embios/trunk/target/ipodnano2g/target.h |
— | — | @@ -50,6 +50,8 @@ |
51 | 51 |
|
52 | 52 | #define HAVE_I2C
|
53 | 53 |
|
| 54 | +#define HAVE_BUTTON
|
| 55 | +
|
54 | 56 | #define HAVE_BOOTFLASH
|
55 | 57 | #define BOOTFLASH_IS_MEMMAPPED
|
56 | 58 |
|
Index: embios/trunk/export/syscallwrappers.h |
— | — | @@ -175,6 +175,8 @@ |
176 | 176 | #define tlsf_block_size(args...) __embios_syscall->tlsf_block_size(args)
|
177 | 177 | #define tlsf_overhead(args...) __embios_syscall->tlsf_overhead(args)
|
178 | 178 | #define execfirmware(args...) __embios_syscall->execfirmware(args)
|
| 179 | +#define button_register_handler(args...) __embios_syscall->button_register_handler(args)
|
| 180 | +#define button_unregister_handler(args...) __embios_syscall->button_unregister_handler(args)
|
179 | 181 |
|
180 | 182 |
|
181 | 183 | #endif
|
Index: embios/trunk/export/syscallapi.h |
— | — | @@ -48,6 +48,7 @@ |
49 | 49 | #include "../backlight.h"
|
50 | 50 | #include "../syscall.h"
|
51 | 51 | #include "../progressbar.h"
|
| 52 | +#include "../button.h"
|
52 | 53 | #include "../contextswitch.h"
|
53 | 54 | #include "../libc/include/string.h"
|
54 | 55 | #include "../libc/include/stdlib.h"
|
— | — | @@ -211,6 +212,8 @@ |
212 | 213 | typeof(tlsf_block_size) *tlsf_block_size;
|
213 | 214 | typeof(tlsf_overhead) *tlsf_overhead;
|
214 | 215 | typeof(execfirmware) *execfirmware;
|
| 216 | + typeof(button_register_handler) *button_register_handler;
|
| 217 | + typeof(button_unregister_handler) *button_unregister_handler;
|
215 | 218 | };
|
216 | 219 |
|
217 | 220 |
|
Index: embios/trunk/SOURCES |
— | — | @@ -60,6 +60,9 @@ |
61 | 61 | dir.c
|
62 | 62 | storage.c
|
63 | 63 | #endif
|
| 64 | +#ifdef HAVE_BUTTON
|
| 65 | +button.c
|
| 66 | +#endif
|
64 | 67 | strcasestr.c
|
65 | 68 | strcasecmp.c
|
66 | 69 | strlcpy.c
|
Index: embios/trunk/syscallapi.c |
— | — | @@ -179,4 +179,8 @@ |
180 | 180 | .nand_write_page_collect = nand_write_page_collect,
|
181 | 181 | .nand_get_device_type = nand_get_device_type,
|
182 | 182 | #endif
|
| 183 | +#ifdef HAVE_BUTTON
|
| 184 | + .button_register_handler = button_register_handler,
|
| 185 | + .button_unregister_handler = button_unregister_handler,
|
| 186 | +#endif
|
183 | 187 | };
|
Index: embios/trunk/thread.c |
— | — | @@ -30,6 +30,9 @@ |
31 | 31 | #include "dir.h"
|
32 | 32 | #include "file.h"
|
33 | 33 | #endif
|
| 34 | +#ifdef HAVE_BUTTON
|
| 35 | +#include "button.h"
|
| 36 | +#endif
|
34 | 37 |
|
35 | 38 |
|
36 | 39 | struct scheduler_thread scheduler_threads[MAX_THREADS] IBSS_ATTR;
|
— | — | @@ -438,6 +441,9 @@ |
439 | 442 | close_all_of_process(t);
|
440 | 443 | closedir_all_of_process(t);
|
441 | 444 | #endif
|
| 445 | +#ifdef HAVE_BUTTON
|
| 446 | + button_unregister_all_of_thread(t);
|
| 447 | +#endif
|
442 | 448 | }
|
443 | 449 |
|
444 | 450 | leave_critical_section(mode);
|