diff options
-rw-r--r-- | i386/i386/pit.c | 24 | ||||
-rw-r--r-- | i386/i386/pit.h | 2 |
2 files changed, 22 insertions, 4 deletions
diff --git a/i386/i386/pit.c b/i386/i386/pit.c index 0ead8c9b..7373a38e 100644 --- a/i386/i386/pit.c +++ b/i386/i386/pit.c @@ -83,6 +83,12 @@ pit_prepare_sleep(int hz) outb (PITCTR2_PORT, lsb); val = inb(POST_PORT); /* ~1us i/o delay */ outb (PITCTR2_PORT, msb); +} + +void +pit_sleep(void) +{ + int val; /* Start counting down */ val = inb(PITAUX_PORT); @@ -90,13 +96,23 @@ pit_prepare_sleep(int hz) outb (PITAUX_PORT, val); /* Gate low */ val |= PITAUX_GATE2; outb (PITAUX_PORT, val); /* Gate high */ + + /* Wait until counter reaches zero */ + while ((inb(PITAUX_PORT) & PITAUX_VAL) == 0); } void -pit_sleep(void) +pit_udelay(int usec) { - /* Wait until counter reaches zero */ - while ((inb(PITAUX_PORT) & PITAUX_VAL) == 0); + pit_prepare_sleep(1000000 / usec); + pit_sleep(); +} + +void +pit_mdelay(int msec) +{ + pit_prepare_sleep(1000 / msec); + pit_sleep(); } void @@ -115,7 +131,7 @@ clkstart(void) * timers you do not use */ outb(pitctl_port, pit0_mode); - clknumb = CLKNUM/hz; + clknumb = (CLKNUM + hz / 2) / hz; byte = clknumb; outb(pitctr0_port, byte); byte = clknumb>>8; diff --git a/i386/i386/pit.h b/i386/i386/pit.h index bac4e985..51c4111d 100644 --- a/i386/i386/pit.h +++ b/i386/i386/pit.h @@ -91,5 +91,7 @@ WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. extern void clkstart(void); extern void pit_prepare_sleep(int hz); extern void pit_sleep(void); +extern void pit_udelay(int usec); +extern void pit_mdelay(int msec); #endif /* _I386_PIT_H_ */ |