Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 242 → Rev 243

/shark/trunk/oslib/kl/advtimer.c
171,9 → 171,9
 
signed long long start;
signed long long end;
signed long long dtsc;
signed long long dtsc1,dtsc2,dtsc;
signed long start_8253, end_8253, delta_8253;
signed long start_8253, end_8253, delta1_8253, delta2_8253, delta_8253;
 
cli();
184,10 → 184,57
outp(0x42,0xFF); /* LSB of count */
outp(0x42,0xFF); /* MSB of count */
outp(0x43,0x00);
start_8253 = inp(0x42);
start_8253 |= inp(0x42) << 8;
rdtscll(start);
do {
outp(0x43,0x00);
end_8253 = inp(0x42);
end_8253 |= inp(0x42) << 8;
 
} while (end_8253 > COUNTER_END);
 
do {
outp(0x43,0x00);
end_8253 = inp(0x42);
end_8253 |= inp(0x42) << 8;
} while (end_8253 < COUNTER_END);
 
do {
outp(0x43,0x00);
end_8253 = inp(0x42);
end_8253 |= inp(0x42) << 8;
} while (end_8253 > COUNTER_END);
 
outp(0x43,0x00);
end_8253 = inp(0x42);
end_8253 |= inp(0x42) << 8;
rdtscll(end);
 
//Delta TSC
dtsc1 = end - start;
 
//Delta PIT
delta1_8253 = start_8253 - end_8253 + 0x10001;
 
 
/* Set the Gate high, disable speaker */
outp(0x61, (inp(0x61) & ~0x02) | 0x01);
 
outp(0x43,0xB0); /* binary, mode 0, LSB/MSB, Ch 2 */
outp(0x42,0xFF); /* LSB of count */
outp(0x42,0xFF); /* MSB of count */
outp(0x43,0x00);
start_8253 = inp(0x42);
start_8253 |= inp(0x42) << 8;
start_8253 |= inp(0x42) << 8;
rdtscll(start);
do {
214,7 → 261,6
} while (end_8253 > COUNTER_END);
 
rdtscll(end);
outp(0x43,0x00);
end_8253 = inp(0x42);
end_8253 |= inp(0x42) << 8;
221,11 → 267,19
rdtscll(end);
 
//Delta TSC
dtsc = end - start;
dtsc2 = end - start;
 
//Delta PIT
delta_8253 = start_8253 - end_8253 + 0x10001;
delta2_8253 = start_8253 - end_8253 + 0x10001;
 
if (dtsc1 > dtsc2) {
dtsc = dtsc1;
delta_8253 = delta1_8253;
} else {
dtsc = dtsc2;
delta_8253 = delta2_8253;
}
 
if (delta_8253 > 0x20000) {
message("Error calculating Delta PIT\n");
ll_abort(10);
235,7 → 289,7
 
message("Delta PIT = %10ld\n",(long)delta_8253);
 
clk_per_msec = dtsc * CLOCK_TICK_RATE / delta_8253 * 100002 / 100000000;
clk_per_msec = dtsc * CLOCK_TICK_RATE / delta_8253 / 1000;
message("Calibrated Clk_per_msec = %10ld\n",(long)clk_per_msec);