Changeset eb1a2f4 in mainline for uspace/lib
- Timestamp:
- 2011-02-22T23:30:56Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 3b5d1535, a9c674e0
- Parents:
- dbe25f1 (diff), 664af708 (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/lib
- Files:
-
- 1 added
- 28 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/block/libblock.c
rdbe25f1 reb1a2f4 626 626 unsigned long key = block->lba; 627 627 hash_table_remove(&cache->block_hash, &key, 1); 628 fibril_mutex_unlock(&block->lock); 628 629 free(block->data); 629 630 free(block); -
uspace/lib/c/Makefile
rdbe25f1 reb1a2f4 91 91 generic/loader.c \ 92 92 generic/getopt.c \ 93 generic/adt/list. o\94 generic/adt/hash_table. o\93 generic/adt/list.c \ 94 generic/adt/hash_table.c \ 95 95 generic/adt/dynamic_fifo.c \ 96 96 generic/adt/measured_strings.c \ -
uspace/lib/c/generic/devman.c
rdbe25f1 reb1a2f4 123 123 } 124 124 125 static int devman_send_match_id(int phone, match_id_t *match_id) \ 126 { 127 ipc_call_t answer; 128 aid_t req = async_send_1(phone, DEVMAN_ADD_MATCH_ID, match_id->score, &answer); 129 int retval = async_data_write_start(phone, match_id->id, str_size(match_id->id)); 125 static int devman_send_match_id(int phone, match_id_t *match_id) 126 { 127 ipc_call_t answer; 128 129 aid_t req = async_send_1(phone, DEVMAN_ADD_MATCH_ID, match_id->score, 130 &answer); 131 int retval = async_data_write_start(phone, match_id->id, 132 str_size(match_id->id)); 133 130 134 async_wait_for(req, NULL); 131 135 return retval; … … 133 137 134 138 135 static int devman_send_match_ids(int phone, match_id_list_t *match_ids) 139 static int devman_send_match_ids(int phone, match_id_list_t *match_ids) 136 140 { 137 141 link_t *link = match_ids->ids.next; 138 142 match_id_t *match_id = NULL; 139 143 int ret = EOK; 140 144 141 145 while (link != &match_ids->ids) { 142 146 match_id = list_get_instance(link, match_id_t, link); 143 if (EOK != (ret = devman_send_match_id(phone, match_id))) 144 { 145 printf("Driver failed to send match id, error number = %d\n", ret); 146 return ret; 147 } 147 ret = devman_send_match_id(phone, match_id); 148 if (ret != EOK) { 149 printf("Driver failed to send match id, error %d\n", 150 ret); 151 return ret; 152 } 153 148 154 link = link->next; 149 155 } 150 return ret; 151 } 152 153 int devman_child_device_register( 154 const char *name, match_id_list_t *match_ids, devman_handle_t parent_handle, devman_handle_t *handle) 155 { 156 157 return ret; 158 } 159 160 /** Add function to a device. 161 * 162 * Request devman to add a new function to the specified device owned by 163 * this driver task. 164 * 165 * @param name Name of the new function 166 * @param ftype Function type, fun_inner or fun_exposed 167 * @param match_ids Match IDs (should be empty for fun_exposed) 168 * @param devh Devman handle of the device 169 * @param funh Place to store handle of the new function 170 * 171 * @return EOK on success or negative error code. 172 */ 173 int devman_add_function(const char *name, fun_type_t ftype, 174 match_id_list_t *match_ids, devman_handle_t devh, devman_handle_t *funh) 175 { 156 176 int phone = devman_get_phone(DEVMAN_DRIVER, IPC_FLAG_BLOCKING); 177 int fun_handle; 157 178 158 179 if (phone < 0) … … 161 182 async_serialize_start(); 162 183 163 int match_count = list_count(&match_ids->ids); 164 ipc_call_t answer; 165 aid_t req = async_send_2(phone, DEVMAN_ADD_CHILD_DEVICE, parent_handle, match_count, &answer); 184 int match_count = list_count(&match_ids->ids); 185 ipc_call_t answer; 186 187 aid_t req = async_send_3(phone, DEVMAN_ADD_FUNCTION, (sysarg_t) ftype, 188 devh, match_count, &answer); 166 189 167 190 sysarg_t retval = async_data_write_start(phone, name, str_size(name)); … … 178 201 async_serialize_end(); 179 202 180 if (retval != EOK) { 181 if (handle != NULL) { 182 *handle = -1; 183 } 184 return retval; 185 } 186 187 if (handle != NULL) 188 *handle = (int) IPC_GET_ARG1(answer); 189 190 return retval; 191 } 192 193 int devman_add_device_to_class(devman_handle_t devman_handle, const char *class_name) 203 if (retval == EOK) 204 fun_handle = (int) IPC_GET_ARG1(answer); 205 else 206 fun_handle = -1; 207 208 *funh = fun_handle; 209 210 return retval; 211 } 212 213 int devman_add_device_to_class(devman_handle_t devman_handle, 214 const char *class_name) 194 215 { 195 216 int phone = devman_get_phone(DEVMAN_DRIVER, IPC_FLAG_BLOCKING); … … 200 221 async_serialize_start(); 201 222 ipc_call_t answer; 202 aid_t req = async_send_1(phone, DEVMAN_ADD_DEVICE_TO_CLASS, devman_handle, &answer); 203 204 sysarg_t retval = async_data_write_start(phone, class_name, str_size(class_name)); 223 aid_t req = async_send_1(phone, DEVMAN_ADD_DEVICE_TO_CLASS, 224 devman_handle, &answer); 225 226 sysarg_t retval = async_data_write_start(phone, class_name, 227 str_size(class_name)); 205 228 if (retval != EOK) { 206 229 async_wait_for(req, NULL); … … 212 235 async_serialize_end(); 213 236 214 return retval; 237 return retval; 215 238 } 216 239 … … 265 288 } 266 289 267 int devman_device_get_handle(const char *pathname, devman_handle_t *handle, unsigned int flags) 290 int devman_device_get_handle(const char *pathname, devman_handle_t *handle, 291 unsigned int flags) 268 292 { 269 293 int phone = devman_get_phone(DEVMAN_CLIENT, flags); … … 278 302 &answer); 279 303 280 sysarg_t retval = async_data_write_start(phone, pathname, str_size(pathname)); 304 sysarg_t retval = async_data_write_start(phone, pathname, 305 str_size(pathname)); 281 306 if (retval != EOK) { 282 307 async_wait_for(req, NULL); -
uspace/lib/c/generic/fibril.c
rdbe25f1 reb1a2f4 115 115 fibril->retval = 0; 116 116 fibril->flags = 0; 117 118 fibril->waits_for = NULL; 117 119 118 120 return fibril; … … 276 278 fibril->arg = arg; 277 279 278 fibril->waits_for = NULL;279 280 280 context_save(&fibril->ctx); 281 281 context_set(&fibril->ctx, FADDR(fibril_main), fibril->stack, -
uspace/lib/c/include/devman.h
rdbe25f1 reb1a2f4 45 45 46 46 extern int devman_driver_register(const char *, async_client_conn_t); 47 extern int devman_ child_device_register(const char *, match_id_list_t *,47 extern int devman_add_function(const char *, fun_type_t, match_id_list_t *, 48 48 devman_handle_t, devman_handle_t *); 49 49 -
uspace/lib/c/include/ipc/devman.h
rdbe25f1 reb1a2f4 42 42 43 43 typedef sysarg_t devman_handle_t; 44 45 typedef enum { 46 /** Invalid value for debugging purposes */ 47 fun_invalid = 0, 48 /** Function to which child devices attach */ 49 fun_inner, 50 /** Fuction exported to external clients (leaf function) */ 51 fun_exposed 52 } fun_type_t; 44 53 45 54 /** Ids of device models used for device-to-driver matching. … … 127 136 typedef enum { 128 137 DEVMAN_DRIVER_REGISTER = IPC_FIRST_USER_METHOD, 129 DEVMAN_ADD_ CHILD_DEVICE,138 DEVMAN_ADD_FUNCTION, 130 139 DEVMAN_ADD_MATCH_ID, 131 140 DEVMAN_ADD_DEVICE_TO_CLASS -
uspace/lib/drv/generic/driver.c
rdbe25f1 reb1a2f4 1 1 /* 2 2 * Copyright (c) 2010 Lenka Trochtova 3 * Copyright (c) 2011 Jiri Svoboda 3 4 * All rights reserved. 4 5 * … … 49 50 #include <errno.h> 50 51 #include <inttypes.h> 52 #include <devman.h> 51 53 52 54 #include <ipc/driver.h> 53 55 54 56 #include "dev_iface.h" 55 #include "driver.h" 57 #include "ddf/driver.h" 58 #include "ddf/interrupt.h" 56 59 57 60 /** Driver structure */ … … 59 62 60 63 /** Devices */ 61 LIST_INITIALIZE( devices);62 FIBRIL_MUTEX_INITIALIZE( devices_mutex);64 LIST_INITIALIZE(functions); 65 FIBRIL_MUTEX_INITIALIZE(functions_mutex); 63 66 64 67 /** Interrupts */ … … 76 79 }; 77 80 81 static ddf_dev_t *create_device(void); 82 static void delete_device(ddf_dev_t *); 83 static remote_handler_t *function_get_default_handler(ddf_fun_t *); 84 static void *function_get_ops(ddf_fun_t *, dev_inferface_idx_t); 78 85 79 86 static void driver_irq_handler(ipc_callid_t iid, ipc_call_t *icall) … … 150 157 151 158 interrupt_context_t * 152 find_interrupt_context(interrupt_context_list_t *list, d evice_t *dev, int irq)159 find_interrupt_context(interrupt_context_list_t *list, ddf_dev_t *dev, int irq) 153 160 { 154 161 fibril_mutex_lock(&list->mutex); … … 172 179 173 180 int 174 register_interrupt_handler(d evice_t *dev, int irq, interrupt_handler_t *handler,181 register_interrupt_handler(ddf_dev_t *dev, int irq, interrupt_handler_t *handler, 175 182 irq_code_t *pseudocode) 176 183 { … … 195 202 } 196 203 197 int unregister_interrupt_handler(d evice_t *dev, int irq)204 int unregister_interrupt_handler(ddf_dev_t *dev, int irq) 198 205 { 199 206 interrupt_context_t *ctx = find_interrupt_context(&interrupt_contexts, … … 209 216 } 210 217 211 static void add_to_ devices_list(device_t *dev)212 { 213 fibril_mutex_lock(& devices_mutex);214 list_append(& dev->link, &devices);215 fibril_mutex_unlock(& devices_mutex);216 } 217 218 static void remove_from_ devices_list(device_t *dev)219 { 220 fibril_mutex_lock(& devices_mutex);221 list_remove(& dev->link);222 fibril_mutex_unlock(& devices_mutex);223 } 224 225 static d evice_t *driver_get_device(link_t *devices, devman_handle_t handle)226 { 227 d evice_t *dev= NULL;228 229 fibril_mutex_lock(& devices_mutex);230 link_t *link = devices->next;231 232 while (link != devices) {233 dev = list_get_instance(link, device_t, link);234 if ( dev->handle == handle) {235 fibril_mutex_unlock(& devices_mutex);236 return dev;218 static void add_to_functions_list(ddf_fun_t *fun) 219 { 220 fibril_mutex_lock(&functions_mutex); 221 list_append(&fun->link, &functions); 222 fibril_mutex_unlock(&functions_mutex); 223 } 224 225 static void remove_from_functions_list(ddf_fun_t *fun) 226 { 227 fibril_mutex_lock(&functions_mutex); 228 list_remove(&fun->link); 229 fibril_mutex_unlock(&functions_mutex); 230 } 231 232 static ddf_fun_t *driver_get_function(link_t *functions, devman_handle_t handle) 233 { 234 ddf_fun_t *fun = NULL; 235 236 fibril_mutex_lock(&functions_mutex); 237 link_t *link = functions->next; 238 239 while (link != functions) { 240 fun = list_get_instance(link, ddf_fun_t, link); 241 if (fun->handle == handle) { 242 fibril_mutex_unlock(&functions_mutex); 243 return fun; 237 244 } 245 238 246 link = link->next; 239 247 } 240 248 241 fibril_mutex_unlock(& devices_mutex);249 fibril_mutex_unlock(&functions_mutex); 242 250 243 251 return NULL; … … 250 258 251 259 devman_handle_t dev_handle = IPC_GET_ARG1(*icall); 252 devman_handle_t parent_ dev_handle = IPC_GET_ARG2(*icall);253 254 d evice_t *dev = create_device();260 devman_handle_t parent_fun_handle = IPC_GET_ARG2(*icall); 261 262 ddf_dev_t *dev = create_device(); 255 263 dev->handle = dev_handle; 256 264 257 265 async_data_write_accept((void **) &dev_name, true, 0, 0, 0, 0); 258 266 dev->name = dev_name; 259 260 add_to_devices_list(dev); 261 dev->parent = driver_get_device(&devices, parent_dev_handle); 267 268 /* 269 * Currently not used, parent fun handle is stored in context 270 * of the connection to the parent device driver. 271 */ 272 (void) parent_fun_handle; 262 273 263 274 res = driver->driver_ops->add_device(dev); … … 268 279 printf("%s: failed to add a new device with handle = %" PRIun ".\n", 269 280 driver->name, dev_handle); 270 remove_from_devices_list(dev);271 281 delete_device(dev); 272 282 } … … 311 321 */ 312 322 devman_handle_t handle = IPC_GET_ARG2(*icall); 313 d evice_t *dev = driver_get_device(&devices, handle);314 315 if ( dev== NULL) {316 printf("%s: driver_connection_gen error - no devicewith handle"323 ddf_fun_t *fun = driver_get_function(&functions, handle); 324 325 if (fun == NULL) { 326 printf("%s: driver_connection_gen error - no function with handle" 317 327 " %" PRIun " was found.\n", driver->name, handle); 318 328 async_answer_0(iid, ENOENT); … … 327 337 328 338 int ret = EOK; 329 /* open the device*/330 if ( dev->ops != NULL && dev->ops->open != NULL)331 ret = (* dev->ops->open)(dev);339 /* Open device function */ 340 if (fun->ops != NULL && fun->ops->open != NULL) 341 ret = (*fun->ops->open)(fun); 332 342 333 343 async_answer_0(iid, ret); … … 344 354 switch (method) { 345 355 case IPC_M_PHONE_HUNGUP: 346 /* close the device*/347 if ( dev->ops != NULL && dev->ops->close != NULL)348 (* dev->ops->close)(dev);356 /* Close device function */ 357 if (fun->ops != NULL && fun->ops->close != NULL) 358 (*fun->ops->close)(fun); 349 359 async_answer_0(callid, EOK); 350 360 return; … … 356 366 if (!is_valid_iface_idx(iface_idx)) { 357 367 remote_handler_t *default_handler = 358 device_get_default_handler(dev);368 function_get_default_handler(fun); 359 369 if (default_handler != NULL) { 360 (*default_handler)( dev, callid, &call);370 (*default_handler)(fun, callid, &call); 361 371 break; 362 372 } 373 363 374 /* 364 * This is not device's interface and the375 * Function has no such interface and 365 376 * default handler is not provided. 366 377 */ … … 372 383 } 373 384 374 /* calling one of the device's interfaces */385 /* calling one of the function's interfaces */ 375 386 376 387 /* Get the interface ops structure. */ 377 void *ops = device_get_ops(dev, iface_idx);388 void *ops = function_get_ops(fun, iface_idx); 378 389 if (ops == NULL) { 379 390 printf("%s: driver_connection_gen error - ", 380 391 driver->name); 381 printf(" devicewith handle %" PRIun " has no interface "392 printf("Function with handle %" PRIun " has no interface " 382 393 "with id %d.\n", handle, iface_idx); 383 394 async_answer_0(callid, ENOTSUP); … … 408 419 * receive parameters from the remote client and it will 409 420 * pass it to the corresponding local interface method 410 * associated with the deviceby its driver.421 * associated with the function by its driver. 411 422 */ 412 (*iface_method_ptr)( dev, ops, callid, &call);423 (*iface_method_ptr)(fun, ops, callid, &call); 413 424 break; 414 425 } … … 425 436 driver_connection_gen(iid, icall, false); 426 437 } 427 428 438 429 439 /** Function for handling connections to device driver. */ … … 454 464 * @return The device structure. 455 465 */ 456 device_t *create_device(void)457 { 458 d evice_t *dev = malloc(sizeof(device_t));459 460 if (dev != NULL) {461 memset(dev, 0, sizeof(device_t));462 init_match_ids(&dev->match_ids);463 } 464 466 static ddf_dev_t *create_device(void) 467 { 468 ddf_dev_t *dev; 469 470 dev = malloc(sizeof(ddf_dev_t)); 471 if (dev == NULL) 472 return NULL; 473 474 memset(dev, 0, sizeof(ddf_dev_t)); 465 475 return dev; 466 476 } 467 477 478 /** Create new function structure. 479 * 480 * @return The device structure. 481 */ 482 static ddf_fun_t *create_function(void) 483 { 484 ddf_fun_t *fun; 485 486 fun = calloc(1, sizeof(ddf_fun_t)); 487 if (fun == NULL) 488 return NULL; 489 490 init_match_ids(&fun->match_ids); 491 link_initialize(&fun->link); 492 493 return fun; 494 } 495 468 496 /** Delete device structure. 469 497 * 470 498 * @param dev The device structure. 471 499 */ 472 void delete_device(device_t *dev) 473 { 474 clean_match_ids(&dev->match_ids); 475 if (dev->name != NULL) 476 free(dev->name); 500 static void delete_device(ddf_dev_t *dev) 501 { 477 502 free(dev); 478 503 } 479 504 480 void *device_get_ops(device_t *dev, dev_inferface_idx_t idx) 505 /** Delete device structure. 506 * 507 * @param dev The device structure. 508 */ 509 static void delete_function(ddf_fun_t *fun) 510 { 511 clean_match_ids(&fun->match_ids); 512 if (fun->name != NULL) 513 free(fun->name); 514 free(fun); 515 } 516 517 /** Create a DDF function node. 518 * 519 * Create a DDF function (in memory). Both child devices and external clients 520 * communicate with a device via its functions. 521 * 522 * The created function node is fully formed, but only exists in the memory 523 * of the client task. In order to be visible to the system, the function 524 * must be bound using ddf_fun_bind(). 525 * 526 * This function should only fail if there is not enough free memory. 527 * Specifically, this function succeeds even if @a dev already has 528 * a (bound) function with the same name. 529 * 530 * Type: A function of type fun_inner indicates that DDF should attempt 531 * to attach child devices to the function. fun_exposed means that 532 * the function should be exported to external clients (applications). 533 * 534 * @param dev Device to which we are adding function 535 * @param ftype Type of function (fun_inner or fun_exposed) 536 * @param name Name of function 537 * 538 * @return New function or @c NULL if memory is not available 539 */ 540 ddf_fun_t *ddf_fun_create(ddf_dev_t *dev, fun_type_t ftype, const char *name) 541 { 542 ddf_fun_t *fun; 543 544 fun = create_function(); 545 if (fun == NULL) 546 return NULL; 547 548 fun->bound = false; 549 fun->dev = dev; 550 fun->ftype = ftype; 551 552 fun->name = str_dup(name); 553 if (fun->name == NULL) { 554 delete_function(fun); 555 return NULL; 556 } 557 558 return fun; 559 } 560 561 /** Destroy DDF function node. 562 * 563 * Destroy a function previously created with ddf_fun_create(). The function 564 * must not be bound. 565 * 566 * @param fun Function to destroy 567 */ 568 void ddf_fun_destroy(ddf_fun_t *fun) 569 { 570 assert(fun->bound == false); 571 delete_function(fun); 572 } 573 574 static void *function_get_ops(ddf_fun_t *fun, dev_inferface_idx_t idx) 481 575 { 482 576 assert(is_valid_iface_idx(idx)); 483 if ( dev->ops == NULL)577 if (fun->ops == NULL) 484 578 return NULL; 485 return dev->ops->interfaces[idx]; 486 } 487 488 int child_device_register(device_t *child, device_t *parent) 489 { 490 assert(child->name != NULL); 579 return fun->ops->interfaces[idx]; 580 } 581 582 /** Bind a function node. 583 * 584 * Bind the specified function to the system. This effectively makes 585 * the function visible to the system (uploads it to the server). 586 * 587 * This function can fail for several reasons. Specifically, 588 * it will fail if the device already has a bound function of 589 * the same name. 590 * 591 * @param fun Function to bind 592 * @return EOK on success or negative error code 593 */ 594 int ddf_fun_bind(ddf_fun_t *fun) 595 { 596 assert(fun->name != NULL); 491 597 492 598 int res; 493 599 494 add_to_ devices_list(child);495 res = devman_ child_device_register(child->name, &child->match_ids,496 parent->handle, &child->handle);600 add_to_functions_list(fun); 601 res = devman_add_function(fun->name, fun->ftype, &fun->match_ids, 602 fun->dev->handle, &fun->handle); 497 603 if (res != EOK) { 498 remove_from_ devices_list(child);604 remove_from_functions_list(fun); 499 605 return res; 500 606 } 501 607 608 fun->bound = true; 502 609 return res; 503 610 } 504 611 505 /** Wrapper for child_device_register for devices with single match id. 506 * 507 * @param parent Parent device. 508 * @param child_name Child device name. 509 * @param child_match_id Child device match id. 510 * @param child_match_score Child device match score. 511 * @return Error code. 512 */ 513 int child_device_register_wrapper(device_t *parent, const char *child_name, 514 const char *child_match_id, int child_match_score, 515 devman_handle_t *child_handle) 516 { 517 device_t *child = NULL; 518 match_id_t *match_id = NULL; 519 int rc; 520 521 child = create_device(); 522 if (child == NULL) { 523 rc = ENOMEM; 524 goto failure; 525 } 526 527 child->name = child_name; 612 /** Add single match ID to inner function. 613 * 614 * Construct and add a single match ID to the specified function. 615 * Cannot be called when the function node is bound. 616 * 617 * @param fun Function 618 * @param match_id_str Match string 619 * @param match_score Match score 620 * @return EOK on success, ENOMEM if out of memory. 621 */ 622 int ddf_fun_add_match_id(ddf_fun_t *fun, const char *match_id_str, 623 int match_score) 624 { 625 match_id_t *match_id; 626 627 assert(fun->bound == false); 628 assert(fun->ftype == fun_inner); 528 629 529 630 match_id = create_match_id(); 530 if (match_id == NULL) { 531 rc = ENOMEM; 532 goto failure; 533 } 534 535 match_id->id = child_match_id; 536 match_id->score = child_match_score; 537 add_match_id(&child->match_ids, match_id); 538 539 rc = child_device_register(child, parent); 540 if (rc != EOK) 541 goto failure; 542 543 if (child_handle != NULL) { 544 *child_handle = child->handle; 545 } 546 631 if (match_id == NULL) 632 return ENOMEM; 633 634 match_id->id = match_id_str; 635 match_id->score = 90; 636 637 add_match_id(&fun->match_ids, match_id); 547 638 return EOK; 548 549 failure:550 if (match_id != NULL) {551 match_id->id = NULL;552 delete_match_id(match_id);553 }554 555 if (child != NULL) {556 child->name = NULL;557 delete_device(child);558 }559 560 return rc;561 639 } 562 640 563 641 /** Get default handler for client requests */ 564 remote_handler_t *device_get_default_handler(device_t *dev)565 { 566 if ( dev->ops == NULL)642 static remote_handler_t *function_get_default_handler(ddf_fun_t *fun) 643 { 644 if (fun->ops == NULL) 567 645 return NULL; 568 return dev->ops->default_handler; 569 } 570 571 int add_device_to_class(device_t *dev, const char *class_name) 572 { 573 return devman_add_device_to_class(dev->handle, class_name); 574 } 575 576 int driver_main(driver_t *drv) 646 return fun->ops->default_handler; 647 } 648 649 /** Add exposed function to class. 650 * 651 * Must only be called when the function is bound. 652 */ 653 int ddf_fun_add_to_class(ddf_fun_t *fun, const char *class_name) 654 { 655 assert(fun->bound == true); 656 assert(fun->ftype == fun_exposed); 657 658 return devman_add_device_to_class(fun->handle, class_name); 659 } 660 661 int ddf_driver_main(driver_t *drv) 577 662 { 578 663 /* -
uspace/lib/drv/generic/remote_char_dev.c
rdbe25f1 reb1a2f4 37 37 38 38 #include "ops/char_dev.h" 39 #include "d river.h"39 #include "ddf/driver.h" 40 40 41 41 #define MAX_CHAR_RW_COUNT 256 42 42 43 static void remote_char_read(d evice_t *, void *, ipc_callid_t, ipc_call_t *);44 static void remote_char_write(d evice_t *, void *, ipc_callid_t, ipc_call_t *);43 static void remote_char_read(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 44 static void remote_char_write(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 45 45 46 46 /** Remote character interface operations. */ … … 67 67 * local interface to the remote client. 68 68 * 69 * @param dev The devicefrom which the data are read.69 * @param fun The function from which the data are read. 70 70 * @param ops The local ops structure. 71 71 */ 72 72 static void 73 remote_char_read(d evice_t *dev, void *ops, ipc_callid_t callid,73 remote_char_read(ddf_fun_t *fun, void *ops, ipc_callid_t callid, 74 74 ipc_call_t *call) 75 75 { … … 94 94 95 95 char buf[MAX_CHAR_RW_COUNT]; 96 int ret = (*char_dev_ops->read)( dev, buf, len);96 int ret = (*char_dev_ops->read)(fun, buf, len); 97 97 98 98 if (ret < 0) { … … 114 114 * local interface to the remote client. 115 115 * 116 * @param dev The deviceto which the data are written.116 * @param fun The function to which the data are written. 117 117 * @param ops The local ops structure. 118 118 */ 119 119 static void 120 remote_char_write(d evice_t *dev, void *ops, ipc_callid_t callid,120 remote_char_write(ddf_fun_t *fun, void *ops, ipc_callid_t callid, 121 121 ipc_call_t *call) 122 122 { … … 144 144 async_data_write_finalize(cid, buf, len); 145 145 146 int ret = (*char_dev_ops->write)( dev, buf, len);146 int ret = (*char_dev_ops->write)(fun, buf, len); 147 147 if (ret < 0) { 148 148 /* Some error occured. */ -
uspace/lib/drv/generic/remote_hw_res.c
rdbe25f1 reb1a2f4 37 37 38 38 #include "ops/hw_res.h" 39 #include "d river.h"39 #include "ddf/driver.h" 40 40 41 static void remote_hw_res_get_resource_list(d evice_t *, void *, ipc_callid_t,41 static void remote_hw_res_get_resource_list(ddf_fun_t *, void *, ipc_callid_t, 42 42 ipc_call_t *); 43 static void remote_hw_res_enable_interrupt(d evice_t *, void *, ipc_callid_t,43 static void remote_hw_res_enable_interrupt(ddf_fun_t *, void *, ipc_callid_t, 44 44 ipc_call_t *); 45 45 … … 55 55 }; 56 56 57 static void remote_hw_res_enable_interrupt(d evice_t *dev, void *ops,57 static void remote_hw_res_enable_interrupt(ddf_fun_t *fun, void *ops, 58 58 ipc_callid_t callid, ipc_call_t *call) 59 59 { … … 62 62 if (hw_res_ops->enable_interrupt == NULL) 63 63 async_answer_0(callid, ENOTSUP); 64 else if (hw_res_ops->enable_interrupt( dev))64 else if (hw_res_ops->enable_interrupt(fun)) 65 65 async_answer_0(callid, EOK); 66 66 else … … 68 68 } 69 69 70 static void remote_hw_res_get_resource_list(d evice_t *dev, void *ops,70 static void remote_hw_res_get_resource_list(ddf_fun_t *fun, void *ops, 71 71 ipc_callid_t callid, ipc_call_t *call) 72 72 { … … 78 78 } 79 79 80 hw_resource_list_t *hw_resources = hw_res_ops->get_resource_list( dev);80 hw_resource_list_t *hw_resources = hw_res_ops->get_resource_list(fun); 81 81 if (hw_resources == NULL){ 82 82 async_answer_0(callid, ENOENT); -
uspace/lib/drv/generic/remote_usb.c
rdbe25f1 reb1a2f4 37 37 38 38 #include "usb_iface.h" 39 #include "d river.h"39 #include "ddf/driver.h" 40 40 41 41 42 static void remote_usb_get_address(d evice_t *, void *, ipc_callid_t, ipc_call_t *);43 static void remote_usb_get_interface(d evice_t *, void *, ipc_callid_t, ipc_call_t *);44 static void remote_usb_get_hc_handle(d evice_t *, void *, ipc_callid_t, ipc_call_t *);42 static void remote_usb_get_address(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 43 static void remote_usb_get_interface(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 44 static void remote_usb_get_hc_handle(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 45 45 //static void remote_usb(device_t *, void *, ipc_callid_t, ipc_call_t *); 46 46 … … 61 61 62 62 63 void remote_usb_get_address(d evice_t *device, void *iface,63 void remote_usb_get_address(ddf_fun_t *fun, void *iface, 64 64 ipc_callid_t callid, ipc_call_t *call) 65 65 { … … 74 74 75 75 usb_address_t address; 76 int rc = usb_iface->get_address( device, handle, &address);76 int rc = usb_iface->get_address(fun, handle, &address); 77 77 if (rc != EOK) { 78 78 async_answer_0(callid, rc); … … 82 82 } 83 83 84 void remote_usb_get_interface(d evice_t *device, void *iface,84 void remote_usb_get_interface(ddf_fun_t *fun, void *iface, 85 85 ipc_callid_t callid, ipc_call_t *call) 86 86 { … … 95 95 96 96 int iface_no; 97 int rc = usb_iface->get_interface( device, handle, &iface_no);97 int rc = usb_iface->get_interface(fun, handle, &iface_no); 98 98 if (rc != EOK) { 99 99 async_answer_0(callid, rc); … … 103 103 } 104 104 105 void remote_usb_get_hc_handle(d evice_t *device, void *iface,105 void remote_usb_get_hc_handle(ddf_fun_t *fun, void *iface, 106 106 ipc_callid_t callid, ipc_call_t *call) 107 107 { … … 114 114 115 115 devman_handle_t handle; 116 int rc = usb_iface->get_hc_handle( device, &handle);116 int rc = usb_iface->get_hc_handle(fun, &handle); 117 117 if (rc != EOK) { 118 118 async_answer_0(callid, rc); -
uspace/lib/drv/generic/remote_usbhc.c
rdbe25f1 reb1a2f4 35 35 #include <async.h> 36 36 #include <errno.h> 37 #include <assert.h> 37 38 38 39 #include "usbhc_iface.h" 39 #include "d river.h"40 #include "ddf/driver.h" 40 41 41 42 #define USB_MAX_PAYLOAD_SIZE 1020 … … 43 44 #define HACK_MAX_PACKET_SIZE_INTERRUPT_IN 4 44 45 45 static void remote_usbhc_interrupt_out(d evice_t *, void *, ipc_callid_t, ipc_call_t *);46 static void remote_usbhc_interrupt_in(d evice_t *, void *, ipc_callid_t, ipc_call_t *);47 static void remote_usbhc_bulk_out(d evice_t *, void *, ipc_callid_t, ipc_call_t *);48 static void remote_usbhc_bulk_in(d evice_t *, void *, ipc_callid_t, ipc_call_t *);49 static void remote_usbhc_control_write(d evice_t *, void *, ipc_callid_t, ipc_call_t *);50 static void remote_usbhc_control_read(d evice_t *, void *, ipc_callid_t, ipc_call_t *);51 static void remote_usbhc_reserve_default_address(d evice_t *, void *, ipc_callid_t, ipc_call_t *);52 static void remote_usbhc_release_default_address(d evice_t *, void *, ipc_callid_t, ipc_call_t *);53 static void remote_usbhc_request_address(d evice_t *, void *, ipc_callid_t, ipc_call_t *);54 static void remote_usbhc_bind_address(d evice_t *, void *, ipc_callid_t, ipc_call_t *);55 static void remote_usbhc_release_address(d evice_t *, void *, ipc_callid_t, ipc_call_t *);56 //static void remote_usbhc(d evice_t *, void *, ipc_callid_t, ipc_call_t *);46 static void remote_usbhc_interrupt_out(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 47 static void remote_usbhc_interrupt_in(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 48 static void remote_usbhc_bulk_out(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 49 static void remote_usbhc_bulk_in(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 50 static void remote_usbhc_control_write(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 51 static void remote_usbhc_control_read(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 52 static void remote_usbhc_reserve_default_address(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 53 static void remote_usbhc_release_default_address(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 54 static void remote_usbhc_request_address(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 55 static void remote_usbhc_bind_address(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 56 static void remote_usbhc_release_address(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 57 //static void remote_usbhc(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 57 58 58 59 /** Remote USB host controller interface operations. */ … … 123 124 } 124 125 125 void remote_usbhc_reserve_default_address(d evice_t *device, void *iface,126 void remote_usbhc_reserve_default_address(ddf_fun_t *fun, void *iface, 126 127 ipc_callid_t callid, ipc_call_t *call) 127 128 { … … 135 136 usb_speed_t speed = DEV_IPC_GET_ARG1(*call); 136 137 137 int rc = usb_iface->reserve_default_address( device, speed);138 int rc = usb_iface->reserve_default_address(fun, speed); 138 139 139 140 async_answer_0(callid, rc); 140 141 } 141 142 142 void remote_usbhc_release_default_address(d evice_t *device, void *iface,143 void remote_usbhc_release_default_address(ddf_fun_t *fun, void *iface, 143 144 ipc_callid_t callid, ipc_call_t *call) 144 145 { … … 150 151 } 151 152 152 int rc = usb_iface->release_default_address( device);153 int rc = usb_iface->release_default_address(fun); 153 154 154 155 async_answer_0(callid, rc); 155 156 } 156 157 157 void remote_usbhc_request_address(d evice_t *device, void *iface,158 void remote_usbhc_request_address(ddf_fun_t *fun, void *iface, 158 159 ipc_callid_t callid, ipc_call_t *call) 159 160 { … … 168 169 169 170 usb_address_t address; 170 int rc = usb_iface->request_address( device, speed, &address);171 int rc = usb_iface->request_address(fun, speed, &address); 171 172 if (rc != EOK) { 172 173 async_answer_0(callid, rc); … … 176 177 } 177 178 178 void remote_usbhc_bind_address(d evice_t *device, void *iface,179 void remote_usbhc_bind_address(ddf_fun_t *fun, void *iface, 179 180 ipc_callid_t callid, ipc_call_t *call) 180 181 { … … 189 190 devman_handle_t handle = (devman_handle_t) DEV_IPC_GET_ARG2(*call); 190 191 191 int rc = usb_iface->bind_address( device, address, handle);192 int rc = usb_iface->bind_address(fun, address, handle); 192 193 193 194 async_answer_0(callid, rc); 194 195 } 195 196 196 void remote_usbhc_release_address(d evice_t *device, void *iface,197 void remote_usbhc_release_address(ddf_fun_t *fun, void *iface, 197 198 ipc_callid_t callid, ipc_call_t *call) 198 199 { … … 206 207 usb_address_t address = (usb_address_t) DEV_IPC_GET_ARG1(*call); 207 208 208 int rc = usb_iface->release_address( device, address);209 int rc = usb_iface->release_address(fun, address); 209 210 210 211 async_answer_0(callid, rc); … … 212 213 213 214 214 static void callback_out(d evice_t *device,215 static void callback_out(ddf_fun_t *fun, 215 216 int outcome, void *arg) 216 217 { … … 222 223 } 223 224 224 static void callback_in(d evice_t *device,225 static void callback_in(ddf_fun_t *fun, 225 226 int outcome, size_t actual_size, void *arg) 226 227 { … … 255 256 * @param transfer_func Transfer function (might be NULL). 256 257 */ 257 static void remote_usbhc_out_transfer(d evice_t *device,258 static void remote_usbhc_out_transfer(ddf_fun_t *fun, 258 259 ipc_callid_t callid, ipc_call_t *call, 259 260 usbhc_iface_transfer_out_t transfer_func) … … 294 295 trans->size = len; 295 296 296 rc = transfer_func( device, target, max_packet_size,297 rc = transfer_func(fun, target, max_packet_size, 297 298 buffer, len, 298 299 callback_out, trans); … … 311 312 * @param transfer_func Transfer function (might be NULL). 312 313 */ 313 static void remote_usbhc_in_transfer(d evice_t *device,314 static void remote_usbhc_in_transfer(ddf_fun_t *fun, 314 315 ipc_callid_t callid, ipc_call_t *call, 315 316 usbhc_iface_transfer_in_t transfer_func) … … 342 343 trans->size = len; 343 344 344 int rc = transfer_func( device, target, max_packet_size,345 int rc = transfer_func(fun, target, max_packet_size, 345 346 trans->buffer, len, 346 347 callback_in, trans); … … 352 353 } 353 354 354 void remote_usbhc_interrupt_out(d evice_t *device, void *iface,355 void remote_usbhc_interrupt_out(ddf_fun_t *fun, void *iface, 355 356 ipc_callid_t callid, ipc_call_t *call) 356 357 { … … 358 359 assert(usb_iface != NULL); 359 360 360 return remote_usbhc_out_transfer( device, callid, call,361 return remote_usbhc_out_transfer(fun, callid, call, 361 362 usb_iface->interrupt_out); 362 363 } 363 364 364 void remote_usbhc_interrupt_in(d evice_t *device, void *iface,365 void remote_usbhc_interrupt_in(ddf_fun_t *fun, void *iface, 365 366 ipc_callid_t callid, ipc_call_t *call) 366 367 { … … 368 369 assert(usb_iface != NULL); 369 370 370 return remote_usbhc_in_transfer( device, callid, call,371 return remote_usbhc_in_transfer(fun, callid, call, 371 372 usb_iface->interrupt_in); 372 373 } 373 374 374 void remote_usbhc_bulk_out(d evice_t *device, void *iface,375 void remote_usbhc_bulk_out(ddf_fun_t *fun, void *iface, 375 376 ipc_callid_t callid, ipc_call_t *call) 376 377 { … … 378 379 assert(usb_iface != NULL); 379 380 380 return remote_usbhc_out_transfer( device, callid, call,381 return remote_usbhc_out_transfer(fun, callid, call, 381 382 usb_iface->bulk_out); 382 383 } 383 384 384 void remote_usbhc_bulk_in(d evice_t *device, void *iface,385 void remote_usbhc_bulk_in(ddf_fun_t *fun, void *iface, 385 386 ipc_callid_t callid, ipc_call_t *call) 386 387 { … … 388 389 assert(usb_iface != NULL); 389 390 390 return remote_usbhc_in_transfer( device, callid, call,391 return remote_usbhc_in_transfer(fun, callid, call, 391 392 usb_iface->bulk_in); 392 393 } 393 394 394 void remote_usbhc_control_write(d evice_t *device, void *iface,395 void remote_usbhc_control_write(ddf_fun_t *fun, void *iface, 395 396 ipc_callid_t callid, ipc_call_t *call) 396 397 { … … 444 445 trans->size = data_buffer_len; 445 446 446 rc = usb_iface->control_write( device, target, max_packet_size,447 rc = usb_iface->control_write(fun, target, max_packet_size, 447 448 setup_packet, setup_packet_len, 448 449 data_buffer, data_buffer_len, … … 456 457 457 458 458 void remote_usbhc_control_read(d evice_t *device, void *iface,459 void remote_usbhc_control_read(ddf_fun_t *fun, void *iface, 459 460 ipc_callid_t callid, ipc_call_t *call) 460 461 { … … 509 510 } 510 511 511 rc = usb_iface->control_read( device, target, max_packet_size,512 rc = usb_iface->control_read(fun, target, max_packet_size, 512 513 setup_packet, setup_packet_len, 513 514 trans->buffer, trans->size, -
uspace/lib/drv/include/ddf/driver.h
rdbe25f1 reb1a2f4 1 1 /* 2 2 * Copyright (c) 2010 Lenka Trochtova 3 * Copyright (c) 2011 Jiri Svoboda 3 4 * All rights reserved. 4 5 * … … 33 34 */ 34 35 35 #ifndef LIBDRV_DRIVER_H_36 #define LIBDRV_DRIVER_H_36 #ifndef DDF_DRIVER_H_ 37 #define DDF_DRIVER_H_ 37 38 38 #include <sys/types.h>39 #include <kernel/ddi/irq.h>40 #include <adt/list.h>41 #include <devman.h>42 39 #include <ipc/devman.h> 43 40 #include <ipc/dev_iface.h> 44 #include <assert.h>45 #include <ddi.h>46 #include <libarch/ddi.h>47 #include <fibril_synch.h>48 #include <malloc.h>49 41 50 #include " dev_iface.h"42 #include "../dev_iface.h" 51 43 52 struct device;53 typedef struct d evice device_t;44 typedef struct ddf_dev ddf_dev_t; 45 typedef struct ddf_fun ddf_fun_t; 54 46 55 47 /* 56 * Device class48 * Device 57 49 */ 58 50 59 51 /** Devices operations */ 60 typedef struct d evice_ops {52 typedef struct ddf_dev_ops { 61 53 /** 62 54 * Optional callback function called when a client is connecting to the 63 55 * device. 64 56 */ 65 int (*open)(d evice_t *);57 int (*open)(ddf_fun_t *); 66 58 67 59 /** … … 69 61 * the device. 70 62 */ 71 void (*close)(d evice_t *);63 void (*close)(ddf_fun_t *); 72 64 73 65 /** The table of standard interfaces implemented by the device. */ … … 80 72 */ 81 73 remote_handler_t *default_handler; 82 } device_ops_t; 83 84 85 /* 86 * Device 87 */ 74 } ddf_dev_ops_t; 88 75 89 76 /** Device structure */ 90 struct d evice{77 struct ddf_dev { 91 78 /** 92 79 * Globally unique device identifier (assigned to the device by the … … 101 88 int parent_phone; 102 89 103 /** Parent device if handled by this driver, NULL otherwise */104 device_t *parent;105 90 /** Device name */ 106 91 const char *name; 107 /** List of device ids for device-to-driver matching */ 108 match_id_list_t match_ids; 92 109 93 /** Driver-specific data associated with this device */ 110 94 void *driver_data; 111 /** The implementation of operations provided by this device */112 device_ops_t *ops;113 95 114 96 /** Link in the list of devices handled by the driver */ 97 link_t link; 98 }; 99 100 /** Function structure */ 101 struct ddf_fun { 102 /** True if bound to the device manager */ 103 bool bound; 104 /** Function indentifier (asigned by device manager) */ 105 devman_handle_t handle; 106 107 /** Device which this function belogs to */ 108 ddf_dev_t *dev; 109 110 /** Function type */ 111 fun_type_t ftype; 112 /** Function name */ 113 const char *name; 114 /** List of device ids for driver matching */ 115 match_id_list_t match_ids; 116 /** Driver-specific data associated with this function */ 117 void *driver_data; 118 /** Implementation of operations provided by this function */ 119 ddf_dev_ops_t *ops; 120 121 /** Link in the list of functions handled by the driver */ 115 122 link_t link; 116 123 }; … … 123 130 typedef struct driver_ops { 124 131 /** Callback method for passing a new device to the device driver */ 125 int (*add_device)(d evice_t *dev);132 int (*add_device)(ddf_dev_t *dev); 126 133 /* TODO: add other generic driver operations */ 127 134 } driver_ops_t; … … 135 142 } driver_t; 136 143 137 intdriver_main(driver_t *);144 extern int ddf_driver_main(driver_t *); 138 145 139 /** Create new device structure. 140 * 141 * @return The device structure. 142 */ 143 extern device_t *create_device(void); 144 extern void delete_device(device_t *); 145 extern void *device_get_ops(device_t *, dev_inferface_idx_t); 146 extern ddf_fun_t *ddf_fun_create(ddf_dev_t *, fun_type_t, const char *); 147 extern void ddf_fun_destroy(ddf_fun_t *); 148 extern int ddf_fun_bind(ddf_fun_t *); 149 extern int ddf_fun_add_match_id(ddf_fun_t *, const char *, int); 146 150 147 extern int child_device_register(device_t *, device_t *); 148 extern int child_device_register_wrapper(device_t *, const char *, const char *, 149 int, devman_handle_t *); 150 151 /* 152 * Interrupts 153 */ 154 155 typedef void interrupt_handler_t(device_t *, ipc_callid_t, ipc_call_t *); 156 157 typedef struct interrupt_context { 158 int id; 159 device_t *dev; 160 int irq; 161 interrupt_handler_t *handler; 162 link_t link; 163 } interrupt_context_t; 164 165 typedef struct interrupt_context_list { 166 int curr_id; 167 link_t contexts; 168 fibril_mutex_t mutex; 169 } interrupt_context_list_t; 170 171 extern interrupt_context_t *create_interrupt_context(void); 172 extern void delete_interrupt_context(interrupt_context_t *); 173 extern void init_interrupt_context_list(interrupt_context_list_t *); 174 extern void add_interrupt_context(interrupt_context_list_t *, 175 interrupt_context_t *); 176 extern void remove_interrupt_context(interrupt_context_list_t *, 177 interrupt_context_t *); 178 extern interrupt_context_t *find_interrupt_context_by_id( 179 interrupt_context_list_t *, int); 180 extern interrupt_context_t *find_interrupt_context( 181 interrupt_context_list_t *, device_t *, int); 182 183 extern int register_interrupt_handler(device_t *, int, interrupt_handler_t *, 184 irq_code_t *); 185 extern int unregister_interrupt_handler(device_t *, int); 186 187 extern remote_handler_t *device_get_default_handler(device_t *); 188 extern int add_device_to_class(device_t *, const char *); 151 extern int ddf_fun_add_to_class(ddf_fun_t *, const char *); 189 152 190 153 #endif -
uspace/lib/drv/include/dev_iface.h
rdbe25f1 reb1a2f4 43 43 */ 44 44 45 struct d evice;45 struct ddf_fun; 46 46 47 47 /* … … 49 49 * devices driver. 50 50 */ 51 typedef void remote_iface_func_t(struct d evice*, void *, ipc_callid_t,51 typedef void remote_iface_func_t(struct ddf_fun *, void *, ipc_callid_t, 52 52 ipc_call_t *); 53 53 typedef remote_iface_func_t *remote_iface_func_ptr_t; 54 typedef void remote_handler_t(struct d evice*, ipc_callid_t, ipc_call_t *);54 typedef void remote_handler_t(struct ddf_fun *, ipc_callid_t, ipc_call_t *); 55 55 56 56 typedef struct { -
uspace/lib/drv/include/ops/char_dev.h
rdbe25f1 reb1a2f4 36 36 #define LIBDRV_OPS_CHAR_DEV_H_ 37 37 38 #include "../d river.h"38 #include "../ddf/driver.h" 39 39 40 40 typedef struct { 41 int (*read)(d evice_t *, char *, size_t);42 int (*write)(d evice_t *, char *, size_t);41 int (*read)(ddf_fun_t *, char *, size_t); 42 int (*write)(ddf_fun_t *, char *, size_t); 43 43 } char_dev_ops_t; 44 44 -
uspace/lib/drv/include/ops/hw_res.h
rdbe25f1 reb1a2f4 39 39 #include <sys/types.h> 40 40 41 #include "../d river.h"41 #include "../ddf/driver.h" 42 42 43 43 typedef struct { 44 hw_resource_list_t *(*get_resource_list)(d evice_t *);45 bool (*enable_interrupt)(d evice_t *);44 hw_resource_list_t *(*get_resource_list)(ddf_fun_t *); 45 bool (*enable_interrupt)(ddf_fun_t *); 46 46 } hw_res_ops_t; 47 47 -
uspace/lib/drv/include/usb_iface.h
rdbe25f1 reb1a2f4 38 38 #define LIBDRV_USB_IFACE_H_ 39 39 40 #include "d river.h"40 #include "ddf/driver.h" 41 41 #include <usb/usb.h> 42 42 typedef enum { … … 75 75 /** USB device communication interface. */ 76 76 typedef struct { 77 int (*get_address)(d evice_t *, devman_handle_t, usb_address_t *);78 int (*get_interface)(d evice_t *, devman_handle_t, int *);79 int (*get_hc_handle)(d evice_t *, devman_handle_t *);77 int (*get_address)(ddf_fun_t *, devman_handle_t, usb_address_t *); 78 int (*get_interface)(ddf_fun_t *, devman_handle_t, int *); 79 int (*get_hc_handle)(ddf_fun_t *, devman_handle_t *); 80 80 } usb_iface_t; 81 81 -
uspace/lib/drv/include/usbhc_iface.h
rdbe25f1 reb1a2f4 38 38 #define LIBDRV_USBHC_IFACE_H_ 39 39 40 #include "d river.h"40 #include "ddf/driver.h" 41 41 #include <usb/usb.h> 42 42 #include <bool.h> … … 171 171 172 172 /** Callback for outgoing transfer. */ 173 typedef void (*usbhc_iface_transfer_out_callback_t)(d evice_t *,173 typedef void (*usbhc_iface_transfer_out_callback_t)(ddf_fun_t *, 174 174 int, void *); 175 175 176 176 /** Callback for incoming transfer. */ 177 typedef void (*usbhc_iface_transfer_in_callback_t)(d evice_t *,177 typedef void (*usbhc_iface_transfer_in_callback_t)(ddf_fun_t *, 178 178 int, size_t, void *); 179 179 180 180 181 181 /** Out transfer processing function prototype. */ 182 typedef int (*usbhc_iface_transfer_out_t)(d evice_t *, usb_target_t, size_t,182 typedef int (*usbhc_iface_transfer_out_t)(ddf_fun_t *, usb_target_t, size_t, 183 183 void *, size_t, 184 184 usbhc_iface_transfer_out_callback_t, void *); … … 188 188 189 189 /** In transfer processing function prototype. */ 190 typedef int (*usbhc_iface_transfer_in_t)(d evice_t *, usb_target_t, size_t,190 typedef int (*usbhc_iface_transfer_in_t)(ddf_fun_t *, usb_target_t, size_t, 191 191 void *, size_t, 192 192 usbhc_iface_transfer_in_callback_t, void *); … … 194 194 /** USB host controller communication interface. */ 195 195 typedef struct { 196 int (*reserve_default_address)(d evice_t *, usb_speed_t);197 int (*release_default_address)(d evice_t *);198 int (*request_address)(d evice_t *, usb_speed_t, usb_address_t *);199 int (*bind_address)(d evice_t *, usb_address_t, devman_handle_t);200 int (*release_address)(d evice_t *, usb_address_t);196 int (*reserve_default_address)(ddf_fun_t *, usb_speed_t); 197 int (*release_default_address)(ddf_fun_t *); 198 int (*request_address)(ddf_fun_t *, usb_speed_t, usb_address_t *); 199 int (*bind_address)(ddf_fun_t *, usb_address_t, devman_handle_t); 200 int (*release_address)(ddf_fun_t *, usb_address_t); 201 201 202 202 usbhc_iface_transfer_out_t interrupt_out; … … 206 206 usbhc_iface_transfer_in_t bulk_in; 207 207 208 int (*control_write)(d evice_t *, usb_target_t,208 int (*control_write)(ddf_fun_t *, usb_target_t, 209 209 size_t, 210 210 void *, size_t, void *, size_t, 211 211 usbhc_iface_transfer_out_callback_t, void *); 212 212 213 int (*control_read)(d evice_t *, usb_target_t,213 int (*control_read)(ddf_fun_t *, usb_target_t, 214 214 size_t, 215 215 void *, size_t, void *, size_t, -
uspace/lib/usb/include/usb/ddfiface.h
rdbe25f1 reb1a2f4 40 40 #include <usb_iface.h> 41 41 42 int usb_iface_get_hc_handle_hub_impl(d evice_t *, devman_handle_t *);43 int usb_iface_get_address_hub_impl(d evice_t *, devman_handle_t,42 int usb_iface_get_hc_handle_hub_impl(ddf_fun_t *, devman_handle_t *); 43 int usb_iface_get_address_hub_impl(ddf_fun_t *, devman_handle_t, 44 44 usb_address_t *); 45 45 extern usb_iface_t usb_iface_hub_impl; 46 46 47 int usb_iface_get_hc_handle_hub_child_impl(d evice_t *, devman_handle_t *);48 int usb_iface_get_address_hub_child_impl(d evice_t *, devman_handle_t,47 int usb_iface_get_hc_handle_hub_child_impl(ddf_fun_t *, devman_handle_t *); 48 int usb_iface_get_address_hub_child_impl(ddf_fun_t *, devman_handle_t, 49 49 usb_address_t *); 50 50 extern usb_iface_t usb_iface_hub_child_impl; 51 51 52 int usb_iface_get_hc_handle_hc_impl(d evice_t *, devman_handle_t *);52 int usb_iface_get_hc_handle_hc_impl(ddf_fun_t *, devman_handle_t *); 53 53 54 54 -
uspace/lib/usb/include/usb/hub.h
rdbe25f1 reb1a2f4 39 39 #include <usb/usbdevice.h> 40 40 41 int usb_hc_new_device_wrapper(device_t *, usb_hc_connection_t *, usb_speed_t, 42 int (*)(int, void *), int, void *, usb_address_t *, devman_handle_t *); 41 int usb_hc_new_device_wrapper(ddf_dev_t *, usb_hc_connection_t *, usb_speed_t, 42 int (*)(int, void *), int, void *, 43 usb_address_t *, devman_handle_t *, 44 ddf_dev_ops_t *, void *, ddf_fun_t **); 43 45 44 46 /** Info about device attached to host controller. -
uspace/lib/usb/include/usb/pipes.h
rdbe25f1 reb1a2f4 41 41 #include <usb/descriptor.h> 42 42 #include <ipc/devman.h> 43 #include <d river.h>43 #include <ddf/driver.h> 44 44 45 45 /** … … 120 120 usb_device_connection_t *, usb_hc_connection_t *); 121 121 int usb_device_connection_initialize_from_device(usb_device_connection_t *, 122 d evice_t *);122 ddf_dev_t *); 123 123 int usb_device_connection_initialize(usb_device_connection_t *, 124 124 devman_handle_t, usb_address_t); 125 125 126 int usb_device_get_assigned_interface(d evice_t *);126 int usb_device_get_assigned_interface(ddf_dev_t *); 127 127 128 128 int usb_endpoint_pipe_initialize(usb_endpoint_pipe_t *, -
uspace/lib/usb/include/usb/recognise.h
rdbe25f1 reb1a2f4 50 50 int usb_device_create_match_ids(usb_endpoint_pipe_t *, match_id_list_t *); 51 51 52 int usb_device_register_child_in_devman(usb_address_t address, devman_handle_t hc_handle,53 d evice_t *parent, devman_handle_t *child_handle);52 int usb_device_register_child_in_devman(usb_address_t, devman_handle_t, 53 ddf_dev_t *, devman_handle_t *, ddf_dev_ops_t *, void *, ddf_fun_t **); 54 54 55 55 #endif -
uspace/lib/usb/include/usb/usbdevice.h
rdbe25f1 reb1a2f4 38 38 #include <sys/types.h> 39 39 #include <ipc/devman.h> 40 #include <d river.h>40 #include <ddf/driver.h> 41 41 #include <bool.h> 42 42 #include <usb/usb.h> … … 53 53 54 54 int usb_hc_connection_initialize_from_device(usb_hc_connection_t *, 55 d evice_t *);55 ddf_dev_t *); 56 56 int usb_hc_connection_initialize(usb_hc_connection_t *, devman_handle_t); 57 57 -
uspace/lib/usb/src/ddfiface.c
rdbe25f1 reb1a2f4 34 34 */ 35 35 #include <ipc/devman.h> 36 #include <devman.h> 37 #include <async.h> 36 38 #include <usb/ddfiface.h> 39 #include <usb/debug.h> 37 40 #include <errno.h> 41 #include <assert.h> 38 42 39 43 /** DDF interface for USB device, implementation for typical hub. */ … … 56 60 * @return Error code. 57 61 */ 58 int usb_iface_get_hc_handle_hub_impl(d evice_t *device, devman_handle_t *handle)62 int usb_iface_get_hc_handle_hub_impl(ddf_fun_t *fun, devman_handle_t *handle) 59 63 { 60 assert( device);61 return usb_hc_find( device->handle, handle);64 assert(fun); 65 return usb_hc_find(fun->handle, handle); 62 66 } 63 67 … … 69 73 * @return Error code. 70 74 */ 71 int usb_iface_get_hc_handle_hub_child_impl(d evice_t *device,75 int usb_iface_get_hc_handle_hub_child_impl(ddf_fun_t *fun, 72 76 devman_handle_t *handle) 73 77 { 74 assert(device); 75 device_t *parent = device->parent; 78 assert(fun != NULL); 76 79 77 /* Default error, device does not support this operation. */ 78 int rc = ENOTSUP; 79 80 if (parent && parent->ops && parent->ops->interfaces[USB_DEV_IFACE]) { 81 usb_iface_t *usb_iface 82 = (usb_iface_t *) parent->ops->interfaces[USB_DEV_IFACE]; 83 assert(usb_iface != NULL); 84 85 if (usb_iface->get_hc_handle) { 86 rc = usb_iface->get_hc_handle(parent, handle); 87 } 80 int parent_phone = devman_parent_device_connect(fun->handle, 81 IPC_FLAG_BLOCKING); 82 if (parent_phone < 0) { 83 return parent_phone; 88 84 } 89 85 90 return rc; 86 sysarg_t hc_handle; 87 int rc = async_req_1_1(parent_phone, DEV_IFACE_ID(USB_DEV_IFACE), 88 IPC_M_USB_GET_HOST_CONTROLLER_HANDLE, &hc_handle); 89 90 if (rc != EOK) { 91 return rc; 92 } 93 94 *handle = hc_handle; 95 96 return EOK; 91 97 } 92 98 … … 97 103 * @return Always EOK. 98 104 */ 99 int usb_iface_get_hc_handle_hc_impl(d evice_t *device, devman_handle_t *handle)105 int usb_iface_get_hc_handle_hc_impl(ddf_fun_t *fun, devman_handle_t *handle) 100 106 { 101 assert( device);107 assert(fun); 102 108 103 109 if (handle != NULL) { 104 *handle = device->handle;110 *handle = fun->handle; 105 111 } 106 112 … … 115 121 * @return Error code. 116 122 */ 117 int usb_iface_get_address_hub_impl(d evice_t *device, devman_handle_t handle,123 int usb_iface_get_address_hub_impl(ddf_fun_t *fun, devman_handle_t handle, 118 124 usb_address_t *address) 119 125 { 120 assert( device);121 int parent_phone = devman_parent_device_connect( device->handle,126 assert(fun); 127 int parent_phone = devman_parent_device_connect(fun->handle, 122 128 IPC_FLAG_BLOCKING); 123 129 if (parent_phone < 0) { … … 150 156 * @return Error code. 151 157 */ 152 int usb_iface_get_address_hub_child_impl(d evice_t *device,158 int usb_iface_get_address_hub_child_impl(ddf_fun_t *fun, 153 159 devman_handle_t handle, usb_address_t *address) 154 160 { 155 assert(device); 156 device_t *parent = device->parent; 157 158 /* Default error, device does not support this operation. */ 159 int rc = ENOTSUP; 160 161 if (parent && parent->ops && parent->ops->interfaces[USB_DEV_IFACE]) { 162 usb_iface_t *usb_iface 163 = (usb_iface_t *) parent->ops->interfaces[USB_DEV_IFACE]; 164 assert(usb_iface != NULL); 165 166 if (usb_iface->get_address) { 167 rc = usb_iface->get_address(parent, handle, address); 168 } 161 if (handle == 0) { 162 handle = fun->handle; 169 163 } 170 171 return rc; 164 return usb_iface_get_address_hub_impl(fun, handle, address); 172 165 } 173 166 -
uspace/lib/usb/src/hub.c
rdbe25f1 reb1a2f4 39 39 #include <usbhc_iface.h> 40 40 #include <errno.h> 41 #include <assert.h> 41 42 42 43 /** Check that HC connection is alright. … … 172 173 * request or requests for descriptors when creating match ids). 173 174 */ 174 int usb_hc_new_device_wrapper(d evice_t *parent, usb_hc_connection_t *connection,175 int usb_hc_new_device_wrapper(ddf_dev_t *parent, usb_hc_connection_t *connection, 175 176 usb_speed_t dev_speed, 176 177 int (*enable_port)(int port_no, void *arg), int port_no, void *arg, 177 usb_address_t *assigned_address, devman_handle_t *assigned_handle) 178 usb_address_t *assigned_address, devman_handle_t *assigned_handle, 179 ddf_dev_ops_t *dev_ops, void *new_dev_data, ddf_fun_t **new_fun) 178 180 { 179 181 CHECK_CONNECTION(connection); … … 251 253 devman_handle_t child_handle; 252 254 rc = usb_device_register_child_in_devman(dev_addr, dev_conn.hc_handle, 253 parent, &child_handle); 255 parent, &child_handle, 256 dev_ops, new_dev_data, new_fun); 254 257 if (rc != EOK) { 255 258 rc = ESTALL; -
uspace/lib/usb/src/pipes.c
rdbe25f1 reb1a2f4 35 35 #include <usb/usb.h> 36 36 #include <usb/pipes.h> 37 #include <usb/debug.h> 37 38 #include <usbhc_iface.h> 38 39 #include <usb_iface.h> 40 #include <devman.h> 39 41 #include <errno.h> 40 42 #include <assert.h> … … 46 48 * @return USB address or error code. 47 49 */ 48 static usb_address_t get_my_address(int phone, d evice_t *dev)50 static usb_address_t get_my_address(int phone, ddf_dev_t *dev) 49 51 { 50 52 sysarg_t address; 53 54 55 /* 56 * We are sending special value as a handle - zero - to get 57 * handle of the parent function (that handle was used 58 * when registering our device @p dev. 59 */ 51 60 int rc = async_req_2_1(phone, DEV_IFACE_ID(USB_DEV_IFACE), 52 61 IPC_M_USB_GET_ADDRESS, 53 dev->handle, &address);62 0, &address); 54 63 55 64 if (rc != EOK) { … … 65 74 * @return Interface number (negative code means any). 66 75 */ 67 int usb_device_get_assigned_interface(d evice_t *device)76 int usb_device_get_assigned_interface(ddf_dev_t *device) 68 77 { 69 78 int parent_phone = devman_parent_device_connect(device->handle, … … 94 103 */ 95 104 int usb_device_connection_initialize_from_device( 96 usb_device_connection_t *connection, d evice_t *device)105 usb_device_connection_t *connection, ddf_dev_t *dev) 97 106 { 98 107 assert(connection); 99 assert(dev ice);108 assert(dev); 100 109 101 110 int rc; … … 103 112 usb_address_t my_address; 104 113 105 rc = usb_hc_find(dev ice->handle, &hc_handle);114 rc = usb_hc_find(dev->handle, &hc_handle); 106 115 if (rc != EOK) { 107 116 return rc; 108 117 } 109 118 110 int parent_phone = devman_parent_device_connect(dev ice->handle,119 int parent_phone = devman_parent_device_connect(dev->handle, 111 120 IPC_FLAG_BLOCKING); 112 121 if (parent_phone < 0) { … … 114 123 } 115 124 116 my_address = get_my_address(parent_phone, dev ice);125 my_address = get_my_address(parent_phone, dev); 117 126 if (my_address < 0) { 118 127 rc = my_address; -
uspace/lib/usb/src/recognise.c
rdbe25f1 reb1a2f4 34 34 */ 35 35 #include <sys/types.h> 36 #include <fibril_synch.h> 36 37 #include <usb/pipes.h> 37 38 #include <usb/recognise.h> … … 41 42 #include <stdio.h> 42 43 #include <errno.h> 44 #include <assert.h> 43 45 44 46 static size_t device_name_index = 0; 45 47 static FIBRIL_MUTEX_INITIALIZE(device_name_index_mutex); 46 48 47 d evice_ops_t child_ops = {49 ddf_dev_ops_t child_ops = { 48 50 .interfaces[USB_DEV_IFACE] = &usb_iface_hub_child_impl 49 51 }; … … 326 328 int usb_device_register_child_in_devman(usb_address_t address, 327 329 devman_handle_t hc_handle, 328 device_t *parent, devman_handle_t *child_handle) 330 ddf_dev_t *parent, devman_handle_t *child_handle, 331 ddf_dev_ops_t *dev_ops, void *dev_data, ddf_fun_t **child_fun) 329 332 { 330 333 size_t this_device_name_index; … … 335 338 fibril_mutex_unlock(&device_name_index_mutex); 336 339 337 d evice_t *child = NULL;340 ddf_fun_t *child = NULL; 338 341 char *child_name = NULL; 339 342 int rc; … … 352 355 } 353 356 354 child = create_device(); 357 /* 358 * TODO: Once the device driver framework support persistent 359 * naming etc., something more descriptive could be created. 360 */ 361 rc = asprintf(&child_name, "usbdev%02zu", this_device_name_index); 362 if (rc < 0) { 363 goto failure; 364 } 365 366 child = ddf_fun_create(parent, fun_inner, child_name); 355 367 if (child == NULL) { 356 368 rc = ENOMEM; … … 358 370 } 359 371 360 /* 361 * TODO: Once the device driver framework support persistent 362 * naming etc., something more descriptive could be created. 363 */ 364 rc = asprintf(&child_name, "usbdev%02zu", this_device_name_index); 365 if (rc < 0) { 366 goto failure; 367 } 368 child->parent = parent; 369 child->name = child_name; 370 child->ops = &child_ops; 372 if (dev_ops != NULL) { 373 child->ops = dev_ops; 374 } else { 375 child->ops = &child_ops; 376 } 377 378 child->driver_data = dev_data; 371 379 372 380 rc = usb_endpoint_pipe_start_session(&ctrl_pipe); … … 385 393 } 386 394 387 rc = child_device_register(child, parent);395 rc = ddf_fun_bind(child); 388 396 if (rc != EOK) { 389 397 goto failure; … … 392 400 if (child_handle != NULL) { 393 401 *child_handle = child->handle; 402 } 403 404 if (child_fun != NULL) { 405 *child_fun = child; 394 406 } 395 407 … … 400 412 child->name = NULL; 401 413 /* This takes care of match_id deallocation as well. */ 402 d elete_device(child);414 ddf_fun_destroy(child); 403 415 } 404 416 if (child_name != NULL) { -
uspace/lib/usb/src/request.c
rdbe25f1 reb1a2f4 35 35 #include <usb/request.h> 36 36 #include <errno.h> 37 #include <assert.h> 37 38 38 39 #define MAX_DATA_LENGTH ((size_t)(0xFFFF)) -
uspace/lib/usb/src/usbdevice.c
rdbe25f1 reb1a2f4 37 37 #include <usb_iface.h> 38 38 #include <usb/usbdevice.h> 39 #include <usb/debug.h> 39 40 #include <errno.h> 41 #include <assert.h> 40 42 41 43 /** Find host controller handle that is ancestor of given device. … … 55 57 56 58 devman_handle_t h; 59 usb_log_debug("asking for HC handle (my handle is %zu).\n", device_handle); 57 60 int rc = async_req_1_1(parent_phone, DEV_IFACE_ID(USB_DEV_IFACE), 58 61 IPC_M_USB_GET_HOST_CONTROLLER_HANDLE, &h); … … 78 81 */ 79 82 int usb_hc_connection_initialize_from_device(usb_hc_connection_t *connection, 80 d evice_t *device)83 ddf_dev_t *device) 81 84 { 82 85 assert(connection); -
uspace/lib/usbvirt/src/main.c
rdbe25f1 reb1a2f4 203 203 } 204 204 205 const char *vhc_path = "/virt/usbhc ";205 const char *vhc_path = "/virt/usbhc/hc"; 206 206 int rc; 207 207 devman_handle_t handle;
Note:
See TracChangeset
for help on using the changeset viewer.