Subversion Repositories HelenOS

Rev

Rev 4632 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4632 Rev 4634
Line 52... Line 52...
52
#include <ddi.h>
52
#include <ddi.h>
53
#include <align.h>
53
#include <align.h>
54
 
54
 
55
#define PL050_KEY_RELEASE 0xF0
55
#define PL050_KEY_RELEASE 0xF0
56
#define PL050_ESC_KEY   0xE0
56
#define PL050_ESC_KEY   0xE0
-
 
57
#define PL050_CAPS_SCAN_CODE   0x58
57
 
58
 
58
irq_cmd_t pl050_cmds[] = {
59
irq_cmd_t pl050_cmds[] = {
59
    { CMD_MEM_READ_1, (void *) 0, 0, 1 },
60
    { CMD_MEM_READ_1, (void *) 0, 0, 1 },
60
    { CMD_MEM_READ_1, (void *) 0, 0, 2}
61
    { CMD_MEM_READ_1, (void *) 0, 0, 2}
61
};
62
};
Line 89... Line 90...
89
 
90
 
90
/** Process keyboard & mouse events */
91
/** Process keyboard & mouse events */
91
int kbd_arch_process(keybuffer_t *keybuffer, ipc_call_t *call)
92
int kbd_arch_process(keybuffer_t *keybuffer, ipc_call_t *call)
92
{
93
{
93
    static int key_released_flag = 0;
94
    static int key_released_flag = 0;
94
    static int caps_count = 0;
95
    static int caps_locked = 0;
95
   
-
 
96
    int scan_code = IPC_GET_ARG1(*call);
96
    int scan_code = IPC_GET_ARG1(*call);
97
 
97
 
98
    if (scan_code == 0x58) {
-
 
99
        if (caps_count == 2) {
-
 
100
            caps_count = 0;
-
 
101
            return 1;
-
 
102
        } else if (key_released_flag && !caps_count) {
-
 
103
            key_released_flag = 0;
-
 
104
            return 1;
-
 
105
        }
-
 
106
        caps_count++;
-
 
107
    }
-
 
108
       
-
 
109
 
-
 
110
    if (scan_code == PL050_KEY_RELEASE) {
98
    if (scan_code == PL050_KEY_RELEASE) {
111
        key_released_flag = 1;
99
        key_released_flag = 1;
112
    } else {
100
    } else {
113
        if (key_released_flag) {
101
        if (key_released_flag) {
-
 
102
            key_released_flag = 0;
-
 
103
            if (scan_code == PL050_CAPS_SCAN_CODE) {
-
 
104
                if (caps_locked) {
-
 
105
                    caps_locked = 0;
-
 
106
                    return 1;
-
 
107
                } else
-
 
108
                    caps_locked = 1;
-
 
109
            }
114
            key_released(keybuffer, scan_code);
110
            key_released(keybuffer, scan_code);
115
        } else {
111
        } else {
-
 
112
            if (scan_code == PL050_CAPS_SCAN_CODE && caps_locked)
-
 
113
                return 1;
116
            key_pressed(keybuffer, scan_code);
114
            key_pressed(keybuffer, scan_code);
117
        }
115
        }
118
        key_released_flag = 0;
-
 
119
    }
116
    }
120
 
117
 
121
    return  1;
118
    return  1;
122
}
119
}
123
 
120