Changeset 132ab5d1 in mainline for uspace/drv/hid
- Timestamp:
- 2018-01-30T03:20:45Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 5a6cc679
- Parents:
- 8bfb163 (diff), 6a5d05b (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- uspace/drv/hid
- Files:
-
- 8 added
- 7 edited
- 4 moved
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/hid/adb-kbd/adb-kbd.h
r8bfb163 r132ab5d1 1 1 /* 2 * Copyright (c) 201 0 Lenka Trochtova2 * Copyright (c) 2017 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 /** @addtogroup libc30 * @{31 */32 29 /** @file 33 30 */ 34 31 35 #ifndef LIBDRV_CHAR_DEV_IFACE_H_36 #define LIBDRV_CHAR_DEV_IFACE_H_32 #ifndef ADB_KBD_H 33 #define ADB_KBD_H 37 34 38 35 #include <async.h> 36 #include <ddf/driver.h> 39 37 40 typedef enum { 41 CHAR_DEV_READ = 0, 42 CHAR_DEV_WRITE 43 } char_dev_method_t; 38 /** ADB keyboard */ 39 typedef struct { 40 ddf_dev_t *dev; 41 async_sess_t *parent_sess; 42 ddf_fun_t *fun; 43 async_sess_t *client_sess; 44 } adb_kbd_t; 44 45 45 extern ssize_t char_dev_read(async_sess_t *, void *, size_t); 46 extern ssize_t char_dev_write(async_sess_t *, void *, size_t); 46 extern int adb_kbd_add(adb_kbd_t *); 47 extern int adb_kbd_remove(adb_kbd_t *); 48 extern int adb_kbd_gone(adb_kbd_t *); 47 49 48 50 #endif -
uspace/drv/hid/adb-kbd/ctl.c
r8bfb163 r132ab5d1 27 27 */ 28 28 29 /** @addtogroup kbd_ctl30 * @ingroup input31 * @{32 */33 29 /** 34 30 * @file 35 * @brief Apple ADB keyboard controller driver. 36 */ 37 31 * @brief Apple ADB keyboard controller 32 */ 33 34 #include <errno.h> 38 35 #include <io/console.h> 39 36 #include <io/keycode.h> 40 #include "../kbd.h" 41 #include "../kbd_ctl.h" 42 #include "../kbd_port.h" 43 44 static void apple_ctl_parse(sysarg_t); 45 static int apple_ctl_init(kbd_dev_t *); 46 static void apple_ctl_set_ind(kbd_dev_t *, unsigned int); 47 48 kbd_ctl_ops_t apple_ctl = { 49 .parse = apple_ctl_parse, 50 .init = apple_ctl_init, 51 .set_ind = apple_ctl_set_ind 52 }; 37 38 #include "ctl.h" 53 39 54 40 #define KBD_KEY_RELEASE 0x80 … … 185 171 }; 186 172 187 static kbd_dev_t *kbd_dev; 188 189 static int apple_ctl_init(kbd_dev_t *kdev) 173 /** Translate ADB keyboard scancode into keyboard event. 174 * 175 * @param scancode Scancode 176 * @param rtype Place to store type of keyboard event (press or release) 177 * @param rkey Place to store key code 178 * 179 * @return EOK on success, ENOENT if no translation exists 180 */ 181 int adb_kbd_key_translate(sysarg_t scancode, kbd_event_type_t *rtype, 182 unsigned int *rkey) 190 183 { 191 kbd_dev = kdev; 192 return 0; 193 } 194 195 static void apple_ctl_parse(sysarg_t scancode) 196 { 197 kbd_event_type_t type; 198 184 kbd_event_type_t etype; 185 unsigned int key; 186 199 187 if (scancode & KBD_KEY_RELEASE) { 200 188 scancode &= ~KBD_KEY_RELEASE; 201 type = KEY_RELEASE; 202 } else 203 type = KEY_PRESS; 204 189 etype = KEY_RELEASE; 190 } else { 191 etype = KEY_PRESS; 192 } 193 205 194 if (scancode >= sizeof(scanmap) / sizeof(unsigned int)) 206 return; 207 208 unsigned int key = scanmap[scancode]; 209 if (key != 0) 210 kbd_push_event(kbd_dev, type, key); 195 return ENOENT; 196 197 key = scanmap[scancode]; 198 if (key == 0) 199 return ENOENT; 200 201 *rtype = etype; 202 *rkey = key; 203 return EOK; 211 204 } 212 205 213 static void apple_ctl_set_ind(kbd_dev_t *kdev, unsigned mods)214 {215 (void) mods;216 }217 218 206 /** @} 219 207 */ -
uspace/drv/hid/adb-kbd/ctl.h
r8bfb163 r132ab5d1 1 1 /* 2 * Copyright (c) 20 08Jiri Svoboda2 * Copyright (c) 2017 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 /** @addtogroup console30 * @{31 */32 29 /** 33 30 * @file 31 * @brief Apple ADB keyboard controller 34 32 */ 35 33 36 #ifndef OUTPUT_PORT_SKI_H_37 #define OUTPUT_PORT_SKI_H_34 #ifndef CTL_H 35 #define CTL_H 38 36 39 extern int ski_init(void);37 extern int adb_kbd_key_translate(sysarg_t, kbd_event_type_t *, unsigned int *); 40 38 41 39 #endif -
uspace/drv/hid/adb-mouse/adb-mouse.h
r8bfb163 r132ab5d1 1 1 /* 2 * Copyright (c) 20 08Jiri Svoboda2 * Copyright (c) 2017 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 /** @addtogroup trace 30 * @{ 31 */ 32 /** @file 29 /** @file ADB mouse driver 33 30 */ 34 31 35 #ifndef ERRORS_H_36 #define ERRORS_H_32 #ifndef ADB_MOUSE_H 33 #define ADB_MOUSE_H 37 34 35 #include <async.h> 36 #include <ddf/driver.h> 37 #include <stdbool.h> 38 39 /** ADB mouse */ 38 40 typedef struct { 39 const char *name; /**< Error value name (Exx) */ 40 const char *desc; /**< Error description */ 41 } err_desc_t; 41 ddf_dev_t *dev; 42 async_sess_t *parent_sess; 43 ddf_fun_t *fun; 44 async_sess_t *client_sess; 45 bool b1_pressed; 46 bool b2_pressed; 47 } adb_mouse_t; 42 48 43 extern const err_desc_t err_desc[]; 49 extern int adb_mouse_add(adb_mouse_t *); 50 extern int adb_mouse_remove(adb_mouse_t *); 51 extern int adb_mouse_gone(adb_mouse_t *); 44 52 45 53 #endif -
uspace/drv/hid/atkbd/atkbd.c
r8bfb163 r132ab5d1 1 1 /* 2 * Copyright (c) 2017 Jiri Svoboda 2 3 * Copyright (c) 2011 Jan Vesely 3 4 * Copyright (c) 2009 Vineeth Pillai … … 201 202 static int polling(void *arg) 202 203 { 203 const at_kbd_t *kbd = arg; 204 205 assert(kbd); 206 assert(kbd->parent_sess); 207 208 async_exch_t *parent_exch = async_exchange_begin(kbd->parent_sess); 204 at_kbd_t *kbd = arg; 205 size_t nwr; 206 int rc; 209 207 210 208 while (true) { 211 if (!parent_exch)212 parent_exch = async_exchange_begin(kbd->parent_sess);213 214 209 uint8_t code = 0; 215 ssize_t size = chardev_read(parent_exch, &code, 1);216 if ( size != 1)210 rc = chardev_read(kbd->chardev, &code, 1, &nwr); 211 if (rc != EOK) 217 212 return EIO; 218 213 … … 224 219 map_size = sizeof(scanmap_e0) / sizeof(unsigned int); 225 220 226 size = chardev_read(parent_exch, &code, 1);227 if ( size != 1)221 rc = chardev_read(kbd->chardev, &code, 1, &nwr); 222 if (rc != EOK) 228 223 return EIO; 229 224 } else if (code == KBD_SCANCODE_SET_EXTENDED_SPECIAL) { 230 size = chardev_read(parent_exch, &code, 1);231 if ( size != 1)225 rc = chardev_read(kbd->chardev, &code, 1, &nwr); 226 if (rc != EOK) 232 227 return EIO; 233 228 if (code != 0x14) 234 229 continue; 235 230 236 size = chardev_read(parent_exch, &code, 1);237 if ( size != 1)231 rc = chardev_read(kbd->chardev, &code, 1, &nwr); 232 if (rc != EOK) 238 233 return EIO; 239 234 if (code != 0x77) 240 235 continue; 241 236 242 size = chardev_read(parent_exch, &code, 1);243 if ( size != 1)237 rc = chardev_read(kbd->chardev, &code, 1, &nwr); 238 if (rc != EOK) 244 239 return EIO; 245 240 if (code != 0xe1) 246 241 continue; 247 242 248 size = chardev_read(parent_exch, &code, 1);249 if ( size != 1)243 rc = chardev_read(kbd->chardev, &code, 1, &nwr); 244 if (rc != EOK) 250 245 return EIO; 251 246 if (code != 0xf0) 252 247 continue; 253 248 254 size = chardev_read(parent_exch, &code, 1);255 if ( size != 1)249 rc = chardev_read(kbd->chardev, &code, 1, &nwr); 250 if (rc != EOK) 256 251 return EIO; 257 252 if (code != 0x14) 258 253 continue; 259 254 260 size = chardev_read(parent_exch, &code, 1);261 if ( size != 1)255 rc = chardev_read(kbd->chardev, &code, 1, &nwr); 256 if (rc != EOK) 262 257 return EIO; 263 258 if (code != 0xf0) 264 259 continue; 265 260 266 size = chardev_read(parent_exch, &code, 1);267 if ( size != 1)261 rc = chardev_read(kbd->chardev, &code, 1, &nwr); 262 if (rc != EOK) 268 263 return EIO; 269 264 if (code == 0x77) … … 279 274 if (code == KBD_SCANCODE_KEY_RELEASE) { 280 275 type = KEY_RELEASE; 281 size = chardev_read(parent_exch, &code, 1);282 if ( size != 1)276 rc = chardev_read(kbd->chardev, &code, 1, &nwr); 277 if (rc != EOK) 283 278 return EIO; 284 279 } else { … … 362 357 int at_kbd_init(at_kbd_t *kbd, ddf_dev_t *dev) 363 358 { 359 async_sess_t *parent_sess; 360 int rc; 361 364 362 assert(kbd); 365 363 assert(dev); 366 364 367 365 kbd->client_sess = NULL; 368 kbd->parent_sess = ddf_dev_parent_sess_get(dev); 369 370 if (!kbd->parent_sess) { 366 parent_sess = ddf_dev_parent_sess_get(dev); 367 if (parent_sess == NULL) { 371 368 ddf_msg(LVL_ERROR, "Failed creating parent session."); 369 rc = EIO; 370 goto error; 371 } 372 373 rc = chardev_open(parent_sess, &kbd->chardev); 374 if (rc != EOK) { 375 ddf_msg(LVL_ERROR, "Failed opening character device."); 372 376 return EIO; 373 377 } … … 407 411 fibril_add_ready(kbd->polling_fibril); 408 412 return EOK; 413 error: 414 chardev_close(kbd->chardev); 415 kbd->chardev = NULL; 416 return rc; 409 417 } -
uspace/drv/hid/atkbd/atkbd.h
r8bfb163 r132ab5d1 1 1 /* 2 2 * Copyright (c) 2011 Jan Vesely 3 * Copyright (c) 2017 Jiri Svoboda 3 4 * All rights reserved. 4 5 * … … 34 35 */ 35 36 36 #ifndef _AT_KBD_H_37 #define _AT_KBD_H_37 #ifndef AT_KBD_H_ 38 #define AT_KBD_H_ 38 39 39 40 #include <ddf/driver.h> 40 41 #include <fibril.h> 42 #include <io/chardev.h> 41 43 42 44 /** PC/AT keyboard driver structure. */ 43 45 typedef struct { 44 ddf_fun_t *kbd_fun; /**< Keyboard function. */ 45 async_sess_t *parent_sess; /**< Connection to device providing data. */ 46 async_sess_t *client_sess; /**< Callback connection to client. */ 47 fid_t polling_fibril; /**< Fibril retrieving an parsing data. */ 46 /** Keyboard function */ 47 ddf_fun_t *kbd_fun; 48 /** Device providing keyboard connection */ 49 chardev_t *chardev; 50 /** Callback connection to client */ 51 async_sess_t *client_sess; 52 /** Fibril retrieving and parsing data */ 53 fid_t polling_fibril; 48 54 } at_kbd_t; 49 55 -
uspace/drv/hid/ps2mouse/main.c
r8bfb163 r132ab5d1 30 30 */ 31 31 /** @file 32 * @brief ps/2 mouse driver32 * @brief PS/2 mouse driver 33 33 */ 34 34 -
uspace/drv/hid/ps2mouse/ps2mouse.c
r8bfb163 r132ab5d1 1 1 /* 2 2 * Copyright (c) 2011 Jan Vesely 3 * Copyright (c) 2017 Jiri Svoboda 3 4 * All rights reserved. 4 5 * … … 30 31 */ 31 32 /** @file 32 * @brief ps2 mouse driver.33 * @brief PS/2 mouse driver. 33 34 */ 34 35 35 36 #include <stdbool.h> 36 37 #include <errno.h> 38 #include <str_error.h> 37 39 #include <ddf/log.h> 38 40 #include <io/keycode.h> … … 70 72 #define PS2_BUTTON_MASK(button) (1 << button) 71 73 72 #define MOUSE_READ_BYTE_TEST( sess, value_) \74 #define MOUSE_READ_BYTE_TEST(mouse, value_) \ 73 75 do { \ 74 76 uint8_t value = (value_); \ 75 77 uint8_t data = 0; \ 76 const ssize_t size = chardev_read(sess, &data, 1); \ 77 if (size != 1) { \ 78 ddf_msg(LVL_ERROR, "Failed reading byte: %zd)", size);\ 79 return size < 0 ? size : EIO; \ 78 size_t nread; \ 79 const int rc = chardev_read((mouse)->chardev, &data, 1, &nread); \ 80 if (rc != EOK) { \ 81 ddf_msg(LVL_ERROR, "Failed reading byte: %s", str_error_name(rc));\ 82 return rc; \ 80 83 } \ 81 84 if (data != value) { \ … … 86 89 } while (0) 87 90 88 #define MOUSE_WRITE_BYTE( sess, value_) \91 #define MOUSE_WRITE_BYTE(mouse, value_) \ 89 92 do { \ 90 93 uint8_t value = (value_); \ 91 94 uint8_t data = (value); \ 92 const ssize_t size = chardev_write(sess, &data, 1); \ 93 if (size < 0 ) { \ 94 ddf_msg(LVL_ERROR, "Failed writing byte: %hhx", value); \ 95 return size; \ 95 size_t nwr; \ 96 const int rc = chardev_write((mouse)->chardev, &data, 1, &nwr); \ 97 if (rc != EOK) { \ 98 ddf_msg(LVL_ERROR, "Failed writing byte: %s", str_error_name(rc)); \ 99 return rc; \ 96 100 } \ 97 101 } while (0) … … 99 103 static int polling_ps2(void *); 100 104 static int polling_intellimouse(void *); 101 static int probe_intellimouse( async_exch_t *, bool);105 static int probe_intellimouse(ps2_mouse_t *, bool); 102 106 static void default_connection_handler(ddf_fun_t *, ipc_callid_t, ipc_call_t *); 103 107 … … 108 112 109 113 /** Initialize mouse driver structure. 114 * 115 * Connects to parent, creates keyboard function, starts polling fibril. 116 * 110 117 * @param kbd Mouse driver structure to initialize. 111 118 * @param dev DDF device structure. 112 119 * 113 * Connects to parent, creates keyboard function, starts polling fibril.120 * @return EOK on success or non-zero error code 114 121 */ 115 122 int ps2_mouse_init(ps2_mouse_t *mouse, ddf_dev_t *dev) 116 123 { 124 async_sess_t *parent_sess; 125 bool bound = false; 126 int rc; 127 117 128 mouse->client_sess = NULL; 118 mouse->parent_sess = ddf_dev_parent_sess_get(dev); 119 if (!mouse->parent_sess) 120 return ENOMEM; 129 130 parent_sess = ddf_dev_parent_sess_get(dev); 131 if (parent_sess == NULL) { 132 ddf_msg(LVL_ERROR, "Failed getting parent session."); 133 rc = ENOMEM; 134 goto error; 135 } 136 137 rc = chardev_open(parent_sess, &mouse->chardev); 138 if (rc != EOK) { 139 ddf_msg(LVL_ERROR, "Failed opening character device."); 140 goto error; 141 } 121 142 122 143 mouse->mouse_fun = ddf_fun_create(dev, fun_exposed, "mouse"); 123 if (!mouse->mouse_fun) { 124 return ENOMEM; 125 } 144 if (mouse->mouse_fun == NULL) { 145 ddf_msg(LVL_ERROR, "Error creating mouse function."); 146 rc = ENOMEM; 147 goto error; 148 } 149 126 150 ddf_fun_set_ops(mouse->mouse_fun, &mouse_ops); 127 151 128 int ret = ddf_fun_bind(mouse->mouse_fun); 129 if (ret != EOK) { 130 ddf_fun_destroy(mouse->mouse_fun); 131 return ENOMEM; 132 } 133 134 ret = ddf_fun_add_to_category(mouse->mouse_fun, "mouse"); 135 if (ret != EOK) { 136 ddf_fun_unbind(mouse->mouse_fun); 137 ddf_fun_destroy(mouse->mouse_fun); 138 return ENOMEM; 139 } 152 rc = ddf_fun_bind(mouse->mouse_fun); 153 if (rc != EOK) { 154 ddf_msg(LVL_ERROR, "Failed binding mouse function."); 155 goto error; 156 } 157 158 bound = true; 159 160 rc = ddf_fun_add_to_category(mouse->mouse_fun, "mouse"); 161 if (rc != EOK) { 162 ddf_msg(LVL_ERROR, "Failed adding mouse function to category."); 163 goto error; 164 } 165 140 166 /* Probe IntelliMouse extensions. */ 141 167 int (*polling_f)(void*) = polling_ps2; 142 async_exch_t *exch = async_exchange_begin(mouse->parent_sess); 143 if (probe_intellimouse(exch, false) == EOK) { 168 if (probe_intellimouse(mouse, false) == EOK) { 144 169 ddf_msg(LVL_NOTE, "Enabled IntelliMouse extensions"); 145 170 polling_f = polling_intellimouse; 146 if (probe_intellimouse( exch, true) == EOK)171 if (probe_intellimouse(mouse, true) == EOK) 147 172 ddf_msg(LVL_NOTE, "Enabled 4th and 5th button."); 148 173 } 174 149 175 /* Enable mouse data reporting. */ 150 176 uint8_t report = PS2_MOUSE_ENABLE_DATA_REPORT; 151 ssize_t size = chardev_write(exch, &report, 1); 152 if (size != 1) { 177 size_t nwr; 178 rc = chardev_write(mouse->chardev, &report, 1, &nwr); 179 if (rc != EOK) { 153 180 ddf_msg(LVL_ERROR, "Failed to enable data reporting."); 154 async_exchange_end(exch); 155 ddf_fun_unbind(mouse->mouse_fun); 156 ddf_fun_destroy(mouse->mouse_fun); 157 return EIO; 158 } 159 160 size = chardev_read(exch, &report, 1); 161 async_exchange_end(exch); 162 if (size != 1 || report != PS2_MOUSE_ACK) { 181 rc = EIO; 182 goto error; 183 } 184 185 size_t nread; 186 rc = chardev_read(mouse->chardev, &report, 1, &nread); 187 if (rc != EOK || report != PS2_MOUSE_ACK) { 163 188 ddf_msg(LVL_ERROR, "Failed to confirm data reporting: %hhx.", 164 189 report); 190 rc = EIO; 191 goto error; 192 } 193 194 mouse->polling_fibril = fibril_create(polling_f, mouse); 195 if (mouse->polling_fibril == 0) { 196 rc = ENOMEM; 197 goto error; 198 } 199 200 fibril_add_ready(mouse->polling_fibril); 201 return EOK; 202 error: 203 if (bound) 165 204 ddf_fun_unbind(mouse->mouse_fun); 205 if (mouse->mouse_fun != NULL) { 166 206 ddf_fun_destroy(mouse->mouse_fun); 167 return EIO; 168 } 169 170 mouse->polling_fibril = fibril_create(polling_f, mouse); 171 if (!mouse->polling_fibril) { 172 ddf_fun_unbind(mouse->mouse_fun); 173 ddf_fun_destroy(mouse->mouse_fun); 174 return ENOMEM; 175 } 176 fibril_add_ready(mouse->polling_fibril); 207 mouse->mouse_fun = NULL; 208 } 209 210 chardev_close(mouse->chardev); 211 mouse->chardev = NULL; 212 return rc; 213 } 214 215 /** Read fixed-size mouse packet. 216 * 217 * Continue reading until entire packet is received. 218 * 219 * @param mouse Mouse device 220 * @param pbuf Buffer for storing packet 221 * @param psize Packet size 222 * 223 * @return EOK on success or non-zero error code 224 */ 225 static int ps2_mouse_read_packet(ps2_mouse_t *mouse, void *pbuf, size_t psize) 226 { 227 int rc; 228 size_t pos; 229 size_t nread; 230 231 pos = 0; 232 while (pos < psize) { 233 rc = chardev_read(mouse->chardev, pbuf + pos, psize - pos, 234 &nread); 235 if (rc != EOK) { 236 ddf_msg(LVL_WARN, "Error reading packet."); 237 return rc; 238 } 239 240 pos += nread; 241 } 242 177 243 return EOK; 178 244 } … … 184 250 int polling_ps2(void *arg) 185 251 { 186 assert(arg); 187 const ps2_mouse_t *mouse = arg; 188 189 assert(mouse->parent_sess); 252 ps2_mouse_t *mouse = (ps2_mouse_t *) arg; 253 int rc; 254 190 255 bool buttons[PS2_BUTTON_COUNT] = {}; 191 async_exch_t *parent_exch = async_exchange_begin(mouse->parent_sess);192 256 while (1) { 193 194 257 uint8_t packet[PS2_BUFSIZE] = {}; 195 const ssize_t size = 196 chardev_read(parent_exch, packet, PS2_BUFSIZE); 197 198 if (size != PS2_BUFSIZE) { 199 ddf_msg(LVL_WARN, "Incorrect packet size: %zd.", size); 258 rc = ps2_mouse_read_packet(mouse, packet, PS2_BUFSIZE); 259 if (rc != EOK) 200 260 continue; 201 } 261 202 262 ddf_msg(LVL_DEBUG2, "Got packet: %hhx:%hhx:%hhx.", 203 263 packet[0], packet[1], packet[2]); … … 232 292 async_exchange_end(exch); 233 293 } 234 async_exchange_end(parent_exch); 294 295 return 0; 235 296 } 236 297 … … 241 302 static int polling_intellimouse(void *arg) 242 303 { 243 assert(arg); 244 const ps2_mouse_t *mouse = arg; 245 246 assert(mouse->parent_sess); 304 ps2_mouse_t *mouse = (ps2_mouse_t *) arg; 305 int rc; 306 247 307 bool buttons[INTELLIMOUSE_BUTTON_COUNT] = {}; 248 async_exch_t *parent_exch = NULL;249 308 while (1) { 250 if (!parent_exch)251 parent_exch = async_exchange_begin(mouse->parent_sess);252 253 309 uint8_t packet[INTELLIMOUSE_BUFSIZE] = {}; 254 const ssize_t size = chardev_read( 255 parent_exch, packet, INTELLIMOUSE_BUFSIZE); 256 257 if (size != INTELLIMOUSE_BUFSIZE) { 258 ddf_msg(LVL_WARN, "Incorrect packet size: %zd.", size); 310 rc = ps2_mouse_read_packet(mouse, packet, INTELLIMOUSE_BUFSIZE); 311 if (rc != EOK) 259 312 continue; 260 } 313 261 314 ddf_msg(LVL_DEBUG2, "Got packet: %hhx:%hhx:%hhx:%hhx.", 262 315 packet[0], packet[1], packet[2], packet[3]); … … 310 363 async_exchange_end(exch); 311 364 } 312 async_exchange_end(parent_exch); 365 366 return 0; 313 367 } 314 368 … … 319 373 * See http://www.computer-engineering.org/ps2mouse/ for details. 320 374 */ 321 static int probe_intellimouse(async_exch_t *exch, bool buttons) 322 { 323 assert(exch); 324 325 MOUSE_WRITE_BYTE(exch, PS2_MOUSE_SET_SAMPLE_RATE); 326 MOUSE_READ_BYTE_TEST(exch, PS2_MOUSE_ACK); 327 MOUSE_WRITE_BYTE(exch, 200); 328 MOUSE_READ_BYTE_TEST(exch, PS2_MOUSE_ACK); 329 330 MOUSE_WRITE_BYTE(exch, PS2_MOUSE_SET_SAMPLE_RATE); 331 MOUSE_READ_BYTE_TEST(exch, PS2_MOUSE_ACK); 332 MOUSE_WRITE_BYTE(exch, buttons ? 200 : 100); 333 MOUSE_READ_BYTE_TEST(exch, PS2_MOUSE_ACK); 334 335 MOUSE_WRITE_BYTE(exch, PS2_MOUSE_SET_SAMPLE_RATE); 336 MOUSE_READ_BYTE_TEST(exch, PS2_MOUSE_ACK); 337 MOUSE_WRITE_BYTE(exch, 80); 338 MOUSE_READ_BYTE_TEST(exch, PS2_MOUSE_ACK); 339 340 MOUSE_WRITE_BYTE(exch, PS2_MOUSE_GET_DEVICE_ID); 341 MOUSE_READ_BYTE_TEST(exch, PS2_MOUSE_ACK); 342 MOUSE_READ_BYTE_TEST(exch, buttons ? 4 : 3); 375 static int probe_intellimouse(ps2_mouse_t *mouse, bool buttons) 376 { 377 MOUSE_WRITE_BYTE(mouse, PS2_MOUSE_SET_SAMPLE_RATE); 378 MOUSE_READ_BYTE_TEST(mouse, PS2_MOUSE_ACK); 379 MOUSE_WRITE_BYTE(mouse, 200); 380 MOUSE_READ_BYTE_TEST(mouse, PS2_MOUSE_ACK); 381 382 MOUSE_WRITE_BYTE(mouse, PS2_MOUSE_SET_SAMPLE_RATE); 383 MOUSE_READ_BYTE_TEST(mouse, PS2_MOUSE_ACK); 384 MOUSE_WRITE_BYTE(mouse, buttons ? 200 : 100); 385 MOUSE_READ_BYTE_TEST(mouse, PS2_MOUSE_ACK); 386 387 MOUSE_WRITE_BYTE(mouse, PS2_MOUSE_SET_SAMPLE_RATE); 388 MOUSE_READ_BYTE_TEST(mouse, PS2_MOUSE_ACK); 389 MOUSE_WRITE_BYTE(mouse, 80); 390 MOUSE_READ_BYTE_TEST(mouse, PS2_MOUSE_ACK); 391 392 MOUSE_WRITE_BYTE(mouse, PS2_MOUSE_GET_DEVICE_ID); 393 MOUSE_READ_BYTE_TEST(mouse, PS2_MOUSE_ACK); 394 MOUSE_READ_BYTE_TEST(mouse, buttons ? 4 : 3); 343 395 344 396 return EOK; -
uspace/drv/hid/ps2mouse/ps2mouse.h
r8bfb163 r132ab5d1 1 1 /* 2 2 * Copyright (c) 2011 Jan Vesely 3 * Copyright (c) 2017 Jiri Svoboda 3 4 * All rights reserved. 4 5 * … … 30 31 */ 31 32 /** @file 32 * @brief ps/2 mouse driver.33 * @brief PS/2 mouse driver. 33 34 */ 34 35 35 #ifndef _PS2MOUSE_H_36 #define _PS2MOUSE_H_36 #ifndef PS2MOUSE_H_ 37 #define PS2MOUSE_H_ 37 38 38 39 #include <ddf/driver.h> 39 40 #include <fibril.h> 41 #include <io/chardev.h> 40 42 41 43 /** PS/2 mouse driver structure. */ 42 44 typedef struct { 43 ddf_fun_t *mouse_fun; /**< Mouse function. */ 44 async_sess_t *parent_sess; /**< Connection to device providing data. */ 45 async_sess_t *client_sess; /**< Callback connection to client. */ 46 fid_t polling_fibril; /**< Fibril retrieving an parsing data. */ 45 /** Mouse function. */ 46 ddf_fun_t *mouse_fun; 47 /** Device providing mouse connection */ 48 chardev_t *chardev; 49 /** Callback connection to client. */ 50 async_sess_t *client_sess; 51 /** Fibril retrieving an parsing data. */ 52 fid_t polling_fibril; 47 53 } ps2_mouse_t; 48 54 49 int ps2_mouse_init(ps2_mouse_t *, ddf_dev_t *);55 extern int ps2_mouse_init(ps2_mouse_t *, ddf_dev_t *); 50 56 51 57 #endif 58 52 59 /** 53 60 * @} -
uspace/drv/hid/xtkbd/xtkbd.c
r8bfb163 r132ab5d1 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 } -
uspace/drv/hid/xtkbd/xtkbd.h
r8bfb163 r132ab5d1 1 1 /* 2 2 * Copyright (c) 2011 Jan Vesely 3 * Copyright (c) 2017 Jiri Svoboda 3 4 * All rights reserved. 4 5 * … … 34 35 */ 35 36 36 #ifndef _XT_KBD_H_37 #define _XT_KBD_H_37 #ifndef XT_KBD_H_ 38 #define XT_KBD_H_ 38 39 40 #include <async.h> 39 41 #include <ddf/driver.h> 40 42 #include <fibril.h> 43 #include <io/chardev.h> 41 44 42 /** PC/XT keyboard driver structure .*/45 /** PC/XT keyboard driver structure */ 43 46 typedef struct { 44 ddf_fun_t *kbd_fun; /**< Keyboard function. */ 45 async_sess_t *parent_sess; /**< Connection to device providing data. */ 46 async_sess_t *client_sess; /**< Callback connection to client. */ 47 fid_t polling_fibril; /**< Fibril retrieving an parsing data. */ 47 /** Keyboard function */ 48 ddf_fun_t *kbd_fun; 49 /** Device providing keyboard connection */ 50 chardev_t *chardev; 51 /** Callback connection to client */ 52 async_sess_t *client_sess; 53 /** Fibril retrieving an parsing data */ 54 fid_t polling_fibril; 48 55 } xt_kbd_t; 49 56
Note:
See TracChangeset
for help on using the changeset viewer.