imx6q内核定时器实现led闪烁
2017-03-12 23:04
204 查看
/************************************************************************* > File Name: led_drv.c > Author: XXDK > Email: v.manstein@qq.com > Created Time: Sun 12 Mar 2017 07:16:54 AM PDT ************************************************************************/ #include<linux/init.h> #include<linux/module.h> #include<linux/timer.h> #include<asm/gpio.h> #include<mach/iomux-mx6q.h> #define SABRESD_GPIO_LED4 IMX_GPIO_NR(3, 21) #define SABRESD_GPIO_LED5 IMX_GPIO_NR(3, 22) #define SABRESD_GPIO_LED6 IMX_GPIO_NR(3, 23) // 实例化定时器对象 struct timer_list led_timer; int test_data = 88; // 构建led 类型 struct led_resource { char *name; int gpio; int data; }; // 实例化led对象集群 struct led_resource led_res[] = { [0] = { .name = "led4", .gpio = SABRESD_GPIO_LED4 }, [1] = { .name = "led5", .gpio = SABRESD_GPIO_LED5 }, [2] = { .name = "led6", .gpio = SABRESD_GPIO_LED6 } }; // 定时器超时处理方法 static void Led_timer_expires_handle(unsigned long data) { int i; int *pdata = (int *)data; printk("data is: %d at %s\n", *pdata, __func__); if(gpio_get_value(led_res[0].gpio)) { for(i = 0; i < ARRAY_SIZE(led_res); i++) gpio_set_value(led_res[i].gpio, 0); } else if(!gpio_get_value(led_res[0].gpio)) { for(i = 0; i < ARRAY_SIZE(led_res); i++) gpio_set_value(led_res[i].gpio, 1); } /**************************************************** * 修改定时器超时时间 * 此函数等价于: * 1. 先删除定时器 del_timer(&led_timer) * 2. 指定新的超时时间 expires = jiffies + 2*HZ * 3. 添加注册启动timer add_timer(&led_timer); ****************************************************/ mod_timer(&led_timer, jiffies + msecs_to_jiffies(2000)); } static int led_timer_init(void) { int i; // 申请 led 的 gpio 资源 for(i = 0; i < ARRAY_SIZE(led_res); i++) { gpio_request(led_res[i].gpio, led_res[i].name); gpio_direction_output(led_res[i].gpio, 0); } // 初始化定时器对象 init_timer(&led_timer); // 指定超时时间 led_timer.expires = jiffies + 2*HZ; // 指定超时处理方法 led_timer.function = Led_timer_expires_handle; // 给超时处理方法传递参数 led_timer.data = (unsigned long)&test_data; // 向内核注册并且启动定时器,开始倒计时 add_timer(&led_timer); return 0; } static void led_timer_exit(void) { int i; // 从内核移除定时器对象 del_timer(&led_timer); // 释放led 的 gpio资源 for(i = 0; i < ARRAY_SIZE(led_res); i++) { gpio_direction_output(led_res[i].gpio, 0); gpio_free(led_res[i].gpio); } } module_init(led_timer_init); module_exit(led_timer_exit); MODULE_LICENSE("GPL");
相关文章推荐
- ARM裸机实现led循环闪烁
- 如何在平台上实现LED灯的效果?如信号灯,来短信/来电时LED动画闪烁
- RK3066 实现LED闪烁的代码分析
- 用uno实现简单的单led灯闪烁
- 一知半解学CubeMX——TIM:定时中断实现LED闪烁
- NIOS实现LED走马灯闪烁
- STM32通用定时器实现LED灯闪烁
- 第二节:delay()延时实现LED灯的闪烁。
- 1-1 实验1 LED不停地实现闪烁(一亮一灭)
- FPGA 降频实现led的闪烁,LED不闪烁
- 手机震动坏了,重新实现震动为闪烁LED。
- imx6q工作队列实现led闪烁
- 定时计数器实现LED交替闪烁
- 软件实现PWM信号,LED闪烁
- 树莓派使用WiringPi实现LED灯闪烁
- ZigBee实现基础组网成功返回LED 字符 P1_1绿闪烁
- 利用51单片机实现LED闪烁
- 用定时器实现led闪烁(间隔1s)
- STM32F030, 使用嘀嗒定时器Systick实现LED闪烁
- RK3066 实现LED闪烁的代码分析