Changes in uspace/drv/char/i8042/i8042.c [0851a3d:677cad5] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/char/i8042/i8042.c
r0851a3d r677cad5 2 2 * Copyright (c) 2001-2004 Jakub Jermar 3 3 * Copyright (c) 2006 Josef Cejka 4 * Copyright (c) 201 7Jiri Svoboda4 * Copyright (c) 2014 Jiri Svoboda 5 5 * Copyright (c) 2011 Jan Vesely 6 6 * All rights reserved. … … 39 39 */ 40 40 41 #include <adt/circ_buf.h>42 41 #include <ddf/log.h> 43 42 #include <ddf/interrupt.h> … … 131 130 { 132 131 i8042_t *controller = ddf_dev_data_get(dev); 133 int rc;134 132 135 133 const uint8_t status = IPC_GET_ARG1(*call); 136 134 const uint8_t data = IPC_GET_ARG2(*call); 137 135 138 i8042_port_t *port = (status & i8042_AUX_DATA) ? 139 controller->aux : controller->kbd; 140 141 fibril_mutex_lock(&port->buf_lock); 142 143 rc = circ_buf_push(&port->cbuf, &data); 144 if (rc != EOK) 145 ddf_msg(LVL_ERROR, "Buffer overrun"); 146 147 fibril_mutex_unlock(&port->buf_lock); 148 fibril_condvar_broadcast(&port->buf_cv); 136 buffer_t *buffer = (status & i8042_AUX_DATA) ? 137 &controller->aux_buffer : &controller->kbd_buffer; 138 139 buffer_write(buffer, data); 149 140 } 150 141 … … 168 159 const size_t cmd_count = sizeof(i8042_cmds) / sizeof(irq_cmd_t); 169 160 irq_cmd_t cmds[cmd_count]; 170 ddf_fun_t *kbd_fun;171 ddf_fun_t *aux_fun;172 161 i8042_regs_t *ar; 173 162 174 163 int rc; 175 164 bool kbd_bound = false; 176 165 bool aux_bound = false; 166 167 dev->kbd_fun = NULL; 168 dev->aux_fun = NULL; 177 169 178 170 if (regs->size < sizeof(i8042_regs_t)) { … … 186 178 } 187 179 188 kbd_fun = ddf_fun_create(ddf_dev, fun_inner, "ps2a");189 if ( kbd_fun == NULL) {180 dev->kbd_fun = ddf_fun_create(ddf_dev, fun_inner, "ps2a"); 181 if (dev->kbd_fun == NULL) { 190 182 rc = ENOMEM; 191 183 goto error; 192 184 }; 193 185 194 dev->kbd = ddf_fun_data_alloc( kbd_fun, sizeof(i8042_port_t));186 dev->kbd = ddf_fun_data_alloc(dev->kbd_fun, sizeof(i8042_port_t)); 195 187 if (dev->kbd == NULL) { 196 188 rc = ENOMEM; … … 198 190 } 199 191 200 dev->kbd->fun = kbd_fun;201 192 dev->kbd->ctl = dev; 202 193 chardev_srvs_init(&dev->kbd->cds); 203 194 dev->kbd->cds.ops = &i8042_chardev_ops; 204 195 dev->kbd->cds.sarg = dev->kbd; 205 fibril_mutex_initialize(&dev->kbd->buf_lock); 206 fibril_condvar_initialize(&dev->kbd->buf_cv); 207 208 rc = ddf_fun_add_match_id(dev->kbd->fun, "char/xtkbd", 90); 196 197 rc = ddf_fun_add_match_id(dev->kbd_fun, "char/xtkbd", 90); 209 198 if (rc != EOK) 210 199 goto error; 211 200 212 aux_fun = ddf_fun_create(ddf_dev, fun_inner, "ps2b");213 if ( aux_fun == NULL) {201 dev->aux_fun = ddf_fun_create(ddf_dev, fun_inner, "ps2b"); 202 if (dev->aux_fun == NULL) { 214 203 rc = ENOMEM; 215 204 goto error; 216 205 } 217 206 218 dev->aux = ddf_fun_data_alloc( aux_fun, sizeof(i8042_port_t));207 dev->aux = ddf_fun_data_alloc(dev->aux_fun, sizeof(i8042_port_t)); 219 208 if (dev->aux == NULL) { 220 209 rc = ENOMEM; … … 222 211 } 223 212 224 dev->aux->fun = aux_fun;225 213 dev->aux->ctl = dev; 226 214 chardev_srvs_init(&dev->aux->cds); 227 215 dev->aux->cds.ops = &i8042_chardev_ops; 228 216 dev->aux->cds.sarg = dev->aux; 229 fibril_mutex_initialize(&dev->aux->buf_lock); 230 fibril_condvar_initialize(&dev->aux->buf_cv); 231 232 rc = ddf_fun_add_match_id(dev->aux->fun, "char/ps2mouse", 90); 217 218 rc = ddf_fun_add_match_id(dev->aux_fun, "char/ps2mouse", 90); 233 219 if (rc != EOK) 234 220 goto error; 235 221 236 ddf_fun_set_conn_handler(dev->kbd ->fun, i8042_char_conn);237 ddf_fun_set_conn_handler(dev->aux ->fun, i8042_char_conn);238 239 circ_buf_init(&dev->kbd->cbuf, dev->kbd->buf_data, BUFFER_SIZE, 1);240 circ_buf_init(&dev->aux->cbuf, dev->aux->buf_data, BUFFER_SIZE, 1);222 ddf_fun_set_conn_handler(dev->kbd_fun, i8042_char_conn); 223 ddf_fun_set_conn_handler(dev->aux_fun, i8042_char_conn); 224 225 buffer_init(&dev->kbd_buffer, dev->kbd_data, BUFFER_SIZE); 226 buffer_init(&dev->aux_buffer, dev->aux_data, BUFFER_SIZE); 241 227 fibril_mutex_initialize(&dev->write_guard); 242 228 243 rc = ddf_fun_bind(dev->kbd ->fun);229 rc = ddf_fun_bind(dev->kbd_fun); 244 230 if (rc != EOK) { 245 231 ddf_msg(LVL_ERROR, "Failed to bind keyboard function: %s.", 246 ddf_fun_get_name(dev->kbd ->fun));232 ddf_fun_get_name(dev->kbd_fun)); 247 233 goto error; 248 234 } 249 235 kbd_bound = true; 250 236 251 rc = ddf_fun_bind(dev->aux ->fun);237 rc = ddf_fun_bind(dev->aux_fun); 252 238 if (rc != EOK) { 253 239 ddf_msg(LVL_ERROR, "Failed to bind aux function: %s.", 254 ddf_fun_get_name(dev->aux ->fun));240 ddf_fun_get_name(dev->aux_fun)); 255 241 goto error; 256 242 } … … 331 317 error: 332 318 if (kbd_bound) 333 ddf_fun_unbind(dev->kbd ->fun);319 ddf_fun_unbind(dev->kbd_fun); 334 320 if (aux_bound) 335 ddf_fun_unbind(dev->aux ->fun);336 if (dev->kbd ->fun != NULL)337 ddf_fun_destroy(dev->kbd ->fun);338 if (dev->aux ->fun != NULL)339 ddf_fun_destroy(dev->aux ->fun);321 ddf_fun_unbind(dev->aux_fun); 322 if (dev->kbd_fun != NULL) 323 ddf_fun_destroy(dev->kbd_fun); 324 if (dev->aux_fun != NULL) 325 ddf_fun_destroy(dev->aux_fun); 340 326 341 327 return rc; … … 391 377 { 392 378 i8042_port_t *port = (i8042_port_t *)srv->srvs->sarg; 393 size_t p;379 i8042_t *i8042 = port->ctl; 394 380 uint8_t *destp = (uint8_t *)dest; 395 381 int rc; 396 397 fibril_mutex_lock(&port->buf_lock); 398 399 while (circ_buf_nused(&port->cbuf) == 0) 400 fibril_condvar_wait(&port->buf_cv, &port->buf_lock); 401 402 p = 0; 403 while (p < size) { 404 rc = circ_buf_pop(&port->cbuf, &destp[p]); 382 size_t i; 383 384 buffer_t *buffer = (port == i8042->aux) ? 385 &i8042->aux_buffer : &i8042->kbd_buffer; 386 387 for (i = 0; i < size; ++i) { 388 rc = buffer_read(buffer, destp, i == 0); 405 389 if (rc != EOK) 406 390 break; 407 ++p; 408 } 409 410 fibril_mutex_unlock(&port->buf_lock); 411 412 *nread = p; 391 ++destp; 392 } 393 394 *nread = i; 413 395 return EOK; 414 396 }
Note:
See TracChangeset
for help on using the changeset viewer.