source: mainline/uspace/drv/root/root.c@ f0da4eb2

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since f0da4eb2 was f0da4eb2, checked in by Vojtech Horky <vojtechhorky@…>, 15 years ago

Reenable rootia32 driver

Also, the uhci driver is started (if UHCI is present on PCI) but it does
not register root hub due to some bug in devman. Will investigate later.

  • Property mode set to 100644
File size: 4.9 KB
Line 
1/*
2 * Copyright (c) 2010 Lenka Trochtova
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/**
30 * @defgroup root Root device driver.
31 * @brief HelenOS root device driver.
32 * @{
33 */
34
35/** @file
36 */
37
38#include <assert.h>
39#include <stdio.h>
40#include <errno.h>
41#include <bool.h>
42#include <fibril_synch.h>
43#include <stdlib.h>
44#include <str.h>
45#include <ctype.h>
46#include <macros.h>
47
48#include <driver.h>
49#include <devman.h>
50#include <ipc/devman.h>
51
52#define NAME "root"
53
54static int root_add_device(device_t *dev);
55
56/** The root device driver's standard operations. */
57static driver_ops_t root_ops = {
58 .add_device = &root_add_device
59};
60
61/** The root device driver structure. */
62static driver_t root_driver = {
63 .name = NAME,
64 .driver_ops = &root_ops
65};
66
67/** Create the device which represents the root of HW device tree.
68 *
69 * @param parent Parent of the newly created device.
70 * @return 0 on success, negative error number otherwise.
71 */
72static int add_platform_child(device_t *parent)
73{
74 printf(NAME ": adding new child for platform device.\n");
75
76 int res = EOK;
77 device_t *platform = NULL;
78 match_id_t *match_id = NULL;
79
80 /* Create new device. */
81 platform = create_device();
82 if (NULL == platform) {
83 res = ENOMEM;
84 goto failure;
85 }
86
87 platform->name = "hw";
88 printf(NAME ": the new device's name is %s.\n", platform->name);
89
90 /* Initialize match id list. */
91 match_id = create_match_id();
92 if (NULL == match_id) {
93 res = ENOMEM;
94 goto failure;
95 }
96
97 /* TODO - replace this with some better solution (sysinfo ?) */
98 match_id->id = STRING(UARCH);
99 match_id->score = 100;
100 add_match_id(&platform->match_ids, match_id);
101
102 /* Register child device. */
103 res = child_device_register(platform, parent);
104 if (EOK != res)
105 goto failure;
106
107 return res;
108
109failure:
110 if (NULL != match_id)
111 match_id->id = NULL;
112
113 if (NULL != platform) {
114 platform->name = NULL;
115 delete_device(platform);
116 }
117
118 return res;
119}
120
121/** Create virtual USB host controller device.
122 * Note that the virtual HC is actually device and driver in one
123 * task.
124 *
125 * @param parent Parent device.
126 * @return Error code.
127 */
128static int add_virtual_usb_host_controller(device_t *parent)
129{
130 printf(NAME ": adding virtual host contoller.\n");
131
132 int rc;
133 device_t *vhc = NULL;
134 match_id_t *match_id = NULL;
135
136 vhc = create_device();
137 if (vhc == NULL) {
138 rc = ENOMEM;
139 goto failure;
140 }
141
142 vhc->name = "vhc";
143 printf(NAME ": the new device's name is %s.\n", vhc->name);
144
145 /* Initialize match id list. */
146 match_id = create_match_id();
147 if (match_id == NULL) {
148 rc = ENOMEM;
149 goto failure;
150 }
151
152 match_id->id = "usb&hc=vhc";
153 match_id->score = 100;
154 add_match_id(&vhc->match_ids, match_id);
155
156 /* Register child device. */
157 rc = child_device_register(vhc, parent);
158 if (rc != EOK)
159 goto failure;
160
161 return EOK;
162
163failure:
164 if (match_id != NULL)
165 match_id->id = NULL;
166
167 if (vhc != NULL) {
168 vhc->name = NULL;
169 delete_device(vhc);
170 }
171
172 return rc;
173}
174
175/** Get the root device.
176 *
177 * @param dev The device which is root of the whole device tree (both
178 * of HW and pseudo devices).
179 */
180static int root_add_device(device_t *dev)
181{
182 printf(NAME ": root_add_device, device handle = %d\n", dev->handle);
183
184 /* Register root device's children. */
185 int res = add_platform_child(dev);
186 if (EOK != res)
187 printf(NAME ": failed to add child device for platform.\n");
188
189 /* Register virtual USB host controller. */
190 int rc = add_virtual_usb_host_controller(dev);
191 if (EOK != rc) {
192 printf(NAME ": failed to add child device - virtual USB HC.\n");
193 }
194
195 return res;
196}
197
198int main(int argc, char *argv[])
199{
200 printf(NAME ": HelenOS root device driver\n");
201 return driver_main(&root_driver);
202}
203
204/**
205 * @}
206 */
207
Note: See TracBrowser for help on using the repository browser.