任务 : 基于GPIO子系统编写LED驱动,编写应用程序进行测试设置定时器,LED每秒翻转引脚状态,并且每五秒打印一次hello world
驱动代码
- #include
- #include
- #include
- #include
- #include
-
- struct device_node *dnode;
- struct gpio_desc *ionum;
-
- struct timer_list mtimer;
- struct timer_list timer_5;
-
- void my_timer_fun(struct timer_list *timer)
- {
- gpiod_set_value(ionum,!gpiod_get_value(ionum));
- printk("__led_timer__\n");
- mod_timer(timer,jiffies + HZ);
- }
-
- void timer_5_fun(struct timer_list *timer)
- {
- printk("hello world\n");
- mod_timer(timer,jiffies + 5 * HZ);
- }
-
-
- static int __init my_init(void)
- {
- dnode = of_find_node_by_path("/myled");
- if(dnode == NULL)
- {
- printk("of_find_node_by_path failed\n");
- return -1;
- }
- printk("of_find_node_by_path success\n");
-
- ionum = gpiod_get_from_of_node(dnode,"led1-gpioe",0,GPIOD_OUT_LOW,NULL);
- if(IS_ERR(ionum))
- {
- printk("gpiod_get_from_of_node failed\n");
- return -PTR_ERR(ionum);
- }
- printk("gpiod_get_from_of_node success\n");
-
- timer_setup(&mtimer,my_timer_fun,0);
- timer_setup(&timer_5,timer_5_fun,0);
-
- mtimer.expires = jiffies + HZ;
- timer_5.expires = jiffies + 5 * HZ;
-
- add_timer(&mtimer);
- add_timer(&timer_5);
-
-
-
- //gpiod_set_value(ionum,1);
-
- return 0;
- }
-
- static void __exit my_exit(void)
- {
- gpiod_set_value(ionum,0);
- gpiod_put(ionum);
- del_timer(&mtimer);
- del_timer(&timer_5);
- }
-
- module_init(my_init);
- module_exit(my_exit);
- MODULE_LICENSE("GPL");
现象 :