00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00035 #include <errno.h>
00036 #include <str.h>
00037 #include <stdio.h>
00038 #include <assert.h>
00039 #include <async.h>
00040 #include <devman.h>
00041 #include <usbvirt/device.h>
00042 #include <usbvirt/ipc.h>
00043
00044 #include <usb/debug.h>
00045
00047 static usbvirt_device_t *DEV = NULL;
00048
00054 static void callback_connection(ipc_callid_t iid, ipc_call_t *icall)
00055 {
00056 assert(DEV != NULL);
00057
00058 async_answer_0(iid, EOK);
00059
00060 while (true) {
00061 ipc_callid_t callid;
00062 ipc_call_t call;
00063
00064 callid = async_get_call(&call);
00065 bool processed = usbvirt_ipc_handle_call(DEV, callid, &call);
00066 if (!processed) {
00067 switch (IPC_GET_IMETHOD(call)) {
00068 case IPC_M_PHONE_HUNGUP:
00069 async_answer_0(callid, EOK);
00070 return;
00071 default:
00072 async_answer_0(callid, EINVAL);
00073 break;
00074 }
00075 }
00076 }
00077 }
00078
00085 int usbvirt_device_plug(usbvirt_device_t *dev, const char *vhc_path)
00086 {
00087 int rc;
00088 devman_handle_t handle;
00089
00090 if (DEV != NULL) {
00091 return ELIMIT;
00092 }
00093
00094 rc = devman_device_get_handle(vhc_path, &handle, 0);
00095 if (rc != EOK) {
00096 return rc;
00097 }
00098
00099 int hcd_phone = devman_device_connect(handle, 0);
00100
00101 if (hcd_phone < 0) {
00102 return hcd_phone;
00103 }
00104
00105 DEV = dev;
00106 dev->vhc_phone = hcd_phone;
00107
00108 rc = async_connect_to_me(hcd_phone, 0, 0, 0, callback_connection);
00109 if (rc != EOK) {
00110 DEV = NULL;
00111 }
00112
00113 return rc;
00114 }
00115
00120 void usbvirt_device_unplug(usbvirt_device_t *dev)
00121 {
00122 async_hangup(dev->vhc_phone);
00123 }
00124