#include <linux/kernel.h>#include <linux/module.h>#include <linux/timer.h>#include <linux/gpio.h>#include <mach/gpio.h>#include <plat/gpio-cfg.h>#include <linux/interrupt.h>
static struct timer_list timer;static struct work_struct work;static int irq;#define TRIG EXYNOS4_GPB(7) //输出触发信号 第8个IO口#define ECHO EXYNOS4_GPX1(0) //ECHO 回响信号输出--中断 第9个IO口
/*获取高电平持续时间--us单位*/static u32 GetTimeH(void){ ktime_t my_time,my_time2; unsigned int i,j; my_time=ktime_get(); //获取当前时间 i=ktime_to_us(my_time); //转 us while(gpio_get_value(ECHO)){} my_time2=ktime_get(); //获取当前时间 j=ktime_to_us(my_time2); //转 us return j-i;}
/*工作函数*/static void csb_work_func(struct work_struct *work){ u32 time=GetTimeH(); printk("厘米:%d cm\n",time/58);}
/*外部中断服务函数*/irqreturn_t csb_irq_handler_func(int irq, void *dev){ /*添加工作到工作队列*/ schedule_work(&work); return IRQ_HANDLED;}
/*内核定时器中断服务函数*/static void timer_function(unsigned long data){ static u8 i=0; mod_timer(&timer,msecs_to_jiffies(1000)+jiffies); i=!i; if(i) { gpio_set_value(TRIG,1); } else { gpio_set_value(TRIG,0); }}
static int __init tiny4412_linux_csb_init(void){ /*请求GPIO口使用权*/ gpio_request(TRIG,"CSB"); /*配置GPIO引脚*/ s3c_gpio_cfgpin(TRIG,S3C_GPIO_OUTPUT); /*GPIO默认输出值*/ gpio_set_value(TRIG,0);
/*初始化工作函数*/ INIT_WORK(&work,csb_work_func); /*1. 获取中断号*/ irq=gpio_to_irq(ECHO); /*2. 注册中断*/ request_irq(irq,csb_irq_handler_func,IRQF_TRIGGER_RISING,"tiny4412_csb",NULL); timer.expires=HZ+jiffies; /*单位是节拍*/ timer.function=timer_function; timer.data=666; /*1. 初始化定时器*/ init_timer(&timer); /*2. 添加定时器到内核*/ add_timer(&timer); printk("驱动测试: 驱动安装成功\n"); return 0;}
static void __exit tiny4412_linux_csb_cleanup(void){ /*3. 删除定时器*/ del_timer_sync(&timer); free_irq(irq,NULL); printk("驱动测试: 驱动卸载成功\n");}
module_init(tiny4412_linux_csb_init); /*驱动入口--安装驱动的时候执行*/module_exit(tiny4412_linux_csb_cleanup); /*驱动出口--卸载驱动的时候执行*/
MODULE_LICENSE("GPL"); /*设置模块的许可证--GPL*/
评论