Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 73f56e4 in mainline


Ignore:
Timestamp:
2009-12-30T14:17:46Z (11 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
26b50cb
Parents:
bb2dbf8 (diff), 9f51afc (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge mouse driver.

Files:
16 added
1 deleted
6 edited
1 moved

Legend:

Unmodified
Added
Removed
  • boot/arch/amd64/Makefile.inc

    rbb2dbf8 r73f56e4  
    3131RD_SRVS += \
    3232        $(USPACEDIR)/srv/pci/pci \
    33         $(USPACEDIR)/srv/bd/ata_bd/ata_bd
     33        $(USPACEDIR)/srv/bd/ata_bd/ata_bd \
     34        $(USPACEDIR)/srv/char/i8042/i8042 \
     35        $(USPACEDIR)/srv/mouse/c_mouse/c_mouse
    3436
    3537MODULES := $(notdir $(COMPONENTS))
  • uspace/Makefile

    rbb2dbf8 r73f56e4  
    4141        srv/fb \
    4242        srv/kbd \
     43        srv/char/i8042 \
    4344        srv/console \
    4445        srv/fs/fat \
    4546        srv/fs/tmpfs \
    4647        srv/fs/devfs \
     48        srv/mouse/c_mouse \
    4749        srv/vfs \
    4850        srv/devmap \
  • uspace/app/init/init.c

    rbb2dbf8 r73f56e4  
    265265        spawn("/srv/fhc");
    266266        spawn("/srv/obio");
     267        srv_start("/srv/i8042");
     268        srv_start("/srv/c_mouse");
    267269
    268270        spawn("/srv/fb");
  • uspace/srv/char/i8042/i8042.h

    rbb2dbf8 r73f56e4  
    3636 */
    3737
    38 #ifndef KBD_PORT_i8042_H_
    39 #define KBD_PORT_i8042_H_
     38#ifndef i8042_H_
     39#define i8042_H_
    4040
    4141#include <libarch/ddi.h>
    4242#include <libarch/types.h>
    4343
     44/** i8042 HW I/O interface */
    4445struct i8042 {
    4546        ioport8_t data;
     
    4950typedef struct i8042 i8042_t;
    5051
     52/** Softstate structure, one for each serial port (primary and aux). */
     53typedef struct {
     54        dev_handle_t dev_handle;
     55        int client_phone;
     56} i8042_port_t;
     57
    5158#endif
    5259
  • uspace/srv/console/console.c

    rbb2dbf8 r73f56e4  
    3737#include <ipc/kbd.h>
    3838#include <io/keycode.h>
     39#include <ipc/mouse.h>
    3940#include <ipc/fb.h>
    4041#include <ipc/services.h>
     
    6465/** Phone to the keyboard driver. */
    6566static int kbd_phone;
     67
     68/** Phone to the mouse driver. */
     69static int mouse_phone;
    6670
    6771/** Information about framebuffer */
     
    426430}
    427431
     432/** Handler for mouse events */
     433static void mouse_events(ipc_callid_t iid, ipc_call_t *icall)
     434{
     435        int button, press;
     436        int dx, dy;
     437        int newcon;
     438
     439        /* Ignore parameters, the connection is already opened */
     440        while (true) {
     441
     442                ipc_call_t call;
     443                ipc_callid_t callid = async_get_call(&call);
     444
     445                int retval;
     446
     447                switch (IPC_GET_METHOD(call)) {
     448                case IPC_M_PHONE_HUNGUP:
     449                        /* TODO: Handle hangup */
     450                        return;
     451                case MEVENT_BUTTON:
     452                        button = IPC_GET_ARG1(call);
     453                        press = IPC_GET_ARG2(call);
     454                        if (button == 1) {
     455                                newcon = gcons_mouse_btn(press);
     456                                if (newcon != -1)
     457                                        change_console(&consoles[newcon]);
     458                        }
     459                        retval = 0;
     460                        break;
     461                case MEVENT_MOVE:
     462                        dx = IPC_GET_ARG1(call);
     463                        dy = IPC_GET_ARG2(call);
     464                        gcons_mouse_move(dx, dy);
     465                        retval = 0;
     466                        break;
     467                default:
     468                        retval = ENOENT;
     469                }
     470
     471                ipc_answer_0(callid, retval);
     472        }
     473}
     474
    428475static void cons_write(console_t *cons, ipc_callid_t rid, ipc_call_t *request)
    429476{
     
    675722                return false;
    676723        }
    677        
     724
    678725        kbd_phone = fd_phone(input_fd);
    679726        if (kbd_phone < 0) {
     
    681728                return false;
    682729        }
    683        
     730
    684731        /* NB: The callback connection is slotted for removal */
    685732        ipcarg_t phonehash;
     
    688735                return false;
    689736        }
    690        
     737
    691738        async_new_connection(phonehash, 0, NULL, keyboard_events);
     739
     740        /* Connect to mouse device */
     741        mouse_phone = -1;
     742        int mouse_fd = open("/dev/hid_in/mouse", O_RDONLY);
     743
     744        if (mouse_fd < 0) {
     745                printf(NAME ": Notice - failed opening %s\n", "/dev/hid_in/mouse");
     746                goto skip_mouse;
     747        }
     748
     749        mouse_phone = fd_phone(mouse_fd);
     750        if (mouse_phone < 0) {
     751                printf(NAME ": Failed to connect to mouse device\n");
     752                goto skip_mouse;
     753        }
     754
     755        if (ipc_connect_to_me(mouse_phone, SERVICE_CONSOLE, 0, 0, &phonehash) != 0) {
     756                printf(NAME ": Failed to create callback from mouse device\n");
     757                mouse_phone = -1;
     758                goto skip_mouse;
     759        }
     760
     761        async_new_connection(phonehash, 0, NULL, mouse_events);
     762skip_mouse:
    692763
    693764        /* Connect to framebuffer driver */
     
    697768                return -1;
    698769        }
    699        
     770
    700771        /* Register driver */
    701772        int rc = devmap_driver_register(NAME, client_connection);
  • uspace/srv/kbd/Makefile.build

    rbb2dbf8 r73f56e4  
    7575ifeq ($(UARCH),ia32)
    7676        SOURCES += \
    77                 port/i8042.c \
     77                port/chardev.c \
    7878                ctl/pc.c
    7979endif
  • uspace/srv/kbd/generic/kbd.c

    rbb2dbf8 r73f56e4  
    6060#define NAMESPACE  "hid_in"
    6161
    62 int phone2cons = -1;
     62int client_phone = -1;
    6363
    6464/** Currently active modifiers. */
     
    164164        ev.c = layout[active_layout]->parse_ev(&ev);
    165165
    166         async_msg_4(phone2cons, KBD_EVENT, ev.type, ev.key, ev.mods, ev.c);
    167 }
    168 
    169 static void console_connection(ipc_callid_t iid, ipc_call_t *icall)
     166        async_msg_4(client_phone, KBD_EVENT, ev.type, ev.key, ev.mods, ev.c);
     167}
     168
     169static void client_connection(ipc_callid_t iid, ipc_call_t *icall)
    170170{
    171171        ipc_callid_t callid;
     
    179179                switch (IPC_GET_METHOD(call)) {
    180180                case IPC_M_PHONE_HUNGUP:
    181                         if (phone2cons != -1) {
    182                                 ipc_hangup(phone2cons);
    183                                 phone2cons = -1;
     181                        if (client_phone != -1) {
     182                                ipc_hangup(client_phone);
     183                                client_phone = -1;
    184184                        }
    185185                       
     
    187187                        return;
    188188                case IPC_M_CONNECT_TO_ME:
    189                         if (phone2cons != -1) {
     189                        if (client_phone != -1) {
    190190                                retval = ELIMIT;
    191191                                break;
    192192                        }
    193                         phone2cons = IPC_GET_ARG5(call);
     193                        client_phone = IPC_GET_ARG5(call);
    194194                        retval = 0;
    195195                        break;
     
    238238       
    239239        /* Register driver */
    240         int rc = devmap_driver_register(NAME, console_connection);
     240        int rc = devmap_driver_register(NAME, client_connection);
    241241        if (rc < 0) {
    242242                printf(NAME ": Unable to register driver (%d)\n", rc);
Note: See TracChangeset for help on using the changeset viewer.