Changeset 0851a3d in mainline
- Timestamp:
- 2017-11-24T08:19:31Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- ac307b2
- Parents:
- e7588a8
- Location:
- uspace/drv/char/i8042
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/char/i8042/i8042.c
re7588a8 r0851a3d 136 136 const uint8_t data = IPC_GET_ARG2(*call); 137 137 138 circ_buf_t *cbuf = (status & i8042_AUX_DATA) ?139 &controller->aux_buffer : &controller->kbd_buffer;140 138 i8042_port_t *port = (status & i8042_AUX_DATA) ? 141 139 controller->aux : controller->kbd; … … 143 141 fibril_mutex_lock(&port->buf_lock); 144 142 145 rc = circ_buf_push( cbuf, &data);143 rc = circ_buf_push(&port->cbuf, &data); 146 144 if (rc != EOK) 147 145 ddf_msg(LVL_ERROR, "Buffer overrun"); … … 170 168 const size_t cmd_count = sizeof(i8042_cmds) / sizeof(irq_cmd_t); 171 169 irq_cmd_t cmds[cmd_count]; 170 ddf_fun_t *kbd_fun; 171 ddf_fun_t *aux_fun; 172 172 i8042_regs_t *ar; 173 173 174 174 int rc; 175 175 bool kbd_bound = false; 176 176 bool aux_bound = false; 177 178 dev->kbd_fun = NULL;179 dev->aux_fun = NULL;180 177 181 178 if (regs->size < sizeof(i8042_regs_t)) { … … 189 186 } 190 187 191 dev->kbd_fun = ddf_fun_create(ddf_dev, fun_inner, "ps2a");192 if ( dev->kbd_fun == NULL) {188 kbd_fun = ddf_fun_create(ddf_dev, fun_inner, "ps2a"); 189 if (kbd_fun == NULL) { 193 190 rc = ENOMEM; 194 191 goto error; 195 192 }; 196 193 197 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)); 198 195 if (dev->kbd == NULL) { 199 196 rc = ENOMEM; … … 201 198 } 202 199 200 dev->kbd->fun = kbd_fun; 203 201 dev->kbd->ctl = dev; 204 202 chardev_srvs_init(&dev->kbd->cds); … … 208 206 fibril_condvar_initialize(&dev->kbd->buf_cv); 209 207 210 rc = ddf_fun_add_match_id(dev->kbd _fun, "char/xtkbd", 90);208 rc = ddf_fun_add_match_id(dev->kbd->fun, "char/xtkbd", 90); 211 209 if (rc != EOK) 212 210 goto error; 213 211 214 dev->aux_fun = ddf_fun_create(ddf_dev, fun_inner, "ps2b");215 if ( dev->aux_fun == NULL) {212 aux_fun = ddf_fun_create(ddf_dev, fun_inner, "ps2b"); 213 if (aux_fun == NULL) { 216 214 rc = ENOMEM; 217 215 goto error; 218 216 } 219 217 220 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)); 221 219 if (dev->aux == NULL) { 222 220 rc = ENOMEM; … … 224 222 } 225 223 224 dev->aux->fun = aux_fun; 226 225 dev->aux->ctl = dev; 227 226 chardev_srvs_init(&dev->aux->cds); … … 231 230 fibril_condvar_initialize(&dev->aux->buf_cv); 232 231 233 rc = ddf_fun_add_match_id(dev->aux _fun, "char/ps2mouse", 90);232 rc = ddf_fun_add_match_id(dev->aux->fun, "char/ps2mouse", 90); 234 233 if (rc != EOK) 235 234 goto error; 236 235 237 ddf_fun_set_conn_handler(dev->kbd _fun, i8042_char_conn);238 ddf_fun_set_conn_handler(dev->aux _fun, i8042_char_conn);239 240 circ_buf_init(&dev->kbd _buffer, dev->kbd_data, BUFFER_SIZE, 1);241 circ_buf_init(&dev->aux _buffer, dev->aux_data, BUFFER_SIZE, 1);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); 242 241 fibril_mutex_initialize(&dev->write_guard); 243 242 244 rc = ddf_fun_bind(dev->kbd _fun);243 rc = ddf_fun_bind(dev->kbd->fun); 245 244 if (rc != EOK) { 246 245 ddf_msg(LVL_ERROR, "Failed to bind keyboard function: %s.", 247 ddf_fun_get_name(dev->kbd _fun));246 ddf_fun_get_name(dev->kbd->fun)); 248 247 goto error; 249 248 } 250 249 kbd_bound = true; 251 250 252 rc = ddf_fun_bind(dev->aux _fun);251 rc = ddf_fun_bind(dev->aux->fun); 253 252 if (rc != EOK) { 254 253 ddf_msg(LVL_ERROR, "Failed to bind aux function: %s.", 255 ddf_fun_get_name(dev->aux _fun));254 ddf_fun_get_name(dev->aux->fun)); 256 255 goto error; 257 256 } … … 332 331 error: 333 332 if (kbd_bound) 334 ddf_fun_unbind(dev->kbd _fun);333 ddf_fun_unbind(dev->kbd->fun); 335 334 if (aux_bound) 336 ddf_fun_unbind(dev->aux _fun);337 if (dev->kbd _fun != NULL)338 ddf_fun_destroy(dev->kbd _fun);339 if (dev->aux _fun != NULL)340 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); 341 340 342 341 return rc; … … 393 392 i8042_port_t *port = (i8042_port_t *)srv->srvs->sarg; 394 393 size_t p; 395 i8042_t *i8042 = port->ctl;396 394 uint8_t *destp = (uint8_t *)dest; 397 395 int rc; 398 396 399 circ_buf_t *cbuf = (port == i8042->aux) ?400 &i8042->aux_buffer : &i8042->kbd_buffer;401 402 397 fibril_mutex_lock(&port->buf_lock); 403 398 404 while (circ_buf_nused( cbuf) == 0)399 while (circ_buf_nused(&port->cbuf) == 0) 405 400 fibril_condvar_wait(&port->buf_cv, &port->buf_lock); 406 401 407 402 p = 0; 408 403 while (p < size) { 409 rc = circ_buf_pop( cbuf, &destp[p]);404 rc = circ_buf_pop(&port->cbuf, &destp[p]); 410 405 if (rc != EOK) 411 406 break; -
uspace/drv/char/i8042/i8042.h
re7588a8 r0851a3d 2 2 * Copyright (c) 2006 Josef Cejka 3 3 * Copyright (c) 2011 Jan Vesely 4 * Copyright (c) 2017 Jiri Svoboda 4 5 * All rights reserved. 5 6 * … … 59 60 /** i8042 Port. */ 60 61 typedef struct { 61 struct i8042 *ctl; /**< Controller */ 62 chardev_srvs_t cds; /**< Character device server data */ 63 fibril_mutex_t buf_lock; /**< Protect buffer */ 64 fibril_condvar_t buf_cv; /**< Signal new data in buffer */ 62 /** Controller */ 63 struct i8042 *ctl; 64 /** Device function */ 65 ddf_fun_t *fun; 66 /** Character device server data */ 67 chardev_srvs_t cds; 68 /** Circular buffer */ 69 circ_buf_t cbuf; 70 /** Buffer data space */ 71 uint8_t buf_data[BUFFER_SIZE]; 72 /** Protect buffer */ 73 fibril_mutex_t buf_lock; 74 /** Signal new data in buffer */ 75 fibril_condvar_t buf_cv; 65 76 } i8042_port_t; 66 77 67 78 /** i8042 Controller. */ 68 79 typedef struct i8042 { 69 i8042_regs_t *regs; /**< I/O registers. */ 70 ddf_fun_t *kbd_fun; /**< Pirmary port device function. */ 71 ddf_fun_t *aux_fun; /**< Auxiliary port device function. */ 72 circ_buf_t kbd_buffer; /**< Primary port buffer. */ 73 circ_buf_t aux_buffer; /**< Aux. port buffer. */ 74 uint8_t aux_data[BUFFER_SIZE]; /**< Primary port buffer space. */ 75 uint8_t kbd_data[BUFFER_SIZE]; /**< Aux. port buffer space. */ 80 /**< I/O registers. */ 81 i8042_regs_t *regs; 82 /** Keyboard port */ 76 83 i8042_port_t *kbd; 84 /** AUX port */ 77 85 i8042_port_t *aux; 78 fibril_mutex_t write_guard; /**< Prevents simultanous port writes.*/ 86 /** Prevents simultanous port writes.*/ 87 fibril_mutex_t write_guard; 79 88 } i8042_t; 80 81 89 82 90 extern int i8042_init(i8042_t *, addr_range_t *, int, int, ddf_dev_t *);
Note:
See TracChangeset
for help on using the changeset viewer.