summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2022-10-25 10:56:07 +0000
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2022-10-26 00:14:54 +0200
commit21982d148b72095fb37f9b54df2292ddcd9928b3 (patch)
tree44425372f1190df78e7fde78ecad65be1240b36e
parent3202d5bb4ae9200eb05858e3bdfae13d6d1ecc18 (diff)
i386/pit: Tune delays
- Add half a clock tick for more accuracy - Start the pit countdown during pit_sleep - Add pit_mdelay and pit_udelay functions Message-Id: <20221025105502.222708-8-damien@zamaudio.com>
-rw-r--r--i386/i386/pit.c24
-rw-r--r--i386/i386/pit.h2
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_ */