imx6q内核定时器实现led闪烁

    xiaoxiao2021-03-25  62

    /************************************************************************* > 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");
    转载请注明原文地址: https://ju.6miu.com/read-37614.html

    最新回复(0)