驱动led灯点亮

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

结果如图所示:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值