| 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);
 |