/* This file is part of the program GDB, the GNU debugger.
- Copyright (C) 1998 Free Software Foundation, Inc.
+ Copyright (C) 1998, 2007 Free Software Foundation, Inc.
Contributed by Cygnus Solutions.
This program is free software; you can redistribute it and/or modify
That is, it implements edge- rather than level-triggered
interrupts.
+ This implementation does not support multiple concurrent
+ interrupts.
+
PROPERTIES
that even though INT[0] is tied externally to IP[5], we simulate
it as passing through the controller.
+ An output level of zero signals the clearing of a level interrupt.
+
int0-7 (input)
- External interrupts.
+ External interrupts. Level = 0 -> level interrupt cleared.
dmac0-3 (input)
- DMA internal interrupts, correspond to DMA channels 0-3.
+ DMA internal interrupts, correspond to DMA channels 0-3. Level = 0 -> level interrupt cleared.
sio0-1 (input)
- SIO internal interrupts.
+ SIO internal interrupts. Level = 0 -> level interrupt cleared.
tmr0-2 (input)
- Timer internal interrupts.
+ Timer internal interrupts. Level = 0 -> level interrupt cleared.
*/
static void
tx3904irc_port_event (struct hw *me,
int my_port,
- struct hw *source,
+ struct hw *source_dev,
int source_port,
int level)
{
struct tx3904irc *controller = hw_data (me);
- /* Ignore level - use only edge-triggered interrupts */
+ /* handle deactivated interrupt */
+ if(level == 0)
+ {
+ HW_TRACE ((me, "interrupt cleared on port %d", my_port));
+ hw_port_event(me, IP_PORT, 0);
+ return;
+ }
switch (my_port)
{
{
int source = my_port - INT1_PORT;
- HW_TRACE ((me, "port-event interrupt source %d", source));
+ HW_TRACE ((me, "interrupt asserted on port %d", source));
ISR_SET(controller, source);
if(ILR_GET(controller, source) > IMR_GET(controller))
{
int ip_number = 16 + source; /* compute IP[4:0] */
- HW_TRACE ((me, "interrupt level %ld", ILR_GET(controller,source)));
+ HW_TRACE ((me, "interrupt level %d", ILR_GET(controller,source)));
hw_port_event(me, IP_PORT, ip_number);
}
break;
}
/* write requested byte out */
+ register_value = H2T_4(register_value);
memcpy ((char*) dest + byte, ((char*)& register_value)+reg_offset, 1);
}
default: register_ptr = & register_value; /* used as a dummy */
}
- HW_TRACE ((me, "reg %d pre: %08lx", reg_number, (long) *register_ptr));
+ /* HW_TRACE ((me, "reg %d pre: %08lx", reg_number, (long) *register_ptr)); */
/* overwrite requested byte */
- memcpy (((char*)register_ptr)+reg_offset, (char*)source + byte, 1);
+ register_value = H2T_4(* register_ptr);
+ memcpy (((char*)®ister_value)+reg_offset, (const char*)source + byte, 1);
+ * register_ptr = T2H_4(register_value);
- HW_TRACE ((me, "post: %08lx", (long) *register_ptr));
+ /* HW_TRACE ((me, "post: %08lx", (long) *register_ptr)); */
}
return nr_bytes;
}