Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:23:47

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /*
0004  *  This routine initailizes the periodic interrupt timer on
0005  *  the Motorola 68332.
0006  */
0007 
0008 /*
0009  *  COPYRIGHT (c) 1989-2014.
0010  *  On-Line Applications Research Corporation (OAR).
0011  *
0012  * Redistribution and use in source and binary forms, with or without
0013  * modification, are permitted provided that the following conditions
0014  * are met:
0015  * 1. Redistributions of source code must retain the above copyright
0016  *    notice, this list of conditions and the following disclaimer.
0017  * 2. Redistributions in binary form must reproduce the above copyright
0018  *    notice, this list of conditions and the following disclaimer in the
0019  *    documentation and/or other materials provided with the distribution.
0020  *
0021  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0022  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0023  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0024  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0025  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0026  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0027  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0028  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0029  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0030  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0031  * POSSIBILITY OF SUCH DAMAGE.
0032  */
0033 
0034 #include <stdlib.h>
0035 #include <bsp.h>
0036 #include <mrm332.h>
0037 #include <rtems/clockdrv.h>
0038 #include <rtems/m68k/sim.h>
0039 
0040 #define CLOCK_VECTOR   MRM_PIV
0041 
0042 uint32_t                Clock_isrs;         /* ISRs until next tick */
0043 volatile uint32_t       Clock_driver_ticks; /* ticks since initialization */
0044 static rtems_isr_entry  Old_ticker;
0045 
0046 static void Clock_exit( void );
0047 
0048 static rtems_isr Clock_isr(rtems_vector_number vector)
0049 {
0050   Clock_driver_ticks += 1;
0051 
0052   if ( Clock_isrs == 1 ) {
0053     rtems_clock_tick();
0054     Clock_isrs = rtems_configuration_get_microseconds_per_tick() / 1000;
0055   }
0056   else
0057     Clock_isrs -= 1;
0058 }
0059 
0060 static void Install_clock(rtems_isr_entry clock_isr)
0061 {
0062   Clock_driver_ticks = 0;
0063   Clock_isrs = rtems_configuration_get_microseconds_per_tick() / 1000;
0064 
0065   Old_ticker = (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 );
0066 
0067   /* enable 1mS interrupts */
0068   *PITR = (unsigned short int)( SAM(0x09,0,PITM) );/* load counter */
0069   *PICR = (unsigned short int)                     /* enable interrupt */
0070     ( SAM(ISRL_PIT,8,PIRQL) | SAM(CLOCK_VECTOR,0,PIV) );
0071 
0072   atexit( Clock_exit );
0073 }
0074 
0075 void Clock_exit( void )
0076 {
0077   /* shutdown the periodic interrupt */
0078   *PICR = (unsigned short int)
0079     ( SAM(0,8,PIRQL) | SAM(CLOCK_VECTOR,0,PIV) );
0080   /*     ^^ zero disables interrupt */
0081 
0082   /* do not restore old vector */
0083 }
0084 
0085 void _Clock_Initialize( void )
0086 {
0087   Install_clock( Clock_isr );
0088 }