Subversion Repositories HelenOS

Rev

Rev 4327 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4327 Rev 4581
Line 30... Line 30...
30
#include <unistd.h>
30
#include <unistd.h>
31
#include <ipc/ipc.h>
31
#include <ipc/ipc.h>
32
#include <ipc/services.h>
32
#include <ipc/services.h>
33
#include <async.h>
33
#include <async.h>
34
#include <errno.h>
34
#include <errno.h>
35
#include <ipc/devmap.h>
35
#include <devmap.h>
36
#include "../tester.h"
36
#include "../tester.h"
37
 
37
 
38
#include <time.h>
38
#include <time.h>
39
 
39
 
40
#define TEST_DEVICE1 "TestDevice1"
40
#define TEST_DEVICE1 "TestDevice1"
Line 82... Line 82...
82
    int handle;
82
    int handle;
83
    int device_phone;
83
    int device_phone;
84
 
84
 
85
    handle = (int)arg;
85
    handle = (int)arg;
86
 
86
 
87
    device_phone = ipc_connect_me_to(PHONE_NS, SERVICE_DEVMAP,
87
    device_phone = devmap_device_connect(handle, 0);
88
        DEVMAP_CONNECT_TO_DEVICE, handle);
-
 
89
 
-
 
90
    if (device_phone < 0) {
88
    if (device_phone < 0) {
91
        printf("Failed to connect to devmap as client (handle = %u).\n",
89
        printf("Failed to connect to device (handle = %u).\n",
92
            handle);
90
            handle);
93
        return -1;
91
        return -1;
94
    }
92
    }
95
/* 
-
 
96
 *  device_phone = (int) IPC_GET_ARG5(answer);
-
 
97
 */
93
 
98
    printf("Connected to device.\n");
94
    printf("Connected to device.\n");
99
    ipc_call_sync_1_0(device_phone, 1024, 1025);
-
 
100
/*
-
 
101
 * ipc_hangup(device_phone);
-
 
102
 */
-
 
103
    ipc_hangup(device_phone);
95
    ipc_hangup(device_phone);
104
 
96
 
105
    return EOK;
97
    return EOK;
106
}
98
}
107
 
99
 
Line 119... Line 111...
119
 
111
 
120
*/
112
*/
121
    return EOK;
113
    return EOK;
122
}
114
}
123
 
115
 
124
/**
-
 
125
 *
-
 
126
 */
-
 
127
static int driver_register(char *name)
-
 
128
{
-
 
129
    ipcarg_t retval;
-
 
130
    aid_t req;
-
 
131
    ipc_call_t answer;
-
 
132
    int phone;
-
 
133
    ipcarg_t callback_phonehash;
-
 
134
 
-
 
135
    phone = ipc_connect_me_to_blocking(PHONE_NS, SERVICE_DEVMAP, DEVMAP_DRIVER, 0);
-
 
136
    if (phone < 0) {
-
 
137
        printf("Failed to connect to device mapper\n");
-
 
138
        return -1;
-
 
139
    }
-
 
140
   
-
 
141
    req = async_send_2(phone, DEVMAP_DRIVER_REGISTER, 0, 0, &answer);
-
 
142
 
-
 
143
    retval = ipc_data_write_start(phone, (char *)name, str_size(name) + 1);
-
 
144
 
-
 
145
    if (retval != EOK) {
-
 
146
        async_wait_for(req, NULL);
-
 
147
        return -1;
-
 
148
    }
-
 
149
 
-
 
150
    async_set_client_connection(driver_client_connection);
-
 
151
 
-
 
152
    ipc_connect_to_me(phone, 0, 0, 0, &callback_phonehash);
-
 
153
/* 
-
 
154
    if (NULL == async_new_connection(callback_phonehash, 0, NULL,
-
 
155
            driver_client_connection)) {
-
 
156
        printf("Failed to create new fibril.\n");  
-
 
157
        async_wait_for(req, NULL);
-
 
158
        return -1;
-
 
159
    }
-
 
160
*/
-
 
161
    async_wait_for(req, &retval);
-
 
162
    printf("Driver '%s' registered.\n", name);
-
 
163
 
-
 
164
    return phone;
-
 
165
}
-
 
166
 
-
 
167
static int device_get_handle(int driver_phone, char *name, int *handle)
-
 
