Changeset beb9336 in mainline for uspace/drv/char
- Timestamp:
- 2012-08-24T14:07:52Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 041ab64
- Parents:
- bd29f9c9 (diff), db81577 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- uspace/drv/char
- Files:
-
- 8 edited
-
i8042/i8042.c (modified) (10 diffs)
-
i8042/main.c (modified) (4 diffs)
-
ns8250/cyclic_buffer.h (modified) (1 diff)
-
ns8250/ns8250.c (modified) (37 diffs)
-
ps2mouse/main.c (modified) (1 diff)
-
ps2mouse/ps2mouse.c (modified) (9 diffs)
-
xtkbd/main.c (modified) (1 diff)
-
xtkbd/xtkbd.c (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/char/i8042/i8042.c
rbd29f9c9 rbeb9336 39 39 */ 40 40 41 #include <devman.h>42 41 #include <device/hw_res.h> 43 42 #include <ddi.h> … … 140 139 }; 141 140 141 /** Get i8042 soft state from device node. */ 142 static i8042_t *dev_i8042(ddf_dev_t *dev) 143 { 144 return ddf_dev_data_get(dev); 145 } 146 142 147 /** Wait until it is safe to write to the device. */ 143 148 static void wait_ready(i8042_t *dev) … … 159 164 ipc_call_t *call) 160 165 { 161 if ((!dev) || (!dev->driver_data)) 162 return; 163 164 i8042_t *controller = dev->driver_data; 166 i8042_t *controller = dev_i8042(dev); 165 167 166 168 const uint8_t status = IPC_GET_ARG1(*call); … … 188 190 int irq_mouse, ddf_dev_t *ddf_dev) 189 191 { 190 assert(ddf_dev); 191 assert(dev); 192 193 if (reg_size < sizeof(i8042_regs_t)) 194 return EINVAL; 195 196 if (pio_enable(regs, sizeof(i8042_regs_t), (void **) &dev->regs) != 0) 197 return -1; 192 const size_t range_count = sizeof(i8042_ranges) / 193 sizeof(irq_pio_range_t); 194 irq_pio_range_t ranges[range_count]; 195 const size_t cmd_count = sizeof(i8042_cmds) / sizeof(irq_cmd_t); 196 irq_cmd_t cmds[cmd_count]; 197 198 int rc; 199 bool kbd_bound = false; 200 bool aux_bound = false; 201 202 dev->kbd_fun = NULL; 203 dev->aux_fun = NULL; 204 205 if (reg_size < sizeof(i8042_regs_t)) { 206 rc = EINVAL; 207 goto error; 208 } 209 210 if (pio_enable(regs, sizeof(i8042_regs_t), (void **) &dev->regs) != 0) { 211 rc = EIO; 212 goto error; 213 } 198 214 199 215 dev->kbd_fun = ddf_fun_create(ddf_dev, fun_inner, "ps2a"); 200 if ( !dev->kbd_fun)201 r eturnENOMEM;202 203 int ret = ddf_fun_add_match_id(dev->kbd_fun, "char/xtkbd", 90);204 if (ret != EOK) {205 ddf_fun_destroy(dev->kbd_fun);206 return ret;207 }216 if (dev->kbd_fun == NULL) { 217 rc = ENOMEM; 218 goto error; 219 }; 220 221 rc = ddf_fun_add_match_id(dev->kbd_fun, "char/xtkbd", 90); 222 if (rc != EOK) 223 goto error; 208 224 209 225 dev->aux_fun = ddf_fun_create(ddf_dev, fun_inner, "ps2b"); 210 if (!dev->aux_fun) { 211 ddf_fun_destroy(dev->kbd_fun); 212 return ENOMEM; 213 } 214 215 ret = ddf_fun_add_match_id(dev->aux_fun, "char/ps2mouse", 90); 216 if (ret != EOK) { 217 ddf_fun_destroy(dev->kbd_fun); 218 ddf_fun_destroy(dev->aux_fun); 219 return ret; 220 } 221 222 dev->kbd_fun->ops = &ops; 223 dev->aux_fun->ops = &ops; 224 dev->kbd_fun->driver_data = dev; 225 dev->aux_fun->driver_data = dev; 226 if (dev->aux_fun == NULL) { 227 rc = ENOMEM; 228 goto error; 229 } 230 231 rc = ddf_fun_add_match_id(dev->aux_fun, "char/ps2mouse", 90); 232 if (rc != EOK) 233 goto error; 234 235 ddf_fun_set_ops(dev->kbd_fun, &ops); 236 ddf_fun_set_ops(dev->aux_fun, &ops); 226 237 227 238 buffer_init(&dev->kbd_buffer, dev->kbd_data, BUFFER_SIZE); … … 229 240 fibril_mutex_initialize(&dev->write_guard); 230 241 231 ret = ddf_fun_bind(dev->kbd_fun); 232 CHECK_RET_DESTROY(ret, "Failed to bind keyboard function: %s.", 233 str_error(ret)); 234 235 ret = ddf_fun_bind(dev->aux_fun); 236 CHECK_RET_DESTROY(ret, "Failed to bind mouse function: %s.", 237 str_error(ret)); 242 rc = ddf_fun_bind(dev->kbd_fun); 243 if (rc != EOK) { 244 ddf_msg(LVL_ERROR, "Failed to bind keyboard function: %s.", 245 ddf_fun_get_name(dev->kbd_fun)); 246 goto error; 247 } 248 kbd_bound = true; 249 250 rc = ddf_fun_bind(dev->aux_fun); 251 if (rc != EOK) { 252 ddf_msg(LVL_ERROR, "Failed to bind aux function: %s.", 253 ddf_fun_get_name(dev->aux_fun)); 254 goto error; 255 } 256 aux_bound = true; 238 257 239 258 /* Disable kbd and aux */ … … 247 266 (void) pio_read_8(&dev->regs->data); 248 267 249 const size_t range_count = sizeof(i8042_ranges) /250 sizeof(irq_pio_range_t);251 irq_pio_range_t ranges[range_count];252 268 memcpy(ranges, i8042_ranges, sizeof(i8042_ranges)); 253 269 ranges[0].base = (uintptr_t) regs; 254 270 255 const size_t cmd_count = sizeof(i8042_cmds) / sizeof(irq_cmd_t);256 irq_cmd_t cmds[cmd_count];257 271 memcpy(cmds, i8042_cmds, sizeof(i8042_cmds)); 258 272 cmds[0].addr = (void *) &(((i8042_regs_t *) regs)->status); … … 266 280 }; 267 281 268 r et= register_interrupt_handler(ddf_dev, irq_kbd, i8042_irq_handler,282 rc = register_interrupt_handler(ddf_dev, irq_kbd, i8042_irq_handler, 269 283 &irq_code); 270 CHECK_RET_UNBIND_DESTROY(ret, "Failed set handler for kbd: %s.", 271 str_error(ret)); 272 273 ret = register_interrupt_handler(ddf_dev, irq_mouse, i8042_irq_handler, 284 if (rc != EOK) { 285 ddf_msg(LVL_ERROR, "Failed set handler for kbd: %s.", 286 ddf_dev_get_name(ddf_dev)); 287 goto error; 288 } 289 290 rc = register_interrupt_handler(ddf_dev, irq_mouse, i8042_irq_handler, 274 291 &irq_code); 275 CHECK_RET_UNBIND_DESTROY(ret, "Failed set handler for mouse: %s.", 276 str_error(ret)); 292 if (rc != EOK) { 293 ddf_msg(LVL_ERROR, "Failed set handler for mouse: %s.", 294 ddf_dev_get_name(ddf_dev)); 295 goto error; 296 } 277 297 278 298 /* Enable interrupts */ 279 async_sess_t *parent_sess = 280 devman_parent_device_connect(EXCHANGE_SERIALIZE, ddf_dev->handle, 281 IPC_FLAG_BLOCKING); 282 ret = parent_sess ? EOK : ENOMEM; 283 CHECK_RET_UNBIND_DESTROY(ret, "Failed to create parent connection."); 299 async_sess_t *parent_sess = ddf_dev_parent_sess_get(ddf_dev); 300 assert(parent_sess != NULL); 284 301 285 302 const bool enabled = hw_res_enable_interrupt(parent_sess); 286 async_hangup(parent_sess); 287 ret = enabled ? EOK : EIO; 288 CHECK_RET_UNBIND_DESTROY(ret, "Failed to enable interrupts: %s."); 303 if (!enabled) { 304 log_msg(LVL_ERROR, "Failed to enable interrupts: %s.", 305 ddf_dev_get_name(ddf_dev)); 306 rc = EIO; 307 goto error; 308 } 289 309 290 310 /* Enable port interrupts. */ … … 296 316 297 317 return EOK; 318 error: 319 if (kbd_bound) 320 ddf_fun_unbind(dev->kbd_fun); 321 if (aux_bound) 322 ddf_fun_unbind(dev->aux_fun); 323 if (dev->kbd_fun != NULL) 324 ddf_fun_destroy(dev->kbd_fun); 325 if (dev->aux_fun != NULL) 326 ddf_fun_destroy(dev->aux_fun); 327 328 return rc; 298 329 } 299 330 … … 315 346 static int i8042_write(ddf_fun_t *fun, char *buffer, size_t size) 316 347 { 317 assert(fun); 318 assert(fun->driver_data); 319 320 i8042_t *controller = fun->driver_data; 348 i8042_t *controller = dev_i8042(ddf_fun_get_dev(fun)); 321 349 fibril_mutex_lock(&controller->write_guard); 322 350 … … 347 375 static int i8042_read(ddf_fun_t *fun, char *data, size_t size) 348 376 { 349 assert(fun); 350 assert(fun->driver_data); 351 352 i8042_t *controller = fun->driver_data; 377 i8042_t *controller = dev_i8042(ddf_fun_get_dev(fun)); 353 378 buffer_t *buffer = (fun == controller->aux_fun) ? 354 379 &controller->aux_buffer : &controller->kbd_buffer; -
uspace/drv/char/i8042/main.c
rbd29f9c9 rbeb9336 37 37 #include <libarch/inttypes.h> 38 38 #include <ddf/driver.h> 39 #include <devman.h>40 39 #include <device/hw_res_parsed.h> 41 40 #include <errno.h> … … 64 63 * 65 64 */ 66 static int get_my_registers( constddf_dev_t *dev, uintptr_t *io_reg_address,65 static int get_my_registers(ddf_dev_t *dev, uintptr_t *io_reg_address, 67 66 size_t *io_reg_size, int *kbd_irq, int *mouse_irq) 68 67 { 69 68 assert(dev); 70 69 71 async_sess_t *parent_sess = 72 devman_parent_device_connect(EXCHANGE_SERIALIZE, dev->handle, 73 IPC_FLAG_BLOCKING); 74 if (!parent_sess) 70 async_sess_t *parent_sess = ddf_dev_parent_sess_create( 71 dev, EXCHANGE_SERIALIZE); 72 if (parent_sess == NULL) 75 73 return ENOMEM; 76 74 … … 78 76 hw_res_list_parsed_init(&hw_resources); 79 77 const int ret = hw_res_get_list_parsed(parent_sess, &hw_resources, 0); 80 async_hangup(parent_sess);81 78 if (ret != EOK) 82 79 return ret; … … 136 133 137 134 ddf_msg(LVL_NOTE, "Controlling '%s' (%" PRIun ").", 138 d evice->name, device->handle);135 ddf_dev_get_name(device), ddf_dev_get_handle(device)); 139 136 return EOK; 140 137 } -
uspace/drv/char/ns8250/cyclic_buffer.h
rbd29f9c9 rbeb9336 36 36 #define CYCLIC_BUFFER_H_ 37 37 38 #define BUF_LEN 25638 #define BUF_LEN 4096 39 39 40 40 typedef struct cyclic_buffer { -
uspace/drv/char/ns8250/ns8250.c
rbd29f9c9 rbeb9336 58 58 #include <ops/char_dev.h> 59 59 60 #include <devman.h>61 60 #include <ns.h> 62 #include <ipc/devman.h>63 61 #include <ipc/services.h> 64 62 #include <ipc/irc.h> … … 82 80 /** Interrupt ID Register definition. */ 83 81 #define NS8250_IID_ACTIVE (1 << 0) 82 #define NS8250_IID_CAUSE_MASK 0x0e 83 #define NS8250_IID_CAUSE_RXSTATUS 0x06 84 84 85 85 /** FIFO Control Register definition. */ … … 125 125 #define NS8250_MSR_SIGNALS (NS8250_MSR_CTS | NS8250_MSR_DSR \ 126 126 | NS8250_MSR_RI | NS8250_MSR_DCD) 127 128 /** Obtain soft-state structure from function node */129 #define NS8250(fnode) ((ns8250_t *) ((fnode)->dev->driver_data))130 131 /** Obtain soft-state structure from device node */132 #define NS8250_FROM_DEV(dnode) ((ns8250_t *) ((dnode)->driver_data))133 127 134 128 /** The number of bits of one data unit send by the serial port. */ … … 179 173 /** The fibril mutex for synchronizing the access to the device. */ 180 174 fibril_mutex_t mutex; 175 /** Indicates that some data has become available */ 176 fibril_condvar_t input_buffer_available; 181 177 /** True if device is removed. */ 182 178 bool removed; 183 179 } ns8250_t; 184 180 181 /** Obtain soft-state structure from device node */ 182 static ns8250_t *dev_ns8250(ddf_dev_t *dev) 183 { 184 return ddf_dev_data_get(dev); 185 } 186 187 /** Obtain soft-state structure from function node */ 188 static ns8250_t *fun_ns8250(ddf_fun_t *fun) 189 { 190 return dev_ns8250(ddf_fun_get_dev(fun)); 191 } 192 185 193 /** Find out if there is some incomming data available on the serial port. 186 194 * … … 237 245 static int ns8250_read(ddf_fun_t *fun, char *buf, size_t count) 238 246 { 239 ns8250_t *ns = NS8250(fun); 240 int ret = EOK; 247 ns8250_t *ns = fun_ns8250(fun); 248 int ret = 0; 249 250 if (count == 0) return 0; 241 251 242 252 fibril_mutex_lock(&ns->mutex); 253 while (buf_is_empty(&ns->input_buffer)) 254 fibril_condvar_wait(&ns->input_buffer_available, &ns->mutex); 243 255 while (!buf_is_empty(&ns->input_buffer) && (size_t)ret < count) { 244 256 buf[ret] = (char)buf_pop_front(&ns->input_buffer); … … 271 283 static int ns8250_write(ddf_fun_t *fun, char *buf, size_t count) 272 284 { 273 ns8250_t *ns = NS8250(fun);285 ns8250_t *ns = fun_ns8250(fun); 274 286 size_t idx; 275 287 … … 309 321 static void ns8250_dev_cleanup(ns8250_t *ns) 310 322 { 311 if (ns->dev->parent_sess) {312 async_hangup(ns->dev->parent_sess);313 ns->dev->parent_sess = NULL;314 }315 323 } 316 324 … … 322 330 static bool ns8250_pio_enable(ns8250_t *ns) 323 331 { 324 ddf_msg(LVL_DEBUG, "ns8250_pio_enable %s", ns->dev->name);332 ddf_msg(LVL_DEBUG, "ns8250_pio_enable %s", ddf_dev_get_name(ns->dev)); 325 333 326 334 /* Gain control over port's registers. */ … … 328 336 (void **) &ns->port)) { 329 337 ddf_msg(LVL_ERROR, "Cannot map the port %#" PRIx32 330 " for device %s.", ns->io_addr, ns->dev->name);338 " for device %s.", ns->io_addr, ddf_dev_get_name(ns->dev)); 331 339 return false; 332 340 } … … 344 352 static bool ns8250_dev_probe(ns8250_t *ns) 345 353 { 346 ddf_msg(LVL_DEBUG, "ns8250_dev_probe %s", ns->dev->name);354 ddf_msg(LVL_DEBUG, "ns8250_dev_probe %s", ddf_dev_get_name(ns->dev)); 347 355 348 356 bool res = true; … … 364 372 if (!res) { 365 373 ddf_msg(LVL_DEBUG, "Device %s is not present.", 366 ns->dev->name);374 ddf_dev_get_name(ns->dev)); 367 375 } 368 376 … … 377 385 static int ns8250_dev_initialize(ns8250_t *ns) 378 386 { 379 ddf_msg(LVL_DEBUG, "ns8250_dev_initialize %s", ns->dev->name); 380 387 async_sess_t *parent_sess; 381 388 int ret = EOK; 389 390 ddf_msg(LVL_DEBUG, "ns8250_dev_initialize %s", ddf_dev_get_name(ns->dev)); 382 391 383 392 hw_resource_list_t hw_resources; … … 385 394 386 395 /* Connect to the parent's driver. */ 387 ns->dev->parent_sess = devman_parent_device_connect(EXCHANGE_SERIALIZE, 388 ns->dev->handle, IPC_FLAG_BLOCKING); 389 if (!ns->dev->parent_sess) { 396 parent_sess = ddf_dev_parent_sess_create(ns->dev, EXCHANGE_SERIALIZE); 397 if (parent_sess == NULL) { 390 398 ddf_msg(LVL_ERROR, "Failed to connect to parent driver of " 391 "device %s.", ns->dev->name);399 "device %s.", ddf_dev_get_name(ns->dev)); 392 400 ret = ENOENT; 393 401 goto failed; … … 395 403 396 404 /* Get hw resources. */ 397 ret = hw_res_get_resource_list( ns->dev->parent_sess, &hw_resources);405 ret = hw_res_get_resource_list(parent_sess, &hw_resources); 398 406 if (ret != EOK) { 399 407 ddf_msg(LVL_ERROR, "Failed to get HW resources for device " 400 "%s.", ns->dev->name);408 "%s.", ddf_dev_get_name(ns->dev)); 401 409 goto failed; 402 410 } … … 414 422 irq = true; 415 423 ddf_msg(LVL_NOTE, "Device %s was asigned irq = 0x%x.", 416 ns->dev->name, ns->irq);424 ddf_dev_get_name(ns->dev), ns->irq); 417 425 break; 418 426 … … 421 429 if (res->res.io_range.size < REG_COUNT) { 422 430 ddf_msg(LVL_ERROR, "I/O range assigned to " 423 "device %s is too small.", ns->dev->name);431 "device %s is too small.", ddf_dev_get_name(ns->dev)); 424 432 ret = ELIMIT; 425 433 goto failed; … … 427 435 ioport = true; 428 436 ddf_msg(LVL_NOTE, "Device %s was asigned I/O address = " 429 "0x%x.", ns->dev->name, ns->io_addr);437 "0x%x.", ddf_dev_get_name(ns->dev), ns->io_addr); 430 438 break; 431 439 … … 437 445 if (!irq || !ioport) { 438 446 ddf_msg(LVL_ERROR, "Missing HW resource(s) for device %s.", 439 ns->dev->name);447 ddf_dev_get_name(ns->dev)); 440 448 ret = ENOENT; 441 449 goto failed; … … 460 468 { 461 469 /* Interrupt when data received. */ 462 pio_write_8(®s->ier, NS8250_IER_RXREADY );470 pio_write_8(®s->ier, NS8250_IER_RXREADY | NS8250_IER_RXSTATUS); 463 471 pio_write_8(®s->mcr, NS8250_MCR_DTR | NS8250_MCR_RTS 464 472 | NS8250_MCR_OUT2); … … 499 507 async_exchange_end(exch); 500 508 509 /* Read LSR to clear possible previous LSR interrupt */ 510 pio_read_8(&ns->regs->lsr); 511 501 512 /* Enable interrupt on the serial port. */ 502 513 ns8250_port_interrupts_enable(ns->regs); … … 602 613 *parity = ((val >> NS8250_LCR_PARITY) & 7); 603 614 615 /* Silence warnings */ 616 *word_length = 0; 617 604 618 switch (val & 3) { 605 619 case WORD_LENGTH_5: … … 695 709 /* 8 bits, no parity, two stop bits. */ 696 710 ns8250_port_set_com_props(ns->regs, SERIAL_NO_PARITY, 8, 2); 697 /* Enable FIFO, clear them, with 14-byte threshold. */ 711 /* 712 * Enable FIFO, clear them, with 4-byte threshold for greater 713 * reliability. 714 */ 698 715 pio_write_8(&ns->regs->iid, NS8250_FCR_FIFOENABLE 699 | NS8250_FCR_RXFIFORESET | NS8250_FCR_TXFIFORESET 700 | NS8250_FCR_RXTRIGGERLOW | NS8250_FCR_RXTRIGGERHI);716 | NS8250_FCR_RXFIFORESET | NS8250_FCR_TXFIFORESET 717 | NS8250_FCR_RXTRIGGERLOW); 701 718 /* 702 719 * RTS/DSR set (Request to Send and Data Terminal Ready lines enabled), … … 731 748 bool cont = true; 732 749 750 fibril_mutex_lock(&ns->mutex); 733 751 while (cont) { 734 fibril_mutex_lock(&ns->mutex);735 736 752 cont = ns8250_received(regs); 737 753 if (cont) { … … 739 755 740 756 if (ns->client_connected) { 757 bool buf_was_empty = buf_is_empty(&ns->input_buffer); 741 758 if (!buf_push_back(&ns->input_buffer, val)) { 742 759 ddf_msg(LVL_WARN, "Buffer overflow on " 743 "%s.", ns->dev->name); 760 "%s.", ddf_dev_get_name(ns->dev)); 761 break; 744 762 } else { 745 763 ddf_msg(LVL_DEBUG2, "Character %c saved " 746 764 "to the buffer of %s.", 747 val, ns->dev->name); 765 val, ddf_dev_get_name(ns->dev)); 766 if (buf_was_empty) 767 fibril_condvar_broadcast(&ns->input_buffer_available); 748 768 } 749 769 } 750 770 } 751 752 fibril_mutex_unlock(&ns->mutex); 753 fibril_yield(); 754 } 771 } 772 fibril_mutex_unlock(&ns->mutex); 773 fibril_yield(); 755 774 } 756 775 757 776 /** The interrupt handler. 758 777 * 759 * The serial port is initialized to interrupt when some data come, so the 760 * interrupt is handled by reading the incomming data. 778 * The serial port is initialized to interrupt when some data come or line 779 * status register changes, so the interrupt is handled by reading the incoming 780 * data and reading the line status register. 761 781 * 762 782 * @param dev The serial port device. … … 765 785 ipc_call_t *icall) 766 786 { 767 ns8250_read_from_device(NS8250_FROM_DEV(dev)); 787 ns8250_t *ns = dev_ns8250(dev); 788 789 uint8_t iir = pio_read_8(&ns->regs->iid); 790 if ((iir & NS8250_IID_CAUSE_MASK) == NS8250_IID_CAUSE_RXSTATUS) { 791 uint8_t lsr = pio_read_8(&ns->regs->lsr); 792 if (lsr & NS8250_LSR_OE) { 793 ddf_msg(LVL_WARN, "Overrun error on %s", ddf_dev_get_name(ns->dev)); 794 } 795 } 796 797 ns8250_read_from_device(ns); 768 798 } 769 799 … … 801 831 802 832 ddf_msg(LVL_DEBUG, "ns8250_dev_add %s (handle = %d)", 803 d ev->name, (int) dev->handle);833 ddf_dev_get_name(dev), (int) ddf_dev_get_handle(dev)); 804 834 805 835 /* Allocate soft-state for the device */ … … 811 841 812 842 fibril_mutex_initialize(&ns->mutex); 843 fibril_condvar_initialize(&ns->input_buffer_available); 813 844 ns->dev = dev; 814 845 … … 855 886 856 887 /* Set device operations. */ 857 fun->ops = &ns8250_dev_ops;888 ddf_fun_set_ops(fun, &ns8250_dev_ops); 858 889 rc = ddf_fun_bind(fun); 859 890 if (rc != EOK) { … … 867 898 868 899 ddf_msg(LVL_NOTE, "Device %s successfully initialized.", 869 d ev->name);900 ddf_dev_get_name(dev)); 870 901 871 902 return EOK; … … 880 911 static int ns8250_dev_remove(ddf_dev_t *dev) 881 912 { 882 ns8250_t *ns = NS8250_FROM_DEV(dev);913 ns8250_t *ns = dev_ns8250(dev); 883 914 int rc; 884 915 … … 914 945 static int ns8250_open(ddf_fun_t *fun) 915 946 { 916 ns8250_t *ns = NS8250(fun);947 ns8250_t *ns = fun_ns8250(fun); 917 948 int res; 918 949 … … 940 971 static void ns8250_close(ddf_fun_t *fun) 941 972 { 942 ns8250_t *data = (ns8250_t *) fun->dev->driver_data;973 ns8250_t *data = fun_ns8250(fun); 943 974 944 975 fibril_mutex_lock(&data->mutex); … … 965 996 unsigned int *word_length, unsigned int* stop_bits) 966 997 { 967 ns8250_t *data = (ns8250_t *) dev->driver_data;998 ns8250_t *data = dev_ns8250(dev); 968 999 ns8250_regs_t *regs = data->regs; 969 1000 … … 996 1027 stop_bits); 997 1028 998 ns8250_t *data = (ns8250_t *) dev->driver_data;1029 ns8250_t *data = dev_ns8250(dev); 999 1030 ns8250_regs_t *regs = data->regs; 1000 1031 int ret; … … 1025 1056 switch (method) { 1026 1057 case SERIAL_GET_COM_PROPS: 1027 ns8250_get_props( fun->dev, &baud_rate, &parity, &word_length,1058 ns8250_get_props(ddf_fun_get_dev(fun), &baud_rate, &parity, &word_length, 1028 1059 &stop_bits); 1029 1060 async_answer_4(callid, EOK, baud_rate, parity, word_length, … … 1036 1067 word_length = IPC_GET_ARG3(*call); 1037 1068 stop_bits = IPC_GET_ARG4(*call); 1038 ret = ns8250_set_props( fun->dev, baud_rate, parity, word_length,1069 ret = ns8250_set_props(ddf_fun_get_dev(fun), baud_rate, parity, word_length, 1039 1070 stop_bits); 1040 1071 async_answer_0(callid, ret); … … 1053 1084 static void ns8250_init(void) 1054 1085 { 1055 ddf_log_init(NAME, LVL_ ERROR);1086 ddf_log_init(NAME, LVL_WARN); 1056 1087 1057 1088 ns8250_dev_ops.open = &ns8250_open; -
uspace/drv/char/ps2mouse/main.c
rbd29f9c9 rbeb9336 98 98 99 99 ddf_msg(LVL_NOTE, "Controlling '%s' (%" PRIun ").", 100 d evice->name, device->handle);100 ddf_dev_get_name(device), ddf_dev_get_handle(device)); 101 101 return EOK; 102 102 } -
uspace/drv/char/ps2mouse/ps2mouse.c
rbd29f9c9 rbeb9336 35 35 #include <bool.h> 36 36 #include <errno.h> 37 #include <devman.h>38 37 #include <ddf/log.h> 39 38 #include <io/keycode.h> … … 76 75 const ssize_t size = chardev_read(sess, &data, 1); \ 77 76 if (size != 1) { \ 78 ddf_msg(LVL_ERROR, "Failed reading byte: % d)", size);\77 ddf_msg(LVL_ERROR, "Failed reading byte: %zd)", size);\ 79 78 return size < 0 ? size : EIO; \ 80 79 } \ … … 114 113 int ps2_mouse_init(ps2_mouse_t *mouse, ddf_dev_t *dev) 115 114 { 116 assert(mouse);117 assert(dev);118 115 mouse->client_sess = NULL; 119 mouse->parent_sess = devman_parent_device_connect(EXCHANGE_SERIALIZE, 120 dev->handle, IPC_FLAG_BLOCKING); 116 mouse->parent_sess = ddf_dev_parent_sess_create(dev, EXCHANGE_SERIALIZE); 121 117 if (!mouse->parent_sess) 122 118 return ENOMEM; … … 124 120 mouse->mouse_fun = ddf_fun_create(dev, fun_exposed, "mouse"); 125 121 if (!mouse->mouse_fun) { 126 async_hangup(mouse->parent_sess); 127 return ENOMEM; 128 } 129 mouse->mouse_fun->ops = &mouse_ops; 130 mouse->mouse_fun->driver_data = mouse; 122 return ENOMEM; 123 } 124 ddf_fun_set_ops(mouse->mouse_fun, &mouse_ops); 131 125 132 126 int ret = ddf_fun_bind(mouse->mouse_fun); 133 127 if (ret != EOK) { 134 async_hangup(mouse->parent_sess);135 mouse->mouse_fun->driver_data = NULL;136 128 ddf_fun_destroy(mouse->mouse_fun); 137 129 return ENOMEM; … … 140 132 ret = ddf_fun_add_to_category(mouse->mouse_fun, "mouse"); 141 133 if (ret != EOK) { 142 async_hangup(mouse->parent_sess);143 134 ddf_fun_unbind(mouse->mouse_fun); 144 mouse->mouse_fun->driver_data = NULL;145 135 ddf_fun_destroy(mouse->mouse_fun); 146 136 return ENOMEM; … … 161 151 ddf_msg(LVL_ERROR, "Failed to enable data reporting."); 162 152 async_exchange_end(exch); 163 async_hangup(mouse->parent_sess);164 153 ddf_fun_unbind(mouse->mouse_fun); 165 mouse->mouse_fun->driver_data = NULL;166 154 ddf_fun_destroy(mouse->mouse_fun); 167 155 return EIO; … … 173 161 ddf_msg(LVL_ERROR, "Failed to confirm data reporting: %hhx.", 174 162 report); 175 async_hangup(mouse->parent_sess);176 163 ddf_fun_unbind(mouse->mouse_fun); 177 mouse->mouse_fun->driver_data = NULL;178 164 ddf_fun_destroy(mouse->mouse_fun); 179 165 return EIO; … … 182 168 mouse->polling_fibril = fibril_create(polling_f, mouse); 183 169 if (!mouse->polling_fibril) { 184 async_hangup(mouse->parent_sess);185 170 ddf_fun_unbind(mouse->mouse_fun); 186 mouse->mouse_fun->driver_data = NULL;187 171 ddf_fun_destroy(mouse->mouse_fun); 188 172 return ENOMEM; … … 368 352 ipc_callid_t icallid, ipc_call_t *icall) 369 353 { 370 if (fun == NULL || fun->driver_data == NULL) {371 ddf_msg(LVL_ERROR, "%s: Missing parameter.", __FUNCTION__);372 async_answer_0(icallid, EINVAL);373 return;374 }375 376 354 const sysarg_t method = IPC_GET_IMETHOD(*icall); 377 ps2_mouse_t *mouse = fun->driver_data;355 ps2_mouse_t *mouse = ddf_dev_data_get(ddf_fun_get_dev(fun)); 378 356 379 357 switch (method) { -
uspace/drv/char/xtkbd/main.c
rbd29f9c9 rbeb9336 98 98 99 99 ddf_msg(LVL_NOTE, "Controlling '%s' (%" PRIun ").", 100 d evice->name, device->handle);100 ddf_dev_get_name(device), ddf_dev_get_handle(device)); 101 101 return EOK; 102 102 } -
uspace/drv/char/xtkbd/xtkbd.c
rbd29f9c9 rbeb9336 34 34 35 35 #include <errno.h> 36 #include <devman.h>37 36 #include <ddf/log.h> 38 37 #include <io/keycode.h> … … 207 206 assert(dev); 208 207 kbd->client_sess = NULL; 209 kbd->parent_sess = devman_parent_device_connect(EXCHANGE_SERIALIZE, 210 dev->handle, IPC_FLAG_BLOCKING); 208 kbd->parent_sess = ddf_dev_parent_sess_create(dev, EXCHANGE_SERIALIZE); 211 209 if (!kbd->parent_sess) 212 210 return ENOMEM; … … 214 212 kbd->kbd_fun = ddf_fun_create(dev, fun_exposed, "kbd"); 215 213 if (!kbd->kbd_fun) { 216 async_hangup(kbd->parent_sess); 217 return ENOMEM; 218 } 219 kbd->kbd_fun->ops = &kbd_ops; 220 kbd->kbd_fun->driver_data = kbd; 214 return ENOMEM; 215 } 216 ddf_fun_set_ops(kbd->kbd_fun, &kbd_ops); 221 217 222 218 int ret = ddf_fun_bind(kbd->kbd_fun); 223 219 if (ret != EOK) { 224 async_hangup(kbd->parent_sess);225 kbd->kbd_fun->driver_data = NULL;226 220 ddf_fun_destroy(kbd->kbd_fun); 227 221 return ENOMEM; … … 230 224 ret = ddf_fun_add_to_category(kbd->kbd_fun, "keyboard"); 231 225 if (ret != EOK) { 232 async_hangup(kbd->parent_sess);233 226 ddf_fun_unbind(kbd->kbd_fun); 234 kbd->kbd_fun->driver_data = NULL;235 227 ddf_fun_destroy(kbd->kbd_fun); 236 228 return ENOMEM; … … 239 231 kbd->polling_fibril = fibril_create(polling, kbd); 240 232 if (!kbd->polling_fibril) { 241 async_hangup(kbd->parent_sess);242 233 ddf_fun_unbind(kbd->kbd_fun); 243 kbd->kbd_fun->driver_data = NULL;244 234 ddf_fun_destroy(kbd->kbd_fun); 245 235 return ENOMEM; … … 319 309 ipc_callid_t icallid, ipc_call_t *icall) 320 310 { 321 if (fun == NULL || fun->driver_data == NULL) {322 ddf_msg(LVL_ERROR, "%s: Missing parameter.", __FUNCTION__);323 async_answer_0(icallid, EINVAL);324 return;325 }326 327 311 const sysarg_t method = IPC_GET_IMETHOD(*icall); 328 xt_kbd_t *kbd = fun->driver_data;312 xt_kbd_t *kbd = ddf_dev_data_get(ddf_fun_get_dev(fun)); 329 313 330 314 switch (method) {
Note:
See TracChangeset
for help on using the changeset viewer.
