83 lines
		
	
	
	
		
			1.9 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
	
		
			1.9 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * 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");
 | 
