diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2009-07-10 15:34:12 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2009-07-10 15:34:12 +0000 |
commit | 142a9df16ac2ac8cd5254dd651a411716ef3ff08 (patch) | |
tree | bf46c60a5b77197dd5c7cc64b377f55987016436 /c/src/lib/libcpu/arm | |
parent | 2009-07-10 Xi Yang <hiyangxi@gmail.com> (diff) | |
download | rtems-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/ChangeLog | 5 | ||||
-rw-r--r-- | c/src/lib/libcpu/arm/Makefile.am | 7 | ||||
-rwxr-xr-x | c/src/lib/libcpu/arm/pxa255/ffuart/ffuart.c | 1 | ||||
-rwxr-xr-x | c/src/lib/libcpu/arm/pxa255/include/pxa255.h | 24 | ||||
-rwxr-xr-x | c/src/lib/libcpu/arm/pxa255/pmc/pmc.c | 127 |
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); + } } |