Changes in uspace/srv/hid/input/generic/input.c [b72efe8:336d2f52] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hid/input/generic/input.c
rb72efe8 r336d2f52 58 58 #include <kbd_port.h> 59 59 #include <kbd_ctl.h> 60 #include <mouse_proto.h> 60 61 #include <layout.h> 61 62 #include <mouse.h> … … 65 66 66 67 /* In microseconds */ 67 #define DISCOVERY_POLL_INTERVAL (10*1000*1000) 68 69 static void kbd_devs_yield(void); 70 static void kbd_devs_reclaim(void); 71 72 static void input_event_key(int, unsigned int, unsigned, wchar_t); 73 74 int client_phone = -1; 75 76 /** List of keyboard devices */ 77 static list_t kbd_devs; 78 79 /** List of mouse devices */ 80 list_t mouse_devs; 81 82 bool irc_service = false; 83 int irc_phone = -1; 84 85 #define NUM_LAYOUTS 3 68 #define DISCOVERY_POLL_INTERVAL (10 * 1000 * 1000) 69 70 #define NUM_LAYOUTS 3 86 71 87 72 static layout_ops_t *layout[NUM_LAYOUTS] = { … … 91 76 }; 92 77 93 void kbd_push_scancode(kbd_dev_t *kdev, int scancode) 94 { 95 /* printf("scancode: 0x%x\n", scancode);*/ 96 (*kdev->ctl_ops->parse_scancode)(scancode); 97 } 98 99 void kbd_push_ev(kbd_dev_t *kdev, int type, unsigned int key) 78 static void kbd_devs_yield(void); 79 static void kbd_devs_reclaim(void); 80 81 int client_phone = -1; 82 83 /** List of keyboard devices */ 84 static list_t kbd_devs; 85 86 /** List of mouse devices */ 87 static list_t mouse_devs; 88 89 bool irc_service = false; 90 int irc_phone = -1; 91 92 void kbd_push_data(kbd_dev_t *kdev, sysarg_t data) 93 { 94 (*kdev->ctl_ops->parse)(data); 95 } 96 97 void mouse_push_data(mouse_dev_t *mdev, sysarg_t data) 98 { 99 (*mdev->proto_ops->parse)(data); 100 } 101 102 void kbd_push_event(kbd_dev_t *kdev, int type, unsigned int key) 100 103 { 101 104 kbd_event_t ev; 102 unsigned mod_mask;103 105 unsigned int mod_mask; 106 104 107 switch (key) { 105 108 case KC_LCTRL: mod_mask = KM_LCTRL; break; … … 111 114 default: mod_mask = 0; break; 112 115 } 113 116 114 117 if (mod_mask != 0) { 115 118 if (type == KEY_PRESS) … … 118 121 kdev->mods = kdev->mods & ~mod_mask; 119 122 } 120 123 121 124 switch (key) { 122 125 case KC_CAPS_LOCK: mod_mask = KM_CAPS_LOCK; break; … … 125 128 default: mod_mask = 0; break; 126 129 } 127 130 128 131 if (mod_mask != 0) { 129 132 if (type == KEY_PRESS) { … … 135 138 kdev->mods = kdev->mods ^ (mod_mask & ~kdev->lock_keys); 136 139 kdev->lock_keys = kdev->lock_keys | mod_mask; 137 140 138 141 /* Update keyboard lock indicator lights. */ 139 142 (*kdev->ctl_ops->set_ind)(kdev, kdev->mods); … … 142 145 } 143 146 } 144 /* 145 printf("type: %d\n", type); 146 printf("mods: 0x%x\n", mods); 147 printf("keycode: %u\n", key); 148 */ 147 149 148 if (type == KEY_PRESS && (kdev->mods & KM_LCTRL) && 150 149 key == KC_F1) { 151 150 layout_destroy(kdev->active_layout); 152 151 kdev->active_layout = layout_create(layout[0]); 153 152 return; 154 153 } 155 154 156 155 if (type == KEY_PRESS && (kdev->mods & KM_LCTRL) && 157 156 key == KC_F2) { 158 157 layout_destroy(kdev->active_layout); 159 158 kdev->active_layout = layout_create(layout[1]); 160 159 return; 161 160 } 162 161 163 162 if (type == KEY_PRESS && (kdev->mods & KM_LCTRL) && 164 163 key == KC_F3) { 165 164 layout_destroy(kdev->active_layout); 166 165 kdev->active_layout = layout_create(layout[2]); 167 166 return; 168 167 } 169 168 170 169 ev.type = type; 171 170 ev.key = key; 172 171 ev.mods = kdev->mods; 173 172 174 173 ev.c = layout_parse_ev(kdev->active_layout, &ev); 175 input_event_key(ev.type, ev.key, ev.mods, ev.c); 176 } 177 178 /** Key has been pressed or released. */ 179 static void input_event_key(int type, unsigned int key, unsigned mods, 180 wchar_t c) 181 { 182 async_obsolete_msg_4(client_phone, INPUT_EVENT_KEY, type, key, 183 mods, c); 174 async_obsolete_msg_4(client_phone, INPUT_EVENT_KEY, ev.type, ev.key, 175 ev.mods, ev.c); 184 176 } 185 177 186 178 /** Mouse pointer has moved. */ 187 void input_event_move(int dx, int dy)179 void mouse_push_event_move(mouse_dev_t *mdev, int dx, int dy) 188 180 { 189 181 async_obsolete_msg_2(client_phone, INPUT_EVENT_MOVE, dx, dy); … … 191 183 192 184 /** Mouse button has been pressed. */ 193 void input_event_button(int bnum, int press)185 void mouse_push_event_button(mouse_dev_t *mdev, int bnum, int press) 194 186 { 195 187 async_obsolete_msg_2(client_phone, INPUT_EVENT_BUTTON, bnum, press); … … 201 193 ipc_call_t call; 202 194 int retval; 203 195 204 196 async_answer_0(iid, EOK); 205 197 206 198 while (true) { 207 199 callid = async_get_call(&call); … … 237 229 retval = EINVAL; 238 230 } 231 239 232 async_answer_0(callid, retval); 240 } 233 } 241 234 } 242 235 243 236 static kbd_dev_t *kbd_dev_new(void) 244 237 { 245 kbd_dev_t *kdev; 246 247 kdev = calloc(1, sizeof(kbd_dev_t)); 238 kbd_dev_t *kdev = calloc(1, sizeof(kbd_dev_t)); 248 239 if (kdev == NULL) { 249 printf( NAME ": Error allocating keyboard device. "250 "Out of memory.\n" );240 printf("%s: Error allocating keyboard device. " 241 "Out of memory.\n", NAME); 251 242 return NULL; 252 243 } 253 244 254 245 link_initialize(&kdev->kbd_devs); 255 246 256 247 kdev->mods = KM_NUM_LOCK; 257 248 kdev->lock_keys = 0; 258 249 kdev->active_layout = layout_create(layout[0]); 259 250 260 251 return kdev; 252 } 253 254 static mouse_dev_t *mouse_dev_new(void) 255 { 256 mouse_dev_t *mdev = calloc(1, sizeof(mouse_dev_t)); 257 if (mdev == NULL) { 258 printf("%s: Error allocating keyboard device. " 259 "Out of memory.\n", NAME); 260 return NULL; 261 } 262 263 link_initialize(&mdev->mouse_devs); 264 265 return mdev; 261 266 } 262 267 … … 264 269 static void kbd_add_dev(kbd_port_ops_t *port, kbd_ctl_ops_t *ctl) 265 270 { 266 kbd_dev_t *kdev; 267 268 kdev = kbd_dev_new(); 271 kbd_dev_t *kdev = kbd_dev_new(); 269 272 if (kdev == NULL) 270 273 return; 271 274 272 275 kdev->port_ops = port; 273 276 kdev->ctl_ops = ctl; 274 277 kdev->dev_path = NULL; 275 278 276 279 /* Initialize port driver. */ 277 280 if ((*kdev->port_ops->init)(kdev) != 0) 278 281 goto fail; 279 282 280 283 /* Initialize controller driver. */ 281 284 if ((*kdev->ctl_ops->init)(kdev) != 0) { … … 283 286 goto fail; 284 287 } 285 288 286 289 list_append(&kdev->kbd_devs, &kbd_devs); 287 290 return; 291 288 292 fail: 289 293 free(kdev); 290 294 } 291 295 296 /** Add new legacy mouse device. */ 297 static void mouse_add_dev(mouse_port_ops_t *port, mouse_proto_ops_t *proto) 298 { 299 mouse_dev_t *mdev = mouse_dev_new(); 300 if (mdev == NULL) 301 return; 302 303 mdev->port_ops = port; 304 mdev->proto_ops = proto; 305 mdev->dev_path = NULL; 306 307 /* Initialize port driver. */ 308 if ((*mdev->port_ops->init)(mdev) != 0) 309 goto fail; 310 311 /* Initialize protocol driver. */ 312 if ((*mdev->proto_ops->init)(mdev) != 0) { 313 /* XXX Uninit port */ 314 goto fail; 315 } 316 317 list_append(&mdev->mouse_devs, &mouse_devs); 318 return; 319 320 fail: 321 free(mdev); 322 } 323 292 324 /** Add new kbdev device. 293 325 * 294 * @param dev_path Filesystem path to the device (/dev/class/...) 326 * @param dev_path Filesystem path to the device (/dev/class/...) 327 * 295 328 */ 296 329 static int kbd_add_kbdev(const char *dev_path) 297 330 { 298 kbd_dev_t *kdev; 299 300 kdev = kbd_dev_new(); 331 kbd_dev_t *kdev = kbd_dev_new(); 301 332 if (kdev == NULL) 302 333 return -1; 303 334 304 335 kdev->dev_path = dev_path; 305 336 kdev->port_ops = NULL; 306 337 kdev->ctl_ops = &kbdev_ctl; 307 338 308 339 /* Initialize controller driver. */ 309 340 if ((*kdev->ctl_ops->init)(kdev) != 0) { 310 341 goto fail; 311 342 } 312 343 313 344 list_append(&kdev->kbd_devs, &kbd_devs); 314 345 return EOK; 346 315 347 fail: 316 348 free(kdev); 349 return -1; 350 } 351 352 /** Add new mousedev device. 353 * 354 * @param dev_path Filesystem path to the device (/dev/class/...) 355 * 356 */ 357 static int mouse_add_mousedev(const char *dev_path) 358 { 359 mouse_dev_t *mdev = mouse_dev_new(); 360 if (mdev == NULL) 361 return -1; 362 363 mdev->dev_path = dev_path; 364 mdev->port_ops = NULL; 365 mdev->proto_ops = &mousedev_proto; 366 367 /* Initialize controller driver. */ 368 if ((*mdev->proto_ops->init)(mdev) != 0) { 369 goto fail; 370 } 371 372 list_append(&mdev->mouse_devs, &mouse_devs); 373 return EOK; 374 375 fail: 376 free(mdev); 317 377 return -1; 318 378 } … … 364 424 kbd_add_dev(&niagara_port, &stty_ctl); 365 425 #endif 366 #if defined(UARCH_sparc64) && defined(MACHINE_serengeti)367 kbd_add_dev(&sgcn_port, &stty_ctl);368 #endif369 426 #if defined(UARCH_sparc64) && defined(MACHINE_generic) 370 kbd_add_dev(&z8530_port, &sun_ctl);371 427 kbd_add_dev(&ns16550_port, &sun_ctl); 372 428 #endif 373 429 /* Silence warning on abs32le about kbd_add_dev() being unused */ 374 430 (void) kbd_add_dev; 431 } 432 433 /** Add legacy drivers/devices. */ 434 static void mouse_add_legacy_devs(void) 435 { 436 /* 437 * Need to add these drivers based on config unless we can probe 438 * them automatically. 439 */ 440 #if defined(UARCH_amd64) 441 mouse_add_dev(&chardev_mouse_port, &ps2_proto); 442 #endif 443 #if defined(UARCH_ia32) 444 mouse_add_dev(&chardev_mouse_port, &ps2_proto); 445 #endif 446 #if defined(MACHINE_i460GX) 447 mouse_add_dev(&chardev_mouse_port, &ps2_proto); 448 #endif 449 #if defined(UARCH_ppc32) 450 mouse_add_dev(&adb_mouse_port, &adb_proto); 451 #endif 452 /* Silence warning on abs32le about mouse_add_dev() being unused */ 453 (void) mouse_add_dev; 375 454 } 376 455 … … 381 460 kbd_dev_t *kdev = list_get_instance(kdev_link, kbd_dev_t, 382 461 kbd_devs); 383 462 384 463 /* Yield port */ 385 464 if (kdev->port_ops != NULL) … … 394 473 kbd_dev_t *kdev = list_get_instance(kdev_link, kbd_dev_t, 395 474 kbd_devs); 396 475 397 476 /* Reclaim port */ 398 477 if (kdev->port_ops != NULL) … … 405 484 * Looks under /dev/class/keyboard and /dev/class/mouse. 406 485 * 407 * @param arg Ignored 486 * @param arg Ignored 487 * 408 488 */ 409 489 static int dev_discovery_fibril(void *arg) … … 413 493 size_t mouse_id = 1; 414 494 int rc; 415 495 416 496 while (true) { 417 497 async_usleep(DISCOVERY_POLL_INTERVAL); 418 498 419 499 /* 420 500 * Check for new keyboard device … … 423 503 if (rc < 0) 424 504 continue; 425 505 426 506 if (kbd_add_kbdev(dev_path) == EOK) { 427 printf( NAME ": Connected keyboard device '%s'\n",428 dev_path);429 507 printf("%s: Connected keyboard device '%s'\n", 508 NAME, dev_path); 509 430 510 /* XXX Handle device removal */ 431 511 ++kbd_id; 432 512 } 433 513 434 514 free(dev_path); 435 515 436 516 /* 437 517 * Check for new mouse device … … 440 520 if (rc < 0) 441 521 continue; 442 443 if (mouse_add_ dev(dev_path) == EOK) {444 printf( NAME ": Connected mouse device '%s'\n",445 dev_path);446 522 523 if (mouse_add_mousedev(dev_path) == EOK) { 524 printf("%s: Connected mouse device '%s'\n", 525 NAME, dev_path); 526 447 527 /* XXX Handle device removal */ 448 528 ++mouse_id; 449 529 } 450 530 451 531 free(dev_path); 452 532 } 453 533 454 534 return EOK; 455 535 } … … 458 538 static void input_start_dev_discovery(void) 459 539 { 460 fid_t fid; 461 462 fid = fibril_create(dev_discovery_fibril, NULL); 540 fid_t fid = fibril_create(dev_discovery_fibril, NULL); 463 541 if (!fid) { 464 printf(NAME ": Failed to create device discovery fibril.\n"); 542 printf("%s: Failed to create device discovery fibril.\n", 543 NAME); 465 544 return; 466 545 } 467 546 468 547 fibril_add_ready(fid); 469 548 } … … 473 552 printf("%s: HelenOS input service\n", NAME); 474 553 475 sysarg_t fhc;476 554 sysarg_t obio; 477 555 … … 479 557 list_initialize(&mouse_devs); 480 558 481 if (((sysinfo_get_value("kbd.cir.fhc", &fhc) == EOK) && (fhc)) 482 || ((sysinfo_get_value("kbd.cir.obio", &obio) == EOK) && (obio))) 559 if ((sysinfo_get_value("kbd.cir.obio", &obio) == EOK) && (obio)) 483 560 irc_service = true; 484 561 … … 490 567 /* Add legacy keyboard devices. */ 491 568 kbd_add_legacy_devs(); 492 493 /* Add legacy (devmap-style) mouse device. */494 (void) mouse_add_dev("/dev/hid_in/mouse");569 570 /* Add legacy mouse devices. */ 571 mouse_add_legacy_devs(); 495 572 496 573 /* Register driver */ … … 509 586 return -1; 510 587 } 511 588 512 589 /* Start looking for new input devices */ 513 590 input_start_dev_discovery(); 514 515 printf( NAME ": Accepting connections\n");591 592 printf("%s: Accepting connections\n", NAME); 516 593 async_manager(); 517 594 518 595 /* Not reached. */ 519 596 return 0;
Note:
See TracChangeset
for help on using the changeset viewer.