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