Changes in uspace/srv/hw/char/i8042/i8042.c [9934f7d:5da7199] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hw/char/i8042/i8042.c
r9934f7d r5da7199 32 32 * @ingroup kbd 33 33 * @{ 34 */ 34 */ 35 35 /** @file 36 36 * @brief i8042 PS/2 port driver. … … 39 39 #include <ddi.h> 40 40 #include <libarch/ddi.h> 41 #include < devmap.h>41 #include <loc.h> 42 42 #include <async.h> 43 #include <async_obsolete.h>44 43 #include <unistd.h> 45 44 #include <sysinfo.h> … … 49 48 #include "i8042.h" 50 49 51 // FIXME: remove this header 52 #include <kernel/ipc/ipc_methods.h> 53 54 #define NAME "i8042" 55 #define NAMESPACE "char" 50 #define NAME "i8042" 51 #define NAMESPACE "char" 56 52 57 53 /* Interesting bits for status register */ … … 135 131 printf(NAME ": i8042 PS/2 port driver\n"); 136 132 137 rc = devmap_driver_register(NAME, i8042_connection);133 rc = loc_server_register(NAME, i8042_connection); 138 134 if (rc < 0) { 139 printf(NAME ": Unable to register driver.\n");135 printf(NAME ": Unable to register server.\n"); 140 136 return rc; 141 137 } … … 145 141 146 142 for (i = 0; i < MAX_DEVS; i++) { 147 i8042_port[i].client_ phone = -1;143 i8042_port[i].client_sess = NULL; 148 144 149 145 snprintf(name, 16, "%s/ps2%c", NAMESPACE, dchar[i]); 150 rc = devmap_device_register(name, &i8042_port[i].devmap_handle);146 rc = loc_service_register(name, &i8042_port[i].service_id); 151 147 if (rc != EOK) { 152 148 printf(NAME ": Unable to register device %s.\n", name); … … 221 217 ipc_call_t call; 222 218 sysarg_t method; 223 devmap_handle_t dh;219 service_id_t dsid; 224 220 int retval; 225 221 int dev_id, i; … … 228 224 229 225 /* Get the device handle. */ 230 d h= IPC_GET_ARG1(*icall);226 dsid = IPC_GET_ARG1(*icall); 231 227 232 228 /* Determine which disk device is the client connecting to. */ 233 229 dev_id = -1; 234 230 for (i = 0; i < MAX_DEVS; i++) { 235 if (i8042_port[i]. devmap_handle == dh)231 if (i8042_port[i].service_id == dsid) 236 232 dev_id = i; 237 233 } … … 257 253 } 258 254 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) { 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 263 262 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; 264 273 break; 265 274 } 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;278 275 } 276 279 277 async_answer_0(callid, retval); 280 278 } … … 305 303 } 306 304 307 if (i8042_port[devid].client_phone != -1) { 308 async_obsolete_msg_1(i8042_port[devid].client_phone, 309 IPC_FIRST_USER_METHOD, data); 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); 310 310 } 311 311 }
Note:
See TracChangeset
for help on using the changeset viewer.