source: mainline/uspace/app/tester/devmap/devmap1.c@ 287e83f

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 287e83f was 1090b8c, checked in by Jiri Svoboda <jirik.svoboda@…>, 17 years ago

C binding for devmap. Gets rid of duplicate code.

  • Property mode set to 100644
File size: 5.1 KB
Line 
1/*
2 * Copyright (c) 2007 Josef Cejka
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <stdio.h>
30#include <unistd.h>
31#include <ipc/ipc.h>
32#include <ipc/services.h>
33#include <async.h>
34#include <errno.h>
35#include <devmap.h>
36#include "../tester.h"
37
38#include <time.h>
39
40#define TEST_DEVICE1 "TestDevice1"
41#define TEST_DEVICE2 "TestDevice2"
42
43/** Handle requests from clients
44 *
45 */
46static void driver_client_connection(ipc_callid_t iid, ipc_call_t *icall)
47{
48 ipc_callid_t callid;
49 ipc_call_t call;
50 int retval;
51
52 printf("connected: method=%u arg1=%u, arg2=%u arg3=%u.\n",
53 IPC_GET_METHOD(*icall), IPC_GET_ARG1(*icall), IPC_GET_ARG2(*icall),
54 IPC_GET_ARG3(*icall));
55
56 printf("driver_client_connection.\n");
57 ipc_answer_0(iid, EOK);
58
59 /* Ignore parameters, the connection is already opened */
60 while (1) {
61 callid = async_get_call(&call);
62 retval = EOK;
63 printf("method=%u arg1=%u, arg2=%u arg3=%u.\n",
64 IPC_GET_METHOD(call), IPC_GET_ARG1(call),
65 IPC_GET_ARG2(call), IPC_GET_ARG3(call));
66 switch (IPC_GET_METHOD(call)) {
67 case IPC_M_PHONE_HUNGUP:
68 /* TODO: Handle hangup */
69 return;
70 default:
71 printf("Unknown device method %u.\n",
72 IPC_GET_METHOD(call));
73 retval = ENOENT;
74 }
75 ipc_answer_0(callid, retval);
76 }
77 return;
78}
79
80static int device_client_fibril(void *arg)
81{
82 int handle;
83 int device_phone;
84
85 handle = (int)arg;
86
87 device_phone = devmap_device_connect(handle, 0);
88 if (device_phone < 0) {
89 printf("Failed to connect to device (handle = %u).\n",
90 handle);
91 return -1;
92 }
93
94 printf("Connected to device.\n");
95 ipc_hangup(device_phone);
96
97 return EOK;
98}
99
100/** Communication test with device.
101 * @param handle handle to tested instance.
102 */
103static int device_client(int handle)
104{
105/* fid_t fid;
106 ipc_call_t call;
107 ipc_callid_t callid;
108
109 fid = fibril_create(device_client_fibril, (void *)handle);
110 fibril_add_ready(fid);
111
112*/
113 return EOK;
114}
115
116/** Test DevMap from the driver's point of view.
117 *
118 *
119 */
120char * test_devmap1(bool quiet)
121{
122 int driver_phone;
123 int dev1_handle;
124 int dev2_handle;
125 int dev3_handle;
126 int handle;
127 int rc;
128
129 /* Register new driver */
130 driver_phone = devmap_driver_register("TestDriver",
131 driver_client_connection);
132
133 if (driver_phone < 0) {
134 return "Error: Cannot register driver.\n";
135 }
136
137 /* Register new device dev1. */
138 rc = devmap_device_register(driver_phone, TEST_DEVICE1, &dev1_handle);
139 if (rc != EOK) {
140 ipc_hangup(driver_phone);
141 return "Error: cannot register device.\n";
142 }
143
144 /*
145 * Get handle for dev2 (Should fail unless device is already registered
146 * by someone else).
147 */
148 rc = devmap_device_get_handle(TEST_DEVICE2, &handle, 0);
149 if (rc == EOK) {
150 ipc_hangup(driver_phone);
151 return "Error: got handle for dev2 before it was registered.\n";
152 }
153
154 /* Register new device dev2. */
155 rc = devmap_device_register(driver_phone, TEST_DEVICE2, &dev2_handle);
156 if (rc != EOK) {
157 ipc_hangup(driver_phone);
158 return "Error: cannot register device dev2.\n";
159 }
160
161 /* Register device dev1 again. */
162 rc = devmap_device_register(driver_phone, TEST_DEVICE1, &dev3_handle);
163 if (rc == EOK) {
164 return "Error: dev1 registered twice.\n";
165 }
166
167 /* Get handle for dev1. */
168 rc = devmap_device_get_handle(TEST_DEVICE1, &handle, 0);
169 if (rc != EOK) {
170 ipc_hangup(driver_phone);
171 return "Error: cannot get handle for 'DEVMAP_DEVICE1'.\n";
172 }
173
174 if (handle != dev1_handle) {
175 ipc_hangup(driver_phone);
176 return "Error: cannot get handle for 'DEVMAP_DEVICE1'.\n";
177 }
178
179 if (device_client(dev1_handle) != EOK) {
180 ipc_hangup(driver_phone);
181 return "Error: failed client test for 'DEVMAP_DEVICE1'.\n";
182 }
183
184 /* TODO: */
185
186 ipc_hangup(driver_phone);
187
188 return NULL;
189}
190
191char *test_devmap2(bool quiet)
192{
193 /*TODO: Full automatic test */
194 return NULL;
195}
196
197char *test_devmap3(bool quiet)
198{
199 /* TODO: allow user to call test functions in random order */
200 return NULL;
201}
202
Note: See TracBrowser for help on using the repository browser.