#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*/
评论