summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/powerpc/beatnik/irq/irq_test_app.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/powerpc/beatnik/irq/irq_test_app.c')
-rw-r--r--c/src/lib/libbsp/powerpc/beatnik/irq/irq_test_app.c167
1 files changed, 167 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/powerpc/beatnik/irq/irq_test_app.c b/c/src/lib/libbsp/powerpc/beatnik/irq/irq_test_app.c
new file mode 100644
index 0000000000..2a2bfdfb8a
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/beatnik/irq/irq_test_app.c
@@ -0,0 +1,167 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is called from init_exec and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1999.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * OAR init.c Template modified by T. Straumann who provided
+ * the implementation of this application.
+ *
+ * init.c,v 1.12.4.1 2003/09/04 18:46:30 joel Exp
+ */
+
+#define CONFIGURE_INIT
+
+#include <rtems.h>
+
+/* functions */
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+#include <bsp.h> /* for device driver prototypes */
+#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
+#define CONFIGURE_MAXIMUM_TASKS 1
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+#define CONFIGURE_USE_MINIIMFS_AS_BASE_FILESYSTEM
+#include <confdefs.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <bsp/irq.h>
+#include <rtems/bspIo.h>
+
+
+void noop(){}
+int connected() {return 1;}
+
+rtems_irq_connect_data blah = { 0, 0, noop, noop, connected };
+extern void discovery_pic_set_debug_irq();
+
+#define WIRE_IRQ (BSP_IRQ_GPP_0 + 6)
+#define ABRT_IRQ (BSP_IRQ_GPP_0 + 2)
+
+static volatile int testno=0;
+static volatile int wloops =0;
+static volatile int aloops =0;
+
+void wire_hdl()
+{
+ if ( 1 == testno ) {
+ BSP_disable_irq_at_pic(WIRE_IRQ);
+ }
+
+ if ( 2 == testno || 3 == testno ) {
+ discovery_pic_set_debug_irq(0);
+ printk("WIRE -- this message should be printed %s\n", 3==testno ? "FIRST":"SECOND");
+ } else {
+ }
+
+ /* assume the driver checks for less than 1000 loops */
+ if ( ++wloops > 1000) {
+ printk("wire IRQ. FAILURE -- driver couldn't catch runaway ISR. Disabling IRQ source.\n");
+ discovery_pic_set_debug_irq(0);
+ BSP_disable_irq_at_pic(WIRE_IRQ);
+ }
+ /*
+ */
+}
+
+void abrt_hdl()
+{
+ aloops++;
+ if ( 2 == testno || 3 == testno ) {
+ discovery_pic_set_debug_irq(1);
+ printk("ABRT -- this message should be printed %s\n", 2==testno ? "FIRST":"SECOND");
+ } else
+ printk("ABRT IRQ\n");
+
+ if ( 1== testno ) {
+ BSP_enable_irq_at_pic(WIRE_IRQ);
+ }
+ BSP_disable_irq_at_pic(ABRT_IRQ);
+}
+
+
+rtems_task Init(
+ rtems_task_argument ignored
+)
+{
+ blah.name = WIRE_IRQ;
+ blah.hdl = wire_hdl;
+ if (!BSP_install_rtems_irq_handler(&blah)) {
+ fprintf(stderr,"installing handler 1 failed\n");
+ }
+ blah.name = ABRT_IRQ;
+ blah.hdl = abrt_hdl;
+ if (!BSP_install_rtems_irq_handler(&blah)) {
+ fprintf(stderr,"installing handler 2 failed\n");
+ }
+ printf("Hello, testing the ISR dispatcher...\n");
+ printf(" 1. Trying to catch runaway interrupt\n");
+ printf(" If the system freezes, the test failed!\n");
+ fflush(stdout); sleep(1);
+ aloops = wloops = 0;
+ discovery_pic_set_debug_irq(1);
+ printf(" >>> %s\n", wloops<1000 ? "SUCCESS" : "FAILED");
+ discovery_pic_set_debug_irq(0);
+
+ testno++;
+ printf(" 2. Testing enabling / disabling interrupt from ISR\n");
+ printf(" Hit the ABORT key for this test\n");
+ fflush(stdout); sleep(1);
+ aloops = wloops = 0;
+ BSP_disable_irq_at_pic(WIRE_IRQ);
+ BSP_irq_set_priority(ABRT_IRQ,1);
+ BSP_enable_irq_at_pic(ABRT_IRQ);
+ discovery_pic_set_debug_irq(1);
+ while (!aloops)
+ ;
+ discovery_pic_set_debug_irq(0);
+ sleep(2);
+ printf(" >>> disabling ABRT IRQ from isr %s\n", 1==aloops ? "SUCCESS":"FAILURE");
+ printf(" flashing WIRE IRQ from isr %s\n", 1==wloops ? "SUCCESS":"FAILURE");
+
+
+ testno++;
+ printf(" 3. Testing interrupt priorities\n");
+ BSP_irq_set_priority(ABRT_IRQ,2);
+ BSP_irq_set_priority(WIRE_IRQ,2);
+ BSP_enable_irq_at_pic(ABRT_IRQ);
+ BSP_enable_irq_at_pic(WIRE_IRQ);
+ printf(" Hit the ABORT key for this test\n");
+ fflush(stdout); sleep(1);
+ aloops = wloops = 0;
+ while (!aloops)
+ ;
+ sleep(2);
+ testno++;
+ printf(" Now we are raising the priority of the wire interrupt\n");
+ BSP_irq_set_priority(WIRE_IRQ,3);
+ BSP_enable_irq_at_pic(ABRT_IRQ);
+ printf(" Hit the ABORT key for this test\n");
+ fflush(stdout); sleep(1);
+ aloops = wloops = 0;
+ while (!aloops)
+ ;
+
+ sleep(2);
+ printf( "That's it; we're done...\n" );
+ exit( 0 );
+}