Changeset db6e419 in mainline for uspace/srv/hid/input
- Timestamp:
- 2011-08-16T18:53:00Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 49160c4
- Parents:
- e0e922d (diff), 45058baa (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. - Location:
- uspace/srv/hid/input
- Files:
-
- 9 edited
-
ctl/kbdev.c (modified) (7 diffs)
-
generic/input.c (modified) (15 diffs)
-
include/kbd.h (modified) (2 diffs)
-
include/mouse.h (modified) (2 diffs)
-
port/adb.c (modified) (3 diffs)
-
port/adb_mouse.c (modified) (2 diffs)
-
port/chardev.c (modified) (4 diffs)
-
port/chardev_mouse.c (modified) (4 diffs)
-
proto/mousedev.c (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hid/input/ctl/kbdev.c
re0e922d rdb6e419 48 48 #include <kbd_ctl.h> 49 49 #include <kbd_port.h> 50 #include <loc.h> 50 51 #include <stdlib.h> 51 52 #include <vfs/vfs_sess.h> 52 53 #include <sys/typefmt.h> 53 54 54 55 static int kbdev_ctl_init(kbd_dev_t *); … … 70 71 /** Session with kbdev device */ 71 72 async_sess_t *sess; 72 73 /** File descriptor of open kbdev device */74 int fd;75 73 } kbdev_t; 76 74 … … 84 82 85 83 kbdev->kbd_dev = kdev; 86 kbdev->fd = -1;87 84 88 85 return kbdev; … … 93 90 if (kbdev->sess != NULL) 94 91 async_hangup(kbdev->sess); 95 if (kbdev->fd >= 0)96 close(kbdev->fd);97 92 free(kbdev); 98 93 } … … 100 95 static int kbdev_ctl_init(kbd_dev_t *kdev) 101 96 { 102 const char *pathname;103 97 async_sess_t *sess; 104 98 async_exch_t *exch; 105 99 kbdev_t *kbdev; 106 int fd;107 100 int rc; 108 101 109 pathname = kdev->dev_path; 110 111 fd = open(pathname, O_RDWR); 112 if (fd < 0) { 113 return -1; 114 } 115 116 sess = fd_session(EXCHANGE_SERIALIZE, fd); 102 sess = loc_service_connect(EXCHANGE_SERIALIZE, kdev->svc_id, 0); 117 103 if (sess == NULL) { 118 printf("%s: Failed starting session with '%s '\n", NAME, pathname);119 close(fd);104 printf("%s: Failed starting session with '%s.'\n", NAME, 105 kdev->svc_name); 120 106 return -1; 121 107 } … … 124 110 if (kbdev == NULL) { 125 111 printf("%s: Failed allocating device structure for '%s'.\n", 126 NAME, pathname);112 NAME, kdev->svc_name); 127 113 return -1; 128 114 } 129 115 130 kbdev->fd = fd;131 116 kbdev->sess = sess; 132 117 133 118 exch = async_exchange_begin(sess); 134 119 if (exch == NULL) { 135 printf("%s: Failed starting exchange with '%s'.\n", NAME, pathname); 120 printf("%s: Failed starting exchange with '%s'.\n", NAME, 121 kdev->svc_name); 136 122 kbdev_destroy(kbdev); 137 123 return -1; … … 141 127 if (rc != EOK) { 142 128 printf("%s: Failed creating callback connection from '%s'.\n", 143 NAME, pathname);129 NAME, kdev->svc_name); 144 130 async_exchange_end(exch); 145 131 kbdev_destroy(kbdev); -
uspace/srv/hid/input/generic/input.c
re0e922d rdb6e419 38 38 39 39 #include <adt/list.h> 40 #include <bool.h> 40 41 #include <ipc/services.h> 41 42 #include <ipc/input.h> … … 53 54 #include <io/console.h> 54 55 #include <io/keycode.h> 55 #include < devmap.h>56 #include <loc.h> 56 57 #include <input.h> 57 58 #include <kbd.h> … … 63 64 64 65 // FIXME: remove this header 65 #include < kernel/ipc/ipc_methods.h>66 #include <abi/ipc/methods.h> 66 67 67 68 /* In microseconds */ … … 275 276 kdev->port_ops = port; 276 277 kdev->ctl_ops = ctl; 277 kdev-> dev_path = NULL;278 kdev->svc_id = 0; 278 279 279 280 /* Initialize port driver. */ … … 303 304 mdev->port_ops = port; 304 305 mdev->proto_ops = proto; 305 mdev-> dev_path = NULL;306 mdev->svc_id = 0; 306 307 307 308 /* Initialize port driver. */ … … 324 325 /** Add new kbdev device. 325 326 * 326 * @param dev_path Filesystem path to the device (/dev/class/...)327 * @param service_id Service ID of the keyboard device 327 328 * 328 329 */ 329 static int kbd_add_kbdev( const char *dev_path)330 static int kbd_add_kbdev(service_id_t service_id, kbd_dev_t **kdevp) 330 331 { 331 332 kbd_dev_t *kdev = kbd_dev_new(); … … 333 334 return -1; 334 335 335 kdev-> dev_path = dev_path;336 kdev->svc_id = service_id; 336 337 kdev->port_ops = NULL; 337 338 kdev->ctl_ops = &kbdev_ctl; 338 339 340 int rc = loc_service_get_name(service_id, &kdev->svc_name); 341 if (rc != EOK) { 342 kdev->svc_name = NULL; 343 goto fail; 344 } 345 339 346 /* Initialize controller driver. */ 340 347 if ((*kdev->ctl_ops->init)(kdev) != 0) { … … 343 350 344 351 list_append(&kdev->kbd_devs, &kbd_devs); 352 *kdevp = kdev; 345 353 return EOK; 346 354 347 355 fail: 356 if (kdev->svc_name != NULL) 357 free(kdev->svc_name); 348 358 free(kdev); 349 359 return -1; … … 352 362 /** Add new mousedev device. 353 363 * 354 * @param dev_path Filesystem path to the device (/dev/class/...)364 * @param service_id Service ID of the mouse device 355 365 * 356 366 */ 357 static int mouse_add_mousedev( const char *dev_path)367 static int mouse_add_mousedev(service_id_t service_id, mouse_dev_t **mdevp) 358 368 { 359 369 mouse_dev_t *mdev = mouse_dev_new(); … … 361 371 return -1; 362 372 363 mdev-> dev_path = dev_path;373 mdev->svc_id = service_id; 364 374 mdev->port_ops = NULL; 365 375 mdev->proto_ops = &mousedev_proto; 366 376 377 int rc = loc_service_get_name(service_id, &mdev->svc_name); 378 if (rc != EOK) { 379 mdev->svc_name = NULL; 380 goto fail; 381 } 382 367 383 /* Initialize controller driver. */ 368 384 if ((*mdev->proto_ops->init)(mdev) != 0) { … … 371 387 372 388 list_append(&mdev->mouse_devs, &mouse_devs); 389 *mdevp = mdev; 373 390 return EOK; 374 391 … … 482 499 /** Periodically check for new input devices. 483 500 * 484 * Looks under / dev/class/keyboard and /dev/class/mouse.501 * Looks under /loc/class/keyboard and /loc/class/mouse. 485 502 * 486 503 * @param arg Ignored … … 489 506 static int dev_discovery_fibril(void *arg) 490 507 { 491 char *dev_path; 492 size_t kbd_id = 1; 493 size_t mouse_id = 1; 508 category_id_t keyboard_cat, mouse_cat; 509 service_id_t *svcs; 510 size_t count, i; 511 bool already_known; 494 512 int rc; 513 514 rc = loc_category_get_id("keyboard", &keyboard_cat, IPC_FLAG_BLOCKING); 515 if (rc != EOK) { 516 printf("%s: Failed resolving category 'keyboard'.\n", NAME); 517 return ENOENT; 518 } 519 520 rc = loc_category_get_id("mouse", &mouse_cat, IPC_FLAG_BLOCKING); 521 if (rc != EOK) { 522 printf("%s: Failed resolving category 'mouse'.\n", NAME); 523 return ENOENT; 524 } 495 525 496 526 while (true) { … … 498 528 499 529 /* 500 * Check for new keyboard device 530 * Check for new keyboard devices 501 531 */ 502 rc = asprintf(&dev_path, "/dev/class/keyboard\\%zu", kbd_id); 503 if (rc < 0) 532 rc = loc_category_get_svcs(keyboard_cat, &svcs, &count); 533 if (rc != EOK) { 534 printf("%s: Failed getting list of keyboard devices.\n", 535 NAME); 504 536 continue; 505 506 if (kbd_add_kbdev(dev_path) == EOK) { 507 printf("%s: Connected keyboard device '%s'\n",508 NAME, dev_path);537 } 538 539 for (i = 0; i < count; i++) { 540 already_known = false; 509 541 510 /* XXX Handle device removal */ 511 ++kbd_id; 542 /* Determine whether we already know this device. */ 543 list_foreach(kbd_devs, kdev_link) { 544 kbd_dev_t *kdev = list_get_instance(kdev_link, 545 kbd_dev_t, kbd_devs); 546 if (kdev->svc_id == svcs[i]) { 547 already_known = true; 548 break; 549 } 550 } 551 552 if (!already_known) { 553 kbd_dev_t *kdev; 554 if (kbd_add_kbdev(svcs[i], &kdev) == EOK) { 555 printf("%s: Connected keyboard device '%s'\n", 556 NAME, kdev->svc_name); 557 } 558 } 512 559 } 513 560 514 free(dev_path);561 /* XXX Handle device removal */ 515 562 516 563 /* 517 * Check for new mouse device 564 * Check for new mouse devices 518 565 */ 519 rc = asprintf(&dev_path, "/dev/class/mouse\\%zu", mouse_id); 520 if (rc < 0) 566 rc = loc_category_get_svcs(mouse_cat, &svcs, &count); 567 if (rc != EOK) { 568 printf("%s: Failed getting list of mouse devices.\n", 569 NAME); 521 570 continue; 522 523 if (mouse_add_mousedev(dev_path) == EOK) { 524 printf("%s: Connected mouse device '%s'\n",525 NAME, dev_path);571 } 572 573 for (i = 0; i < count; i++) { 574 already_known = false; 526 575 527 /* XXX Handle device removal */ 528 ++mouse_id; 576 /* Determine whether we already know this device. */ 577 list_foreach(mouse_devs, mdev_link) { 578 mouse_dev_t *mdev = list_get_instance(mdev_link, 579 mouse_dev_t, mouse_devs); 580 if (mdev->svc_id == svcs[i]) { 581 already_known = true; 582 break; 583 } 584 } 585 586 if (!already_known) { 587 mouse_dev_t *mdev; 588 if (mouse_add_mousedev(svcs[i], &mdev) == EOK) { 589 printf("%s: Connected mouse device '%s'\n", 590 NAME, mdev->svc_name); 591 } 592 } 529 593 } 530 594 531 free(dev_path);595 /* XXX Handle device removal */ 532 596 } 533 597 … … 572 636 573 637 /* Register driver */ 574 int rc = devmap_driver_register(NAME, client_connection);638 int rc = loc_server_register(NAME, client_connection); 575 639 if (rc < 0) { 576 printf("%s: Unable to register driver (%d)\n", NAME, rc);640 printf("%s: Unable to register server (%d)\n", NAME, rc); 577 641 return -1; 578 642 } 579 643 580 char kbd[ DEVMAP_NAME_MAXLEN + 1];581 snprintf(kbd, DEVMAP_NAME_MAXLEN, "%s/%s", NAMESPACE, NAME);582 583 devmap_handle_t devmap_handle;584 if ( devmap_device_register(kbd, &devmap_handle) != EOK) {585 printf("%s: Unable to register device %s\n", NAME, kbd);644 char kbd[LOC_NAME_MAXLEN + 1]; 645 snprintf(kbd, LOC_NAME_MAXLEN, "%s/%s", NAMESPACE, NAME); 646 647 service_id_t service_id; 648 if (loc_service_register(kbd, &service_id) != EOK) { 649 printf("%s: Unable to register service %s\n", NAME, kbd); 586 650 return -1; 587 651 } -
uspace/srv/hid/input/include/kbd.h
re0e922d rdb6e419 40 40 41 41 #include <adt/list.h> 42 #include <ipc/loc.h> 42 43 43 44 struct kbd_port_ops; … … 49 50 link_t kbd_devs; 50 51 51 /** Path to the device (only for kbdev devices) */ 52 const char *dev_path; 52 /** Service ID (only for kbdev devices) */ 53 service_id_t svc_id; 54 55 /** Device service name (only for kbdev devices) */ 56 char *svc_name; 53 57 54 58 /** Port ops */ -
uspace/srv/hid/input/include/mouse.h
re0e922d rdb6e419 39 39 40 40 #include <adt/list.h> 41 #include <ipc/loc.h> 41 42 42 43 struct mouse_port_ops; … … 47 48 link_t mouse_devs; 48 49 49 /** Path to the device (only for mouseev devices) */ 50 const char *dev_path; 50 /** Service ID (only for mousedev devices) */ 51 service_id_t svc_id; 52 53 /** Device service name (only for mousedev devices) */ 54 char *svc_name; 51 55 52 56 /** Port ops */ -
uspace/srv/hid/input/port/adb.c
re0e922d rdb6e419 43 43 #include <fcntl.h> 44 44 #include <errno.h> 45 #include < devmap.h>45 #include <loc.h> 46 46 47 47 static void kbd_port_events(ipc_callid_t iid, ipc_call_t *icall, void *arg); … … 66 66 { 67 67 const char *dev = "adb/kbd"; 68 devmap_handle_t handle;68 service_id_t service_id; 69 69 async_exch_t *exch; 70 70 int rc; … … 72 72 kbd_dev = kdev; 73 73 74 rc = devmap_device_get_handle(dev, &handle, 0);74 rc = loc_service_get_id(dev, &service_id, 0); 75 75 if (rc != EOK) 76 76 return rc; 77 77 78 dev_sess = devmap_device_connect(EXCHANGE_ATOMIC, handle, 0);78 dev_sess = loc_service_connect(EXCHANGE_ATOMIC, service_id, 0); 79 79 if (dev_sess == NULL) { 80 80 printf("%s: Failed to connect to device\n", NAME); -
uspace/srv/hid/input/port/adb_mouse.c
re0e922d rdb6e419 41 41 #include <mouse.h> 42 42 #include <errno.h> 43 #include < devmap.h>43 #include <loc.h> 44 44 45 45 static mouse_dev_t *mouse_dev; … … 78 78 mouse_dev = mdev; 79 79 80 devmap_handle_t handle;81 int rc = devmap_device_get_handle(dev, &handle, 0);80 service_id_t service_id; 81 int rc = loc_service_get_id(dev, &service_id, 0); 82 82 if (rc != EOK) 83 83 return rc; 84 84 85 dev_sess = devmap_device_connect(EXCHANGE_ATOMIC, handle, 0);85 dev_sess = loc_service_connect(EXCHANGE_ATOMIC, service_id, 0); 86 86 if (dev_sess == NULL) { 87 87 printf("%s: Failed to connect to device\n", NAME); -
uspace/srv/hid/input/port/chardev.c
re0e922d rdb6e419 40 40 #include <kbd_port.h> 41 41 #include <kbd.h> 42 #include < devmap.h>42 #include <loc.h> 43 43 #include <errno.h> 44 44 #include <stdio.h> … … 71 71 static int chardev_port_init(kbd_dev_t *kdev) 72 72 { 73 devmap_handle_t handle;73 service_id_t service_id; 74 74 async_exch_t *exch; 75 75 unsigned int i; … … 79 79 80 80 for (i = 0; i < num_devs; i++) { 81 rc = devmap_device_get_handle(in_devs[i], &handle, 0);81 rc = loc_service_get_id(in_devs[i], &service_id, 0); 82 82 if (rc == EOK) 83 83 break; … … 89 89 } 90 90 91 dev_sess = devmap_device_connect(EXCHANGE_ATOMIC, handle,91 dev_sess = loc_service_connect(EXCHANGE_ATOMIC, service_id, 92 92 IPC_FLAG_BLOCKING); 93 93 if (dev_sess == NULL) { -
uspace/srv/hid/input/port/chardev_mouse.c
re0e922d rdb6e419 39 39 #include <async.h> 40 40 #include <errno.h> 41 #include < devmap.h>41 #include <loc.h> 42 42 #include <input.h> 43 43 #include <mouse_port.h> … … 82 82 static int chardev_port_init(mouse_dev_t *mdev) 83 83 { 84 devmap_handle_t handle;84 service_id_t service_id; 85 85 unsigned int i; 86 86 int rc; … … 89 89 90 90 for (i = 0; i < num_devs; i++) { 91 rc = devmap_device_get_handle(in_devs[i], &handle, 0);91 rc = loc_service_get_id(in_devs[i], &service_id, 0); 92 92 if (rc == EOK) 93 93 break; … … 99 99 } 100 100 101 dev_sess = devmap_device_connect(EXCHANGE_ATOMIC, handle,101 dev_sess = loc_service_connect(EXCHANGE_ATOMIC, service_id, 102 102 IPC_FLAG_BLOCKING); 103 103 if (dev_sess == NULL) { -
uspace/srv/hid/input/proto/mousedev.c
re0e922d rdb6e419 44 44 #include <ipc/mouseev.h> 45 45 #include <input.h> 46 #include <loc.h> 46 47 #include <mouse.h> 47 48 #include <mouse_port.h> 48 49 #include <mouse_proto.h> 50 #include <sys/typefmt.h> 49 51 50 52 /** Mousedev softstate */ … … 55 57 /** Session to mouse device */ 56 58 async_sess_t *sess; 57 58 /** File descriptor of open mousedev device */59 int fd;60 59 } mousedev_t; 61 60 … … 67 66 68 67 mousedev->mouse_dev = mdev; 69 mousedev->fd = -1;70 68 71 69 return mousedev; … … 76 74 if (mousedev->sess != NULL) 77 75 async_hangup(mousedev->sess); 78 79 if (mousedev->fd >= 0)80 close(mousedev->fd);81 76 82 77 free(mousedev); … … 122 117 static int mousedev_proto_init(mouse_dev_t *mdev) 123 118 { 124 const char *pathname = mdev->dev_path; 125 126 int fd = open(pathname, O_RDWR); 127 if (fd < 0) 128 return -1; 129 130 async_sess_t *sess = fd_session(EXCHANGE_SERIALIZE, fd); 119 async_sess_t *sess = loc_service_connect(EXCHANGE_SERIALIZE, 120 mdev->svc_id, 0); 131 121 if (sess == NULL) { 132 printf("%s: Failed starting session with '%s'\n", NAME, pathname);133 close(fd);122 printf("%s: Failed starting session with '%s'\n", NAME, 123 mdev->svc_name); 134 124 return -1; 135 125 } … … 138 128 if (mousedev == NULL) { 139 129 printf("%s: Failed allocating device structure for '%s'.\n", 140 NAME, pathname);130 NAME, mdev->svc_name); 141 131 return -1; 142 132 } 143 133 144 mousedev->fd = fd;145 134 mousedev->sess = sess; 146 135 147 136 async_exch_t *exch = async_exchange_begin(sess); 148 137 if (exch == NULL) { 149 printf("%s: Failed starting exchange with '%s'.\n", NAME, pathname); 138 printf("%s: Failed starting exchange with '%s'.\n", NAME, 139 mdev->svc_name); 150 140 mousedev_destroy(mousedev); 151 141 return -1; … … 157 147 if (rc != EOK) { 158 148 printf("%s: Failed creating callback connection from '%s'.\n", 159 NAME, pathname);149 NAME, mdev->svc_name); 160 150 mousedev_destroy(mousedev); 161 151 return -1;
Note:
See TracChangeset
for help on using the changeset viewer.
