Changeset 0053fa38 in mainline
- Timestamp:
- 2011-04-02T15:37:53Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 5542b83, d527a4e
- Parents:
- d773285 (diff), 969585f (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. - Files:
-
- 7 added
- 1 deleted
- 33 edited
Legend:
- Unmodified
- Added
- Removed
-
HelenOS.config
rd773285 r0053fa38 528 528 ! [PLATFORM=sparc64&MACHINE=generic] CONFIG_AOUT_ISOFS_B (y) 529 529 530 % Run devman on startup 531 ! CONFIG_START_DEVMAN (y) 532 533 % Launch (devman) test drivers 534 ! [CONFIG_START_DEVMAN=y&CONFIG_DEBUG=y] CONFIG_TEST_DRIVERS (y/n) 535 530 536 % Load disk drivers on startup 531 537 ! CONFIG_START_BD (n/y) … … 549 555 ! [CONFIG_STRIP_BINARIES!=y] CONFIG_LINE_DEBUG (n/y) 550 556 551 % Launch (devman) test drivers552 ! [CONFIG_DEBUG=y] CONFIG_TEST_DRIVERS (n/y)553 554 557 % Start virtual USB host controller 555 558 ! CONFIG_RUN_VIRTUAL_USB_HC (n/y) … … 560 563 % Run devman in kconsole (not recommended) 561 564 ! CONFIG_DEVMAN_EARLY_LAUNCH (n/y) 562 -
uspace/app/bdsh/cmds/modules/ls/ls.c
rd773285 r0053fa38 38 38 #include <dirent.h> 39 39 #include <fcntl.h> 40 #include <getopt.h> 40 41 #include <sys/types.h> 41 42 #include <sys/stat.h> 42 43 #include <str.h> 44 #include <sort.h> 43 45 44 46 #include "errors.h" … … 46 48 #include "util.h" 47 49 #include "entry.h" 48 #include "ls.h"49 50 #include "cmds.h" 50 51 52 /* Various values that can be returned by ls_scope() */ 53 #define LS_BOGUS 0 54 #define LS_FILE 1 55 #define LS_DIR 2 56 57 /** Structure to represent a directory entry. 58 * 59 * Useful to keep together important information 60 * for sorting directory entries. 61 */ 62 struct dir_elem_t { 63 char *name; 64 struct stat s; 65 }; 66 51 67 static const char *cmdname = "ls"; 52 68 53 static void ls_scan_dir(const char *d, DIR *dirp) 54 { 69 static struct option const long_options[] = { 70 { "help", no_argument, 0, 'h' }, 71 { "unsort", no_argument, 0, 'u' }, 72 { 0, 0, 0, 0 } 73 }; 74 75 /** Print an entry. 76 * 77 * ls_print currently does nothing more than print the entry. 78 * In the future, we will likely pass the absolute path, and 79 * some sort of ls_options structure that controls how each 80 * entry is printed and what is printed about it. 81 * 82 * Now we just print basic DOS style lists. 83 * 84 * @param de Directory element. 85 */ 86 static void ls_print(struct dir_elem_t *de) 87 { 88 if (de->s.is_file) 89 printf("%-40s\t%llu\n", de->name, (long long) de->s.size); 90 else if (de->s.is_directory) 91 printf("%-40s\t<dir>\n", de->name); 92 else 93 printf("%-40s\n", de->name); 94 } 95 96 97 /** Compare 2 directory elements. 98 * 99 * It compares 2 elements of a directory : a file is considered 100 * as bigger than a directory, and if they have the same type, 101 * they are compared alphabetically. 102 * 103 * @param a Pointer to the structure of the first element. 104 * @param b Pointer to the structure of the second element. 105 * @param arg Pointer for an other and optionnal argument. 106 * 107 * @return -1 if a < b, 1 otherwise. 108 */ 109 static int ls_cmp(void *a, void *b, void *arg) 110 { 111 struct dir_elem_t *da = a; 112 struct dir_elem_t *db = b; 113 114 if ((da->s.is_directory && db->s.is_file) || 115 ((da->s.is_directory == db->s.is_directory) && 116 str_cmp(da->name, db->name) < 0)) 117 return -1; 118 else 119 return 1; 120 } 121 122 /** Scan a directory. 123 * 124 * Scan the content of a directory and print it. 125 * 126 * @param d Name of the directory. 127 * @param dirp Directory stream. 128 * @param sort 1 if the output must be sorted, 129 * 0 otherwise. 130 */ 131 static void ls_scan_dir(const char *d, DIR *dirp, int sort) 132 { 133 int alloc_blocks = 20; 134 int i; 135 int nbdirs = 0; 136 int rc; 137 int len; 138 char *buff; 139 struct dir_elem_t *tmp; 140 struct dir_elem_t *tosort; 55 141 struct dirent *dp; 56 char *buff; 57 58 if (! dirp) 142 143 if (!dirp) 59 144 return; 60 145 61 buff = (char *) malloc(PATH_MAX);62 if ( NULL ==buff) {146 buff = (char *) malloc(PATH_MAX); 147 if (!buff) { 63 148 cli_error(CL_ENOMEM, "ls: failed to scan %s", d); 64 149 return; 65 150 } 66 151 152 tosort = (struct dir_elem_t *) malloc(alloc_blocks * sizeof(*tosort)); 153 if (!tosort) { 154 cli_error(CL_ENOMEM, "ls: failed to scan %s", d); 155 free(buff); 156 return; 157 } 158 67 159 while ((dp = readdir(dirp))) { 68 memset(buff, 0, sizeof(buff)); 69 /* Don't worry if inserting a double slash, this will be fixed by 70 * absolutize() later with subsequent calls to open() or readdir() */ 71 snprintf(buff, PATH_MAX - 1, "%s/%s", d, dp->d_name); 72 ls_print(dp->d_name, buff); 73 } 74 160 if (nbdirs + 1 > alloc_blocks) { 161 alloc_blocks += alloc_blocks; 162 163 tmp = (struct dir_elem_t *) realloc(tosort, 164 alloc_blocks * sizeof(struct dir_elem_t)); 165 if (!tmp) { 166 cli_error(CL_ENOMEM, "ls: failed to scan %s", d); 167 goto out; 168 } 169 tosort = tmp; 170 } 171 172 /* fill the name field */ 173 tosort[nbdirs].name = (char *) malloc(str_length(dp->d_name) + 1); 174 if (!tosort[nbdirs].name) { 175 cli_error(CL_ENOMEM, "ls: failed to scan %s", d); 176 goto out; 177 } 178 179 str_cpy(tosort[nbdirs].name, str_length(dp->d_name) + 1, dp->d_name); 180 len = snprintf(buff, PATH_MAX - 1, "%s/%s", d, tosort[nbdirs].name); 181 buff[len] = '\0'; 182 183 rc = stat(buff, &tosort[nbdirs++].s); 184 if (rc != 0) { 185 printf("ls: skipping bogus node %s\n", buff); 186 printf("rc=%d\n", rc); 187 goto out; 188 } 189 } 190 191 if (sort) { 192 if (!qsort(&tosort[0], nbdirs, sizeof(struct dir_elem_t), 193 ls_cmp, NULL)) { 194 printf("Sorting error.\n"); 195 } 196 } 197 198 for (i = 0; i < nbdirs; i++) 199 ls_print(&tosort[i]); 200 201 out: 202 for(i = 0; i < nbdirs; i++) 203 free(tosort[i].name); 204 free(tosort); 75 205 free(buff); 76 77 return;78 }79 80 /* ls_print currently does nothing more than print the entry.81 * in the future, we will likely pass the absolute path, and82 * some sort of ls_options structure that controls how each83 * entry is printed and what is printed about it.84 *85 * Now we just print basic DOS style lists */86 87 static void ls_print(const char *name, const char *pathname)88 {89 struct stat s;90 int rc;91 92 rc = stat(pathname, &s);93 if (rc != 0) {94 /* Odd chance it was deleted from the time readdir() found it */95 printf("ls: skipping bogus node %s\n", pathname);96 printf("rc=%d\n", rc);97 return;98 }99 100 if (s.is_file)101 printf("%-40s\t%llu\n", name, (long long) s.size);102 else if (s.is_directory)103 printf("%-40s\t<dir>\n", name);104 else105 printf("%-40s\n", name);106 107 return;108 206 } 109 207 … … 114 212 } else { 115 213 help_cmd_ls(HELP_SHORT); 116 printf(" `%s' [path], if no path is given the current " 117 "working directory is used.\n", cmdname); 214 printf( 215 "Usage: %s [options] [path]\n" 216 "If not path is given, the current working directory is used.\n" 217 "Options:\n" 218 " -h, --help A short option summary\n" 219 " -u, --unsort Do not sort directory entries\n", 220 cmdname); 118 221 } 119 222 … … 124 227 { 125 228 unsigned int argc; 126 struct stat s; 127 char *buff; 229 struct dir_elem_t de; 128 230 DIR *dirp; 231 int c, opt_ind; 232 int sort = 1; 129 233 130 234 argc = cli_count_args(argv); 131 132 buff = (char *) malloc(PATH_MAX); 133 if (NULL == buff) { 235 236 for (c = 0, optind = 0, opt_ind = 0; c != -1;) { 237 c = getopt_long(argc, argv, "hu", long_options, &opt_ind); 238 switch (c) { 239 case 'h': 240 help_cmd_ls(HELP_LONG); 241 return CMD_SUCCESS; 242 case 'u': 243 sort = 0; 244 break; 245 } 246 } 247 248 argc -= optind; 249 250 de.name = (char *) malloc(PATH_MAX); 251 if (!de.name) { 134 252 cli_error(CL_ENOMEM, "%s: ", cmdname); 135 253 return CMD_FAILURE; 136 254 } 137 memset( buff, 0, sizeof(buff));138 139 if (argc == 1)140 getcwd( buff, PATH_MAX);255 memset(de.name, 0, sizeof(PATH_MAX)); 256 257 if (argc == 0) 258 getcwd(de.name, PATH_MAX); 141 259 else 142 str_cpy( buff, PATH_MAX, argv[1]);143 144 if (stat( buff, &s)) {145 cli_error(CL_ENOENT, buff);146 free( buff);260 str_cpy(de.name, PATH_MAX, argv[optind]); 261 262 if (stat(de.name, &de.s)) { 263 cli_error(CL_ENOENT, de.name); 264 free(de.name); 147 265 return CMD_FAILURE; 148 266 } 149 267 150 if ( s.is_file) {151 ls_print( buff, buff);268 if (de.s.is_file) { 269 ls_print(&de); 152 270 } else { 153 dirp = opendir( buff);271 dirp = opendir(de.name); 154 272 if (!dirp) { 155 273 /* May have been deleted between scoping it and opening it */ 156 cli_error(CL_EFAIL, "Could not stat %s", buff);157 free( buff);274 cli_error(CL_EFAIL, "Could not stat %s", de.name); 275 free(de.name); 158 276 return CMD_FAILURE; 159 277 } 160 ls_scan_dir( buff, dirp);278 ls_scan_dir(de.name, dirp, sort); 161 279 closedir(dirp); 162 280 } 163 281 164 free( buff);282 free(de.name); 165 283 166 284 return CMD_SUCCESS; -
uspace/app/init/init.c
rd773285 r0053fa38 314 314 getterm("term/vc6", "/app/klog", false); 315 315 316 #ifdef CONFIG_START_DEVMAN 317 316 318 #ifdef CONFIG_DEVMAN_EARLY_LAUNCH 317 319 spawn("/srv/devman"); … … 320 322 #endif 321 323 324 #endif 325 322 326 return 0; 323 327 } -
uspace/app/tester/Makefile
rd773285 r0053fa38 54 54 mm/malloc1.c \ 55 55 mm/mapping1.c \ 56 devs/devman1.c \ 56 57 hw/misc/virtchar1.c \ 57 58 hw/serial/serial1.c -
uspace/app/tester/tester.c
rd773285 r0053fa38 66 66 #include "adt/usbaddrkeep.def" 67 67 #include "hw/misc/virtchar1.def" 68 #include "devs/devman1.def" 68 69 {NULL, NULL, NULL, false} 69 70 }; -
uspace/app/tester/tester.h
rd773285 r0053fa38 82 82 extern const char *test_usbaddrkeep(void); 83 83 extern const char *test_virtchar1(void); 84 extern const char *test_devman1(void); 84 85 85 86 extern test_t tests[]; -
uspace/drv/isa/isa.c
rd773285 r0053fa38 53 53 54 54 #include <ddf/driver.h> 55 #include <ddf/log.h> 55 56 #include <ops/hw_res.h> 56 57 … … 134 135 fd = open(conf_path, O_RDONLY); 135 136 if (fd < 0) { 136 printf(NAME ": unable to open %s\n", conf_path);137 ddf_msg(LVL_ERROR, "Unable to open %s", conf_path); 137 138 goto cleanup; 138 139 } … … 141 142 142 143 len = lseek(fd, 0, SEEK_END); 143 lseek(fd, 0, SEEK_SET); 144 lseek(fd, 0, SEEK_SET); 144 145 if (len == 0) { 145 printf(NAME ": fun_conf_read error: configuration file '%s' "146 "is empty.\n",conf_path);146 ddf_msg(LVL_ERROR, "Configuration file '%s' is empty.", 147 conf_path); 147 148 goto cleanup; 148 149 } … … 150 151 buf = malloc(len + 1); 151 152 if (buf == NULL) { 152 printf(NAME ": fun_conf_read error: memory allocation failed.\n");153 ddf_msg(LVL_ERROR, "Memory allocation failed."); 153 154 goto cleanup; 154 155 } 155 156 156 157 if (0 >= read(fd, buf, len)) { 157 printf(NAME ": fun_conf_read error: unable to read file '%s'.\n", 158 conf_path); 158 ddf_msg(LVL_ERROR, "Unable to read file '%s'.", conf_path); 159 159 goto cleanup; 160 160 } … … 252 252 fun->hw_resources.count++; 253 253 254 printf(NAME ": added irq 0x%x to function %s\n", irq,254 ddf_msg(LVL_NOTE, "Added irq 0x%x to function %s", irq, 255 255 fun->fnode->name); 256 256 } … … 270 270 fun->hw_resources.count++; 271 271 272 printf(NAME ": added io range (addr=0x%x, size=0x%x) to "273 "function %s \n", (unsigned int) addr, (unsigned int) len,272 ddf_msg(LVL_NOTE, "Added io range (addr=0x%x, size=0x%x) to " 273 "function %s", (unsigned int) addr, (unsigned int) len, 274 274 fun->fnode->name); 275 275 } … … 331 331 score = (int)strtol(val, &end, 10); 332 332 if (val == end) { 333 printf(NAME " : error - could not read match score for"334 " function %s.\n", fun->fnode->name);333 ddf_msg(LVL_ERROR, "Cannot read match score for function " 334 "%s.", fun->fnode->name); 335 335 return; 336 336 } … … 339 339 get_match_id(&id, val); 340 340 if (id == NULL) { 341 printf(NAME " : error - could not read match id for "342 "function %s.\n",fun->fnode->name);341 ddf_msg(LVL_ERROR, "Cannot read match ID for function %s.", 342 fun->fnode->name); 343 343 return; 344 344 } 345 345 346 printf(NAME ": adding match id '%s' with score %d to function %s\n", id,347 score, fun->fnode->name);346 ddf_msg(LVL_DEBUG, "Adding match id '%s' with score %d to " 347 "function %s", id, score, fun->fnode->name); 348 348 349 349 rc = ddf_fun_add_match_id(fun->fnode, id, score); 350 if (rc != EOK) 351 printf(NAME ": error adding match ID: %s\n", str_error(rc)); 350 if (rc != EOK) { 351 ddf_msg(LVL_ERROR, "Failed adding match ID: %s", 352 str_error(rc)); 353 } 352 354 } 353 355 … … 375 377 if (!prop_parse(fun, line, "io_range", &fun_parse_io_range) && 376 378 !prop_parse(fun, line, "irq", &fun_parse_irq) && 377 !prop_parse(fun, line, "match", &fun_parse_match_id)) 378 { 379 printf(NAME " error undefined device property at line '%s'\n",380 line);379 !prop_parse(fun, line, "match", &fun_parse_match_id)) { 380 381 ddf_msg(LVL_ERROR, "Undefined device property at line '%s'", 382 line); 381 383 } 382 384 } … … 439 441 fun->fnode->ops = &isa_fun_ops; 440 442 441 printf(NAME ": Binding function %s.\n", fun->fnode->name);443 ddf_msg(LVL_DEBUG, "Binding function %s.", fun->fnode->name); 442 444 443 445 /* XXX Handle error */ … … 467 469 static int isa_add_device(ddf_dev_t *dev) 468 470 { 469 printf(NAME ": isa_add_device, device handle = %d\n",471 ddf_msg(LVL_DEBUG, "isa_add_device, device handle = %d", 470 472 (int) dev->handle); 471 473 472 474 /* Make the bus device more visible. Does not do anything. */ 473 printf(NAME ": adding a 'ctl' function\n");475 ddf_msg(LVL_DEBUG, "Adding a 'ctl' function"); 474 476 475 477 ddf_fun_t *ctl = ddf_fun_create(dev, fun_exposed, "ctl"); 476 478 if (ctl == NULL) { 477 printf(NAME ": Error creating control function.\n");479 ddf_msg(LVL_ERROR, "Failed creating control function."); 478 480 return EXDEV; 479 481 } 480 482 481 483 if (ddf_fun_bind(ctl) != EOK) { 482 printf(NAME ": Error binding control function.\n");484 ddf_msg(LVL_ERROR, "Failed binding control function."); 483 485 return EXDEV; 484 486 } … … 486 488 /* Add functions as specified in the configuration file. */ 487 489 isa_functions_add(dev); 488 printf(NAME ": finished the enumeration of legacy functions\n");490 ddf_msg(LVL_NOTE, "Finished enumerating legacy functions"); 489 491 490 492 return EOK; … … 493 495 static void isa_init() 494 496 { 497 ddf_log_init(NAME, LVL_ERROR); 495 498 isa_fun_ops.interfaces[HW_RES_DEV_IFACE] = &isa_fun_hw_res_ops; 496 499 } -
uspace/drv/ns8250/ns8250.c
rd773285 r0053fa38 55 55 #include <ddf/driver.h> 56 56 #include <ddf/interrupt.h> 57 #include <ddf/log.h> 57 58 #include <ops/char_dev.h> 58 59 … … 275 276 static bool ns8250_pio_enable(ns8250_t *ns) 276 277 { 277 printf(NAME ": ns8250_pio_enable %s\n", ns->dev->name);278 ddf_msg(LVL_DEBUG, "ns8250_pio_enable %s", ns->dev->name); 278 279 279 280 /* Gain control over port's registers. */ 280 281 if (pio_enable((void *)(uintptr_t) ns->io_addr, REG_COUNT, 281 282 (void **) &ns->port)) { 282 printf(NAME ": error - cannot gain the port %#" PRIx32 " for device "283 " %s.\n", ns->io_addr, ns->dev->name);283 ddf_msg(LVL_ERROR, "Cannot map the port %#" PRIx32 284 " for device %s.", ns->io_addr, ns->dev->name); 284 285 return false; 285 286 } … … 295 296 static bool ns8250_dev_probe(ns8250_t *ns) 296 297 { 297 printf(NAME ": ns8250_dev_probe %s\n", ns->dev->name);298 ddf_msg(LVL_DEBUG, "ns8250_dev_probe %s", ns->dev->name); 298 299 299 300 ioport8_t *port_addr = ns->port; … … 313 314 pio_write_8(port_addr + 4, olddata); 314 315 315 if (!res) 316 printf(NAME ": device %s is not present.\n", ns->dev->name); 316 if (!res) { 317 ddf_msg(LVL_DEBUG, "Device %s is not present.", 318 ns->dev->name); 319 } 317 320 318 321 return res; … … 326 329 static int ns8250_dev_initialize(ns8250_t *ns) 327 330 { 328 printf(NAME ": ns8250_dev_initialize %s\n", ns->dev->name);331 ddf_msg(LVL_DEBUG, "ns8250_dev_initialize %s", ns->dev->name); 329 332 330 333 int ret = EOK; … … 337 340 IPC_FLAG_BLOCKING); 338 341 if (ns->dev->parent_phone < 0) { 339 printf(NAME ": failed to connect to the parent driver of the"340 "device %s. \n", ns->dev->name);342 ddf_msg(LVL_ERROR, "Failed to connect to parent driver of " 343 "device %s.", ns->dev->name); 341 344 ret = ns->dev->parent_phone; 342 345 goto failed; … … 346 349 ret = hw_res_get_resource_list(ns->dev->parent_phone, &hw_resources); 347 350 if (ret != EOK) { 348 printf(NAME ": failed to get hw resources for thedevice "349 "%s. \n", ns->dev->name);351 ddf_msg(LVL_ERROR, "Failed to get HW resources for device " 352 "%s.", ns->dev->name); 350 353 goto failed; 351 354 } … … 362 365 ns->irq = res->res.interrupt.irq; 363 366 irq = true; 364 printf(NAME ": the %s device was asigned irq = 0x%x.\n",367 ddf_msg(LVL_NOTE, "Device %s was asigned irq = 0x%x.", 365 368 ns->dev->name, ns->irq); 366 369 break; … … 369 372 ns->io_addr = res->res.io_range.address; 370 373 if (res->res.io_range.size < REG_COUNT) { 371 printf(NAME ": i/o range assigned to the device"372 " %s is too small.\n", ns->dev->name);374 ddf_msg(LVL_ERROR, "I/O range assigned to " 375 "device %s is too small.", ns->dev->name); 373 376 ret = ELIMIT; 374 377 goto failed; 375 378 } 376 379 ioport = true; 377 printf(NAME ": the %s device was asigned i/oaddress = "378 "0x%x. \n", ns->dev->name, ns->io_addr);379 break;380 ddf_msg(LVL_NOTE, "Device %s was asigned I/O address = " 381 "0x%x.", ns->dev->name, ns->io_addr); 382 break; 380 383 381 384 default: … … 385 388 386 389 if (!irq || !ioport) { 387 printf(NAME ": missing hw resource(s) for the device %s.\n",390 ddf_msg(LVL_ERROR, "Missing HW resource(s) for device %s.", 388 391 ns->dev->name); 389 392 ret = ENOENT; … … 470 473 471 474 if (baud_rate < 50 || MAX_BAUD_RATE % baud_rate != 0) { 472 printf(NAME ": error - somebody tried to set invalid baud rate "473 "%d\n",baud_rate);475 ddf_msg(LVL_ERROR, "Invalid baud rate %d requested.", 476 baud_rate); 474 477 return EINVAL; 475 478 } … … 654 657 if (ns->client_connected) { 655 658 if (!buf_push_back(&ns->input_buffer, val)) { 656 printf(NAME ": buffer overflow on "657 "%s. \n", ns->dev->name);659 ddf_msg(LVL_WARN, "Buffer overflow on " 660 "%s.", ns->dev->name); 658 661 } else { 659 printf(NAME ": the character %c saved "660 "to the buffer of %s. \n",662 ddf_msg(LVL_DEBUG2, "Character %c saved " 663 "to the buffer of %s.", 661 664 val, ns->dev->name); 662 665 } … … 714 717 int rc; 715 718 716 printf(NAME ": ns8250_add_device %s (handle = %d)\n",719 ddf_msg(LVL_DEBUG, "ns8250_add_device %s (handle = %d)", 717 720 dev->name, (int) dev->handle); 718 721 … … 749 752 /* Register interrupt handler. */ 750 753 if (ns8250_register_interrupt_handler(ns) != EOK) { 751 printf(NAME ": failed to register interrupt handler.\n");754 ddf_msg(LVL_ERROR, "Failed to register interrupt handler."); 752 755 rc = EADDRNOTAVAIL; 753 756 goto fail; … … 757 760 rc = ns8250_interrupt_enable(ns); 758 761 if (rc != EOK) { 759 printf(NAME ": failed to enable the interrupt. Error code = "760 "%d. \n", rc);762 ddf_msg(LVL_ERROR, "Failed to enable the interrupt. Error code = " 763 "%d.", rc); 761 764 goto fail; 762 765 } … … 764 767 fun = ddf_fun_create(dev, fun_exposed, "a"); 765 768 if (fun == NULL) { 766 printf(NAME ": error creating function.\n");769 ddf_msg(LVL_ERROR, "Failed creating function."); 767 770 goto fail; 768 771 } … … 772 775 rc = ddf_fun_bind(fun); 773 776 if (rc != EOK) { 774 printf(NAME ": error binding function.\n");777 ddf_msg(LVL_ERROR, "Failed binding function."); 775 778 goto fail; 776 779 } … … 780 783 ddf_fun_add_to_class(fun, "serial"); 781 784 782 printf(NAME ": the %s device has been successfully initialized.\n",785 ddf_msg(LVL_NOTE, "Device %s successfully initialized.", 783 786 dev->name); 784 787 … … 862 865 fibril_mutex_unlock(&data->mutex); 863 866 864 printf(NAME ":ns8250_get_props: baud rate %d, parity 0x%x, word "865 "length %d, stop bits %d \n", *baud_rate, *parity, *word_length,867 ddf_msg(LVL_DEBUG, "ns8250_get_props: baud rate %d, parity 0x%x, word " 868 "length %d, stop bits %d", *baud_rate, *parity, *word_length, 866 869 *stop_bits); 867 870 } … … 879 882 unsigned int parity, unsigned int word_length, unsigned int stop_bits) 880 883 { 881 printf(NAME ":ns8250_set_props: baud rate %d, parity 0x%x, word "882 "length %d, stop bits %d \n", baud_rate, parity, word_length,884 ddf_msg(LVL_DEBUG, "ns8250_set_props: baud rate %d, parity 0x%x, word " 885 "length %d, stop bits %d", baud_rate, parity, word_length, 883 886 stop_bits); 884 887 … … 940 943 static void ns8250_init(void) 941 944 { 945 ddf_log_init(NAME, LVL_ERROR); 946 942 947 ns8250_dev_ops.open = &ns8250_open; 943 948 ns8250_dev_ops.close = &ns8250_close; -
uspace/drv/ohci/root_hub.c
rd773285 r0053fa38 40 40 #include "root_hub.h" 41 41 #include "usb/classes/classes.h" 42 #include "usb/devdrv.h" 42 43 #include <usb/request.h> 43 44 #include <usb/classes/hub.h> … … 61 62 /// \TODO these values migt be different 62 63 .str_serial_number = 0, 63 .usb_spec_version = 0 ,64 .usb_spec_version = 0x110, 64 65 }; 65 66 … … 110 111 }; 111 112 112 /** Root hub initialization113 * @return Error code.114 */115 int rh_init(rh_t *instance, ddf_dev_t *dev, ohci_regs_t *regs)116 {117 assert(instance);118 instance->address = -1;119 instance->registers = regs;120 instance->device = dev;121 122 123 usb_log_info("OHCI root hub with %d ports.\n", regs->rh_desc_a & 0xff);124 125 //start generic usb hub driver126 127 /* TODO: implement */128 return EOK;129 }130 /*----------------------------------------------------------------------------*/131 132 /**133 * create answer to port status_request134 *135 * Copy content of corresponding port status register to answer buffer.136 *137 * @param instance root hub instance138 * @param port port number, counted from 1139 * @param request structure containing both request and response information140 * @return error code141 */142 static int process_get_port_status_request(rh_t *instance, uint16_t port,143 usb_transfer_batch_t * request){144 if(port<1 || port>instance->port_count)145 return EINVAL;146 uint32_t * uint32_buffer = (uint32_t*)request->buffer;147 request->transfered_size = 4;148 uint32_buffer[0] = instance->registers->rh_port_status[port -1];149 return EOK;150 }151 152 /**153 * create answer to port status_request154 *155 * Copy content of hub status register to answer buffer.156 *157 * @param instance root hub instance158 * @param request structure containing both request and response information159 * @return error code160 */161 static int process_get_hub_status_request(rh_t *instance,162 usb_transfer_batch_t * request){163 uint32_t * uint32_buffer = (uint32_t*)request->buffer;164 //bits, 0,1,16,17165 request->transfered_size = 4;166 uint32_t mask = 1 & (1<<1) & (1<<16) & (1<<17);167 uint32_buffer[0] = mask & instance->registers->rh_status;168 return EOK;169 170 }171 172 113 /** 173 114 * Create hub descriptor used in hub-driver <-> hub communication 174 * 115 * 175 116 * This means creating byt array from data in root hub registers. For more 176 117 * info see usb hub specification. … … 197 138 result[2] = instance->port_count; 198 139 uint32_t hub_desc_reg = instance->registers->rh_desc_a; 199 result[3] = 140 result[3] = 200 141 ((hub_desc_reg >> 8) %2) + 201 142 (((hub_desc_reg >> 9) %2) << 1) + … … 219 160 (*out_size) = size; 220 161 } 162 163 164 /** initialize hub descriptors 165 * 166 * Initialized are device and full configuration descriptor. These need to 167 * be initialized only once per hub. 168 * @instance root hub instance 169 */ 170 static void rh_init_descriptors(rh_t *instance){ 171 memcpy(&instance->descriptors.device, &ohci_rh_device_descriptor, 172 sizeof(ohci_rh_device_descriptor) 173 ); 174 usb_standard_configuration_descriptor_t descriptor; 175 memcpy(&descriptor,&ohci_rh_conf_descriptor, 176 sizeof(ohci_rh_conf_descriptor)); 177 uint8_t * hub_descriptor; 178 size_t hub_desc_size; 179 usb_create_serialized_hub_descriptor(instance, &hub_descriptor, 180 &hub_desc_size); 181 182 descriptor.total_length = 183 sizeof(usb_standard_configuration_descriptor_t)+ 184 sizeof(usb_standard_endpoint_descriptor_t)+ 185 sizeof(usb_standard_interface_descriptor_t)+ 186 hub_desc_size; 187 188 uint8_t * full_config_descriptor = 189 (uint8_t*) malloc(descriptor.total_length); 190 memcpy(full_config_descriptor, &descriptor, sizeof(descriptor)); 191 memcpy(full_config_descriptor + sizeof(descriptor), 192 &ohci_rh_iface_descriptor, sizeof(ohci_rh_iface_descriptor)); 193 memcpy(full_config_descriptor + sizeof(descriptor) + 194 sizeof(ohci_rh_iface_descriptor), 195 &ohci_rh_ep_descriptor, sizeof(ohci_rh_ep_descriptor)); 196 memcpy(full_config_descriptor + sizeof(descriptor) + 197 sizeof(ohci_rh_iface_descriptor) + 198 sizeof(ohci_rh_ep_descriptor), 199 hub_descriptor, hub_desc_size); 200 201 instance->descriptors.configuration = full_config_descriptor; 202 instance->descriptors.configuration_size = descriptor.total_length; 203 } 204 205 /** Root hub initialization 206 * @return Error code. 207 */ 208 int rh_init(rh_t *instance, ddf_dev_t *dev, ohci_regs_t *regs) 209 { 210 assert(instance); 211 instance->address = -1; 212 instance->registers = regs; 213 instance->device = dev; 214 rh_init_descriptors(instance); 215 216 217 usb_log_info("OHCI root hub with %d ports.\n", regs->rh_desc_a & 0xff); 218 219 //start generic usb hub driver 220 221 /* TODO: implement */ 222 return EOK; 223 } 224 /*----------------------------------------------------------------------------*/ 225 226 /** 227 * create answer to port status_request 228 * 229 * Copy content of corresponding port status register to answer buffer. 230 * 231 * @param instance root hub instance 232 * @param port port number, counted from 1 233 * @param request structure containing both request and response information 234 * @return error code 235 */ 236 static int process_get_port_status_request(rh_t *instance, uint16_t port, 237 usb_transfer_batch_t * request){ 238 if(port<1 || port>instance->port_count) 239 return EINVAL; 240 uint32_t * uint32_buffer = (uint32_t*)request->buffer; 241 request->transfered_size = 4; 242 uint32_buffer[0] = instance->registers->rh_port_status[port -1]; 243 return EOK; 244 } 245 246 /** 247 * create answer to port status_request 248 * 249 * Copy content of hub status register to answer buffer. 250 * 251 * @param instance root hub instance 252 * @param request structure containing both request and response information 253 * @return error code 254 */ 255 static int process_get_hub_status_request(rh_t *instance, 256 usb_transfer_batch_t * request){ 257 uint32_t * uint32_buffer = (uint32_t*)request->buffer; 258 //bits, 0,1,16,17 259 request->transfered_size = 4; 260 uint32_t mask = 1 & (1<<1) & (1<<16) & (1<<17); 261 uint32_buffer[0] = mask & instance->registers->rh_status; 262 return EOK; 263 264 } 265 221 266 222 267 … … 284 329 } 285 330 } 286 287 /** 288 * create standart configuration descriptor for the root hub instance 289 * @param instance root hub instance 290 * @return newly allocated descriptor 291 */ 292 static usb_standard_configuration_descriptor_t * 293 usb_ohci_rh_create_standart_configuration_descriptor(rh_t *instance){ 294 usb_standard_configuration_descriptor_t * descriptor = 295 malloc(sizeof(usb_standard_configuration_descriptor_t)); 296 memcpy(descriptor, &ohci_rh_conf_descriptor, 297 sizeof(usb_standard_configuration_descriptor_t)); 298 /// \TODO should this include device descriptor? 299 const size_t hub_descriptor_size = 7 + 300 2* (instance->port_count / 8 + 301 ((instance->port_count % 8 > 0) ? 1 : 0)); 302 descriptor->total_length = 303 sizeof(usb_standard_configuration_descriptor_t)+ 304 sizeof(usb_standard_endpoint_descriptor_t)+ 305 sizeof(usb_standard_interface_descriptor_t)+ 306 hub_descriptor_size; 307 return descriptor; 308 } 309 331 310 332 /** 311 333 * create answer to a descriptor request … … 344 366 case USB_DESCTYPE_CONFIGURATION: { 345 367 usb_log_debug("USB_DESCTYPE_CONFIGURATION\n"); 346 usb_standard_configuration_descriptor_t * descriptor = 347 usb_ohci_rh_create_standart_configuration_descriptor( 348 instance); 349 result_descriptor = descriptor; 350 size = sizeof(usb_standard_configuration_descriptor_t); 351 del = true; 368 result_descriptor = instance->descriptors.configuration; 369 size = instance->descriptors.configuration_size; 352 370 break; 353 371 } … … 380 398 } 381 399 request->transfered_size = size; 382 memcpy(request->buffer,result_descriptor,size); 400 memcpy(request->transport_buffer,result_descriptor,size); 401 usb_log_debug("sent desctiptor: %s\n", 402 usb_debug_str_buffer((uint8_t*)request->transport_buffer,size,size)); 383 403 if (del) 384 404 free(result_descriptor); -
uspace/drv/ohci/root_hub.h
rd773285 r0053fa38 37 37 38 38 #include <usb/usb.h> 39 #include <usb/devdrv.h> 39 40 40 41 #include "ohci_regs.h" … … 53 54 /** hub port count */ 54 55 int port_count; 56 /** hubs descriptors */ 57 usb_device_descriptors_t descriptors; 55 58 } rh_t; 56 59 -
uspace/drv/pciintel/pci.c
rd773285 r0053fa38 48 48 49 49 #include <ddf/driver.h> 50 #include <ddf/log.h> 50 51 #include <devman.h> 51 52 #include <ipc/devman.h> … … 325 326 326 327 if (match_id_str == NULL) { 327 printf(NAME ": out of memory creating match ID.\n");328 ddf_msg(LVL_ERROR, "Out of memory creating match ID."); 328 329 return; 329 330 } … … 331 332 rc = ddf_fun_add_match_id(fun->fnode, match_id_str, 90); 332 333 if (rc != EOK) { 333 printf(NAME ": error adding match ID: %s\n",334 ddf_msg(LVL_ERROR, "Failed adding match ID: %s", 334 335 str_error(rc)); 335 336 } … … 428 429 429 430 if (range_addr != 0) { 430 printf(NAME ": function %s : ", fun->fnode->name);431 printf("address = %" PRIx64, range_addr);432 printf(", size = %x\n",(unsigned int) range_size);431 ddf_msg(LVL_DEBUG, "Function %s : address = %" PRIx64 432 ", size = %x", fun->fnode->name, range_addr, 433 (unsigned int) range_size); 433 434 } 434 435 … … 455 456 hw_res_list->count++; 456 457 457 printf(NAME ": function %s uses irq %x.\n", fun->fnode->name, irq);458 ddf_msg(LVL_NOTE, "Function %s uses irq %x.", fun->fnode->name, irq); 458 459 } 459 460 … … 511 512 char *fun_name = pci_fun_create_name(fun); 512 513 if (fun_name == NULL) { 513 printf(NAME ": out of memory.\n");514 ddf_msg(LVL_ERROR, "Out of memory."); 514 515 return; 515 516 } … … 517 518 fnode = ddf_fun_create(bus->dnode, fun_inner, fun_name); 518 519 if (fnode == NULL) { 519 printf(NAME ": error creating function.\n");520 ddf_msg(LVL_ERROR, "Failed creating function."); 520 521 return; 521 522 } … … 531 532 fnode->driver_data = fun; 532 533 533 printf(NAME ": adding new function %s.\n",534 ddf_msg(LVL_DEBUG, "Adding new function %s.", 534 535 fnode->name); 535 536 … … 548 549 child_bus = pci_conf_read_8(fun, 549 550 PCI_BRIDGE_SEC_BUS_NUM); 550 printf(NAME ": device is pci-to-pci bridge, " 551 "secondary bus number = %d.\n", bus_num); 551 ddf_msg(LVL_DEBUG, "Device is pci-to-pci " 552 "bridge, secondary bus number = %d.", 553 bus_num); 552 554 if (child_bus > bus_num) 553 555 pci_bus_scan(bus, child_bus); … … 571 573 int rc; 572 574 573 printf(NAME ": pci_add_device\n");575 ddf_msg(LVL_DEBUG, "pci_add_device"); 574 576 dnode->parent_phone = -1; 575 577 576 578 bus = pci_bus_new(); 577 579 if (bus == NULL) { 578 printf(NAME ": pci_add_device allocation failed.\n");580 ddf_msg(LVL_ERROR, "pci_add_device allocation failed."); 579 581 rc = ENOMEM; 580 582 goto fail; … … 586 588 IPC_FLAG_BLOCKING); 587 589 if (dnode->parent_phone < 0) { 588 printf(NAME ":pci_add_device failed to connect to the "589 "parent's driver. \n");590 ddf_msg(LVL_ERROR, "pci_add_device failed to connect to the " 591 "parent's driver."); 590 592 rc = dnode->parent_phone; 591 593 goto fail; … … 596 598 rc = hw_res_get_resource_list(dnode->parent_phone, &hw_resources); 597 599 if (rc != EOK) { 598 printf(NAME ": pci_add_device failed to get hw resources for"599 " the device.\n");600 ddf_msg(LVL_ERROR, "pci_add_device failed to get hw resources " 601 "for the device."); 600 602 goto fail; 601 603 } 602 604 got_res = true; 603 605 604 printf(NAME ": conf_addr = %" PRIx64 ".\n",606 ddf_msg(LVL_DEBUG, "conf_addr = %" PRIx64 ".", 605 607 hw_resources.resources[0].res.io_range.address); 606 608 … … 614 616 if (pio_enable((void *)(uintptr_t)bus->conf_io_addr, 8, 615 617 &bus->conf_addr_port)) { 616 printf(NAME ": failed to enable configuration ports.\n");618 ddf_msg(LVL_ERROR, "Failed to enable configuration ports."); 617 619 rc = EADDRNOTAVAIL; 618 620 goto fail; … … 621 623 622 624 /* Make the bus device more visible. It has no use yet. */ 623 printf(NAME ": adding a 'ctl' function\n");625 ddf_msg(LVL_DEBUG, "Adding a 'ctl' function"); 624 626 625 627 ctl = ddf_fun_create(bus->dnode, fun_exposed, "ctl"); 626 628 if (ctl == NULL) { 627 printf(NAME ": error creating control function.\n");629 ddf_msg(LVL_ERROR, "Failed creating control function."); 628 630 rc = ENOMEM; 629 631 goto fail; … … 632 634 rc = ddf_fun_bind(ctl); 633 635 if (rc != EOK) { 634 printf(NAME ": error binding control function.\n");636 ddf_msg(LVL_ERROR, "Failed binding control function."); 635 637 goto fail; 636 638 } 637 639 638 640 /* Enumerate functions. */ 639 printf(NAME ": scanning the bus\n");641 ddf_msg(LVL_DEBUG, "Scanning the bus"); 640 642 pci_bus_scan(bus, 0); 641 643 … … 659 661 static void pciintel_init(void) 660 662 { 663 ddf_log_init(NAME, LVL_ERROR); 661 664 pci_fun_ops.interfaces[HW_RES_DEV_IFACE] = &pciintel_hw_res_ops; 662 665 pci_fun_ops.interfaces[PCI_DEV_IFACE] = &pci_dev_ops; … … 738 741 int main(int argc, char *argv[]) 739 742 { 740 printf(NAME ": HelenOS pci bus driver (intel method 1).\n");743 printf(NAME ": HelenOS PCI bus driver (Intel method 1).\n"); 741 744 pciintel_init(); 742 745 return ddf_driver_main(&pci_driver); -
uspace/drv/root/root.c
rd773285 r0053fa38 52 52 53 53 #include <ddf/driver.h> 54 #include <ddf/log.h> 54 55 #include <devman.h> 55 56 #include <ipc/devman.h> … … 89 90 int rc; 90 91 91 printf(NAME ": adding new function for virtual devices.\n");92 printf(NAME ": function node is `%s' (%d %s)\n", name,92 ddf_msg(LVL_DEBUG, "Adding new function for virtual devices. " 93 "Function node is `%s' (%d %s)", name, 93 94 VIRTUAL_FUN_MATCH_SCORE, VIRTUAL_FUN_MATCH_ID); 94 95 95 96 fun = ddf_fun_create(dev, fun_inner, name); 96 97 if (fun == NULL) { 97 printf(NAME ": error creating function %s\n", name);98 ddf_msg(LVL_ERROR, "Failed creating function %s", name); 98 99 return ENOMEM; 99 100 } … … 102 103 VIRTUAL_FUN_MATCH_SCORE); 103 104 if (rc != EOK) { 104 printf(NAME ": error adding match IDs to function %s\n", name); 105 ddf_msg(LVL_ERROR, "Failed adding match IDs to function %s", 106 name); 105 107 ddf_fun_destroy(fun); 106 108 return rc; … … 109 111 rc = ddf_fun_bind(fun); 110 112 if (rc != EOK) { 111 printf(NAME ": error binding function %s: %s\n", name,113 ddf_msg(LVL_ERROR, "Failed binding function %s: %s", name, 112 114 str_error(rc)); 113 115 ddf_fun_destroy(fun); … … 136 138 platform = sysinfo_get_data("platform", &platform_size); 137 139 if (platform == NULL) { 138 printf(NAME ": Failed to obtain platform name.\n");140 ddf_msg(LVL_ERROR, "Failed to obtain platform name."); 139 141 return ENOENT; 140 142 } … … 143 145 platform = realloc(platform, platform_size + 1); 144 146 if (platform == NULL) { 145 printf(NAME ": Memory allocation failed.\n");147 ddf_msg(LVL_ERROR, "Memory allocation failed."); 146 148 return ENOMEM; 147 149 } … … 151 153 /* Construct match ID. */ 152 154 if (asprintf(&match_id, PLATFORM_FUN_MATCH_ID_FMT, platform) == -1) { 153 printf(NAME ": Memory allocation failed.\n");155 ddf_msg(LVL_ERROR, "Memory allocation failed."); 154 156 return ENOMEM; 155 157 } 156 158 157 159 /* Add function. */ 158 printf(NAME ": adding platform function\n");159 printf(NAME ": function node is `%s' (%d %s)\n", PLATFORM_FUN_NAME,160 PLATFORM_FUN_MATCH_SCORE,match_id);160 ddf_msg(LVL_DEBUG, "Adding platform function. Function node is `%s' " 161 " (%d %s)", PLATFORM_FUN_NAME, PLATFORM_FUN_MATCH_SCORE, 162 match_id); 161 163 162 164 fun = ddf_fun_create(dev, fun_inner, name); 163 165 if (fun == NULL) { 164 printf(NAME ": error creating function %s\n", name);166 ddf_msg(LVL_ERROR, "Error creating function %s", name); 165 167 return ENOMEM; 166 168 } … … 168 170 rc = ddf_fun_add_match_id(fun, match_id, PLATFORM_FUN_MATCH_SCORE); 169 171 if (rc != EOK) { 170 printf(NAME ": error adding match IDs to function %s\n", name); 172 ddf_msg(LVL_ERROR, "Failed adding match IDs to function %s", 173 name); 171 174 ddf_fun_destroy(fun); 172 175 return rc; … … 175 178 rc = ddf_fun_bind(fun); 176 179 if (rc != EOK) { 177 printf(NAME ": error binding function %s: %s\n", name,180 ddf_msg(LVL_ERROR, "Failed binding function %s: %s", name, 178 181 str_error(rc)); 179 182 ddf_fun_destroy(fun); … … 191 194 static int root_add_device(ddf_dev_t *dev) 192 195 { 193 printf(NAME ": root_add_device, device handle=%" PRIun "\n",196 ddf_msg(LVL_DEBUG, "root_add_device, device handle=%" PRIun, 194 197 dev->handle); 195 198 … … 204 207 int res = add_platform_fun(dev); 205 208 if (EOK != res) 206 printf(NAME ": failed to add child device for platform.\n");209 ddf_msg(LVL_ERROR, "Failed adding child device for platform."); 207 210 208 211 return res; … … 212 215 { 213 216 printf(NAME ": HelenOS root device driver\n"); 217 218 ddf_log_init(NAME, LVL_ERROR); 214 219 return ddf_driver_main(&root_driver); 215 220 } -
uspace/drv/rootpc/rootpc.c
rd773285 r0053fa38 47 47 48 48 #include <ddf/driver.h> 49 #include <ddf/log.h> 49 50 #include <devman.h> 50 51 #include <ipc/devman.h> … … 119 120 rootpc_fun_t *fun) 120 121 { 121 printf(NAME ": adding new function '%s'.\n", name);122 ddf_msg(LVL_DEBUG, "Adding new function '%s'.", name); 122 123 123 124 ddf_fun_t *fnode = NULL; … … 145 146 /* Register function. */ 146 147 if (ddf_fun_bind(fnode) != EOK) { 147 printf(NAME ": error binding function %s.\n", name);148 ddf_msg(LVL_ERROR, "Failed binding function %s.", name); 148 149 goto failure; 149 150 } … … 158 159 ddf_fun_destroy(fnode); 159 160 160 printf(NAME ": failed to add function '%s'.\n", name);161 ddf_msg(LVL_ERROR, "Failed adding function '%s'.", name); 161 162 162 163 return false; … … 176 177 static int rootpc_add_device(ddf_dev_t *dev) 177 178 { 178 printf(NAME ": rootpc_add_device, device handle = %d\n",179 ddf_msg(LVL_DEBUG, "rootpc_add_device, device handle = %d", 179 180 (int)dev->handle); 180 181 181 182 /* Register functions. */ 182 183 if (!rootpc_add_functions(dev)) { 183 printf(NAME ": failed to add functions for PC platform.\n");184 ddf_msg(LVL_ERROR, "Failed to add functions for PC platform."); 184 185 } 185 186 … … 189 190 static void root_pc_init(void) 190 191 { 192 ddf_log_init(NAME, LVL_ERROR); 191 193 rootpc_fun_ops.interfaces[HW_RES_DEV_IFACE] = &fun_hw_res_ops; 192 194 } -
uspace/drv/rootvirt/rootvirt.c
rd773285 r0053fa38 40 40 #include <str_error.h> 41 41 #include <ddf/driver.h> 42 #include <ddf/log.h> 42 43 43 44 #define NAME "rootvirt" … … 83 84 int rc; 84 85 85 printf(NAME ": registering function `%s' (match \"%s\")\n",86 ddf_msg(LVL_DEBUG, "Registering function `%s' (match \"%s\")", 86 87 vfun->name, vfun->match_id); 87 88 88 89 fun = ddf_fun_create(vdev, fun_inner, vfun->name); 89 90 if (fun == NULL) { 90 printf(NAME ": error creating function %s\n", vfun->name);91 ddf_msg(LVL_ERROR, "Failed creating function %s", vfun->name); 91 92 return ENOMEM; 92 93 } … … 94 95 rc = ddf_fun_add_match_id(fun, vfun->match_id, 10); 95 96 if (rc != EOK) { 96 printf(NAME ": error adding match IDs to function %s\n",97 ddf_msg(LVL_ERROR, "Failed adding match IDs to function %s", 97 98 vfun->name); 98 99 ddf_fun_destroy(fun); … … 102 103 rc = ddf_fun_bind(fun); 103 104 if (rc != EOK) { 104 printf(NAME ": error binding function %s: %s\n", vfun->name,105 str_error(rc));105 ddf_msg(LVL_ERROR, "Failed binding function %s: %s", 106 vfun->name, str_error(rc)); 106 107 ddf_fun_destroy(fun); 107 108 return rc; 108 109 } 109 110 110 printf(NAME ": registered child device `%s'\n", vfun->name);111 ddf_msg(LVL_NOTE, "Registered child device `%s'", vfun->name); 111 112 return EOK; 112 113 } … … 124 125 } 125 126 126 printf(NAME ": add_device(handle=%d)\n", (int)dev->handle);127 ddf_msg(LVL_DEBUG, "add_device(handle=%d)", (int)dev->handle); 127 128 128 129 /* … … 142 143 { 143 144 printf(NAME ": HelenOS virtual devices root driver\n"); 145 146 ddf_log_init(NAME, LVL_ERROR); 144 147 return ddf_driver_main(&rootvirt_driver); 145 148 } -
uspace/drv/test1/test1.c
rd773285 r0053fa38 35 35 #include <str_error.h> 36 36 #include <ddf/driver.h> 37 #include <ddf/log.h> 37 38 38 39 #include "test1.h" … … 58 59 */ 59 60 static int register_fun_verbose(ddf_dev_t *parent, const char *message, 60 const char *name, const char *match_id, int match_score) 61 const char *name, const char *match_id, int match_score, 62 int expected_rc) 61 63 { 62 ddf_fun_t *fun ;64 ddf_fun_t *fun = NULL; 63 65 int rc; 64 66 65 printf(NAME ": registering function `%s': %s.\n", name, message);67 ddf_msg(LVL_DEBUG, "Registering function `%s': %s.", name, message); 66 68 67 69 fun = ddf_fun_create(parent, fun_inner, name); 68 70 if (fun == NULL) { 69 printf(NAME ": error creating function %s\n", name); 70 return ENOMEM; 71 ddf_msg(LVL_ERROR, "Failed creating function %s", name); 72 rc = ENOMEM; 73 goto leave; 71 74 } 72 75 73 rc = ddf_fun_add_match_id(fun, match_id, match_score);76 rc = ddf_fun_add_match_id(fun, str_dup(match_id), match_score); 74 77 if (rc != EOK) { 75 printf(NAME ": error adding match IDs to function %s\n", name);76 ddf_fun_destroy(fun);77 return rc;78 ddf_msg(LVL_ERROR, "Failed adding match IDs to function %s", 79 name); 80 goto leave; 78 81 } 79 82 80 83 rc = ddf_fun_bind(fun); 81 84 if (rc != EOK) { 82 printf(NAME ": error binding function %s: %s\n", name,85 ddf_msg(LVL_ERROR, "Failed binding function %s: %s", name, 83 86 str_error(rc)); 84 ddf_fun_destroy(fun); 85 return rc; 87 goto leave; 86 88 } 87 89 88 printf(NAME ": registered child device `%s'\n", name); 89 return EOK; 90 ddf_msg(LVL_NOTE, "Registered child device `%s'", name); 91 rc = EOK; 92 93 leave: 94 if (rc != expected_rc) { 95 fprintf(stderr, 96 NAME ": Unexpected error registering function `%s'.\n" 97 NAME ": Expected \"%s\" but got \"%s\".\n", 98 name, str_error(expected_rc), str_error(rc)); 99 } 100 101 if ((rc != EOK) && (fun != NULL)) { 102 ddf_fun_destroy(fun); 103 } 104 105 return rc; 90 106 } 91 107 … … 112 128 int rc; 113 129 114 printf(NAME ": add_device(name=\"%s\", handle=%d)\n",130 ddf_msg(LVL_DEBUG, "add_device(name=\"%s\", handle=%d)", 115 131 dev->name, (int) dev->handle); 116 132 117 133 fun_a = ddf_fun_create(dev, fun_exposed, "a"); 118 134 if (fun_a == NULL) { 119 printf(NAME ": error creating function 'a'.\n");135 ddf_msg(LVL_ERROR, "Failed creating function 'a'."); 120 136 return ENOMEM; 121 137 } … … 123 139 rc = ddf_fun_bind(fun_a); 124 140 if (rc != EOK) { 125 printf(NAME ": error binding function 'a'.\n");141 ddf_msg(LVL_ERROR, "Failed binding function 'a'."); 126 142 return rc; 127 143 } … … 133 149 ddf_fun_add_to_class(fun_a, "virt-null"); 134 150 } else if (str_cmp(dev->name, "test1") == 0) { 135 (void) register_fun_verbose(dev, "cloning myself ;-)", "clone", 136 "virtual&test1", 10); 151 (void) register_fun_verbose(dev, 152 "cloning myself ;-)", "clone", 153 "virtual&test1", 10, EOK); 154 (void) register_fun_verbose(dev, 155 "cloning myself twice ;-)", "clone", 156 "virtual&test1", 10, EEXISTS); 137 157 } else if (str_cmp(dev->name, "clone") == 0) { 138 (void) register_fun_verbose(dev, "run by the same task", "child", 139 "virtual&test1&child", 10); 158 (void) register_fun_verbose(dev, 159 "run by the same task", "child", 160 "virtual&test1&child", 10, EOK); 140 161 } 141 162 142 printf(NAME ": device `%s' accepted.\n", dev->name);163 ddf_msg(LVL_DEBUG, "Device `%s' accepted.", dev->name); 143 164 144 165 return EOK; … … 148 169 { 149 170 printf(NAME ": HelenOS test1 virtual device driver\n"); 171 ddf_log_init(NAME, LVL_ERROR); 150 172 return ddf_driver_main(&test1_driver); 151 173 } -
uspace/drv/test2/test2.c
rd773285 r0053fa38 36 36 #include <str_error.h> 37 37 #include <ddf/driver.h> 38 #include <ddf/log.h> 38 39 39 40 #define NAME "test2" … … 64 65 int rc; 65 66 66 printf(NAME ": registering function `%s': %s.\n", name, message);67 ddf_msg(LVL_DEBUG, "Registering function `%s': %s.", name, message); 67 68 68 69 fun = ddf_fun_create(parent, fun_inner, name); 69 70 if (fun == NULL) { 70 printf(NAME ": error creating function %s\n", name);71 ddf_msg(LVL_ERROR, "Failed creating function %s", name); 71 72 return ENOMEM; 72 73 } … … 74 75 rc = ddf_fun_add_match_id(fun, match_id, match_score); 75 76 if (rc != EOK) { 76 printf(NAME ": error adding match IDs to function %s\n", name); 77 ddf_msg(LVL_ERROR, "Failed adding match IDs to function %s", 78 name); 77 79 ddf_fun_destroy(fun); 78 80 return rc; … … 81 83 rc = ddf_fun_bind(fun); 82 84 if (rc != EOK) { 83 printf(NAME ": error binding function %s: %s\n", name,85 ddf_msg(LVL_ERROR, "Failed binding function %s: %s", name, 84 86 str_error(rc)); 85 87 ddf_fun_destroy(fun); … … 87 89 } 88 90 89 printf(NAME ": registered child device `%s'\n", name);91 ddf_msg(LVL_NOTE, "Registered child device `%s'", name); 90 92 return EOK; 91 93 } … … 111 113 fun_a = ddf_fun_create(dev, fun_exposed, "a"); 112 114 if (fun_a == NULL) { 113 printf(NAME ": error creating function 'a'.\n");115 ddf_msg(LVL_ERROR, "Failed creating function 'a'."); 114 116 return ENOMEM; 115 117 } … … 117 119 rc = ddf_fun_bind(fun_a); 118 120 if (rc != EOK) { 119 printf(NAME ": error binding function 'a'.\n");121 ddf_msg(LVL_ERROR, "Failed binding function 'a'."); 120 122 return rc; 121 123 } … … 128 130 static int test2_add_device(ddf_dev_t *dev) 129 131 { 130 printf(NAME ": test2_add_device(name=\"%s\", handle=%d)\n",132 ddf_msg(LVL_DEBUG, "test2_add_device(name=\"%s\", handle=%d)", 131 133 dev->name, (int) dev->handle); 132 134 … … 134 136 fid_t postpone = fibril_create(postponed_birth, dev); 135 137 if (postpone == 0) { 136 printf(NAME ": fibril_create() error\n");138 ddf_msg(LVL_ERROR, "fibril_create() failed."); 137 139 return ENOMEM; 138 140 } … … 149 151 { 150 152 printf(NAME ": HelenOS test2 virtual device driver\n"); 153 ddf_log_init(NAME, LVL_ERROR); 151 154 return ddf_driver_main(&test2_driver); 152 155 } -
uspace/drv/usbhub/usbhub.c
rd773285 r0053fa38 74 74 75 75 while(errorCode == EOK){ 76 async_usleep(1000 * 1000 * 10 );/// \TODO proper number once 76 77 errorCode = usb_hub_check_hub_changes(hub_info); 77 async_usleep(1000 * 1000 );/// \TODO proper number once78 78 } 79 79 usb_log_error("something in ctrl loop went wrong, errno %d\n",errorCode); -
uspace/drv/usbkbd/kbddev.c
rd773285 r0053fa38 56 56 #include <usb/classes/hidreq.h> 57 57 #include <usb/classes/hidreport.h> 58 #include <usb/classes/hid/utled.h> 58 59 59 60 #include <usb/devdrv.h> … … 69 70 static const unsigned DEFAULT_ACTIVE_MODS = KM_NUM_LOCK; 70 71 71 /** Boot protocol report size (key part). */ 72 static const size_t BOOTP_REPORT_SIZE = 6; 73 74 /** Boot protocol total report size. */ 75 static const size_t BOOTP_BUFFER_SIZE = 8; 76 77 /** Boot protocol output report size. */ 78 static const size_t BOOTP_BUFFER_OUT_SIZE = 1; 79 80 /** Boot protocol error key code. */ 81 static const uint8_t BOOTP_ERROR_ROLLOVER = 1; 72 ///** Boot protocol report size (key part). */ 73 //static const size_t BOOTP_REPORT_SIZE = 6; 74 75 ///** Boot protocol total report size. */ 76 //static const size_t BOOTP_BUFFER_SIZE = 8; 77 78 ///** Boot protocol output report size. */ 79 //static const size_t BOOTP_BUFFER_OUT_SIZE = 1; 80 81 ///** Boot protocol error key code. */ 82 //static const uint8_t BOOTP_ERROR_ROLLOVER = 1; 83 static const uint8_t ERROR_ROLLOVER = 1; 82 84 83 85 /** Default idle rate for keyboards. */ … … 263 265 static void usb_kbd_set_led(usb_kbd_t *kbd_dev) 264 266 { 265 u int8_t buffer[BOOTP_BUFFER_OUT_SIZE];266 int rc= 0;267 268 memset( buffer, 0, BOOTP_BUFFER_OUT_SIZE);269 uint8_t leds = 0;270 271 if (kbd_dev->mods & KM_NUM_LOCK) {272 leds |= USB_HID_LED_NUM_LOCK;273 }274 275 if (kbd_dev->mods & KM_CAPS_LOCK) {276 leds |= USB_HID_LED_CAPS_LOCK;277 }278 279 if (kbd_dev->mods & KM_SCROLL_LOCK) {280 leds |= USB_HID_LED_SCROLL_LOCK;267 unsigned i = 0; 268 269 /* Reset the LED data. */ 270 memset(kbd_dev->led_data, 0, kbd_dev->led_output_size * sizeof(int32_t)); 271 272 if ((kbd_dev->mods & KM_NUM_LOCK) && (i < kbd_dev->led_output_size)) { 273 kbd_dev->led_data[i++] = USB_HID_LED_NUM_LOCK; 274 } 275 276 if ((kbd_dev->mods & KM_CAPS_LOCK) && (i < kbd_dev->led_output_size)) { 277 kbd_dev->led_data[i++] = USB_HID_LED_CAPS_LOCK; 278 } 279 280 if ((kbd_dev->mods & KM_SCROLL_LOCK) 281 && (i < kbd_dev->led_output_size)) { 282 kbd_dev->led_data[i++] = USB_HID_LED_SCROLL_LOCK; 281 283 } 282 284 … … 284 286 285 287 usb_log_debug("Creating output report.\n"); 286 usb_log_debug("Leds: 0x%x\n", leds); 287 if ((rc = usb_hid_boot_keyboard_output_report( 288 leds, buffer, BOOTP_BUFFER_OUT_SIZE)) != EOK) { 289 usb_log_warning("Error composing output report to the keyboard:" 290 "%s.\n", str_error(rc)); 288 289 int rc = usb_hid_report_output_translate(kbd_dev->parser, 290 kbd_dev->led_path, USB_HID_PATH_COMPARE_END, kbd_dev->output_buffer, 291 kbd_dev->output_size, kbd_dev->led_data, kbd_dev->led_output_size); 292 293 if (rc != EOK) { 294 usb_log_warning("Error translating LED output to output report" 295 ".\n"); 291 296 return; 292 297 } 293 298 294 299 usb_log_debug("Output report buffer: %s\n", 295 usb_debug_str_buffer(buffer, BOOTP_BUFFER_OUT_SIZE, 0)); 296 297 assert(kbd_dev->usb_dev != NULL); 300 usb_debug_str_buffer(kbd_dev->output_buffer, kbd_dev->output_size, 301 0)); 298 302 299 303 usbhid_req_set_report(&kbd_dev->usb_dev->ctrl_pipe, 300 304 kbd_dev->usb_dev->interface_no, USB_HID_REPORT_TYPE_OUTPUT, 301 buffer, BOOTP_BUFFER_OUT_SIZE);305 kbd_dev->output_buffer, kbd_dev->output_size); 302 306 } 303 307 … … 450 454 * First of all, check if the kbd have reported phantom state. 451 455 * 452 * this must be changed as we don't know which keys are modifiers 453 * and which are regular keys. 456 * As there is no way to distinguish keys from modifiers, we do not have 457 * a way to check that 'all keys report Error Rollover'. We thus check 458 * if there is at least one such error and in such case we ignore the 459 * whole input report. 454 460 */ 455 461 i = 0; 456 // all fields should report Error Rollover 457 while (i < count && 458 key_codes[i] == BOOTP_ERROR_ROLLOVER) { 462 while (i < count && key_codes[i] != ERROR_ROLLOVER) { 459 463 ++i; 460 464 } 461 if (i == count) {465 if (i != count) { 462 466 usb_log_debug("Phantom state occured.\n"); 463 467 // phantom state, do nothing … … 586 590 */ 587 591 static void usb_kbd_process_data(usb_kbd_t *kbd_dev, 588 592 uint8_t *buffer, size_t actual_size) 589 593 { 590 594 assert(kbd_dev->initialized == USB_KBD_STATUS_INITIALIZED); … … 760 764 usb_log_debug("Size of the input report: %zu\n", kbd_dev->key_count); 761 765 762 kbd_dev->keys = (uint8_t *)calloc( 763 kbd_dev->key_count, sizeof(uint8_t)); 766 kbd_dev->keys = (uint8_t *)calloc(kbd_dev->key_count, sizeof(uint8_t)); 764 767 765 768 if (kbd_dev->keys == NULL) { … … 768 771 } 769 772 773 /* 774 * Output report 775 */ 776 kbd_dev->output_size = 0; 777 kbd_dev->output_buffer = usb_hid_report_output(kbd_dev->parser, 778 &kbd_dev->output_size); 779 if (kbd_dev->output_buffer == NULL) { 780 usb_log_warning("Error creating output report buffer.\n"); 781 free(kbd_dev->keys); 782 return ENOMEM; /* TODO: other error code */ 783 } 784 785 usb_log_debug("Output buffer size: %zu\n", kbd_dev->output_size); 786 787 kbd_dev->led_path = usb_hid_report_path(); 788 usb_hid_report_path_append_item( 789 kbd_dev->led_path, USB_HIDUT_PAGE_LED, 0); 790 791 kbd_dev->led_output_size = usb_hid_report_output_size(kbd_dev->parser, 792 kbd_dev->led_path, USB_HID_PATH_COMPARE_END); 793 794 usb_log_debug("Output report size (in items): %zu\n", 795 kbd_dev->led_output_size); 796 797 kbd_dev->led_data = (int32_t *)calloc( 798 kbd_dev->led_output_size, sizeof(int32_t)); 799 800 if (kbd_dev->led_data == NULL) { 801 usb_log_warning("Error creating buffer for LED output report." 802 "\n"); 803 free(kbd_dev->keys); 804 usb_hid_report_output_free(kbd_dev->output_buffer); 805 return ENOMEM; 806 } 807 808 /* 809 * Modifiers and locks 810 */ 770 811 kbd_dev->modifiers = 0; 771 812 kbd_dev->mods = DEFAULT_ACTIVE_MODS; 772 813 kbd_dev->lock_keys = 0; 773 814 815 /* 816 * Autorepeat 817 */ 774 818 kbd_dev->repeat.key_new = 0; 775 819 kbd_dev->repeat.key_repeated = 0; … … 879 923 } 880 924 925 // free the output buffer 926 usb_hid_report_output_free((*kbd_dev)->output_buffer); 927 881 928 /* TODO: what about the USB device structure?? */ 882 929 -
uspace/drv/usbkbd/kbddev.h
rd773285 r0053fa38 94 94 /** Report descriptor size. */ 95 95 size_t report_desc_size; 96 97 uint8_t *output_buffer; 98 99 size_t output_size; 100 101 size_t led_output_size; 102 103 usb_hid_report_path_t *led_path; 104 105 int32_t *led_data; 96 106 97 107 /** HID Report parser. */ -
uspace/lib/c/Makefile
rd773285 r0053fa38 77 77 generic/io/io.c \ 78 78 generic/io/printf.c \ 79 generic/io/log.c \ 79 80 generic/io/klog.c \ 80 81 generic/io/snprintf.c \ -
uspace/lib/c/generic/devman.c
rd773285 r0053fa38 147 147 ret = devman_send_match_id(phone, match_id); 148 148 if (ret != EOK) { 149 printf("Driver failed to send match id, error %d\n",150 ret);151 149 return ret; 152 150 } … … 195 193 } 196 194 197 devman_send_match_ids(phone, match_ids); 198 199 async_wait_for(req, &retval); 200 201 async_serialize_end(); 202 195 int match_ids_rc = devman_send_match_ids(phone, match_ids); 196 197 async_wait_for(req, &retval); 198 199 async_serialize_end(); 200 201 /* Prefer the answer to DEVMAN_ADD_FUNCTION in case of errors. */ 202 if ((match_ids_rc != EOK) && (retval == EOK)) { 203 retval = match_ids_rc; 204 } 205 203 206 if (retval == EOK) 204 207 fun_handle = (int) IPC_GET_ARG1(answer); … … 326 329 } 327 330 331 int devman_device_get_handle_by_class(const char *classname, 332 const char *devname, devman_handle_t *handle, unsigned int flags) 333 { 334 int phone = devman_get_phone(DEVMAN_CLIENT, flags); 335 336 if (phone < 0) 337 return phone; 338 339 async_serialize_start(); 340 341 ipc_call_t answer; 342 aid_t req = async_send_1(phone, DEVMAN_DEVICE_GET_HANDLE_BY_CLASS, 343 flags, &answer); 344 345 sysarg_t retval = async_data_write_start(phone, classname, 346 str_size(classname)); 347 if (retval != EOK) { 348 async_wait_for(req, NULL); 349 async_serialize_end(); 350 return retval; 351 } 352 retval = async_data_write_start(phone, devname, 353 str_size(devname)); 354 if (retval != EOK) { 355 async_wait_for(req, NULL); 356 async_serialize_end(); 357 return retval; 358 } 359 360 async_wait_for(req, &retval); 361 362 async_serialize_end(); 363 364 if (retval != EOK) { 365 if (handle != NULL) 366 *handle = (devman_handle_t) -1; 367 return retval; 368 } 369 370 if (handle != NULL) 371 *handle = (devman_handle_t) IPC_GET_ARG1(answer); 372 373 return retval; 374 } 375 328 376 329 377 /** @} -
uspace/lib/c/include/devman.h
rd773285 r0053fa38 53 53 extern int devman_device_get_handle(const char *, devman_handle_t *, 54 54 unsigned int); 55 extern int devman_device_get_handle_by_class(const char *, const char *, 56 devman_handle_t *, unsigned int); 55 57 56 58 extern int devman_add_device_to_class(devman_handle_t, const char *); -
uspace/lib/c/include/ipc/devman.h
rd773285 r0053fa38 148 148 149 149 typedef enum { 150 DEVMAN_DEVICE_GET_HANDLE = IPC_FIRST_USER_METHOD 150 DEVMAN_DEVICE_GET_HANDLE = IPC_FIRST_USER_METHOD, 151 DEVMAN_DEVICE_GET_HANDLE_BY_CLASS 151 152 } client_to_devman_t; 152 153 -
uspace/lib/drv/Makefile
rd773285 r0053fa38 36 36 generic/dev_iface.c \ 37 37 generic/remote_char_dev.c \ 38 generic/log.c \ 38 39 generic/remote_hw_res.c \ 39 40 generic/remote_usb.c \ -
uspace/lib/drv/generic/driver.c
rd773285 r0053fa38 273 273 274 274 res = driver->driver_ops->add_device(dev); 275 if (res == EOK) { 276 printf("%s: new device with handle=%" PRIun " was added.\n", 277 driver->name, dev_handle); 278 } else { 279 printf("%s: failed to add a new device with handle = %" PRIun ".\n", 280 driver->name, dev_handle); 275 if (res != EOK) 281 276 delete_device(dev); 282 }283 277 284 278 async_answer_0(iid, res); -
uspace/lib/usb/include/usb/classes/hidparser.h
rd773285 r0053fa38 31 31 */ 32 32 /** @file 33 * @brief USB HID parser.33 * USB HID report descriptor and report data parser 34 34 */ 35 35 #ifndef LIBUSB_HIDPARSER_H_ … … 74 74 #define USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY 4 75 75 76 /** */ 76 77 typedef struct { 78 /** */ 77 79 int32_t usage_page; 80 /** */ 78 81 int32_t usage; 79 82 /** */ 80 83 link_t link; 81 84 } usb_hid_report_usage_path_t; 82 85 86 /** */ 83 87 typedef struct { 88 /** */ 84 89 int depth; 90 91 /** */ 85 92 link_t link; 86 93 } usb_hid_report_path_t; … … 90 97 */ 91 98 typedef struct { 99 /** */ 92 100 int32_t id; 101 /** */ 93 102 int32_t usage_minimum; 103 /** */ 94 104 int32_t usage_maximum; 105 /** */ 95 106 int32_t logical_minimum; 107 /** */ 96 108 int32_t logical_maximum; 109 /** */ 97 110 int32_t size; 111 /** */ 98 112 int32_t count; 113 /** */ 99 114 size_t offset; 115 /** */ 100 116 int32_t delimiter; 101 117 /** */ 102 118 int32_t unit_exponent; 119 /** */ 103 120 int32_t unit; 104 121 105 /* 106 * some not yet used fields 107 */ 122 /** */ 108 123 int32_t string_index; 124 /** */ 109 125 int32_t string_minimum; 126 /** */ 110 127 int32_t string_maximum; 128 /** */ 111 129 int32_t designator_index; 130 /** */ 112 131 int32_t designator_minimum; 132 /** */ 113 133 int32_t designator_maximum; 134 /** */ 114 135 int32_t physical_minimum; 136 /** */ 115 137 int32_t physical_maximum; 116 138 139 /** */ 117 140 uint8_t item_flags; 118 141 142 /** */ 119 143 usb_hid_report_path_t *usage_path; 144 /** */ 120 145 link_t link; 121 146 } usb_hid_report_item_t; … … 124 149 /** HID report parser structure. */ 125 150 typedef struct { 151 /** */ 126 152 link_t input; 153 /** */ 127 154 link_t output; 155 /** */ 128 156 link_t feature; 129 157 } usb_hid_report_parser_t; … … 154 182 } usb_hid_modifiers_t; 155 183 156 typedef enum {157 USB_HID_LED_NUM_LOCK = 0x1,158 USB_HID_LED_CAPS_LOCK = 0x2,159 USB_HID_LED_SCROLL_LOCK = 0x4,160 USB_HID_LED_COMPOSE = 0x8,161 USB_HID_LED_KANA = 0x10,162 USB_HID_LED_COUNT = 5163 } usb_hid_led_t;184 //typedef enum { 185 // USB_HID_LED_NUM_LOCK = 0x1, 186 // USB_HID_LED_CAPS_LOCK = 0x2, 187 // USB_HID_LED_SCROLL_LOCK = 0x4, 188 // USB_HID_LED_COMPOSE = 0x8, 189 // USB_HID_LED_KANA = 0x10, 190 // USB_HID_LED_COUNT = 5 191 //} usb_hid_led_t; 164 192 165 193 static const usb_hid_modifiers_t … … 190 218 191 219 /* 192 * modifiers definitions 193 */ 194 220 * Descriptor parser functions 221 */ 222 /** */ 223 int usb_hid_parser_init(usb_hid_report_parser_t *parser); 224 225 /** */ 226 int usb_hid_parse_report_descriptor(usb_hid_report_parser_t *parser, 227 const uint8_t *data, size_t size); 228 229 /** */ 230 void usb_hid_free_report_parser(usb_hid_report_parser_t *parser); 231 232 /** */ 233 void usb_hid_descriptor_print(usb_hid_report_parser_t *parser); 234 235 /* 236 * Boot protocol functions 237 */ 238 /** */ 195 239 int usb_hid_boot_keyboard_input_report(const uint8_t *data, size_t size, 196 240 const usb_hid_report_in_callbacks_t *callbacks, void *arg); 197 241 242 /** */ 198 243 int usb_hid_boot_keyboard_output_report(uint8_t leds, uint8_t *data, size_t size); 199 244 200 int usb_hid_parser_init(usb_hid_report_parser_t *parser); 201 int usb_hid_parse_report_descriptor(usb_hid_report_parser_t *parser, 202 const uint8_t *data, size_t size); 203 245 246 /* 247 * Input report parser functions 248 */ 249 /** */ 204 250 int usb_hid_parse_report(const usb_hid_report_parser_t *parser, 205 251 const uint8_t *data, size_t size, … … 207 253 const usb_hid_report_in_callbacks_t *callbacks, void *arg); 208 254 209 int usb_hid_report_input_length(const usb_hid_report_parser_t *parser, 255 /** */ 256 size_t usb_hid_report_input_length(const usb_hid_report_parser_t *parser, 210 257 usb_hid_report_path_t *path, int flags); 211 258 212 259 213 void usb_hid_free_report_parser(usb_hid_report_parser_t *parser); 214 215 void usb_hid_descriptor_print(usb_hid_report_parser_t *parser); 216 217 /* usage path functions*/260 261 /* 262 * usage path functions 263 */ 264 /** */ 218 265 usb_hid_report_path_t *usb_hid_report_path(void); 266 267 /** */ 219 268 void usb_hid_report_path_free(usb_hid_report_path_t *path); 269 270 /** */ 220 271 int usb_hid_report_path_append_item(usb_hid_report_path_t *usage_path, int32_t usage_page, int32_t usage); 272 273 /** */ 221 274 void usb_hid_report_remove_last_item(usb_hid_report_path_t *usage_path); 275 276 /** */ 222 277 void usb_hid_report_null_last_item(usb_hid_report_path_t *usage_path); 278 279 /** */ 223 280 void usb_hid_report_set_last_item(usb_hid_report_path_t *usage_path, int32_t tag, int32_t data); 281 282 /** */ 224 283 int usb_hid_report_compare_usage_path(usb_hid_report_path_t *report_path, usb_hid_report_path_t *path, int flags); 225 int usb_hid_report_path_clone(usb_hid_report_path_t *new_usage_path, usb_hid_report_path_t *usage_path); 226 227 228 // output 229 // - funkce co vrati cesty poli v output reportu 230 // - funkce co pro danou cestu nastavi data 231 // - finalize 232 284 285 /** */ 286 usb_hid_report_path_t *usb_hid_report_path_clone(usb_hid_report_path_t *usage_path); 287 288 289 /* 290 * Output report parser functions 291 */ 292 /** Allocates output report buffer*/ 293 uint8_t *usb_hid_report_output(usb_hid_report_parser_t *parser, size_t *size); 294 295 /** Frees output report buffer*/ 296 void usb_hid_report_output_free(uint8_t *output); 297 298 /** Returns size of output for given usage path */ 299 size_t usb_hid_report_output_size(usb_hid_report_parser_t *parser, 300 usb_hid_report_path_t *path, int flags); 301 302 /** Updates the output report buffer by translated given data */ 303 int usb_hid_report_output_translate(usb_hid_report_parser_t *parser, 304 usb_hid_report_path_t *path, int flags, 305 uint8_t *buffer, size_t size, 306 int32_t *data, size_t data_size); 233 307 #endif 234 308 /** -
uspace/lib/usb/src/devdrv.c
rd773285 r0053fa38 251 251 &dev->descriptors.configuration_size); 252 252 if (rc != EOK) { 253 usb_log_error("Failed retrieving configuration descriptor: %s. \n",253 usb_log_error("Failed retrieving configuration descriptor: %s. %s\n", 254 254 dev->ddf_dev->name, str_error(rc)); 255 255 return rc; -
uspace/lib/usb/src/hidparser.c
rd773285 r0053fa38 31 31 */ 32 32 /** @file 33 * @brief HIDparser implementation.33 * HID report descriptor and report data parser implementation. 34 34 */ 35 35 #include <usb/classes/hidparser.h> … … 40 40 #include <usb/debug.h> 41 41 42 /** */ 42 43 #define USB_HID_NEW_REPORT_ITEM 1 44 45 /** */ 43 46 #define USB_HID_NO_ACTION 2 47 48 /** */ 44 49 #define USB_HID_UNKNOWN_TAG -99 45 50 46 #define BAD_HACK_USAGE_PAGE 0x07 47 51 /* 52 * Private descriptor parser functions 53 */ 48 54 int usb_hid_report_parse_tag(uint8_t tag, uint8_t class, const uint8_t *data, size_t item_size, 49 55 usb_hid_report_item_t *report_item, usb_hid_report_path_t *usage_path); … … 58 64 int usb_hid_report_reset_local_items(); 59 65 void usb_hid_free_report_list(link_t *head); 66 67 /* 68 * Data translation private functions 69 */ 60 70 int32_t usb_hid_report_tag_data_int32(const uint8_t *data, size_t size); 61 71 inline size_t usb_hid_count_item_offset(usb_hid_report_item_t * report_item, size_t offset); 62 72 int usb_hid_translate_data(usb_hid_report_item_t *item, const uint8_t *data, size_t j); 73 int32_t usb_hid_translate_data_reverse(usb_hid_report_item_t *item, int32_t value); 63 74 int usb_pow(int a, int b); 64 75 65 76 // TODO: tohle ma bejt asi jinde 66 77 int usb_pow(int a, int b) 67 78 { … … 80 91 81 92 /** 82 * 93 * Initialize the report descriptor parser structure 94 * 95 * @param parser Report descriptor parser structure 96 * @return Error code 83 97 */ 84 98 int usb_hid_parser_init(usb_hid_report_parser_t *parser) 85 99 { 86 87 return EINVAL;88 89 90 100 if(parser == NULL) { 101 return EINVAL; 102 } 103 104 list_initialize(&(parser->input)); 91 105 list_initialize(&(parser->output)); 92 106 list_initialize(&(parser->feature)); … … 164 178 // store current usage path 165 179 report_item->usage_path = usage_path; 166 167 // new current usage path168 tmp_usage_path = usb_hid_report_path();169 180 170 // c opy oldpath to the new one171 usb_hid_report_path_clone(tmp_usage_path,usage_path);181 // clone path to the new one 182 tmp_usage_path = usb_hid_report_path_clone(usage_path); 172 183 173 184 // swap … … 304 315 305 316 /** 317 * Parse one tag of the report descriptor 306 318 * 307 319 * @param Tag to parse … … 391 403 * @return Error code 392 404 */ 393 394 405 int usb_hid_report_parse_global_tag(uint8_t tag, const uint8_t *data, size_t item_size, 395 406 usb_hid_report_item_t *report_item, usb_hid_report_path_t *usage_path) … … 520 531 * Prints content of given list of report items. 521 532 * 522 * @param List of report items 533 * @param List of report items (usb_hid_report_item_t) 523 534 * @return void 524 535 */ … … 552 563 path = path->next; 553 564 } 554 555 556 // usb_log_debug("\tUSAGE: %X\n", report_item->usage); 557 // usb_log_debug("\tUSAGE PAGE: %X\n", report_item->usage_page); 565 558 566 usb_log_debug("\tLOGMIN: %X\n", report_item->logical_minimum); 559 567 usb_log_debug("\tLOGMAX: %X\n", report_item->logical_maximum); … … 570 578 } 571 579 /** 572 * Prints content of given descriptor in human readable format.573 * 574 * @param Parsed descriptor to print580 * Prints content of given report descriptor in human readable format. 581 * 582 * @param parser Parsed descriptor to print 575 583 * @return void 576 584 */ … … 595 603 * Releases whole linked list of report items 596 604 * 597 * 605 * @param head Head of list of report descriptor items (usb_hid_report_item_t) 606 * @return void 598 607 */ 599 608 void usb_hid_free_report_list(link_t *head) … … 627 636 } 628 637 629 /** Free the HID reportparser structure638 /** Frees the HID report descriptor parser structure 630 639 * 631 640 * @param parser Opaque HID report parser structure 632 * @return Error code641 * @return void 633 642 */ 634 643 void usb_hid_free_report_parser(usb_hid_report_parser_t *parser) … … 660 669 const usb_hid_report_in_callbacks_t *callbacks, void *arg) 661 670 { 662 /*663 *664 * only key codes (usage page 0x07) will be processed665 * other usages will be ignored666 */667 671 link_t *list_item; 668 672 usb_hid_report_item_t *item; … … 676 680 return EINVAL; 677 681 } 678 679 680 // get the size of result keycodes array 682 683 /* get the size of result array */ 681 684 key_count = usb_hid_report_input_length(parser, path, flags); 682 685 … … 685 688 } 686 689 687 / / read data690 /* read data */ 688 691 list_item = parser->input.next; 689 692 while(list_item != &(parser->input)) { … … 719 722 } 720 723 721 724 /** 725 * Translate data from the report as specified in report descriptor 726 * 727 * @param item Report descriptor item with definition of translation 728 * @param data Data to translate 729 * @param j Index of processed field in report descriptor item 730 * @return Translated data 731 */ 722 732 int usb_hid_translate_data(usb_hid_report_item_t *item, const uint8_t *data, size_t j) 723 733 { … … 796 806 } 797 807 798 int usb_hid_report_input_length(const usb_hid_report_parser_t *parser, 808 /** 809 * 810 * 811 * @param parser 812 * @param path 813 * @param flags 814 * @return 815 */ 816 size_t usb_hid_report_input_length(const usb_hid_report_parser_t *parser, 799 817 usb_hid_report_path_t *path, int flags) 800 818 { 801 int ret = 0;819 size_t ret = 0; 802 820 link_t *item; 803 821 usb_hid_report_item_t *report_item; 804 822 805 823 if(parser == NULL) { 806 return EINVAL;807 } 808 809 item = (&parser->input)->next;824 return 0; 825 } 826 827 item = parser->input.next; 810 828 while(&parser->input != item) { 811 829 report_item = list_get_instance(item, usb_hid_report_item_t, link); … … 824 842 /** 825 843 * 844 * @param usage_path 845 * @param usage_page 846 * @param usage 847 * @return 826 848 */ 827 849 int usb_hid_report_path_append_item(usb_hid_report_path_t *usage_path, … … 845 867 /** 846 868 * 869 * @param usage_path 870 * @return 847 871 */ 848 872 void usb_hid_report_remove_last_item(usb_hid_report_path_t *usage_path) … … 860 884 /** 861 885 * 886 * @param usage_path 887 * @return 862 888 */ 863 889 void usb_hid_report_null_last_item(usb_hid_report_path_t *usage_path) … … 873 899 /** 874 900 * 901 * @param usage_path 902 * @param tag 903 * @param data 904 * @return 875 905 */ 876 906 void usb_hid_report_set_last_item(usb_hid_report_path_t *usage_path, int32_t tag, int32_t data) … … 894 924 895 925 /** 896 * 926 * 927 * 928 * @param report_path 929 * @param path 930 * @param flags 931 * @return 897 932 */ 898 933 int usb_hid_report_compare_usage_path(usb_hid_report_path_t *report_path, … … 949 984 break; 950 985 951 /* given path must be the end of the report one*/986 /* compare with only the end of path*/ 952 987 case USB_HID_PATH_COMPARE_END: 953 988 report_link = report_path->link.prev; … … 992 1027 /** 993 1028 * 1029 * @return 994 1030 */ 995 1031 usb_hid_report_path_t *usb_hid_report_path(void) … … 1009 1045 /** 1010 1046 * 1047 * @param path 1048 * @return void 1011 1049 */ 1012 1050 void usb_hid_report_path_free(usb_hid_report_path_t *path) … … 1019 1057 1020 1058 /** 1021 * 1022 */ 1023 int usb_hid_report_path_clone(usb_hid_report_path_t *new_usage_path, usb_hid_report_path_t *usage_path) 1059 * Clone content of given usage path to the new one 1060 * 1061 * @param usage_path 1062 * @return 1063 */ 1064 usb_hid_report_path_t *usb_hid_report_path_clone(usb_hid_report_path_t *usage_path) 1024 1065 { 1025 1066 usb_hid_report_usage_path_t *path_item; 1026 1067 link_t *path_link; 1027 1068 usb_hid_report_path_t *new_usage_path = usb_hid_report_path (); 1069 1070 if(new_usage_path == NULL){ 1071 return NULL; 1072 } 1028 1073 1029 1074 if(list_empty(&usage_path->link)){ 1030 return EOK;1075 return new_usage_path; 1031 1076 } 1032 1077 … … 1039 1084 } 1040 1085 1086 return new_usage_path; 1087 } 1088 1089 1090 /*** OUTPUT API **/ 1091 1092 /** Allocates output report buffer 1093 * 1094 * @param parser 1095 * @param size 1096 * @return 1097 */ 1098 uint8_t *usb_hid_report_output(usb_hid_report_parser_t *parser, size_t *size) 1099 { 1100 if(parser == NULL) { 1101 *size = 0; 1102 return NULL; 1103 } 1104 1105 // read the last output report item 1106 usb_hid_report_item_t *last; 1107 link_t *link; 1108 1109 link = parser->output.prev; 1110 if(link != &parser->output) { 1111 last = list_get_instance(link, usb_hid_report_item_t, link); 1112 *size = (last->offset + (last->size * last->count)) / 8; 1113 1114 uint8_t *buffer = malloc(sizeof(uint8_t) * (*size)); 1115 memset(buffer, 0, sizeof(uint8_t) * (*size)); 1116 usb_log_debug("output buffer: %s\n", usb_debug_str_buffer(buffer, *size, 0)); 1117 1118 return buffer; 1119 } 1120 else { 1121 *size = 0; 1122 return NULL; 1123 } 1124 } 1125 1126 1127 /** Frees output report buffer 1128 * 1129 * @param output Output report buffer 1130 * @return 1131 */ 1132 void usb_hid_report_output_free(uint8_t *output) 1133 1134 { 1135 if(output != NULL) { 1136 free (output); 1137 } 1138 } 1139 1140 /** Returns size of output for given usage path 1141 * 1142 * @param parser 1143 * @param path 1144 * @param flags 1145 * @return 1146 */ 1147 size_t usb_hid_report_output_size(usb_hid_report_parser_t *parser, 1148 usb_hid_report_path_t *path, int flags) 1149 { 1150 size_t ret = 0; 1151 link_t *item; 1152 usb_hid_report_item_t *report_item; 1153 1154 if(parser == NULL) { 1155 return 0; 1156 } 1157 1158 item = parser->output.next; 1159 while(&parser->output != item) { 1160 report_item = list_get_instance(item, usb_hid_report_item_t, link); 1161 if(!USB_HID_ITEM_FLAG_CONSTANT(report_item->item_flags) && 1162 (usb_hid_report_compare_usage_path(report_item->usage_path, path, flags) == EOK)) { 1163 ret += report_item->count; 1164 } 1165 1166 item = item->next; 1167 } 1168 1169 return ret; 1170 1171 } 1172 1173 /** Updates the output report buffer by translated given data 1174 * 1175 * @param parser 1176 * @param path 1177 * @param flags 1178 * @param buffer 1179 * @param size 1180 * @param data 1181 * @param data_size 1182 * @return 1183 */ 1184 int usb_hid_report_output_translate(usb_hid_report_parser_t *parser, 1185 usb_hid_report_path_t *path, int flags, 1186 uint8_t *buffer, size_t size, 1187 int32_t *data, size_t data_size) 1188 { 1189 usb_hid_report_item_t *report_item; 1190 link_t *item; 1191 size_t idx=0; 1192 int i=0; 1193 int32_t value=0; 1194 int offset; 1195 int length; 1196 int32_t tmp_value; 1197 1198 if(parser == NULL) { 1199 return EINVAL; 1200 } 1201 1202 usb_log_debug("OUTPUT BUFFER: %s\n", usb_debug_str_buffer(buffer,size, 0)); 1203 usb_log_debug("OUTPUT DATA[0]: %d, DATA[1]: %d, DATA[2]: %d\n", data[0], data[1], data[2]); 1204 1205 item = parser->output.next; 1206 while(item != &parser->output) { 1207 report_item = list_get_instance(item, usb_hid_report_item_t, link); 1208 1209 for(i=0; i<report_item->count; i++) { 1210 1211 if(idx >= data_size) { 1212 break; 1213 } 1214 1215 if((USB_HID_ITEM_FLAG_VARIABLE(report_item->item_flags) == 0) || 1216 ((report_item->usage_minimum == 0) && (report_item->usage_maximum == 0))) { 1217 1218 // // variable item 1219 value = usb_hid_translate_data_reverse(report_item, data[idx++]); 1220 offset = report_item->offset + (i * report_item->size); 1221 length = report_item->size; 1222 } 1223 else { 1224 //bitmap 1225 value += usb_hid_translate_data_reverse(report_item, data[idx++]); 1226 offset = report_item->offset; 1227 length = report_item->size * report_item->count; 1228 } 1229 1230 if((offset/8) == ((offset+length-1)/8)) { 1231 // je to v jednom bytu 1232 if(((size_t)(offset/8) >= size) || ((size_t)(offset+length-1)/8) >= size) { 1233 break; // TODO ErrorCode 1234 } 1235 1236 size_t shift = offset%8; 1237 1238 value = value << shift; 1239 value = value & (((1 << length)-1) << shift); 1240 1241 uint8_t mask = 0; 1242 mask = 0xff - (((1 << length) - 1) << shift); 1243 buffer[offset/8] = (buffer[offset/8] & mask) | value; 1244 } 1245 else { 1246 // je to ve dvou!! FIXME: melo by to umet delsi jak 2 1247 1248 // konec prvniho -- dolni x bitu 1249 tmp_value = value; 1250 tmp_value = tmp_value & ((1 << (8-(offset%8)))-1); 1251 tmp_value = tmp_value << (offset%8); 1252 1253 uint8_t mask = 0; 1254 mask = ~(((1 << (8-(offset%8)))-1) << (offset%8)); 1255 buffer[offset/8] = (buffer[offset/8] & mask) | tmp_value; 1256 1257 // a ted druhej -- hornich length-x bitu 1258 value = value >> (8 - (offset % 8)); 1259 value = value & ((1 << (length - (8 - (offset % 8)))) - 1); 1260 1261 mask = ((1 << (length - (8 - (offset % 8)))) - 1); 1262 buffer[(offset+length-1)/8] = (buffer[(offset+length-1)/8] & mask) | value; 1263 } 1264 1265 } 1266 1267 item = item->next; 1268 } 1269 1270 usb_log_debug("OUTPUT BUFFER: %s\n", usb_debug_str_buffer(buffer,size, 0)); 1271 1041 1272 return EOK; 1042 1273 } 1043 1274 1275 /** 1276 * 1277 * @param item 1278 * @param value 1279 * @return 1280 */ 1281 int32_t usb_hid_translate_data_reverse(usb_hid_report_item_t *item, int value) 1282 { 1283 int ret=0; 1284 int resolution; 1285 1286 if(USB_HID_ITEM_FLAG_CONSTANT(item->item_flags)) { 1287 ret = item->logical_minimum; 1288 } 1289 1290 if((USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0)) { 1291 1292 // variable item 1293 if((item->physical_minimum == 0) && (item->physical_maximum == 0)) { 1294 item->physical_minimum = item->logical_minimum; 1295 item->physical_maximum = item->logical_maximum; 1296 } 1297 1298 if(item->physical_maximum == item->physical_minimum){ 1299 resolution = 1; 1300 } 1301 else { 1302 resolution = (item->logical_maximum - item->logical_minimum) / 1303 ((item->physical_maximum - item->physical_minimum) * 1304 (usb_pow(10,(item->unit_exponent)))); 1305 } 1306 1307 ret = ((value - item->physical_minimum) * resolution) + item->logical_minimum; 1308 } 1309 else { 1310 // bitmapa 1311 if(value == 0) { 1312 ret = 0; 1313 } 1314 else { 1315 size_t bitmap_idx = (value - item->usage_minimum); 1316 ret = 1 << bitmap_idx; 1317 } 1318 } 1319 1320 1321 return ret; 1322 } 1323 1044 1324 1045 1325 /** -
uspace/lib/usb/src/request.c
rd773285 r0053fa38 529 529 return rc; 530 530 } 531 532 531 if (bare_config.descriptor_type != USB_DESCTYPE_CONFIGURATION) { 533 532 return ENOENT; -
uspace/srv/devman/devman.c
rd773285 r0053fa38 34 34 #include <fcntl.h> 35 35 #include <sys/stat.h> 36 #include <io/log.h> 36 37 #include <ipc/driver.h> 37 38 #include <ipc/devman.h> … … 146 147 fibril_mutex_unlock(&drivers_list->drivers_mutex); 147 148 148 printf(NAME": the '%s' driver was added to the list of available " 149 "drivers.\n", drv->name); 150 151 printf(NAME ": match ids:"); 152 link_t *cur; 153 for (cur = drv->match_ids.ids.next; cur != &drv->match_ids.ids; cur = cur->next) { 154 match_id_t *match_id = list_get_instance(cur, match_id_t, link); 155 printf(" %d:%s", match_id->score, match_id->id); 156 } 157 printf("\n"); 149 log_msg(LVL_NOTE, "Driver `%s' was added to the list of available " 150 "drivers.", drv->name); 158 151 } 159 152 … … 245 238 bool read_match_ids(const char *conf_path, match_id_list_t *ids) 246 239 { 247 printf(NAME ": read_match_ids conf_path = %s.\n", conf_path);240 log_msg(LVL_DEBUG, "read_match_ids(conf_path=\"%s\")", conf_path); 248 241 249 242 bool suc = false; … … 255 248 fd = open(conf_path, O_RDONLY); 256 249 if (fd < 0) { 257 printf(NAME ": unable to open %s\n", conf_path); 250 log_msg(LVL_ERROR, "Unable to open `%s' for reading: %s.", 251 conf_path, str_error(fd)); 258 252 goto cleanup; 259 253 } … … 263 257 lseek(fd, 0, SEEK_SET); 264 258 if (len == 0) { 265 printf(NAME ": configuration file '%s' is empty.\n", conf_path); 259 log_msg(LVL_ERROR, "Configuration file '%s' is empty.", 260 conf_path); 266 261 goto cleanup; 267 262 } … … 269 264 buf = malloc(len + 1); 270 265 if (buf == NULL) { 271 printf(NAME ": memory allocation failed when parsing file "272 "'%s'. \n", conf_path);266 log_msg(LVL_ERROR, "Memory allocation failed when parsing file " 267 "'%s'.", conf_path); 273 268 goto cleanup; 274 269 } … … 276 271 ssize_t read_bytes = safe_read(fd, buf, len); 277 272 if (read_bytes <= 0) { 278 printf(NAME ": unable to read file '%s'.\n", conf_path);273 log_msg(LVL_ERROR, "Unable to read file '%s'.", conf_path); 279 274 goto cleanup; 280 275 } … … 314 309 bool get_driver_info(const char *base_path, const char *name, driver_t *drv) 315 310 { 316 printf(NAME ": get_driver_info base_path = %s, name = %s.\n",311 log_msg(LVL_DEBUG, "get_driver_info(base_path=\"%s\", name=\"%s\")", 317 312 base_path, name); 318 313 … … 346 341 struct stat s; 347 342 if (stat(drv->binary_path, &s) == ENOENT) { /* FIXME!! */ 348 printf(NAME ": driver not found at path %s.", drv->binary_path); 343 log_msg(LVL_ERROR, "Driver not found at path `%s'.", 344 drv->binary_path); 349 345 goto cleanup; 350 346 } … … 373 369 int lookup_available_drivers(driver_list_t *drivers_list, const char *dir_path) 374 370 { 375 printf(NAME ": lookup_available_drivers, dir = %s \n", dir_path);371 log_msg(LVL_DEBUG, "lookup_available_drivers(dir=\"%s\")", dir_path); 376 372 377 373 int drv_cnt = 0; … … 407 403 dev_node_t *dev; 408 404 409 printf(NAME ": create_root_nodes\n");405 log_msg(LVL_DEBUG, "create_root_nodes()"); 410 406 411 407 fibril_rwlock_write_lock(&tree->rwlock); … … 492 488 void attach_driver(dev_node_t *dev, driver_t *drv) 493 489 { 494 printf(NAME ": attach_driver %s to device %s\n",495 d rv->name, dev->pfun->pathname);490 log_msg(LVL_DEBUG, "attach_driver(dev=\"%s\",drv=\"%s\")", 491 dev->pfun->pathname, drv->name); 496 492 497 493 fibril_mutex_lock(&drv->driver_mutex); … … 515 511 assert(fibril_mutex_is_locked(&drv->driver_mutex)); 516 512 517 printf(NAME ": start_driver '%s'\n", drv->name);513 log_msg(LVL_DEBUG, "start_driver(drv=\"%s\")", drv->name); 518 514 519 515 rc = task_spawnl(NULL, drv->binary_path, drv->binary_path, NULL); 520 516 if (rc != EOK) { 521 printf(NAME ": error spawning %s (%s)\n",522 drv->name, str_error(rc));517 log_msg(LVL_ERROR, "Spawning driver `%s' (%s) failed: %s.", 518 drv->name, drv->binary_path, str_error(rc)); 523 519 return false; 524 520 } … … 582 578 int phone; 583 579 584 printf(NAME ": pass_devices_to_driver(`%s')\n", driver->name); 580 log_msg(LVL_DEBUG, "pass_devices_to_driver(driver=\"%s\")", 581 driver->name); 585 582 586 583 fibril_mutex_lock(&driver->driver_mutex); … … 649 646 * immediately and possibly started here as well. 650 647 */ 651 printf(NAME ": driver %s goes into running state.\n", driver->name);648 log_msg(LVL_DEBUG, "Driver `%s' enters running state.", driver->name); 652 649 driver->state = DRIVER_RUNNING; 653 650 … … 666 663 void initialize_running_driver(driver_t *driver, dev_tree_t *tree) 667 664 { 668 printf(NAME ": initialize_running_driver (`%s')\n", driver->name); 665 log_msg(LVL_DEBUG, "initialize_running_driver(driver=\"%s\")", 666 driver->name); 669 667 670 668 /* … … 756 754 * access any structures that would affect driver_t. 757 755 */ 758 printf(NAME ": add_device (driver `%s', device `%s')\n", drv->name,759 d ev->pfun->name);756 log_msg(LVL_DEBUG, "add_device(drv=\"%s\", dev=\"%s\")", 757 drv->name, dev->pfun->name); 760 758 761 759 sysarg_t rc; … … 818 816 driver_t *drv = find_best_match_driver(drivers_list, dev); 819 817 if (drv == NULL) { 820 printf(NAME ": no driver found for device '%s'.\n",818 log_msg(LVL_ERROR, "No driver found for device `%s'.", 821 819 dev->pfun->pathname); 822 820 return false; … … 856 854 bool init_device_tree(dev_tree_t *tree, driver_list_t *drivers_list) 857 855 { 858 printf(NAME ": init_device_tree.\n");856 log_msg(LVL_DEBUG, "init_device_tree()"); 859 857 860 858 tree->current_handle = 0; … … 1035 1033 fun->pathname = (char *) malloc(pathsize); 1036 1034 if (fun->pathname == NULL) { 1037 printf(NAME ": failed to allocate device path.\n");1035 log_msg(LVL_ERROR, "Failed to allocate device path."); 1038 1036 return false; 1039 1037 } … … 1066 1064 assert(fibril_rwlock_is_write_locked(&tree->rwlock)); 1067 1065 1066 log_msg(LVL_DEBUG, "insert_dev_node(dev=%p, pfun=%p [\"%s\"])", 1067 dev, pfun, pfun->pathname); 1068 1068 1069 /* Add the node to the handle-to-node map. */ 1069 1070 dev->handle = ++tree->current_handle; … … 1072 1073 1073 1074 /* Add the node to the list of its parent's children. */ 1074 printf("insert_dev_node: dev=%p, dev->pfun := %p\n", dev, pfun);1075 1075 dev->pfun = pfun; 1076 1076 pfun->child = dev; … … 1173 1173 } 1174 1174 1175 /** Find function with a specified name belonging to given device. 1176 * 1177 * Device tree rwlock should be held at least for reading. 1178 * 1179 * @param dev Device the function belongs to. 1180 * @param name Function name (not path). 1181 * @return Function node. 1182 * @retval NULL No function with given name. 1183 */ 1184 fun_node_t *find_fun_node_in_device(dev_node_t *dev, const char *name) 1185 { 1186 assert(dev != NULL); 1187 assert(name != NULL); 1188 1189 fun_node_t *fun; 1190 link_t *link; 1191 1192 for (link = dev->functions.next; 1193 link != &dev->functions; 1194 link = link->next) { 1195 fun = list_get_instance(link, fun_node_t, dev_functions); 1196 1197 if (str_cmp(name, fun->name) == 0) 1198 return fun; 1199 } 1200 1201 return NULL; 1202 } 1203 1204 /** Find function node by its class name and index. */ 1205 fun_node_t *find_fun_node_by_class(class_list_t *class_list, 1206 const char *class_name, const char *dev_name) 1207 { 1208 assert(class_list != NULL); 1209 assert(class_name != NULL); 1210 assert(dev_name != NULL); 1211 1212 fibril_rwlock_read_lock(&class_list->rwlock); 1213 1214 dev_class_t *cl = find_dev_class_no_lock(class_list, class_name); 1215 if (cl == NULL) { 1216 fibril_rwlock_read_unlock(&class_list->rwlock); 1217 return NULL; 1218 } 1219 1220 dev_class_info_t *dev = find_dev_in_class(cl, dev_name); 1221 if (dev == NULL) { 1222 fibril_rwlock_read_unlock(&class_list->rwlock); 1223 return NULL; 1224 } 1225 1226 fun_node_t *fun = dev->fun; 1227 1228 fibril_rwlock_read_unlock(&class_list->rwlock); 1229 1230 return fun; 1231 } 1232 1233 1175 1234 /** Find child function node with a specified name. 1176 1235 * … … 1183 1242 fun_node_t *find_node_child(fun_node_t *pfun, const char *name) 1184 1243 { 1185 fun_node_t *fun; 1186 link_t *link; 1187 1188 link = pfun->child->functions.next; 1189 1190 while (link != &pfun->child->functions) { 1191 fun = list_get_instance(link, fun_node_t, dev_functions); 1192 1193 if (str_cmp(name, fun->name) == 0) 1194 return fun; 1195 1196 link = link->next; 1197 } 1198 1199 return NULL; 1244 return find_fun_node_in_device(pfun->child, name); 1200 1245 } 1201 1246 … … 1359 1404 } 1360 1405 1406 dev_class_info_t *find_dev_in_class(dev_class_t *dev_class, const char *dev_name) 1407 { 1408 assert(dev_class != NULL); 1409 assert(dev_name != NULL); 1410 1411 link_t *link; 1412 for (link = dev_class->devices.next; 1413 link != &dev_class->devices; 1414 link = link->next) { 1415 dev_class_info_t *dev = list_get_instance(link, 1416 dev_class_info_t, link); 1417 1418 if (str_cmp(dev->dev_name, dev_name) == 0) { 1419 return dev; 1420 } 1421 } 1422 1423 return NULL; 1424 } 1425 1361 1426 void init_class_list(class_list_t *class_list) 1362 1427 { -
uspace/srv/devman/devman.h
rd773285 r0053fa38 338 338 extern fun_node_t *find_fun_node(dev_tree_t *tree, devman_handle_t handle); 339 339 extern fun_node_t *find_fun_node_by_path(dev_tree_t *, char *); 340 extern fun_node_t *find_fun_node_in_device(dev_node_t *, const char *); 341 extern fun_node_t *find_fun_node_by_class(class_list_t *, const char *, const char *); 340 342 341 343 /* Device tree */ … … 359 361 extern dev_class_t *get_dev_class(class_list_t *, char *); 360 362 extern dev_class_t *find_dev_class_no_lock(class_list_t *, const char *); 363 extern dev_class_info_t *find_dev_in_class(dev_class_t *, const char *); 361 364 extern void add_dev_class_no_lock(class_list_t *, dev_class_t *); 362 365 -
uspace/srv/devman/main.c
rd773285 r0053fa38 43 43 #include <stdio.h> 44 44 #include <errno.h> 45 #include <str_error.h> 45 46 #include <bool.h> 46 47 #include <fibril_synch.h> … … 51 52 #include <sys/stat.h> 52 53 #include <ctype.h> 54 #include <io/log.h> 53 55 #include <ipc/devman.h> 54 56 #include <ipc/driver.h> … … 71 73 driver_t *driver = NULL; 72 74 73 printf(NAME ": devman_driver_register \n");75 log_msg(LVL_DEBUG, "devman_driver_register"); 74 76 75 77 iid = async_get_call(&icall); … … 88 90 } 89 91 90 printf(NAME ": the %s driver is trying to register by the service.\n",92 log_msg(LVL_DEBUG, "The `%s' driver is trying to register.", 91 93 drv_name); 92 94 … … 95 97 96 98 if (driver == NULL) { 97 printf(NAME ": no driver named %s was found.\n", drv_name);99 log_msg(LVL_ERROR, "No driver named `%s' was found.", drv_name); 98 100 free(drv_name); 99 101 drv_name = NULL; … … 106 108 107 109 /* Create connection to the driver. */ 108 printf(NAME ": creating connection to the %s driver.\n", driver->name); 110 log_msg(LVL_DEBUG, "Creating connection to the `%s' driver.", 111 driver->name); 109 112 ipc_call_t call; 110 113 ipc_callid_t callid = async_get_call(&call); … … 118 121 set_driver_phone(driver, IPC_GET_ARG5(call)); 119 122 120 printf(NAME ": the %s driver was successfully registered as running.\n", 123 log_msg(LVL_NOTE, 124 "The `%s' driver was successfully registered as running.", 121 125 driver->name); 122 126 … … 142 146 callid = async_get_call(&call); 143 147 if (DEVMAN_ADD_MATCH_ID != IPC_GET_IMETHOD(call)) { 144 printf(NAME ": ERROR: devman_receive_match_id - invalid "145 " protocol.\n");148 log_msg(LVL_ERROR, 149 "Invalid protocol when trying to receive match id."); 146 150 async_answer_0(callid, EINVAL); 147 151 delete_match_id(match_id); … … 150 154 151 155 if (match_id == NULL) { 152 printf(NAME ": ERROR: devman_receive_match_id - failed to " 153 "allocate match id.\n"); 156 log_msg(LVL_ERROR, "Failed to allocate match id."); 154 157 async_answer_0(callid, ENOMEM); 155 158 return ENOMEM; … … 165 168 if (rc != EOK) { 166 169 delete_match_id(match_id); 167 printf(NAME ": devman_receive_match_id - failed to receive "168 "match id string.\n");170 log_msg(LVL_ERROR, "Failed to receive match id string: %s.", 171 str_error(rc)); 169 172 return rc; 170 173 } … … 172 175 list_append(&match_id->link, &match_ids->ids); 173 176 174 printf(NAME ": received match id '%s', score = %d \n",177 log_msg(LVL_DEBUG, "Received match id `%s', score %d.", 175 178 match_id->id, match_id->score); 176 179 return rc; … … 228 231 if (ftype != fun_inner && ftype != fun_exposed) { 229 232 /* Unknown function type */ 230 printf(NAME ": Error, unknown function type provided by driver!\n"); 233 log_msg(LVL_ERROR, 234 "Unknown function type %d provided by driver.", 235 (int) ftype); 231 236 232 237 fibril_rwlock_write_unlock(&tree->rwlock); … … 243 248 } 244 249 250 /* Check that function with same name is not there already. */ 251 if (find_fun_node_in_device(pdev, fun_name) != NULL) { 252 fibril_rwlock_write_unlock(&tree->rwlock); 253 async_answer_0(callid, EEXISTS); 254 printf(NAME ": Warning, driver tried to register `%s' twice.\n", 255 fun_name); 256 free(fun_name); 257 return; 258 } 259 245 260 fun_node_t *fun = create_fun_node(); 246 261 if (!insert_fun_node(&device_tree, fun, fun_name, pdev)) { … … 265 280 fibril_rwlock_write_unlock(&tree->rwlock); 266 281 267 printf(NAME ": devman_add_function %s\n", fun->pathname);282 log_msg(LVL_DEBUG, "devman_add_function(fun=\"%s\")", fun->pathname); 268 283 269 284 devman_receive_match_ids(match_count, &fun->match_ids); … … 347 362 devmap_register_class_dev(class_info); 348 363 349 printf(NAME ": function'%s' added to class '%s', class name '%s' was "350 "asigned to it\n",fun->pathname, class_name, class_info->dev_name);364 log_msg(LVL_NOTE, "Function `%s' added to class `%s' as `%s'.", 365 fun->pathname, class_name, class_info->dev_name); 351 366 352 367 async_answer_0(callid, EOK); … … 363 378 364 379 initialize_running_driver(driver, &device_tree); 365 printf(NAME ": the %s driver was successfully initialized. \n",380 log_msg(LVL_DEBUG, "The `%s` driver was successfully initialized.", 366 381 driver->name); 367 382 return 0; … … 385 400 fid_t fid = fibril_create(init_running_drv, driver); 386 401 if (fid == 0) { 387 printf(NAME ": Error creating fibril for the initialization of "388 " the newly registered running driver.\n");402 log_msg(LVL_ERROR, "Failed to create initialization fibril " \ 403 "for driver `%s'.", driver->name); 389 404 return; 390 405 } … … 438 453 } 439 454 455 /** Find handle for the device instance identified by device class name. */ 456 static void devman_function_get_handle_by_class(ipc_callid_t iid, 457 ipc_call_t *icall) 458 { 459 char *classname; 460 char *devname; 461 462 int rc = async_data_write_accept((void **) &classname, true, 0, 0, 0, 0); 463 if (rc != EOK) { 464 async_answer_0(iid, rc); 465 return; 466 } 467 rc = async_data_write_accept((void **) &devname, true, 0, 0, 0, 0); 468 if (rc != EOK) { 469 free(classname); 470 async_answer_0(iid, rc); 471 return; 472 } 473 474 475 fun_node_t *fun = find_fun_node_by_class(&class_list, 476 classname, devname); 477 478 free(classname); 479 free(devname); 480 481 if (fun == NULL) { 482 async_answer_0(iid, ENOENT); 483 return; 484 } 485 486 async_answer_1(iid, EOK, fun->handle); 487 } 488 440 489 441 490 /** Function for handling connections from a client to the device manager. */ … … 457 506 devman_function_get_handle(callid, &call); 458 507 break; 508 case DEVMAN_DEVICE_GET_HANDLE_BY_CLASS: 509 devman_function_get_handle_by_class(callid, &call); 510 break; 459 511 default: 460 512 async_answer_0(callid, ENOENT); … … 484 536 */ 485 537 if (dev == NULL) { 486 printf(NAME ": devman_forward error - no device or function with"487 " handle %" PRIun " was found.\n", handle);538 log_msg(LVL_ERROR, "IPC forwarding failed - no device or " 539 "function with handle %" PRIun " was found.", handle); 488 540 async_answer_0(iid, ENOENT); 489 541 return; … … 491 543 492 544 if (fun == NULL && !drv_to_parent) { 493 printf(NAME ": devman_forward error - cannot connect to " 494 "handle %" PRIun ", refers to a device.\n", handle); 545 log_msg(LVL_ERROR, NAME ": devman_forward error - cannot " 546 "connect to handle %" PRIun ", refers to a device.", 547 handle); 495 548 async_answer_0(iid, ENOENT); 496 549 return; … … 513 566 514 567 if (driver == NULL) { 515 printf(NAME ": devman_forward error - the device %" PRIun\516 " (%s) is not in usable state.\n",568 log_msg(LVL_ERROR, "IPC forwarding refused - " \ 569 "the device %" PRIun "(%s) is not in usable state.", 517 570 handle, dev->pfun->pathname); 518 571 async_answer_0(iid, ENOENT); … … 527 580 528 581 if (driver->phone <= 0) { 529 printf(NAME ": devman_forward: cound not forward to driver %s ",530 driver->name);531 printf("the driver's phone is %" PRIun ").\n",driver->phone);582 log_msg(LVL_ERROR, 583 "Could not forward to driver `%s' (phone is %d).", 584 driver->name, (int) driver->phone); 532 585 async_answer_0(iid, EINVAL); 533 586 return; … … 535 588 536 589 if (fun != NULL) { 537 printf(NAME ": devman_forward: forward connection to function %s to " 538 "driver %s.\n", fun->pathname, driver->name); 590 log_msg(LVL_DEBUG, 591 "Forwarding request for `%s' function to driver `%s'.", 592 fun->pathname, driver->name); 539 593 } else { 540 printf(NAME ": devman_forward: forward connection to device %s to " 541 "driver %s.\n", dev->pfun->pathname, driver->name); 594 log_msg(LVL_DEBUG, 595 "Forwarding request for `%s' device to driver `%s'.", 596 dev->pfun->pathname, driver->name); 542 597 } 543 598 … … 571 626 async_forward_fast(iid, dev->drv->phone, DRIVER_CLIENT, fun->handle, 0, 572 627 IPC_FF_NONE); 573 printf(NAME ": devman_connection_devmapper: forwarded connection to " 574 "device %s to driver %s.\n", fun->pathname, dev->drv->name); 628 log_msg(LVL_DEBUG, 629 "Forwarding devmapper request for `%s' function to driver `%s'.", 630 fun->pathname, dev->drv->name); 575 631 } 576 632 … … 607 663 static bool devman_init(void) 608 664 { 609 printf(NAME ": devman_init - looking for available drivers.\n");665 log_msg(LVL_DEBUG, "devman_init - looking for available drivers."); 610 666 611 667 /* Initialize list of available drivers. */ … … 613 669 if (lookup_available_drivers(&drivers_list, 614 670 DRIVER_DEFAULT_STORE) == 0) { 615 printf(NAME " no drivers found.");671 log_msg(LVL_FATAL, "No drivers found."); 616 672 return false; 617 673 } 618 674 619 printf(NAME ": devman_init - list of drivers has been initialized.\n");675 log_msg(LVL_DEBUG, "devman_init - list of drivers has been initialized."); 620 676 621 677 /* Create root device node. */ 622 678 if (!init_device_tree(&device_tree, &drivers_list)) { 623 printf(NAME " failed to initialize device tree.");679 log_msg(LVL_FATAL, "Failed to initialize device tree."); 624 680 return false; 625 681 } … … 642 698 printf(NAME ": HelenOS Device Manager\n"); 643 699 700 if (log_init(NAME, LVL_ERROR) != EOK) { 701 printf(NAME ": Error initializing logging subsystem.\n"); 702 return -1; 703 } 704 644 705 if (!devman_init()) { 645 printf(NAME ": Error while initializing service\n");706 log_msg(LVL_ERROR, "Error while initializing service."); 646 707 return -1; 647 708 } … … 651 712 652 713 /* Register device manager at naming service. */ 653 if (service_register(SERVICE_DEVMAN) != EOK) 714 if (service_register(SERVICE_DEVMAN) != EOK) { 715 log_msg(LVL_ERROR, "Failed registering as a service."); 654 716 return -1; 655 656 printf(NAME ": Accepting connections\n"); 717 } 718 719 printf(NAME ": Accepting connections.\n"); 657 720 async_manager(); 658 721 -
uspace/srv/devmap/devmap.c
rd773285 r0053fa38 551 551 if (devmap_device_find_name(namespace->name, device->name) != NULL) { 552 552 printf("%s: Device '%s/%s' already registered\n", NAME, 553 device->namespace->name, device->name);553 namespace->name, device->name); 554 554 devmap_namespace_destroy(namespace); 555 555 fibril_mutex_unlock(&devices_list_mutex);
Note:
See TracChangeset
for help on using the changeset viewer.