summaryrefslogtreecommitdiff
path: root/firmware/target/hosted/ypr0/button-ypr0.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/hosted/ypr0/button-ypr0.c')
-rw-r--r--firmware/target/hosted/ypr0/button-ypr0.c103
1 files changed, 103 insertions, 0 deletions
diff --git a/firmware/target/hosted/ypr0/button-ypr0.c b/firmware/target/hosted/ypr0/button-ypr0.c
new file mode 100644
index 0000000000..4298410161
--- /dev/null
+++ b/firmware/target/hosted/ypr0/button-ypr0.c
@@ -0,0 +1,103 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id: button-sdl.c 30482 2011-09-08 14:53:28Z kugel $
9 *
10 * Copyright (C) 2011 Lorenzo Miori
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21
22#include <stdio.h>
23#include <unistd.h>
24#include <fcntl.h>
25#include <stdlib.h> /* EXIT_SUCCESS */
26#include "config.h"
27#include "button.h"
28#include "kernel.h"
29#include "system.h"
30#include "button-target.h"
31
32/* R0 physical key codes */
33enum ypr0_buttons {
34 R0BTN_NONE = BUTTON_NONE,
35 R0BTN_POWER = 1,
36 R0BTN_UP,
37 R0BTN_DOWN,
38 R0BTN_RIGHT,
39 R0BTN_LEFT,
40 R0BTN_CENTRAL,
41 R0BTN_MENU,
42 R0BTN_BACK,
43 R0BTN_3DOTS = 11,
44};
45
46
47static int r0_btn_fd = 0;
48/* Samsung keypad driver doesn't allow multiple key combinations :( */
49static enum ypr0_buttons r0_read_key(void)
50{
51 unsigned char keys;
52
53 if (r0_btn_fd < 0)
54 return 0;
55
56 if (read(r0_btn_fd, &keys, 1))
57 return keys;
58
59 return 0;
60}
61
62/* Conversion from physical keypress code to logic key code */
63static int key_to_button(enum ypr0_buttons keyboard_button)
64{
65 switch (keyboard_button)
66 {
67 default: return BUTTON_NONE;
68 case R0BTN_POWER: return BUTTON_POWER;
69 case R0BTN_UP: return BUTTON_UP;
70 case R0BTN_DOWN: return BUTTON_DOWN;
71 case R0BTN_RIGHT: return BUTTON_RIGHT;
72 case R0BTN_LEFT: return BUTTON_LEFT;
73 case R0BTN_CENTRAL: return BUTTON_SELECT;
74 case R0BTN_MENU: return BUTTON_MENU;
75 case R0BTN_BACK: return BUTTON_BACK;
76 case R0BTN_3DOTS: return BUTTON_USER;
77 }
78}
79
80int button_read_device(void)
81{
82 return key_to_button(r0_read_key());
83}
84
85
86/* Open the keypad device: it is offered by r0Btn.ko module */
87void button_init_device(void)
88{
89 r0_btn_fd = open("/dev/r0Btn", O_RDONLY);
90 if (r0_btn_fd < 0)
91 printf("/dev/r0Btn open error!");
92}
93
94#ifdef BUTTON_DRIVER_CLOSE
95/* I'm not sure it's called at shutdown...give a check! */
96void button_close_device(void)
97{
98 if (r0_btn_fd >= 0) {
99 close(r0_btn_fd);
100 printf("/dev/r0Btn closed!");
101 }
102}
103#endif /* BUTTON_DRIVER_CLOSE */