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/pxa255/pmc/pmc.c | |
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/pxa255/pmc/pmc.c')
-rwxr-xr-x | c/src/lib/libcpu/arm/pxa255/pmc/pmc.c | 127 |
1 files changed, 105 insertions, 22 deletions
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); + } } |