Changeset ac307b2 in mainline for uspace/drv/char/i8042/i8042.c
- Timestamp:
- 2017-11-25T11:12:23Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 98cb5e0d
- Parents:
- f571ca49 (diff), 0851a3d (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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/char/i8042/i8042.c
rf571ca49 rac307b2 2 2 * Copyright (c) 2001-2004 Jakub Jermar 3 3 * Copyright (c) 2006 Josef Cejka 4 * Copyright (c) 201 4Jiri Svoboda4 * Copyright (c) 2017 Jiri Svoboda 5 5 * Copyright (c) 2011 Jan Vesely 6 6 * All rights reserved. … … 39 39 */ 40 40 41 #include <adt/circ_buf.h> 41 42 #include <ddf/log.h> 42 43 #include <ddf/interrupt.h> … … 130 131 { 131 132 i8042_t *controller = ddf_dev_data_get(dev); 133 int rc; 132 134 133 135 const uint8_t status = IPC_GET_ARG1(*call); 134 136 const uint8_t data = IPC_GET_ARG2(*call); 135 137 136 buffer_t *buffer = (status & i8042_AUX_DATA) ? 137 &controller->aux_buffer : &controller->kbd_buffer; 138 139 buffer_write(buffer, data); 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); 140 149 } 141 150 … … 159 168 const size_t cmd_count = sizeof(i8042_cmds) / sizeof(irq_cmd_t); 160 169 irq_cmd_t cmds[cmd_count]; 170 ddf_fun_t *kbd_fun; 171 ddf_fun_t *aux_fun; 161 172 i8042_regs_t *ar; 162 173 163 174 int rc; 164 175 bool kbd_bound = false; 165 176 bool aux_bound = false; 166 167 dev->kbd_fun = NULL;168 dev->aux_fun = NULL;169 177 170 178 if (regs->size < sizeof(i8042_regs_t)) { … … 178 186 } 179 187 180 dev->kbd_fun = ddf_fun_create(ddf_dev, fun_inner, "ps2a");181 if ( dev->kbd_fun == NULL) {188 kbd_fun = ddf_fun_create(ddf_dev, fun_inner, "ps2a"); 189 if (kbd_fun == NULL) { 182 190 rc = ENOMEM; 183 191 goto error; 184 192 }; 185 193 186 dev->kbd = ddf_fun_data_alloc( dev->kbd_fun, sizeof(i8042_port_t));194 dev->kbd = ddf_fun_data_alloc(kbd_fun, sizeof(i8042_port_t)); 187 195 if (dev->kbd == NULL) { 188 196 rc = ENOMEM; … … 190 198 } 191 199 200 dev->kbd->fun = kbd_fun; 192 201 dev->kbd->ctl = dev; 193 202 chardev_srvs_init(&dev->kbd->cds); 194 203 dev->kbd->cds.ops = &i8042_chardev_ops; 195 204 dev->kbd->cds.sarg = dev->kbd; 196 197 rc = ddf_fun_add_match_id(dev->kbd_fun, "char/xtkbd", 90); 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); 198 209 if (rc != EOK) 199 210 goto error; 200 211 201 dev->aux_fun = ddf_fun_create(ddf_dev, fun_inner, "ps2b");202 if ( dev->aux_fun == NULL) {212 aux_fun = ddf_fun_create(ddf_dev, fun_inner, "ps2b"); 213 if (aux_fun == NULL) { 203 214 rc = ENOMEM; 204 215 goto error; 205 216 } 206 217 207 dev->aux = ddf_fun_data_alloc( dev->aux_fun, sizeof(i8042_port_t));218 dev->aux = ddf_fun_data_alloc(aux_fun, sizeof(i8042_port_t)); 208 219 if (dev->aux == NULL) { 209 220 rc = ENOMEM; … … 211 222 } 212 223 224 dev->aux->fun = aux_fun; 213 225 dev->aux->ctl = dev; 214 226 chardev_srvs_init(&dev->aux->cds); 215 227 dev->aux->cds.ops = &i8042_chardev_ops; 216 228 dev->aux->cds.sarg = dev->aux; 217 218 rc = ddf_fun_add_match_id(dev->aux_fun, "char/ps2mouse", 90); 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); 219 233 if (rc != EOK) 220 234 goto error; 221 235 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);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); 227 241 fibril_mutex_initialize(&dev->write_guard); 228 242 229 rc = ddf_fun_bind(dev->kbd _fun);243 rc = ddf_fun_bind(dev->kbd->fun); 230 244 if (rc != EOK) { 231 245 ddf_msg(LVL_ERROR, "Failed to bind keyboard function: %s.", 232 ddf_fun_get_name(dev->kbd _fun));246 ddf_fun_get_name(dev->kbd->fun)); 233 247 goto error; 234 248 } 235 249 kbd_bound = true; 236 250 237 rc = ddf_fun_bind(dev->aux _fun);251 rc = ddf_fun_bind(dev->aux->fun); 238 252 if (rc != EOK) { 239 253 ddf_msg(LVL_ERROR, "Failed to bind aux function: %s.", 240 ddf_fun_get_name(dev->aux _fun));254 ddf_fun_get_name(dev->aux->fun)); 241 255 goto error; 242 256 } … … 317 331 error: 318 332 if (kbd_bound) 319 ddf_fun_unbind(dev->kbd _fun);333 ddf_fun_unbind(dev->kbd->fun); 320 334 if (aux_bound) 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);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); 326 340 327 341 return rc; … … 377 391 { 378 392 i8042_port_t *port = (i8042_port_t *)srv->srvs->sarg; 379 i8042_t *i8042 = port->ctl;393 size_t p; 380 394 uint8_t *destp = (uint8_t *)dest; 381 395 int rc; 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); 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]); 389 405 if (rc != EOK) 390 406 break; 391 ++destp; 392 } 393 394 *nread = i; 407 ++p; 408 } 409 410 fibril_mutex_unlock(&port->buf_lock); 411 412 *nread = p; 395 413 return EOK; 396 414 }
Note:
See TracChangeset
for help on using the changeset viewer.