/* * drivers/video/asiliantfb.c * frame buffer driver for Asiliant 69000 chip * Copyright (C) 2001-2003 Saito.K & Jeanne * * from driver/video/chipsfb.c and, * * drivers/video/asiliantfb.c -- frame buffer device for * Asiliant 69030 chip (formerly Intel, formerly Chips & Technologies) * Author: apc@agelectronics.co.uk * Copyright (C) 2000 AG Electronics * Note: the data sheets don't seem to be available from Asiliant. * They are available by searching developer.intel.com, but are not otherwise * linked to. * * This driver should be portable with minimal effort to the 69000 display * chip, and to the twin-display mode of the 69030. * Contains code from Thomas Hhenleitner <th@visuelle-maschinen.de> (thanks) * * Derived from the CT65550 driver chipsfb.c: * Copyright (C) 1998 Paul Mackerras * ...which was derived from the Powermac "chips" driver: * Copyright (C) 1997 Fabio Riccardi. * And from the frame buffer device for Open Firmware-initialized devices: * Copyright (C) 1997 Geert Uytterhoeven. * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of this archive for * more details.
*/
/* Calculate the ratios for the dot clocks without using a single long long
* value */ staticvoid asiliant_calc_dclk2(u32 *ppixclock, u8 *dclk2_m, u8 *dclk2_n, u8 *dclk2_div)
{ unsigned pixclock = *ppixclock; unsigned Ftarget; unsigned n; unsigned best_error = 0xffffffff; unsigned best_m = 0xffffffff,
best_n = 0xffffffff; unsigned ratio; unsigned remainder; unsignedchar divisor = 0;
/* Calculate the frequency required. This is hard enough. */
ratio = 1000000 / pixclock;
remainder = 1000000 % pixclock;
Ftarget = 1000000 * ratio + (1000000 * remainder) / pixclock;
ratio = Ftarget / Fref;
remainder = Ftarget % Fref;
/* This expresses the constraint that 150kHz <= Fref/n <= 5Mhz,
* together with 3 <= n <= 257. */ for (n = 3; n <= 257; n++) { unsigned m = n * ratio + (n * remainder) / Fref;
/* 3 <= m <= 257 */ if (m >= 3 && m <= 257) { unsigned new_error = Ftarget * n >= Fref * m ?
((Ftarget * n) - (Fref * m)) : ((Fref * m) - (Ftarget * n)); if (new_error < best_error) {
best_n = n;
best_m = m;
best_error = new_error;
}
} /* But if VLD = 4, then 4m <= 1028 */ elseif (m <= 1028) { /* remember there are still only 8-bits of precision in m, so
* avoid over-optimistic error calculations */ unsigned new_error = Ftarget * n >= Fref * (m & ~3) ?
((Ftarget * n) - (Fref * (m & ~3))) : ((Fref * (m & ~3)) - (Ftarget * n)); if (new_error < best_error) {
best_n = n;
best_m = m;
best_error = new_error;
}
}
} if (best_m > 257)
best_m >>= 2; /* divide m by 4, and leave VCO loop divide at 4 */ else
divisor |= 4; /* or set VCO loop divide to 1 */
*dclk2_m = best_m - 2;
*dclk2_n = best_n - 2;
*dclk2_div = divisor;
*ppixclock = pixclock; return;
}
/* First check the constraint that the maximum post-VCO divisor is 32,
* and the maximum Fvco is 220MHz */ if (Ftarget > 220000000 || Ftarget < 3125000) {
printk(KERN_ERR "asiliantfb dotclock must be between 3.125 and 220MHz\n"); return -ENXIO;
}
var->xres_virtual = var->xres;
var->yres_virtual = var->yres;
staticvoid chips_hw_init(struct fb_info *p)
{ int i;
for (i = 0; i < ARRAY_SIZE(chips_init_xr); ++i)
write_xr(chips_init_xr[i].addr, chips_init_xr[i].data);
write_xr(0x81, 0x12);
write_xr(0x82, 0x08);
write_xr(0x20, 0x00); for (i = 0; i < ARRAY_SIZE(chips_init_sr); ++i)
write_sr(chips_init_sr[i].addr, chips_init_sr[i].data); for (i = 0; i < ARRAY_SIZE(chips_init_gr); ++i)
write_gr(chips_init_gr[i].addr, chips_init_gr[i].data); for (i = 0; i < ARRAY_SIZE(chips_init_ar); ++i)
write_ar(chips_init_ar[i].addr, chips_init_ar[i].data); /* Enable video output in attribute index register */
writeb(0x20, mmio_base + 0x780); for (i = 0; i < ARRAY_SIZE(chips_init_cr); ++i)
write_cr(chips_init_cr[i].addr, chips_init_cr[i].data); for (i = 0; i < ARRAY_SIZE(chips_init_fr); ++i)
write_fr(chips_init_fr[i].addr, chips_init_fr[i].data);
}
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.