annotate packages/hal/arm/xscale/pxa2x0/current/src/pxa2x0_misc.c @ 2855:22f1625c71e0

* src/pxa2x0_misc.c (hal_interrupt_configure): Use GFER0/GRER0 for GPIO2-GPIO31. Patch from Alfonso Sanchez. [ Bugzilla 1000681 ]
author jld
date Tue, 24 Mar 2009 16:27:03 +0000
parents 74dbf4c3f2e1
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
1 //==========================================================================
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
2 //
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
3 // pxa2x0_misc.c
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
4 //
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
5 // HAL misc board support code for Intel PXA2X0
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
6 //
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
7 //==========================================================================
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
8 // ####ECOSGPLCOPYRIGHTBEGIN####
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
9 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
12 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
13 // eCos is free software; you can redistribute it and/or modify it under
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
14 // the terms of the GNU General Public License as published by the Free
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
15 // Software Foundation; either version 2 or (at your option) any later
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
16 // version.
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
17 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
19 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
21 // for more details.
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
22 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
23 // You should have received a copy of the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
24 // along with eCos; if not, write to the Free Software Foundation, Inc.,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
25 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
26 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
27 // As a special exception, if other files instantiate templates or use
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
28 // macros or inline functions from this file, or you compile this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
29 // and link it with other works to produce a work based on this file,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
30 // this file does not by itself cause the resulting work to be covered by
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
31 // the GNU General Public License. However the source code for this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
32 // must still be made available in accordance with section (3) of the GNU
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
33 // General Public License v2.
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
34 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
35 // This exception does not invalidate any other reasons why a work based
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
36 // on this file might be covered by the GNU General Public License.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
37 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2115
diff changeset
38 // ####ECOSGPLCOPYRIGHTEND####
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
39 //==========================================================================
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
40 //#####DESCRIPTIONBEGIN####
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
41 //
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
42 // Author(s): <knud.woehler@microplex.de>
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
43 // Date: 2002-09-03
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
44 //
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
45 //####DESCRIPTIONEND####
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
46 //
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
47 //========================================================================*/
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
48
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
49 #include <pkgconf/hal.h>
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
50 #include <pkgconf/system.h>
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
51 #include CYGBLD_HAL_PLATFORM_H
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
52 #include <cyg/infra/cyg_type.h>
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
53 #include <cyg/infra/cyg_trac.h>
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
54 #include <cyg/infra/cyg_ass.h>
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
55 #include <cyg/hal/hal_misc.h>
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
56 #include <cyg/hal/hal_io.h>
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
57 #include <cyg/hal/hal_stub.h>
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
58 #include <cyg/hal/hal_arch.h>
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
59 #include <cyg/hal/hal_diag.h>
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
60 #include <cyg/hal/hal_intr.h>
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
61 #include <cyg/hal/hal_cache.h>
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
62 #include <cyg/hal/hal_pxa2x0.h>
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
63 #include <cyg/hal/hal_mm.h>
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
64 #include <cyg/infra/diag.h>
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
65
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
66
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
67 // Initialize the interrupt environment
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
68 externC void plf_hardware_init(void);
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
69
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
70 void hal_hardware_init(void)
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
71 {
653
646a29ef8e22 Move hal_if_init() to platform initialization
gthomas
parents: 537
diff changeset
72 hal_xscale_core_init();
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
73
653
646a29ef8e22 Move hal_if_init() to platform initialization
gthomas
parents: 537
diff changeset
74 *PXA2X0_ICMR = 0; // IRQ Mask
646a29ef8e22 Move hal_if_init() to platform initialization
gthomas
parents: 537
diff changeset
75 *PXA2X0_ICLR = 0; // Route interrupts to IRQ
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
76 *PXA2X0_ICCR = 1;
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
77
653
646a29ef8e22 Move hal_if_init() to platform initialization
gthomas
parents: 537
diff changeset
78 *PXA2X0_GRER0 = 0; // Disable rising edge detect
646a29ef8e22 Move hal_if_init() to platform initialization
gthomas
parents: 537
diff changeset
79 *PXA2X0_GRER1 = 0;
646a29ef8e22 Move hal_if_init() to platform initialization
gthomas
parents: 537
diff changeset
80 *PXA2X0_GRER2 = 0;
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
81
653
646a29ef8e22 Move hal_if_init() to platform initialization
gthomas
parents: 537
diff changeset
82 *PXA2X0_GFER0 = 0; // Disable falling edge detect
646a29ef8e22 Move hal_if_init() to platform initialization
gthomas
parents: 537
diff changeset
83 *PXA2X0_GFER1 = 0;
646a29ef8e22 Move hal_if_init() to platform initialization
gthomas
parents: 537
diff changeset
84 *PXA2X0_GFER2 = 0;
646a29ef8e22 Move hal_if_init() to platform initialization
gthomas
parents: 537
diff changeset
85
2115
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
86 #if defined(CYGOPT_HAL_ARM_XSCALE_PXA2X0_VARIANT_PXA25X)
653
646a29ef8e22 Move hal_if_init() to platform initialization
gthomas
parents: 537
diff changeset
87 *PXA2X0_GEDR0 = 0xffffffff; // Clear edge detect status
646a29ef8e22 Move hal_if_init() to platform initialization
gthomas
parents: 537
diff changeset
88 *PXA2X0_GEDR1 = 0xffffffff;
646a29ef8e22 Move hal_if_init() to platform initialization
gthomas
parents: 537
diff changeset
89 *PXA2X0_GEDR2 = 0x0001ffff;
2115
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
90 #elif defined(CYGOPT_HAL_ARM_XSCALE_PXA2X0_VARIANT_PXA27X)
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
91 *PXA2X0_ICMR2 = 0;
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
92 *PXA2X0_ICLR2 = 0;
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
93
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
94 *PXA2X0_GRER3 = 0;
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
95 *PXA2X0_GFER3 = 0;
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
96
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
97 *PXA2X0_GEDR0 = 0xfffff71b;
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
98 *PXA2X0_GEDR1 = 0xffffffff;
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
99 *PXA2X0_GEDR2 = 0xffffffff;
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
100 *PXA2X0_GEDR3 = 0x1fffffff;
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
101 #endif
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
102
653
646a29ef8e22 Move hal_if_init() to platform initialization
gthomas
parents: 537
diff changeset
103 plf_hardware_init(); // Perform any platform specific initializations
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
104
653
646a29ef8e22 Move hal_if_init() to platform initialization
gthomas
parents: 537
diff changeset
105 *PXA2X0_OSCR = 0; // Let the "OS" counter run
646a29ef8e22 Move hal_if_init() to platform initialization
gthomas
parents: 537
diff changeset
106 *PXA2X0_OSMR0 = 0;
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
107
653
646a29ef8e22 Move hal_if_init() to platform initialization
gthomas
parents: 537
diff changeset
108 #ifdef CYGSEM_HAL_ENABLE_DCACHE_ON_STARTUP
646a29ef8e22 Move hal_if_init() to platform initialization
gthomas
parents: 537
diff changeset
109 HAL_DCACHE_ENABLE(); // Enable caches
646a29ef8e22 Move hal_if_init() to platform initialization
gthomas
parents: 537
diff changeset
110 #endif
646a29ef8e22 Move hal_if_init() to platform initialization
gthomas
parents: 537
diff changeset
111 #ifdef CYGSEM_HAL_ENABLE_ICACHE_ON_STARTUP
646a29ef8e22 Move hal_if_init() to platform initialization
gthomas
parents: 537
diff changeset
112 HAL_ICACHE_ENABLE();
646a29ef8e22 Move hal_if_init() to platform initialization
gthomas
parents: 537
diff changeset
113 #endif
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
114 }
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
115
1162
99158cb29a49 Improve PCI bus handling on uE250
gthomas
parents: 744
diff changeset
116 //
99158cb29a49 Improve PCI bus handling on uE250
gthomas
parents: 744
diff changeset
117 // GPIO support functions
99158cb29a49 Improve PCI bus handling on uE250
gthomas
parents: 744
diff changeset
118 //
99158cb29a49 Improve PCI bus handling on uE250
gthomas
parents: 744
diff changeset
119 void
99158cb29a49 Improve PCI bus handling on uE250
gthomas
parents: 744
diff changeset
120 _pxa2x0_set_GPIO_mode(int bit, int mode, int dir)
99158cb29a49 Improve PCI bus handling on uE250
gthomas
parents: 744
diff changeset
121 {
99158cb29a49 Improve PCI bus handling on uE250
gthomas
parents: 744
diff changeset
122 int bank = bit / 32;
1900
fef4af698afa * src/pxa2x0_misc.c (_pxa2x0_set_GPIO_mode): Fix compiler warning
asl
parents: 1162
diff changeset
123 unsigned volatile long *gpdr, *gafr;
1162
99158cb29a49 Improve PCI bus handling on uE250
gthomas
parents: 744
diff changeset
124
99158cb29a49 Improve PCI bus handling on uE250
gthomas
parents: 744
diff changeset
125 gpdr = &PXA2X0_GPDR0[bank];
99158cb29a49 Improve PCI bus handling on uE250
gthomas
parents: 744
diff changeset
126 gafr = &PXA2X0_GAFR0_L[(bit&0x30)>>4];
99158cb29a49 Improve PCI bus handling on uE250
gthomas
parents: 744
diff changeset
127 bit %= 32;
99158cb29a49 Improve PCI bus handling on uE250
gthomas
parents: 744
diff changeset
128 // Data direction registers have 1 bit per GPIO
99158cb29a49 Improve PCI bus handling on uE250
gthomas
parents: 744
diff changeset
129 *gpdr = (*gpdr & ~(1<<bit)) | (dir<<bit);
99158cb29a49 Improve PCI bus handling on uE250
gthomas
parents: 744
diff changeset
130 // Alternate function regusters have 2 bits per GPIO
99158cb29a49 Improve PCI bus handling on uE250
gthomas
parents: 744
diff changeset
131 bit = (bit & 0x0F) * 2;
99158cb29a49 Improve PCI bus handling on uE250
gthomas
parents: 744
diff changeset
132 *gafr = (*gafr & ~(3<<bit)) | (mode<<bit);
99158cb29a49 Improve PCI bus handling on uE250
gthomas
parents: 744
diff changeset
133 }
99158cb29a49 Improve PCI bus handling on uE250
gthomas
parents: 744
diff changeset
134
99158cb29a49 Improve PCI bus handling on uE250
gthomas
parents: 744
diff changeset
135
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
136 // Initialize the clock
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
137 static cyg_uint32 clock_period;
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
138
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
139 void hal_clock_initialize(cyg_uint32 period)
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
140 {
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
141 *PXA2X0_OSMR0 = period; // Load match value
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
142 clock_period = period;
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
143
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
144 *PXA2X0_OSCR = 0; // Start the counter
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
145 *PXA2X0_OSSR = PXA2X0_OSSR_TIMER0; // Clear any pending interrupt
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
146 *PXA2X0_OIER |= PXA2X0_OIER_TIMER0; // Enable timer 0 interrupt
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
147
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
148 HAL_INTERRUPT_UNMASK( CYGNUM_HAL_INTERRUPT_TIMER0 ); // Unmask timer 0 interrupt
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
149 }
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
150
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
151 // This routine is called during a clock interrupt.
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
152 void hal_clock_reset(cyg_uint32 vector, cyg_uint32 period)
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
153 {
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
154 *PXA2X0_OSMR0 = *PXA2X0_OSCR + period; // Load new match value
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
155 *PXA2X0_OSSR = PXA2X0_OSSR_TIMER0; // Clear any pending interrupt
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
156 }
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
157
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
158 // Read the current value of the clock, returning the number of hardware
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
159 // "ticks" that have occurred (i.e. how far away the current value is from
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
160 // the start)
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
161
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
162 // Note: The "contract" for this function is that the value is the number
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
163 // of hardware clocks that have happened since the last interrupt (i.e.
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
164 // when it was reset). This value is used to measure interrupt latencies.
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
165 // However, since the hardware counter runs freely, this routine computes
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
166 // the difference between the current clock period and the number of hardware
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
167 // ticks left before the next timer interrupt.
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
168 void hal_clock_read(cyg_uint32 *pvalue)
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
169 {
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
170 int orig;
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
171 HAL_DISABLE_INTERRUPTS(orig);
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
172 *pvalue = clock_period + *PXA2X0_OSCR - *PXA2X0_OSMR0;
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
173 HAL_RESTORE_INTERRUPTS(orig);
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
174 }
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
175
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
176 // Delay for some number of micro-seconds
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
177 void hal_delay_us(cyg_int32 usecs)
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
178 {
2115
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
179 #if defined(CYGOPT_HAL_ARM_XSCALE_PXA2X0_VARIANT_PXA25X)
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
180 # define NSECS_PER_TICK 271267 /* 3.6865 MHz clock */
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
181 #elif defined(CYGOPT_HAL_ARM_XSCALE_PXA2X0_VARIANT_PXA27X)
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
182 # define NSECS_PER_TICK 307692 /* 3.25 MHz clock */
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
183 #endif
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
184
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
185 cyg_uint32 val = 0;
2115
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
186 cyg_uint32 prev = *PXA2X0_OSCR;
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
187 while (usecs-- > 0) {
2115
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
188 while (val < 1000000) {
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
189 cyg_uint32 now = *PXA2X0_OSCR;
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
190 cyg_uint32 diff = now - prev;
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
191 val += NSECS_PER_TICK * diff;
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
192 prev = now;
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
193 }
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
194 val -= 1000000;
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
195 }
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
196 }
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
197
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
198
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
199 // Interrupt handling
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
200
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
201 // This routine is called to respond to a hardware interrupt (IRQ). It
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
202 // should interrogate the hardware and return the IRQ vector number.
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
203 int hal_IRQ_handler(void)
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
204 {
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
205 cyg_uint32 sources, index;
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
206
744
42861b9d6e75 Minor improvement for extended IRQ support
gthomas
parents: 653
diff changeset
207 sources = *PXA2X0_ICIP;
42861b9d6e75 Minor improvement for extended IRQ support
gthomas
parents: 653
diff changeset
208
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
209 #ifdef HAL_EXTENDED_IRQ_HANDLER
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
210 // Use platform specific IRQ handler, if defined
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
211 // Note: this macro should do a 'return' with the appropriate
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
212 // interrupt number if such an extended interrupt exists. The
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
213 // assumption is that the line after the macro starts 'normal' processing.
744
42861b9d6e75 Minor improvement for extended IRQ support
gthomas
parents: 653
diff changeset
214 HAL_EXTENDED_IRQ_HANDLER(sources);
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
215 #endif
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
216
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
217 if ( sources & 0xff0000 )
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
218 index = 16;
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
219 else if ( sources & 0xff00 )
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
220 index = 8;
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
221 else if ( sources & 0xff )
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
222 index = 0;
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
223 else // if ( sources & 0xff000000 )
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
224 index = 24;
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
225
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
226 do {
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
227 if ( (1 << index) & sources ) {
2115
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
228 if (index == CYGNUM_HAL_INTERRUPT_GPIOX) {
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
229 // Special case of GPIO cascade. Search for lowest set bit
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
230 sources = *PXA2X0_GEDR0;
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
231 index = 0;
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
232 do {
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
233 if (sources & (1 << index)) {
2115
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
234 return CYGNUM_HAL_INTERNAL_IRQS + index;
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
235 }
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
236 index++;
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
237 } while (index < 32);
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
238 sources = *PXA2X0_GEDR1;
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
239 index = 0;
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
240 do {
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
241 if (sources & (1 << index)) {
2115
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
242 return CYGNUM_HAL_INTERNAL_IRQS + 32 + index;
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
243 }
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
244 index++;
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
245 } while (index < 32);
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
246 sources = *PXA2X0_GEDR2;
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
247 index = 0;
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
248 do {
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
249 if (sources & (1 << index)) {
2115
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
250 return CYGNUM_HAL_INTERNAL_IRQS + 64 + index;
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
251 }
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
252 index++;
2115
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
253 } while (index < 32);
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
254 #ifdef CYGOPT_HAL_ARM_XSCALE_PXA2X0_VARIANT_PXA27X
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
255 sources = *PXA2X0_GEDR3;
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
256 index = 0;
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
257 do {
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
258 if (sources & (1 << index)) {
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
259 return CYGNUM_HAL_INTERNAL_IRQS + 96 + index;
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
260 }
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
261 index++;
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
262 } while (index < 32);
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
263 #endif
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
264 }
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
265 return index;
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
266 }
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
267 index++;
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
268 } while ( index & 7 );
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
269
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
270 return CYGNUM_HAL_INTERRUPT_NONE; // This shouldn't happen!
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
271 }
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
272
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
273 void hal_interrupt_mask(int vector)
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
274 {
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
275
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
276 #ifdef HAL_EXTENDED_INTERRUPT_MASK
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
277 // Use platform specific handling, if defined
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
278 // Note: this macro should do a 'return' for "extended" values of 'vector'
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
279 // Normal vectors are handled by code subsequent to the macro call.
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
280 HAL_EXTENDED_INTERRUPT_MASK(vector);
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
281 #endif
2115
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
282 #ifdef CYGOPT_HAL_ARM_XSCALE_PXA2X0_VARIANT_PXA27X
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
283 if (vector >= 32 && vector < CYGNUM_HAL_INTERNAL_IRQS) {
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
284 *PXA2X0_ICMR2 &= ~(1 << (vector - 32));
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
285 return;
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
286 }
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
287 #endif
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
288 if (vector >= CYGNUM_HAL_INTERRUPT_GPIO(2)) {
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
289 vector = CYGNUM_HAL_INTERRUPT_GPIOX;
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
290 }
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
291 *PXA2X0_ICMR &= ~(1 << vector);
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
292 }
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
293
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
294 void hal_interrupt_unmask(int vector)
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
295 {
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
296
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
297 #ifdef HAL_EXTENDED_INTERRUPT_UNMASK
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
298 // Use platform specific handling, if defined
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
299 // Note: this macro should do a 'return' for "extended" values of 'vector'
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
300 // Normal vectors are handled by code subsequent to the macro call.
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
301 HAL_EXTENDED_INTERRUPT_UNMASK(vector);
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
302 #endif
2115
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
303 #ifdef CYGOPT_HAL_ARM_XSCALE_PXA2X0_VARIANT_PXA27X
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
304 if (vector >= 32 && vector < CYGNUM_HAL_INTERNAL_IRQS) {
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
305 *PXA2X0_ICMR2 |= (1 << (vector - 32));
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
306 return;
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
307 }
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
308 #endif
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
309 if (vector >= CYGNUM_HAL_INTERRUPT_GPIO(2)) {
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
310 vector = CYGNUM_HAL_INTERRUPT_GPIOX;
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
311 }
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
312 *PXA2X0_ICMR |= (1 << vector);
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
313 }
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
314
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
315 void hal_interrupt_acknowledge(int vector)
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
316 {
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
317
744
42861b9d6e75 Minor improvement for extended IRQ support
gthomas
parents: 653
diff changeset
318 #ifdef HAL_EXTENDED_INTERRUPT_ACKNOWLEDGE
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
319 // Use platform specific handling, if defined
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
320 // Note: this macro should do a 'return' for "extended" values of 'vector'
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
321 // Normal vectors are handled by code subsequent to the macro call.
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
322 HAL_EXTENDED_INTERRUPT_ACKNOWLEDGE(vector);
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
323 #endif
2115
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
324 if (vector == CYGNUM_HAL_INTERRUPT_GPIO0 || vector == CYGNUM_HAL_INTERRUPT_GPIO1) {
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
325 *PXA2X0_GEDR0 = (1 << (vector - 8));
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
326 } else {
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
327 #ifdef CYGOPT_HAL_ARM_XSCALE_PXA2X0_VARIANT_PXA27X
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
328 if (vector >= CYGNUM_HAL_INTERRUPT_GPIO(96)) {
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
329 *PXA2X0_GEDR3 = (1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 96));
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
330 } else
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
331 #endif
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
332 if (vector >= CYGNUM_HAL_INTERRUPT_GPIO(64)) {
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
333 *PXA2X0_GEDR2 = (1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 64));
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
334 } else if (vector >= CYGNUM_HAL_INTERRUPT_GPIO(32)) {
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
335 *PXA2X0_GEDR1 = (1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 32));
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
336 } else if (vector >= CYGNUM_HAL_INTERRUPT_GPIO(2)) {
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
337 *PXA2X0_GEDR0 = (1 << (vector - CYGNUM_HAL_INTERNAL_IRQS));
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
338 } else {
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
339 // Not a GPIO interrupt
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
340 return;
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
341 }
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
342 }
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
343 }
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
344
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
345 void hal_interrupt_configure(int vector, int level, int up)
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
346 {
2115
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
347 cyg_bool falling = level || !up;
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
348 cyg_bool rising = level || up;
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
349
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
350 #ifdef HAL_EXTENDED_INTERRUPT_CONFIGURE
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
351 // Use platform specific handling, if defined
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
352 // Note: this macro should do a 'return' for "extended" values of 'vector'
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
353 // Normal vectors are handled by code subsequent to the macro call.
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
354 HAL_EXTENDED_INTERRUPT_CONFIGURE(vector, level, up);
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
355 #endif
2115
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
356 #ifdef CYGOPT_HAL_ARM_XSCALE_PXA2X0_VARIANT_PXA27X
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
357 if (vector >= CYGNUM_HAL_INTERRUPT_GPIO(96)) {
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
358 if (falling)
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
359 *PXA2X0_GFER3 |= (1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 96));
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
360 else
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
361 *PXA2X0_GFER3 &= ~(1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 96));
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
362 if (rising)
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
363 *PXA2X0_GRER3 |= (1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 96));
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
364 else
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
365 *PXA2X0_GRER3 &= ~(1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 96));
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
366 } else
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
367 #endif
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
368 if (vector >= CYGNUM_HAL_INTERRUPT_GPIO(64)) {
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
369 if (falling)
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
370 *PXA2X0_GFER2 |= (1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 64));
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
371 else
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
372 *PXA2X0_GFER2 &= ~(1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 64));
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
373 if (rising)
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
374 *PXA2X0_GRER2 |= (1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 64));
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
375 else
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
376 *PXA2X0_GRER2 &= ~(1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 64));
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
377 } else if (vector >= CYGNUM_HAL_INTERRUPT_GPIO(32)) {
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
378 if (falling)
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
379 *PXA2X0_GFER1 |= (1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 32));
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
380 else
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
381 *PXA2X0_GFER1 &= ~(1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 32));
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
382 if (rising)
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
383 *PXA2X0_GRER1 |= (1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 32));
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
384 else
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
385 *PXA2X0_GRER1 &= ~(1 << (vector - CYGNUM_HAL_INTERNAL_IRQS - 32));
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
386 } else if (vector >= CYGNUM_HAL_INTERRUPT_GPIO(2)) {
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
387 if (falling)
2855
22f1625c71e0 * src/pxa2x0_misc.c (hal_interrupt_configure): Use GFER0/GRER0 for
jld
parents: 2729
diff changeset
388 *PXA2X0_GFER0 |= (1 << (vector - CYGNUM_HAL_INTERNAL_IRQS));
2115
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
389 else
2855
22f1625c71e0 * src/pxa2x0_misc.c (hal_interrupt_configure): Use GFER0/GRER0 for
jld
parents: 2729
diff changeset
390 *PXA2X0_GFER0 &= ~(1 << (vector - CYGNUM_HAL_INTERNAL_IRQS));
2115
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
391 if (rising)
2855
22f1625c71e0 * src/pxa2x0_misc.c (hal_interrupt_configure): Use GFER0/GRER0 for
jld
parents: 2729
diff changeset
392 *PXA2X0_GRER0 |= (1 << (vector - CYGNUM_HAL_INTERNAL_IRQS));
2115
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
393 else
2855
22f1625c71e0 * src/pxa2x0_misc.c (hal_interrupt_configure): Use GFER0/GRER0 for
jld
parents: 2729
diff changeset
394 *PXA2X0_GRER0 &= ~(1 << (vector - CYGNUM_HAL_INTERNAL_IRQS));
2115
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
395 } else if (vector == CYGNUM_HAL_INTERRUPT_GPIO0 || vector == CYGNUM_HAL_INTERRUPT_GPIO1) {
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
396 if (falling)
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
397 *PXA2X0_GFER0 |= (1 << (vector - 8));
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
398 else
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
399 *PXA2X0_GFER0 &= ~(1 << (vector - 8));
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
400 if (rising)
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
401 *PXA2X0_GRER0 |= (1 << (vector - 8));
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
402 else
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
403 *PXA2X0_GRER0 &= ~(1 << (vector - 8));
3e45f460a99e * cdl/hal_arm_xscale_pxa2x0.cdl: New
asl
parents: 1942
diff changeset
404 }
537
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
405 }
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
406
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
407 void hal_interrupt_set_level(int vector, int level)
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
408 {
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
409
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
410 #ifdef HAL_EXTENDED_INTERRUPT_SET_LEVEL
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
411 // Use platform specific handling, if defined
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
412 // Note: this macro should do a 'return' for "extended" values of 'vector'
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
413 // Normal vectors are handled by code subsequent to the macro call.
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
414 HAL_EXTENDED_INTERRUPT_SET_LEVEL(vector, level);
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
415 #endif
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
416 }
b0e7b1f888d6 pxa2x0/mpc50 port from Knud Woehler
msalter
parents:
diff changeset
417