summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libcpu/arm
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2009-07-10 15:34:12 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2009-07-10 15:34:12 +0000
commit142a9df16ac2ac8cd5254dd651a411716ef3ff08 (patch)
treebf46c60a5b77197dd5c7cc64b377f55987016436 /c/src/lib/libcpu/arm
parent2009-07-10 Xi Yang <hiyangxi@gmail.com> (diff)
downloadrtems-142a9df16ac2ac8cd5254dd651a411716ef3ff08.tar.bz2
2009-07-10 Xi Yang <hiyangxi@gmail.com>
* Makefile.am, pxa255/ffuart/ffuart.c, pxa255/include/pxa255.h, pxa255/pmc/pmc.c: Add PMC support.
Diffstat (limited to 'c/src/lib/libcpu/arm')
-rw-r--r--c/src/lib/libcpu/arm/ChangeLog5
-rw-r--r--c/src/lib/libcpu/arm/Makefile.am7
-rwxr-xr-xc/src/lib/libcpu/arm/pxa255/ffuart/ffuart.c1
-rwxr-xr-xc/src/lib/libcpu/arm/pxa255/include/pxa255.h24
-rwxr-xr-xc/src/lib/libcpu/arm/pxa255/pmc/pmc.c127
5 files changed, 133 insertions, 31 deletions
diff --git a/c/src/lib/libcpu/arm/ChangeLog b/c/src/lib/libcpu/arm/ChangeLog
index f8939506f2..b553d5f050 100644
--- a/c/src/lib/libcpu/arm/ChangeLog
+++ b/c/src/lib/libcpu/arm/ChangeLog
@@ -1,3 +1,8 @@
+2009-07-10 Xi Yang <hiyangxi@gmail.com>
+
+ * Makefile.am, pxa255/ffuart/ffuart.c, pxa255/include/pxa255.h,
+ pxa255/pmc/pmc.c: Add PMC support.
+
2009-06-29 Xi Yang <hiyangxi@gmail.com>
* pxa255/ffuart/ffuart.c, pxa255/include/pxa255.h: Add Skyeye support.
diff --git a/c/src/lib/libcpu/arm/Makefile.am b/c/src/lib/libcpu/arm/Makefile.am
index b51f3a3b48..fd11fdee4f 100644
--- a/c/src/lib/libcpu/arm/Makefile.am
+++ b/c/src/lib/libcpu/arm/Makefile.am
@@ -43,6 +43,13 @@ noinst_PROGRAMS += pxa255/ffuart.rel
pxa255_ffuart_rel_SOURCES = pxa255/ffuart/ffuart.c
pxa255_ffuart_rel_CPPFLAGS = $(AM_CPPFLAGS)
pxa255_ffuart_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
+
+## pxa255/pmc
+noinst_PROGRAMS += pxa255/pmc.rel
+pxa255_pmc_rel_SOURCES = pxa255/pmc/pmc.c
+pxa255_pmc_rel_CPPFLAGS = $(AM_CPPFLAGS)
+pxa255_pmc_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
+
## pxa255/interrupt
include_HEADERS += pxa255/irq/irq.h
noinst_PROGRAMS += pxa255/irq.rel
diff --git a/c/src/lib/libcpu/arm/pxa255/ffuart/ffuart.c b/c/src/lib/libcpu/arm/pxa255/ffuart/ffuart.c
index b91cb674fd..c6dd61b5ec 100755
--- a/c/src/lib/libcpu/arm/pxa255/ffuart/ffuart.c
+++ b/c/src/lib/libcpu/arm/pxa255/ffuart/ffuart.c
@@ -20,7 +20,6 @@
#include <libchip/sersupp.h>
volatile int dbg_dly;
-void _start(void);
/* static function prototypes */
static int ffuart_first_open(int major, int minor, void *arg);
diff --git a/c/src/lib/libcpu/arm/pxa255/include/pxa255.h b/c/src/lib/libcpu/arm/pxa255/include/pxa255.h
index 1d0018aca1..e3d2767ccf 100755
--- a/c/src/lib/libcpu/arm/pxa255/include/pxa255.h
+++ b/c/src/lib/libcpu/arm/pxa255/include/pxa255.h
@@ -81,21 +81,29 @@ typedef unsigned int word_t;
#define XSCALE_CLOCKS_CCCR (*(volatile word_t *)(XSCALE_CLOCKS + 0x00))
-
/*Use ffuart port as the console*/
#define FFUART_BASE 0x40100000
-
-/*Write to KSYEYE_MAGIC_ADDRESS makes SKYEYE to exits*/
+/*Write to SKYEYE_MAGIC_ADDRESS to make SKYEYE exit*/
#define SKYEYE_MAGIC_ADDRESS (*(volatile word_t *)(0xb0000000))
#define SKYEYE_MAGIC_NUMBER (0xf0f0f0f0)
/*PMC*/
-/*Clock counter overflow flag*/
-#define CCOF (0x01<<10)
-#define ENABLE_CC_INT (0x01<<6)
-#define ENABLE_PMC_CC (0x01)
-#define RESET_CC (0x01<<2)
+#define PMC_PMNC 0
+#define PMC_CCNT 1
+#define PMC_INTEN 2
+#define PMC_FLAG 3
+#define PMC_EVTSEL 4
+#define PMC_PMN0 5
+#define PMC_PMN1 6
+#define PMC_PMN2 7
+#define PMC_PMN3 8
+
+#define PMC_PMNC_E (0x01)
+#define PMC_PMNC_PCR (0x01 << 1)
+#define PMC_PMNC_CCR (0x01 << 2)
+#define PMC_PMNC_CCD (0x01 << 3)
+#define PMC_PMNC_PCD (0x01 << 4)
#endif
diff --git a/c/src/lib/libcpu/arm/pxa255/pmc/pmc.c b/c/src/lib/libcpu/arm/pxa255/pmc/pmc.c
index dc784be5ad..5c5c9c0b31 100755
--- a/c/src/lib/libcpu/arm/pxa255/pmc/pmc.c
+++ b/c/src/lib/libcpu/arm/pxa255/pmc/pmc.c
@@ -12,34 +12,117 @@
#include <bsp.h>
#include <pxa255.h>
-unsigned int int_latency;
+unsigned int xscale_read_pmc(int reg)
+{
+ unsigned int val = 0;
+ switch(reg){
+ case PMC_PMNC:
+ asm volatile("mrc p14,0,%0,c0,c1,0\n":"=r"(val):);
+ break;
+ case PMC_CCNT:
+ asm volatile("mrc p14,0,%0,c1,c1,0\n":"=r"(val):);
+ break;
+ case PMC_INTEN:
+ asm volatile("mrc p14,0,%0,c4,c1,0\n":"=r"(val):);
+ break;
+ case PMC_FLAG:
+ asm volatile("mrc p14,0,%0,c5,c1,0\n":"=r"(val):);
+ break;
+ case PMC_EVTSEL:
+ asm volatile("mrc p14,0,%0,c8,c1,0\n":"=r"(val):);
+ break;
+ case PMC_PMN0:
+ asm volatile("mrc p14,0,%0,c0,c2,0\n":"=r"(val):);
+ break;
+ case PMC_PMN1:
+ asm volatile("mrc p14,0,%0,c1,c2,0\n":"=r"(val):);
+ break;
+ case PMC_PMN2:
+ asm volatile("mrc p14,0,%0,c2,c2,0\n":"=r"(val):);
+ break;
+ case PMC_PMN3:
+ asm volatile("mrc p14,0,%0,c3,c2,0\n":"=r"(val):);
+ break;
+ default:
+ val = 0;
+ break;
+ }
+ return val;
+}
+
+void xscale_write_pmc(int reg, unsigned int val)
+{
+ switch(reg){
+ case PMC_PMNC:
+ asm volatile("mcr p14,0,%0,c0,c1,0\n"::"r"(val));
+ break;
+ case PMC_CCNT:
+ asm volatile("mcr p14,0,%0,c1,c1,0\n"::"r"(val));
+ break;
+ case PMC_INTEN:
+ asm volatile("mcr p14,0,%0,c4,c1,0\n"::"r"(val));
+ break;
+ case PMC_FLAG:
+ asm volatile("mcr p14,0,%0,c5,c1,0\n"::"r"(val));
+ break;
+ case PMC_EVTSEL:
+ asm volatile("mcr p14,0,%0,c8,c1,0\n"::"r"(val));
+ break;
+ case PMC_PMN0:
+ asm volatile("mcr p14,0,%0,c0,c2,0\n"::"r"(val));
+ break;
+ case PMC_PMN1:
+ asm volatile("mcr p14,0,%0,c1,c2,0\n"::"r"(val));
+ break;
+ case PMC_PMN2:
+ asm volatile("mcr p14,0,%0,c2,c2,0\n"::"r"(val));
+ break;
+ case PMC_PMN3:
+ asm volatile("mcr p14,0,%0,c3,c2,0\n"::"r"(val));
+ break;
+ default:
+ break;
+ }
+}
+
+void xscale_pmc_enable_pmc(void)
+{
+ unsigned int val;
+ val = xscale_read_pmc(PMC_PMNC);
+ val = (val | PMC_PMNC_E)&(~PMC_PMNC_PCD);
+ xscale_write_pmc(PMC_PMNC,val);
+}
+void xscale_pmc_disable_pmc(void)
+{
+ unsigned int val;
+ val = xscale_read_pmc(PMC_PMNC);
+ val = val & (~PMC_PMNC_E);
+ xscale_write_pmc(PMC_PMNC,val);
+}
-static void pmc_isr_on(const rtems_irq_connect_data *unused)
+void xscale_pmc_reset_pmc(void)
{
- unsigned int operand;
- /*clean CC*/
- operand = 0x0;
- asm volatile("mcr p14,0,%0,c1,c0,0 \n"::"r"(operand));
- /*clean the Clock counter flag and enable the interrupt of CC*/
- operand = 0x0|RESET_CCOF|ENABLE_CC_INT|RESET_CC|ENABLE_PMC_CC;
- asm volatile("mcr p14,0,%0,c0,c0,0 \n"::"r"(operand));
- /*Set to the 4kHZ*/
- operand = (unsigned int)0xffffffff-(unsigned int)100000;
- asm volatile("mcr p14,0,%0,c1,c0,0 \n"::"r"(operand));
+ unsigned int val;
+ val = xscale_read_pmc(PMC_PMNC);
+ val = val | PMC_PMNC_PCR;
+ xscale_write_pmc(PMC_PMNC,val);
}
-static void pmc_isr_off(const rtems_irq_connect_data *unused)
+void xscale_pmc_reset_ccnt(void)
{
- unsigned int operand;
- operand = 0x0|RESET_CCOF;
- asm volatile("mcr p14,0,%0,c0,c0,0 \n"::"r"(operand));
+ unsigned int val;
+ val = xscale_read_pmc(PMC_PMNC);
+ val = val | PMC_PMNC_CCR;
+ xscale_write_pmc(PMC_PMNC,val);
}
-static int pmc_isr_is_on(const rtems_irq_connect_data *unused)
+void xscale_pmc_setevent(int reg, unsigned char evt)
{
- unsigned int operand;
- asm volatile("mrc p14,0,%0,c0,c0,0 \n":"=r"(operand):);
- if((operand & ENABLE_PMC_CC ) && (operand & ENABLE_CC_INT))
- return 1;
- return 0;
+ unsigned int val;
+ val = xscale_read_pmc(PMC_EVTSEL);
+ if((reg >= PMC_PMN0) && (reg <= PMC_PMN3)){
+ val &= ~(0xff<<(reg-PMC_PMN0)*8);
+ val |= evt << (reg-PMC_PMN0)*8;
+ xscale_write_pmc(PMC_EVTSEL,val);
+ }
}