xref: /haiku/src/tests/system/kernel/device_manager/playground/generic_video_driver.cpp (revision 9f925127dbb0459be00626ba0559a1f25441fac0)
1 /*
2  * Copyright 2008, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include "bus.h"
8 
9 #include <KernelExport.h>
10 #include <PCI.h>
11 
12 
13 #define DRIVER_MODULE_NAME "drivers/graphics/generic_driver/driver_v1"
14 #define DRIVER_DEVICE_MODULE_NAME "drivers/graphics/generic_driver/device_v1"
15 
16 
17 //	#pragma mark - driver
18 
19 
20 static float
supports_device(device_node * parent)21 supports_device(device_node* parent)
22 {
23 	bus_for_driver_module_info* module;
24 	void* data;
25 	gDeviceManager->get_driver(parent, (driver_module_info**)&module, &data);
26 
27 	if (strcmp(module->info.info.name, BUS_FOR_DRIVER_NAME))
28 		return -1;
29 
30 	uint16 type;
31 	if (gDeviceManager->get_attr_uint16(parent, B_DEVICE_TYPE, &type, false)
32 			!= B_OK)
33 		return -1;
34 
35 	if (type == PCI_display)
36 		return 0.1;
37 
38 	return 0.0;
39 }
40 
41 
42 static status_t
register_device(device_node * parent)43 register_device(device_node* parent)
44 {
45 	return gDeviceManager->register_node(parent, DRIVER_MODULE_NAME, NULL,
46 		NULL, NULL);
47 }
48 
49 
50 static status_t
init_driver(device_node * node,void ** _cookie)51 init_driver(device_node* node, void** _cookie)
52 {
53 	*_cookie = node;
54 	return B_OK;
55 }
56 
57 
58 static void
uninit_driver(void * cookie)59 uninit_driver(void* cookie)
60 {
61 }
62 
63 
64 static status_t
register_child_devices(void * cookie)65 register_child_devices(void* cookie)
66 {
67 	device_node* node = (device_node*)cookie;
68 
69 	gDeviceManager->publish_device(node, "graphics/generic/0",
70 		DRIVER_DEVICE_MODULE_NAME);
71 	return B_OK;
72 }
73 
74 
75 static void
device_removed(device_node * node)76 device_removed(device_node* node)
77 {
78 }
79 
80 
81 //	#pragma mark - device
82 
83 
84 static status_t
init_device(void * driverCookie,void ** _deviceCookie)85 init_device(void* driverCookie, void** _deviceCookie)
86 {
87 	// called once before one or several open() calls
88 	return B_OK;
89 }
90 
91 
92 static void
uninit_device(void * deviceCookie)93 uninit_device(void* deviceCookie)
94 {
95 	// supposed to free deviceCookie, called when the last reference to
96 	// the device is closed
97 }
98 
99 
100 static status_t
device_open(void * deviceCookie,int openMode,void ** _cookie)101 device_open(void* deviceCookie, int openMode, void** _cookie)
102 {
103 	// deviceCookie is an object attached to the published device
104 	return B_ERROR;
105 }
106 
107 
108 static status_t
device_close(void * cookie)109 device_close(void* cookie)
110 {
111 	return B_ERROR;
112 }
113 
114 
115 static status_t
device_free(void * cookie)116 device_free(void* cookie)
117 {
118 	return B_ERROR;
119 }
120 
121 
122 static status_t
device_read(void * cookie,off_t pos,void * buffer,size_t * _length)123 device_read(void* cookie, off_t pos, void* buffer, size_t* _length)
124 {
125 	return B_ERROR;
126 }
127 
128 
129 static status_t
device_write(void * cookie,off_t pos,const void * buffer,size_t * _length)130 device_write(void* cookie, off_t pos, const void* buffer, size_t* _length)
131 {
132 	return B_ERROR;
133 }
134 
135 
136 static status_t
device_ioctl(void * cookie,int32 op,void * buffer,size_t length)137 device_ioctl(void* cookie, int32 op, void* buffer, size_t length)
138 {
139 	return B_ERROR;
140 }
141 
142 
143 static status_t
device_io(void * cookie,io_request * request)144 device_io(void* cookie, io_request* request)
145 {
146 	// new function to deal with I/O requests directly.
147 	return B_ERROR;
148 }
149 
150 
151 //	#pragma mark -
152 
153 
154 struct driver_module_info gGenericVideoDriverModuleInfo = {
155 	{
156 		DRIVER_MODULE_NAME,
157 		0,
158 		NULL,
159 	},
160 
161 	supports_device,
162 	register_device,
163 	init_driver,
164 	uninit_driver,
165 	register_child_devices,
166 	NULL,
167 	device_removed,
168 };
169 
170 struct device_module_info gGenericVideoDeviceModuleInfo = {
171 	{
172 		DRIVER_DEVICE_MODULE_NAME,
173 		0,
174 		NULL,
175 	},
176 
177 	init_device,
178 	uninit_device,
179 	NULL,	// device_removed
180 
181 	device_open,
182 	device_close,
183 	device_free,
184 	device_read,
185 	device_write,
186 	device_ioctl,
187 	device_io,
188 };
189