Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/hw/char/i8042/i8042.c

    r5da7199 r9934f7d  
    3232 * @ingroup kbd
    3333 * @{
    34  */
     34 */ 
    3535/** @file
    3636 * @brief i8042 PS/2 port driver.
     
    3939#include <ddi.h>
    4040#include <libarch/ddi.h>
    41 #include <loc.h>
     41#include <devmap.h>
    4242#include <async.h>
     43#include <async_obsolete.h>
    4344#include <unistd.h>
    4445#include <sysinfo.h>
     
    4849#include "i8042.h"
    4950
    50 #define NAME       "i8042"
    51 #define NAMESPACE  "char"
     51// FIXME: remove this header
     52#include <kernel/ipc/ipc_methods.h>
     53
     54#define NAME "i8042"
     55#define NAMESPACE "char"
    5256
    5357/* Interesting bits for status register */
     
    131135        printf(NAME ": i8042 PS/2 port driver\n");
    132136
    133         rc = loc_server_register(NAME, i8042_connection);
     137        rc = devmap_driver_register(NAME, i8042_connection);
    134138        if (rc < 0) {
    135                 printf(NAME ": Unable to register server.\n");
     139                printf(NAME ": Unable to register driver.\n");
    136140                return rc;
    137141        }
     
    141145
    142146        for (i = 0; i < MAX_DEVS; i++) {
    143                 i8042_port[i].client_sess = NULL;
     147                i8042_port[i].client_phone = -1;
    144148
    145149                snprintf(name, 16, "%s/ps2%c", NAMESPACE, dchar[i]);
    146                 rc = loc_service_register(name, &i8042_port[i].service_id);
     150                rc = devmap_device_register(name, &i8042_port[i].devmap_handle);
    147151                if (rc != EOK) {
    148152                        printf(NAME ": Unable to register device %s.\n", name);
     
    217221        ipc_call_t call;
    218222        sysarg_t method;
    219         service_id_t dsid;
     223        devmap_handle_t dh;
    220224        int retval;
    221225        int dev_id, i;
     
    224228
    225229        /* Get the device handle. */
    226         dsid = IPC_GET_ARG1(*icall);
     230        dh = IPC_GET_ARG1(*icall);
    227231
    228232        /* Determine which disk device is the client connecting to. */
    229233        dev_id = -1;
    230234        for (i = 0; i < MAX_DEVS; i++) {
    231                 if (i8042_port[i].service_id == dsid)
     235                if (i8042_port[i].devmap_handle == dh)
    232236                        dev_id = i;
    233237        }
     
    253257                }
    254258               
    255                 async_sess_t *sess =
    256                     async_callback_receive_start(EXCHANGE_SERIALIZE, &call);
    257                 if (sess != NULL) {
    258                         if (i8042_port[dev_id].client_sess == NULL) {
    259                                 i8042_port[dev_id].client_sess = sess;
    260                                 retval = EOK;
    261                         } else
     259                switch (method) {
     260                case IPC_M_CONNECT_TO_ME:
     261                        printf(NAME ": creating callback connection\n");
     262                        if (i8042_port[dev_id].client_phone != -1) {
    262263                                retval = ELIMIT;
    263                 } else {
    264                         switch (method) {
    265                         case IPC_FIRST_USER_METHOD:
    266                                 printf(NAME ": write %" PRIun " to devid %d\n",
    267                                     IPC_GET_ARG1(call), dev_id);
    268                                 i8042_port_write(dev_id, IPC_GET_ARG1(call));
    269                                 retval = 0;
    270                                 break;
    271                         default:
    272                                 retval = EINVAL;
    273264                                break;
    274265                        }
     266                        i8042_port[dev_id].client_phone = IPC_GET_ARG5(call);
     267                        retval = 0;
     268                        break;
     269                case IPC_FIRST_USER_METHOD:
     270                        printf(NAME ": write %" PRIun " to devid %d\n",
     271                            IPC_GET_ARG1(call), dev_id);
     272                        i8042_port_write(dev_id, IPC_GET_ARG1(call));
     273                        retval = 0;
     274                        break;
     275                default:
     276                        retval = EINVAL;
     277                        break;
    275278                }
    276                
    277279                async_answer_0(callid, retval);
    278280        }
     
    303305        }
    304306
    305         if (i8042_port[devid].client_sess != NULL) {
    306                 async_exch_t *exch =
    307                     async_exchange_begin(i8042_port[devid].client_sess);
    308                 async_msg_1(exch, IPC_FIRST_USER_METHOD, data);
    309                 async_exchange_end(exch);
     307        if (i8042_port[devid].client_phone != -1) {
     308                async_obsolete_msg_1(i8042_port[devid].client_phone,
     309                    IPC_FIRST_USER_METHOD, data);
    310310        }
    311311}
Note: See TracChangeset for help on using the changeset viewer.