Changes in uspace/drv/usbmouse/mouse.c [adfe5ec:a6add7a] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/usbmouse/mouse.c
radfe5ec ra6add7a 40 40 #include <ipc/mouse.h> 41 41 42 /** Mouse polling callback.42 /** Fibril function for polling the mouse device. 43 43 * 44 * @param dev Device that is being polled.45 * @param buffer Data buffer.46 * @param buffer_size Buffer size in bytes.47 * @param arg Custom argument - points to usb_mouse_t.48 * @return Always true.44 * This function shall not terminate unless the device breaks and fails 45 * to send data (e.g. stalls on data request). 46 * 47 * @param arg ddf_dev_t type representing the mouse device. 48 * @return EOK Always. 49 49 */ 50 bool usb_mouse_polling_callback(usb_device_t *dev, 51 uint8_t *buffer, size_t buffer_size, void *arg) 50 int usb_mouse_polling_fibril(void *arg) 52 51 { 53 usb_mouse_t *mouse = (usb_mouse_t *) arg; 52 assert(arg != NULL); 53 ddf_dev_t *dev = (ddf_dev_t *) arg; 54 usb_mouse_t *mouse = (usb_mouse_t *) dev->driver_data; 54 55 55 usb_log_debug2("got buffer: %s.\n", 56 usb_debug_str_buffer(buffer, buffer_size, 0)); 56 assert(mouse); 57 57 58 uint8_t butt = buffer[0]; 59 char str_buttons[4] = { 60 butt & 1 ? '#' : '.', 61 butt & 2 ? '#' : '.', 62 butt & 4 ? '#' : '.', 63 0 64 }; 58 size_t buffer_size = mouse->poll_pipe.max_packet_size; 65 59 66 int shift_x = ((int) buffer[1]) - 127; 67 int shift_y = ((int) buffer[2]) - 127; 68 int wheel = ((int) buffer[3]) - 127; 69 70 if (buffer[1] == 0) { 71 shift_x = 0; 72 } 73 if (buffer[2] == 0) { 74 shift_y = 0; 75 } 76 if (buffer[3] == 0) { 77 wheel = 0; 60 if (buffer_size < 4) { 61 usb_log_error("Weird mouse, results will be skewed.\n"); 62 buffer_size = 4; 78 63 } 79 64 80 if (mouse->console_phone >= 0) { 81 if ((shift_x != 0) || (shift_y != 0)) { 82 /* FIXME: guessed for QEMU */ 83 async_req_2_0(mouse->console_phone, 84 MEVENT_MOVE, 85 - shift_x / 10, - shift_y / 10); 86 } 87 if (butt) { 88 /* FIXME: proper button clicking. */ 89 async_req_2_0(mouse->console_phone, 90 MEVENT_BUTTON, 1, 1); 91 async_req_2_0(mouse->console_phone, 92 MEVENT_BUTTON, 1, 0); 93 } 65 uint8_t *buffer = malloc(buffer_size); 66 if (buffer == NULL) { 67 usb_log_error("Out of memory, poll fibril aborted.\n"); 68 return ENOMEM; 94 69 } 95 70 96 usb_log_debug("buttons=%s dX=%+3d dY=%+3d wheel=%+3d\n",97 str_buttons, shift_x, shift_y, wheel);71 while (true) { 72 async_usleep(mouse->poll_interval_us); 98 73 99 /* Guess. */100 async_usleep(1000);74 size_t actual_size; 75 int rc; 101 76 102 return true; 77 /* 78 * Error checking note: 79 * - failure when starting a session is considered 80 * temporary (e.g. out of phones, next try might succeed) 81 * - failure of transfer considered fatal (probably the 82 * device was unplugged) 83 * - session closing not checked (shall not fail anyway) 84 */ 85 86 rc = usb_endpoint_pipe_start_session(&mouse->poll_pipe); 87 if (rc != EOK) { 88 usb_log_warning("Failed to start session, will try again: %s.\n", 89 str_error(rc)); 90 continue; 91 } 92 93 rc = usb_endpoint_pipe_read(&mouse->poll_pipe, 94 buffer, buffer_size, &actual_size); 95 96 usb_endpoint_pipe_end_session(&mouse->poll_pipe); 97 98 if (rc != EOK) { 99 usb_log_error("Failed reading mouse input: %s.\n", 100 str_error(rc)); 101 break; 102 } 103 104 usb_log_debug2("got buffer: %s.\n", 105 usb_debug_str_buffer(buffer, buffer_size, 0)); 106 107 uint8_t butt = buffer[0]; 108 char str_buttons[4] = { 109 butt & 1 ? '#' : '.', 110 butt & 2 ? '#' : '.', 111 butt & 4 ? '#' : '.', 112 0 113 }; 114 115 int shift_x = ((int) buffer[1]) - 127; 116 int shift_y = ((int) buffer[2]) - 127; 117 int wheel = ((int) buffer[3]) - 127; 118 119 if (buffer[1] == 0) { 120 shift_x = 0; 121 } 122 if (buffer[2] == 0) { 123 shift_y = 0; 124 } 125 if (buffer[3] == 0) { 126 wheel = 0; 127 } 128 129 if (mouse->console_phone >= 0) { 130 if ((shift_x != 0) || (shift_y != 0)) { 131 /* FIXME: guessed for QEMU */ 132 async_req_2_0(mouse->console_phone, 133 MEVENT_MOVE, 134 - shift_x / 10, - shift_y / 10); 135 } 136 if (butt) { 137 /* FIXME: proper button clicking. */ 138 async_req_2_0(mouse->console_phone, 139 MEVENT_BUTTON, 1, 1); 140 async_req_2_0(mouse->console_phone, 141 MEVENT_BUTTON, 1, 0); 142 } 143 } 144 145 usb_log_debug("buttons=%s dX=%+3d dY=%+3d wheel=%+3d\n", 146 str_buttons, shift_x, shift_y, wheel); 147 } 148 149 /* 150 * Device was probably unplugged. 151 * Hang-up the phone to the console. 152 * FIXME: release allocated memory. 153 */ 154 async_hangup(mouse->console_phone); 155 mouse->console_phone = -1; 156 157 usb_log_error("Mouse polling fibril terminated.\n"); 158 159 return EOK; 103 160 } 104 161 105 /** Callback when polling is terminated.106 *107 * @param dev Device where the polling terminated.108 * @param recurring_errors Whether the polling was terminated due to109 * recurring errors.110 * @param arg Custom argument - points to usb_mouse_t.111 */112 void usb_mouse_polling_ended_callback(usb_device_t *dev,113 bool recurring_errors, void *arg)114 {115 usb_mouse_t *mouse = (usb_mouse_t *) arg;116 117 async_hangup(mouse->console_phone);118 mouse->console_phone = -1;119 }120 162 121 163 /**
Note:
See TracChangeset
for help on using the changeset viewer.