|
@@ -0,0 +1,83 @@
|
|
|
+/*
|
|
|
+ * Simple gptimers example
|
|
|
+ * http://docs.blackfin.uclinux.org/doku.php?id=linux-kernel:drivers:gptimers
|
|
|
+ *
|
|
|
+ * Copyright 2007-2009 Analog Devices Inc.
|
|
|
+ *
|
|
|
+ * Licensed under the GPL-2 or later.
|
|
|
+ */
|
|
|
+
|
|
|
+#include <linux/interrupt.h>
|
|
|
+#include <linux/module.h>
|
|
|
+
|
|
|
+#include <asm/gptimers.h>
|
|
|
+#include <asm/portmux.h>
|
|
|
+
|
|
|
+/* ... random driver includes ... */
|
|
|
+
|
|
|
+#define DRIVER_NAME "gptimer_example"
|
|
|
+
|
|
|
+struct gptimer_data {
|
|
|
+ uint32_t period, width;
|
|
|
+};
|
|
|
+static struct gptimer_data data;
|
|
|
+
|
|
|
+/* ... random driver state ... */
|
|
|
+
|
|
|
+static irqreturn_t gptimer_example_irq(int irq, void *dev_id)
|
|
|
+{
|
|
|
+ struct gptimer_data *data = dev_id;
|
|
|
+
|
|
|
+ /* make sure it was our timer which caused the interrupt */
|
|
|
+ if (!get_gptimer_intr(TIMER5_id))
|
|
|
+ return IRQ_NONE;
|
|
|
+
|
|
|
+ /* read the width/period values that were captured for the waveform */
|
|
|
+ data->width = get_gptimer_pwidth(TIMER5_id);
|
|
|
+ data->period = get_gptimer_period(TIMER5_id);
|
|
|
+
|
|
|
+ /* acknowledge the interrupt */
|
|
|
+ clear_gptimer_intr(TIMER5_id);
|
|
|
+
|
|
|
+ /* tell the upper layers we took care of things */
|
|
|
+ return IRQ_HANDLED;
|
|
|
+}
|
|
|
+
|
|
|
+/* ... random driver code ... */
|
|
|
+
|
|
|
+static int __init gptimer_example_init(void)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ /* grab the peripheral pins */
|
|
|
+ ret = peripheral_request(P_TMR5, DRIVER_NAME);
|
|
|
+ if (ret) {
|
|
|
+ printk(KERN_NOTICE DRIVER_NAME ": peripheral request failed\n");
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* grab the IRQ for the timer */
|
|
|
+ ret = request_irq(IRQ_TIMER5, gptimer_example_irq, IRQF_SHARED, DRIVER_NAME, &data);
|
|
|
+ if (ret) {
|
|
|
+ printk(KERN_NOTICE DRIVER_NAME ": IRQ request failed\n");
|
|
|
+ peripheral_free(P_TMR5);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* setup the timer and enable it */
|
|
|
+ set_gptimer_config(TIMER5_id, WDTH_CAP | PULSE_HI | PERIOD_CNT | IRQ_ENA);
|
|
|
+ enable_gptimers(TIMER5bit);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+module_init(gptimer_example_init);
|
|
|
+
|
|
|
+static void __exit gptimer_example_exit(void)
|
|
|
+{
|
|
|
+ disable_gptimers(TIMER5bit);
|
|
|
+ free_irq(IRQ_TIMER5, &data);
|
|
|
+ peripheral_free(P_TMR5);
|
|
|
+}
|
|
|
+module_exit(gptimer_example_exit);
|
|
|
+
|
|
|
+MODULE_LICENSE("BSD");
|