Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 4342 → Rev 4343

/branches/dynload/uspace/srv/kbd/generic/kbd.c
42,13 → 42,16
#include <stdlib.h>
#include <stdio.h>
#include <ipc/ns.h>
#include <async.h>
#include <errno.h>
#include <arch/kbd.h>
#include <libadt/fifo.h>
#include <kbd/kbd.h>
 
#include <kbd.h>
#include <libadt/fifo.h>
#include <key_buffer.h>
#include <async.h>
#include <keys.h>
#include <kbd_port.h>
#include <kbd_ctl.h>
#include <layout.h>
 
#define NAME "kbd"
 
56,31 → 59,51
int phone2cons = -1;
keybuffer_t keybuffer;
 
static void irq_handler(ipc_callid_t iid, ipc_call_t *call)
void kbd_push_scancode(int scancode)
{
int chr;
printf("scancode: 0x%x\n", scancode);
kbd_ctl_parse_scancode(scancode);
}
 
#ifdef MOUSE_ENABLED
if (mouse_arch_process(phone2cons, call))
return;
#endif
kbd_arch_process(&keybuffer, call);
#include <kbd/keycode.h>
void kbd_push_ev(int type, unsigned int key, unsigned int mods)
{
kbd_event_t ev;
 
if (cons_connected && phone2cons != -1) {
/*
* recode to ASCII - one interrupt can produce more than one
* code so result is stored in fifo
*/
while (!keybuffer_empty(&keybuffer)) {
if (!keybuffer_pop(&keybuffer, (int *)&chr))
break;
printf("type: %d\n", type);
printf("mods: 0x%x\n", mods);
printf("keycode: %u\n", key);
 
async_msg_1(phone2cons, KBD_PUSHCHAR, chr);
}
}
ev.type = type;
ev.key = key;
ev.mods = mods;
 
ev.c = layout_parse_ev(&ev);
 
async_msg_4(phone2cons, KBD_EVENT, ev.type, ev.key, ev.mods, ev.c);
}
 
//static void irq_handler(ipc_callid_t iid, ipc_call_t *call)
//{
// kbd_event_t ev;
//
// kbd_arch_process(&keybuffer, call);
//
// if (cons_connected && phone2cons != -1) {
// /*
// * One interrupt can produce more than one event so the result
// * is stored in a FIFO.
// */
// while (!keybuffer_empty(&keybuffer)) {
// if (!keybuffer_pop(&keybuffer, &ev))
// break;
//
// async_msg_4(phone2cons, KBD_EVENT, ev.type, ev.key,
// ev.mods, ev.c);
// }
// }
//}
 
static void console_connection(ipc_callid_t iid, ipc_call_t *icall)
{
ipc_callid_t callid;
119,6 → 142,7
}
 
 
 
int main(int argc, char **argv)
{
printf(NAME ": HelenOS Keyboard service\n");
125,8 → 149,8
ipcarg_t phonead;
/* Initialize arch dependent parts */
if (kbd_arch_init())
/* Initialize port driver. */
if (kbd_port_init())
return -1;
/* Initialize key buffer */
133,8 → 157,8
keybuffer_init(&keybuffer);
async_set_client_connection(console_connection);
async_set_interrupt_received(irq_handler);
/* Register service at nameserver */
 
/* Register service at nameserver. */
if (ipc_connect_to_me(PHONE_NS, SERVICE_KEYBOARD, 0, 0, &phonead) != 0)
return -1;
141,7 → 165,7
printf(NAME ": Accepting connections\n");
async_manager();
 
/* Never reached */
/* Not reached. */
return 0;
}
 
/branches/dynload/uspace/srv/kbd/generic/key_buffer.c
40,7 → 40,7
 
/** Clear key buffer.
*/
void keybuffer_free(keybuffer_t *keybuffer)
void keybuffer_free(keybuffer_t *keybuffer)
{
futex_down(&keybuffer_futex);
keybuffer->head = 0;
75,15 → 75,18
return (keybuffer->items == 0);
}
 
/** Push key to key buffer.
* If buffer is full, character is ignored.
* @param key code of stored key
/** Push key event to key buffer.
*
* If the buffer is full, the event is ignored.
*
* @param keybuffer The keybuffer.
* @param ev The event to push.
*/
void keybuffer_push(keybuffer_t *keybuffer, int key)
void keybuffer_push(keybuffer_t *keybuffer, const kbd_event_t *ev)
{
futex_down(&keybuffer_futex);
if (keybuffer->items < KEYBUFFER_SIZE) {
keybuffer->fifo[keybuffer->tail] = key;
keybuffer->fifo[keybuffer->tail] = *ev;
keybuffer->tail = (keybuffer->tail + 1) % KEYBUFFER_SIZE;
keybuffer->items++;
}
90,16 → 93,25
futex_up(&keybuffer_futex);
}
 
/** Pop character from buffer.
* @param c pointer to space where to store character from buffer.
* @return zero on empty buffer, nonzero else
void keybuffer_push0(keybuffer_t *keybuffer, int c)
{
kbd_event_t ev;
 
ev.key = c; ev.mods = 0; ev.c = c;
keybuffer_push(keybuffer, &ev);
}
 
/** Pop event from buffer.
*
* @param edst Pointer to where the event should be saved.
* @return Zero on empty buffer, nonzero otherwise.
*/
int keybuffer_pop(keybuffer_t *keybuffer, int *c)
int keybuffer_pop(keybuffer_t *keybuffer, kbd_event_t *edst)
{
futex_down(&keybuffer_futex);
if (keybuffer->items > 0) {
keybuffer->items--;
*c = (keybuffer->fifo[keybuffer->head]) ;
*edst = (keybuffer->fifo[keybuffer->head]) ;
keybuffer->head = (keybuffer->head + 1) % KEYBUFFER_SIZE;
futex_up(&keybuffer_futex);
return 1;