Changes in uspace/drv/char/i8042/i8042.c [5a6cc679:a35b458] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/char/i8042/i8042.c
r5a6cc679 ra35b458 130 130 i8042_t *controller = ddf_dev_data_get(dev); 131 131 errno_t rc; 132 132 133 133 const uint8_t status = IPC_GET_ARG1(*call); 134 134 const uint8_t data = IPC_GET_ARG2(*call); 135 135 136 136 i8042_port_t *port = (status & i8042_AUX_DATA) ? 137 137 controller->aux : controller->kbd; 138 138 139 139 fibril_mutex_lock(&port->buf_lock); 140 140 141 141 rc = circ_buf_push(&port->cbuf, &data); 142 142 if (rc != EOK) … … 169 169 ddf_fun_t *aux_fun; 170 170 i8042_regs_t *ar; 171 171 172 172 errno_t rc; 173 173 bool kbd_bound = false; 174 174 bool aux_bound = false; 175 175 176 176 if (regs->size < sizeof(i8042_regs_t)) { 177 177 rc = EINVAL; 178 178 goto error; 179 179 } 180 180 181 181 if (pio_enable_range(regs, (void **) &dev->regs) != 0) { 182 182 rc = EIO; 183 183 goto error; 184 184 } 185 185 186 186 kbd_fun = ddf_fun_create(ddf_dev, fun_inner, "ps2a"); 187 187 if (kbd_fun == NULL) { … … 189 189 goto error; 190 190 }; 191 191 192 192 dev->kbd = ddf_fun_data_alloc(kbd_fun, sizeof(i8042_port_t)); 193 193 if (dev->kbd == NULL) { … … 195 195 goto error; 196 196 } 197 197 198 198 dev->kbd->fun = kbd_fun; 199 199 dev->kbd->ctl = dev; … … 203 203 fibril_mutex_initialize(&dev->kbd->buf_lock); 204 204 fibril_condvar_initialize(&dev->kbd->buf_cv); 205 205 206 206 rc = ddf_fun_add_match_id(dev->kbd->fun, "char/xtkbd", 90); 207 207 if (rc != EOK) 208 208 goto error; 209 209 210 210 aux_fun = ddf_fun_create(ddf_dev, fun_inner, "ps2b"); 211 211 if (aux_fun == NULL) { … … 213 213 goto error; 214 214 } 215 215 216 216 dev->aux = ddf_fun_data_alloc(aux_fun, sizeof(i8042_port_t)); 217 217 if (dev->aux == NULL) { … … 219 219 goto error; 220 220 } 221 221 222 222 dev->aux->fun = aux_fun; 223 223 dev->aux->ctl = dev; … … 227 227 fibril_mutex_initialize(&dev->aux->buf_lock); 228 228 fibril_condvar_initialize(&dev->aux->buf_cv); 229 229 230 230 rc = ddf_fun_add_match_id(dev->aux->fun, "char/ps2mouse", 90); 231 231 if (rc != EOK) 232 232 goto error; 233 233 234 234 ddf_fun_set_conn_handler(dev->kbd->fun, i8042_char_conn); 235 235 ddf_fun_set_conn_handler(dev->aux->fun, i8042_char_conn); 236 236 237 237 circ_buf_init(&dev->kbd->cbuf, dev->kbd->buf_data, BUFFER_SIZE, 1); 238 238 circ_buf_init(&dev->aux->cbuf, dev->aux->buf_data, BUFFER_SIZE, 1); 239 239 fibril_mutex_initialize(&dev->write_guard); 240 240 241 241 rc = ddf_fun_bind(dev->kbd->fun); 242 242 if (rc != EOK) { … … 246 246 } 247 247 kbd_bound = true; 248 248 249 249 rc = ddf_fun_bind(dev->aux->fun); 250 250 if (rc != EOK) { … … 254 254 } 255 255 aux_bound = true; 256 256 257 257 /* Disable kbd and aux */ 258 258 wait_ready(dev); … … 260 260 wait_ready(dev); 261 261 pio_write_8(&dev->regs->data, i8042_KBD_DISABLE | i8042_AUX_DISABLE); 262 262 263 263 /* Flush all current IO */ 264 264 while (pio_read_8(&dev->regs->status) & i8042_OUTPUT_FULL) … … 280 280 .cmds = cmds 281 281 }; 282 282 283 283 int irq_kbd_cap; 284 284 rc = register_interrupt_handler(ddf_dev, irq_kbd, … … 289 289 goto error; 290 290 } 291 291 292 292 int irq_mouse_cap; 293 293 rc = register_interrupt_handler(ddf_dev, irq_mouse, … … 298 298 goto error; 299 299 } 300 300 301 301 /* Enable interrupts */ 302 302 async_sess_t *parent_sess = ddf_dev_parent_sess_get(ddf_dev); 303 303 assert(parent_sess != NULL); 304 304 305 305 rc = hw_res_enable_interrupt(parent_sess, irq_kbd); 306 306 if (rc != EOK) { … … 318 318 goto error; 319 319 } 320 320 321 321 /* Enable port interrupts. */ 322 322 wait_ready(dev); … … 325 325 pio_write_8(&dev->regs->data, i8042_KBD_IE | i8042_KBD_TRANSLATE | 326 326 i8042_AUX_IE); 327 327 328 328 return EOK; 329 329 error: … … 356 356 i8042_t *i8042 = port->ctl; 357 357 const char *dp = (const char *)data; 358 358 359 359 fibril_mutex_lock(&i8042->write_guard); 360 360 361 361 for (size_t i = 0; i < size; ++i) { 362 362 if (port == i8042->aux) { … … 365 365 i8042_CMD_WRITE_AUX); 366 366 } 367 367 368 368 wait_ready(i8042); 369 369 pio_write_8(&i8042->regs->data, dp[i]); 370 370 } 371 371 372 372 fibril_mutex_unlock(&i8042->write_guard); 373 373 *nwr = size; … … 392 392 uint8_t *destp = (uint8_t *)dest; 393 393 errno_t rc; 394 394 395 395 fibril_mutex_lock(&port->buf_lock); 396 396 397 397 while (circ_buf_nused(&port->cbuf) == 0) 398 398 fibril_condvar_wait(&port->buf_cv, &port->buf_lock);
Note:
See TracChangeset
for help on using the changeset viewer.