1 #include <linux/init.h>
2 #include <linux/config.h>
3 #include <linux/module.h>
4 #include <linux/interrupt.h>
6 #include <linux/input.h>
7 #include <linux/kthread.h>
8 #include <linux/sched.h>
9 #include <linux/console.h>
16 /* ---------------------------------------------------------------------------- */
18 static int x11_enable = 0;
19 static int x11_fps = 5;
21 static int x11_height;
25 struct x11_window *win;
26 struct task_struct *kthread;
30 /* framebuffer driver */
31 struct fb_fix_screeninfo *fix;
32 struct fb_var_screeninfo *var;
34 struct timer_list refresh;
35 int dirty, x1, x2, y1, y2;
39 struct input_dev mouse;
42 static int x11_thread(void *data)
44 struct x11_kerndata *kd = data;
45 DECLARE_WAITQUEUE(wait,current);
47 add_wait_queue(&kd->wq, &wait);
49 if (kthread_should_stop())
56 kd->dirty = kd->x1 = kd->x2 = kd->y1 = kd->y2 = 0;
57 x11_blit_fb(kd->win, x1, y1, x2, y2);
61 x11_has_data(kd->win,kd);
62 reactivate_fd(x11_get_fd(kd->win), X11_IRQ);
64 set_current_state(TASK_INTERRUPTIBLE);
67 remove_wait_queue(&kd->wq, &wait);
71 /* ---------------------------------------------------------------------------- */
74 void x11_kbd_input(struct x11_kerndata *kd, int key, int down)
78 printk("%s: unknown key pressed [%d]\n",
79 __FUNCTION__, key-KEY_MAX);
82 input_report_key(&kd->kbd,key,down);
86 void x11_mouse_input(struct x11_kerndata *kd, int state, int x, int y)
88 input_report_key(&kd->mouse, BTN_LEFT, (state >> 8) & 1); /* Button1Mask */
89 input_report_key(&kd->mouse, BTN_MIDDLE, (state >> 9) & 1); /* Button2Mask */
90 input_report_key(&kd->mouse, BTN_RIGHT, (state >> 10) & 1); /* Button3Mask */
91 input_report_abs(&kd->mouse, ABS_X, x);
92 input_report_abs(&kd->mouse, ABS_Y, y);
93 input_sync(&kd->mouse);
96 void x11_cad(struct x11_kerndata *kd)
98 printk("%s\n",__FUNCTION__);
101 /* ---------------------------------------------------------------------------- */
102 /* framebuffer driver */
104 static int x11_setcolreg(unsigned regno, unsigned red, unsigned green,
105 unsigned blue, unsigned transp,
106 struct fb_info *info)
108 if (regno >= info->cmap.len)
111 switch (info->var.bits_per_pixel) {
113 if (info->var.red.offset == 10) {
115 ((u32*) (info->pseudo_palette))[regno] =
116 ((red & 0xf800) >> 1) |
117 ((green & 0xf800) >> 6) |
118 ((blue & 0xf800) >> 11);
121 ((u32*) (info->pseudo_palette))[regno] =
123 ((green & 0xfc00) >> 5) |
124 ((blue & 0xf800) >> 11);
131 ((u32 *)(info->pseudo_palette))[regno] =
132 (red << info->var.red.offset) |
133 (green << info->var.green.offset) |
134 (blue << info->var.blue.offset);
140 ((u32 *)(info->pseudo_palette))[regno] =
141 (red << info->var.red.offset) |
142 (green << info->var.green.offset) |
143 (blue << info->var.blue.offset);
149 static void x11_fb_timer(unsigned long data)
151 struct x11_kerndata *kd = (struct x11_kerndata*)data;
156 static void x11_fb_refresh(struct x11_kerndata *kd,
157 int x1, int y1, int w, int h)
163 if (0 == kd->x2 || 0 == kd->y2) {
178 if (timer_pending(&kd->refresh))
180 mod_timer(&kd->refresh, jiffies + HZ/x11_fps);
183 void x11_fillrect(struct fb_info *p, const struct fb_fillrect *rect)
185 struct x11_kerndata *kd = p->par;
187 cfb_fillrect(p, rect);
188 x11_fb_refresh(kd, rect->dx, rect->dy, rect->width, rect->height);
191 void x11_imageblit(struct fb_info *p, const struct fb_image *image)
193 struct x11_kerndata *kd = p->par;
195 cfb_imageblit(p, image);
196 x11_fb_refresh(kd, image->dx, image->dy, image->width, image->height);
199 void x11_copyarea(struct fb_info *p, const struct fb_copyarea *area)
201 struct x11_kerndata *kd = p->par;
203 cfb_copyarea(p, area);
204 x11_fb_refresh(kd, area->dx, area->dy, area->width, area->height);
207 static struct fb_ops x11_fb_ops = {
208 .owner = THIS_MODULE,
209 .fb_setcolreg = x11_setcolreg,
210 .fb_fillrect = x11_fillrect,
211 .fb_copyarea = x11_copyarea,
212 .fb_imageblit = x11_imageblit,
213 .fb_cursor = soft_cursor,
216 /* ---------------------------------------------------------------------------- */
218 static irqreturn_t x11_irq(int irq, void *data, struct pt_regs *unused)
220 struct x11_kerndata *kd = data;
227 static int x11_probe(void)
229 struct x11_kerndata *kd;
235 kd = kmalloc(sizeof(*kd),GFP_KERNEL);
238 memset(kd,0,sizeof(*kd));
240 kd->win = x11_open(x11_width, x11_height);
243 kd->fix = x11_get_fix(kd->win);
244 kd->var = x11_get_var(kd->win);
246 /* framebuffer setup */
247 kd->info = framebuffer_alloc(sizeof(u32) * 256, NULL);
248 kd->info->pseudo_palette = kd->info->par;
250 kd->info->screen_base = x11_get_fbmem(kd->win);
252 kd->info->fbops = &x11_fb_ops;
253 kd->info->var = *kd->var;
254 kd->info->fix = *kd->fix;
255 kd->info->flags = FBINFO_FLAG_DEFAULT;
257 fb_alloc_cmap(&kd->info->cmap, 256, 0);
258 register_framebuffer(kd->info);
259 printk(KERN_INFO "fb%d: %s frame buffer device, %dx%d, %d fps, %d:%d:%d\n",
260 kd->info->node, kd->info->fix.id,
261 kd->var->xres, kd->var->yres, x11_fps,
262 kd->var->red.length, kd->var->green.length, kd->var->blue.length);
265 init_input_dev(&kd->kbd);
266 set_bit(EV_KEY, kd->kbd.evbit);
267 for (i = 0; i < KEY_MAX; i++)
268 set_bit(i, kd->kbd.keybit);
269 kd->kbd.id.bustype = BUS_HOST;
270 kd->kbd.name = "virtual keyboard";
271 kd->kbd.phys = "x11/input0";
272 input_register_device(&kd->kbd);
275 init_input_dev(&kd->mouse);
276 set_bit(EV_ABS, kd->mouse.evbit);
277 set_bit(EV_KEY, kd->mouse.evbit);
278 set_bit(BTN_LEFT, kd->mouse.keybit);
279 set_bit(BTN_MIDDLE, kd->mouse.keybit);
280 set_bit(BTN_RIGHT, kd->mouse.keybit);
281 set_bit(ABS_X, kd->mouse.absbit);
282 set_bit(ABS_Y, kd->mouse.absbit);
283 kd->mouse.absmin[ABS_X] = 0;
284 kd->mouse.absmax[ABS_X] = kd->var->xres;
285 kd->mouse.absmin[ABS_Y] = 0;
286 kd->mouse.absmax[ABS_Y] = kd->var->yres;
287 kd->mouse.id.bustype = BUS_HOST;
288 kd->mouse.name = "virtual mouse";
289 kd->mouse.phys = "x11/input1";
290 input_register_device(&kd->mouse);
292 /* misc common kernel stuff */
293 init_waitqueue_head(&kd->wq);
294 init_timer(&kd->refresh);
295 kd->refresh.function = x11_fb_timer;
296 kd->refresh.data = (unsigned long)kd;
298 kd->kthread = kthread_run(x11_thread, kd, "x11 thread");
299 um_request_irq(X11_IRQ, x11_get_fd(kd->win), IRQ_READ, x11_irq,
300 SA_INTERRUPT | SA_SHIRQ, "x11", kd);
309 static int __init x11_init(void)
314 static void __exit x11_fini(void)
319 module_init(x11_init);
320 module_exit(x11_fini);
322 static int x11_setup(char *str)
324 if (3 == sscanf(str,"%dx%d@%d",&x11_width,&x11_height,&x11_fps) ||
325 2 == sscanf(str,"%dx%d",&x11_width,&x11_height)) {
327 #if defined(CONFIG_DUMMY_CONSOLE)
328 /* this enables the virtual consoles */
329 conswitchp = &dummy_con;
335 __setup("x11=", x11_setup);