Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2463 → Rev 2464

/branches/arm/kernel/arch/arm32/src/drivers/gxemul.c
45,7 → 45,6
#include <arch/machine.h>
#include <arch/debug/print.h>
 
 
/* Addresses of devices. */
#define GXEMUL_VIDEORAM 0x10000000
#define GXEMUL_KBD 0x10000000
60,7 → 59,6
#define GXEMUL_MP_MEMSIZE_OFFSET 0x0090
#define GXEMUL_FB 0x12000000
 
 
/* IRQs */
#define GXEMUL_KBD_IRQ 2
#define GXEMUL_TIMER_IRQ 4
88,7 → 86,7
/** Returns the mask of active interrupts. */
static inline uint32_t gxemul_irqc_get_sources(void)
{
return *(uint32_t*) gxemul_hw_map.irqc;
return *((uint32_t *) gxemul_hw_map.irqc);
}
 
 
98,7 → 96,7
*/
static inline void gxemul_irqc_mask(uint32_t irq)
{
*(uint32_t*) gxemul_hw_map.irqc_mask = irq;
*((uint32_t *) gxemul_hw_map.irqc_mask) = irq;
}
 
 
108,7 → 106,7
*/
static inline void gxemul_irqc_unmask(uint32_t irq)
{
*(uint32_t*) gxemul_hw_map.irqc_unmask = irq;
*((uint32_t *) gxemul_hw_map.irqc_unmask) = irq;
}
 
 
123,7 → 121,8
gxemul_hw_map.rtc_freq = gxemul_hw_map.rtc + GXEMUL_RTC_FREQ_OFFSET;
gxemul_hw_map.rtc_ack = gxemul_hw_map.rtc + GXEMUL_RTC_ACK_OFFSET;
gxemul_hw_map.irqc_mask = gxemul_hw_map.irqc + GXEMUL_IRQC_MASK_OFFSET;
gxemul_hw_map.irqc_unmask = gxemul_hw_map.irqc + GXEMUL_IRQC_UNMASK_OFFSET;
gxemul_hw_map.irqc_unmask = gxemul_hw_map.irqc +
GXEMUL_IRQC_UNMASK_OFFSET;
 
hw_map_init_called = true;
}
139,7 → 138,6
*((char *) gxemul_hw_map.videoram) = ch;
}
 
 
/** Enables gxemul keyboard (interrupt unmasked).
*
* @param dev Not used.
151,7 → 149,6
gxemul_irqc_unmask(GXEMUL_KBD_IRQ);
}
 
 
/** Disables gxemul keyboard (interrupt masked).
*
* @param dev not used
163,7 → 160,6
gxemul_irqc_mask(GXEMUL_KBD_IRQ);
}
 
 
/** Read character using polling, assume interrupts disabled.
*
* @param dev Not used.
184,7 → 180,6
}
}
 
 
/** Process keyboard interrupt.
*
* @param irq IRQ information.
208,7 → 203,6
}
}
 
 
static irq_ownership_t gxemul_claim(void)
{
return IRQ_ACCEPT;
225,7 → 219,6
interrupts_restore(ipl);
}
 
 
/** Return console to userspace. */
void gxemul_release_console(void)
{
238,7 → 231,6
interrupts_restore(ipl);
}
 
 
/** Initializes console object representing gxemul console.
*
* @param devno device number.
264,8 → 256,6
sysinfo_set_item_val("kbd.address.virtual", NULL, gxemul_hw_map.kbd);
}
 
 
 
/** Starts gxemul Real Time Clock device, which asserts regular interrupts.
*
* @param frequency Interrupts frequency (0 disables RTC).
272,16 → 262,14
*/
static void gxemul_timer_start(uint32_t frequency)
{
*(uint32_t*) gxemul_hw_map.rtc_freq = frequency;
*((uint32_t*) gxemul_hw_map.rtc_freq) = frequency;
}
 
 
static irq_ownership_t gxemul_timer_claim(void)
{
return IRQ_ACCEPT;
}
 
 
/** Timer interrupt handler.
*
* @param irq Interrupt information.
298,12 → 286,11
spinlock_lock(&irq->lock);
 
/* acknowledge tick */
*(uint32_t*) gxemul_hw_map.rtc_ack = 0;
*((uint32_t*) gxemul_hw_map.rtc_ack) = 0;
}
 
 
/** Initializes and registers timer interrupt handler. */
static void gxemul_timer_irq_init()
static void gxemul_timer_irq_init(void)
{
irq_initialize(&gxemul_timer_irq);
gxemul_timer_irq.devno = device_assign_devno();
320,13 → 307,12
* Initiates regular timer interrupts after initializing
* corresponding interrupt handler.
*/
void gxemul_timer_irq_start()
void gxemul_timer_irq_start(void)
{
gxemul_timer_irq_init();
gxemul_timer_start(GXEMUL_TIMER_FREQ);
}
 
 
/** Returns the size of emulated memory.
*
* @return Size in bytes.
333,10 → 319,9
*/
size_t gxemul_get_memory_size(void)
{
return *((int*)(GXEMUL_MP + GXEMUL_MP_MEMSIZE_OFFSET));
return *((int *) (GXEMUL_MP + GXEMUL_MP_MEMSIZE_OFFSET));
}
 
 
/** Prints a character.
*
* @param ch Character to be printed.
343,7 → 328,7
*/
void gxemul_debug_putc(char ch)
{
char * addr = 0;
char *addr = 0;
if (!hw_map_init_called) {
addr = (char *) GXEMUL_KBD;
} else {
353,7 → 338,6
*(addr) = ch;
}
 
 
/** Stops gxemul. */
void gxemul_cpu_halt(void)
{
367,7 → 351,6
*(addr + GXEMUL_HALT_OFFSET) = '\0';
}
 
 
/** Gxemul specific interrupt exception handler.
*
* Determines sources of the interrupt from interrupt controller and
379,8 → 362,9
void gxemul_irq_exception(int exc_no, istate_t *istate)
{
uint32_t sources = gxemul_irqc_get_sources();
int i = 0;
for (; i < GXEMUL_IRQC_MAX_IRQ; i++) {
int i;
for (i = 0; i < GXEMUL_IRQC_MAX_IRQ; i++) {
if (sources & (1 << i)) {
irq_t *irq = irq_dispatch_and_lock(i);
if (irq) {
389,7 → 373,8
spinlock_unlock(&irq->lock);
} else {
/* Spurious interrupt.*/
dprintf("cpu%d: spurious interrupt (inum=%d)\n", CPU->id, i);
dprintf("cpu%d: spurious interrupt (inum=%d)\n",
CPU->id, i);
}
}
}