]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/fb-drv/server/src/main.cc
update
[l4.git] / l4 / pkg / fb-drv / server / src / main.cc
1 /*
2  * (c) 2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
3  *          Alexander Warg <warg@os.inf.tu-dresden.de>,
4  *          Torsten Frenzel <frenzel@os.inf.tu-dresden.de>
5  *     economic rights: Technische Universität Dresden (Germany)
6  *
7  * This file is part of TUD:OS and distributed under the terms of the
8  * GNU General Public License 2.
9  * Please see the COPYING-GPL-2 file for details.
10  */
11
12 #include <l4/sys/capability>
13 #include <l4/sys/typeinfo_svr>
14 #include <l4/cxx/ipc_server>
15
16 #include <cstdio>
17 #include <getopt.h>
18 #include <cstdlib>
19
20 #include "fb.h"
21
22 L4Re::Util::Object_registry registry;
23 static L4::Server<> server(l4_utcb());
24
25 void
26 Phys_fb::setup_ds(char const *name)
27 {
28   registry.register_obj(this, name);
29   _fb_ds = L4::Cap<L4Re::Dataspace>(obj_cap().cap());
30   _ds_start = _vidmem_start;
31   _ds_size = _vidmem_size;
32   _rw_flags = Writable;
33   _cache_flags = L4::Ipc::Gen_fpage<L4::Ipc::Snd_item>::Uncached;
34 }
35
36 int
37 Phys_fb::map_hook(l4_addr_t offs, unsigned long flags,
38                   l4_addr_t min, l4_addr_t max)
39 {
40   // map everything at once, a framebuffer will usually used fully
41   (void)offs; (void)flags; (void)min; (void)max;
42   if (_map_done)
43     return 0;
44
45   int err;
46   L4::Cap<L4Re::Dataspace> ds;
47   unsigned long sz = 1;
48   l4_addr_t off;
49   unsigned fl;
50   l4_addr_t a = _vidmem_start;
51
52   if ((err = L4Re::Env::env()->rm()->find(&a, &sz, &off, &fl, &ds)) < 0)
53     {
54       printf("Failed to query video memory: %d\n", err);
55       return err;
56     }
57
58   if ((err = ds->map_region(off, L4Re::Dataspace::Map_rw,
59                             _vidmem_start, _vidmem_end)) < 0)
60     {
61       printf("Failed to map video memory: %d\n", err);
62       return err;
63     }
64
65   _map_done = 1;
66   return 0;
67 }
68
69 int
70 Phys_fb::dispatch(l4_umword_t obj, L4::Ipc_iostream &ios)
71 {
72   l4_msgtag_t tag;
73   ios >> tag;
74   switch (tag.label())
75     {
76     case L4::Meta::Protocol:
77       return L4::Util::handle_meta_request<L4Re::Video::Goos>(ios);
78     case L4Re::Protocol::Goos:
79       return L4Re::Util::Video::Goos_svr::dispatch(obj, ios);
80     case L4Re::Protocol::Dataspace:
81       return L4Re::Util::Dataspace_svr::dispatch(obj, ios);
82     default:
83       return -L4_EBADPROTO;
84     }
85 }
86
87
88 Prog_args::Prog_args(int argc, char *argv[])
89  : vbemode(~0), do_dummy(false), config_str(0)
90 {
91   while (1)
92     {
93       struct option opts[] = {
94             { "vbemode", required_argument, 0, 'm' },
95             { "config", required_argument, 0, 'c' },
96             { "dummy", no_argument, 0, 'D' },
97             { 0, 0, 0, 0 },
98       };
99
100       int c = getopt_long(argc, argv, "c:m:D", opts, NULL);
101       if (c == -1)
102         break;
103
104       switch (c)
105         {
106         case 'c':
107           config_str = optarg;
108           break;
109         case 'm':
110           vbemode = strtol(optarg, 0, 0);
111           break;
112         case 'D':
113           do_dummy = true;
114           break;
115         default:
116           printf("Unknown option '%c'\n", c);
117           break;
118         }
119     }
120 }
121
122
123 int main(int argc, char *argv[])
124 {
125 #ifdef ARCH_arm
126   Lcd_drv_fb arch_fb;
127 #elif defined(ARCH_x86) || defined(ARCH_amd64)
128   Vesa_fb arch_fb;
129 #else
130   Dummy_fb arch_fb;
131 #endif
132   Dummy_fb dummy_fb;
133   Phys_fb *fb = &dummy_fb;
134
135   Prog_args args(argc, argv);
136
137   if (!fb->setup_drv(&args))
138     {
139       fb = &arch_fb;
140       if (!fb->setup_drv(&args))
141         {
142           printf("Failed to setup Framebuffer\n");
143           return 1;
144         }
145     }
146   fb->setup_ds("fb");
147
148   if (!fb->running())
149     {
150       printf("Failed to initialize frame buffer; Aborting.\n");
151       return 1;
152     }
153
154   if (!fb->obj_cap().is_valid())
155     {
156       printf("Failed to connect.\n");
157       return 1;
158     }
159
160   printf("Starting server loop\n");
161   server.loop(registry);
162
163   return 0;
164 }