Ignore:
Timestamp:
Jul 4, 2007, 12:25:49 PM (12 years ago)
Author:
Thomas Doerfler <Thomas.Doerfler@…>
Branches:
4.10, 4.11, 4.8, 4.9, master
Children:
862c2317
Parents:
8bfffd9b
Message:

merged individual exception handler code to a common one.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • c/src/lib/libcpu/powerpc/ppc403/clock/clock.c

    r8bfffd9b r73cdeb6  
    4141#include <rtems/clockdrv.h>
    4242#include <rtems/libio.h>
    43 
    4443#include <stdlib.h>                     /* for atexit() */
     44#include <rtems/bspIo.h>
     45/*
     46 * check, which exception handling code is present
     47 */
     48#if !defined(ppc405)
     49#define PPC_HAS_CLASSIC_EXCEPTIONS TRUE
     50#else
     51#define PPC_HAS_CLASSIC_EXCEPTIONS FALSE
     52#include <bsp/irq.h>
     53#endif
    4554
    4655volatile uint32_t   Clock_driver_ticks;
     
    7988 *  ISR Handler
    8089 */
    81  
    82 rtems_isr
    83 Clock_isr(rtems_vector_number vector)
    84 {
    85       uint32_t   clicks_til_next_interrupt;
     90
     91#if PPC_HAS_CLASSIC_EXCEPTIONS
     92rtems_isr Clock_isr(rtems_vector_number vector)
     93#else
     94void Clock_isr(void* handle)
     95#endif
     96{
     97    uint32_t   clicks_til_next_interrupt;
    8698    if (!auto_restart)
    8799    {
     
    139151}
    140152
    141 void Install_clock(rtems_isr_entry clock_isr)
    142 {
    143     rtems_isr_entry previous_isr;
     153#if !PPC_HAS_CLASSIC_EXCEPTIONS
     154int ClockIsOn(const rtems_irq_connect_data* unused)
     155{
     156    register uint32_t   tcr;
     157 
     158    asm volatile ("mfspr %0, 0x3da" : "=r" ((tcr))); /* TCR */
     159 
     160    return (tcr & 0x04000000) != 0;
     161}
     162#endif
     163
     164void ClockOff(
     165#if PPC_HAS_CLASSIC_EXCEPTIONS
     166              void
     167#else
     168              const rtems_irq_connect_data* unused
     169#endif
     170              )
     171{
     172    register uint32_t   tcr;
     173 
     174    asm volatile ("mfspr %0, 0x3da" : "=r" ((tcr))); /* TCR */
     175 
     176    tcr &= ~ 0x04400000;
     177 
     178    asm volatile ("mtspr 0x3da, %0" : "=r" ((tcr)) : "0" ((tcr))); /* TCR */
     179}
     180
     181void ClockOn(
     182#if PPC_HAS_CLASSIC_EXCEPTIONS
     183              void
     184#else
     185              const rtems_irq_connect_data* unused
     186#endif
     187              )
     188{
    144189    uint32_t   iocr;
    145190    register uint32_t   tcr;
     
    193238    pit_value = rtems_configuration_get_microseconds_per_tick() *
    194239      rtems_cpu_configuration_get_clicks_per_usec();
     240 
     241     /*
     242      * Set PIT value
     243      */
     244
     245    asm volatile ("mtspr 0x3db, %0" : : "r" (pit_value)); /* PIT */
     246 
     247     /*     
     248      * Set timer to autoreload, bit TCR->ARE = 1  0x0400000
     249      * Enable PIT interrupt, bit TCR->PIE = 1     0x4000000
     250      */
     251    tick_time = get_itimer() + pit_value;
     252
     253    asm volatile ("mfspr %0, 0x3da" : "=r" ((tcr))); /* TCR */
     254    tcr = (tcr & ~0x04400000) | (auto_restart ? 0x04400000 : 0x04000000);
     255#if 1
     256    asm volatile ("mtspr 0x3da, %0" : "=r" ((tcr)) : "0" ((tcr))); /* TCR */
     257#endif
     258
     259}
     260
     261
     262
     263void Install_clock(
     264#if PPC_HAS_CLASSIC_EXCEPTIONS
     265                   rtems_isr_entry clock_isr
     266#else
     267                   void (*clock_isr)(void *)
     268#endif
     269                   )
     270{
     271#ifdef ppc403
     272    uint32_t   pvr;
     273#endif /* ppc403 */
     274 
     275    Clock_driver_ticks = 0;
    195276 
    196277    /*
     
    202283     */
    203284
     285#if PPC_HAS_CLASSIC_EXCEPTIONS
     286 {
     287    rtems_isr_entry previous_isr;
    204288    rtems_interrupt_catch(clock_isr, PPC_IRQ_PIT, &previous_isr);
    205 
    206      /*
    207       * Set PIT value
    208       */
    209 
    210     asm volatile ("mtspr 0x3db, %0" : : "r" (pit_value)); /* PIT */
    211  
    212      /*     
    213       * Set timer to autoreload, bit TCR->ARE = 1  0x0400000
    214       * Enable PIT interrupt, bit TCR->PIE = 1     0x4000000
    215       */
    216     tick_time = get_itimer() + pit_value;
    217     asm volatile ("mfspr %0, 0x3da" : "=r" ((tcr))); /* TCR */
    218     tcr = (tcr & ~0x04400000) | (auto_restart ? 0x04400000 : 0x04000000);
    219     asm volatile ("mtspr 0x3da, %0" : "=r" ((tcr)) : "0" ((tcr))); /* TCR */
    220 
     289    ClockOn();
     290 }
     291#else
     292 {
     293   rtems_irq_connect_data clockIrqConnData;
     294   clockIrqConnData.on   = ClockOn;
     295   clockIrqConnData.off  = ClockOff;
     296   clockIrqConnData.isOn = ClockIsOn;
     297   clockIrqConnData.name = BSP_PIT;
     298   clockIrqConnData.hdl  = clock_isr;
     299   if (!BSP_install_rtems_irq_handler (&clockIrqConnData)) {
     300     printk("Unable to connect Clock Irq handler\n");
     301     rtems_fatal_error_occurred(1);
     302   }
     303 }
     304#endif
    221305    atexit(Clock_exit);
    222306}
    223307
    224308void
    225 ReInstall_clock(rtems_isr_entry new_clock_isr)
    226 {
    227     rtems_isr_entry previous_isr;
    228     uint32_t   isrlevel = 0;
    229 
    230     rtems_interrupt_disable(isrlevel);
     309ReInstall_clock(
     310#if PPC_HAS_CLASSIC_EXCEPTIONS
     311                rtems_isr_entry new_clock_isr
     312#else
     313                void (*new_clock_isr)(void *)
     314#endif
     315)
     316{
     317  uint32_t   isrlevel = 0;
     318 
     319  rtems_interrupt_disable(isrlevel);
     320 
     321#if PPC_HAS_CLASSIC_EXCEPTIONS
     322 {
     323   rtems_isr_entry previous_isr;
     324   rtems_interrupt_catch(new_clock_isr, PPC_IRQ_PIT, &previous_isr);
     325   ClockOn();
     326 }
     327#else
     328  {
     329    rtems_irq_connect_data clockIrqConnData;
    231330   
    232     rtems_interrupt_catch(new_clock_isr, PPC_IRQ_PIT, &previous_isr);
    233 
    234     rtems_interrupt_enable(isrlevel);
     331    clockIrqConnData.name = BSP_PIT;
     332    if (!BSP_get_current_rtems_irq_handler(&clockIrqConnData)) {
     333      printk("Unable to stop system clock\n");
     334      rtems_fatal_error_occurred(1);
     335    }
     336   
     337    BSP_remove_rtems_irq_handler (&clockIrqConnData);
     338   
     339    clockIrqConnData.on   = ClockOn;
     340    clockIrqConnData.off  = ClockOff;
     341    clockIrqConnData.isOn = ClockIsOn;
     342    clockIrqConnData.name = BSP_PIT;
     343    clockIrqConnData.hdl  = new_clock_isr;
     344
     345    if (!BSP_install_rtems_irq_handler (&clockIrqConnData)) {
     346      printk("Unable to connect Clock Irq handler\n");
     347      rtems_fatal_error_occurred(1);
     348    }
     349  }
     350#endif
     351
     352  rtems_interrupt_enable(isrlevel);
    235353}
    236354
     
    244362 */
    245363
    246 void
    247 Clock_exit(void)
    248 {
    249     register uint32_t   tcr;
    250  
    251     asm volatile ("mfspr %0, 0x3da" : "=r" ((tcr))); /* TCR */
    252  
    253     tcr &= ~ 0x04400000;
    254  
    255     asm volatile ("mtspr 0x3da, %0" : "=r" ((tcr)) : "0" ((tcr))); /* TCR */
    256  
    257     (void) set_vector(0, PPC_IRQ_PIT, 1);
     364void Clock_exit(void)
     365{
     366#if PPC_HAS_CLASSIC_EXCEPTIONS
     367  ClockOff();
     368 
     369  (void) set_vector(0, PPC_IRQ_PIT, 1);
     370#else
     371 {
     372    rtems_irq_connect_data clockIrqConnData;
     373   
     374    clockIrqConnData.name = BSP_PIT;
     375    if (!BSP_get_current_rtems_irq_handler(&clockIrqConnData)) {
     376      printk("Unable to stop system clock\n");
     377      rtems_fatal_error_occurred(1);
     378    }
     379   
     380    BSP_remove_rtems_irq_handler (&clockIrqConnData);
     381 }
     382#endif
    258383}
    259384
     
    294419    if (args->command == rtems_build_name('I', 'S', 'R', ' '))
    295420    {
     421#if PPC_HAS_CLASSIC_EXCEPTIONS
    296422        Clock_isr(PPC_IRQ_PIT);
     423#else
     424        Clock_isr(NULL);
     425#endif
    297426    }
    298427    else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
Note: See TracChangeset for help on using the changeset viewer.