Changeset cc574511 in mainline for uspace/srv/hid
- Timestamp:
- 2011-08-16T12:37:58Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 16dc887
- Parents:
- 86ffa27f
- Location:
- uspace/srv/hid/input
- Files:
-
- 5 edited
-
ctl/kbdev.c (modified) (7 diffs)
-
generic/input.c (modified) (9 diffs)
-
include/kbd.h (modified) (2 diffs)
-
include/mouse.h (modified) (2 diffs)
-
proto/mousedev.c (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hid/input/ctl/kbdev.c
r86ffa27f rcc574511 48 48 #include <kbd_ctl.h> 49 49 #include <kbd_port.h> 50 #include <loc.h> 50 51 #include <stdlib.h> 52 #include <sys/typefmt.h> 51 53 #include <vfs/vfs_sess.h> 52 54 … … 70 72 /** Session with kbdev device */ 71 73 async_sess_t *sess; 72 73 /** File descriptor of open kbdev device */74 int fd;75 74 } kbdev_t; 76 75 … … 84 83 85 84 kbdev->kbd_dev = kdev; 86 kbdev->fd = -1;87 85 88 86 return kbdev; … … 93 91 if (kbdev->sess != NULL) 94 92 async_hangup(kbdev->sess); 95 if (kbdev->fd >= 0)96 close(kbdev->fd);97 93 free(kbdev); 98 94 } … … 100 96 static int kbdev_ctl_init(kbd_dev_t *kdev) 101 97 { 102 const char *pathname;103 98 async_sess_t *sess; 104 99 async_exch_t *exch; 105 100 kbdev_t *kbdev; 106 int fd;101 char *svc_name; 107 102 int rc; 108 103 109 pathname = kdev->dev_path; 104 if (asprintf(&svc_name, "devname%" PRIun, kdev->service_id) > 0) 105 svc_name = (char *) "unknown"; 110 106 111 fd = open(pathname, O_RDWR); 112 if (fd < 0) { 113 return -1; 114 } 115 116 sess = fd_session(EXCHANGE_SERIALIZE, fd); 107 sess = loc_service_connect(EXCHANGE_SERIALIZE, kdev->service_id, 0); 117 108 if (sess == NULL) { 118 printf("%s: Failed starting session with '%s '\n", NAME, pathname);119 close(fd);109 printf("%s: Failed starting session with '%s.'\n", NAME, 110 svc_name); 120 111 return -1; 121 112 } … … 124 115 if (kbdev == NULL) { 125 116 printf("%s: Failed allocating device structure for '%s'.\n", 126 NAME, pathname);117 NAME, svc_name); 127 118 return -1; 128 119 } 129 120 130 kbdev->fd = fd;131 121 kbdev->sess = sess; 132 122 133 123 exch = async_exchange_begin(sess); 134 124 if (exch == NULL) { 135 printf("%s: Failed starting exchange with '%s'.\n", NAME, pathname); 125 printf("%s: Failed starting exchange with '%s'.\n", NAME, 126 svc_name); 136 127 kbdev_destroy(kbdev); 137 128 return -1; … … 141 132 if (rc != EOK) { 142 133 printf("%s: Failed creating callback connection from '%s'.\n", 143 NAME, pathname);134 NAME, svc_name); 144 135 async_exchange_end(exch); 145 136 kbdev_destroy(kbdev); -
uspace/srv/hid/input/generic/input.c
r86ffa27f rcc574511 38 38 39 39 #include <adt/list.h> 40 #include <bool.h> 40 41 #include <ipc/services.h> 41 42 #include <ipc/input.h> … … 275 276 kdev->port_ops = port; 276 277 kdev->ctl_ops = ctl; 277 kdev-> dev_path = NULL;278 kdev->service_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->service_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 (/loc/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) 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->service_id = service_id; 336 337 kdev->port_ops = NULL; 337 338 kdev->ctl_ops = &kbdev_ctl; … … 352 353 /** Add new mousedev device. 353 354 * 354 * @param dev_path Filesystem path to the device (/loc/class/...)355 * @param service_id Service ID of the mouse device 355 356 * 356 357 */ 357 static int mouse_add_mousedev( const char *dev_path)358 static int mouse_add_mousedev(service_id_t service_id) 358 359 { 359 360 mouse_dev_t *mdev = mouse_dev_new(); … … 361 362 return -1; 362 363 363 mdev-> dev_path = dev_path;364 mdev->service_id = service_id; 364 365 mdev->port_ops = NULL; 365 366 mdev->proto_ops = &mousedev_proto; … … 487 488 * 488 489 */ 490 #include <sys/typefmt.h> 489 491 static int dev_discovery_fibril(void *arg) 490 492 { 491 char *dev_path; 492 size_t kbd_id = 1; 493 size_t mouse_id = 1; 493 category_id_t keyboard_cat, mouse_cat; 494 service_id_t *svcs; 495 size_t count, i; 496 bool already_known; 497 const char *dev_name = "todo"; 494 498 int rc; 499 500 rc = loc_category_get_id("keyboard", &keyboard_cat, IPC_FLAG_BLOCKING); 501 if (rc != EOK) { 502 printf("%s: Failed resolving category 'keyboard'.\n", NAME); 503 return ENOENT; 504 } 505 506 rc = loc_category_get_id("mouse", &mouse_cat, IPC_FLAG_BLOCKING); 507 if (rc != EOK) { 508 printf("%s: Failed resolving category 'mouse'.\n", NAME); 509 return ENOENT; 510 } 495 511 496 512 while (true) { … … 498 514 499 515 /* 500 * Check for new keyboard device 516 * Check for new keyboard devices 501 517 */ 502 rc = asprintf(&dev_path, "/loc/class/keyboard\\%zu", kbd_id); 503 if (rc < 0) 518 rc = loc_category_get_svcs(keyboard_cat, &svcs, &count); 519 if (rc != EOK) { 520 printf("%s: Failed getting list of keyboard devices.\n", 521 NAME); 504 522 continue; 505 506 if (kbd_add_kbdev(dev_path) == EOK) { 507 printf("%s: Connected keyboard device '%s'\n",508 NAME, dev_path);523 } 524 525 for (i = 0; i < count; i++) { 526 already_known = false; 509 527 510 /* XXX Handle device removal */ 511 ++kbd_id; 528 /* Determine whether we already know this device. */ 529 list_foreach(kbd_devs, kdev_link) { 530 kbd_dev_t *kdev = list_get_instance(kdev_link, 531 kbd_dev_t, kbd_devs); 532 if (kdev->service_id == svcs[i]) { 533 already_known = true; 534 break; 535 } 536 } 537 538 if (!already_known) { 539 if (kbd_add_kbdev(svcs[i]) == EOK) { 540 printf("%s: Connected keyboard device '%s'\n", 541 NAME, dev_name); 542 } 543 } 512 544 } 513 545 514 free(dev_path);546 /* XXX Handle device removal */ 515 547 516 548 /* 517 * Check for new mouse device 549 * Check for new mouse devices 518 550 */ 519 rc = asprintf(&dev_path, "/loc/class/mouse\\%zu", mouse_id); 520 if (rc < 0) 551 rc = loc_category_get_svcs(mouse_cat, &svcs, &count); 552 if (rc != EOK) { 553 printf("%s: Failed getting list of mouse devices.\n", 554 NAME); 521 555 continue; 522 523 if (mouse_add_mousedev(dev_path) == EOK) { 524 printf("%s: Connected mouse device '%s'\n",525 NAME, dev_path);556 } 557 558 for (i = 0; i < count; i++) { 559 already_known = false; 526 560 527 /* XXX Handle device removal */ 528 ++mouse_id; 561 /* Determine whether we already know this device. */ 562 list_foreach(mouse_devs, mdev_link) { 563 mouse_dev_t *mdev = list_get_instance(mdev_link, 564 mouse_dev_t, mouse_devs); 565 if (mdev->service_id == svcs[i]) { 566 already_known = true; 567 break; 568 } 569 } 570 571 if (!already_known) { 572 if (mouse_add_mousedev(svcs[i]) == EOK) { 573 printf("%s: Connected mouse device '%s'\n", 574 NAME, dev_name); 575 } 576 } 529 577 } 530 578 531 free(dev_path);579 /* XXX Handle device removal */ 532 580 } 533 581 -
uspace/srv/hid/input/include/kbd.h
r86ffa27f rcc574511 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 service_id; 53 54 54 55 /** Port ops */ -
uspace/srv/hid/input/include/mouse.h
r86ffa27f rcc574511 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 service_id; 51 52 52 53 /** Port ops */ -
uspace/srv/hid/input/proto/mousedev.c
r86ffa27f rcc574511 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 c onst char *pathname = mdev->dev_path;119 char *svc_name; 125 120 126 int fd = open(pathname, O_RDWR); 127 if (fd < 0) 128 return -1; 121 if (asprintf(&svc_name, "devname%" PRIun, mdev->service_id) > 0) 122 svc_name = (char *) "unknown"; 129 123 130 async_sess_t *sess = fd_session(EXCHANGE_SERIALIZE, fd); 124 async_sess_t *sess = loc_service_connect(EXCHANGE_SERIALIZE, 125 mdev->service_id, 0); 131 126 if (sess == NULL) { 132 printf("%s: Failed starting session with '%s'\n", NAME, pathname); 133 close(fd); 127 printf("%s: Failed starting session with '%s'\n", NAME, svc_name); 134 128 return -1; 135 129 } … … 138 132 if (mousedev == NULL) { 139 133 printf("%s: Failed allocating device structure for '%s'.\n", 140 NAME, pathname);134 NAME, svc_name); 141 135 return -1; 142 136 } 143 137 144 mousedev->fd = fd;145 138 mousedev->sess = sess; 146 139 147 140 async_exch_t *exch = async_exchange_begin(sess); 148 141 if (exch == NULL) { 149 printf("%s: Failed starting exchange with '%s'.\n", NAME, pathname); 142 printf("%s: Failed starting exchange with '%s'.\n", NAME, 143 svc_name); 150 144 mousedev_destroy(mousedev); 151 145 return -1; … … 157 151 if (rc != EOK) { 158 152 printf("%s: Failed creating callback connection from '%s'.\n", 159 NAME, pathname);153 NAME, svc_name); 160 154 mousedev_destroy(mousedev); 161 155 return -1;
Note:
See TracChangeset
for help on using the changeset viewer.
