ti3025clk.c
来自「基于组件方式开发操作系统的OSKIT源代码」· C语言 代码 · 共 118 行
C
118 行
/* $XFree86: xc/programs/Xserver/hw/xfree86/common_hw/Ti3025clk.c,v 3.13 1996/12/23 06:44:21 dawes Exp $ *//* * Copyright 1994 The XFree86 Project, Inc * * programming the on-chip clock on the Ti3025, derived from the * S3 gendac code by Jon Tombs * Dirk Hohndel <hohndel@aib.com> * Robin Cutshaw <robin@XFree86.org> *//* $XConsortium: Ti3025clk.c /main/9 1996/05/07 17:14:16 kaleb $ */#include "Xfuncproto.h"#include "Ti302X.h" #include "compiler.h"#define NO_OSLIB_PROTOTYPES#include "xf86_OSlib.h"#include <math.h>#if NeedFunctionPrototypesvoid Ti3025CalcNMP(long freq, int *calc_n, int *calc_m, int *calc_p)#elsevoid Ti3025CalcNMP(freq, calc_n, calc_m, calc_p)long freq;int *calc_n, *calc_m, *calc_p;#endif{ double ffreq; int n, p, m; int best_n=32, best_m=32; double diff, mindiff; #define FREQ_MIN 27500 /* 110/8 MHz is the specified limit */#undef FREQ_MIN#define FREQ_MIN 12000#define FREQ_MAX 220000 if (freq < FREQ_MIN) ffreq = FREQ_MIN / 1000.0; else if (freq > FREQ_MAX) ffreq = FREQ_MAX / 1000.0; else ffreq = freq / 1000.0; /* work out suitable timings */ /* pick the right p value */ for(p=0; p<4 && ffreq < 110.0; p++) ffreq *= 2;#if FREQ_MIN < 110000/8 if (p==4) { ffreq /= 2; p--; }#endif /* now 110.0 <= ffreq <= 220.0 */ ffreq /= TI_REF_FREQ; /* now 7.6825 <= ffreq <= 15.3650 */ /* the remaining formula is ffreq = (m+2)*8 / (n+2) */ mindiff = ffreq; for (n = 1; n <= (int)(TI_REF_FREQ/0.5 - 2); n++) { m = (int)(ffreq * (n+2) / 8.0 + 0.5) - 2; if (m < 1) m = 1; else if (m > 127) m = 127; diff = ((m+2) * 8) / (n+2.0) - ffreq; if (diff<0) diff = -diff; if (diff < mindiff) { mindiff = diff; best_n = n; best_m = m; } } *calc_n = best_n; *calc_m = best_m; *calc_p = p;}#if NeedFunctionPrototypesvoid Ti3025SetClock(long freq, int clk, void (*ProgramClockFunc)())#elsevoidTi3025SetClock(freq, clk, ProgramClockFunc)long freq;int clk;void (*ProgramClockFunc)();#endif{ int n, m, p; Ti3025CalcNMP(freq, &n, &m, &p);#ifdef DEBUG ErrorF("clk %d (%f), setting to %f, n %02x, m %02x, p %d\n", clk, freq/1e3, 8.0/(1 << p)*((m+2.0)/(n+2)) * TI_REF_FREQ, n, m, p);#endif ProgramClockFunc(clk, n, m, p);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?