任务 : 基于GPIO子系统编写LED驱动,编写应用程序进行测试设置定时器,LED每秒翻转引脚状态,并且每五秒打印一次hello world
驱动代码
cs
#include <linux/init.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/gpio.h>
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");
现象 :