168
{
-
 
169
    ipcarg_t retval;
-
 
170
    aid_t req;
-
 
171
    ipc_call_t answer;
-
 
172
 
-
 
173
    req = async_send_2(driver_phone, DEVMAP_DEVICE_GET_HANDLE, 0, 0,
-
 
174
        &answer);
-
 
175
 
-
 
176
    retval = ipc_data_write_start(driver_phone, name, str_size(name) + 1);
-
 
177
 
-
 
178
    if (retval != EOK) {
-
 
179
        printf("Failed to send device name '%s'.\n", name);
-
 
180
        async_wait_for(req, NULL);
-
 
181
        return retval;
-
 
182
    }
-
 
183
 
-
 
184
    async_wait_for(req, &retval);
-
 
185
 
-
 
186
    if (NULL != handle) {
-
 
187
        *handle = -1;
-
 
188
    }
-
 
189
 
-
 
190
    if (EOK == retval) {
-
 
191
       
-
 
192
        if (NULL != handle) {
-
 
193
            *handle = (int) IPC_GET_ARG1(answer);
-
 
194
        }
-
 
195
        printf("Device '%s' has handle %u.\n", name,
-
 
196
            (int) IPC_GET_ARG1(answer));
-
 
197
    } else {
-
 
198
        printf("Failed to get handle for device '%s'.\n", name);
-
 
199
    }
-
 
200
 
-
 
201
    return retval;
-
 
202
}
-
 
203
 
-
 
204
/** Register new device.
-
 
205
 * @param driver_phone
-
 
206
 * @param name Device name.
-
 
207
 * @param handle Output variable. Handle to the created instance of device.
-
 
208
 */
-
 
209
static int device_register(int driver_phone, char *name, int *handle)
-
 
210
{
-
 
211
    ipcarg_t retval;
-
 
212
    aid_t req;
-
 
213
    ipc_call_t answer;
-
 
214
 
-
 
215
    req = async_send_2(driver_phone, DEVMAP_DEVICE_REGISTER, 0, 0, &answer);
-
 
216
 
-
 
217
    retval = ipc_data_write_start(driver_phone, (char *)name,
-
 
218
        str_size(name) + 1);
-
 
219
 
-
 
220
    if (retval != EOK) {
-
 
221
        printf("Failed to send device name '%s'.\n", name);
-
 
222
        async_wait_for(req, NULL);
-
 
223
        return retval;
-
 
224
    }
-
 
225
 
-
 
226
    async_wait_for(req, &retval);
-
 
227
 
-
 
228
    if (NULL != handle) {
-
 
229
        *handle = -1;
-
 
230
    }
-
 
231
 
-
 
232
    if (EOK == retval) {
-
 
233
       
-
 
234
        if (NULL != handle) {
-
 
235
            *handle = (int) IPC_GET_ARG1(answer);
-
 
236
        }
-
 
237
        printf("Device registered with handle %u.\n",
-
 
238
            (int) IPC_GET_ARG1(answer));
-
 
239
    }
-
 
240
 
-
 
241
    return retval;
-
 
242
}
-
 
243
 
-
 
244
/** Test DevMap from the driver's point of view.
116
/** Test DevMap from the driver's point of view.
245
 *
117
 *
246
 *
118
 *
247
 */
119
 */
