mycdev.c
#include<linux/init.h>
#include<linux/module.h>
#include<linux/timer.h>
#include<linux/of.h>
#include<linux/of_gpio.h>
/*myleds{
led1=<&gpioe 10 0>;
led2=<&gpiof 10 0>;
led3=<&gpioe 8 0>;
};*/
struct timer_list timer;
struct device_node *dnode;
int gpiono1,gpiono2,gpiono3;
//定时器处理函数
void timer_handler(struct timer_list *timer)
{
gpio_set_value(gpiono1,!gpio_get_value(gpiono1));
gpio_set_value(gpiono2,!gpio_get_value(gpiono2));
gpio_set_value(gpiono3,!gpio_get_value(gpiono3));
mod_timer(timer,jiffies+HZ);
}
static int __init mycdev_init(void)
{
//解析对应设备的设备树节点
dnode = of_find_node_by_name(NULL,"myleds");
if(dnode==NULL)
{
printk("解析设备树节点失败\n");
return -EIO;
}
//根据设备树节点解析gpio编号
gpiono1 = of_get_named_gpio(dnode,"led1",0);
gpiono2 = of_get_named_gpio(dnode,"led2",0);
gpiono3 = of_get_named_gpio(dnode,"led3",0);
//申请gpio编号
gpio_request(gpiono1,NULL);
gpio_request(gpiono2,NULL);
gpio_request(gpiono3,NULL);
//设置gpio为输出并且初始化数值为0
gpio_direction_output(gpiono1,0);
gpio_direction_output(gpiono2,0);
gpio_direction_output(gpiono3,0);
//定时器初始化
timer.expires=jiffies+HZ;
timer_setup(&timer,timer_handler,0);
add_timer(&timer);
return 0;
}
static void __exit mycdev_exit(void)
{
gpio_free(gpiono1);
gpio_free(gpiono2);
gpio_free(gpiono3);
del_timer(&timer);
}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");
Makefile
ARCH ?= X86
modename ?= demo
ifeq ($(ARCH),arm)
KERNEDIR:=/home/ubuntu/linux-5.10.61
else
KERNEDIR:=/lib/modules/$(shell uname -r)/build
endif
PWD:=$(shell pwd)
all:
make -C $(KERNEDIR) M=$(shell pwd) modules
clean:
make -C $(KERNEDIR) M=$(shell pwd) clean
obj-m=$(modname).o
结果如图所示: