summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1996-10-15 21:39:06 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1996-10-15 21:39:06 +0000
commit39cafa5c1512073cfd998bc13d4d8daa7e734924 (patch)
treede40d2d34a57906fdd50af8ad77104eaef377713
parentadded support for cpu time used field in tcb (diff)
downloadrtems-39cafa5c1512073cfd998bc13d4d8daa7e734924.tar.bz2
updated to format of 3.6.0 clock drivers
-rw-r--r--c/src/lib/libbsp/i386/i386ex/clock/ckinit.c107
1 files changed, 83 insertions, 24 deletions
diff --git a/c/src/lib/libbsp/i386/i386ex/clock/ckinit.c b/c/src/lib/libbsp/i386/i386ex/clock/ckinit.c
index 1d43059ac2..7352ee27b8 100644
--- a/c/src/lib/libbsp/i386/i386ex/clock/ckinit.c
+++ b/c/src/lib/libbsp/i386/i386ex/clock/ckinit.c
@@ -21,33 +21,44 @@
*/
#include <bsp.h>
-#include <clockdrv.h>
+
+#include <rtems/libio.h>
+
#include <stdlib.h>
-volatile rtems_unsigned32 Clock_driver_ticks;
+#define CLOCK_VECTOR 0x20
+
rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
+
+volatile rtems_unsigned32 Clock_driver_ticks;
+
rtems_isr_entry Old_ticker;
-rtems_device_driver Clock_initialize(
- rtems_device_major_number major,
- rtems_device_minor_number minor,
- void *pargp,
- rtems_id tid,
- rtems_unsigned32 *rval
-)
-{
- Install_clock( Clock_isr );
-}
+void Clock_exit( void );
-void ReInstall_clock(
- rtems_isr_entry clock_isr
+/*
+ * These are set by clock driver during its init
+ */
+
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_major_number rtems_clock_minor = 0;
+
+/*
+ * This is the ISR handler.
+ */
+
+rtems_isr Clock_isr(
+ rtems_vector_number vector
)
{
- rtems_unsigned32 isrlevel = 0;
-
- rtems_interrupt_disable( isrlevel );
- (void) set_vector( clock_isr, 0x20, 1 ); /* was 0x38 */
- rtems_interrupt_enable( isrlevel );
+ /* enable_tracing(); */
+ Clock_driver_ticks += 1;
+ if ( Clock_isrs == 1 ) {
+ rtems_clock_tick();
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+ }
+ else
+ Clock_isrs -= 1;
}
void Install_clock(
@@ -58,8 +69,7 @@ void Install_clock(
Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
if ( BSP_Configuration.ticks_per_timeslice ) {
- Old_ticker = ( rtems_isr_entry ) set_vector( clock_isr, 0x20, 1 );
- /* was 0x38 */
+ Old_ticker = ( rtems_isr_entry ) set_vector( clock_isr, CLOCK_VECTOR, 1 );
/* The following is already set up in interns.s ->
( This is test code only... production code will move the
@@ -85,9 +95,58 @@ void Install_clock(
void Clock_exit( void )
{
if ( BSP_Configuration.ticks_per_timeslice ) {
-/* outport_byte( TBCR, 0x00 ); */ /* initial value */
-/* outport_byte( IERA, 0x40 ); */ /* disable interrupt */
-/* ??? Is "do not restore old vector" causing problems? */
+ /* should do something here */;
}
}
+
+rtems_device_driver Clock_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ Install_clock( Clock_isr );
+
+ /*
+ * make major/minor avail to others such as shared memory driver
+ */
+
+ rtems_clock_major = major;
+ rtems_clock_minor = minor;
+
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ rtems_unsigned32 isrlevel;
+ rtems_libio_ioctl_args_t *args = pargp;
+
+ if (args == 0)
+ goto done;
+
+ /*
+ * This is hokey, but until we get a defined interface
+ * to do this, it will just be this simple...
+ */
+
+ if (args->command == rtems_build_name('I', 'S', 'R', ' '))
+ {
+ Clock_isr(CLOCK_VECTOR);
+ }
+ else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
+ {
+ rtems_interrupt_disable( isrlevel );
+ (void) set_vector( args->buffer, CLOCK_VECTOR, 1 );
+ rtems_interrupt_enable( isrlevel );
+ }
+
+done:
+ return RTEMS_SUCCESSFUL;
+}
+