Changeset 15c5418 in mainline for uspace/drv/hid/xtkbd/xtkbd.c
- Timestamp:
- 2017-11-18T20:06:15Z (6 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 75fcf9b
- Parents:
- efb9fd08
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/hid/xtkbd/xtkbd.c
refb9fd08 r15c5418 1 1 /* 2 2 * Copyright (c) 2011 Jan Vesely 3 * Copyright (c) 2017 Jiri Svoboda 3 4 * All rights reserved. 4 5 * … … 206 207 static int polling(void *arg) 207 208 { 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); 209 xt_kbd_t *kbd = arg; 214 210 215 211 while (true) { 216 if (!parent_exch)217 parent_exch = async_exchange_begin(kbd->parent_sess);218 219 212 const unsigned int *map = scanmap_simple; 220 213 size_t map_size = sizeof(scanmap_simple) / sizeof(unsigned int); 221 214 222 215 uint8_t code = 0; 223 ssize_t size = chardev_read( parent_exch, &code, 1);216 ssize_t size = chardev_read(kbd->chardev, &code, 1); 224 217 if (size != 1) 225 218 return EIO; … … 234 227 map_size = sizeof(scanmap_e0) / sizeof(unsigned int); 235 228 236 size = chardev_read( parent_exch, &code, 1);229 size = chardev_read(kbd->chardev, &code, 1); 237 230 if (size != 1) 238 231 return EIO; … … 241 234 242 235 if (code == 0x2a) { /* Print Screen */ 243 size = chardev_read( parent_exch, &code, 1);236 size = chardev_read(kbd->chardev, &code, 1); 244 237 if (size != 1) 245 238 return EIO; … … 248 241 continue; 249 242 250 size = chardev_read( parent_exch, &code, 1);243 size = chardev_read(kbd->chardev, &code, 1); 251 244 if (size != 1) 252 245 return EIO; … … 259 252 260 253 if (code == 0x46) { /* Break */ 261 size = chardev_read( parent_exch, &code, 1);254 size = chardev_read(kbd->chardev, &code, 1); 262 255 if (size != 1) 263 256 return EIO; … … 266 259 continue; 267 260 268 size = chardev_read( parent_exch, &code, 1);261 size = chardev_read(kbd->chardev, &code, 1); 269 262 if (size != 1) 270 263 return EIO; … … 279 272 /* Extended special set */ 280 273 if (code == KBD_SCANCODE_SET_EXTENDED_SPECIAL) { 281 size = chardev_read( parent_exch, &code, 1);274 size = chardev_read(kbd->chardev, &code, 1); 282 275 if (size != 1) 283 276 return EIO; … … 286 279 continue; 287 280 288 size = chardev_read( parent_exch, &code, 1);281 size = chardev_read(kbd->chardev, &code, 1); 289 282 if (size != 1) 290 283 return EIO; … … 293 286 continue; 294 287 295 size = chardev_read( parent_exch, &code, 1);288 size = chardev_read(kbd->chardev, &code, 1); 296 289 if (size != 1) 297 290 return EIO; … … 300 293 continue; 301 294 302 size = chardev_read( parent_exch, &code, 1);295 size = chardev_read(kbd->chardev, &code, 1); 303 296 if (size != 1) 304 297 return EIO; … … 307 300 continue; 308 301 309 size = chardev_read( parent_exch, &code, 1);302 size = chardev_read(kbd->chardev, &code, 1); 310 303 if (size != 1) 311 304 return EIO; … … 357 350 uint8_t cmds[] = { KBD_CMD_SET_LEDS, status }; 358 351 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); 352 ssize_t size = chardev_write(kbd->chardev, cmds, sizeof(cmds)); 362 353 363 354 async_answer_0(icallid, size < 0 ? size : EOK); … … 413 404 int xt_kbd_init(xt_kbd_t *kbd, ddf_dev_t *dev) 414 405 { 415 assert(kbd); 416 assert(dev); 406 async_sess_t *parent_sess; 407 bool bound = false; 408 int rc; 417 409 418 410 kbd->client_sess = NULL; 419 kbd->parent_sess = ddf_dev_parent_sess_get(dev);420 421 if ( !kbd->parent_sess) {411 412 parent_sess = ddf_dev_parent_sess_get(dev); 413 if (parent_sess == NULL) { 422 414 ddf_msg(LVL_ERROR, "Failed creating parent session."); 423 return EIO; 415 rc = EIO; 416 goto error; 417 } 418 419 rc = chardev_open(parent_sess, &kbd->chardev); 420 if (rc != EOK) { 421 ddf_msg(LVL_ERROR, "Failed opening character device."); 422 goto error; 424 423 } 425 424 426 425 kbd->kbd_fun = ddf_fun_create(dev, fun_exposed, "kbd"); 427 if ( !kbd->kbd_fun) {426 if (kbd->kbd_fun == NULL) { 428 427 ddf_msg(LVL_ERROR, "Failed creating function 'kbd'."); 429 return ENOMEM; 428 rc = ENOMEM; 429 goto error; 430 430 } 431 431 432 432 ddf_fun_set_ops(kbd->kbd_fun, &kbd_ops); 433 433 434 int ret= ddf_fun_bind(kbd->kbd_fun);435 if (r et!= EOK) {434 rc = ddf_fun_bind(kbd->kbd_fun); 435 if (rc != EOK) { 436 436 ddf_msg(LVL_ERROR, "Failed binding function 'kbd'."); 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) { 437 goto error; 438 } 439 440 rc = ddf_fun_add_to_category(kbd->kbd_fun, "keyboard"); 441 if (rc != EOK) { 443 442 ddf_msg(LVL_ERROR, "Failed adding function 'kbd' to category " 444 443 "'keyboard'."); 445 ddf_fun_unbind(kbd->kbd_fun); 446 ddf_fun_destroy(kbd->kbd_fun); 447 return ENOMEM; 444 goto error; 448 445 } 449 446 450 447 kbd->polling_fibril = fibril_create(polling, kbd); 451 if ( !kbd->polling_fibril) {448 if (kbd->polling_fibril == 0) { 452 449 ddf_msg(LVL_ERROR, "Failed creating polling fibril."); 453 ddf_fun_unbind(kbd->kbd_fun); 454 ddf_fun_destroy(kbd->kbd_fun); 455 return ENOMEM; 450 rc = ENOMEM; 451 goto error; 456 452 } 457 453 458 454 fibril_add_ready(kbd->polling_fibril); 459 455 return EOK; 456 error: 457 if (bound) 458 ddf_fun_unbind(kbd->kbd_fun); 459 if (kbd->kbd_fun != NULL) 460 ddf_fun_destroy(kbd->kbd_fun); 461 chardev_close(kbd->chardev); 462 return rc; 460 463 }
Note:
See TracChangeset
for help on using the changeset viewer.