voidHi3516dv300_timer_handler(unsignedlongdata){do_gettimeofday(&(txc.time));//功能获取自1970以来的秒数rtc_time_to_tm(txc.time.tv_sec,&tm);/*功能:获取当前的UTC时间time:当前自1970以来的秒数tm:转换成的可识别的年月日时分秒,年+1900月+1,时+8(时区)头文件:#include<linux/rtc.h>*/printk("UTC time :%d-%d-%d %d:%d:%d /n",tm.tm_year+1900,tm.tm_mon,tm.tm_mday,tm.tm_hour,tm.tm_min,tm.tm_sec);//重新修改超时时间,进行周期性的超时mod_timer(&gec6818_timer,jiffies+HZ);}
功能2:内核定时器中断统计电平持续时间
入口函数(Hi3516dv300_Timer_Init)
//入口函数staticint__initHi3516dv300_Timer_Init(void){intret=misc_register(&Infrare_Control_dev);//创建杂项设备if(ret){printk(KERN_ERR"register misc dev for dooralarm fail!\n");gotoerr_clk;}gpio_num=86;//gpio10_6=10*8+6ret=gpio_request(gpio_num,NULL);//注册gpioif(ret<0){printk("gpio_request: fail\n");gotogpio_request_fail;}if(gpio_direction_input(gpio_num)){//设置gpio复用为输入函数printk("[%s %d]gpio_direction_input fail!\n",__func__,__LINE__);return-EIO;}//初始化动态定时器init_timer(&Hi3516dv300_timer);//配置动态定时器Hi3516dv300_timer.function=Hi3516dv300_timer_handler;//处理函数Hi3516dv300_timer.expires=jiffies+HZ/1000;//当前时间开始,1ms后会触发处理函数Hi3516dv300_timer.data=NULL;//传递参数//动态定时器加到内核add_timer(&Hi3516dv300_timer);return0;gpio_request_fail:gpio_free(gpio_num);err_clk:misc_deregister(&Infrare_Control_dev);return0;}
响应函数(Hi3516dv300_timer_handler)
voidHi3516dv300_timer_handler(unsignedlongdata){//重新修改超时时间,进行周期性的超时mod_timer(&Hi3516dv300_timer,jiffies+HZ/1000);//读出GPIO输入值level=gpio_get_value(gpio_num);//设置gpio函数就为gpio_set_value()if(!level){time_cnt++;}else{if(time_cnt!=0){printk("low_level time = %d ms\n",time_cnt);}time_cnt=0;}}