staticint matroxfb_dh_decode_var(struct matroxfb_dh_fb_info* m2info, struct fb_var_screeninfo* var, int *visual, int *video_cmap_len, int *mode) { unsignedint mask; unsignedint memlen; unsignedint vramlen;
/* * This function is called before the register_framebuffer so * no locking is needed.
*/ staticvoid matroxfb_dh_init_fix(struct matroxfb_dh_fb_info *m2info)
{ struct fb_fix_screeninfo *fix = &m2info->fbcon.fix;
staticint matroxfb_dh_check_var(struct fb_var_screeninfo* var, struct fb_info* info) { #define m2info (container_of(info, struct matroxfb_dh_fb_info, fbcon)) int visual; int cmap_len; int mode;
return matroxfb_dh_decode_var(m2info, var, &visual, &cmap_len, &mode); #undef m2info
}
staticint matroxfb_dh_set_par(struct fb_info* info) { #define m2info (container_of(info, struct matroxfb_dh_fb_info, fbcon)) int visual; int cmap_len; int mode; int err; struct fb_var_screeninfo* var = &info->var; struct matrox_fb_info *minfo = m2info->primary_dev;
matroxfb_enable_irq(minfo, 0);
memset(vblank, 0, sizeof(*vblank));
vblank->flags = FB_VBLANK_HAVE_VCOUNT | FB_VBLANK_HAVE_VBLANK; /* mask out reserved bits + field number (odd/even) */
vblank->vcount = mga_inl(0x3C48) & 0x000007FF; /* compatibility stuff */ if (vblank->vcount >= m2info->fbcon.var.yres)
vblank->flags |= FB_VBLANK_VBLANKING; if (test_bit(0, &minfo->irq_flags)) {
vblank->flags |= FB_VBLANK_HAVE_COUNT; /* Only one writer, aligned int value...
it should work without lock and without atomic_t */
vblank->count = minfo->crtc2.vsync.cnt;
} return 0;
}
switch (cmd) { case FBIOGET_VBLANK:
{ struct fb_vblank vblank; int err;
err = matroxfb_dh_get_vblank(m2info, &vblank); if (err) return err; if (copy_to_user((void __user *)arg, &vblank, sizeof(vblank))) return -EFAULT; return 0;
} case FBIO_WAITFORVSYNC:
{
u_int32_t crt;
if (get_user(crt, (u_int32_t __user *)arg)) return -EFAULT;
if (crt != 0) return -ENODEV; return matroxfb_wait_for_sync(minfo, 1);
} case MATROXFB_SET_OUTPUT_MODE: case MATROXFB_GET_OUTPUT_MODE: case MATROXFB_GET_ALL_OUTPUTS:
{ return minfo->fbcon.fbops->fb_ioctl(&minfo->fbcon, cmd, arg);
} case MATROXFB_SET_OUTPUT_CONNECTION:
{
u_int32_t tmp; int out; int changes;
if (get_user(tmp, (u_int32_t __user *)arg)) return -EFAULT; for (out = 0; out < 32; out++) { if (tmp & (1 << out)) { if (out >= MATROXFB_MAX_OUTPUTS) return -ENXIO; if (!minfo->outputs[out].output) return -ENXIO; switch (minfo->outputs[out].src) { case MATROXFB_SRC_NONE: case MATROXFB_SRC_CRTC2: break; default: return -EBUSY;
}
}
} if (minfo->devflags.panellink) { if (tmp & MATROXFB_OUTPUT_CONN_DFP) return -EINVAL; if ((minfo->outputs[2].src == MATROXFB_SRC_CRTC1) && tmp) return -EBUSY;
}
changes = 0; for (out = 0; out < MATROXFB_MAX_OUTPUTS; out++) { if (tmp & (1 << out)) { if (minfo->outputs[out].src != MATROXFB_SRC_CRTC2) {
changes = 1;
minfo->outputs[out].src = MATROXFB_SRC_CRTC2;
}
} elseif (minfo->outputs[out].src == MATROXFB_SRC_CRTC2) {
changes = 1;
minfo->outputs[out].src = MATROXFB_SRC_NONE;
}
} if (!changes) return 0;
matroxfb_dh_set_par(info); return 0;
} case MATROXFB_GET_OUTPUT_CONNECTION:
{
u_int32_t conn = 0; int out;
for (out = 0; out < MATROXFB_MAX_OUTPUTS; out++) { if (minfo->outputs[out].src == MATROXFB_SRC_CRTC2) {
conn |= 1 << out;
}
} if (put_user(conn, (u_int32_t __user *)arg)) return -EFAULT; return 0;
} case MATROXFB_GET_AVAILABLE_OUTPUTS:
{
u_int32_t tmp = 0; int out;
for (out = 0; out < MATROXFB_MAX_OUTPUTS; out++) { if (minfo->outputs[out].output) { switch (minfo->outputs[out].src) { case MATROXFB_SRC_NONE: case MATROXFB_SRC_CRTC2:
tmp |= 1 << out; break;
}
}
} if (minfo->devflags.panellink) {
tmp &= ~MATROXFB_OUTPUT_CONN_DFP; if (minfo->outputs[2].src == MATROXFB_SRC_CRTC1) {
tmp = 0;
}
} if (put_user(tmp, (u_int32_t __user *)arg)) return -EFAULT; return 0;
}
} return -ENOTTY; #undef m2info
}
staticint matroxfb_dh_blank(int blank, struct fb_info* info) { #define m2info (container_of(info, struct matroxfb_dh_fb_info, fbcon)) switch (blank) { case 1: case 2: case 3: case 4: default:;
} /* do something... */ return 0; #undef m2info
}
MODULE_AUTHOR("(c) 1999-2002 Petr Vandrovec ");
MODULE_DESCRIPTION("Matrox G400 CRTC2 driver");
MODULE_LICENSE("GPL");
module_init(matroxfb_crtc2_init);
module_exit(matroxfb_crtc2_exit); /* we do not have __setup() yet */
Messung V0.5
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.12Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.