Changeset 5da7199 in mainline
- Timestamp:
- 2011-09-09T17:18:06Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 3781092, b7c33b0
- Parents:
- c69646f8
- Location:
- uspace
- Files:
-
- 4 deleted
- 20 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/usbhid/kbd/kbddev.c
rc69646f8 r5da7199 43 43 #include <ipc/kbdev.h> 44 44 #include <async.h> 45 #include <async_obsolete.h>46 45 #include <fibril.h> 47 46 #include <fibril_synch.h> … … 70 69 71 70 #include "../usbhid.h" 72 73 // FIXME: remove this header74 #include <abi/ipc/methods.h>75 71 76 72 /*----------------------------------------------------------------------------*/ … … 167 163 * 168 164 * Currently recognizes only one method (IPC_M_CONNECT_TO_ME), in which case it 169 * assumes the caller is the console and thus it stores IPC phone to it for165 * assumes the caller is the console and thus it stores IPC session to it for 170 166 * later use by the driver to notify about key events. 171 167 * … … 178 174 { 179 175 sysarg_t method = IPC_GET_IMETHOD(*icall); 180 int callback; 181 182 usb_kbd_t *kbd_dev = (usb_kbd_t *)fun->driver_data; 176 177 usb_kbd_t *kbd_dev = (usb_kbd_t *) fun->driver_data; 183 178 if (kbd_dev == NULL) { 184 179 usb_log_debug("default_connection_handler: " … … 187 182 return; 188 183 } 189 190 switch (method) { 191 case IPC_M_CONNECT_TO_ME: 192 callback = IPC_GET_ARG5(*icall); 193 194 if (kbd_dev->console_phone != -1) { 184 185 async_sess_t *sess = 186 async_callback_receive_start(EXCHANGE_SERIALIZE, icall); 187 if (sess != NULL) { 188 if (kbd_dev->console_sess == NULL) { 189 kbd_dev->console_sess = sess; 190 usb_log_debug("default_connection_handler: OK\n"); 191 async_answer_0(icallid, EOK); 192 } else { 195 193 usb_log_debug("default_connection_handler: " 196 "console phonealready set\n");194 "console session already set\n"); 197 195 async_answer_0(icallid, ELIMIT); 198 return; 199 } 200 201 kbd_dev->console_phone = callback; 202 203 usb_log_debug("default_connection_handler: OK\n"); 204 async_answer_0(icallid, EOK); 205 break; 206 case KBDEV_SET_IND: 207 kbd_dev->mods = IPC_GET_ARG1(*icall); 208 usb_kbd_set_led(kbd_dev->hid_dev, kbd_dev); 209 async_answer_0(icallid, EOK); 210 break; 211 default: 212 usb_log_debug("default_connection_handler: Wrong function.\n"); 213 async_answer_0(icallid, EINVAL); 214 break; 196 } 197 } else { 198 switch (method) { 199 case KBDEV_SET_IND: 200 kbd_dev->mods = IPC_GET_ARG1(*icall); 201 usb_kbd_set_led(kbd_dev->hid_dev, kbd_dev); 202 async_answer_0(icallid, EOK); 203 break; 204 default: 205 usb_log_debug("default_connection_handler: Wrong function.\n"); 206 async_answer_0(icallid, EINVAL); 207 break; 208 } 215 209 } 216 210 } … … 301 295 { 302 296 usb_log_debug2("Sending kbdev event %d/%d to the console\n", type, key); 303 if (kbd_dev->console_ phone < 0) {297 if (kbd_dev->console_sess == NULL) { 304 298 usb_log_warning( 305 299 "Connection to console not ready, key discarded.\n"); … … 307 301 } 308 302 309 async_obsolete_msg_2(kbd_dev->console_phone, KBDEV_EVENT, type, key); 303 async_exch_t *exch = async_exchange_begin(kbd_dev->console_sess); 304 async_msg_2(exch, KBDEV_EVENT, type, key); 305 async_exchange_end(exch); 310 306 } 311 307 … … 510 506 } 511 507 512 kbd_dev->console_ phone = -1;508 kbd_dev->console_sess = NULL; 513 509 kbd_dev->initialized = USB_KBD_STATUS_UNINITIALIZED; 514 510 … … 785 781 } 786 782 787 // hangup phoneto the console788 async_ obsolete_hangup(kbd_dev->console_phone);783 // hangup session to the console 784 async_hangup(kbd_dev->console_sess); 789 785 790 786 if (kbd_dev->repeat_mtx != NULL) { -
uspace/drv/bus/usb/usbhid/kbd/kbddev.h
rc69646f8 r5da7199 38 38 39 39 #include <stdint.h> 40 40 #include <async.h> 41 41 #include <fibril_synch.h> 42 43 42 #include <usb/hid/hid.h> 44 43 #include <usb/hid/hidparser.h> … … 58 57 * data, such as currently pressed keys, modifiers and lock keys. 59 58 * 60 * Also holds a IPC phoneto the console (since there is now no other way to59 * Also holds a IPC session to the console (since there is now no other way to 61 60 * communicate with it). 62 61 * … … 83 82 unsigned lock_keys; 84 83 85 /** IPC phoneto the console device (for sending key events). */86 int console_phone;84 /** IPC session to the console device (for sending key events). */ 85 async_sess_t *console_sess; 87 86 88 87 /** @todo What is this actually? */ -
uspace/drv/bus/usb/usbhid/mouse/mousedev.c
rc69646f8 r5da7199 42 42 #include <errno.h> 43 43 #include <async.h> 44 #include <async_obsolete.h>45 44 #include <str_error.h> 46 45 #include <ipc/mouseev.h> … … 56 55 #define ARROWS_PER_SINGLE_WHEEL 3 57 56 58 // FIXME: remove this header 59 #include <abi/ipc/methods.h> 60 61 #define NAME "mouse" 57 #define NAME "mouse" 62 58 63 59 /*----------------------------------------------------------------------------*/ … … 128 124 ipc_callid_t icallid, ipc_call_t *icall) 129 125 { 130 sysarg_t method = IPC_GET_IMETHOD(*icall); 131 132 usb_mouse_t *mouse_dev = (usb_mouse_t *)fun->driver_data; 126 usb_mouse_t *mouse_dev = (usb_mouse_t *) fun->driver_data; 133 127 134 128 if (mouse_dev == NULL) { … … 141 135 usb_log_debug("default_connection_handler: fun->name: %s\n", 142 136 fun->name); 143 usb_log_debug("default_connection_handler: mouse_phone: %d, wheel " 144 "phone: %d\n", mouse_dev->mouse_phone, mouse_dev->wheel_phone); 145 146 int *phone = (str_cmp(fun->name, HID_MOUSE_FUN_NAME) == 0) 147 ? &mouse_dev->mouse_phone : &mouse_dev->wheel_phone; 148 149 if (method == IPC_M_CONNECT_TO_ME) { 150 int callback = IPC_GET_ARG5(*icall); 151 152 if (*phone != -1) { 137 usb_log_debug("default_connection_handler: mouse_sess: %p, " 138 "wheel_sess: %p\n", mouse_dev->mouse_sess, mouse_dev->wheel_sess); 139 140 async_sess_t **sess_ptr = 141 (str_cmp(fun->name, HID_MOUSE_FUN_NAME) == 0) ? 142 &mouse_dev->mouse_sess : &mouse_dev->wheel_sess; 143 144 async_sess_t *sess = 145 async_callback_receive_start(EXCHANGE_SERIALIZE, icall); 146 if (sess != NULL) { 147 if (*sess_ptr == NULL) { 148 *sess_ptr = sess; 149 usb_log_debug("Console session to mouse set ok (%p).\n", 150 sess); 151 async_answer_0(icallid, EOK); 152 } else { 153 153 usb_log_debug("default_connection_handler: Console " 154 " phoneto mouse already set.\n");154 "session to mouse already set.\n"); 155 155 async_answer_0(icallid, ELIMIT); 156 return;157 156 } 158 159 *phone = callback; 160 usb_log_debug("Console phone to mouse set ok (%d).\n", *phone); 161 async_answer_0(icallid, EOK); 162 return; 163 } 164 165 usb_log_debug("default_connection_handler: Invalid function.\n"); 166 async_answer_0(icallid, EINVAL); 157 } else { 158 usb_log_debug("default_connection_handler: Invalid function.\n"); 159 async_answer_0(icallid, EINVAL); 160 } 167 161 } 168 162 … … 175 169 return NULL; 176 170 } 177 mouse->mouse_ phone = -1;178 mouse->wheel_ phone = -1;171 mouse->mouse_sess = NULL; 172 mouse->wheel_sess = NULL; 179 173 180 174 return mouse; … … 187 181 assert(mouse_dev != NULL); 188 182 189 // hangup phone to the console 190 if (mouse_dev->mouse_phone >= 0) { 191 async_obsolete_hangup(mouse_dev->mouse_phone); 192 } 193 194 if (mouse_dev->wheel_phone >= 0) { 195 async_obsolete_hangup(mouse_dev->wheel_phone); 196 } 183 // hangup session to the console 184 if (mouse_dev->mouse_sess != NULL) 185 async_hangup(mouse_dev->mouse_sess); 186 187 if (mouse_dev->wheel_sess != NULL) 188 async_hangup(mouse_dev->wheel_sess); 197 189 } 198 190 … … 203 195 unsigned int key = (wheel > 0) ? KC_UP : KC_DOWN; 204 196 205 if (mouse_dev->wheel_ phone < 0) {197 if (mouse_dev->wheel_sess == NULL) { 206 198 usb_log_warning( 207 199 "Connection to console not ready, wheel roll discarded.\n"); … … 215 207 /* Send arrow press and release. */ 216 208 usb_log_debug2("Sending key %d to the console\n", key); 217 async_obsolete_msg_4(mouse_dev->wheel_phone, KBDEV_EVENT, 218 KEY_PRESS, key, 0, 0); 219 async_obsolete_msg_4(mouse_dev->wheel_phone, KBDEV_EVENT, 220 KEY_RELEASE, key, 0, 0); 209 210 async_exch_t *exch = async_exchange_begin(mouse_dev->wheel_sess); 211 212 async_msg_4(exch, KBDEV_EVENT, KEY_PRESS, key, 0, 0); 213 async_msg_4(exch, KBDEV_EVENT, KEY_RELEASE, key, 0, 0); 214 215 async_exchange_end(exch); 221 216 } 222 217 } … … 253 248 assert(mouse_dev != NULL); 254 249 255 if (mouse_dev->mouse_ phone < 0) {256 usb_log_warning(NAME " No console phone.\n");250 if (mouse_dev->mouse_sess == NULL) { 251 usb_log_warning(NAME " No console session.\n"); 257 252 return true; 258 253 } … … 266 261 267 262 if ((shift_x != 0) || (shift_y != 0)) { 268 async_obsolete_req_2_0(mouse_dev->mouse_phone, 269 MOUSEEV_MOVE_EVENT, shift_x, shift_y); 270 } 271 272 if (wheel != 0) { 263 async_exch_t *exch = async_exchange_begin(mouse_dev->mouse_sess); 264 async_req_2_0(exch, MOUSEEV_MOVE_EVENT, shift_x, shift_y); 265 async_exchange_end(exch); 266 } 267 268 if (wheel != 0) 273 269 usb_mouse_send_wheel(mouse_dev, wheel); 274 }275 270 276 271 /* … … 292 287 if (mouse_dev->buttons[field->usage - field->usage_minimum] == 0 293 288 && field->value != 0) { 294 async_obsolete_req_2_0(mouse_dev->mouse_phone, 295 MOUSEEV_BUTTON_EVENT, field->usage, 1); 289 async_exch_t *exch = 290 async_exchange_begin(mouse_dev->mouse_sess); 291 async_req_2_0(exch, MOUSEEV_BUTTON_EVENT, field->usage, 1); 292 async_exchange_end(exch); 293 296 294 mouse_dev->buttons[field->usage - field->usage_minimum] 297 295 = field->value; 298 296 } else if (mouse_dev->buttons[field->usage - field->usage_minimum] != 0 299 297 && field->value == 0) { 300 async_obsolete_req_2_0(mouse_dev->mouse_phone, 301 MOUSEEV_BUTTON_EVENT, field->usage, 0); 298 async_exch_t *exch = 299 async_exchange_begin(mouse_dev->mouse_sess); 300 async_req_2_0(exch, MOUSEEV_BUTTON_EVENT, field->usage, 0); 301 async_exchange_end(exch); 302 302 303 mouse_dev->buttons[field->usage - field->usage_minimum] = 303 304 field->value; -
uspace/drv/bus/usb/usbhid/mouse/mousedev.h
rc69646f8 r5da7199 38 38 39 39 #include <usb/dev/driver.h> 40 #include <async.h> 40 41 41 42 struct usb_hid_dev; … … 45 46 /** Container for USB mouse device. */ 46 47 typedef struct { 47 /** IPC phoneto console (consumer). */48 int mouse_phone;49 int wheel_phone;48 /** IPC session to console (consumer). */ 49 async_sess_t *mouse_sess; 50 async_sess_t *wheel_sess; 50 51 51 52 int32_t *buttons; -
uspace/drv/bus/usb/usbhid/multimedia/multimedia.c
rc69646f8 r5da7199 47 47 #include <errno.h> 48 48 #include <async.h> 49 #include <async_obsolete.h>50 49 #include <str_error.h> 51 50 … … 53 52 #include <io/console.h> 54 53 55 // FIXME: remove this header 56 #include <abi/ipc/methods.h> 57 58 #define NAME "multimedia-keys" 54 #define NAME "multimedia-keys" 59 55 60 56 /*----------------------------------------------------------------------------*/ … … 69 65 /** Count of stored keys (i.e. number of keys in the report). */ 70 66 //size_t key_count; 71 /** IPC phoneto the console device (for sending key events). */72 int console_phone;67 /** IPC session to the console device (for sending key events). */ 68 async_sess_t *console_sess; 73 69 } usb_multimedia_t; 74 70 … … 79 75 * 80 76 * Currently recognizes only one method (IPC_M_CONNECT_TO_ME), in which case it 81 * assumes the caller is the console and thus it stores IPC phone to it for77 * assumes the caller is the console and thus it stores IPC session to it for 82 78 * later use by the driver to notify about key events. 83 79 * … … 91 87 usb_log_debug(NAME " default_connection_handler()\n"); 92 88 93 sysarg_t method = IPC_GET_IMETHOD(*icall);94 95 89 usb_multimedia_t *multim_dev = (usb_multimedia_t *)fun->driver_data; 96 90 … … 99 93 return; 100 94 } 101 102 if (method == IPC_M_CONNECT_TO_ME) { 103 int callback = IPC_GET_ARG5(*icall); 104 105 if (multim_dev->console_phone != -1) { 95 96 async_sess_t *sess = 97 async_callback_receive_start(EXCHANGE_SERIALIZE, icall); 98 if (sess != NULL) { 99 if (multim_dev->console_sess == NULL) { 100 multim_dev->console_sess = sess; 101 usb_log_debug(NAME " Saved session to console: %p\n", 102 sess); 103 async_answer_0(icallid, EOK); 104 } else 106 105 async_answer_0(icallid, ELIMIT); 107 return; 108 } 109 110 multim_dev->console_phone = callback; 111 usb_log_debug(NAME " Saved phone to console: %d\n", callback); 112 async_answer_0(icallid, EOK); 113 return; 114 } 115 116 async_answer_0(icallid, EINVAL); 106 } else 107 async_answer_0(icallid, EINVAL); 117 108 } 118 109 … … 155 146 156 147 usb_log_debug2(NAME " Sending key %d to the console\n", ev.key); 157 if (multim_dev->console_ phone < 0) {148 if (multim_dev->console_sess == NULL) { 158 149 usb_log_warning( 159 150 "Connection to console not ready, key discarded.\n"); … … 161 152 } 162 153 163 async_obsolete_msg_4(multim_dev->console_phone, KBDEV_EVENT, ev.type, ev.key, 164 ev.mods, ev.c); 154 async_exch_t *exch = async_exchange_begin(multim_dev->console_sess); 155 async_msg_4(exch, KBDEV_EVENT, ev.type, ev.key, ev.mods, ev.c); 156 async_exchange_end(exch); 165 157 } 166 158 … … 222 214 } 223 215 224 multim_dev->console_ phone = -1;216 multim_dev->console_sess = NULL; 225 217 226 218 /*! @todo Autorepeat */ … … 250 242 if (data != NULL) { 251 243 usb_multimedia_t *multim_dev = (usb_multimedia_t *)data; 252 // hangup phoneto the console253 async_ obsolete_hangup(multim_dev->console_phone);244 // hangup session to the console 245 async_hangup(multim_dev->console_sess); 254 246 } 255 247 } -
uspace/lib/c/Makefile
rc69646f8 r5da7199 97 97 generic/ipc.c \ 98 98 generic/ns.c \ 99 generic/ns_obsolete.c \100 99 generic/async.c \ 101 generic/async_obsolete.c \102 100 generic/loader.c \ 103 101 generic/getopt.c \ -
uspace/lib/c/generic/async.c
rc69646f8 r5da7199 118 118 #define CONN_HASH_TABLE_BUCKETS 32 119 119 120 /** Session data */ 121 struct async_sess { 122 /** List of inactive exchanges */ 123 list_t exch_list; 124 125 /** Exchange management style */ 126 exch_mgmt_t mgmt; 127 128 /** Session identification */ 129 int phone; 130 131 /** First clone connection argument */ 132 sysarg_t arg1; 133 134 /** Second clone connection argument */ 135 sysarg_t arg2; 136 137 /** Third clone connection argument */ 138 sysarg_t arg3; 139 140 /** Exchange mutex */ 141 fibril_mutex_t mutex; 142 143 /** Number of opened exchanges */ 144 atomic_t refcnt; 145 146 /** Mutex for stateful connections */ 147 fibril_mutex_t remote_state_mtx; 148 149 /** Data for stateful connections */ 150 void *remote_state_data; 151 }; 152 153 /** Exchange data */ 154 struct async_exch { 155 /** Link into list of inactive exchanges */ 156 link_t sess_link; 157 158 /** Link into global list of inactive exchanges */ 159 link_t global_link; 160 161 /** Session pointer */ 162 async_sess_t *sess; 163 164 /** Exchange identification */ 165 int phone; 166 }; 167 120 168 /** Async framework global futex */ 121 169 atomic_t async_futex = FUTEX_INITIALIZER; … … 134 182 ipc_call_t call; 135 183 } msg_t; 184 185 /** Message data */ 186 typedef struct { 187 awaiter_t wdata; 188 189 /** If reply was received. */ 190 bool done; 191 192 /** Pointer to where the answer data is stored. */ 193 ipc_call_t *dataptr; 194 195 sysarg_t retval; 196 } amsg_t; 136 197 137 198 /* Client connection data */ -
uspace/lib/c/generic/private/async.h
rc69646f8 r5da7199 43 43 #include <bool.h> 44 44 45 /** Session data */46 struct _async_sess {47 /** List of inactive exchanges */48 list_t exch_list;49 50 /** Exchange management style */51 exch_mgmt_t mgmt;52 53 /** Session identification */54 int phone;55 56 /** First clone connection argument */57 sysarg_t arg1;58 59 /** Second clone connection argument */60 sysarg_t arg2;61 62 /** Third clone connection argument */63 sysarg_t arg3;64 65 /** Exchange mutex */66 fibril_mutex_t mutex;67 68 /** Number of opened exchanges */69 atomic_t refcnt;70 71 /** Mutex for stateful connections */72 fibril_mutex_t remote_state_mtx;73 74 /** Data for stateful connections */75 void *remote_state_data;76 };77 78 /** Exchange data */79 struct _async_exch {80 /** Link into list of inactive exchanges */81 link_t sess_link;82 83 /** Link into global list of inactive exchanges */84 link_t global_link;85 86 /** Session pointer */87 async_sess_t *sess;88 89 /** Exchange identification */90 int phone;91 };92 93 45 /** Structures of this type are used to track the timeout events. */ 94 46 typedef struct { … … 129 81 } awaiter_t; 130 82 131 /** Message data */132 typedef struct {133 awaiter_t wdata;134 135 /** If reply was received. */136 bool done;137 138 /** Pointer to where the answer data is stored. */139 ipc_call_t *dataptr;140 141 sysarg_t retval;142 } amsg_t;143 144 83 extern void __async_init(void); 145 84 extern void async_insert_timeout(awaiter_t *); -
uspace/lib/c/include/async.h
rc69646f8 r5da7199 96 96 97 97 /** Forward declarations */ 98 struct _async_exch;99 struct _async_sess;100 101 typedef struct _async_sess async_sess_t;102 typedef struct _async_exch async_exch_t;98 struct async_exch; 99 struct async_sess; 100 101 typedef struct async_sess async_sess_t; 102 typedef struct async_exch async_exch_t; 103 103 104 104 extern atomic_t threads_in_ipc_wait; -
uspace/srv/hid/input/generic/input.c
rc69646f8 r5da7199 47 47 #include <stdio.h> 48 48 #include <ns.h> 49 #include <ns_obsolete.h>50 49 #include <async.h> 51 #include <async_obsolete.h>52 50 #include <errno.h> 53 51 #include <adt/fifo.h> … … 63 61 #include <mouse.h> 64 62 65 // FIXME: remove this header66 #include <abi/ipc/methods.h>67 68 63 #define NUM_LAYOUTS 3 69 64 … … 77 72 static void kbd_devs_reclaim(void); 78 73 79 int client_phone = -1;74 async_sess_t *client_sess = NULL; 80 75 81 76 /** List of keyboard devices */ … … 86 81 87 82 bool irc_service = false; 88 int irc_phone = -1;83 async_sess_t *irc_sess = NULL; 89 84 90 85 void kbd_push_data(kbd_dev_t *kdev, sysarg_t data) … … 170 165 171 166 ev.c = layout_parse_ev(kdev->active_layout, &ev); 172 async_obsolete_msg_4(client_phone, INPUT_EVENT_KEY, ev.type, ev.key, 173 ev.mods, ev.c); 167 168 async_exch_t *exch = async_exchange_begin(client_sess); 169 async_msg_4(exch, INPUT_EVENT_KEY, ev.type, ev.key, ev.mods, ev.c); 170 async_exchange_end(exch); 174 171 } 175 172 … … 177 174 void mouse_push_event_move(mouse_dev_t *mdev, int dx, int dy) 178 175 { 179 async_obsolete_msg_2(client_phone, INPUT_EVENT_MOVE, dx, dy); 176 async_exch_t *exch = async_exchange_begin(client_sess); 177 async_msg_2(exch, INPUT_EVENT_MOVE, dx, dy); 178 async_exchange_end(exch); 180 179 } 181 180 … … 183 182 void mouse_push_event_button(mouse_dev_t *mdev, int bnum, int press) 184 183 { 185 async_obsolete_msg_2(client_phone, INPUT_EVENT_BUTTON, bnum, press); 184 async_exch_t *exch = async_exchange_begin(client_sess); 185 async_msg_2(exch, INPUT_EVENT_BUTTON, bnum, press); 186 async_exchange_end(exch); 186 187 } 187 188 188 189 static void client_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg) 189 190 { 190 ipc_callid_t callid;191 ipc_call_t call;192 int retval;193 194 191 async_answer_0(iid, EOK); 195 192 196 193 while (true) { 197 callid = async_get_call(&call); 194 ipc_call_t call; 195 ipc_callid_t callid = async_get_call(&call); 198 196 199 197 if (!IPC_GET_IMETHOD(call)) { 200 if (client_ phone != -1) {201 async_ obsolete_hangup(client_phone);202 client_ phone = -1;198 if (client_sess != NULL) { 199 async_hangup(client_sess); 200 client_sess = NULL; 203 201 } 204 202 … … 207 205 } 208 206 209 switch (IPC_GET_IMETHOD(call)) { 210 case IPC_M_CONNECT_TO_ME: 211 if (client_phone != -1) { 212 retval = ELIMIT; 207 async_sess_t *sess = 208 async_callback_receive_start(EXCHANGE_SERIALIZE, &call); 209 if (sess != NULL) { 210 if (client_sess == NULL) { 211 client_sess = sess; 212 async_answer_0(callid, EOK); 213 } else 214 async_answer_0(callid, ELIMIT); 215 } else { 216 switch (IPC_GET_IMETHOD(call)) { 217 case INPUT_YIELD: 218 kbd_devs_yield(); 219 async_answer_0(callid, EOK); 213 220 break; 221 case INPUT_RECLAIM: 222 kbd_devs_reclaim(); 223 async_answer_0(callid, EOK); 224 break; 225 default: 226 async_answer_0(callid, EINVAL); 214 227 } 215 client_phone = IPC_GET_ARG5(call);216 retval = 0;217 break;218 case INPUT_YIELD:219 kbd_devs_yield();220 retval = 0;221 break;222 case INPUT_RECLAIM:223 kbd_devs_reclaim();224 retval = 0;225 break;226 default:227 retval = EINVAL;228 228 } 229 230 async_answer_0(callid, retval);231 229 } 232 230 } … … 648 646 649 647 if (irc_service) { 650 while (irc_phone < 0) 651 irc_phone = service_obsolete_connect_blocking(SERVICE_IRC, 0, 0); 648 while (irc_sess == NULL) 649 irc_sess = service_connect_blocking(EXCHANGE_SERIALIZE, 650 SERVICE_IRC, 0, 0); 652 651 } 653 652 -
uspace/srv/hid/input/include/input.h
rc69646f8 r5da7199 40 40 41 41 #include <bool.h> 42 #include <async.h> 42 43 43 44 #define NAME "input" … … 45 46 46 47 extern bool irc_service; 47 extern int irc_phone;48 extern async_sess_t *irc_sess; 48 49 49 50 #endif -
uspace/srv/hid/input/port/ns16550.c
rc69646f8 r5da7199 38 38 #include <ipc/irc.h> 39 39 #include <async.h> 40 #include <async_obsolete.h>41 40 #include <sysinfo.h> 42 41 #include <input.h> … … 158 157 kbd_push_data(kbd_dev, IPC_GET_ARG2(*call)); 159 158 160 if (irc_service) 161 async_obsolete_msg_1(irc_phone, IRC_CLEAR_INTERRUPT, 162 IPC_GET_IMETHOD(*call)); 159 if (irc_service) { 160 async_exch_t *exch = async_exchange_begin(irc_sess); 161 async_msg_1(exch, IRC_CLEAR_INTERRUPT, IPC_GET_IMETHOD(*call)); 162 async_exchange_end(exch); 163 } 163 164 } 164 165 -
uspace/srv/hid/s3c24xx_ts/s3c24xx_ts.c
rc69646f8 r5da7199 44 44 #include <ipc/mouseev.h> 45 45 #include <async.h> 46 #include <async_obsolete.h>47 46 #include <unistd.h> 48 47 #include <stdio.h> … … 53 52 #include "s3c24xx_ts.h" 54 53 55 // FIXME: remove this header 56 #include <abi/ipc/methods.h> 57 58 #define NAME "s3c24ser" 59 #define NAMESPACE "hid" 54 #define NAME "s3c24ser" 55 #define NAMESPACE "hid" 60 56 61 57 static irq_cmd_t ts_irq_cmds[] = { … … 134 130 135 131 ts->io = vaddr; 136 ts->client_ phone = -1;132 ts->client_sess = NULL; 137 133 ts->state = ts_wait_pendown; 138 134 ts->last_x = 0; … … 284 280 button = 1; 285 281 press = 0; 286 async_obsolete_msg_2(ts->client_phone, MOUSEEV_BUTTON_EVENT, button, press); 282 283 async_exch_t *exch = async_exchange_begin(ts->client_sess); 284 async_msg_2(exch, MOUSEEV_BUTTON_EVENT, button, press); 285 async_exchange_end(exch); 287 286 288 287 s3c24xx_ts_wait_for_int_mode(ts, updn_down); … … 325 324 326 325 /* Send notifications to client. */ 327 async_obsolete_msg_2(ts->client_phone, MOUSEEV_MOVE_EVENT, dx, dy); 328 async_obsolete_msg_2(ts->client_phone, MOUSEEV_BUTTON_EVENT, button, press); 326 async_exch_t *exch = async_exchange_begin(ts->client_sess); 327 async_msg_2(exch, MOUSEEV_MOVE_EVENT, dx, dy); 328 async_msg_2(exch, MOUSEEV_BUTTON_EVENT, button, press); 329 async_exchange_end(exch); 329 330 330 331 ts->last_x = x_pos; … … 377 378 void *arg) 378 379 { 379 ipc_callid_t callid;380 ipc_call_t call;381 int retval;382 383 380 async_answer_0(iid, EOK); 384 385 while (1) { 386 callid = async_get_call(&call); 381 382 while (true) { 383 ipc_call_t call; 384 ipc_callid_t callid = async_get_call(&call); 387 385 388 386 if (!IPC_GET_IMETHOD(call)) { 389 if (ts->client_ phone != -1) {390 async_ obsolete_hangup(ts->client_phone);391 ts->client_ phone = -1;387 if (ts->client_sess != NULL) { 388 async_hangup(ts->client_sess); 389 ts->client_sess = NULL; 392 390 } 393 391 394 392 async_answer_0(callid, EOK); 395 393 return; 396 394 } 397 395 398 switch (IPC_GET_IMETHOD(call)) { 399 case IPC_M_CONNECT_TO_ME: 400 if (ts->client_phone != -1) { 401 retval = ELIMIT; 402 break; 403 } 404 ts->client_phone = IPC_GET_ARG5(call); 405 retval = 0; 406 break; 407 default: 408 retval = EINVAL; 409 } 410 async_answer_0(callid, retval); 396 async_sess_t *sess = 397 async_callback_receive_start(EXCHANGE_SERIALIZE, &call); 398 if (sess != NULL) { 399 if (ts->client_sess == NULL) { 400 ts->client_sess = sess; 401 async_answer_0(callid, EOK); 402 } else 403 async_answer_0(callid, ELIMIT); 404 } else 405 async_answer_0(callid, EINVAL); 411 406 } 412 407 } -
uspace/srv/hid/s3c24xx_ts/s3c24xx_ts.h
rc69646f8 r5da7199 39 39 40 40 #include <sys/types.h> 41 #include <async.h> 41 42 42 43 /** S3C24xx ADC and touch-screen I/O */ … … 121 122 s3c24xx_adc_io_t *io; 122 123 123 /** Callback phoneto the client */124 int client_phone;124 /** Callback session to the client */ 125 async_sess_t *client_sess; 125 126 126 127 /** Service ID */ -
uspace/srv/hw/bus/cuda_adb/cuda_adb.c
rc69646f8 r5da7199 48 48 #include <ipc/adb.h> 49 49 #include <async.h> 50 #include <async_obsolete.h>51 50 #include <assert.h> 52 51 #include "cuda_adb.h" 53 52 54 // FIXME: remove this header 55 #include <abi/ipc/methods.h> 56 57 #define NAME "cuda_adb" 53 #define NAME "cuda_adb" 58 54 59 55 static void cuda_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg); … … 154 150 155 151 for (i = 0; i < ADB_MAX_ADDR; ++i) { 156 adb_dev[i].client_ phone = -1;152 adb_dev[i].client_sess = NULL; 157 153 adb_dev[i].service_id = 0; 158 154 } … … 199 195 sysarg_t method; 200 196 service_id_t dsid; 201 int retval;202 197 int dev_addr, i; 203 198 … … 220 215 async_answer_0(iid, EOK); 221 216 222 while ( 1) {217 while (true) { 223 218 callid = async_get_call(&call); 224 219 method = IPC_GET_IMETHOD(call); … … 230 225 } 231 226 232 switch (method) { 233 case IPC_M_CONNECT_TO_ME: 234 if (adb_dev[dev_addr].client_phone != -1) { 235 retval = ELIMIT; 236 break; 237 } 238 adb_dev[dev_addr].client_phone = IPC_GET_ARG5(call); 239 /* 240 * A hack so that we send the data to the phone 241 * regardless of which address the device is on. 242 */ 243 for (i = 0; i < ADB_MAX_ADDR; ++i) { 244 if (adb_dev[i].service_id == dsid) { 245 adb_dev[i].client_phone = IPC_GET_ARG5(call); 227 async_sess_t *sess = 228 async_callback_receive_start(EXCHANGE_SERIALIZE, &call); 229 if (sess != NULL) { 230 if (adb_dev[dev_addr].client_sess == NULL) { 231 adb_dev[dev_addr].client_sess = sess; 232 233 /* 234 * A hack so that we send the data to the session 235 * regardless of which address the device is on. 236 */ 237 for (i = 0; i < ADB_MAX_ADDR; ++i) { 238 if (adb_dev[i].service_id == dsid) 239 adb_dev[i].client_sess = sess; 246 240 } 247 } 248 retval = 0; 249 break; 250 default: 251 retval = EINVAL; 252 break; 253 } 254 async_answer_0(callid, retval); 241 242 async_answer_0(callid, EOK); 243 } else 244 async_answer_0(callid, ELIMIT); 245 } else 246 async_answer_0(callid, EINVAL); 255 247 } 256 248 } … … 483 475 reg_val = ((uint16_t) data[1] << 8) | (uint16_t) data[2]; 484 476 485 if (adb_dev[dev_addr].client_phone == -1) 486 return; 487 488 async_obsolete_msg_1(adb_dev[dev_addr].client_phone, ADB_REG_NOTIF, reg_val); 477 if (adb_dev[dev_addr].client_sess == NULL) 478 return; 479 480 async_exch_t *exch = 481 async_exchange_begin(adb_dev[dev_addr].client_sess); 482 async_msg_1(exch, ADB_REG_NOTIF, reg_val); 483 async_exchange_end(exch); 489 484 } 490 485 -
uspace/srv/hw/bus/cuda_adb/cuda_adb.h
rc69646f8 r5da7199 38 38 39 39 #include <sys/types.h> 40 #include < ipc/loc.h>40 #include <async.h> 41 41 #include <fibril_synch.h> 42 42 … … 105 105 typedef struct { 106 106 service_id_t service_id; 107 int client_phone;107 async_sess_t *client_sess; 108 108 } adb_dev_t; 109 109 -
uspace/srv/hw/char/i8042/i8042.c
rc69646f8 r5da7199 32 32 * @ingroup kbd 33 33 * @{ 34 */ 34 */ 35 35 /** @file 36 36 * @brief i8042 PS/2 port driver. … … 41 41 #include <loc.h> 42 42 #include <async.h> 43 #include <async_obsolete.h>44 43 #include <unistd.h> 45 44 #include <sysinfo.h> … … 49 48 #include "i8042.h" 50 49 51 // FIXME: remove this header 52 #include <abi/ipc/methods.h> 53 54 #define NAME "i8042" 55 #define NAMESPACE "char" 50 #define NAME "i8042" 51 #define NAMESPACE "char" 56 52 57 53 /* Interesting bits for status register */ … … 145 141 146 142 for (i = 0; i < MAX_DEVS; i++) { 147 i8042_port[i].client_ phone = -1;143 i8042_port[i].client_sess = NULL; 148 144 149 145 snprintf(name, 16, "%s/ps2%c", NAMESPACE, dchar[i]); … … 257 253 } 258 254 259 switch (method) { 260 case IPC_M_CONNECT_TO_ME: 261 printf(NAME ": creating callback connection\n"); 262 if (i8042_port[dev_id].client_phone != -1) { 255 async_sess_t *sess = 256 async_callback_receive_start(EXCHANGE_SERIALIZE, &call); 257 if (sess != NULL) { 258 if (i8042_port[dev_id].client_sess == NULL) { 259 i8042_port[dev_id].client_sess = sess; 260 retval = EOK; 261 } else 263 262 retval = ELIMIT; 263 } else { 264 switch (method) { 265 case IPC_FIRST_USER_METHOD: 266 printf(NAME ": write %" PRIun " to devid %d\n", 267 IPC_GET_ARG1(call), dev_id); 268 i8042_port_write(dev_id, IPC_GET_ARG1(call)); 269 retval = 0; 270 break; 271 default: 272 retval = EINVAL; 264 273 break; 265 274 } 266 i8042_port[dev_id].client_phone = IPC_GET_ARG5(call);267 retval = 0;268 break;269 case IPC_FIRST_USER_METHOD:270 printf(NAME ": write %" PRIun " to devid %d\n",271 IPC_GET_ARG1(call), dev_id);272 i8042_port_write(dev_id, IPC_GET_ARG1(call));273 retval = 0;274 break;275 default:276 retval = EINVAL;277 break;278 275 } 276 279 277 async_answer_0(callid, retval); 280 278 } … … 305 303 } 306 304 307 if (i8042_port[devid].client_phone != -1) { 308 async_obsolete_msg_1(i8042_port[devid].client_phone, 309 IPC_FIRST_USER_METHOD, data); 305 if (i8042_port[devid].client_sess != NULL) { 306 async_exch_t *exch = 307 async_exchange_begin(i8042_port[devid].client_sess); 308 async_msg_1(exch, IPC_FIRST_USER_METHOD, data); 309 async_exchange_end(exch); 310 310 } 311 311 } -
uspace/srv/hw/char/i8042/i8042.h
rc69646f8 r5da7199 39 39 #define i8042_H_ 40 40 41 #include <sys/types.h> 41 42 #include <libarch/ddi.h> 42 #include < libarch/types.h>43 #include <async.h> 43 44 44 45 /** i8042 HW I/O interface */ … … 53 54 typedef struct { 54 55 service_id_t service_id; 55 int client_phone;56 async_sess_t *client_sess; 56 57 } i8042_port_t; 57 58 … … 60 61 /** 61 62 * @} 62 */ 63 */ -
uspace/srv/hw/char/s3c24xx_uart/s3c24xx_uart.c
rc69646f8 r5da7199 42 42 #include <ipc/char.h> 43 43 #include <async.h> 44 #include <async_obsolete.h>45 44 #include <unistd.h> 46 45 #include <stdio.h> … … 51 50 #include "s3c24xx_uart.h" 52 51 53 // FIXME: remove this header 54 #include <abi/ipc/methods.h> 55 56 #define NAME "s3c24ser" 57 #define NAMESPACE "char" 52 #define NAME "s3c24ser" 53 #define NAMESPACE "char" 58 54 59 55 static irq_cmd_t uart_irq_cmds[] = { … … 117 113 void *arg) 118 114 { 119 ipc_callid_t callid;120 ipc_call_t call;121 sysarg_t method;122 int retval;123 124 115 /* Answer the IPC_M_CONNECT_ME_TO call. */ 125 116 async_answer_0(iid, EOK); 126 127 while (1) { 128 callid = async_get_call(&call); 129 method = IPC_GET_IMETHOD(call); 117 118 while (true) { 119 ipc_call_t call; 120 ipc_callid_t callid = async_get_call(&call); 121 sysarg_t method = IPC_GET_IMETHOD(call); 130 122 131 123 if (!method) { … … 135 127 } 136 128 137 switch (method) { 138 case IPC_M_CONNECT_TO_ME: 139 printf(NAME ": creating callback connection\n"); 140 uart->client_phone = IPC_GET_ARG5(call); 141 retval = 0; 142 break; 143 case CHAR_WRITE_BYTE: 144 printf(NAME ": write %" PRIun " to device\n", 145 IPC_GET_ARG1(call)); 146 s3c24xx_uart_sendb(uart, (uint8_t) IPC_GET_ARG1(call)); 147 retval = 0; 148 break; 149 default: 150 retval = EINVAL; 151 break; 129 async_sess_t *sess = 130 async_callback_receive_start(EXCHANGE_SERIALIZE, &call); 131 if (sess != NULL) { 132 if (uart->client_sess == NULL) { 133 uart->client_sess = sess; 134 async_answer_0(callid, EOK); 135 } else 136 async_answer_0(callid, ELIMIT); 137 } else { 138 switch (method) { 139 case CHAR_WRITE_BYTE: 140 printf(NAME ": write %" PRIun " to device\n", 141 IPC_GET_ARG1(call)); 142 s3c24xx_uart_sendb(uart, (uint8_t) IPC_GET_ARG1(call)); 143 async_answer_0(callid, EOK); 144 break; 145 default: 146 async_answer_0(callid, EINVAL); 147 } 152 148 } 153 async_answer_0(callid, retval);154 149 } 155 150 } … … 163 158 uint32_t status = pio_read_32(&uart->io->uerstat); 164 159 165 if (uart->client_phone != -1) { 166 async_obsolete_msg_1(uart->client_phone, CHAR_NOTIF_BYTE, 167 data); 160 if (uart->client_sess != NULL) { 161 async_exch_t *exch = async_exchange_begin(uart->client_sess); 162 async_msg_1(exch, CHAR_NOTIF_BYTE, data); 163 async_exchange_end(exch); 168 164 } 169 165 … … 191 187 192 188 uart->io = vaddr; 193 uart->client_ phone = -1;189 uart->client_sess = NULL; 194 190 195 191 printf(NAME ": device at physical address %p, inr %" PRIun ".\n", -
uspace/srv/hw/char/s3c24xx_uart/s3c24xx_uart.h
rc69646f8 r5da7199 39 39 40 40 #include <sys/types.h> 41 #include <async.h> 41 42 42 43 /** S3C24xx UART I/O */ … … 84 85 s3c24xx_uart_io_t *io; 85 86 86 /** Callback phoneto the client */87 int client_phone;87 /** Callback session to the client */ 88 async_sess_t *client_sess; 88 89 89 90 /** Service ID */
Note:
See TracChangeset
for help on using the changeset viewer.