Changeset 00287cc in mainline for kernel/arch/arm32/src/interrupt.c


Ignore:
Timestamp:
2009-03-12T23:26:32Z (16 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
648c9d9
Parents:
3b122e9
Message:

arm32: update for the new scheme of device drivers and keyboard/serial modules
streamline arm32 port (as GXemul is still the only machine supported), more cleanup is needed

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/arm32/src/interrupt.c

    r3b122e9 r00287cc  
    3636#include <arch/asm.h>
    3737#include <arch/regutils.h>
     38#include <arch/drivers/gxemul.h>
    3839#include <ddi/irq.h>
    39 #include <arch/machine.h>
     40#include <ddi/device.h>
    4041#include <interrupt.h>
    4142
    4243/** Initial size of a table holding interrupt handlers. */
    4344#define IRQ_COUNT 8
     45
     46static irq_t gxemul_timer_irq;
    4447
    4548/** Disable interrupts.
     
    5053{
    5154        ipl_t ipl = current_status_reg_read();
    52 
     55       
    5356        current_status_reg_control_write(STATUS_REG_IRQ_DISABLED_BIT | ipl);
    5457       
     
    6366{
    6467        ipl_t ipl = current_status_reg_read();
    65 
     68       
    6669        current_status_reg_control_write(ipl & ~STATUS_REG_IRQ_DISABLED_BIT);
    67 
     70       
    6871        return ipl;
    6972}
     
    8992}
    9093
     94/** Starts gxemul Real Time Clock device, which asserts regular interrupts.
     95 *
     96 * @param frequency Interrupts frequency (0 disables RTC).
     97 */
     98static void gxemul_timer_start(uint32_t frequency)
     99{
     100        *((uint32_t *) (gxemul_rtc + GXEMUL_RTC_FREQ_OFFSET))
     101            = frequency;
     102}
     103
     104static irq_ownership_t gxemul_timer_claim(irq_t *irq)
     105{
     106        return IRQ_ACCEPT;
     107}
     108
     109/** Timer interrupt handler.
     110 *
     111 * @param irq Interrupt information.
     112 * @param arg Not used.
     113 */
     114static void gxemul_timer_irq_handler(irq_t *irq)
     115{
     116        /*
     117        * We are holding a lock which prevents preemption.
     118        * Release the lock, call clock() and reacquire the lock again.
     119        */
     120        spinlock_unlock(&irq->lock);
     121        clock();
     122        spinlock_lock(&irq->lock);
     123       
     124        /* acknowledge tick */
     125        *((uint32_t *) (gxemul_rtc + GXEMUL_RTC_ACK_OFFSET))
     126            = 0;
     127}
     128
    91129/** Initialize basic tables for exception dispatching
    92130 * and starts the timer.
     
    95133{
    96134        irq_init(IRQ_COUNT, IRQ_COUNT);
    97         machine_timer_irq_start();
     135       
     136        irq_initialize(&gxemul_timer_irq);
     137        gxemul_timer_irq.devno = device_assign_devno();
     138        gxemul_timer_irq.inr = GXEMUL_TIMER_IRQ;
     139        gxemul_timer_irq.claim = gxemul_timer_claim;
     140        gxemul_timer_irq.handler = gxemul_timer_irq_handler;
     141       
     142        irq_register(&gxemul_timer_irq);
     143       
     144        gxemul_timer_start(GXEMUL_TIMER_FREQ);
    98145}
    99146
Note: See TracChangeset for help on using the changeset viewer.