]> rtime.felk.cvut.cz Git - sysless.git/commitdiff
Added LPC2xxx PWM library
authorMarek P <marek@tesla.(none)>
Sat, 28 Mar 2009 16:07:44 +0000 (17:07 +0100)
committerMarek P <marek@tesla.(none)>
Sat, 28 Mar 2009 16:07:44 +0000 (17:07 +0100)
arch/arm/mach-lpc21xx/libs/Makefile.omk
arch/arm/mach-lpc21xx/libs/pwm/Makefile [new file with mode: 0644]
arch/arm/mach-lpc21xx/libs/pwm/Makefile.omk [new file with mode: 0644]
arch/arm/mach-lpc21xx/libs/pwm/pwm.c [new file with mode: 0644]
arch/arm/mach-lpc21xx/libs/pwm/pwm.h [new file with mode: 0644]
arch/arm/mach-lpc21xx/libs/pwm/pwm_set.c [new file with mode: 0644]
arch/arm/mach-lpc21xx/libs/pwm/pwm_sync.c [new file with mode: 0644]

index 504872180dbbd02366c9d7341c5e6a8c857426dd..83d34c47358c732df07e79d4bdc93b0686f38650 100644 (file)
@@ -1,3 +1,3 @@
 # -*- makefile -*-
 
-SUBDIRS = boot can lpcan lpcanvca uart_zen uart-nozen ldscripts
+SUBDIRS = boot can lpcan lpcanvca pwm uart_zen uart-nozen ldscripts
diff --git a/arch/arm/mach-lpc21xx/libs/pwm/Makefile b/arch/arm/mach-lpc21xx/libs/pwm/Makefile
new file mode 100644 (file)
index 0000000..76b56fd
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or parent directory\n"
+else
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/arch/arm/mach-lpc21xx/libs/pwm/Makefile.omk b/arch/arm/mach-lpc21xx/libs/pwm/Makefile.omk
new file mode 100644 (file)
index 0000000..fb0af16
--- /dev/null
@@ -0,0 +1,7 @@
+# -*- makefile -*-
+
+lib_LIBRARIES = pwm
+
+pwm_SOURCES = pwm.c  pwm_set.c  pwm_sync.c
+
+include_HEADERS = pwm.h
diff --git a/arch/arm/mach-lpc21xx/libs/pwm/pwm.c b/arch/arm/mach-lpc21xx/libs/pwm/pwm.c
new file mode 100644 (file)
index 0000000..8f1be0c
--- /dev/null
@@ -0,0 +1,40 @@
+#include "pwm.h"
+
+int PWM_PINSEL[] = {
+  /*nothing*/ 1, /*PWM1*/ 1, 15, 3, 17, /*PWM5*/ 11, /*PWM6*/ 19
+};
+
+uint32_t *PWM_MR[] = {
+  (uint32_t*)&(PWMMR0),
+  (uint32_t*)&(PWMMR1),
+  (uint32_t*)&(PWMMR2),
+  (uint32_t*)&(PWMMR3),
+  (uint32_t*)&(PWMMR4),
+  (uint32_t*)&(PWMMR5),
+  (uint32_t*)&(PWMMR6)
+};
+
+void pwm_channel(int n, int double_edge) {
+  uint32_t bit;
+
+  PWMPCR |= (0x100 | (double_edge && n)) << n;
+  if (n == 5) {
+    PINSEL1 |= 0x00000400;
+    PINSEL1 &= 0xfffff7ff;
+  }
+  else {
+    bit = 1 << PWM_PINSEL[n];
+    PINSEL0 |= bit;
+    bit = ~(bit >> 1);
+    PINSEL0 &= bit;
+  }
+}
+
+void pwm_init(uint32_t prescale, uint32_t period) {
+  PWMPR = prescale - 1;
+  PWMMR0 = period;
+  PWMLER |= 0x1;
+  PWMMCR |= 0x00000002;
+  PWMTCR &= ~0x2;
+  PWMTCR |= 0x9;
+}
diff --git a/arch/arm/mach-lpc21xx/libs/pwm/pwm.h b/arch/arm/mach-lpc21xx/libs/pwm/pwm.h
new file mode 100644 (file)
index 0000000..fe69077
--- /dev/null
@@ -0,0 +1,11 @@
+#include <lpc21xx.h>
+#include <types.h>
+
+extern int PWM_PINSEL[];
+extern uint32_t *PWM_MR[];
+
+void pwm_channel(int n, int double_edge);
+void pwm_set(int n, uint32_t when);
+void pwm_set_double(int n, uint32_t from, uint32_t to);
+void pwm_init(uint32_t prescale, uint32_t period);
+void sync_pwm_timer(uint32_t *tc_addr);
diff --git a/arch/arm/mach-lpc21xx/libs/pwm/pwm_set.c b/arch/arm/mach-lpc21xx/libs/pwm/pwm_set.c
new file mode 100644 (file)
index 0000000..305eba6
--- /dev/null
@@ -0,0 +1,12 @@
+#include "pwm.h"
+
+void pwm_set(int n, uint32_t when) {
+  *PWM_MR[n] = when;
+  PWMLER |= 1 << n;
+}
+
+void pwm_set_double(int n, uint32_t from, uint32_t to) {
+  *PWM_MR[n-1] = from;
+  *PWM_MR[n] = to;
+  PWMLER |= 0x3 << (n-1);
+}
diff --git a/arch/arm/mach-lpc21xx/libs/pwm/pwm_sync.c b/arch/arm/mach-lpc21xx/libs/pwm/pwm_sync.c
new file mode 100644 (file)
index 0000000..54a722d
--- /dev/null
@@ -0,0 +1,16 @@
+#include <cpu_def.h>
+#include "pwm.h"
+
+void sync_pwm_timer(uint32_t *tc_addr) {
+  cli();
+  asm volatile
+    (
+     "mov  r2, %0       \n\t"
+     "mov  r3, %1       \n\t"
+     "ldr  r1, [r2]     \n\t"
+     "add  r1, r1, #12  \n\t"
+     "str  r1, [r3]     \n\t"
+     : /* no output */ : "r" (tc_addr), "r" (&PWMTC)
+     );
+  sti();
+}