248
char * test_devmap1(bool quiet)
120
char * test_devmap1(bool quiet)
249
{
121
{
250
    int driver_phone;
122
    const char *retval = NULL;
251
    int dev1_handle;
-
 
252
    int dev2_handle;
-
 
253
    int dev3_handle;
-
 
254
    int handle;
-
 
255
 
123
   
256
    /* Register new driver */
124
    /* Register new driver */
257
    driver_phone = driver_register("TestDriver");
125
    int rc = devmap_driver_register("TestDriver", driver_client_connection);
258
 
-
 
259
    if (driver_phone < 0) {
126
    if (rc < 0) {
260
        return "Error: Cannot register driver.\n"; 
127
        retval = "Error: Cannot register driver.\n";
-
 
128
        goto out;
261
    }
129
    }
262
 
130
   
263
    /* Register new device dev1*/
131
    /* Register new device dev1. */
-
 
132
    dev_handle_t dev1_handle;
264
    if (EOK != device_register(driver_phone, TEST_DEVICE1, &dev1_handle)) {
133
    rc = devmap_device_register(TEST_DEVICE1, &dev1_handle);
265
        ipc_hangup(driver_phone);
134
    if (rc != EOK) {
266
        return "Error: cannot register device.\n";
135
        retval = "Error: cannot register device.\n";
-
 
136
        goto out;
267
    }
137
    }
268
 
138
   
-
 
139
    /*
269
    /* Get handle for dev2 (Should fail unless device is already
140
     * Get handle for dev2 (Should fail unless device is already registered
270
     * registered by someone else)
141
     * by someone else).
271
     */
142
     */
-
 
143
    dev_handle_t handle;
272
    if (EOK == device_get_handle(driver_phone, TEST_DEVICE2, &handle)) {
144
    rc = devmap_device_get_handle(TEST_DEVICE2, &handle, 0);
273
        ipc_hangup(driver_phone);
145
    if (rc == EOK) {
274
        return "Error: got handle for dev2 before it was registered.\n";
146
        retval = "Error: got handle for dev2 before it was registered.\n";
-
 
147
        goto out;
275
    }
148
    }
276
 
149
   
277
    /* Register new device dev2*/
150
    /* Register new device dev2. */
-
 
151
    dev_handle_t dev2_handle;
278
    if (EOK != device_register(driver_phone, TEST_DEVICE2, &dev2_handle)) {
152
    rc = devmap_device_register(TEST_DEVICE2, &dev2_handle);
279
        ipc_hangup(driver_phone);
153
    if (rc != EOK) {
280
        return "Error: cannot register device dev2.\n";
154
        retval = "Error: cannot register device dev2.\n";
-
 
155
        goto out;
281
    }
156
    }
282
 
157
   
283
    /* Register again device dev1 */
158
    /* Register device dev1 again. */
-
 
159
    dev_handle_t dev3_handle;
284
    if (EOK == device_register(driver_phone, TEST_DEVICE1, &dev3_handle)) {
160
    rc = devmap_device_register(TEST_DEVICE1, &dev3_handle);
-
 
161
    if (rc == EOK) {
285
        return "Error: dev1 registered twice.\n";
162
        retval = "Error: dev1 registered twice.\n";
-
 
163
        goto out;
286
    }
164
    }
287
 
165
   
288
    /* Get handle for dev1*/
166
    /* Get handle for dev1. */
289
    if (EOK != device_get_handle(driver_phone, TEST_DEVICE1, &handle)) {
167
    rc = devmap_device_get_handle(TEST_DEVICE1, &handle, 0);
290
        ipc_hangup(driver_phone);
168
    if (rc != EOK) {
291
        return "Error: cannot get handle for 'DEVMAP_DEVICE1'.\n";
169
        retval = "Error: cannot get handle for 'DEVMAP_DEVICE1'.\n";
-
 
170
        goto out;
292
    }
171
    }
293
 
172
   
294
    if (handle != dev1_handle) {
173
    if (handle != dev1_handle) {
295
        ipc_hangup(driver_phone);
-
 
296
        return "Error: cannot get handle for 'DEVMAP_DEVICE1'.\n";
174
        retval = "Error: cannot get handle for 'DEVMAP_DEVICE1'.\n";
-
 
175
        goto out;
297
    }
176
    }
298
 
177
   
299
    if (EOK != device_client(dev1_handle)) {
178
    if (device_client(dev1_handle) != EOK) {
300
        ipc_hangup(driver_phone);
-
 
301
        return "Error: failed client test for 'DEVMAP_DEVICE1'.\n";
179
        retval = "Error: failed client test for 'DEVMAP_DEVICE1'.\n";
-
 
180
        goto out;
302
    }
181
    }
303
 
182
   
304
    /* TODO: */
-
 
305
 
183
out:
-
 
184
    devmap_hangup_phone(DEVMAP_DRIVER);
306
    ipc_hangup(driver_phone);
185
    devmap_hangup_phone(DEVMAP_CLIENT);
307
 
186
   
308
    return NULL;
187
    return NULL;
309
}
188
}
310
 
189
 
311
char *test_devmap2(bool quiet)
190
char *test_devmap2(bool quiet)
312
{
191
{