Changes in uspace/drv/hid/xtkbd/xtkbd.c [c657bd7:d420b22] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/hid/xtkbd/xtkbd.c
rc657bd7 rd420b22 1 1 /* 2 2 * Copyright (c) 2011 Jan Vesely 3 * Copyright (c) 2017 Jiri Svoboda4 3 * All rights reserved. 5 4 * … … 207 206 static int polling(void *arg) 208 207 { 209 xt_kbd_t *kbd = arg; 210 size_t nread; 211 int rc; 208 const xt_kbd_t *kbd = arg; 209 210 assert(kbd); 211 assert(kbd->parent_sess); 212 213 async_exch_t *parent_exch = async_exchange_begin(kbd->parent_sess); 212 214 213 215 while (true) { 216 if (!parent_exch) 217 parent_exch = async_exchange_begin(kbd->parent_sess); 218 214 219 const unsigned int *map = scanmap_simple; 215 220 size_t map_size = sizeof(scanmap_simple) / sizeof(unsigned int); 216 221 217 222 uint8_t code = 0; 218 rc = chardev_read(kbd->chardev, &code, 1, &nread);219 if ( rc != EOK)223 ssize_t size = chardev_read(parent_exch, &code, 1); 224 if (size != 1) 220 225 return EIO; 221 226 … … 229 234 map_size = sizeof(scanmap_e0) / sizeof(unsigned int); 230 235 231 rc = chardev_read(kbd->chardev, &code, 1, &nread);232 if ( rc != EOK)236 size = chardev_read(parent_exch, &code, 1); 237 if (size != 1) 233 238 return EIO; 234 239 … … 236 241 237 242 if (code == 0x2a) { /* Print Screen */ 238 rc = chardev_read(kbd->chardev, &code, 1, &nread);239 if ( rc != EOK)243 size = chardev_read(parent_exch, &code, 1); 244 if (size != 1) 240 245 return EIO; 241 246 … … 243 248 continue; 244 249 245 rc = chardev_read(kbd->chardev, &code, 1, &nread);246 if ( rc != EOK)250 size = chardev_read(parent_exch, &code, 1); 251 if (size != 1) 247 252 return EIO; 248 253 … … 254 259 255 260 if (code == 0x46) { /* Break */ 256 rc = chardev_read(kbd->chardev, &code, 1, &nread);257 if ( rc != EOK)261 size = chardev_read(parent_exch, &code, 1); 262 if (size != 1) 258 263 return EIO; 259 264 … … 261 266 continue; 262 267 263 rc = chardev_read(kbd->chardev, &code, 1, &nread);264 if ( rc != EOK)268 size = chardev_read(parent_exch, &code, 1); 269 if (size != 1) 265 270 return EIO; 266 271 … … 274 279 /* Extended special set */ 275 280 if (code == KBD_SCANCODE_SET_EXTENDED_SPECIAL) { 276 rc = chardev_read(kbd->chardev, &code, 1, &nread);277 if ( rc != EOK)281 size = chardev_read(parent_exch, &code, 1); 282 if (size != 1) 278 283 return EIO; 279 284 … … 281 286 continue; 282 287 283 rc = chardev_read(kbd->chardev, &code, 1, &nread);284 if ( rc != EOK)288 size = chardev_read(parent_exch, &code, 1); 289 if (size != 1) 285 290 return EIO; 286 291 … … 288 293 continue; 289 294 290 rc = chardev_read(kbd->chardev, &code, 1, &nread);291 if ( rc != EOK)295 size = chardev_read(parent_exch, &code, 1); 296 if (size != 1) 292 297 return EIO; 293 298 … … 295 300 continue; 296 301 297 rc = chardev_read(kbd->chardev, &code, 1, &nread);298 if ( rc != EOK)302 size = chardev_read(parent_exch, &code, 1); 303 if (size != 1) 299 304 return EIO; 300 305 … … 302 307 continue; 303 308 304 rc = chardev_read(kbd->chardev, &code, 1, &nread);305 if ( rc != EOK)309 size = chardev_read(parent_exch, &code, 1); 310 if (size != 1) 306 311 return EIO; 307 312 … … 352 357 uint8_t cmds[] = { KBD_CMD_SET_LEDS, status }; 353 358 354 size_t nwr; 355 int rc = chardev_write(kbd->chardev, &cmds[0], 1, &nwr); 356 if (rc != EOK) { 357 async_answer_0(icallid, rc); 358 break; 359 } 360 361 rc = chardev_write(kbd->chardev, &cmds[1], 1, &nwr); 362 async_answer_0(icallid, rc); 359 async_exch_t *exch = async_exchange_begin(kbd->parent_sess); 360 const ssize_t size = chardev_write(exch, cmds, sizeof(cmds)); 361 async_exchange_end(exch); 362 363 async_answer_0(icallid, size < 0 ? size : EOK); 363 364 break; 364 365 } … … 412 413 int xt_kbd_init(xt_kbd_t *kbd, ddf_dev_t *dev) 413 414 { 414 async_sess_t *parent_sess; 415 bool bound = false; 416 int rc; 415 assert(kbd); 416 assert(dev); 417 417 418 418 kbd->client_sess = NULL; 419 420 parent_sess = ddf_dev_parent_sess_get(dev);421 if ( parent_sess == NULL) {419 kbd->parent_sess = ddf_dev_parent_sess_get(dev); 420 421 if (!kbd->parent_sess) { 422 422 ddf_msg(LVL_ERROR, "Failed creating parent session."); 423 rc = EIO; 424 goto error; 425 } 426 427 rc = chardev_open(parent_sess, &kbd->chardev); 428 if (rc != EOK) { 429 ddf_msg(LVL_ERROR, "Failed opening character device."); 430 goto error; 423 return EIO; 431 424 } 432 425 433 426 kbd->kbd_fun = ddf_fun_create(dev, fun_exposed, "kbd"); 434 if ( kbd->kbd_fun == NULL) {427 if (!kbd->kbd_fun) { 435 428 ddf_msg(LVL_ERROR, "Failed creating function 'kbd'."); 436 rc = ENOMEM; 437 goto error; 429 return ENOMEM; 438 430 } 439 431 440 432 ddf_fun_set_ops(kbd->kbd_fun, &kbd_ops); 441 433 442 rc= ddf_fun_bind(kbd->kbd_fun);443 if (r c!= EOK) {434 int ret = ddf_fun_bind(kbd->kbd_fun); 435 if (ret != EOK) { 444 436 ddf_msg(LVL_ERROR, "Failed binding function 'kbd'."); 445 goto error; 446 } 447 448 rc = ddf_fun_add_to_category(kbd->kbd_fun, "keyboard"); 449 if (rc != EOK) { 437 ddf_fun_destroy(kbd->kbd_fun); 438 return EEXIST; 439 } 440 441 ret = ddf_fun_add_to_category(kbd->kbd_fun, "keyboard"); 442 if (ret != EOK) { 450 443 ddf_msg(LVL_ERROR, "Failed adding function 'kbd' to category " 451 444 "'keyboard'."); 452 goto error; 445 ddf_fun_unbind(kbd->kbd_fun); 446 ddf_fun_destroy(kbd->kbd_fun); 447 return ENOMEM; 453 448 } 454 449 455 450 kbd->polling_fibril = fibril_create(polling, kbd); 456 if ( kbd->polling_fibril == 0) {451 if (!kbd->polling_fibril) { 457 452 ddf_msg(LVL_ERROR, "Failed creating polling fibril."); 458 rc = ENOMEM; 459 goto error; 453 ddf_fun_unbind(kbd->kbd_fun); 454 ddf_fun_destroy(kbd->kbd_fun); 455 return ENOMEM; 460 456 } 461 457 462 458 fibril_add_ready(kbd->polling_fibril); 463 459 return EOK; 464 error:465 if (bound)466 ddf_fun_unbind(kbd->kbd_fun);467 if (kbd->kbd_fun != NULL)468 ddf_fun_destroy(kbd->kbd_fun);469 chardev_close(kbd->chardev);470 return rc;471 460 }
Note:
See TracChangeset
for help on using the changeset viewer.