84 lines
		
	
	
	
		
			1.9 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			84 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"); |